Skip to content

Commit

Permalink
App: keep width of side bar widget
Browse files Browse the repository at this point in the history
Relates to GitHub #297
  • Loading branch information
HuguesDelorme committed Oct 17, 2024
1 parent 3b979b6 commit 81dbfae
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 10 deletions.
10 changes: 8 additions & 2 deletions src/app/app_ui_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ QByteArray AppUiState::toBlob(const AppUiState& state)
QByteArray blob;
QDataStream stream(&blob, QIODevice::WriteOnly);
stream << QtCoreUtils::QByteArray_frowRawData(std::string_view{PropertyAppUiState::TypeName});
constexpr uint32_t version = 1;
constexpr uint32_t version = 2;
stream << version;
stream << state.mainWindowGeometry;
stream << state.pageDocuments_isLeftSideBarVisible;
stream << state.pageDocuments_widgetLeftSideBarWidthFactor;
return blob;

}
Expand All @@ -36,11 +37,16 @@ AppUiState AppUiState::fromBlob(const QByteArray& blob, bool* ok)
if (identifier == PropertyAppUiState::TypeName) {
uint32_t version = 0;
stream >> version;
if (version == 1) {
if (version >= 1) {
stream >> state.mainWindowGeometry;
stream >> state.pageDocuments_isLeftSideBarVisible;
fnSetOk(true);
}

if (version >= 2) {
stream >> state.pageDocuments_widgetLeftSideBarWidthFactor;
fnSetOk(true);
}
}

return state;
Expand Down
1 change: 1 addition & 0 deletions src/app/app_ui_state.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ namespace Mayo {
struct AppUiState {
QByteArray mainWindowGeometry; // Provided by QWidget::saveGeometry()
bool pageDocuments_isLeftSideBarVisible = true;
double pageDocuments_widgetLeftSideBarWidthFactor = 0.25;

// Serialization functions
static QByteArray toBlob(const AppUiState& state);
Expand Down
14 changes: 10 additions & 4 deletions src/app/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,11 @@ void MainWindow::showEvent(QShowEvent* event)
if (!uiState.mainWindowGeometry.isEmpty())
this->restoreGeometry(uiState.mainWindowGeometry);

if (this->widgetPageDocuments())
this->widgetPageDocuments()->widgetLeftSideBar()->setVisible(uiState.pageDocuments_isLeftSideBarVisible);
WidgetMainControl* pageDocs = this->widgetPageDocuments();
if (pageDocs) {
pageDocs->widgetLeftSideBar()->setVisible(uiState.pageDocuments_isLeftSideBarVisible);
pageDocs->setWidgetLeftSideBarWidthFactor(uiState.pageDocuments_widgetLeftSideBarWidthFactor);
}

QMainWindow::showEvent(event);
#if defined(Q_OS_WIN) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
Expand All @@ -95,8 +98,11 @@ void MainWindow::closeEvent(QCloseEvent* event)
{
AppUiState uiState = AppModule::get()->properties()->appUiState;
uiState.mainWindowGeometry = this->saveGeometry();
if (this->widgetPageDocuments())
uiState.pageDocuments_isLeftSideBarVisible = this->widgetPageDocuments()->widgetLeftSideBar()->isVisible();
WidgetMainControl* pageDocs = this->widgetPageDocuments();
if (pageDocs) {
uiState.pageDocuments_isLeftSideBarVisible = pageDocs->widgetLeftSideBar()->isVisible();
uiState.pageDocuments_widgetLeftSideBarWidthFactor = pageDocs->widgetLeftSideBarWidthFactor();
}

AppModule::get()->properties()->appUiState.setValue(uiState);
QMainWindow::closeEvent(event);
Expand Down
35 changes: 31 additions & 4 deletions src/app/widget_main_control.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
#include <QtCore/QTimer>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMessageBox>

#include <algorithm>
#include <cassert>

namespace Mayo {
Expand All @@ -50,8 +52,6 @@ WidgetMainControl::WidgetMainControl(GuiApplication* guiApp, QWidget* parent)
m_ui->widget_ModelTree->registerGuiApplication(guiApp);

m_ui->splitter_Main->setChildrenCollapsible(false);
m_ui->splitter_Main->setStretchFactor(0, 1);
m_ui->splitter_Main->setStretchFactor(1, 3);

m_ui->splitter_ModelTree->setStretchFactor(0, 1);
m_ui->splitter_ModelTree->setStretchFactor(1, 2);
Expand Down Expand Up @@ -82,6 +82,10 @@ WidgetMainControl::WidgetMainControl(GuiApplication* guiApp, QWidget* parent)
m_ui->listView_OpenedDocuments, &QListView::clicked,
this, [=](const QModelIndex& index) { this->setCurrentDocumentIndex(index.row()); }
);
QObject::connect(
m_ui->splitter_Main, &QSplitter::splitterMoved,
this, &WidgetMainControl::onSplitterMainMoved
);

guiApp->application()->signalDocumentFilePathChanged.connectSlot([=](const DocumentPtr& doc, const FilePath& fp) {
if (this->currentWidgetGuiDocument()->documentIdentifier() == doc->identifier())
Expand Down Expand Up @@ -118,6 +122,7 @@ WidgetMainControl::WidgetMainControl(GuiApplication* guiApp, QWidget* parent)
m_ui->stack_GuiDocuments->installEventFilter(this);
this->onLeftContentsPageChanged(m_ui->stack_LeftContents->currentIndex());
m_ui->widget_MouseCoords->hide();
this->setWidgetLeftSideBarWidthFactor(0.25);

this->onCurrentDocumentIndexChanged(-1);
}
Expand Down Expand Up @@ -155,8 +160,8 @@ void WidgetMainControl::initialize(const CommandContainer* cmdContainer)
if (btnId == 1) {
assert(this->widgetGuiDocument(index.row()) != nullptr);
FileCommandTools::closeDocument(
cmdContainer->appContext(),
this->widgetGuiDocument(index.row())->documentIdentifier()
cmdContainer->appContext(),
this->widgetGuiDocument(index.row())->documentIdentifier()
);
}
});
Expand All @@ -174,6 +179,19 @@ QWidget* WidgetMainControl::widgetLeftSideBar() const
return m_ui->widget_Left;
}

double WidgetMainControl::widgetLeftSideBarWidthFactor() const
{
return m_widgetLeftSideBarWidthFactor;
}

void WidgetMainControl::setWidgetLeftSideBarWidthFactor(double factor)
{
const int mainWidth = this->geometry().width();
const double leftFactor = std::max(0., std::min(1., factor)); // Clamp in [0, 1]
m_ui->splitter_Main->setSizes({int(leftFactor * mainWidth), int((1. - leftFactor) * mainWidth)});
m_widgetLeftSideBarWidthFactor = leftFactor;
}

bool WidgetMainControl::eventFilter(QObject* watched, QEvent* event)
{
auto fnSizeBtn = [](const QWidget* container, const QWidget* widgetHeightRef) {
Expand Down Expand Up @@ -497,4 +515,13 @@ void WidgetMainControl::onDocumentFileChanged(const DocumentPtr& doc)
m_pendingDocsToReload.insert(doc);
}

void WidgetMainControl::onSplitterMainMoved(int pos, int /*index*/)
{
const int mainWidth = this->geometry().width();
if (mainWidth != 0)
m_widgetLeftSideBarWidthFactor = pos / double(mainWidth);
else
m_widgetLeftSideBarWidthFactor = 0.25;
}

} // namespace Mayo
6 changes: 6 additions & 0 deletions src/app/widget_main_control.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ class WidgetMainControl : public IWidgetMainPage {
// Widget at the left side of the app providing access to the model tree, file system, ...
QWidget* widgetLeftSideBar() const;

// Factor value must be in [0, 1]
double widgetLeftSideBarWidthFactor() const;
void setWidgetLeftSideBarWidthFactor(double factor);

int widgetGuiDocumentCount() const;
WidgetGuiDocument* widgetGuiDocument(int idx) const;
WidgetGuiDocument* currentWidgetGuiDocument() const;
Expand All @@ -65,6 +69,7 @@ class WidgetMainControl : public IWidgetMainPage {
void onGuiDocumentAdded(GuiDocument* guiDoc);
void onCurrentDocumentIndexChanged(int idx);
void onDocumentFileChanged(const DocumentPtr& doc);
void onSplitterMainMoved(int pos, int index);

QWidget* findLeftHeaderPlaceHolder() const;
QWidget* recreateLeftHeaderPlaceHolder();
Expand All @@ -79,6 +84,7 @@ class WidgetMainControl : public IWidgetMainPage {
std::unique_ptr<PropertyGroupSignals> m_ptrCurrentNodeGraphicsProperties;
DocumentFilesWatcher* m_docFilesWatcher = nullptr;
std::unordered_set<DocumentPtr> m_pendingDocsToReload;
double m_widgetLeftSideBarWidthFactor = 0.25;
};

} // namespace Mayo

0 comments on commit 81dbfae

Please sign in to comment.