forked from qt-creator/qt-creator
Sort root directories in file system view
Change-Id: I8ce68ffa4752c89de735583640103bc22c2a8bc7 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -53,12 +53,15 @@
|
|||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
|
||||||
|
const int PATH_ROLE = Qt::UserRole;
|
||||||
|
const int ID_ROLE = Qt::UserRole + 1;
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
static FolderNavigationWidgetFactory *m_instance = nullptr;
|
static FolderNavigationWidgetFactory *m_instance = nullptr;
|
||||||
|
|
||||||
QVector<FolderNavigationWidgetFactory::DirectoryEntry>
|
QVector<FolderNavigationWidgetFactory::RootDirectory>
|
||||||
FolderNavigationWidgetFactory::m_rootDirectories;
|
FolderNavigationWidgetFactory::m_rootDirectories;
|
||||||
|
|
||||||
// FolderNavigationModel: Shows path as tooltip.
|
// FolderNavigationModel: Shows path as tooltip.
|
||||||
@@ -164,21 +167,26 @@ void FolderNavigationWidget::toggleAutoSynchronization()
|
|||||||
setAutoSynchronization(!m_autoSync);
|
setAutoSynchronization(!m_autoSync);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FolderNavigationWidget::addRootDirectory(const QString &displayName,
|
void FolderNavigationWidget::addRootDirectory(
|
||||||
const Utils::FileName &directory)
|
const FolderNavigationWidgetFactory::RootDirectory &directory)
|
||||||
{
|
{
|
||||||
m_rootSelector->addItem(displayName, qVariantFromValue(directory));
|
// insert sorted
|
||||||
m_rootSelector->setItemData(m_rootSelector->count() - 1,
|
int index = 0;
|
||||||
directory.toUserOutput(),
|
while (index < m_rootSelector->count()
|
||||||
Qt::ToolTipRole);
|
&& m_rootSelector->itemData(index, ID_ROLE).toString() < directory.id)
|
||||||
|
++index;
|
||||||
|
m_rootSelector->insertItem(index, directory.displayName);
|
||||||
|
m_rootSelector->setItemData(index, qVariantFromValue(directory.path), PATH_ROLE);
|
||||||
|
m_rootSelector->setItemData(index, directory.id, ID_ROLE);
|
||||||
|
m_rootSelector->setItemData(index, directory.path.toUserOutput(), Qt::ToolTipRole);
|
||||||
if (m_autoSync) // we might find a better root for current selection now
|
if (m_autoSync) // we might find a better root for current selection now
|
||||||
setCurrentEditor(Core::EditorManager::currentEditor());
|
setCurrentEditor(Core::EditorManager::currentEditor());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FolderNavigationWidget::removeRootDirectory(const Utils::FileName &directory)
|
void FolderNavigationWidget::removeRootDirectory(const QString &id)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < m_rootSelector->count(); ++i) {
|
for (int i = 0; i < m_rootSelector->count(); ++i) {
|
||||||
if (m_rootSelector->itemData(i).value<Utils::FileName>() == directory) {
|
if (m_rootSelector->itemData(i, ID_ROLE).toString() == id) {
|
||||||
m_rootSelector->removeItem(i);
|
m_rootSelector->removeItem(i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -343,14 +351,15 @@ FolderNavigationWidgetFactory::FolderNavigationWidgetFactory()
|
|||||||
setPriority(400);
|
setPriority(400);
|
||||||
setId("File System");
|
setId("File System");
|
||||||
setActivationSequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+Y") : tr("Alt+Y")));
|
setActivationSequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+Y") : tr("Alt+Y")));
|
||||||
addRootDirectory(FolderNavigationWidget::tr("Computer"), Utils::FileName());
|
addRootDirectory(
|
||||||
|
{QLatin1String("A.Computer"), FolderNavigationWidget::tr("Computer"), Utils::FileName()});
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::NavigationView FolderNavigationWidgetFactory::createWidget()
|
Core::NavigationView FolderNavigationWidgetFactory::createWidget()
|
||||||
{
|
{
|
||||||
auto fnw = new FolderNavigationWidget;
|
auto fnw = new FolderNavigationWidget;
|
||||||
for (const DirectoryEntry &root : m_rootDirectories)
|
for (const RootDirectory &root : m_rootDirectories)
|
||||||
fnw->addRootDirectory(root.first, root.second);
|
fnw->addRootDirectory(root);
|
||||||
connect(this,
|
connect(this,
|
||||||
&FolderNavigationWidgetFactory::rootDirectoryAdded,
|
&FolderNavigationWidgetFactory::rootDirectoryAdded,
|
||||||
fnw,
|
fnw,
|
||||||
@@ -392,21 +401,19 @@ void FolderNavigationWidgetFactory::restoreSettings(QSettings *settings, int pos
|
|||||||
fnw->setAutoSynchronization(settings->value(baseKey + QLatin1String(".SyncWithEditor"), true).toBool());
|
fnw->setAutoSynchronization(settings->value(baseKey + QLatin1String(".SyncWithEditor"), true).toBool());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FolderNavigationWidgetFactory::addRootDirectory(const QString &displayName,
|
void FolderNavigationWidgetFactory::addRootDirectory(const RootDirectory &directory)
|
||||||
const Utils::FileName &directory)
|
|
||||||
{
|
{
|
||||||
m_rootDirectories.append(DirectoryEntry(displayName, directory));
|
m_rootDirectories.append(directory);
|
||||||
emit m_instance->rootDirectoryAdded(displayName, directory);
|
emit m_instance->rootDirectoryAdded(directory);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FolderNavigationWidgetFactory::removeRootDirectory(const Utils::FileName &directory)
|
void FolderNavigationWidgetFactory::removeRootDirectory(const QString &id)
|
||||||
{
|
{
|
||||||
const int index = Utils::indexOf(m_rootDirectories, [directory](const DirectoryEntry &entry) {
|
const int index = Utils::indexOf(m_rootDirectories,
|
||||||
return entry.second == directory;
|
[id](const RootDirectory &entry) { return entry.id == id; });
|
||||||
});
|
QTC_ASSERT(index >= 0, return );
|
||||||
QTC_ASSERT(index >= 0, return);
|
|
||||||
m_rootDirectories.removeAt(index);
|
m_rootDirectories.removeAt(index);
|
||||||
emit m_instance->rootDirectoryRemoved(directory);
|
emit m_instance->rootDirectoryRemoved(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
@@ -26,13 +26,13 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <coreplugin/inavigationwidgetfactory.h>
|
#include <coreplugin/inavigationwidgetfactory.h>
|
||||||
|
#include <utils/fileutils.h>
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
namespace Core { class IEditor; }
|
namespace Core { class IEditor; }
|
||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
class FileName;
|
|
||||||
class NavigationTreeView;
|
class NavigationTreeView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,6 +46,34 @@ QT_END_NAMESPACE
|
|||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
|
class FolderNavigationWidgetFactory : public Core::INavigationWidgetFactory
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct RootDirectory {
|
||||||
|
QString id;
|
||||||
|
QString displayName;
|
||||||
|
Utils::FileName path;
|
||||||
|
};
|
||||||
|
|
||||||
|
FolderNavigationWidgetFactory();
|
||||||
|
|
||||||
|
Core::NavigationView createWidget() override;
|
||||||
|
void saveSettings(QSettings *settings, int position, QWidget *widget) override;
|
||||||
|
void restoreSettings(QSettings *settings, int position, QWidget *widget) override;
|
||||||
|
|
||||||
|
static void addRootDirectory(const RootDirectory &directory);
|
||||||
|
static void removeRootDirectory(const QString &id);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void rootDirectoryAdded(const RootDirectory &directory);
|
||||||
|
void rootDirectoryRemoved(const QString &id);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static QVector<RootDirectory> m_rootDirectories;
|
||||||
|
};
|
||||||
|
|
||||||
class FolderNavigationWidget : public QWidget
|
class FolderNavigationWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -61,8 +89,8 @@ public:
|
|||||||
void setAutoSynchronization(bool sync);
|
void setAutoSynchronization(bool sync);
|
||||||
void toggleAutoSynchronization();
|
void toggleAutoSynchronization();
|
||||||
|
|
||||||
void addRootDirectory(const QString &displayName, const Utils::FileName &directory);
|
void addRootDirectory(const FolderNavigationWidgetFactory::RootDirectory &directory);
|
||||||
void removeRootDirectory(const Utils::FileName &directory);
|
void removeRootDirectory(const QString &id);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void contextMenuEvent(QContextMenuEvent *ev) override;
|
void contextMenuEvent(QContextMenuEvent *ev) override;
|
||||||
@@ -86,28 +114,5 @@ private:
|
|||||||
friend class FolderNavigationWidgetFactory;
|
friend class FolderNavigationWidgetFactory;
|
||||||
};
|
};
|
||||||
|
|
||||||
class FolderNavigationWidgetFactory : public Core::INavigationWidgetFactory
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
FolderNavigationWidgetFactory();
|
|
||||||
|
|
||||||
Core::NavigationView createWidget() override;
|
|
||||||
void saveSettings(QSettings *settings, int position, QWidget *widget) override;
|
|
||||||
void restoreSettings(QSettings *settings, int position, QWidget *widget) override;
|
|
||||||
|
|
||||||
static void addRootDirectory(const QString &displayName, const Utils::FileName &directory);
|
|
||||||
static void removeRootDirectory(const Utils::FileName &directory);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void rootDirectoryAdded(const QString &displayName, const Utils::FileName &directory);
|
|
||||||
void rootDirectoryRemoved(const Utils::FileName &directory);
|
|
||||||
|
|
||||||
private:
|
|
||||||
using DirectoryEntry = std::pair<QString, Utils::FileName>;
|
|
||||||
static QVector<DirectoryEntry> m_rootDirectories;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
@@ -386,8 +386,10 @@ void SessionManager::addProject(Project *pro)
|
|||||||
m_instance, [pro]() { m_instance->projectDisplayNameChanged(pro); });
|
m_instance, [pro]() { m_instance->projectDisplayNameChanged(pro); });
|
||||||
|
|
||||||
emit m_instance->projectAdded(pro);
|
emit m_instance->projectAdded(pro);
|
||||||
FolderNavigationWidgetFactory::addRootDirectory(pro->displayName(),
|
FolderNavigationWidgetFactory::addRootDirectory(
|
||||||
pro->projectFilePath().parentDir());
|
{"P." + pro->displayName() + "." + pro->projectFilePath().toString(),
|
||||||
|
pro->displayName(),
|
||||||
|
pro->projectFilePath().parentDir()});
|
||||||
configureEditors(pro);
|
configureEditors(pro);
|
||||||
connect(pro, &Project::fileListChanged, [pro](){ configureEditors(pro); });
|
connect(pro, &Project::fileListChanged, [pro](){ configureEditors(pro); });
|
||||||
}
|
}
|
||||||
@@ -742,7 +744,8 @@ void SessionManager::removeProjects(QList<Project *> remove)
|
|||||||
m_instance, &SessionManager::clearProjectFileCache);
|
m_instance, &SessionManager::clearProjectFileCache);
|
||||||
d->m_projectFileCache.remove(pro);
|
d->m_projectFileCache.remove(pro);
|
||||||
emit m_instance->projectRemoved(pro);
|
emit m_instance->projectRemoved(pro);
|
||||||
FolderNavigationWidgetFactory::removeRootDirectory(pro->projectFilePath().parentDir());
|
FolderNavigationWidgetFactory::removeRootDirectory("P." + pro->displayName() + "."
|
||||||
|
+ pro->projectFilePath().toString());
|
||||||
delete pro;
|
delete pro;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user