Sort root directories in file system view

Change-Id: I8ce68ffa4752c89de735583640103bc22c2a8bc7
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Eike Ziller
2017-09-15 13:30:26 +02:00
parent cf370d5305
commit 08aa833825
3 changed files with 66 additions and 51 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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;
} }