From d684b2810cf5b1aeb9d70a9e91bcb98ee935de0d Mon Sep 17 00:00:00 2001 From: PalaBeaveR <35870033+PalaBeaveR@users.noreply.github.com> Date: Sun, 14 Jul 2024 06:07:42 +0300 Subject: [PATCH 1/3] Added Expand/Collapse API to GroupLayer Group layers can now be expanded/collapsed from scripts --- src/libtiled/grouplayer.h | 13 +++++++++++++ src/tiled/changelayer.cpp | 21 +++++++++++++++++++++ src/tiled/changelayer.h | 18 ++++++++++++++++++ src/tiled/editablegrouplayer.cpp | 28 ++++++++++++++++++++++++++++ src/tiled/editablegrouplayer.h | 5 +++++ src/tiled/layerdock.h | 4 ++++ src/tiled/mapeditor.h | 1 + src/tiled/undocommands.h | 2 ++ 8 files changed, 92 insertions(+) diff --git a/src/libtiled/grouplayer.h b/src/libtiled/grouplayer.h index 512db47f39..347358699b 100644 --- a/src/libtiled/grouplayer.h +++ b/src/libtiled/grouplayer.h @@ -56,6 +56,8 @@ class TILEDSHARED_EXPORT GroupLayer : public Layer QList::const_iterator begin() const { return mLayers.begin(); } QList::const_iterator end() const { return mLayers.end(); } + bool isExpanded() const; + void setExpanded(bool expanded); protected: void setMap(Map *map) override; GroupLayer *initializeClone(GroupLayer *clone) const; @@ -64,9 +66,20 @@ class TILEDSHARED_EXPORT GroupLayer : public Layer void adoptLayer(Layer &layer); QList mLayers; + + bool mExpanded = true; }; +inline bool GroupLayer::isExpanded() const +{ + return mExpanded; +} + +inline void GroupLayer::setExpanded(bool expanded) { + mExpanded = expanded; +} + inline int GroupLayer::layerCount() const { return mLayers.size(); diff --git a/src/tiled/changelayer.cpp b/src/tiled/changelayer.cpp index 93ce88f176..de46f098ca 100644 --- a/src/tiled/changelayer.cpp +++ b/src/tiled/changelayer.cpp @@ -24,6 +24,7 @@ #include "document.h" #include "layer.h" #include "map.h" +#include "grouplayer.h" #include @@ -212,4 +213,24 @@ void SetTileLayerSize::setValue(TileLayer *layer, const QSize &value) const emit document()->changed(TileLayerChangeEvent(layer, TileLayerChangeEvent::SizeProperty)); } +SetGroupLayerExpanded::SetGroupLayerExpanded(Document *document, + QList layers, + bool expanded) + : ChangeValue(document, std::move(layers), expanded) +{ + setText(QCoreApplication::translate("Undo Commands", + "Change Group Layer Expanded State")); +} + +bool SetGroupLayerExpanded::getValue(const GroupLayer *layer) const +{ + return layer->isExpanded(); +} + +void SetGroupLayerExpanded::setValue(GroupLayer *layer, const bool &value) const +{ + layer->setExpanded(value); +// emit document()->changed(LayerChangeEvent(layer, LayerChangeEvent::OpacityProperty)); +} + } // namespace Tiled diff --git a/src/tiled/changelayer.h b/src/tiled/changelayer.h index a86c98b3ec..36a07d7bc2 100644 --- a/src/tiled/changelayer.h +++ b/src/tiled/changelayer.h @@ -31,6 +31,7 @@ namespace Tiled { class Layer; class TileLayer; +class GroupLayer; class SetLayerName : public ChangeValue { @@ -172,4 +173,21 @@ class SetTileLayerSize : public ChangeValue void setValue(TileLayer *layer, const QSize &value) const override; }; +/** + * Used for changing group layer expanded state. + */ +class SetGroupLayerExpanded : public ChangeValue +{ +public: + SetGroupLayerExpanded(Document *document, + QList layers, + bool expanded); + + int id() const override { return Cmd_ChangeGroupLayerExpanded; } + +private: + bool getValue(const GroupLayer *layer) const override; + void setValue(GroupLayer *layer, const bool &value) const override; +}; + } // namespace Tiled diff --git a/src/tiled/editablegrouplayer.cpp b/src/tiled/editablegrouplayer.cpp index 78164d71cc..a3be1ae692 100644 --- a/src/tiled/editablegrouplayer.cpp +++ b/src/tiled/editablegrouplayer.cpp @@ -20,10 +20,16 @@ #include "editablegrouplayer.h" +#include "changelayer.h" #include "addremovelayer.h" #include "addremovetileset.h" #include "editablemap.h" #include "scriptmanager.h" +#include "documentmanager.h" +#include "mapeditor.h" +#include "layerdock.h" +#include "layermodel.h" +#include "qabstractproxymodel.h" #include @@ -136,6 +142,28 @@ void EditableGroupLayer::addLayer(EditableLayer *editableLayer) insertLayerAt(layerCount(), editableLayer); } +inline bool EditableGroupLayer::isExpanded() const +{ + + return groupLayer()->isExpanded(); +} + +inline void EditableGroupLayer::setExpanded(bool expanded) +{ + if (auto doc = document()){ + auto documentManager = DocumentManager::instance(); + auto mapEditor = static_cast(documentManager->editor(Document::MapDocumentType)); + + auto sourceIndex = mapDocument()->layerModel()->index(layer()); + auto layerView = mapEditor->layerDock()->layerView(); + + auto index = layerView->proxyModel()->mapFromSource(sourceIndex); + layerView->setExpanded(index, expanded); + asset()->push(new SetGroupLayerExpanded(doc, { groupLayer() }, expanded)); + }else if (!checkReadOnly()) + groupLayer()->setExpanded(expanded); +} + } // namespace Tiled #include "moc_editablegrouplayer.cpp" diff --git a/src/tiled/editablegrouplayer.h b/src/tiled/editablegrouplayer.h index 05ee340518..437f3c2779 100644 --- a/src/tiled/editablegrouplayer.h +++ b/src/tiled/editablegrouplayer.h @@ -31,6 +31,7 @@ class EditableGroupLayer : public EditableLayer Q_PROPERTY(int layerCount READ layerCount) Q_PROPERTY(QList layers READ layers) + Q_PROPERTY(bool expanded READ isExpanded WRITE setExpanded) public: Q_INVOKABLE explicit EditableGroupLayer(const QString &name = QString(), @@ -49,6 +50,10 @@ class EditableGroupLayer : public EditableLayer Q_INVOKABLE void insertLayerAt(int index, Tiled::EditableLayer *editableLayer); Q_INVOKABLE void addLayer(Tiled::EditableLayer *editableLayer); + bool isExpanded() const; +public slots: + void setExpanded(bool expanded); + private: GroupLayer *groupLayer() const; }; diff --git a/src/tiled/layerdock.h b/src/tiled/layerdock.h index 41e286c530..e420f72fbb 100644 --- a/src/tiled/layerdock.h +++ b/src/tiled/layerdock.h @@ -54,6 +54,8 @@ class LayerDock : public QDockWidget */ void setMapDocument(MapDocument *mapDocument); + LayerView *layerView() const { return mLayerView; }; + protected: void changeEvent(QEvent *e) override; @@ -90,6 +92,8 @@ class LayerView : public QTreeView void editLayerModelIndex(const QModelIndex &layerModelIndex); + QAbstractProxyModel *proxyModel() { return mProxyModel; } + protected: bool event(QEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override; diff --git a/src/tiled/mapeditor.h b/src/tiled/mapeditor.h index 5246fde877..85cf300f24 100644 --- a/src/tiled/mapeditor.h +++ b/src/tiled/mapeditor.h @@ -83,6 +83,7 @@ class MapEditor final : public Editor ~MapEditor() override; TilesetDock *tilesetDock() const { return mTilesetDock; } + LayerDock *layerDock() const { return mLayerDock; } TemplatesDock *templatesDock() const { return mTemplatesDock; } void saveState() override; diff --git a/src/tiled/undocommands.h b/src/tiled/undocommands.h index 3af2985d35..f18ea4309b 100644 --- a/src/tiled/undocommands.h +++ b/src/tiled/undocommands.h @@ -52,6 +52,8 @@ enum UndoCommands { Cmd_EraseTiles, Cmd_PaintTileLayer, Cmd_SetProperty, + Cmd_ChangeGroupLayerExpanded, + Cmd_ChangeObjectGroupExpanded, }; /** From 251b4bc5415080549d3a707b9ac4e2457db381a1 Mon Sep 17 00:00:00 2001 From: PalaBeaveR <35870033+PalaBeaveR@users.noreply.github.com> Date: Sun, 14 Jul 2024 15:03:04 +0300 Subject: [PATCH 2/3] Added API to ObjectGroups and to layerview/objectsview. Cleaned up undo related changes --- src/libtiled/grouplayer.h | 15 --------------- src/tiled/changelayer.cpp | 21 --------------------- src/tiled/changelayer.h | 18 ------------------ src/tiled/editablegrouplayer.cpp | 22 ++++++---------------- src/tiled/editablegrouplayer.h | 4 +--- src/tiled/editableobjectgroup.cpp | 17 +++++++++++++++++ src/tiled/editableobjectgroup.h | 3 +++ src/tiled/layerdock.cpp | 13 +++++++++++++ src/tiled/layerdock.h | 6 +++++- src/tiled/mapeditor.h | 3 +++ src/tiled/objectsdock.cpp | 8 ++++++++ src/tiled/objectsdock.h | 7 +++++++ src/tiled/undocommands.h | 2 -- 13 files changed, 63 insertions(+), 76 deletions(-) diff --git a/src/libtiled/grouplayer.h b/src/libtiled/grouplayer.h index 347358699b..09110184a3 100644 --- a/src/libtiled/grouplayer.h +++ b/src/libtiled/grouplayer.h @@ -55,9 +55,6 @@ class TILEDSHARED_EXPORT GroupLayer : public Layer QList::iterator end() { return mLayers.end(); } QList::const_iterator begin() const { return mLayers.begin(); } QList::const_iterator end() const { return mLayers.end(); } - - bool isExpanded() const; - void setExpanded(bool expanded); protected: void setMap(Map *map) override; GroupLayer *initializeClone(GroupLayer *clone) const; @@ -66,20 +63,8 @@ class TILEDSHARED_EXPORT GroupLayer : public Layer void adoptLayer(Layer &layer); QList mLayers; - - bool mExpanded = true; }; - -inline bool GroupLayer::isExpanded() const -{ - return mExpanded; -} - -inline void GroupLayer::setExpanded(bool expanded) { - mExpanded = expanded; -} - inline int GroupLayer::layerCount() const { return mLayers.size(); diff --git a/src/tiled/changelayer.cpp b/src/tiled/changelayer.cpp index de46f098ca..93ce88f176 100644 --- a/src/tiled/changelayer.cpp +++ b/src/tiled/changelayer.cpp @@ -24,7 +24,6 @@ #include "document.h" #include "layer.h" #include "map.h" -#include "grouplayer.h" #include @@ -213,24 +212,4 @@ void SetTileLayerSize::setValue(TileLayer *layer, const QSize &value) const emit document()->changed(TileLayerChangeEvent(layer, TileLayerChangeEvent::SizeProperty)); } -SetGroupLayerExpanded::SetGroupLayerExpanded(Document *document, - QList layers, - bool expanded) - : ChangeValue(document, std::move(layers), expanded) -{ - setText(QCoreApplication::translate("Undo Commands", - "Change Group Layer Expanded State")); -} - -bool SetGroupLayerExpanded::getValue(const GroupLayer *layer) const -{ - return layer->isExpanded(); -} - -void SetGroupLayerExpanded::setValue(GroupLayer *layer, const bool &value) const -{ - layer->setExpanded(value); -// emit document()->changed(LayerChangeEvent(layer, LayerChangeEvent::OpacityProperty)); -} - } // namespace Tiled diff --git a/src/tiled/changelayer.h b/src/tiled/changelayer.h index 36a07d7bc2..a86c98b3ec 100644 --- a/src/tiled/changelayer.h +++ b/src/tiled/changelayer.h @@ -31,7 +31,6 @@ namespace Tiled { class Layer; class TileLayer; -class GroupLayer; class SetLayerName : public ChangeValue { @@ -173,21 +172,4 @@ class SetTileLayerSize : public ChangeValue void setValue(TileLayer *layer, const QSize &value) const override; }; -/** - * Used for changing group layer expanded state. - */ -class SetGroupLayerExpanded : public ChangeValue -{ -public: - SetGroupLayerExpanded(Document *document, - QList layers, - bool expanded); - - int id() const override { return Cmd_ChangeGroupLayerExpanded; } - -private: - bool getValue(const GroupLayer *layer) const override; - void setValue(GroupLayer *layer, const bool &value) const override; -}; - } // namespace Tiled diff --git a/src/tiled/editablegrouplayer.cpp b/src/tiled/editablegrouplayer.cpp index a3be1ae692..0fe1cac1b2 100644 --- a/src/tiled/editablegrouplayer.cpp +++ b/src/tiled/editablegrouplayer.cpp @@ -28,8 +28,6 @@ #include "documentmanager.h" #include "mapeditor.h" #include "layerdock.h" -#include "layermodel.h" -#include "qabstractproxymodel.h" #include @@ -144,24 +142,16 @@ void EditableGroupLayer::addLayer(EditableLayer *editableLayer) inline bool EditableGroupLayer::isExpanded() const { - - return groupLayer()->isExpanded(); + auto documentManager = DocumentManager::instance(); + auto mapEditor = static_cast(documentManager->editor(Document::MapDocumentType)); + return mapEditor->layerDock()->isExpanded(groupLayer()); } inline void EditableGroupLayer::setExpanded(bool expanded) { - if (auto doc = document()){ - auto documentManager = DocumentManager::instance(); - auto mapEditor = static_cast(documentManager->editor(Document::MapDocumentType)); - - auto sourceIndex = mapDocument()->layerModel()->index(layer()); - auto layerView = mapEditor->layerDock()->layerView(); - - auto index = layerView->proxyModel()->mapFromSource(sourceIndex); - layerView->setExpanded(index, expanded); - asset()->push(new SetGroupLayerExpanded(doc, { groupLayer() }, expanded)); - }else if (!checkReadOnly()) - groupLayer()->setExpanded(expanded); + auto documentManager = DocumentManager::instance(); + auto mapEditor = static_cast(documentManager->editor(Document::MapDocumentType)); + mapEditor->layerDock()->setExpanded(groupLayer(), expanded); } } // namespace Tiled diff --git a/src/tiled/editablegrouplayer.h b/src/tiled/editablegrouplayer.h index 437f3c2779..639cd8ccfc 100644 --- a/src/tiled/editablegrouplayer.h +++ b/src/tiled/editablegrouplayer.h @@ -51,11 +51,9 @@ class EditableGroupLayer : public EditableLayer Q_INVOKABLE void addLayer(Tiled::EditableLayer *editableLayer); bool isExpanded() const; + GroupLayer *groupLayer() const; public slots: void setExpanded(bool expanded); - -private: - GroupLayer *groupLayer() const; }; inline int EditableGroupLayer::layerCount() const diff --git a/src/tiled/editableobjectgroup.cpp b/src/tiled/editableobjectgroup.cpp index d808ebe6a1..9d98b0bcd4 100644 --- a/src/tiled/editableobjectgroup.cpp +++ b/src/tiled/editableobjectgroup.cpp @@ -25,6 +25,9 @@ #include "editableasset.h" #include "map.h" #include "scriptmanager.h" +#include "documentmanager.h" +#include "mapeditor.h" +#include "objectsdock.h" #include @@ -172,6 +175,20 @@ void EditableObjectGroup::setDrawOrder(DrawOrder drawOrder) } } +inline bool EditableObjectGroup::isExpanded() const +{ + auto documentManager = DocumentManager::instance(); + auto mapEditor = static_cast(documentManager->editor(Document::MapDocumentType)); + return mapEditor->objectsDock()->isExpanded(objectGroup()); +} + +inline void EditableObjectGroup::setExpanded(bool expanded) +{ + auto documentManager = DocumentManager::instance(); + auto mapEditor = static_cast(documentManager->editor(Document::MapDocumentType)); + mapEditor->objectsDock()->setExpanded(objectGroup(), expanded); +} + } // namespace Tiled #include "moc_editableobjectgroup.cpp" diff --git a/src/tiled/editableobjectgroup.h b/src/tiled/editableobjectgroup.h index c370807710..981cf26cef 100644 --- a/src/tiled/editableobjectgroup.h +++ b/src/tiled/editableobjectgroup.h @@ -34,6 +34,7 @@ class EditableObjectGroup : public EditableLayer Q_PROPERTY(int objectCount READ objectCount) Q_PROPERTY(QColor color READ color WRITE setColor) Q_PROPERTY(DrawOrder drawOrder READ drawOrder WRITE setDrawOrder) + Q_PROPERTY(bool expanded READ isExpanded WRITE setExpanded) public: // Synchronized with ObjectGroup::DrawOrder @@ -66,9 +67,11 @@ class EditableObjectGroup : public EditableLayer static EditableObjectGroup *get(EditableAsset *asset, ObjectGroup *objectGroup); + bool isExpanded() const; public slots: void setColor(const QColor &color); void setDrawOrder(DrawOrder drawOrder); + void setExpanded(bool expanded); }; diff --git a/src/tiled/layerdock.cpp b/src/tiled/layerdock.cpp index 4810d0367d..8272d4eac7 100644 --- a/src/tiled/layerdock.cpp +++ b/src/tiled/layerdock.cpp @@ -34,6 +34,7 @@ #include "utils.h" #include "iconcheckdelegate.h" #include "changeevents.h" +#include "grouplayer.h" #include #include @@ -149,6 +150,18 @@ void LayerDock::setMapDocument(MapDocument *mapDocument) updateOpacitySlider(); } +bool LayerDock::isExpanded(GroupLayer *layer) const { + auto sourceIndex = mMapDocument->layerModel()->index(layer); + auto index = mLayerView->proxyModel()->mapFromSource(sourceIndex); + return mLayerView->isExpanded(index); +} + +void LayerDock::setExpanded(GroupLayer *layer, bool expanded) { + auto sourceIndex = mMapDocument->layerModel()->index(layer); + auto index = mLayerView->proxyModel()->mapFromSource(sourceIndex); + mLayerView->setExpanded(index, expanded); +} + void LayerDock::changeEvent(QEvent *e) { QDockWidget::changeEvent(e); diff --git a/src/tiled/layerdock.h b/src/tiled/layerdock.h index e420f72fbb..710d29edc1 100644 --- a/src/tiled/layerdock.h +++ b/src/tiled/layerdock.h @@ -22,6 +22,7 @@ #pragma once #include "mapdocument.h" +#include "editablegrouplayer.h" #include #include @@ -54,7 +55,10 @@ class LayerDock : public QDockWidget */ void setMapDocument(MapDocument *mapDocument); - LayerView *layerView() const { return mLayerView; }; + Q_INVOKABLE bool isExpanded(EditableGroupLayer *layer) const { return isExpanded(layer->groupLayer()); }; + Q_INVOKABLE void setExpanded(EditableGroupLayer *layer, bool expanded) { setExpanded(layer->groupLayer(), expanded); }; + bool isExpanded(GroupLayer *layer) const; + void setExpanded(GroupLayer *layer, bool expanded); protected: void changeEvent(QEvent *e) override; diff --git a/src/tiled/mapeditor.h b/src/tiled/mapeditor.h index 85cf300f24..6cc23e020f 100644 --- a/src/tiled/mapeditor.h +++ b/src/tiled/mapeditor.h @@ -73,6 +73,8 @@ class MapEditor final : public Editor Q_OBJECT Q_PROPERTY(Tiled::TilesetDock *tilesetsView READ tilesetDock CONSTANT) + Q_PROPERTY(Tiled::LayerDock *layersView READ layerDock CONSTANT) + Q_PROPERTY(Tiled::ObjectsDock *objectsView READ objectsDock CONSTANT) Q_PROPERTY(Tiled::EditableMap *currentBrush READ currentBrush WRITE setCurrentBrush) Q_PROPERTY(Tiled::EditableWangSet *currentWangSet READ currentWangSet NOTIFY currentWangSetChanged) Q_PROPERTY(int currentWangColorIndex READ currentWangColorIndex NOTIFY currentWangColorIndexChanged) @@ -84,6 +86,7 @@ class MapEditor final : public Editor TilesetDock *tilesetDock() const { return mTilesetDock; } LayerDock *layerDock() const { return mLayerDock; } + ObjectsDock *objectsDock() const { return mObjectsDock; } TemplatesDock *templatesDock() const { return mTemplatesDock; } void saveState() override; diff --git a/src/tiled/objectsdock.cpp b/src/tiled/objectsdock.cpp index b751a0db92..7b79ccfb46 100644 --- a/src/tiled/objectsdock.cpp +++ b/src/tiled/objectsdock.cpp @@ -151,6 +151,14 @@ void ObjectsDock::setMapDocument(MapDocument *mapDoc) updateActions(); } +bool ObjectsDock::isExpanded(ObjectGroup *layer) const { + return mObjectsView->isExpanded(mObjectsView->layerViewIndex(layer)); +} + +void ObjectsDock::setExpanded(ObjectGroup *layer, bool expanded) { + mObjectsView->setExpanded(mObjectsView->layerViewIndex(layer), expanded); +} + void ObjectsDock::changeEvent(QEvent *e) { QDockWidget::changeEvent(e); diff --git a/src/tiled/objectsdock.h b/src/tiled/objectsdock.h index 989118a130..bce23164bd 100644 --- a/src/tiled/objectsdock.h +++ b/src/tiled/objectsdock.h @@ -20,6 +20,8 @@ #pragma once +#include "editableobjectgroup.h" + #include #include @@ -41,6 +43,11 @@ class ObjectsDock : public QDockWidget void setMapDocument(MapDocument *mapDoc); + Q_INVOKABLE bool isExpanded(EditableObjectGroup *layer) const { return isExpanded(layer->objectGroup()); }; + Q_INVOKABLE void setExpanded(EditableObjectGroup *layer, bool expanded) { setExpanded(layer->objectGroup(), expanded); }; + bool isExpanded(ObjectGroup *layer) const; + void setExpanded(ObjectGroup *layer, bool expanded); + protected: void changeEvent(QEvent *e) override; diff --git a/src/tiled/undocommands.h b/src/tiled/undocommands.h index f18ea4309b..3af2985d35 100644 --- a/src/tiled/undocommands.h +++ b/src/tiled/undocommands.h @@ -52,8 +52,6 @@ enum UndoCommands { Cmd_EraseTiles, Cmd_PaintTileLayer, Cmd_SetProperty, - Cmd_ChangeGroupLayerExpanded, - Cmd_ChangeObjectGroupExpanded, }; /** From 63ea7fbd854ccd065b8eed6143091df89d21f103 Mon Sep 17 00:00:00 2001 From: PalaBeaveR <35870033+PalaBeaveR@users.noreply.github.com> Date: Sun, 14 Jul 2024 15:13:17 +0300 Subject: [PATCH 3/3] Removed an include that is not needed now --- src/tiled/editablegrouplayer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tiled/editablegrouplayer.cpp b/src/tiled/editablegrouplayer.cpp index 0fe1cac1b2..d3c9ae625b 100644 --- a/src/tiled/editablegrouplayer.cpp +++ b/src/tiled/editablegrouplayer.cpp @@ -20,7 +20,6 @@ #include "editablegrouplayer.h" -#include "changelayer.h" #include "addremovelayer.h" #include "addremovetileset.h" #include "editablemap.h"