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>
This commit is contained in:
Serhii Moroz
2016-09-17 18:31:56 +03:00
parent 69f978efca
commit 69da534f99
33 changed files with 407 additions and 211 deletions

View File

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 99 B

View File

Before

Width:  |  Height:  |  Size: 104 B

After

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 B

View File

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

View File

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

View File

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

View File

@@ -162,7 +162,7 @@ public:
BookmarkViewFactory(BookmarkManager *bm);
private:
Core::NavigationView createWidget();
Core::NavigationView createWidget() override;
BookmarkManager *m_manager;
};

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 */)
{
}

View File

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

View File

@@ -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_toggleSideBarAction->setEnabled(false);
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_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()

View File

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

View File

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

View File

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

View File

@@ -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 (i != index)
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 (!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)
{
}
NavigationWidget *NavigationWidgetPrivate::m_instance = 0;
void NavigationWidgetPrivate::updateActivationsMap(Id activatedId, const ActivationInfo &activationInfo)
{
s_activationsMap.insert(activatedId, activationInfo);
}
NavigationWidget::NavigationWidget(QAction *toggleSideBarAction) :
d(new NavigationWidgetPrivate(toggleSideBarAction))
NavigationWidget *NavigationWidgetPrivate::s_instanceLeft = nullptr;
NavigationWidget *NavigationWidgetPrivate::s_instanceRight = nullptr;
ActivationsMap NavigationWidgetPrivate::s_activationsMap;
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 NavigationWidgetPrivate::m_instance;
return side == Side::Left ? NavigationWidgetPrivate::s_instanceLeft
: NavigationWidgetPrivate::s_instanceRight;
}
QWidget *NavigationWidget::activateSubWidget(Id factoryId, Side fallbackSide)
{
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]); });
const Id actionId = id.withPrefix("QtCreator.Sidebar.");
Command *cmd = ActionManager::registerAction(action,
id.withPrefix("QtCreator.Sidebar."), navicontext);
cmd->setDefaultKeySequence(factory->activationSequence());
d->m_commandMap.insert(id, cmd);
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;

View File

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

View File

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

View File

@@ -104,7 +104,7 @@ class CppTypeHierarchyFactory : public Core::INavigationWidgetFactory
public:
CppTypeHierarchyFactory();
virtual Core::NavigationView createWidget();
Core::NavigationView createWidget() override;
};
} // namespace Internal

View File

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

View File

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

View File

@@ -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());

View File

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

View File

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

View File

@@ -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());

View File

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

View File

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

View File

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

View File

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

View File

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

Before

Width:  |  Height:  |  Size: 254 KiB

After

Width:  |  Height:  |  Size: 254 KiB