diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2024-02-07 17:45:29 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2024-02-15 09:40:57 +0000 |
commit | f00666a9853c8554f8d6b2a16aaf4a5f9521dae1 (patch) | |
tree | d8c5803bf2116ffa28fb0f5a36e6305667214a86 /src/plugins/projectexplorer | |
parent | 837e951b29240d28b4c5849acae04d2ebbcd03f1 (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.cpp | 14 |
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()) |