添加了删除功能(请先删除引用后删除实例)

TaoZhang-Branch
karlis 2023-02-28 16:48:41 +08:00
parent 28ea0dd394
commit 9028ecdca0
8 changed files with 213 additions and 49 deletions

View File

@ -14,6 +14,8 @@ EditorWidget::EditorWidget(QWidget *parent) : QWidget(parent)
connect(treeWidget, &LayerTreeWidget::displayLayerChange, this, &EditorWidget::onLayerChange); connect(treeWidget, &LayerTreeWidget::displayLayerChange, this, &EditorWidget::onLayerChange);
connect(layerInfoDisplayWidget, &InfoDisplayWidget::requireRefreshPreview, this, connect(layerInfoDisplayWidget, &InfoDisplayWidget::requireRefreshPreview, this,
&EditorWidget::triggerRefreshPreview); &EditorWidget::triggerRefreshPreview);
connect(treeWidget, &LayerTreeWidget::requireRefreshPreview, this,
&EditorWidget::triggerRefreshPreview);
connect(layerInfoDisplayWidget, &InfoDisplayWidget::requireSelfRefresh, layerInfoDisplayWidget, &InfoDisplayWidget::triggerSelfRefresh); connect(layerInfoDisplayWidget, &InfoDisplayWidget::requireSelfRefresh, layerInfoDisplayWidget, &InfoDisplayWidget::triggerSelfRefresh);
// &EditorWidget::triggerRefreshPreview); // &EditorWidget::triggerRefreshPreview);
// test // test
@ -32,7 +34,9 @@ EditorWidget::EditorWidget(QWidget *parent) : QWidget(parent)
previewWindow->initialize(layerManager,QSize(jsonDoc.object().value("width").toDouble(),jsonDoc.object().value("height").toDouble())); previewWindow->initialize(layerManager,QSize(jsonDoc.object().value("width").toDouble(),jsonDoc.object().value("height").toDouble()));
if (layerManager->getRoot() != nullptr) if (layerManager->getRoot() != nullptr)
{ {
treeWidget->addTopLevelItem(layerManager->getRoot()->qTreeItem); treeWidget->root = layerManager->getRoot();
treeWidget->refresh();
treeWidget->addTopLevelItem(treeWidget->root->getQTreeItem());
} }
} }

View File

@ -48,7 +48,7 @@ bool LayerManager::combine() const
if (layer->getParent() != prevCommonFather) if (layer->getParent() != prevCommonFather)
return false; return false;
auto newCommonFather = new FolderLayerWrapper(); auto newCommonFather = new FolderLayerWrapper();
newCommonFather->setParent(prevCommonFather); newCommonFather->setParent(static_cast<FolderLayerWrapper*>(prevCommonFather));
for (auto &layer : selectedLayers) for (auto &layer : selectedLayers)
layer->setParent(newCommonFather); layer->setParent(newCommonFather);
return true; return true;

View File

