forked from qt-creator/qt-creator
Add "Remove File" to file system view
Task-number: QTCREATORBUG-19208 Change-Id: Iacf1e1468018fa8dd3426bc1325f36bb39a4b4e2 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -479,6 +479,12 @@ IContext *ICore::currentContextObject()
|
||||
return m_mainwindow->currentContextObject();
|
||||
}
|
||||
|
||||
QWidget *ICore::currentContextWidget()
|
||||
{
|
||||
IContext *context = currentContextObject();
|
||||
return context ? context->widget() : nullptr;
|
||||
}
|
||||
|
||||
|
||||
QWidget *ICore::mainWindow()
|
||||
{
|
||||
|
@@ -106,6 +106,7 @@ public:
|
||||
static void raiseWindow(QWidget *widget);
|
||||
|
||||
static IContext *currentContextObject();
|
||||
static QWidget *currentContextWidget();
|
||||
// Adds and removes additional active contexts, these contexts are appended
|
||||
// to the currently active contexts.
|
||||
static void updateAdditionalContexts(const Context &remove, const Context &add,
|
||||
|
@@ -51,6 +51,7 @@
|
||||
#include <utils/hostosinfo.h>
|
||||
#include <utils/navigationtreeview.h>
|
||||
#include <utils/qtcassert.h>
|
||||
#include <utils/removefiledialog.h>
|
||||
#include <utils/utilsicons.h>
|
||||
|
||||
#include <QAction>
|
||||
@@ -161,6 +162,14 @@ static QVector<FolderNode *> renamableFolderNodes(const Utils::FileName &before,
|
||||
return folderNodes;
|
||||
}
|
||||
|
||||
static QStringList projectNames(const QVector<FolderNode *> &folders)
|
||||
{
|
||||
const QStringList names = Utils::transform<QList>(folders, [](FolderNode *n) {
|
||||
return n->managingProject()->filePath().fileName();
|
||||
});
|
||||
return Utils::filteredUnique(names);
|
||||
}
|
||||
|
||||
bool FolderNavigationModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||
{
|
||||
QTC_ASSERT(index.isValid() && parent(index).isValid() && index.column() == 0
|
||||
@@ -186,12 +195,7 @@ bool FolderNavigationModel::setData(const QModelIndex &index, const QVariant &va
|
||||
failedNodes.append(folder);
|
||||
}
|
||||
if (!failedNodes.isEmpty()) {
|
||||
const QString projects
|
||||
= Utils::transform<QList>(failedNodes,
|
||||
[](FolderNode *n) {
|
||||
return n->managingProject()->filePath().fileName();
|
||||
})
|
||||
.join(", ");
|
||||
const QString projects = projectNames(failedNodes).join(", ");
|
||||
const QString errorMessage
|
||||
= tr("The file \"%1\" was renamed to \"%2\", "
|
||||
"but the following projects could not be automatically changed: %3")
|
||||
@@ -395,6 +399,51 @@ void FolderNavigationWidget::editCurrentItem()
|
||||
m_listView->edit(current);
|
||||
}
|
||||
|
||||
static QVector<FolderNode *> removableFolderNodes(const Utils::FileName &filePath)
|
||||
{
|
||||
QVector<FolderNode *> folderNodes;
|
||||
ProjectTree::forEachNode([&](Node *node) {
|
||||
if (node->nodeType() == NodeType::File && node->filePath() == filePath
|
||||
&& node->parentFolderNode()
|
||||
&& node->parentFolderNode()->supportsAction(RemoveFile, node)) {
|
||||
folderNodes.append(node->parentFolderNode());
|
||||
}
|
||||
});
|
||||
return folderNodes;
|
||||
}
|
||||
|
||||
void FolderNavigationWidget::removeCurrentItem()
|
||||
{
|
||||
const QModelIndex current = m_listView->currentIndex();
|
||||
if (!current.isValid() || m_fileSystemModel->isDir(current))
|
||||
return;
|
||||
const QString filePath = m_fileSystemModel->filePath(current);
|
||||
Utils::RemoveFileDialog dialog(filePath, Core::ICore::dialogParent());
|
||||
dialog.setDeleteFileVisible(false);
|
||||
if (dialog.exec() == QDialog::Accepted) {
|
||||
const QVector<FolderNode *> folderNodes = removableFolderNodes(
|
||||
Utils::FileName::fromString(filePath));
|
||||
const QVector<FolderNode *> failedNodes = Utils::filtered(folderNodes,
|
||||
[filePath](FolderNode *folder) {
|
||||
return !folder->removeFiles(
|
||||
{filePath});
|
||||
});
|
||||
Core::FileChangeBlocker changeGuard(filePath);
|
||||
Core::FileUtils::removeFile(filePath, true /*delete from disk*/);
|
||||
if (!failedNodes.isEmpty()) {
|
||||
const QString projects = projectNames(failedNodes).join(", ");
|
||||
const QString errorMessage
|
||||
= tr("The following projects failed to automatically remove the file: %1")
|
||||
.arg(projects);
|
||||
QTimer::singleShot(0, Core::ICore::instance(), [errorMessage] {
|
||||
QMessageBox::warning(Core::ICore::dialogParent(),
|
||||
ProjectExplorerPlugin::tr("Project Editing Failed"),
|
||||
errorMessage);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool FolderNavigationWidget::autoSynchronization() const
|
||||
{
|
||||
return m_autoSync;
|
||||
@@ -559,6 +608,8 @@ void FolderNavigationWidget::contextMenuEvent(QContextMenuEvent *ev)
|
||||
Core::EditorManager::addNativeDirAndOpenWithActions(&menu, &fakeEntry);
|
||||
|
||||
if (hasCurrentItem) {
|
||||
if (!isDir)
|
||||
menu.addAction(Core::ActionManager::command(Constants::REMOVEFILE)->action());
|
||||
if (m_fileSystemModel->flags(current) & Qt::ItemIsEditable)
|
||||
menu.addAction(Core::ActionManager::command(Constants::RENAMEFILE)->action());
|
||||
if (!isDir && Core::DiffService::instance()) {
|
||||
@@ -712,17 +763,28 @@ void FolderNavigationWidgetFactory::updateProjectsDirectoryRoot()
|
||||
Utils::Icons::PROJECT.icon()});
|
||||
}
|
||||
|
||||
static FolderNavigationWidget *currentFolderNavigationWidget()
|
||||
{
|
||||
return qobject_cast<FolderNavigationWidget *>(Core::ICore::currentContextWidget());
|
||||
}
|
||||
|
||||
void FolderNavigationWidgetFactory::registerActions()
|
||||
{
|
||||
Core::Context context(C_FOLDERNAVIGATIONWIDGET);
|
||||
|
||||
auto rename = new QAction(this);
|
||||
Core::ActionManager::registerAction(rename, Constants::RENAMEFILE, context);
|
||||
connect(rename, &QAction::triggered, Core::ICore::instance(), [] {
|
||||
Core::IContext *context = Core::ICore::currentContextObject();
|
||||
QWidget *widget = context ? context->widget() : nullptr;
|
||||
if (auto navWidget = qobject_cast<FolderNavigationWidget *>(widget))
|
||||
if (auto navWidget = currentFolderNavigationWidget())
|
||||
navWidget->editCurrentItem();
|
||||
});
|
||||
|
||||
auto remove = new QAction(this);
|
||||
Core::ActionManager::registerAction(remove, Constants::REMOVEFILE, context);
|
||||
connect(remove, &QAction::triggered, Core::ICore::instance(), [] {
|
||||
if (auto navWidget = currentFolderNavigationWidget())
|
||||
navWidget->removeCurrentItem();
|
||||
});
|
||||
}
|
||||
|
||||
int DelayedFileCrumbLabel::immediateHeightForWidth(int w) const
|
||||
|
@@ -107,6 +107,7 @@ public:
|
||||
void removeRootDirectory(const QString &id);
|
||||
|
||||
void editCurrentItem();
|
||||
void removeCurrentItem();
|
||||
|
||||
protected:
|
||||
void contextMenuEvent(QContextMenuEvent *ev) override;
|
||||
|
@@ -208,7 +208,6 @@ const char OPENFILE[] = "ProjectExplorer.OpenFile";
|
||||
const char SEARCHONFILESYSTEM[] = "ProjectExplorer.SearchOnFileSystem";
|
||||
const char SHOWINGRAPHICALSHELL[] = "ProjectExplorer.ShowInGraphicalShell";
|
||||
const char OPENTERMIANLHERE[] = "ProjectExplorer.OpenTerminalHere";
|
||||
const char REMOVEFILE[] = "ProjectExplorer.RemoveFile";
|
||||
const char DUPLICATEFILE[] = "ProjectExplorer.DuplicateFile";
|
||||
const char DELETEFILE[] = "ProjectExplorer.DeleteFile";
|
||||
const char DIFFFILE[] = "ProjectExplorer.DiffFile";
|
||||
|
@@ -37,7 +37,7 @@ const char MODE_SESSION[] = "Project";
|
||||
const char BUILD[] = "ProjectExplorer.Build";
|
||||
const char STOP[] = "ProjectExplorer.Stop";
|
||||
const char RENAMEFILE[] = "ProjectExplorer.RenameFile";
|
||||
|
||||
const char REMOVEFILE[] = "ProjectExplorer.RemoveFile";
|
||||
|
||||
// Context
|
||||
const char C_PROJECT_TREE[] = "ProjectExplorer.ProjectTreeContext";
|
||||
|
Reference in New Issue
Block a user