From d56446ce97aba86ef7b109c063b6d76968bb4ab0 Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Fri, 29 Jun 2018 14:28:48 +0300 Subject: [PATCH] Allow arbitrary resizing of the main window & restore sidebar's size fixes #160 fixes #163 fixes #187 fixes #127 --- include/MainWindow.h | 13 +++++++++++-- include/Splitter.h | 3 +++ src/ChatPage.cc | 2 +- src/MainWindow.cc | 5 ++++- src/Splitter.cc | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 4 deletions(-) diff --git a/include/MainWindow.h b/include/MainWindow.h index b068e8f6..10750e00 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -83,14 +83,23 @@ private slots: void showWelcomePage() { removeOverlayProgressBar(); + pageStack_->addWidget(welcome_page_); pageStack_->setCurrentWidget(welcome_page_); } //! Show the login page in the main window. - void showLoginPage() { pageStack_->setCurrentWidget(login_page_); } + void showLoginPage() + { + pageStack_->addWidget(login_page_); + pageStack_->setCurrentWidget(login_page_); + } //! Show the register page in the main window. - void showRegisterPage() { pageStack_->setCurrentWidget(register_page_); } + void showRegisterPage() + { + pageStack_->addWidget(register_page_); + pageStack_->setCurrentWidget(register_page_); + } //! Show user settings page. void showUserSettingsPage() { pageStack_->setCurrentWidget(userSettingsPage_); } diff --git a/include/Splitter.h b/include/Splitter.h index 5591fe55..38b38e84 100644 --- a/include/Splitter.h +++ b/include/Splitter.h @@ -24,6 +24,9 @@ class Splitter : public QSplitter Q_OBJECT public: explicit Splitter(QWidget *parent = nullptr); + ~Splitter(); + + void restoreSizes(int fallback); private: void onSplitterMoved(int pos, int index); diff --git a/src/ChatPage.cc b/src/ChatPage.cc index 2b8a6b89..3d026ab3 100644 --- a/src/ChatPage.cc +++ b/src/ChatPage.cc @@ -118,7 +118,7 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) // Splitter splitter->addWidget(sideBar_); splitter->addWidget(content_); - splitter->setSizes({ui::sidebar::NormalSize, parent->width() - ui::sidebar::NormalSize}); + splitter->restoreSizes(parent->width()); text_input_ = new TextInputWidget(this); typingDisplay_ = new TypingDisplay(this); diff --git a/src/MainWindow.cc b/src/MainWindow.cc index c7c3432f..7733a002 100644 --- a/src/MainWindow.cc +++ b/src/MainWindow.cc @@ -234,9 +234,12 @@ MainWindow::showChatPage() showOverlayProgressBar(); - welcome_page_->hide(); pageStack_->setCurrentWidget(chat_page_); + pageStack_->removeWidget(welcome_page_); + pageStack_->removeWidget(login_page_); + pageStack_->removeWidget(register_page_); + login_page_->reset(); chat_page_->bootstrap(userid, homeserver, token); diff --git a/src/Splitter.cc b/src/Splitter.cc index ccc250be..0344df92 100644 --- a/src/Splitter.cc +++ b/src/Splitter.cc @@ -16,6 +16,7 @@ */ #include +#include #include "Splitter.h" #include "Theme.h" @@ -28,6 +29,43 @@ Splitter::Splitter(QWidget *parent) setStyleSheet("QSplitter::handle { image: none; }"); } +void +Splitter::restoreSizes(int fallback) +{ + QSettings settings; + int savedWidth = settings.value("sidebar/width").toInt(); + + auto left = widget(0); + if (savedWidth == ui::sidebar::SmallSize) { + if (left) { + left->setMinimumWidth(ui::sidebar::SmallSize); + left->setMaximumWidth(ui::sidebar::SmallSize); + return; + } + } + + if (savedWidth >= ui::sidebar::NormalSize && savedWidth <= 2 * ui::sidebar::NormalSize) { + if (left) { + left->setMinimumWidth(ui::sidebar::NormalSize); + left->setMaximumWidth(2 * ui::sidebar::NormalSize); + setSizes({savedWidth, fallback - savedWidth}); + return; + } + } + + setSizes({ui::sidebar::NormalSize, fallback - ui::sidebar::NormalSize}); +} + +Splitter::~Splitter() +{ + auto left = widget(0); + + if (left) { + QSettings settings; + settings.setValue("sidebar/width", left->width()); + } +} + void Splitter::onSplitterMoved(int pos, int index) {