From 8c86ca05c0cf007a50d2adf90dd38d7964945bb4 Mon Sep 17 00:00:00 2001 From: Martchus Date: Mon, 23 Oct 2023 20:42:26 +0200 Subject: [PATCH] Make side panel resizable and allow moving it to the other side --- src/GuiSidePanel.ui | 27 +++++---------------------- src/QtWindow.cpp | 27 +++++++++++++++++++++------ src/QtWindow.h | 3 ++- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/GuiSidePanel.ui b/src/GuiSidePanel.ui index f4e3f81..e2ca99b 100644 --- a/src/GuiSidePanel.ui +++ b/src/GuiSidePanel.ui @@ -2,32 +2,15 @@ GuiSidePanel - - - 0 - 0 - 300 - 443 - - - - - 300 - 16777215 - - - - Form - - + - 0 - - 4 + + 0 + - 9 + 4 0 diff --git a/src/QtWindow.cpp b/src/QtWindow.cpp index af73803..9fb452a 100644 --- a/src/QtWindow.cpp +++ b/src/QtWindow.cpp @@ -107,21 +107,35 @@ QtWindow::QtWindow(CSettings *settings, QtUtilities::QtSettings *qtSettings, QWi m_song = m_glWidget->getSongObject(); m_score = m_glWidget->getScoreObject(); - QHBoxLayout *mainLayout = new QHBoxLayout; - QVBoxLayout *columnLayout = new QVBoxLayout; + // setup dock widget with side panel + m_sidePanelDockWidget = new QDockWidget(this); +#if defined(Q_OS_WINDOWS) || defined(Q_OS_MAC) + constexpr auto dockFeatures = QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable; +#else + auto dockFeatures = static_cast(QDockWidget::DockWidgetMovable); + if (QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive)) { + // enable floating windows only on non-Wayland platforms as one can never put a floating window back under Wayland + dockFeatures |= QDockWidget::DockWidgetFloatable; + } else { + // ensure currently floating windows (e.g. from the last X11 session) aren't floating anymore under Wayland + m_sidePanelDockWidget->setFloating(false); + } +#endif + m_sidePanelDockWidget->setFeatures(dockFeatures); + m_sidePanelDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + m_sidePanelDockWidget->setWidget(m_sidePanel = new GuiSidePanel(this, m_settings)); + m_sidePanelDockWidget->setWindowTitle(tr("Options")); - m_sidePanel = new GuiSidePanel(this, m_settings); m_topBar = new GuiTopBar(this, m_settings); m_tutorWindow = new QTextBrowser(this); m_tutorWindow->hide(); m_settings->init(this, m_song, m_sidePanel, m_topBar); - mainLayout->addWidget(m_sidePanel); + QVBoxLayout *columnLayout = new QVBoxLayout; columnLayout->addWidget(m_topBar); columnLayout->addWidget(m_glWidget); columnLayout->addWidget(m_tutorWindow); - mainLayout->addLayout(columnLayout); m_song->init2(m_score, m_settings); @@ -129,9 +143,10 @@ QtWindow::QtWindow(CSettings *settings, QtUtilities::QtSettings *qtSettings, QWi m_topBar->init(m_song); QWidget *centralWin = new QWidget(); - centralWin->setLayout(mainLayout); + centralWin->setLayout(columnLayout); setCentralWidget(centralWin); + addDockWidget(Qt::LeftDockWidgetArea, m_sidePanelDockWidget); m_glWidget->setFocus(Qt::ActiveWindowFocusReason); diff --git a/src/QtWindow.h b/src/QtWindow.h index 18a18a2..9c4c6c4 100644 --- a/src/QtWindow.h +++ b/src/QtWindow.h @@ -111,7 +111,7 @@ private slots: void toggleSidePanel() { - m_sidePanel->setVisible(m_sidePanelStateAct->isChecked()); + m_sidePanelDockWidget->setVisible(m_sidePanelStateAct->isChecked()); } void onViewPianoKeyboard(){ @@ -193,6 +193,7 @@ private: QtUtilities::QtSettings *m_qtSettings; QtUtilities::SettingsDialog *m_settingsDlg; + QDockWidget *m_sidePanelDockWidget; GuiSidePanel *m_sidePanel; GuiTopBar *m_topBar; QTextBrowser *m_tutorWindow;