@ -1,11 +1,11 @@
#include "LayerWrapper.h" #include "LayerWrapper.h"
using namespace std; using namespace std;
void FolderLayerWrapper::addChild(LayerWrapper *child) void FolderLayerWrapper::addChild(shared_ptr<LayerWrapper> child)
{ {
for (auto &chi : children) for (auto &chi : children)
if (chi.get() == child) if (chi == child)
return; return;
children.push_back(shared_ptr<LayerWrapper>(child)); children.push_back(child);
} }
void FolderLayerWrapper::removeChild(LayerWrapper *child) void FolderLayerWrapper::removeChild(LayerWrapper *child)
@ -18,9 +18,9 @@ void FolderLayerWrapper::removeChild(LayerWrapper *child)
} }
} }
LayerWrapper *LayerWrapper::getParent() const FolderLayerWrapper*LayerWrapper::getParent() const
{ {
return this == nullptr ? nullptr : this->parent.get(); return this == nullptr ? nullptr : this->parent;
} }
PixelPath LayerWrapper::getCache() PixelPath LayerWrapper::getCache()
@ -30,9 +30,9 @@ PixelPath LayerWrapper::getCache()
} }
// TODO: undone // TODO: undone
LayerWrapper::LayerWrapper(QJsonObject json, LayerWrapper *parent) LayerWrapper::LayerWrapper(QJsonObject json, FolderLayerWrapper*parent)
{ {
this->parent = shared_ptr<LayerWrapper>(parent); this->parent = parent;
auto transformJson = json.value("transform").toObject(); auto transformJson = json.value("transform").toObject();
property.name = json.value("name").toString(); property.name = json.value("name").toString();
property.offset = {transformJson.value("offset").toObject().value("x").toDouble(), property.offset = {transformJson.value("offset").toObject().value("x").toDouble(),
@ -40,14 +40,9 @@ LayerWrapper::LayerWrapper(QJsonObject json, LayerWrapper *parent)
property.scale = {transformJson.value("scale").toObject().value("x").toDouble(), property.scale = {transformJson.value("scale").toObject().value("x").toDouble(),
transformJson.value("scale").toObject().value("y").toDouble()}; transformJson.value("scale").toObject().value("y").toDouble()};
property.rotation = {transformJson.value("rotation").toDouble()}; property.rotation = {transformJson.value("rotation").toDouble()};
qTreeItem = new QTreeWidgetItem();
qTreeItem->setText(0, property.name);
if (parent != nullptr)
parent->qTreeItem->addChild(qTreeItem);
qTreeItem->setData(0, Qt::UserRole, QVariant::fromValue(this));
} }
FolderLayerWrapper::FolderLayerWrapper(QJsonObject json, ElementManager *elementManager, LayerWrapper *parent) FolderLayerWrapper::FolderLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent)
: LayerWrapper(json, parent) : LayerWrapper(json, parent)
{ {
qDebug() << json.value("name").toString() << " " << this; qDebug() << json.value("name").toString() << " " << this;
@ -70,7 +65,7 @@ FolderLayerWrapper::FolderLayerWrapper(QJsonObject json, ElementManager *element
} }
} }
LeafLayerWrapper::LeafLayerWrapper(QJsonObject json, ElementManager *elementManager, LayerWrapper *parent) LeafLayerWrapper::LeafLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent)
: LayerWrapper(json, parent) : LayerWrapper(json, parent)
{ {
qDebug() << json.value("name").toString() << " " << this; qDebug() << json.value("name").toString() << " " << this;
@ -99,8 +94,10 @@ void LayerWrapper::refresh()
void FolderLayerWrapper::refresh() void FolderLayerWrapper::refresh()
{ {
cache.clear(); cache.clear();
for (auto &child : children) for (auto& child : children) {
qDebug() << child.get();
cache.addPath(child.get()->getCache()); cache.addPath(child.get()->getCache());
}
LayerWrapper::refresh(); LayerWrapper::refresh();
} }
@ -114,21 +111,73 @@ void LeafLayerWrapper::refresh()
LayerWrapper::refresh(); LayerWrapper::refresh();
} }
void LayerWrapper::setParent(LayerWrapper *newParent) void LayerWrapper::setParent(FolderLayerWrapper* newParent)
{ {
this->parent = shared_ptr<LayerWrapper>(newParent); this->parent = newParent;
} }
void FolderLayerWrapper::removeAllChild() void FolderLayerWrapper::removeAllChild()
{ {
children.clear(); children.clear();
qTreeWidgetItem.takeChildren();
} }
namespace LayerEvent void LayerWrapper::del() {
{ qDebug() << "LayerWrapper::del()";
if (parent != nullptr){
static void onDoubleClick(QTreeWidgetItem *qItem, LayerWrapper *layerWrapper) qTreeWidgetItem.takeChildren();
{ parent->qTreeWidgetItem.removeChild(&qTreeWidgetItem);
}
} }
} // namespace LayerEvent void LayerWrapper::delSelf() {
qDebug() << "LayerWrapper::delSelf()";
if (parent != nullptr) {
qTreeWidgetItem.takeChildren();
parent->qTreeWidgetItem.removeChild(&qTreeWidgetItem);
}
}
void FolderLayerWrapper::del()
{
qDebug() << "FolderLayerWrapper::del()";
for (auto& child : children)
child->del();
LayerWrapper::del();
}
void FolderLayerWrapper::delSelf() {
qDebug() << "FolderLayerWrapper::delSelf() "<<this<<" "<<this->parent;
LayerWrapper::delSelf();
if (parent != nullptr) {
qDebug() << this->children.size();
qDebug() << this;
for (auto& child : this->children) {
this->parent->addChild(child);
this->parent->qTreeWidgetItem.addChild(&child.get()->qTreeWidgetItem);
child->setParent(this->parent);
}
while (!this->children.empty()) {
this->children.pop_back();
}
}
}
QTreeWidgetItem* LayerWrapper::getQTreeItem()
{
this->qTreeWidgetItem.setText(0, this->property.name);
this->qTreeWidgetItem.setData(0, Qt::UserRole, QVariant::fromValue(this));
return &this->qTreeWidgetItem;
}
QTreeWidgetItem* FolderLayerWrapper::getQTreeItem()
{
while (this->qTreeWidgetItem.childCount() > 0) {
this->qTreeWidgetItem.removeChild(this->qTreeWidgetItem.child(0));
}
for (auto& child : this->children) {
this->qTreeWidgetItem.addChild(child->getQTreeItem());
}
return LayerWrapper::getQTreeItem();
}

