From 6f91ce1c52c45935e3cbb94749d1224defe2c327 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 27 Mar 2018 15:07:54 +0200 Subject: [PATCH] File System view: Add "New Folder" to context menu Task-number: QTCREATORBUG-17358 Change-Id: I64b3d34ca0432369630382c40cf749f3cc1a08df Reviewed-by: Tobias Hunger --- src/libs/utils/fileutils.cpp | 7 +++++ src/libs/utils/fileutils.h | 1 + .../foldernavigationwidget.cpp | 30 +++++++++++++++++++ .../projectexplorer/foldernavigationwidget.h | 1 + 4 files changed, 39 insertions(+) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index f7b9935465a..776d7aa66fd 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -726,6 +726,13 @@ bool FileName::operator>=(const FileName &other) const return other <= *this; } +FileName FileName::operator+(const QString &s) const +{ + FileName result(*this); + result.appendString(s); + return result; +} + /// \returns whether FileName is a child of \a s bool FileName::isChildOf(const FileName &s) const { diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index d3c4044eba3..00b070eb161 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -84,6 +84,7 @@ public: bool operator<=(const FileName &other) const; bool operator>(const FileName &other) const; bool operator>=(const FileName &other) const; + FileName operator+(const QString &s) const; bool isChildOf(const FileName &s) const; bool isChildOf(const QDir &dir) const; diff --git a/src/plugins/projectexplorer/foldernavigationwidget.cpp b/src/plugins/projectexplorer/foldernavigationwidget.cpp index cafa8cd5cd1..f358c82dfd1 100644 --- a/src/plugins/projectexplorer/foldernavigationwidget.cpp +++ b/src/plugins/projectexplorer/foldernavigationwidget.cpp @@ -49,10 +49,12 @@ #include #include +#include #include #include #include #include +#include #include #include @@ -609,6 +611,26 @@ void FolderNavigationWidget::openProjectsInDirectory(const QModelIndex &index) Core::ICore::instance()->openFiles(projectFiles); } +void FolderNavigationWidget::createNewFolder(const QModelIndex &parent) +{ + static const QString baseName = tr("New Folder"); + // find non-existing name + const QDir dir(m_fileSystemModel->filePath(parent)); + const QSet existingItems + = Utils::transform(dir.entryList({baseName + '*'}, QDir::AllEntries), + [](const QString &entry) { + return Utils::FileName::fromString(entry); + }); + const Utils::FileName name = Utils::makeUniquelyNumbered(Utils::FileName::fromString(baseName), + existingItems); + // create directory and edit + const QModelIndex index = m_fileSystemModel->mkdir(parent, name.toString()); + if (!index.isValid()) + return; + m_listView->setCurrentIndex(index); + m_listView->edit(index); +} + void FolderNavigationWidget::setCrumblePath(const QModelIndex &index, const QModelIndex &) { const int width = m_crumbLabel->width(); @@ -645,6 +667,7 @@ void FolderNavigationWidget::contextMenuEvent(QContextMenuEvent *ev) QAction *actionOpenFile = nullptr; QAction *actionOpenProjects = nullptr; QAction *actionOpenAsProject = nullptr; + QAction *newFolder = nullptr; const bool isDir = m_fileSystemModel->isDir(current); const Utils::FileName filePath = hasCurrentItem ? Utils::FileName::fromString( m_fileSystemModel->filePath(current)) @@ -676,6 +699,7 @@ void FolderNavigationWidget::contextMenuEvent(QContextMenuEvent *ev) menu.addAction(Core::ActionManager::command(Constants::REMOVEFILE)->action()); if (m_fileSystemModel->flags(current) & Qt::ItemIsEditable) menu.addAction(Core::ActionManager::command(Constants::RENAMEFILE)->action()); + newFolder = menu.addAction(tr("New Folder")); if (!isDir && Core::DiffService::instance()) { menu.addAction( TextEditor::TextDocument::createDiffAgainstCurrentFileAction(&menu, [filePath]() { @@ -695,6 +719,12 @@ void FolderNavigationWidget::contextMenuEvent(QContextMenuEvent *ev) ProjectExplorerPlugin::openProject(filePath.toString()); else if (action == actionOpenProjects) openProjectsInDirectory(current); + else if (action == newFolder) { + if (isDir) + createNewFolder(current); + else + createNewFolder(current.parent()); + } } bool FolderNavigationWidget::rootAutoSynchronization() const diff --git a/src/plugins/projectexplorer/foldernavigationwidget.h b/src/plugins/projectexplorer/foldernavigationwidget.h index 5ba18990910..383da946ce9 100644 --- a/src/plugins/projectexplorer/foldernavigationwidget.h +++ b/src/plugins/projectexplorer/foldernavigationwidget.h @@ -127,6 +127,7 @@ private: void openItem(const QModelIndex &index); QStringList projectsInDirectory(const QModelIndex &index) const; void openProjectsInDirectory(const QModelIndex &index); + void createNewFolder(const QModelIndex &parent); void setCrumblePath(const QModelIndex &index, const QModelIndex &); Core::IContext *m_context = nullptr;