From d27d7fc234a6d65fb714619c205f8fe240461380 Mon Sep 17 00:00:00 2001 From: Josh Ventura Date: Sun, 22 Nov 2020 00:46:54 -0500 Subject: [PATCH] Add TreeModel::MakeResourcePath and ResourceMoved. These should enable moving resources on disk in response to moving that resource in the tree. We may need to revisit the TreeModel to make it use a custom wrapper of the TreeNode proto. This would save us some headache keeping track of the tree structure, and also where the files live on disk, when they were last saved, etc. --- Models/TreeModel.cpp | 14 ++++++++++++++ Models/TreeModel.h | 10 ++++++++++ 2 files changed, 24 insertions(+) diff --git a/Models/TreeModel.cpp b/Models/TreeModel.cpp index 98b18c3bb..e75ddf362 100644 --- a/Models/TreeModel.cpp +++ b/Models/TreeModel.cpp @@ -158,6 +158,18 @@ int TreeModel::rowCount(const QModelIndex &parent) const { return parentItem->child_size(); } +buffers::TreeNode *TreeModel::Parent(buffers::TreeNode *node) const { + auto p = parents.find(node); + return p == parents.end() ? nullptr : *p; +} + +QString TreeModel::MakeResourcePath(buffers::TreeNode *resource) const { + QString res = QString::fromStdString(resource->name()); + while ((resource = Parent(resource))) + res = QString::fromStdString(resource->name()) + "/" + res; + return res; +} + Qt::DropActions TreeModel::supportedDropActions() const { return Qt::MoveAction | Qt::CopyAction; } QStringList TreeModel::mimeTypes() const { return QStringList(treeNodeMime()); } @@ -266,6 +278,8 @@ bool TreeModel::dropMimeData(const QMimeData *mimeData, Qt::DropAction action, i parents[node] = parentNode; endMoveRows(); ++row; + + emit ResourceMoved(node, oldParent); } else { if (node->folder()) continue; node = duplicateNode(*node); diff --git a/Models/TreeModel.h b/Models/TreeModel.h index cadc1f99a..0f5a49712 100644 --- a/Models/TreeModel.h +++ b/Models/TreeModel.h @@ -33,6 +33,13 @@ class TreeModel : public QAbstractItemModel { int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; + // Retrieves the parent of the given node, or else returns nullptr. + // This is required because the TreeModel uses raw TreeNode protos as its data + // storage format, which cannot point to one another cyclically. + buffers::TreeNode *Parent(buffers::TreeNode *node) const; + // Builds the relative path of the given resource. + QString MakeResourcePath(buffers::TreeNode *resource) const; + Qt::DropActions supportedDropActions() const override; QStringList mimeTypes() const override; QMimeData *mimeData(const QModelIndexList &indexes) const override; @@ -46,7 +53,10 @@ class TreeModel : public QAbstractItemModel { void sortByName(const QModelIndex &index); signals: + // Called when the name of a single TreeNode changes. void ResourceRenamed(TypeCase type, const QString &oldName, const QString &newName); + // Called when a resource (or group of resources) is moved. + void ResourceMoved(TreeNode *node, TreeNode *old_parent); private: buffers::TreeNode *root;