From 8127d5b8f43d72bd23c57be57d266f7601c92452 Mon Sep 17 00:00:00 2001 From: maelstrom Date: Tue, 4 Feb 2025 21:53:47 +0100 Subject: [PATCH] fix: made workspace undraggable and unreparentable --- editor/panes/explorermodel.cpp | 2 +- src/objects/base/instance.cpp | 3 +++ src/objects/base/instance.h | 1 + src/objects/base/service.cpp | 7 ++++++- src/objects/base/service.h | 7 +++++-- src/objects/datamodel.cpp | 2 +- src/objects/workspace.cpp | 2 +- src/objects/workspace.h | 2 +- 8 files changed, 19 insertions(+), 7 deletions(-) diff --git a/editor/panes/explorermodel.cpp b/editor/panes/explorermodel.cpp index 8dbadd5..4571e9a 100644 --- a/editor/panes/explorermodel.cpp +++ b/editor/panes/explorermodel.cpp @@ -144,7 +144,7 @@ Qt::ItemFlags ExplorerModel::flags(const QModelIndex &index) const //return index.isValid() // ? QAbstractItemModel::flags(index) : Qt::ItemFlags(Qt::NoItemFlags); return index.isValid() - ? QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled + ? QAbstractItemModel::flags(index) | Qt::ItemIsEditable | (!fromIndex(index)->IsParentLocked() ? Qt::ItemIsDragEnabled : Qt::NoItemFlags) | Qt::ItemIsDropEnabled : Qt::NoItemFlags | Qt::ItemIsDropEnabled; } diff --git a/src/objects/base/instance.cpp b/src/objects/base/instance.cpp index e0af319..bd6456e 100644 --- a/src/objects/base/instance.cpp +++ b/src/objects/base/instance.cpp @@ -75,6 +75,9 @@ std::optional> Instance::GetParent() { return parent.value().lock(); } +bool Instance::IsParentLocked() { + return this->parentLocked; +} void Instance::OnParentUpdated(std::optional> oldParent, std::optional> newParent) { // Empty stub diff --git a/src/objects/base/instance.h b/src/objects/base/instance.h index d75001e..293e164 100644 --- a/src/objects/base/instance.h +++ b/src/objects/base/instance.h @@ -55,6 +55,7 @@ public: virtual const InstanceType* GetClass() = 0; bool SetParent(std::optional> newParent); std::optional> GetParent(); + bool IsParentLocked(); inline const std::vector> GetChildren() { return children; } // Utility functions diff --git a/src/objects/base/service.cpp b/src/objects/base/service.cpp index c206bda..ecabbfb 100644 --- a/src/objects/base/service.cpp +++ b/src/objects/base/service.cpp @@ -1,4 +1,9 @@ #include "service.h" #include -Service::Service(std::weak_ptr root) : dataModel(root) {} \ No newline at end of file +Service::Service(const InstanceType* type, std::weak_ptr root) : Instance(type), dataModel(root) {} + +void Service::InitService() { + SetParent(dataModel.lock()); + parentLocked = true; +} \ No newline at end of file diff --git a/src/objects/base/service.h b/src/objects/base/service.h index ea167dd..592596f 100644 --- a/src/objects/base/service.h +++ b/src/objects/base/service.h @@ -4,9 +4,12 @@ // They serve one specific task and can be accessed using game:GetService #include "objects/datamodel.h" #include -class Service { +class Service : public Instance { protected: std::weak_ptr dataModel; - Service(std::weak_ptr root); + Service(const InstanceType* type, std::weak_ptr root); + virtual void InitService(); + + friend class DataModel; }; \ No newline at end of file diff --git a/src/objects/datamodel.cpp b/src/objects/datamodel.cpp index 08ace9f..7dca703 100644 --- a/src/objects/datamodel.cpp +++ b/src/objects/datamodel.cpp @@ -18,5 +18,5 @@ DataModel::DataModel() void DataModel::Init() { this->workspace = std::make_shared(shared()); - this->AddChild(this->workspace); + this->workspace->InitService(); } \ No newline at end of file diff --git a/src/objects/workspace.cpp b/src/objects/workspace.cpp index 7886908..3fbfa8e 100644 --- a/src/objects/workspace.cpp +++ b/src/objects/workspace.cpp @@ -11,5 +11,5 @@ const InstanceType* Workspace::GetClass() { return &TYPE; } -Workspace::Workspace(std::weak_ptr dataModel): Instance(&TYPE), Service(dataModel) { +Workspace::Workspace(std::weak_ptr dataModel): Service(&TYPE, dataModel) { } diff --git a/src/objects/workspace.h b/src/objects/workspace.h index d29e1f0..afd41c9 100644 --- a/src/objects/workspace.h +++ b/src/objects/workspace.h @@ -4,7 +4,7 @@ #include "objects/base/service.h" #include -class Workspace : public Instance, Service { +class Workspace : public Service { //private: public: const static InstanceType TYPE;