diff options
author | Serhii Moroz <frost.asm@gmail.com> | 2016-09-17 18:31:56 +0300 |
---|---|---|
committer | Serhii Moroz <frost.asm@gmail.com> | 2017-03-09 08:19:54 +0000 |
commit | 69da534f99252d5f2b0f26b6637c51eca35dd6e0 (patch) | |
tree | ac92837999c8703d1ba077c11e874786fedfc31f | |
parent | 69f978efca60012e55a443a88bf86c1cae7be728 (diff) |
TextEditor: add right sidebar
Task-number: QTCREATORBUG-9436
Change-Id: Ic0406758a30d52c22c58433f5f35305b798cb462
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Reviewed-by: André Hartmann <aha_1980@gmx.de>
33 files changed, 408 insertions, 212 deletions
diff --git a/src/libs/utils/images/sidebaricon.png b/src/libs/utils/images/leftsidebaricon.png Binary files differindex 413bed7c49..413bed7c49 100644 --- a/src/libs/utils/images/sidebaricon.png +++ b/src/libs/utils/images/leftsidebaricon.png diff --git a/src/libs/utils/images/sidebaricon@2x.png b/src/libs/utils/images/leftsidebaricon@2x.png Binary files differindex 81937400b4..81937400b4 100644 --- a/src/libs/utils/images/sidebaricon@2x.png +++ b/src/libs/utils/images/leftsidebaricon@2x.png diff --git a/src/libs/utils/images/rightsidebaricon.png b/src/libs/utils/images/rightsidebaricon.png Binary files differnew file mode 100644 index 0000000000..95df5c3b9b --- /dev/null +++ b/src/libs/utils/images/rightsidebaricon.png diff --git a/src/libs/utils/images/rightsidebaricon@2x.png b/src/libs/utils/images/rightsidebaricon@2x.png Binary files differnew file mode 100644 index 0000000000..301227a2a9 --- /dev/null +++ b/src/libs/utils/images/rightsidebaricon@2x.png diff --git a/src/libs/utils/utils.qrc b/src/libs/utils/utils.qrc index 9c57ed3e12..5c1d478d1c 100644 --- a/src/libs/utils/utils.qrc +++ b/src/libs/utils/utils.qrc @@ -80,8 +80,10 @@ <file>images/replace_b.png</file> <file>images/replace_b@2x.png</file> <file>images/reset.png</file> - <file>images/sidebaricon.png</file> - <file>images/sidebaricon@2x.png</file> + <file>images/leftsidebaricon.png</file> + <file>images/leftsidebaricon@2x.png</file> + <file>images/rightsidebaricon.png</file> + <file>images/rightsidebaricon@2x.png</file> <file>images/splitbutton_horizontal.png</file> <file>images/splitbutton_horizontal@2x.png</file> <file>images/undo.png</file> diff --git a/src/libs/utils/utilsicons.cpp b/src/libs/utils/utilsicons.cpp index 12dac5d37e..27db225e0c 100644 --- a/src/libs/utils/utilsicons.cpp +++ b/src/libs/utils/utilsicons.cpp @@ -131,10 +131,14 @@ const Icon CLEAN_TOOLBAR({ {QLatin1String(":/utils/images/clean_pane_small.png"), Theme::IconsBaseColor}}); const Icon RELOAD({ {QLatin1String(":/utils/images/reload_gray.png"), Theme::IconsBaseColor}}); -const Icon TOGGLE_SIDEBAR({ - {QLatin1String(":/utils/images/sidebaricon.png"), Theme::PanelTextColorMid}}, Icon::MenuTintedStyle); -const Icon TOGGLE_SIDEBAR_TOOLBAR({ - {QLatin1String(":/utils/images/sidebaricon.png"), Theme::IconsBaseColor}}); +const Icon TOGGLE_LEFT_SIDEBAR({ + {QLatin1String(":/utils/images/leftsidebaricon.png"), Theme::PanelTextColorMid}}, Icon::MenuTintedStyle); +const Icon TOGGLE_LEFT_SIDEBAR_TOOLBAR({ + {QLatin1String(":/utils/images/leftsidebaricon.png"), Theme::IconsBaseColor}}); +const Icon TOGGLE_RIGHT_SIDEBAR({ + {QLatin1String(":/utils/images/rightsidebaricon.png"), Theme::PanelTextColorMid}}, Icon::MenuTintedStyle); +const Icon TOGGLE_RIGHT_SIDEBAR_TOOLBAR({ + {QLatin1String(":/utils/images/rightsidebaricon.png"), Theme::IconsBaseColor}}); const Icon CLOSE_TOOLBAR({ {QLatin1String(":/utils/images/close.png"), Theme::IconsBaseColor}}); const Icon CLOSE_FOREGROUND({ diff --git a/src/libs/utils/utilsicons.h b/src/libs/utils/utilsicons.h index b06a374728..2e3e083e19 100644 --- a/src/libs/utils/utilsicons.h +++ b/src/libs/utils/utilsicons.h @@ -81,8 +81,10 @@ QTCREATOR_UTILS_EXPORT extern const Icon MAGNIFIER; QTCREATOR_UTILS_EXPORT extern const Icon CLEAN; QTCREATOR_UTILS_EXPORT extern const Icon CLEAN_TOOLBAR; QTCREATOR_UTILS_EXPORT extern const Icon RELOAD; -QTCREATOR_UTILS_EXPORT extern const Icon TOGGLE_SIDEBAR; -QTCREATOR_UTILS_EXPORT extern const Icon TOGGLE_SIDEBAR_TOOLBAR; +QTCREATOR_UTILS_EXPORT extern const Icon TOGGLE_LEFT_SIDEBAR; +QTCREATOR_UTILS_EXPORT extern const Icon TOGGLE_LEFT_SIDEBAR_TOOLBAR; +QTCREATOR_UTILS_EXPORT extern const Icon TOGGLE_RIGHT_SIDEBAR; +QTCREATOR_UTILS_EXPORT extern const Icon TOGGLE_RIGHT_SIDEBAR_TOOLBAR; QTCREATOR_UTILS_EXPORT extern const Icon CLOSE_TOOLBAR; QTCREATOR_UTILS_EXPORT extern const Icon CLOSE_FOREGROUND; QTCREATOR_UTILS_EXPORT extern const Icon CLOSE_BACKGROUND; diff --git a/src/plugins/bookmarks/bookmarkmanager.h b/src/plugins/bookmarks/bookmarkmanager.h index 1a35f28400..c4404922d3 100644 --- a/src/plugins/bookmarks/bookmarkmanager.h +++ b/src/plugins/bookmarks/bookmarkmanager.h @@ -162,7 +162,7 @@ public: BookmarkViewFactory(BookmarkManager *bm); private: - Core::NavigationView createWidget(); + Core::NavigationView createWidget() override; BookmarkManager *m_manager; }; diff --git a/src/plugins/classview/classviewnavigationwidgetfactory.cpp b/src/plugins/classview/classviewnavigationwidgetfactory.cpp index e8223796d0..2d35c67c70 100644 --- a/src/plugins/classview/classviewnavigationwidgetfactory.cpp +++ b/src/plugins/classview/classviewnavigationwidgetfactory.cpp @@ -70,33 +70,29 @@ Core::NavigationView NavigationWidgetFactory::createWidget() */ static QString settingsPrefix(int position) { - return QString::fromLatin1("ClassView/Treewidget.%1/FlatMode").arg(position); + return QString::fromLatin1("ClassView.Treewidget.%1.FlatMode").arg(position); } //! Flat mode settings -void NavigationWidgetFactory::saveSettings(int position, QWidget *widget) +void NavigationWidgetFactory::saveSettings(QSettings *settings, int position, QWidget *widget) { NavigationWidget *pw = qobject_cast<NavigationWidget *>(widget); QTC_ASSERT(pw, return); // .beginGroup is not used - to prevent simultaneous access - QString group = settingsPrefix(position); - - // Save settings - Core::ICore::settings()->setValue(group, pw->flatMode()); + QString settingsGroup = settingsPrefix(position); + settings->setValue(settingsGroup, pw->flatMode()); } -void NavigationWidgetFactory::restoreSettings(int position, QWidget *widget) +void NavigationWidgetFactory::restoreSettings(QSettings *settings, int position, QWidget *widget) { NavigationWidget *pw = qobject_cast<NavigationWidget *>(widget); QTC_ASSERT(pw, return); // .beginGroup is not used - to prevent simultaneous access - QString group = settingsPrefix(position); - - // Load settings - pw->setFlatMode(Core::ICore::settings()->value(group, false).toBool()); + QString settingsGroup = settingsPrefix(position); + pw->setFlatMode(settings->value(settingsGroup, false).toBool()); } } // namespace Internal diff --git a/src/plugins/classview/classviewnavigationwidgetfactory.h b/src/plugins/classview/classviewnavigationwidgetfactory.h index 8675760c74..31f664476d 100644 --- a/src/plugins/classview/classviewnavigationwidgetfactory.h +++ b/src/plugins/classview/classviewnavigationwidgetfactory.h @@ -38,13 +38,13 @@ public: NavigationWidgetFactory(); //! \implements Core::INavigationWidgetFactory::createWidget - Core::NavigationView createWidget(); + Core::NavigationView createWidget() override; //! \implements Core::INavigationWidgetFactory::saveSettings - void saveSettings(int position, QWidget *widget); + void saveSettings(QSettings *settings, int position, QWidget *widget) override; //! \implements Core::INavigationWidgetFactory::restoreSettings - void restoreSettings(int position, QWidget *widget); + void restoreSettings(QSettings *settings, int position, QWidget *widget) override; }; } // namespace Internal diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index 49d486e3db..78c7ae6011 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -89,13 +89,17 @@ const char PRINT[] = "QtCreator.Print"; const char EXIT[] = "QtCreator.Exit"; const char OPTIONS[] = "QtCreator.Options"; -const char TOGGLE_SIDEBAR[] = "QtCreator.ToggleSidebar"; +const char TOGGLE_LEFT_SIDEBAR[] = "QtCreator.ToggleLeftSidebar"; +const char TOGGLE_RIGHT_SIDEBAR[] = "QtCreator.ToggleRightSidebar"; const char TOGGLE_MODE_SELECTOR[] = "QtCreator.ToggleModeSelector"; const char TOGGLE_FULLSCREEN[] = "QtCreator.ToggleFullScreen"; const char THEMEOPTIONS[] = "QtCreator.ThemeOptions"; -const char TR_SHOW_SIDEBAR[] = QT_TRANSLATE_NOOP("Core", "Show Sidebar"); -const char TR_HIDE_SIDEBAR[] = QT_TRANSLATE_NOOP("Core", "Hide Sidebar"); +const char TR_SHOW_LEFT_SIDEBAR[] = QT_TRANSLATE_NOOP("Core", "Show Left Sidebar"); +const char TR_HIDE_LEFT_SIDEBAR[] = QT_TRANSLATE_NOOP("Core", "Hide Left Sidebar"); + +const char TR_SHOW_RIGHT_SIDEBAR[] = QT_TRANSLATE_NOOP("Core", "Show Right Sidebar"); +const char TR_HIDE_RIGHT_SIDEBAR[] = QT_TRANSLATE_NOOP("Core", "Hide Right Sidebar"); const char MINIMIZE_WINDOW[] = "QtCreator.MinimizeWindow"; const char ZOOM_WINDOW[] = "QtCreator.ZoomWindow"; diff --git a/src/plugins/coreplugin/editmode.cpp b/src/plugins/coreplugin/editmode.cpp index f7b42d221f..eb4522d65a 100644 --- a/src/plugins/coreplugin/editmode.cpp +++ b/src/plugins/coreplugin/editmode.cpp @@ -76,10 +76,12 @@ EditMode::EditMode() : splitter->setStretchFactor(0, 3); splitter->setStretchFactor(1, 0); - m_splitter->insertWidget(0, new NavigationWidgetPlaceHolder(Constants::MODE_EDIT)); + m_splitter->insertWidget(0, new NavigationWidgetPlaceHolder(Constants::MODE_EDIT, Side::Left)); m_splitter->insertWidget(1, splitter); + m_splitter->insertWidget(2, new NavigationWidgetPlaceHolder(Constants::MODE_EDIT, Side::Right)); m_splitter->setStretchFactor(0, 0); m_splitter->setStretchFactor(1, 1); + m_splitter->setStretchFactor(2, 0); connect(ModeManager::instance(), &ModeManager::currentModeChanged, this, &EditMode::grabEditorManager); diff --git a/src/plugins/coreplugin/inavigationwidgetfactory.cpp b/src/plugins/coreplugin/inavigationwidgetfactory.cpp index 1bdf4acc43..06dfdb43bc 100644 --- a/src/plugins/coreplugin/inavigationwidgetfactory.cpp +++ b/src/plugins/coreplugin/inavigationwidgetfactory.cpp @@ -147,7 +147,7 @@ QKeySequence INavigationWidgetFactory::activationSequence() const \sa INavigationWidgetFactory::restoreSettings() */ -void INavigationWidgetFactory::saveSettings(int /* position */, QWidget * /* widget */) +void INavigationWidgetFactory::saveSettings(QSettings * /* settings */, int /* position */, QWidget * /* widget */) { } @@ -157,6 +157,6 @@ void INavigationWidgetFactory::saveSettings(int /* position */, QWidget * /* wid \sa INavigationWidgetFactory::saveSettings() */ -void INavigationWidgetFactory::restoreSettings(int /* position */, QWidget * /* widget */) +void INavigationWidgetFactory::restoreSettings(QSettings * /* settings */, int /* position */, QWidget * /* widget */) { } diff --git a/src/plugins/coreplugin/inavigationwidgetfactory.h b/src/plugins/coreplugin/inavigationwidgetfactory.h index 940e0543b2..2205212232 100644 --- a/src/plugins/coreplugin/inavigationwidgetfactory.h +++ b/src/plugins/coreplugin/inavigationwidgetfactory.h @@ -32,6 +32,7 @@ #include <QKeySequence> QT_BEGIN_NAMESPACE +class QSettings; class QToolButton; class QWidget; QT_END_NAMESPACE @@ -69,8 +70,8 @@ public: // Similar to how IView virtual NavigationView createWidget() = 0; - virtual void saveSettings(int position, QWidget *widget); - virtual void restoreSettings(int position, QWidget *widget); + virtual void saveSettings(QSettings *settings, int position, QWidget *widget); + virtual void restoreSettings(QSettings *settings, int position, QWidget *widget); private: QString m_displayName; diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index d904037334..71e1f9a5a9 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -122,7 +122,8 @@ MainWindow::MainWindow() : m_toolSettings(new ToolSettings), m_mimeTypeSettings(new MimeTypeSettings), m_systemEditor(new SystemEditor), - m_toggleSideBarButton(new QToolButton) + m_toggleLeftSideBarButton(new QToolButton), + m_toggleRightSideBarButton(new QToolButton) { (void) new DocumentManager(this); OutputPaneManager::create(); @@ -171,7 +172,8 @@ MainWindow::MainWindow() : registerDefaultContainers(); registerDefaultActions(); - m_navigationWidget = new NavigationWidget(m_toggleSideBarAction); + m_leftNavigationWidget = new NavigationWidget(m_toggleLeftSideBarAction, Side::Left); + m_rightNavigationWidget = new NavigationWidget(m_toggleRightSideBarAction, Side::Right); m_rightPaneWidget = new RightPaneWidget(); m_statusBarManager = new StatusBarManager(this); @@ -184,8 +186,11 @@ MainWindow::MainWindow() : m_progressManager->progressView()->setReferenceWidget(m_modeStack->statusBar()); connect(qApp, &QApplication::focusChanged, this, &MainWindow::updateFocusWidget); - // Add a small Toolbutton for toggling the navigation widget - statusBar()->insertPermanentWidget(0, m_toggleSideBarButton); + + // Add small Toolbuttons for toggling the navigation widgets + statusBar()->insertPermanentWidget(0, m_toggleLeftSideBarButton); + int childsCount = statusBar()->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly).count(); + statusBar()->insertPermanentWidget(childsCount - 1, m_toggleRightSideBarButton); // before QSizeGrip // setUnifiedTitleAndToolBarOnMac(true); //if (HostOsInfo::isAnyUnixHost()) @@ -200,22 +205,22 @@ MainWindow::MainWindow() : this, &MainWindow::openDroppedFiles); } -void MainWindow::setSidebarVisible(bool visible) +NavigationWidget *MainWindow::navigationWidget(Side side) const { - if (NavigationWidgetPlaceHolder::current()) { - if (m_navigationWidget->isSuppressed() && visible) { - m_navigationWidget->setShown(true); - m_navigationWidget->setSuppressed(false); - } else { - m_navigationWidget->setShown(visible); - } - } + return side == Side::Left ? m_leftNavigationWidget : m_rightNavigationWidget; } -void MainWindow::setSuppressNavigationWidget(bool suppress) +void MainWindow::setSidebarVisible(bool visible, Side side) { - if (NavigationWidgetPlaceHolder::current()) - m_navigationWidget->setSuppressed(suppress); + if (NavigationWidgetPlaceHolder::current(side)) { + NavigationWidget *navWidget = navigationWidget(side); + if (navWidget->isSuppressed() && visible) { + navWidget->setShown(true); + navWidget->setSuppressed(false); + } else { + navWidget->setShown(visible); + } + } } void MainWindow::setOverrideColor(const QColor &color) @@ -281,8 +286,10 @@ MainWindow::~MainWindow() PluginManager::removeObject(m_outputView); delete m_outputView; - delete m_navigationWidget; - m_navigationWidget = nullptr; + delete m_leftNavigationWidget; + delete m_rightNavigationWidget; + m_leftNavigationWidget = nullptr; + m_rightNavigationWidget = nullptr; delete m_editorManager; m_editorManager = nullptr; @@ -341,7 +348,8 @@ void MainWindow::extensionsInitialized() m_statusBarManager->extensionsInitalized(); OutputPaneManager::instance()->init(); m_vcsManager->extensionsInitialized(); - m_navigationWidget->setFactories(PluginManager::getObjects<INavigationWidgetFactory>()); + m_leftNavigationWidget->setFactories(PluginManager::getObjects<INavigationWidgetFactory>()); + m_rightNavigationWidget->setFactories(PluginManager::getObjects<INavigationWidgetFactory>()); readSettings(); updateContext(); @@ -373,7 +381,8 @@ void MainWindow::closeEvent(QCloseEvent *event) saveWindowSettings(); - m_navigationWidget->closeSubWidgets(); + m_leftNavigationWidget->closeSubWidgets(); + m_rightNavigationWidget->closeSubWidgets(); event->accept(); } @@ -678,21 +687,37 @@ void MainWindow::registerDefaultActions() mwindow->addSeparator(Constants::G_WINDOW_SIZE); } - // Show Sidebar Action - m_toggleSideBarAction = new QAction(Utils::Icons::TOGGLE_SIDEBAR.icon(), - QCoreApplication::translate("Core", Constants::TR_SHOW_SIDEBAR), - this); - m_toggleSideBarAction->setCheckable(true); - cmd = ActionManager::registerAction(m_toggleSideBarAction, Constants::TOGGLE_SIDEBAR); + // Show Left Sidebar Action + m_toggleLeftSideBarAction = new QAction(Utils::Icons::TOGGLE_LEFT_SIDEBAR.icon(), + QCoreApplication::translate("Core", Constants::TR_SHOW_LEFT_SIDEBAR), + this); + m_toggleLeftSideBarAction->setCheckable(true); + cmd = ActionManager::registerAction(m_toggleLeftSideBarAction, Constants::TOGGLE_LEFT_SIDEBAR); cmd->setAttribute(Command::CA_UpdateText); cmd->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Ctrl+0") : tr("Alt+0"))); - connect(m_toggleSideBarAction, &QAction::triggered, this, &MainWindow::setSidebarVisible); - ProxyAction *toggleSideBarProxyAction = - ProxyAction::proxyActionWithIcon(cmd->action(), - Utils::Icons::TOGGLE_SIDEBAR_TOOLBAR.icon()); - m_toggleSideBarButton->setDefaultAction(toggleSideBarProxyAction); + connect(m_toggleLeftSideBarAction, &QAction::triggered, + this, [this](bool visible) { setSidebarVisible(visible, Side::Left); }); + ProxyAction *toggleLeftSideBarProxyAction = + ProxyAction::proxyActionWithIcon(cmd->action(), Utils::Icons::TOGGLE_LEFT_SIDEBAR_TOOLBAR.icon()); + m_toggleLeftSideBarButton->setDefaultAction(toggleLeftSideBarProxyAction); + mwindow->addAction(cmd, Constants::G_WINDOW_VIEWS); + m_toggleLeftSideBarAction->setEnabled(false); + + // Show Right Sidebar Action + m_toggleRightSideBarAction = new QAction(Utils::Icons::TOGGLE_RIGHT_SIDEBAR.icon(), + QCoreApplication::translate("Core", Constants::TR_SHOW_RIGHT_SIDEBAR), + this); + m_toggleRightSideBarAction->setCheckable(true); + cmd = ActionManager::registerAction(m_toggleRightSideBarAction, Constants::TOGGLE_RIGHT_SIDEBAR); + cmd->setAttribute(Command::CA_UpdateText); + cmd->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Ctrl+Meta+0") : tr("Ctrl+Shift+0"))); + connect(m_toggleRightSideBarAction, &QAction::triggered, + this, [this](bool visible) { setSidebarVisible(visible, Side::Right); }); + ProxyAction *toggleRightSideBarProxyAction = + ProxyAction::proxyActionWithIcon(cmd->action(), Utils::Icons::TOGGLE_RIGHT_SIDEBAR_TOOLBAR.icon()); + m_toggleRightSideBarButton->setDefaultAction(toggleRightSideBarProxyAction); mwindow->addAction(cmd, Constants::G_WINDOW_VIEWS); - m_toggleSideBarAction->setEnabled(false); + m_toggleRightSideBarButton->setEnabled(false); // Show Mode Selector Action m_toggleModeSelectorAction = new QAction(tr("Show Mode Selector"), this); @@ -959,7 +984,8 @@ void MainWindow::readSettings() settings->endGroup(); EditorManagerPrivate::readSettings(); - m_navigationWidget->restoreSettings(settings); + m_leftNavigationWidget->restoreSettings(settings); + m_rightNavigationWidget->restoreSettings(settings); m_rightPaneWidget->readSettings(settings); } @@ -976,7 +1002,8 @@ void MainWindow::saveSettings() DocumentManager::saveSettings(); ActionManager::saveSettings(); EditorManagerPrivate::saveSettings(); - m_navigationWidget->saveSettings(settings); + m_leftNavigationWidget->saveSettings(settings); + m_rightNavigationWidget->saveSettings(settings); } void MainWindow::saveWindowSettings() diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h index 190d2d3fbd..7a7042fd36 100644 --- a/src/plugins/coreplugin/mainwindow.h +++ b/src/plugins/coreplugin/mainwindow.h @@ -56,6 +56,7 @@ class MessageManager; class ModeManager; class ProgressManager; class NavigationWidget; +enum class Side; class RightPaneWidget; class SettingsDatabase; class VcsManager; @@ -102,8 +103,6 @@ public: void updateAdditionalContexts(const Context &remove, const Context &add, ICore::ContextPriority priority); - void setSuppressNavigationWidget(bool suppress); - void setOverrideColor(const QColor &color); QStringList additionalAboutInformation() const; @@ -135,7 +134,8 @@ private: void aboutQtCreator(); void aboutPlugins(); void updateFocusWidget(QWidget *old, QWidget *now); - void setSidebarVisible(bool visible); + NavigationWidget *navigationWidget(Side side) const; + void setSidebarVisible(bool visible, Side side); void destroyVersionDialog(); void openDroppedFiles(const QList<Utils::DropSupport::FileSpec> &files); void restoreWindowState(); @@ -166,7 +166,8 @@ private: ModeManager *m_modeManager = nullptr; HelpManager *m_helpManager = nullptr; FancyTabWidget *m_modeStack = nullptr; - NavigationWidget *m_navigationWidget = nullptr; + NavigationWidget *m_leftNavigationWidget = nullptr; + NavigationWidget *m_rightNavigationWidget = nullptr; RightPaneWidget *m_rightPaneWidget = nullptr; StatusBarWidget *m_outputView = nullptr; VersionDialog *m_versionDialog = nullptr; @@ -190,11 +191,13 @@ private: QAction *m_saveAllAction = nullptr; QAction *m_exitAction = nullptr; QAction *m_optionsAction = nullptr; - QAction *m_toggleSideBarAction = nullptr; + QAction *m_toggleLeftSideBarAction = nullptr; + QAction *m_toggleRightSideBarAction = nullptr; QAction *m_toggleModeSelectorAction = nullptr; QAction *m_themeAction = nullptr; - QToolButton *m_toggleSideBarButton = nullptr; + QToolButton *m_toggleLeftSideBarButton = nullptr; + QToolButton *m_toggleRightSideBarButton = nullptr; QColor m_overrideColor; QList<std::function<bool()>> m_preCloseListeners; }; diff --git a/src/plugins/coreplugin/navigationsubwidget.cpp b/src/plugins/coreplugin/navigationsubwidget.cpp index 25dc44e60c..0ed1a4ca22 100644 --- a/src/plugins/coreplugin/navigationsubwidget.cpp +++ b/src/plugins/coreplugin/navigationsubwidget.cpp @@ -30,6 +30,7 @@ #include "actionmanager/command.h" #include "id.h" +#include <coreplugin/icore.h> #include <utils/styledbar.h> #include <utils/utilsicons.h> @@ -137,6 +138,7 @@ void NavigationSubWidget::comboBoxIndexChanged(int factoryIndex) } restoreSettings(); + emit factoryIndexChanged(factoryIndex); } void NavigationSubWidget::populateSplitMenu() @@ -167,14 +169,22 @@ void NavigationSubWidget::saveSettings() { if (!m_navigationWidget || !factory()) return; - factory()->saveSettings(position(), m_navigationWidget); + + QSettings *settings = Core::ICore::settings(); + settings->beginGroup(m_parentWidget->settingsGroup()); + factory()->saveSettings(settings, position(), m_navigationWidget); + settings->endGroup(); } void NavigationSubWidget::restoreSettings() { if (!m_navigationWidget || !factory()) return; - factory()->restoreSettings(position(), m_navigationWidget); + + QSettings *settings = Core::ICore::settings(); + settings->beginGroup(m_parentWidget->settingsGroup()); + factory()->restoreSettings(settings, position(), m_navigationWidget); + settings->endGroup(); } Core::Command *NavigationSubWidget::command(const QString &title) const diff --git a/src/plugins/coreplugin/navigationsubwidget.h b/src/plugins/coreplugin/navigationsubwidget.h index 545b0113d3..a1906a8a21 100644 --- a/src/plugins/coreplugin/navigationsubwidget.h +++ b/src/plugins/coreplugin/navigationsubwidget.h @@ -47,7 +47,7 @@ class NavigationSubWidget : public QWidget { Q_OBJECT public: - NavigationSubWidget(NavigationWidget *parentWidget, int position, int index); + NavigationSubWidget(NavigationWidget *parentWidget, int position, int factoryIndex); virtual ~NavigationSubWidget(); INavigationWidgetFactory *factory(); @@ -71,6 +71,7 @@ public: signals: void splitMe(int factoryIndex); void closeMe(); + void factoryIndexChanged(int factoryIndex); private: void comboBoxIndexChanged(int); diff --git a/src/plugins/coreplugin/navigationwidget.cpp b/src/plugins/coreplugin/navigationwidget.cpp index 287e519872..32ef0988df 100644 --- a/src/plugins/coreplugin/navigationwidget.cpp +++ b/src/plugins/coreplugin/navigationwidget.cpp @@ -34,6 +34,7 @@ #include "id.h" #include "imode.h" +#include <utils/qtcassert.h> #include <utils/utilsicons.h> #include <QCoreApplication> @@ -49,15 +50,24 @@ Q_DECLARE_METATYPE(Core::INavigationWidgetFactory *) namespace Core { -NavigationWidgetPlaceHolder *NavigationWidgetPlaceHolder::m_current = 0; +NavigationWidgetPlaceHolder *NavigationWidgetPlaceHolder::s_currentLeft = nullptr; +NavigationWidgetPlaceHolder *NavigationWidgetPlaceHolder::s_currentRight = nullptr; -NavigationWidgetPlaceHolder* NavigationWidgetPlaceHolder::current() +NavigationWidgetPlaceHolder *NavigationWidgetPlaceHolder::current(Side side) { - return m_current; + return side == Side::Left ? s_currentLeft : s_currentRight; } -NavigationWidgetPlaceHolder::NavigationWidgetPlaceHolder(Id mode, QWidget *parent) - :QWidget(parent), m_mode(mode) +void NavigationWidgetPlaceHolder::setCurrent(Side side, NavigationWidgetPlaceHolder *navWidget) +{ + if (side == Side::Left) + s_currentLeft = navWidget; + else + s_currentRight = navWidget; +} + +NavigationWidgetPlaceHolder::NavigationWidgetPlaceHolder(Id mode, Side side, QWidget *parent) + :QWidget(parent), m_mode(mode), m_side(side) { setLayout(new QVBoxLayout); layout()->setMargin(0); @@ -67,9 +77,9 @@ NavigationWidgetPlaceHolder::NavigationWidgetPlaceHolder(Id mode, QWidget *paren NavigationWidgetPlaceHolder::~NavigationWidgetPlaceHolder() { - if (m_current == this) { - if (NavigationWidget *nw = NavigationWidget::instance()) { - nw->setParent(0); + if (NavigationWidgetPlaceHolder::current(m_side) == this) { + if (NavigationWidget *nw = NavigationWidget::instance(m_side)) { + nw->setParent(nullptr); nw->hide(); } } @@ -84,12 +94,20 @@ void NavigationWidgetPlaceHolder::applyStoredSize(int width) QList<int> sizes = splitter->sizes(); int index = splitter->indexOf(this); int diff = width - sizes.at(index); - int adjust = sizes.count() > 1 ? (diff / (sizes.count() - 1)) : 0; + + int count = sizes.count(); + for (int i = 0; i < sizes.count(); ++i) { + if (qobject_cast<NavigationWidgetPlaceHolder *>(splitter->widget(i))) + --count; + } + + int adjust = count > 1 ? (diff / (count - 1)) : 0; for (int i = 0; i < sizes.count(); ++i) { - if (i != index) + if (!qobject_cast<NavigationWidgetPlaceHolder *>(splitter->widget(i))) sizes[i] += adjust; } - sizes[index]= width; + + sizes[index] = width; splitter->setSizes(sizes); } else { QSize s = size(); @@ -107,16 +125,18 @@ void NavigationWidgetPlaceHolder::applyStoredSize(int width) // And that the parent of the NavigationWidget gets the correct parent void NavigationWidgetPlaceHolder::currentModeAboutToChange(Id mode) { - NavigationWidget *navigationWidget = NavigationWidget::instance(); + NavigationWidget *navigationWidget = NavigationWidget::instance(m_side); + NavigationWidgetPlaceHolder *current = NavigationWidgetPlaceHolder::current(m_side); - if (m_current == this) { - m_current = 0; - navigationWidget->setParent(0); + if (current == this) { + setCurrent(m_side, nullptr); + navigationWidget->setParent(nullptr); navigationWidget->hide(); - navigationWidget->placeHolderChanged(m_current); + navigationWidget->placeHolderChanged(nullptr); } + if (m_mode == mode) { - m_current = this; + setCurrent(m_side, this); int width = navigationWidget->storedWidth(); @@ -125,13 +145,19 @@ void NavigationWidgetPlaceHolder::currentModeAboutToChange(Id mode) applyStoredSize(width); setVisible(navigationWidget->isShown()); - navigationWidget->placeHolderChanged(m_current); + navigationWidget->placeHolderChanged(this); } } +struct ActivationInfo { + Side side; + int position; +}; +using ActivationsMap = QHash<Id, ActivationInfo>; + struct NavigationWidgetPrivate { - explicit NavigationWidgetPrivate(QAction *toggleSideBarAction); + explicit NavigationWidgetPrivate(QAction *toggleSideBarAction, Side side); ~NavigationWidgetPrivate() { delete m_factoryModel; } QList<Internal::NavigationSubWidget *> m_subWidgets; @@ -142,55 +168,97 @@ struct NavigationWidgetPrivate bool m_shown; bool m_suppressed; int m_width; - static NavigationWidget* m_instance; QAction *m_toggleSideBarAction; // does not take ownership + Side m_side; + + static NavigationWidget *s_instanceLeft; + static NavigationWidget *s_instanceRight; + + static ActivationsMap s_activationsMap; + + static void updateActivationsMap(Id activatedId, const ActivationInfo &activationInfo); + static void removeFromActivationsMap(const ActivationInfo &activationInfo); }; -NavigationWidgetPrivate::NavigationWidgetPrivate(QAction *toggleSideBarAction) : +NavigationWidgetPrivate::NavigationWidgetPrivate(QAction *toggleSideBarAction, Side side) : m_factoryModel(new QStandardItemModel), m_shown(true), m_suppressed(false), m_width(0), - m_toggleSideBarAction(toggleSideBarAction) + m_toggleSideBarAction(toggleSideBarAction), + m_side(side) +{ +} + +void NavigationWidgetPrivate::updateActivationsMap(Id activatedId, const ActivationInfo &activationInfo) { + s_activationsMap.insert(activatedId, activationInfo); } -NavigationWidget *NavigationWidgetPrivate::m_instance = 0; +NavigationWidget *NavigationWidgetPrivate::s_instanceLeft = nullptr; +NavigationWidget *NavigationWidgetPrivate::s_instanceRight = nullptr; +ActivationsMap NavigationWidgetPrivate::s_activationsMap; -NavigationWidget::NavigationWidget(QAction *toggleSideBarAction) : - d(new NavigationWidgetPrivate(toggleSideBarAction)) +NavigationWidget::NavigationWidget(QAction *toggleSideBarAction, Side side) : + d(new NavigationWidgetPrivate(toggleSideBarAction, side)) { d->m_factoryModel->setSortRole(FactoryPriorityRole); setOrientation(Qt::Vertical); - d->m_instance = this; + + if (side == Side::Left) + d->s_instanceLeft = this; + else + d->s_instanceRight = this; } NavigationWidget::~NavigationWidget() { - NavigationWidgetPrivate::m_instance = 0; + if (d->m_side == Side::Left) + NavigationWidgetPrivate::s_instanceLeft = nullptr; + else + NavigationWidgetPrivate::s_instanceRight = nullptr; + delete d; } -NavigationWidget *NavigationWidget::instance() +NavigationWidget *NavigationWidget::instance(Side side) +{ + return side == Side::Left ? NavigationWidgetPrivate::s_instanceLeft + : NavigationWidgetPrivate::s_instanceRight; +} + +QWidget *NavigationWidget::activateSubWidget(Id factoryId, Side fallbackSide) { - return NavigationWidgetPrivate::m_instance; + NavigationWidget *navigationWidget = NavigationWidget::instance(fallbackSide); + int preferredPosition = -1; + + if (NavigationWidgetPrivate::s_activationsMap.contains(factoryId)) { + const ActivationInfo info = NavigationWidgetPrivate::s_activationsMap.value(factoryId); + navigationWidget = NavigationWidget::instance(info.side); + preferredPosition = info.position; + } + + navigationWidget->activateSubWidget(factoryId, preferredPosition); + return navigationWidget; } void NavigationWidget::setFactories(const QList<INavigationWidgetFactory *> &factories) { Context navicontext(Constants::C_NAVIGATION_PANE); - foreach (INavigationWidgetFactory *factory, factories) { const Id id = factory->id(); - QAction *action = new QAction(tr("Activate %1 View").arg(factory->displayName()), this); - d->m_actionMap.insert(action, id); - connect(action, &QAction::triggered, - this, [this, action]() { activateSubWidget(d->m_actionMap[action]); }); - - Command *cmd = ActionManager::registerAction(action, - id.withPrefix("QtCreator.Sidebar."), navicontext); - cmd->setDefaultKeySequence(factory->activationSequence()); - d->m_commandMap.insert(id, cmd); + const Id actionId = id.withPrefix("QtCreator.Sidebar."); + + if (!ActionManager::command(actionId)) { + QAction *action = new QAction(tr("Activate %1 View").arg(factory->displayName()), this); + d->m_actionMap.insert(action, id); + connect(action, &QAction::triggered, this, [this, action]() { + NavigationWidget::activateSubWidget(d->m_actionMap[action], Side::Left); + }); + Command *cmd = ActionManager::registerAction(action, actionId, navicontext); + cmd->setDefaultKeySequence(factory->activationSequence()); + d->m_commandMap.insert(id, cmd); + } QStandardItem *newRow = new QStandardItem(factory->displayName()); newRow->setData(qVariantFromValue(factory), FactoryObjectRole); @@ -202,6 +270,13 @@ void NavigationWidget::setFactories(const QList<INavigationWidgetFactory *> &fac updateToggleText(); } +QString NavigationWidget::settingsGroup() const +{ + const QString side(d->m_side == Side::Left ? QStringLiteral("Left") + : QStringLiteral("Right")); + return QStringLiteral("Navigation%1").arg(side); +} + int NavigationWidget::storedWidth() { return d->m_width; @@ -216,12 +291,13 @@ void NavigationWidget::updateToggleText() { bool haveData = d->m_factoryModel->rowCount(); d->m_toggleSideBarAction->setVisible(haveData); - d->m_toggleSideBarAction->setEnabled(haveData && NavigationWidgetPlaceHolder::m_current); + d->m_toggleSideBarAction->setEnabled(haveData && NavigationWidgetPlaceHolder::current(d->m_side)); - if (isShown()) - d->m_toggleSideBarAction->setToolTip(QCoreApplication::translate("Core", Constants::TR_HIDE_SIDEBAR)); - else - d->m_toggleSideBarAction->setToolTip(QCoreApplication::translate("Core", Constants::TR_SHOW_SIDEBAR)); + const char *trToolTip = d->m_side == Side::Left + ? (isShown() ? Constants::TR_HIDE_LEFT_SIDEBAR : Constants::TR_SHOW_LEFT_SIDEBAR) + : (isShown() ? Constants::TR_HIDE_RIGHT_SIDEBAR : Constants::TR_SHOW_RIGHT_SIDEBAR); + + d->m_toggleSideBarAction->setToolTip(QCoreApplication::translate("Core", trToolTip)); } void NavigationWidget::placeHolderChanged(NavigationWidgetPlaceHolder *holder) @@ -237,28 +313,33 @@ void NavigationWidget::resizeEvent(QResizeEvent *re) MiniSplitter::resizeEvent(re); } -Internal::NavigationSubWidget *NavigationWidget::insertSubItem(int position,int index) +Internal::NavigationSubWidget *NavigationWidget::insertSubItem(int position, int factoryIndex) { for (int pos = position + 1; pos < d->m_subWidgets.size(); ++pos) { - d->m_subWidgets.at(pos)->setPosition(pos + 1); + Internal::NavigationSubWidget *nsw = d->m_subWidgets.at(pos); + nsw->setPosition(pos + 1); + NavigationWidgetPrivate::updateActivationsMap(nsw->factory()->id(), {d->m_side, pos + 1}); } if (!d->m_subWidgets.isEmpty()) // Make all icons the bottom icon d->m_subWidgets.at(0)->setCloseIcon(Utils::Icons::CLOSE_SPLIT_BOTTOM.icon()); - Internal::NavigationSubWidget *nsw = new Internal::NavigationSubWidget(this, position, index); - connect(nsw, &Internal::NavigationSubWidget::splitMe, - this, &NavigationWidget::splitSubWidget); + Internal::NavigationSubWidget *nsw = new Internal::NavigationSubWidget(this, position, factoryIndex); + connect(nsw, &Internal::NavigationSubWidget::splitMe, this, &NavigationWidget::splitSubWidget); connect(nsw, &Internal::NavigationSubWidget::closeMe, this, &NavigationWidget::closeSubWidget); + connect(nsw, &Internal::NavigationSubWidget::factoryIndexChanged, + this, &NavigationWidget::onSubWidgetFactoryIndexChanged); insertWidget(position, nsw); + d->m_subWidgets.insert(position, nsw); d->m_subWidgets.at(0)->setCloseIcon(d->m_subWidgets.size() == 1 ? Utils::Icons::CLOSE_SPLIT_LEFT.icon() : Utils::Icons::CLOSE_SPLIT_TOP.icon()); + NavigationWidgetPrivate::updateActivationsMap(nsw->factory()->id(), {d->m_side, position}); return nsw; } -QWidget *NavigationWidget::activateSubWidget(Id factoryId) +QWidget *NavigationWidget::activateSubWidget(Id factoryId, int preferredPosition) { setShown(true); foreach (Internal::NavigationSubWidget *subWidget, d->m_subWidgets) { @@ -271,10 +352,13 @@ QWidget *NavigationWidget::activateSubWidget(Id factoryId) int index = factoryIndex(factoryId); if (index >= 0) { - d->m_subWidgets.first()->setFactoryIndex(index); - d->m_subWidgets.first()->setFocusWidget(); + bool preferredIndexValid = 0 <= preferredPosition && preferredPosition < d->m_subWidgets.count(); + const int activationIndex = preferredIndexValid ? preferredPosition : 0; + Internal::NavigationSubWidget *subWidget = d->m_subWidgets.at(activationIndex); + subWidget->setFactoryIndex(index); + subWidget->setFocusWidget(); ICore::raiseWindow(this); - return d->m_subWidgets.first()->widget(); + return subWidget->widget(); } return nullptr; } @@ -291,6 +375,14 @@ void NavigationWidget::closeSubWidget() if (d->m_subWidgets.count() != 1) { Internal::NavigationSubWidget *subWidget = qobject_cast<Internal::NavigationSubWidget *>(sender()); subWidget->saveSettings(); + + int position = d->m_subWidgets.indexOf(subWidget); + for (int pos = position + 1; pos < d->m_subWidgets.size(); ++pos) { + Internal::NavigationSubWidget *nsw = d->m_subWidgets.at(pos); + nsw->setPosition(pos - 1); + NavigationWidgetPrivate::updateActivationsMap(nsw->factory()->id(), {d->m_side, pos - 1}); + } + d->m_subWidgets.removeOne(subWidget); subWidget->hide(); subWidget->deleteLater(); @@ -311,10 +403,18 @@ void NavigationWidget::saveSettings(QSettings *settings) d->m_subWidgets.at(i)->saveSettings(); viewIds.append(d->m_subWidgets.at(i)->factory()->id().toString()); } - settings->setValue(QLatin1String("Navigation/Views"), viewIds); - settings->setValue(QLatin1String("Navigation/Visible"), isShown()); - settings->setValue(QLatin1String("Navigation/VerticalPosition"), saveState()); - settings->setValue(QLatin1String("Navigation/Width"), d->m_width); + settings->setValue(settingsKey("Views"), viewIds); + settings->setValue(settingsKey("Visible"), isShown()); + settings->setValue(settingsKey("VerticalPosition"), saveState()); + settings->setValue(settingsKey("Width"), d->m_width); + + const QString activationKey = QStringLiteral("ActivationPosition."); + const auto keys = NavigationWidgetPrivate::s_activationsMap.keys(); + for (const auto &factoryId : keys) { + const auto &info = NavigationWidgetPrivate::s_activationsMap[factoryId]; + if (info.side == d->m_side) + settings->setValue(settingsKey(activationKey + factoryId.toString()), info.position); + } } void NavigationWidget::restoreSettings(QSettings *settings) @@ -325,17 +425,19 @@ void NavigationWidget::restoreSettings(QSettings *settings) return; } - int version = settings->value(QLatin1String("Navigation/Version"), 1).toInt(); - QStringList viewIds = settings->value(QLatin1String("Navigation/Views"), - QStringList(QLatin1String("Projects"))).toStringList(); + const bool isLeftSide = d->m_side == Side::Left; + QLatin1String defaultFirstView = isLeftSide ? QLatin1String("Projects") : QLatin1String("Outline"); + QStringList viewIds = settings->value(settingsKey("Views"), QStringList(defaultFirstView)).toStringList(); bool restoreSplitterState = true; + int version = settings->value(settingsKey("Version"), 1).toInt(); if (version == 1) { - if (!viewIds.contains(QLatin1String("Open Documents"))) { - viewIds += QLatin1String("Open Documents"); + QLatin1String defaultSecondView = isLeftSide ? QLatin1String("Open Documents") : QLatin1String("Bookmarks"); + if (!viewIds.contains(defaultSecondView)) { + viewIds += defaultSecondView; restoreSplitterState = false; } - settings->setValue(QLatin1String("Navigation/Version"), 2); + settings->setValue(settingsKey("Version"), 2); } int position = 0; @@ -351,13 +453,13 @@ void NavigationWidget::restoreSettings(QSettings *settings) } if (d->m_subWidgets.isEmpty()) - // Make sure we have at least the projects widget - insertSubItem(0, qMax(0, factoryIndex("Projects"))); + // Make sure we have at least the projects widget or outline widget + insertSubItem(0, qMax(0, factoryIndex(defaultFirstView.data()))); - setShown(settings->value(QLatin1String("Navigation/Visible"), true).toBool()); + setShown(settings->value(settingsKey("Visible"), isLeftSide).toBool()); - if (restoreSplitterState && settings->contains(QLatin1String("Navigation/VerticalPosition"))) { - restoreState(settings->value(QLatin1String("Navigation/VerticalPosition")).toByteArray()); + if (restoreSplitterState && settings->contains(settingsKey("VerticalPosition"))) { + restoreState(settings->value(settingsKey("VerticalPosition")).toByteArray()); } else { QList<int> sizes; sizes += 256; @@ -366,13 +468,27 @@ void NavigationWidget::restoreSettings(QSettings *settings) setSizes(sizes); } - d->m_width = settings->value(QLatin1String("Navigation/Width"), 240).toInt(); + d->m_width = settings->value(settingsKey("Width"), 240).toInt(); if (d->m_width < 40) d->m_width = 40; // Apply - if (NavigationWidgetPlaceHolder::m_current) - NavigationWidgetPlaceHolder::m_current->applyStoredSize(d->m_width); + if (NavigationWidgetPlaceHolder::current(d->m_side)) + NavigationWidgetPlaceHolder::current(d->m_side)->applyStoredSize(d->m_width); + + // Restore last activation positions + settings->beginGroup(settingsGroup()); + const QString activationKey = QStringLiteral("ActivationPosition."); + const auto keys = settings->allKeys(); + for (const QString &key : keys) { + if (!key.startsWith(activationKey)) + continue; + + int position = settings->value(key).toInt(); + Id factoryId = Id::fromString(key.mid(activationKey.length())); + NavigationWidgetPrivate::updateActivationsMap(factoryId, {d->m_side, position}); + } + settings->endGroup(); } void NavigationWidget::closeSubWidgets() @@ -390,9 +506,11 @@ void NavigationWidget::setShown(bool b) return; bool haveData = d->m_factoryModel->rowCount(); d->m_shown = b; - if (NavigationWidgetPlaceHolder::m_current) { - NavigationWidgetPlaceHolder::m_current->setVisible(d->m_shown && !d->m_suppressed && haveData); - d->m_toggleSideBarAction->setChecked(d->m_shown && !d->m_suppressed && haveData); + NavigationWidgetPlaceHolder *current = NavigationWidgetPlaceHolder::current(d->m_side); + if (current) { + bool visible = d->m_shown && !d->m_suppressed && haveData; + current->setVisible(visible); + d->m_toggleSideBarAction->setChecked(visible); } else { d->m_toggleSideBarAction->setChecked(false); } @@ -414,8 +532,8 @@ void NavigationWidget::setSuppressed(bool b) if (d->m_suppressed == b) return; d->m_suppressed = b; - if (NavigationWidgetPlaceHolder::m_current) - NavigationWidgetPlaceHolder::m_current->setVisible(d->m_shown && !d->m_suppressed); + if (NavigationWidgetPlaceHolder::current(d->m_side)) + NavigationWidgetPlaceHolder::current(d->m_side)->setVisible(d->m_shown && !d->m_suppressed); } int NavigationWidget::factoryIndex(Id id) @@ -427,6 +545,20 @@ int NavigationWidget::factoryIndex(Id id) return -1; } +QString NavigationWidget::settingsKey(const QString &key) const +{ + return QStringLiteral("%1/%2").arg(settingsGroup(), key); +} + +void NavigationWidget::onSubWidgetFactoryIndexChanged(int factoryIndex) +{ + Q_UNUSED(factoryIndex); + Internal::NavigationSubWidget *subWidget = qobject_cast<Internal::NavigationSubWidget *>(sender()); + QTC_ASSERT(subWidget, return); + Id factoryId = subWidget->factory()->id(); + NavigationWidgetPrivate::updateActivationsMap(factoryId, {d->m_side, subWidget->position()}); +} + QHash<Id, Command *> NavigationWidget::commandMap() const { return d->m_commandMap; diff --git a/src/plugins/coreplugin/navigationwidget.h b/src/plugins/coreplugin/navigationwidget.h index 1aff5880bc..08d2e29f91 100644 --- a/src/plugins/coreplugin/navigationwidget.h +++ b/src/plugins/coreplugin/navigationwidget.h @@ -43,22 +43,30 @@ class NavigationWidget; struct NavigationWidgetPrivate; namespace Internal { class NavigationSubWidget; } +enum class Side { + Left, + Right +}; + class CORE_EXPORT NavigationWidgetPlaceHolder : public QWidget { Q_OBJECT friend class Core::NavigationWidget; public: - explicit NavigationWidgetPlaceHolder(Id mode, QWidget *parent = 0); + explicit NavigationWidgetPlaceHolder(Id mode, Side side, QWidget *parent = 0); virtual ~NavigationWidgetPlaceHolder(); - static NavigationWidgetPlaceHolder* current(); + static NavigationWidgetPlaceHolder *current(Side side); + static void setCurrent(Side side, NavigationWidgetPlaceHolder *navWidget); void applyStoredSize(int width); private: void currentModeAboutToChange(Id mode); Id m_mode; - static NavigationWidgetPlaceHolder* m_current; + Side m_side; + static NavigationWidgetPlaceHolder *s_currentLeft; + static NavigationWidgetPlaceHolder *s_currentRight; }; class CORE_EXPORT NavigationWidget : public MiniSplitter @@ -72,15 +80,16 @@ public: FactoryPriorityRole }; - explicit NavigationWidget(QAction *toggleSideBarAction); + explicit NavigationWidget(QAction *toggleSideBarAction, Side side); virtual ~NavigationWidget(); void setFactories(const QList<INavigationWidgetFactory*> &factories); + QString settingsGroup() const; void saveSettings(QSettings *settings); void restoreSettings(QSettings *settings); - QWidget *activateSubWidget(Id factoryId); + QWidget *activateSubWidget(Id factoryId, int preferredPosition); void closeSubWidgets(); bool isShown() const; @@ -89,7 +98,8 @@ public: bool isSuppressed() const; void setSuppressed(bool b); - static NavigationWidget* instance(); + static NavigationWidget *instance(Side side); + static QWidget *activateSubWidget(Id factoryId, Side fallbackSide); int storedWidth(); @@ -106,8 +116,10 @@ private: void splitSubWidget(int factoryIndex); void closeSubWidget(); void updateToggleText(); - Internal::NavigationSubWidget *insertSubItem(int position, int index); + Internal::NavigationSubWidget *insertSubItem(int position, int factoryIndex); int factoryIndex(Id id); + QString settingsKey(const QString &key) const; + void onSubWidgetFactoryIndexChanged(int factoryIndex); NavigationWidgetPrivate *d; }; diff --git a/src/plugins/cppeditor/cppeditorplugin.cpp b/src/plugins/cppeditor/cppeditorplugin.cpp index 39b4fc0f2e..0febf579a6 100644 --- a/src/plugins/cppeditor/cppeditorplugin.cpp +++ b/src/plugins/cppeditor/cppeditorplugin.cpp @@ -366,8 +366,7 @@ QList<QObject *> CppEditorPlugin::createTestObjects() const void CppEditorPlugin::openTypeHierarchy() { if (currentCppEditorWidget()) { - NavigationWidget *navigation = NavigationWidget::instance(); - navigation->activateSubWidget(Constants::TYPE_HIERARCHY_ID); + NavigationWidget::activateSubWidget(Constants::TYPE_HIERARCHY_ID, Side::Left); emit typeHierarchyRequested(); } } @@ -375,8 +374,7 @@ void CppEditorPlugin::openTypeHierarchy() void CppEditorPlugin::openIncludeHierarchy() { if (currentCppEditorWidget()) { - NavigationWidget *navigation = NavigationWidget::instance(); - navigation->activateSubWidget(Id(Constants::INCLUDE_HIERARCHY_ID)); + NavigationWidget::activateSubWidget(Constants::INCLUDE_HIERARCHY_ID, Side::Left); emit includeHierarchyRequested(); } } diff --git a/src/plugins/cppeditor/cpptypehierarchy.h b/src/plugins/cppeditor/cpptypehierarchy.h index c2f9dffa44..9d9f4031dd 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.h +++ b/src/plugins/cppeditor/cpptypehierarchy.h @@ -104,7 +104,7 @@ class CppTypeHierarchyFactory : public Core::INavigationWidgetFactory public: CppTypeHierarchyFactory(); - virtual Core::NavigationView createWidget(); + Core::NavigationView createWidget() override; }; } // namespace Internal diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index 0aa6c7a23f..2909e4ae70 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -258,7 +258,7 @@ QWidget *createModeWindow(const Core::Id &mode, DebuggerMainWindow *mainWindow) // Navigation and right-side window. auto splitter = new MiniSplitter; splitter->setFocusProxy(mainWindow->centralWidgetStack()); - splitter->addWidget(new NavigationWidgetPlaceHolder(mode)); + splitter->addWidget(new NavigationWidgetPlaceHolder(mode, Side::Left)); splitter->addWidget(mainWindowSplitter); splitter->setStretchFactor(0, 0); splitter->setStretchFactor(1, 1); diff --git a/src/plugins/help/helpwidget.cpp b/src/plugins/help/helpwidget.cpp index d1ce0ac3c7..8951536cfe 100644 --- a/src/plugins/help/helpwidget.cpp +++ b/src/plugins/help/helpwidget.cpp @@ -127,19 +127,19 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget setAttribute(Qt::WA_QuitOnClose, false); // don't prevent Qt Creator from closing } if (style != SideBarWidget) { - m_toggleSideBarAction = new QAction(Utils::Icons::TOGGLE_SIDEBAR_TOOLBAR.icon(), - QCoreApplication::translate("Core", Core::Constants::TR_SHOW_SIDEBAR), + m_toggleSideBarAction = new QAction(Utils::Icons::TOGGLE_LEFT_SIDEBAR_TOOLBAR.icon(), + QCoreApplication::translate("Core", Core::Constants::TR_SHOW_LEFT_SIDEBAR), toolBar); m_toggleSideBarAction->setCheckable(true); m_toggleSideBarAction->setChecked(false); cmd = Core::ActionManager::registerAction(m_toggleSideBarAction, - Core::Constants::TOGGLE_SIDEBAR, context); + Core::Constants::TOGGLE_LEFT_SIDEBAR, context); connect(m_toggleSideBarAction, &QAction::toggled, m_toggleSideBarAction, [this](bool checked) { m_toggleSideBarAction->setText( QCoreApplication::translate("Core", - checked ? Core::Constants::TR_HIDE_SIDEBAR - : Core::Constants::TR_SHOW_SIDEBAR)); + checked ? Core::Constants::TR_HIDE_LEFT_SIDEBAR + : Core::Constants::TR_SHOW_LEFT_SIDEBAR)); }); addSideBar(); m_toggleSideBarAction->setChecked(m_sideBar->isVisibleTo(this)); @@ -299,7 +299,7 @@ HelpWidget::~HelpWidget() Core::ActionManager::unregisterAction(m_copy, Core::Constants::COPY); Core::ActionManager::unregisterAction(m_printAction, Core::Constants::PRINT); if (m_toggleSideBarAction) - Core::ActionManager::unregisterAction(m_toggleSideBarAction, Core::Constants::TOGGLE_SIDEBAR); + Core::ActionManager::unregisterAction(m_toggleSideBarAction, Core::Constants::TOGGLE_LEFT_SIDEBAR); if (m_switchToHelp) Core::ActionManager::unregisterAction(m_switchToHelp, Constants::CONTEXT_HELP); Core::ActionManager::unregisterAction(m_homeAction, Constants::HELP_HOME); diff --git a/src/plugins/projectexplorer/foldernavigationwidget.cpp b/src/plugins/projectexplorer/foldernavigationwidget.cpp index 56e226a856..8742c885cf 100644 --- a/src/plugins/projectexplorer/foldernavigationwidget.cpp +++ b/src/plugins/projectexplorer/foldernavigationwidget.cpp @@ -433,21 +433,19 @@ Core::NavigationView FolderNavigationWidgetFactory::createWidget() return n; } -void FolderNavigationWidgetFactory::saveSettings(int position, QWidget *widget) +void FolderNavigationWidgetFactory::saveSettings(QSettings *settings, int position, QWidget *widget) { auto fnw = qobject_cast<FolderNavigationWidget *>(widget); QTC_ASSERT(fnw, return); - QSettings *settings = Core::ICore::settings(); const QString baseKey = QLatin1String("FolderNavigationWidget.") + QString::number(position); settings->setValue(baseKey + QLatin1String(".HiddenFilesFilter"), fnw->hiddenFilesFilter()); settings->setValue(baseKey + QLatin1String(".SyncWithEditor"), fnw->autoSynchronization()); } -void FolderNavigationWidgetFactory::restoreSettings(int position, QWidget *widget) +void FolderNavigationWidgetFactory::restoreSettings(QSettings *settings, int position, QWidget *widget) { auto fnw = qobject_cast<FolderNavigationWidget *>(widget); QTC_ASSERT(fnw, return); - QSettings *settings = Core::ICore::settings(); const QString baseKey = QLatin1String("FolderNavigationWidget.") + QString::number(position); fnw->setHiddenFilesFilter(settings->value(baseKey + QLatin1String(".HiddenFilesFilter"), false).toBool()); fnw->setAutoSynchronization(settings->value(baseKey + QLatin1String(".SyncWithEditor"), true).toBool()); diff --git a/src/plugins/projectexplorer/foldernavigationwidget.h b/src/plugins/projectexplorer/foldernavigationwidget.h index d81967521e..3b4b37fa2f 100644 --- a/src/plugins/projectexplorer/foldernavigationwidget.h +++ b/src/plugins/projectexplorer/foldernavigationwidget.h @@ -94,8 +94,8 @@ public: FolderNavigationWidgetFactory(); Core::NavigationView createWidget() override; - void saveSettings(int position, QWidget *widget) override; - void restoreSettings(int position, QWidget *widget) override; + void saveSettings(QSettings *settings, int position, QWidget *widget) override; + void restoreSettings(QSettings *settings, int position, QWidget *widget) override; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 6631876187..938975d570 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -366,10 +366,9 @@ void ProjectTree::highlightProject(Project *project, const QString &message) { Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); - Core::NavigationWidget *navigation = Core::NavigationWidget::instance(); // Shows and focusses a project tree - QWidget *widget = navigation->activateSubWidget(ProjectExplorer::Constants::PROJECTTREE_ID); + QWidget *widget = Core::NavigationWidget::activateSubWidget(ProjectExplorer::Constants::PROJECTTREE_ID, Core::Side::Left); if (auto *projectTreeWidget = qobject_cast<ProjectTreeWidget *>(widget)) projectTreeWidget->showMessage(project->rootProjectNode(), message); diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index c7a2356c72..67bbf07405 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -468,22 +468,20 @@ NavigationView ProjectTreeWidgetFactory::createWidget() return n; } -void ProjectTreeWidgetFactory::saveSettings(int position, QWidget *widget) +void ProjectTreeWidgetFactory::saveSettings(QSettings *settings, int position, QWidget *widget) { auto ptw = qobject_cast<ProjectTreeWidget *>(widget); Q_ASSERT(ptw); - QSettings *settings = ICore::settings(); const QString baseKey = QLatin1String("ProjectTreeWidget.") + QString::number(position); settings->setValue(baseKey + QLatin1String(".ProjectFilter"), ptw->projectFilter()); settings->setValue(baseKey + QLatin1String(".GeneratedFilter"), ptw->generatedFilesFilter()); settings->setValue(baseKey + QLatin1String(".SyncWithEditor"), ptw->autoSynchronization()); } -void ProjectTreeWidgetFactory::restoreSettings(int position, QWidget *widget) +void ProjectTreeWidgetFactory::restoreSettings(QSettings *settings, int position, QWidget *widget) { auto ptw = qobject_cast<ProjectTreeWidget *>(widget); Q_ASSERT(ptw); - QSettings *settings = ICore::settings(); const QString baseKey = QLatin1String("ProjectTreeWidget.") + QString::number(position); ptw->setProjectFilter(settings->value(baseKey + QLatin1String(".ProjectFilter"), false).toBool()); ptw->setGeneratedFilesFilter(settings->value(baseKey + QLatin1String(".GeneratedFilter"), true).toBool()); diff --git a/src/plugins/projectexplorer/projecttreewidget.h b/src/plugins/projectexplorer/projecttreewidget.h index 837025f257..072cc1f1ab 100644 --- a/src/plugins/projectexplorer/projecttreewidget.h +++ b/src/plugins/projectexplorer/projecttreewidget.h @@ -101,8 +101,8 @@ public: ProjectTreeWidgetFactory(); Core::NavigationView createWidget(); - void restoreSettings(int position, QWidget *widget); - void saveSettings(int position, QWidget *widget); + void restoreSettings(QSettings *settings, int position, QWidget *widget); + void saveSettings(QSettings *settings, int position, QWidget *widget); }; } // namespace Internal diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp index b14d79d337..45ac8ff423 100644 --- a/src/plugins/qmldesigner/shortcutmanager.cpp +++ b/src/plugins/qmldesigner/shortcutmanager.cpp @@ -266,7 +266,7 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex command->setDefaultKeySequence(QKeySequence(Qt::Key_Escape)); m_escapeAction.setEnabled(false); - Core::ActionManager::registerAction(&m_hideSidebarsAction, Core::Constants::TOGGLE_SIDEBAR, qmlDesignerMainContext); + Core::ActionManager::registerAction(&m_hideSidebarsAction, Core::Constants::TOGGLE_LEFT_SIDEBAR, qmlDesignerMainContext); connect(designerActionManager.view(), &DesignerActionManagerView::selectionChanged, this, [this](bool itemsSelected, bool rootItemIsSelected) { m_deleteAction.setEnabled(itemsSelected && !rootItemIsSelected); diff --git a/src/plugins/texteditor/outlinefactory.cpp b/src/plugins/texteditor/outlinefactory.cpp index 1a068c3bfa..31eeabde17 100644 --- a/src/plugins/texteditor/outlinefactory.cpp +++ b/src/plugins/texteditor/outlinefactory.cpp @@ -89,39 +89,38 @@ QToolButton *OutlineWidgetStack::filterButton() return m_filterButton; } -void OutlineWidgetStack::restoreSettings(int position) +void OutlineWidgetStack::saveSettings(QSettings *settings, int position) { - QSettings *settings = Core::ICore::settings(); - settings->beginGroup(QLatin1String("Sidebar.Outline.") + QString::number(position)); + const QString baseKey = QStringLiteral("Outline.%1.").arg(position); + settings->setValue(baseKey + QLatin1String("SyncWithEditor"), toggleSyncButton()->isChecked()); + for (auto iter = m_widgetSettings.constBegin(); iter != m_widgetSettings.constEnd(); ++iter) + settings->setValue(baseKey + iter.key(), iter.value()); +} + +void OutlineWidgetStack::restoreSettings(QSettings *settings, int position) +{ + const QString baseKey = QStringLiteral("Outline.%1.").arg(position); bool syncWithEditor = true; m_widgetSettings.clear(); - foreach (const QString &key, settings->allKeys()) { + foreach (const QString &longKey, settings->allKeys()) { + if (!longKey.startsWith(baseKey)) + continue; + + const QString key = longKey.mid(baseKey.length()); + if (key == QLatin1String("SyncWithEditor")) { - syncWithEditor = settings->value(key).toBool(); + syncWithEditor = settings->value(longKey).toBool(); continue; } - m_widgetSettings.insert(key, settings->value(key)); + m_widgetSettings.insert(key, settings->value(longKey)); } - settings->endGroup(); toggleSyncButton()->setChecked(syncWithEditor); if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget())) outlineWidget->restoreSettings(m_widgetSettings); } -void OutlineWidgetStack::saveSettings(int position) -{ - QSettings *settings = Core::ICore::settings(); - settings->beginGroup(QLatin1String("Sidebar.Outline.") + QString::number(position)); - - settings->setValue(QLatin1String("SyncWithEditor"), toggleSyncButton()->isChecked()); - for (auto iter = m_widgetSettings.constBegin(); iter != m_widgetSettings.constEnd(); ++iter) - settings->setValue(iter.key(), iter.value()); - - settings->endGroup(); -} - bool OutlineWidgetStack::isCursorSynchronized() const { return m_syncWithEditor; @@ -206,18 +205,18 @@ Core::NavigationView OutlineFactory::createWidget() return n; } -void OutlineFactory::saveSettings(int position, QWidget *widget) +void OutlineFactory::saveSettings(QSettings *settings, int position, QWidget *widget) { OutlineWidgetStack *widgetStack = qobject_cast<OutlineWidgetStack *>(widget); Q_ASSERT(widgetStack); - widgetStack->saveSettings(position); + widgetStack->saveSettings(settings, position); } -void OutlineFactory::restoreSettings(int position, QWidget *widget) +void OutlineFactory::restoreSettings(QSettings *settings, int position, QWidget *widget) { OutlineWidgetStack *widgetStack = qobject_cast<OutlineWidgetStack *>(widget); Q_ASSERT(widgetStack); - widgetStack->restoreSettings(position); + widgetStack->restoreSettings(settings, position); } } // namespace Internal diff --git a/src/plugins/texteditor/outlinefactory.h b/src/plugins/texteditor/outlinefactory.h index 05f60a7859..11a1f4d0a9 100644 --- a/src/plugins/texteditor/outlinefactory.h +++ b/src/plugins/texteditor/outlinefactory.h @@ -47,8 +47,8 @@ public: QToolButton *toggleSyncButton(); QToolButton *filterButton(); - void saveSettings(int position); - void restoreSettings(int position); + void saveSettings(QSettings *settings, int position); + void restoreSettings(QSettings *settings, int position); private: bool isCursorSynchronized() const; @@ -77,8 +77,8 @@ public: // from INavigationWidgetFactory virtual Core::NavigationView createWidget(); - virtual void saveSettings(int position, QWidget *widget); - virtual void restoreSettings(int position, QWidget *widget); + virtual void saveSettings(QSettings *settings, int position, QWidget *widget); + virtual void restoreSettings(QSettings *settings, int position, QWidget *widget); private: QList<IOutlineWidgetFactory*> m_factories; }; diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 3ca2edef6a..2041e47917 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -2349,7 +2349,7 @@ transform="translate(0,-100)" /> </g> <g - id="src/libs/utils/images/sidebaricon" + id="src/libs/utils/images/leftsidebaricon" clip-path="none" transform="translate(399,0)"> <rect @@ -4213,6 +4213,14 @@ transform="matrix(1,0,0,-1,16,1152)" width="100%" height="100%" /> + <use + x="0" + y="0" + xlink:href="#src/libs/utils/images/leftsidebaricon" + id="src/libs/utils/images/rightsidebaricon" + width="100%" + height="100%" + transform="matrix(-1,0,0,1,2293,0)" /> </g> <g inkscape:groupmode="layer" |