View File

@ -20,19 +20,20 @@ class GraphicElement;
class SimpleElement; class SimpleElement;
class GroupElement; class GroupElement;
class ElementManager; class ElementManager;
class FolderLayerWrapper;
class LayerWrapper class LayerWrapper
{ {
protected: protected:
shared_ptr<LayerWrapper> parent; FolderLayerWrapper* parent;
QPointF referencePoint; QPointF referencePoint;
// vector<LayerStyle> styles; // vector<LayerStyle> styles;
// TODO: 将cache移到子类对Leaf用ComposedPainterPath对Folder用FolderBitmapPath // TODO: 将cache移到子类对Leaf用ComposedPainterPath对Folder用FolderBitmapPath
PixelPath cache; PixelPath cache;
public: public:
QTreeWidgetItem *qTreeItem; QTreeWidgetItem qTreeWidgetItem;
struct SimpleProperty struct SimpleProperty
{ {
QString name = ""; QString name = "";
@ -44,18 +45,22 @@ class LayerWrapper
// TODO: 将QPainterPath改为BitmapPath // TODO: 将QPainterPath改为BitmapPath
void apply(PixelPath&cache) const; void apply(PixelPath&cache) const;
} property; } property;
void setParent(LayerWrapper *newParent); virtual void setParent(FolderLayerWrapper*newParent);
virtual void refresh(); virtual void refresh();
virtual QTreeWidgetItem* getQTreeItem();
// TODO: 将QPainterPath改为BitmapPath/QImage或者直接将其删除绘制时直接使用BitmapPath的paint方法 // TODO: 将QPainterPath改为BitmapPath/QImage或者直接将其删除绘制时直接使用BitmapPath的paint方法
virtual PixelPath getCache(); virtual PixelPath getCache();
LayerWrapper *getParent() const; // invoke by manager, then invoke parent's applyStyles FolderLayerWrapper*getParent() const; // invoke by manager, then invoke parent's applyStyles
LayerWrapper(QJsonObject json, LayerWrapper *parent); LayerWrapper(QJsonObject json, FolderLayerWrapper*parent);
LayerWrapper() = default; LayerWrapper() = default;
// TODO : export Function // TODO : export Function
// virtual LayerWrapper *addChild() = 0; // Leaf Child Only // virtual LayerWrapper *addChild() = 0; // Leaf Child Only
// virtual LayerWrapper *addParent() = 0; // Folder Parent Only // virtual LayerWrapper *addParent() = 0; // Folder Parent Only
// virtual void deleteSelf() const = 0; // virtual void deleteSelf() const = 0;
// virtual void deleteAll() const = 0; // virtual void deleteAll() const = 0;
virtual void del();
virtual void delSelf();
~LayerWrapper() = default;
}; };
class FolderLayerWrapper : public LayerWrapper class FolderLayerWrapper : public LayerWrapper
@ -64,12 +69,17 @@ class FolderLayerWrapper : public LayerWrapper
vector<shared_ptr<LayerWrapper>> children; vector<shared_ptr<LayerWrapper>> children;
public: public:
~FolderLayerWrapper() = default;
void refresh() override; void refresh() override;
FolderLayerWrapper() = default; FolderLayerWrapper() = default;
FolderLayerWrapper(QJsonObject json, ElementManager *elementManager, LayerWrapper *parent); FolderLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent);
void addChild(LayerWrapper *child); void addChild(shared_ptr<LayerWrapper> child);
void removeChild(LayerWrapper *child); void removeChild(LayerWrapper *child);
void removeAllChild(); void removeAllChild();
void del() override;
void delSelf() override;
QTreeWidgetItem* getQTreeItem() override;
}; };
class LeafLayerWrapper : public LayerWrapper class LeafLayerWrapper : public LayerWrapper
@ -79,9 +89,12 @@ class LeafLayerWrapper : public LayerWrapper
const vector<Renderer::ElementStyleStrokeDemo> styles; const vector<Renderer::ElementStyleStrokeDemo> styles;
public: public:
~LeafLayerWrapper() = default;
void refresh() override; void refresh() override;
LeafLayerWrapper() = default; LeafLayerWrapper() = default;
LeafLayerWrapper(QJsonObject json, ElementManager *elementManager, LayerWrapper *parent); LeafLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent);
}; };
Q_DECLARE_METATYPE(LayerWrapper *) Q_DECLARE_METATYPE(LayerWrapper *)
Q_DECLARE_METATYPE(FolderLayerWrapper *)
Q_DECLARE_METATYPE(LeafLayerWrapper *)

