添加了删除功能(请先删除引用后删除实例)
parent
28ea0dd394
commit
9028ecdca0
|
@ -14,6 +14,8 @@ EditorWidget::EditorWidget(QWidget *parent) : QWidget(parent)
|
|||
connect(treeWidget, &LayerTreeWidget::displayLayerChange, this, &EditorWidget::onLayerChange);
|
||||
connect(layerInfoDisplayWidget, &InfoDisplayWidget::requireRefreshPreview, this,
|
||||
&EditorWidget::triggerRefreshPreview);
|
||||
connect(treeWidget, &LayerTreeWidget::requireRefreshPreview, this,
|
||||
&EditorWidget::triggerRefreshPreview);
|
||||
connect(layerInfoDisplayWidget, &InfoDisplayWidget::requireSelfRefresh, layerInfoDisplayWidget, &InfoDisplayWidget::triggerSelfRefresh);
|
||||
// &EditorWidget::triggerRefreshPreview);
|
||||
// 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()));
|
||||
if (layerManager->getRoot() != nullptr)
|
||||
{
|
||||
treeWidget->addTopLevelItem(layerManager->getRoot()->qTreeItem);
|
||||
treeWidget->root = layerManager->getRoot();
|
||||
treeWidget->refresh();
|
||||
treeWidget->addTopLevelItem(treeWidget->root->getQTreeItem());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ bool LayerManager::combine() const
|
|||
if (layer->getParent() != prevCommonFather)
|
||||
return false;
|
||||
auto newCommonFather = new FolderLayerWrapper();
|
||||
newCommonFather->setParent(prevCommonFather);
|
||||
newCommonFather->setParent(static_cast<FolderLayerWrapper*>(prevCommonFather));
|
||||
for (auto &layer : selectedLayers)
|
||||
layer->setParent(newCommonFather);
|
||||
return true;
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
#include "LayerWrapper.h"
|
||||
using namespace std;
|
||||
void FolderLayerWrapper::addChild(LayerWrapper *child)
|
||||
void FolderLayerWrapper::addChild(shared_ptr<LayerWrapper> child)
|
||||
{
|
||||
for (auto &chi : children)
|
||||
if (chi.get() == child)
|
||||
if (chi == child)
|
||||
return;
|
||||
children.push_back(shared_ptr<LayerWrapper>(child));
|
||||
children.push_back(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()
|
||||
|
@ -30,9 +30,9 @@ PixelPath LayerWrapper::getCache()
|
|||
}
|
||||
|
||||
// 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();
|
||||
property.name = json.value("name").toString();
|
||||
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(),
|
||||
transformJson.value("scale").toObject().value("y").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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
qDebug() << json.value("name").toString() << " " << this;
|
||||
|
@ -99,8 +94,10 @@ void LayerWrapper::refresh()
|
|||
void FolderLayerWrapper::refresh()
|
||||
{
|
||||
cache.clear();
|
||||
for (auto &child : children)
|
||||
for (auto& child : children) {
|
||||
qDebug() << child.get();
|
||||
cache.addPath(child.get()->getCache());
|
||||
}
|
||||
LayerWrapper::refresh();
|
||||
}
|
||||
|
||||
|
@ -114,21 +111,73 @@ void LeafLayerWrapper::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()
|
||||
{
|
||||
children.clear();
|
||||
qTreeWidgetItem.takeChildren();
|
||||
}
|
||||
|
||||
namespace LayerEvent
|
||||
{
|
||||
|
||||
static void onDoubleClick(QTreeWidgetItem *qItem, LayerWrapper *layerWrapper)
|
||||
{
|
||||
void LayerWrapper::del() {
|
||||
qDebug() << "LayerWrapper::del()";
|
||||
if (parent != nullptr){
|
||||
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();
|
||||
}
|
||||
|
|
|
@ -20,19 +20,20 @@ class GraphicElement;
|
|||
class SimpleElement;
|
||||
class GroupElement;
|
||||
class ElementManager;
|
||||
class FolderLayerWrapper;
|
||||
|
||||
class LayerWrapper
|
||||
{
|
||||
|
||||
protected:
|
||||
shared_ptr<LayerWrapper> parent;
|
||||
FolderLayerWrapper* parent;
|
||||
QPointF referencePoint;
|
||||
// vector<LayerStyle> styles;
|
||||
// TODO: 将cache移到子类,对Leaf用ComposedPainterPath,对Folder用FolderBitmapPath
|
||||
PixelPath cache;
|
||||
|
||||
public:
|
||||
QTreeWidgetItem *qTreeItem;
|
||||
QTreeWidgetItem qTreeWidgetItem;
|
||||
struct SimpleProperty
|
||||
{
|
||||
QString name = "";
|
||||
|
@ -44,18 +45,22 @@ class LayerWrapper
|
|||
// TODO: 将QPainterPath改为BitmapPath
|
||||
void apply(PixelPath&cache) const;
|
||||
} property;
|
||||
void setParent(LayerWrapper *newParent);
|
||||
virtual void setParent(FolderLayerWrapper*newParent);
|
||||
virtual void refresh();
|
||||
virtual QTreeWidgetItem* getQTreeItem();
|
||||
// TODO: 将QPainterPath改为BitmapPath/QImage,或者直接将其删除,绘制时直接使用BitmapPath的paint方法
|
||||
virtual PixelPath getCache();
|
||||
LayerWrapper *getParent() const; // invoke by manager, then invoke parent's applyStyles
|
||||
LayerWrapper(QJsonObject json, LayerWrapper *parent);
|
||||
FolderLayerWrapper*getParent() const; // invoke by manager, then invoke parent's applyStyles
|
||||
LayerWrapper(QJsonObject json, FolderLayerWrapper*parent);
|
||||
LayerWrapper() = default;
|
||||
// TODO : export Function
|
||||
// virtual LayerWrapper *addChild() = 0; // Leaf Child Only
|
||||
// virtual LayerWrapper *addParent() = 0; // Folder Parent Only
|
||||
// virtual void deleteSelf() const = 0;
|
||||
// virtual void deleteAll() const = 0;
|
||||
virtual void del();
|
||||
virtual void delSelf();
|
||||
~LayerWrapper() = default;
|
||||
};
|
||||
|
||||
class FolderLayerWrapper : public LayerWrapper
|
||||
|
@ -64,12 +69,17 @@ class FolderLayerWrapper : public LayerWrapper
|
|||
vector<shared_ptr<LayerWrapper>> children;
|
||||
|
||||
public:
|
||||
|
||||
~FolderLayerWrapper() = default;
|
||||
void refresh() override;
|
||||
FolderLayerWrapper() = default;
|
||||
FolderLayerWrapper(QJsonObject json, ElementManager *elementManager, LayerWrapper *parent);
|
||||
void addChild(LayerWrapper *child);
|
||||
FolderLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent);
|
||||
void addChild(shared_ptr<LayerWrapper> child);
|
||||
void removeChild(LayerWrapper *child);
|
||||
void removeAllChild();
|
||||
void del() override;
|
||||
void delSelf() override;
|
||||
QTreeWidgetItem* getQTreeItem() override;
|
||||
};
|
||||
|
||||
class LeafLayerWrapper : public LayerWrapper
|
||||
|
@ -79,9 +89,12 @@ class LeafLayerWrapper : public LayerWrapper
|
|||
const vector<Renderer::ElementStyleStrokeDemo> styles;
|
||||
|
||||
public:
|
||||
~LeafLayerWrapper() = default;
|
||||
void refresh() override;
|
||||
LeafLayerWrapper() = default;
|
||||
LeafLayerWrapper(QJsonObject json, ElementManager *elementManager, LayerWrapper *parent);
|
||||
LeafLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent);
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(LayerWrapper *)
|
||||
Q_DECLARE_METATYPE(FolderLayerWrapper *)
|
||||
Q_DECLARE_METATYPE(LeafLayerWrapper *)
|
||||
|
|
|
@ -26,7 +26,6 @@ QPixmap PixelPath::getPixmap() const
|
|||
{
|
||||
auto k = pixmap;
|
||||
QPainter pt(&k);
|
||||
qDebug() << this->boundingRect;
|
||||
//pt.fillRect(this->boundingRect, Qt::red);
|
||||
//pt.fillRect(QRectF(1013.35 - 1000, 768.327 - 700,58.0887,41.5352), Qt::blue);
|
||||
return k;
|
||||
|
|
|
@ -11,7 +11,10 @@ LayerTreeWidget::LayerTreeWidget(QWidget *parent)
|
|||
connect(this, &QTreeWidget::customContextMenuRequested, this, &LayerTreeWidget::popMenu);
|
||||
connect(this, &QTreeWidget::currentItemChanged, [=](QTreeWidgetItem *currentItem) {
|
||||
this->selectedItem = currentItem;
|
||||
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);
|
||||
}
|
||||
|
@ -26,19 +29,33 @@ LayerTreeWidget::LayerTreeWidget(QWidget *parent)
|
|||
// this->selectedItem = item;
|
||||
// // TODO
|
||||
// }
|
||||
|
||||
#include <QDebug>
|
||||
void LayerTreeWidget::popMenu(const QPoint &pos)
|
||||
{
|
||||
QMenu menu;
|
||||
QTreeWidgetItem *item = itemAt(pos);
|
||||
this->selectedItem = item;
|
||||
// TODO
|
||||
menu.addAction("Add Child", this, &LayerTreeWidget::onRenameEvent);
|
||||
menu.addAction("Rename", this, &LayerTreeWidget::onRenameEvent);
|
||||
menu.addAction("Copy", this, &LayerTreeWidget::onRenameEvent);
|
||||
menu.addAction(QString::fromLocal8Bit("创建子节点"), this, &LayerTreeWidget::onRenameEvent);
|
||||
menu.addAction(QString::fromLocal8Bit("重命名"), this, &LayerTreeWidget::onRenameEvent);
|
||||
// menu.addAction("Copy", this, &LayerTreeWidget::onRenameEvent);
|
||||
if (item != nullptr && item->childCount() > 0)
|
||||
menu.addAction("Delete (Self Only)", this, &LayerTreeWidget::onRenameEvent);
|
||||
menu.addAction("Delete", this, &LayerTreeWidget::onRenameEvent);
|
||||
menu.addAction(QString::fromLocal8Bit("删除(保留子节点)"), this, [this]() {
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -57,3 +74,11 @@ void LayerTreeWidget::onRenameEvent()
|
|||
}
|
||||
emit displayLayerChange(this->selectedItem->data(0, Qt::UserRole).value<LayerWrapper *>());
|
||||
}
|
||||
|
||||
void LayerTreeWidget::refresh() {
|
||||
// if(this->root!=nullptr)
|
||||
//{
|
||||
// this->clear();
|
||||
// this->addTopLevelItem(this->root->getQTreeItem());
|
||||
//}
|
||||
}
|
|
@ -10,12 +10,15 @@ class LayerTreeWidget : public QTreeWidget
|
|||
LayerWrapper *copiedItem;
|
||||
|
||||
public:
|
||||
LayerWrapper* root;
|
||||
LayerTreeWidget(QWidget *parent = nullptr);
|
||||
void onRenameEvent();
|
||||
void popMenu(const QPoint &pos);
|
||||
void refresh();
|
||||
// void mouseDoubleClickEvent(QMouseEvent *event) override;
|
||||
// void onItemDoubleClicked(QTreeWidgetItem *item, int column = 0);
|
||||
|
||||
signals:
|
||||
void displayLayerChange(LayerWrapper *);
|
||||
void requireRefreshPreview();
|
||||
};
|
||||
|
|
81
data.json
81
data.json
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"height": 1080,
|
||||
"width": 1920,
|
||||
"width": 1080,
|
||||
"elements": [
|
||||
{
|
||||
"name": "ababa",
|
||||
"type": "svg-file",
|
||||
"data": {
|
||||
"include": "./svg/12(1).svg"
|
||||
"include": "./svg/2.svg"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -25,8 +25,59 @@
|
|||
"y": 0
|
||||
},
|
||||
"scale": {
|
||||
"x": 0.5,
|
||||
"y": 0.5
|
||||
"x": 1.0,
|
||||
"y": 1.0
|
||||
},
|
||||
"rotation": 0.0
|
||||
},
|
||||
"effects": [],
|
||||
"is-folder": true,
|
||||
"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
|
||||
},
|
||||
|
@ -34,5 +85,25 @@
|
|||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue