diff --git a/src/plugins/projectexplorer/panelswidget.cpp b/src/plugins/projectexplorer/panelswidget.cpp index 488390e8226..1fd98512dc9 100644 --- a/src/plugins/projectexplorer/panelswidget.cpp +++ b/src/plugins/projectexplorer/panelswidget.cpp @@ -55,18 +55,18 @@ const int PANEL_LEFT_MARGIN = 70; // PanelsWidget /// -PanelsWidget::PanelsWidget(QWidget *parent) : QWidget(parent) +PanelsWidget::PanelsWidget(QWidget *parent) + : QWidget(parent), m_splitter(new Core::MiniSplitter(this)) { - const auto splitter = new Core::MiniSplitter(this); m_root = new QWidget(nullptr); m_root->setFocusPolicy(Qt::NoFocus); m_root->setContentsMargins(0, 0, 40, 0); - splitter->addWidget(m_root); - splitter->addWidget(new QWidget); - splitter->setStretchFactor(1, 100); // Force root widget to its minimum size initially + m_splitter->addWidget(m_root); + m_splitter->addWidget(new QWidget); + m_splitter->setStretchFactor(1, 100); // Force root widget to its minimum size initially const auto scroller = new QScrollArea(this); - scroller->setWidget(splitter); + scroller->setWidget(m_splitter); scroller->setFrameStyle(QFrame::NoFrame); scroller->setWidgetResizable(true); scroller->setFocusPolicy(Qt::NoFocus); @@ -153,4 +153,14 @@ void PanelsWidget::addPropertiesPanel(const QString &displayName, const QIcon &i m_layout->addWidget(widget, widgetRow, 0, 1, 2); } +QByteArray PanelsWidget::saveSplitterState() const +{ + return m_splitter->saveState().toHex(); +} + +void PanelsWidget::loadSplitterState(const QByteArray &state) +{ + m_splitter->restoreState(QByteArray::fromHex(state)); +} + } // ProjectExplorer diff --git a/src/plugins/projectexplorer/panelswidget.h b/src/plugins/projectexplorer/panelswidget.h index 1be7723aaad..35e57351f11 100644 --- a/src/plugins/projectexplorer/panelswidget.h +++ b/src/plugins/projectexplorer/panelswidget.h @@ -34,6 +34,8 @@ class QGridLayout; class QIcon; QT_END_NAMESPACE +namespace Core { class MiniSplitter; } + namespace ProjectExplorer { class PROJECTEXPLORER_EXPORT PanelsWidget : public QWidget @@ -49,8 +51,12 @@ public: void addPropertiesPanel(const QString &displayName, const QIcon &icon, QWidget *widget); + QByteArray saveSplitterState() const; + void loadSplitterState(const QByteArray &state); + private: QGridLayout *m_layout; + Core::MiniSplitter * const m_splitter; QWidget *m_root; }; diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index e5a25c0b5fc..5d6970710c0 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -613,13 +613,32 @@ public: QWidget *panel() const { if (!m_panel) { - m_panel = (m_subIndex == RunPage) - ? new PanelsWidget(RunSettingsWidget::tr("Run Settings"), - QIcon(":/projectexplorer/images/RunSettings.png"), - new RunSettingsWidget(target())) - : new PanelsWidget(QCoreApplication::translate("BuildSettingsPanel", "Build Settings"), - QIcon(":/projectexplorer/images/BuildSettings.png"), - new BuildSettingsWidget(target())); + QString splitterStateKey = "PanelSplitterState:" + + m_project->projectFilePath().toString() + ':'; + if (m_subIndex == RunPage) { + splitterStateKey += "Run"; + m_panel = new PanelsWidget(RunSettingsWidget::tr("Run Settings"), + QIcon(":/projectexplorer/images/RunSettings.png"), + new RunSettingsWidget(target())); + } else { + splitterStateKey += "Build"; + m_panel = new PanelsWidget(QCoreApplication::translate("BuildSettingsPanel", "Build Settings"), + QIcon(":/projectexplorer/images/BuildSettings.png"), + new BuildSettingsWidget(target())); + } + const auto panel = qobject_cast(m_panel.data()); + const auto loadSplitterValue = [panel, splitterStateKey] { + const QByteArray splitterState = SessionManager::value(splitterStateKey).toByteArray(); + if (!splitterState.isEmpty()) + panel->loadSplitterState(splitterState); + }; + loadSplitterValue(); + QObject::connect(SessionManager::instance(), &SessionManager::aboutToSaveSession, + panel, [panel, splitterStateKey] { + SessionManager::setValue(splitterStateKey, panel->saveSplitterState()); + }); + QObject::connect(SessionManager::instance(), &SessionManager::sessionLoaded, + panel, loadSplitterValue); } return m_panel; }