View File

@ -26,7 +26,6 @@ QPixmap PixelPath::getPixmap() const
{ {
auto k = pixmap; auto k = pixmap;
QPainter pt(&k); QPainter pt(&k);
qDebug() << this->boundingRect;
//pt.fillRect(this->boundingRect, Qt::red); //pt.fillRect(this->boundingRect, Qt::red);
//pt.fillRect(QRectF(1013.35 - 1000, 768.327 - 700,58.0887,41.5352), Qt::blue); //pt.fillRect(QRectF(1013.35 - 1000, 768.327 - 700,58.0887,41.5352), Qt::blue);
return k; return k;

View File

@ -11,7 +11,10 @@ LayerTreeWidget::LayerTreeWidget(QWidget *parent)
connect(this, &QTreeWidget::customContextMenuRequested, this, &LayerTreeWidget::popMenu); connect(this, &QTreeWidget::customContextMenuRequested, this, &LayerTreeWidget::popMenu);
connect(this, &QTreeWidget::currentItemChanged, [=](QTreeWidgetItem *currentItem) { connect(this, &QTreeWidget::currentItemChanged, [=](QTreeWidgetItem *currentItem) {
this->selectedItem = currentItem; this->selectedItem = currentItem;
emit displayLayerChange(this->selectedItem->data(0, Qt::UserRole).value<LayerWrapper *>()); if(this->selectedItem !=nullptr)
emit displayLayerChange(this->selectedItem->data(0, Qt::UserRole).value<LayerWrapper *>());
else
emit displayLayerChange(nullptr);
}); });
// connect(this, &QTreeWidget::itemDoubleClicked, this, &LayerTreeWidget::onItemDoubleClicked); // connect(this, &QTreeWidget::itemDoubleClicked, this, &LayerTreeWidget::onItemDoubleClicked);
} }
@ -26,19 +29,33 @@ LayerTreeWidget::LayerTreeWidget(QWidget *parent)
// this->selectedItem = item; // this->selectedItem = item;
// // TODO // // TODO
// } // }
#include <QDebug>
void LayerTreeWidget::popMenu(const QPoint &pos) void LayerTreeWidget::popMenu(const QPoint &pos)
{ {
QMenu menu; QMenu menu;
QTreeWidgetItem *item = itemAt(pos); QTreeWidgetItem *item = itemAt(pos);
this->selectedItem = item; this->selectedItem = item;
// TODO // TODO
menu.addAction("Add Child", this, &LayerTreeWidget::onRenameEvent); menu.addAction(QString::fromLocal8Bit("创建子节点"), this, &LayerTreeWidget::onRenameEvent);
menu.addAction("Rename", this, &LayerTreeWidget::onRenameEvent); menu.addAction(QString::fromLocal8Bit("重命名"), this, &LayerTreeWidget::onRenameEvent);
menu.addAction("Copy", this, &LayerTreeWidget::onRenameEvent); // menu.addAction("Copy", this, &LayerTreeWidget::onRenameEvent);
if (item != nullptr && item->childCount() > 0) if (item != nullptr && item->childCount() > 0)
menu.addAction("Delete (Self Only)", this, &LayerTreeWidget::onRenameEvent); menu.addAction(QString::fromLocal8Bit("删除(保留子节点)"), this, [this]() {
menu.addAction("Delete", this, &LayerTreeWidget::onRenameEvent); auto layer = this->selectedItem->data(0, Qt::UserRole).value<LayerWrapper*>();
layer->delSelf();
layer->getParent()->removeChild(layer);
this->refresh();
emit requireRefreshPreview();
});
menu.addAction(QString::fromLocal8Bit("删除"), this, [this]() {
if (this->selectedItem == nullptr)
return;
auto layer = this->selectedItem->data(0, Qt::UserRole).value<LayerWrapper*>();
layer->del();
layer->getParent()->removeChild(layer);
this->refresh();
emit requireRefreshPreview();
});
menu.exec(mapToGlobal(pos)); menu.exec(mapToGlobal(pos));
} }
@ -57,3 +74,11 @@ void LayerTreeWidget::onRenameEvent()
} }
emit displayLayerChange(this->selectedItem->data(0, Qt::UserRole).value<LayerWrapper *>()); emit displayLayerChange(this->selectedItem->data(0, Qt::UserRole).value<LayerWrapper *>());
} }
void LayerTreeWidget::refresh() {
// if(this->root!=nullptr)
//{
// this->clear();
// this->addTopLevelItem(this->root->getQTreeItem());
//}
}

