ProjectExplorer: Make build and run widget width persistent

... by storing the splitter state in the session.

Task-number: QTCREATORBUG-24690
Change-Id: Ifd27382cc61825f96de4fa5d4691b4f615448182
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Christian Kandeler
2020-10-05 15:45:47 +02:00
parent f08c3d150a
commit 90c757d9cc
3 changed files with 48 additions and 13 deletions

View File

@@ -55,18 +55,18 @@ const int PANEL_LEFT_MARGIN = 70;
// PanelsWidget // 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 = new QWidget(nullptr);
m_root->setFocusPolicy(Qt::NoFocus); m_root->setFocusPolicy(Qt::NoFocus);
m_root->setContentsMargins(0, 0, 40, 0); m_root->setContentsMargins(0, 0, 40, 0);
splitter->addWidget(m_root); m_splitter->addWidget(m_root);
splitter->addWidget(new QWidget); m_splitter->addWidget(new QWidget);
splitter->setStretchFactor(1, 100); // Force root widget to its minimum size initially m_splitter->setStretchFactor(1, 100); // Force root widget to its minimum size initially
const auto scroller = new QScrollArea(this); const auto scroller = new QScrollArea(this);
scroller->setWidget(splitter); scroller->setWidget(m_splitter);
scroller->setFrameStyle(QFrame::NoFrame); scroller->setFrameStyle(QFrame::NoFrame);
scroller->setWidgetResizable(true); scroller->setWidgetResizable(true);
scroller->setFocusPolicy(Qt::NoFocus); 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); 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 } // ProjectExplorer

View File

@@ -34,6 +34,8 @@ class QGridLayout;
class QIcon; class QIcon;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Core { class MiniSplitter; }
namespace ProjectExplorer { namespace ProjectExplorer {
class PROJECTEXPLORER_EXPORT PanelsWidget : public QWidget class PROJECTEXPLORER_EXPORT PanelsWidget : public QWidget
@@ -49,8 +51,12 @@ public:
void addPropertiesPanel(const QString &displayName, const QIcon &icon, void addPropertiesPanel(const QString &displayName, const QIcon &icon,
QWidget *widget); QWidget *widget);
QByteArray saveSplitterState() const;
void loadSplitterState(const QByteArray &state);
private: private:
QGridLayout *m_layout; QGridLayout *m_layout;
Core::MiniSplitter * const m_splitter;
QWidget *m_root; QWidget *m_root;
}; };

View File

@@ -613,14 +613,33 @@ public:
QWidget *panel() const QWidget *panel() const
{ {
if (!m_panel) { if (!m_panel) {
m_panel = (m_subIndex == RunPage) QString splitterStateKey = "PanelSplitterState:"
? new PanelsWidget(RunSettingsWidget::tr("Run Settings"), + m_project->projectFilePath().toString() + ':';
if (m_subIndex == RunPage) {
splitterStateKey += "Run";
m_panel = new PanelsWidget(RunSettingsWidget::tr("Run Settings"),
QIcon(":/projectexplorer/images/RunSettings.png"), QIcon(":/projectexplorer/images/RunSettings.png"),
new RunSettingsWidget(target())) new RunSettingsWidget(target()));
: new PanelsWidget(QCoreApplication::translate("BuildSettingsPanel", "Build Settings"), } else {
splitterStateKey += "Build";
m_panel = new PanelsWidget(QCoreApplication::translate("BuildSettingsPanel", "Build Settings"),
QIcon(":/projectexplorer/images/BuildSettings.png"), QIcon(":/projectexplorer/images/BuildSettings.png"),
new BuildSettingsWidget(target())); new BuildSettingsWidget(target()));
} }
const auto panel = qobject_cast<PanelsWidget *>(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; return m_panel;
} }