aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2024-02-07 17:45:29 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2024-02-15 09:40:57 +0000
commitf00666a9853c8554f8d6b2a16aaf4a5f9521dae1 (patch)
treed8c5803bf2116ffa28fb0f5a36e6305667214a86 /src/plugins/projectexplorer
parent837e951b29240d28b4c5849acae04d2ebbcd03f1 (diff)
ProjectExplorer: Accept plain folder nodes as drag & drop targets
As opposed to just project nodes. Task-number: QTCREATORBUG-26545 Change-Id: I33eb2623763fdfacb9b6b8bb1bcd6b4626b3d71e Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/projectexplorer')
-rw-r--r--src/plugins/projectexplorer/projectmodels.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp
index dcbd3a89c8..53f33f58b3 100644
--- a/src/plugins/projectexplorer/projectmodels.cpp
+++ b/src/plugins/projectexplorer/projectmodels.cpp
@@ -679,6 +679,8 @@ bool FlatModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int r
return n->parentProjectNode() != sourceProjectNode; })) {
return true;
}
+ FolderNode * const sourceFolderNode = fileNodes.first()->parentFolderNode();
+ const bool sourceNodeIsSubDir = sourceFolderNode != sourceProjectNode;
Node *targetNode = nodeForIndex(index(row, column, parent));
if (!targetNode)
targetNode = nodeForIndex(parent);
@@ -687,20 +689,22 @@ bool FlatModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int r
if (!targetProjectNode)
targetProjectNode = targetNode->parentProjectNode();
QTC_ASSERT(targetProjectNode, return true);
- if (sourceProjectNode == targetProjectNode)
+ const bool targetNodeIsSubDir = targetNode != targetProjectNode && targetNode->asFolderNode();
+ if (sourceProjectNode == targetProjectNode && !targetNodeIsSubDir && !sourceNodeIsSubDir)
return true;
// Node weirdness: Sometimes the "file path" is a directory, sometimes it's a file...
- const auto dirForProjectNode = [](const ProjectNode *pNode) {
- const FilePath dir = pNode->filePath();
+ const auto dirForFolderNode = [](const FolderNode *node) {
+ const FilePath dir = node->filePath();
if (dir.isDir())
return dir;
return FilePath::fromString(dir.toFileInfo().path());
};
- FilePath targetDir = dirForProjectNode(targetProjectNode);
+ FilePath targetDir = dirForFolderNode(targetNodeIsSubDir ? targetNode->asFolderNode()
+ : targetProjectNode);
// Ask the user what to do now: Copy or add? With or without file transfer?
- DropFileDialog dlg(targetDir == dirForProjectNode(sourceProjectNode) ? FilePath() : targetDir);
+ DropFileDialog dlg(targetDir == dirForFolderNode(sourceFolderNode) ? FilePath() : targetDir);
if (dlg.exec() != QDialog::Accepted)
return true;
if (!dlg.targetDir().isEmpty())