View File

@ -10,12 +10,15 @@ class LayerTreeWidget : public QTreeWidget
LayerWrapper *copiedItem; LayerWrapper *copiedItem;
public: public:
LayerWrapper* root;
LayerTreeWidget(QWidget *parent = nullptr); LayerTreeWidget(QWidget *parent = nullptr);
void onRenameEvent(); void onRenameEvent();
void popMenu(const QPoint &pos); void popMenu(const QPoint &pos);
void refresh();
// void mouseDoubleClickEvent(QMouseEvent *event) override; // void mouseDoubleClickEvent(QMouseEvent *event) override;
// void onItemDoubleClicked(QTreeWidgetItem *item, int column = 0); // void onItemDoubleClicked(QTreeWidgetItem *item, int column = 0);
signals: signals:
void displayLayerChange(LayerWrapper *); void displayLayerChange(LayerWrapper *);
void requireRefreshPreview();
}; };

View File

@ -1,12 +1,12 @@
{ {
"height": 1080, "height": 1080,
"width": 1920, "width": 1080,
"elements": [ "elements": [
{ {
"name": "ababa", "name": "ababa",
"type": "svg-file", "type": "svg-file",
"data": { "data": {
"include": "./svg/12(1).svg" "include": "./svg/2.svg"
} }
}, },
{ {
@ -25,14 +25,85 @@
"y": 0 "y": 0
}, },
"scale": { "scale": {
"x": 0.5, "x": 1.0,
"y": 0.5 "y": 1.0
}, },
"rotation": 0.0 "rotation": 0.0
}, },
"effects": [], "effects": [],
"is-folder": false, "is-folder": true,
"element": 0 "referenced-by": null,
"children": [
{
"name": "GroupFolderExample",
"transform": {
"offset": {
"x": 50,
"y": 50
},
"scale": {
"x": 1.0,
"y": 1.0
},
"rotation": 0.0
},
"effects": [],
"is-folder": true,
"referenced-by": 1,
"children": [
{
"name": "Leaf1",
"transform": {
"offset": {
"x": 0,
"y": 0
},
"scale": {
"x": 1.0,
"y": 1.0
},
"rotation": 0.0
},
"effects": [],
"is-folder": false,
"element": 0
},
{
"name": "Leaf2",
"transform": {
"offset": {
"x": 150,
"y": 0
},
"scale": {
"x": 1.5,
"y": 1.5
},
"rotation": 0.0
},
"effects": [],
"is-folder": false,
"element": 0
}
]
},
{
"name": "ReferencingGroupLayer",
"transform": {
"offset": {
"x": 100,
"y": 0
},
"scale": {
"x": 1,
"y": 1
},
"rotation": 45
},
"effects": [],
"is-folder": false,
"element": 1
}
]
} }
}
}