From c2513aec395a9930d3e03cb547a655ecb576cc63 Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Wed, 11 Mar 2026 09:38:48 +0100 Subject: [PATCH 1/8] fix(settingsdialog): let scroll area actually resize on current widget in the stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The wrapping QWidget would just assume the biggest size of any previous widget and never get smaller. As we can justâ„¢ set the scroll view's widget to be the stackwidget it's unnecessary anyway Signed-off-by: Jyrki Gadinger --- src/gui/settingsdialog.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index e52d7af80c8be..f272af474bbf5 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -152,7 +152,7 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) _ui->setupUi(this); auto *dynamicStack = new CurrentPageSizeStackedWidget(this); dynamicStack->setObjectName(_ui->stack->objectName()); - _ui->mainLayout->replaceWidget(_ui->stack, dynamicStack); + _ui->mainLayout->removeWidget(_ui->stack); _ui->stack->deleteLater(); _ui->stack = dynamicStack; @@ -195,16 +195,7 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) contentScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); contentScroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); contentScroll->viewport()->setAutoFillBackground(false); - auto *contentContainer = new QWidget(contentScroll); - contentContainer->setObjectName(QLatin1String("settings_content")); - auto *contentLayout = new QVBoxLayout(contentContainer); - contentLayout->setContentsMargins(0, 0, 0, 0); - contentLayout->setSpacing(0); - _ui->stack->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); - contentLayout->addWidget(_ui->stack); - contentLayout->setAlignment(_ui->stack, Qt::AlignTop); - contentLayout->addStretch(1); - contentScroll->setWidget(contentContainer); + contentScroll->setWidget(_ui->stack); shellLayout->addWidget(navigationScroll); shellLayout->addWidget(contentScroll); shellLayout->setStretch(0, 0); From a01f234cc285e2257dc42e7cc43603450d707fac Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Wed, 11 Mar 2026 10:51:45 +0100 Subject: [PATCH 2/8] refactor(settingsdialog): get rid of now-useless designer file It was kinda empty and the widgets were created in the C++ code anyway. Also makes the left account navigation toolbar scrollable through a scrollbar :) Signed-off-by: Jyrki Gadinger --- src/gui/CMakeLists.txt | 1 - src/gui/settingsdialog.cpp | 152 +++++++++++++++++++------------------ src/gui/settingsdialog.h | 10 +-- src/gui/settingsdialog.ui | 43 ----------- 4 files changed, 81 insertions(+), 125 deletions(-) delete mode 100644 src/gui/settingsdialog.ui diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 6671075de5d9b..a13ff917823f3 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -36,7 +36,6 @@ set(client_UI_SRCS ignorelisteditor.ui ignorelisttablewidget.ui networksettings.ui - settingsdialog.ui sslerrordialog.ui addcertificatedialog.ui passwordinputdialog.ui diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index f272af474bbf5..3535e997ac113 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -5,7 +5,6 @@ */ #include "settingsdialog.h" -#include "ui_settingsdialog.h" #include "folderman.h" #include "theme.h" @@ -41,6 +40,8 @@ #include #include +using namespace Qt::StringLiterals; + namespace { class CurrentPageSizeStackedWidget : public QStackedWidget { @@ -139,7 +140,6 @@ class WindowDragHandle : public QWidget SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) : QDialog(parent) - , _ui(new Ui::SettingsDialog) , _gui(gui) { #if defined(Q_OS_MACOS) && QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) @@ -149,67 +149,7 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) ConfigFile cfg; - _ui->setupUi(this); - auto *dynamicStack = new CurrentPageSizeStackedWidget(this); - dynamicStack->setObjectName(_ui->stack->objectName()); - _ui->mainLayout->removeWidget(_ui->stack); - _ui->stack->deleteLater(); - _ui->stack = dynamicStack; - - _ui->mainLayout->setContentsMargins(8, 8, 8, 8); - _ui->mainLayout->setSpacing(0); - _toolBar = new QToolBar; - _toolBar->setIconSize(QSize(32, 32)); - _toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - _toolBar->setOrientation(Qt::Vertical); - _toolBar->setMovable(false); - _toolBar->setMinimumWidth(220); - auto *shellContainer = new QWidget(this); - shellContainer->setObjectName(QLatin1String("settings_shell")); - auto *shellLayout = new QHBoxLayout(shellContainer); - shellLayout->setContentsMargins(0, 0, 0, 0); - shellLayout->setSpacing(12); - auto *navigationContainer = new QWidget(this); - navigationContainer->setObjectName(QLatin1String("settings_navigation")); - navigationContainer->setAttribute(Qt::WA_StyledBackground); - auto *navigationLayout = new QVBoxLayout(navigationContainer); - navigationLayout->setContentsMargins(0, 0, 0, 0); - navigationLayout->setSpacing(0); - navigationLayout->addWidget(_toolBar); - navigationLayout->addStretch(1); - auto *navigationScroll = new QScrollArea(shellContainer); - navigationScroll->setObjectName(QLatin1String("settings_navigation_scroll")); - navigationScroll->setWidgetResizable(true); - navigationScroll->setFrameShape(QFrame::NoFrame); - navigationScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - navigationScroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - navigationScroll->setWidget(navigationContainer); - navigationScroll->viewport()->setObjectName("settings_navigation_viewport"); - navigationScroll->viewport()->setAutoFillBackground(false); - navigationScroll->viewport()->setStyleSheet("background: transparent;"); - auto *contentScroll = new QScrollArea(shellContainer); - contentScroll->setObjectName(QLatin1String("settings_content_scroll")); - contentScroll->setWidgetResizable(true); - contentScroll->setAlignment(Qt::AlignTop | Qt::AlignLeft); - contentScroll->setFrameShape(QFrame::NoFrame); - contentScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - contentScroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - contentScroll->viewport()->setAutoFillBackground(false); - contentScroll->setWidget(_ui->stack); - shellLayout->addWidget(navigationScroll); - shellLayout->addWidget(contentScroll); - shellLayout->setStretch(0, 0); - shellLayout->setStretch(1, 1); - _ui->mainLayout->removeWidget(_ui->stack); - _ui->mainLayout->insertWidget(0, shellContainer); - -#if defined(Q_OS_MACOS) && QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) - _windowDragHandle = new WindowDragHandle(this); - _windowDragHandle->setObjectName(QLatin1String("settings_window_drag_handle")); - _windowDragHandle->setFixedHeight(28); - _windowDragHandle->setGeometry(0, 0, width(), _windowDragHandle->height()); - _windowDragHandle->raise(); -#endif + setupUi(); // People perceive this as a Window, so also make Ctrl+W work auto *closeWindowAction = new QAction(this); @@ -240,8 +180,8 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) _toolBar->addWidget(accountSpacer); _toolBar->addSeparator(); auto *generalSettings = new GeneralSettings; - _ui->stack->addWidget(generalSettings); - _ui->stack->setStyleSheet(QStringLiteral("QStackedWidget { background: transparent; }")); + _stack->addWidget(generalSettings); + _stack->setStyleSheet(QStringLiteral("QStackedWidget { background: transparent; }")); // Connect styleChanged events to our widgets, so they can adapt (Dark-/Light-Mode switching) connect(this, &SettingsDialog::styleChanged, generalSettings, &GeneralSettings::slotStyleChanged); @@ -282,12 +222,11 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) SettingsDialog::~SettingsDialog() { - delete _ui; } QWidget* SettingsDialog::currentPage() { - return _ui->stack->currentWidget(); + return _stack->currentWidget(); } // close event is not being called here @@ -341,9 +280,9 @@ void SettingsDialog::changeEvent(QEvent *e) void SettingsDialog::slotSwitchPage(QAction *action) { - _ui->stack->setCurrentWidget(_actionGroupWidgets.value(action)); - _ui->stack->updateGeometry(); - if (auto *contentContainer = _ui->stack->parentWidget()) { + _stack->setCurrentWidget(_actionGroupWidgets.value(action)); + _stack->updateGeometry(); + if (auto *contentContainer = _stack->parentWidget()) { contentContainer->updateGeometry(); } } @@ -383,7 +322,7 @@ void SettingsDialog::accountAdded(AccountState *s) QString objectName = QLatin1String("accountSettings_"); objectName += s->account()->displayName(); accountSettings->setObjectName(objectName); - _ui->stack->insertWidget(0 , accountSettings); + _stack->insertWidget(0 , accountSettings); _actionGroup->addAction(accountAction); _actionGroupWidgets.insert(accountAction, accountSettings); @@ -460,7 +399,7 @@ void SettingsDialog::accountRemoved(AccountState *s) if (as->accountsState() == s) { _toolBar->removeAction(it.key()); - if (_ui->stack->currentWidget() == it.value()) { + if (_stack->currentWidget() == it.value()) { showFirstPage(); } @@ -493,12 +432,10 @@ void SettingsDialog::customizeStyle() _toolBar->setStyleSheet(TOOLBAR_CSS()); setStyleSheet(QStringLiteral( - "#Settings { background: palette(window); }" - "#settings_shell { background: transparent; border-radius: 0; }" + "#Settings { background: palette(window); border-radius: 0; }" /* Navigation */ "#settings_navigation_scroll { background: palette(alternate-base); border-radius: 12px; padding: 4px; }" - "#settings_navigation_viewport { background: transparent; }" "#settings_navigation { background: palette(alternate-base); border-radius: 12px; padding: 4px; }" /* Content area */ @@ -577,4 +514,69 @@ QAction *SettingsDialog::createColorAwareAction(const QString &iconPath, const Q return createActionWithIcon(coloredIcon, text, iconPath); } +void SettingsDialog::setupUi() +{ + setWindowTitle(tr("Settings")); + setGeometry(0, 0, 950, 500); + + auto *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(12, 12, 12, 12); + mainLayout->setSpacing(12); + setLayout(mainLayout); + + _toolBar = new QToolBar; + _toolBar->setIconSize(QSize(32, 32)); + _toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + _toolBar->setOrientation(Qt::Vertical); + _toolBar->setMovable(false); + _toolBar->setMinimumWidth(220); + _toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); + + auto *navigationContainer = new QWidget(this); + navigationContainer->setObjectName("settings_navigation"_L1); + navigationContainer->setAttribute(Qt::WA_StyledBackground); + + auto *navigationLayout = new QVBoxLayout(navigationContainer); + navigationLayout->setContentsMargins(0, 0, 0, 0); + navigationLayout->setSpacing(0); + navigationLayout->addWidget(_toolBar); + navigationLayout->addStretch(1); + + auto *navigationScroll = new QScrollArea(this); + navigationScroll->setObjectName("settings_navigation_scroll"_L1); + navigationScroll->setWidgetResizable(true); + navigationScroll->setAlignment(Qt::AlignTop | Qt::AlignLeft); + navigationScroll->setFrameShape(QFrame::NoFrame); + navigationScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + navigationScroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + navigationScroll->viewport()->setAutoFillBackground(false); + navigationScroll->setWidget(navigationContainer); + + _stack = new CurrentPageSizeStackedWidget(this); + _stack->setObjectName(u"stack"_s); + + auto *contentScroll = new QScrollArea(this); + contentScroll->setObjectName("settings_content_scroll"_L1); + contentScroll->setWidgetResizable(true); + contentScroll->setAlignment(Qt::AlignTop | Qt::AlignLeft); + contentScroll->setFrameShape(QFrame::NoFrame); + contentScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + contentScroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + contentScroll->viewport()->setAutoFillBackground(false); + contentScroll->setWidget(_stack); + + mainLayout->addWidget(navigationScroll); + mainLayout->addWidget(contentScroll); + mainLayout->setStretch(0, 0); + mainLayout->setStretch(1, 1); + +#if defined(Q_OS_MACOS) && QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) + _windowDragHandle = new WindowDragHandle(this); + _windowDragHandle->setObjectName(QLatin1String("settings_window_drag_handle")); + _windowDragHandle->setFixedHeight(28); + _windowDragHandle->setGeometry(0, 0, width(), _windowDragHandle->height()); + _windowDragHandle->raise(); +#endif +} + } // namespace OCC diff --git a/src/gui/settingsdialog.h b/src/gui/settingsdialog.h index f8197952292bc..7422eb8e5aaf8 100644 --- a/src/gui/settingsdialog.h +++ b/src/gui/settingsdialog.h @@ -16,15 +16,12 @@ class QAction; class QActionGroup; class QToolBar; +class QStackedWidget; class QStandardItemModel; class QResizeEvent; namespace OCC { -namespace Ui { - class SettingsDialog; -} - class AccountState; class AccountSettings; class Application; @@ -76,8 +73,6 @@ private slots: QAction *createColorAwareAction(const QString &iconName, const QString &fileName); QAction *createActionWithIcon(const QIcon &icon, const QString &text, const QString &iconPath = QString()); - Ui::SettingsDialog *const _ui; - QActionGroup *_actionGroup; // Maps the actions from the action group to the corresponding widgets QHash _actionGroupWidgets; @@ -87,6 +82,7 @@ private slots: QHash _actionForAccount; QToolBar *_toolBar; + QStackedWidget *_stack = nullptr; #if defined(Q_OS_MACOS) && QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) QWidget *_windowDragHandle = nullptr; @@ -95,6 +91,8 @@ private slots: ownCloudGui *_gui; bool _styleUpdatePending = false; bool _updatingStyle = false; + + void setupUi(); }; } diff --git a/src/gui/settingsdialog.ui b/src/gui/settingsdialog.ui deleted file mode 100644 index 76213cbd3bda4..0000000000000 --- a/src/gui/settingsdialog.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - OCC::SettingsDialog - - - - 0 - 0 - 950 - 500 - - - - Settings - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - - - - - - From a3d773bae1c9995632afd77c4000ab4d3d233816 Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Wed, 11 Mar 2026 11:31:18 +0100 Subject: [PATCH 3/8] fix(accountsettings): avoid inner scrollable folder list let it grow, there's a parent widget anyway small refactoring too: .ui now has a QVBoxLayout as its base instead of a QGridLayout Signed-off-by: Jyrki Gadinger --- src/gui/accountsettings.cpp | 11 +-- src/gui/accountsettings.ui | 161 ++++++++++++++++++----------------- src/gui/folderstatusview.cpp | 28 ------ src/gui/folderstatusview.h | 1 - src/gui/settingsdialog.cpp | 2 +- 5 files changed, 85 insertions(+), 118 deletions(-) diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp index 5fa5efc372789..e4ac04e8d6ef2 100644 --- a/src/gui/accountsettings.cpp +++ b/src/gui/accountsettings.cpp @@ -58,6 +58,8 @@ #include #include +using namespace Qt::StringLiterals; + #ifdef BUILD_FILE_PROVIDER_MODULE #include "macOS/fileprovider.h" #endif @@ -174,20 +176,13 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent) , _userInfo(accountState, false, true) { _ui->setupUi(this); - _ui->gridLayout->setRowStretch(0, 0); - _ui->gridLayout->setRowStretch(1, 0); - _ui->gridLayout->setRowStretch(2, 0); - _ui->gridLayout->setRowStretch(3, 0); - _ui->gridLayout->setRowStretch(4, 1); _model->setAccountState(_accountState); _model->setParent(this); const auto delegate = new FolderStatusDelegate; delegate->setParent(this); - _ui->accountTabsPanel->setStyleSheet(QStringLiteral( - "QWidget#syncFoldersPanelContents, QWidget#connectionSettingsPanelContents, QWidget#fileProviderPanelContents {" - " background: palette(alternate-base); }")); + setStyleSheet("QWidget#syncFoldersPanelContents, QWidget#connectionSettingsPanelContents, QWidget#fileProviderPanelContents { background: palette(alternate-base); }"_L1); _ui->syncFoldersPanelContents->setAutoFillBackground(true); _ui->syncFoldersPanelContents->setAttribute(Qt::WA_StyledBackground, true); _ui->syncFoldersPanelContents->setContentsMargins(0, 0, 0, 0); diff --git a/src/gui/accountsettings.ui b/src/gui/accountsettings.ui index 409223f30dd88..2f32535fe0a7b 100644 --- a/src/gui/accountsettings.ui +++ b/src/gui/accountsettings.ui @@ -13,7 +13,7 @@ Form - + 0 @@ -26,24 +26,24 @@ 0 - + - QFrame::NoFrame + QFrame::Shape::NoFrame - + 0 - - + + 0 - - + + 0 - - + + 0 - + @@ -72,7 +72,7 @@ Connected with <server> as <user> - Qt::RichText + Qt::TextFormat::RichText true @@ -102,7 +102,7 @@ - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop @@ -133,15 +133,16 @@ - + - - QFrame::NoFrame - - 0 - 0 - + + 0 + 0 + + + + QFrame::Shape::NoFrame @@ -158,25 +159,40 @@ - - - 0 - 0 - - + + + 0 + 0 + + - + + + + 0 + 0 + + - QFrame::NoFrame + QFrame::Shape::NoFrame + + QLayout::SizeConstraint::SetDefaultConstraint + + + + 0 + 0 + + true @@ -190,7 +206,7 @@ - + 0 0 @@ -211,16 +227,13 @@ - + 0 0 - - QAbstractScrollArea::AdjustToContents - - Qt::CustomContextMenu + Qt::ContextMenuPolicy::CustomContextMenu false @@ -228,8 +241,11 @@ QFrame::Shape::NoFrame + + QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents + - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers true @@ -253,7 +269,7 @@ Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore - Qt::RichText + Qt::TextFormat::RichText true @@ -345,7 +361,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -387,53 +403,38 @@ - - + + + + + 0 + 0 + + - QFrame::NoFrame + QFrame::Shape::NoFrame - - - 0 - - - 0 - - - 0 - - - 0 - + - - - QFrame::NoFrame + + + + true + + + + Connection settings + + + + + + + + 0 + 0 + - - - - - - true - - - - Connection settings - - - - - - - - 0 - 0 - - - - - diff --git a/src/gui/folderstatusview.cpp b/src/gui/folderstatusview.cpp index 8acca14042d70..3e06244acf00f 100644 --- a/src/gui/folderstatusview.cpp +++ b/src/gui/folderstatusview.cpp @@ -33,32 +33,4 @@ QRect FolderStatusView::visualRect(const QModelIndex &index) const return rect; } -QSize FolderStatusView::sizeHint() const -{ - const auto baseHint = QTreeView::sizeHint(); - if (!model()) { - return baseHint; - } - - const int rowCount = model()->rowCount(); - const int fallbackRowHeight = fontMetrics().height() + 8; - int height = 0; - - for (int row = 0; row < rowCount; ++row) { - const int rowSizeHint = sizeHintForRow(row); - height += rowSizeHint > 0 ? rowSizeHint : fallbackRowHeight; - } - - if (height == 0) { - height = fallbackRowHeight; - } - - height += frameWidth() * 2; - if (horizontalScrollBar()->isVisible()) { - height += horizontalScrollBar()->sizeHint().height(); - } - - return {baseHint.width(), height}; -} - } // namespace OCC diff --git a/src/gui/folderstatusview.h b/src/gui/folderstatusview.h index c7f93cc6e7157..6c66853001cab 100644 --- a/src/gui/folderstatusview.h +++ b/src/gui/folderstatusview.h @@ -23,7 +23,6 @@ class FolderStatusView : public QTreeView [[nodiscard]] QModelIndex indexAt(const QPoint &point) const override; [[nodiscard]] QRect visualRect(const QModelIndex &index) const override; - [[nodiscard]] QSize sizeHint() const override; }; } // namespace OCC diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index 3535e997ac113..834ac92f2c658 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -445,7 +445,7 @@ void SettingsDialog::customizeStyle() /* Panels */ "#generalGroupBox, #advancedGroupBox, #aboutAndUpdatesGroupBox," - "#accountStatusPanel, #accountTabsPanel, #fileProviderPanel, #syncFoldersPanel {" + "#accountStatusPanel, #connectionSettingsPanel, #fileProviderPanel, #syncFoldersPanel {" " background: palette(alternate-base);" " border-radius: 10px;" " margin: 0px;" From 8257a78fa941a7d7ff325458d9726bf41c0c87e8 Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Wed, 11 Mar 2026 11:36:59 +0100 Subject: [PATCH 4/8] fix(settingsdialog): avoid black background in scrollbars with Breeze style Signed-off-by: Jyrki Gadinger --- src/gui/settingsdialog.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index 834ac92f2c658..eb82e90d72dfe 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -439,9 +439,7 @@ void SettingsDialog::customizeStyle() "#settings_navigation { background: palette(alternate-base); border-radius: 12px; padding: 4px; }" /* Content area */ - "#settings_content_scroll { background: transparent; border-radius: 12px; }" - "#settings_content_scroll > QWidget { background: transparent; }" - "#settings_content { background: transparent; }" + "#settings_content_scroll { border-radius: 12px; }" /* Panels */ "#generalGroupBox, #advancedGroupBox, #aboutAndUpdatesGroupBox," From 63cf04d1f4347e9f4426dd24fe45b45dddaaef63 Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Wed, 11 Mar 2026 12:01:39 +0100 Subject: [PATCH 5/8] fix(accountsettings): allow widgets to be as small as needed Signed-off-by: Jyrki Gadinger --- src/gui/accountsettings.ui | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/gui/accountsettings.ui b/src/gui/accountsettings.ui index 2f32535fe0a7b..5c4650f525c9c 100644 --- a/src/gui/accountsettings.ui +++ b/src/gui/accountsettings.ui @@ -227,7 +227,7 @@ - + 0 0 @@ -440,6 +440,22 @@ + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::MinimumExpanding + + + + 20 + 0 + + + + From d0fcb071c832879b8205040d18c7b1488f37c74f Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Wed, 11 Mar 2026 14:46:13 +0100 Subject: [PATCH 6/8] refactor(settingsdialog): use constexpr for toolbar css Signed-off-by: Jyrki Gadinger --- src/gui/settingsdialog.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index eb82e90d72dfe..55ec7c10b1371 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -82,13 +82,12 @@ class CurrentPageSizeStackedWidget : public QStackedWidget }; -const QString TOOLBAR_CSS() -{ - return QStringLiteral("QToolBar { background: transparent; margin: 0; padding: 0; border: none; spacing: 0; } " - "QToolBar QToolButton { background: transparent; border: none; margin: 0; padding: 8px 12px; font-size: 14px; border-radius: 8px; } " - "QToolBar QToolBarExtension { padding:0; } " - "QToolBar QToolButton:checked { background: palette(highlight); color: palette(highlighted-text);}"); -} +constexpr auto TOOLBAR_CSS = QLatin1String( + "QToolBar { background: transparent; margin: 0; padding: 0; border: none; spacing: 0; } " + "QToolBar QToolButton { background: transparent; border: none; margin: 0; padding: 8px 12px; font-size: 14px; border-radius: 8px; } " + "QToolBar QToolBarExtension { padding: 0; } " + "QToolBar QToolButton:checked { background: palette(highlight); color: palette(highlighted-text); }" +); const float buttonSizeRatio = 1.618f; // golden ratio @@ -429,7 +428,7 @@ void SettingsDialog::customizeStyle() } const QScopedValueRollback updatingStyle(_updatingStyle, true); - _toolBar->setStyleSheet(TOOLBAR_CSS()); + _toolBar->setStyleSheet(TOOLBAR_CSS); setStyleSheet(QStringLiteral( "#Settings { background: palette(window); border-radius: 0; }" From 639680db449cc8455f09c6cef6afb9f741b62ad4 Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Wed, 11 Mar 2026 15:11:10 +0100 Subject: [PATCH 7/8] fix(settingsdialog): avoid clipping FileProvider QML settings the padding is different between QWidget and QML style Signed-off-by: Jyrki Gadinger --- src/gui/accountsettings.ui | 3 +++ src/gui/macOS/ui/FileProviderSettings.qml | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gui/accountsettings.ui b/src/gui/accountsettings.ui index 5c4650f525c9c..def10f88a2650 100644 --- a/src/gui/accountsettings.ui +++ b/src/gui/accountsettings.ui @@ -145,6 +145,9 @@ QFrame::Shape::NoFrame + + QLayout::SizeConstraint::SetDefaultConstraint + diff --git a/src/gui/macOS/ui/FileProviderSettings.qml b/src/gui/macOS/ui/FileProviderSettings.qml index 55e43aae24dbb..9f658fdb001a5 100644 --- a/src/gui/macOS/ui/FileProviderSettings.qml +++ b/src/gui/macOS/ui/FileProviderSettings.qml @@ -30,8 +30,8 @@ Page { leftPadding: 0 rightPadding: 0 - topPadding: Style.standardSpacing - bottomPadding: Style.standardSpacing + topPadding: 12 // Style.standardSpacing is 10, the QtWidgets layout uses 12. set it here as well to avoid a rough cutoff + bottomPadding: 12 // 1. Tell the Page how tall it actually is implicitHeight: rootColumn.implicitHeight + topPadding + bottomPadding From 893ace82bfbba2b65b9227bf0671d5dc25d23fca Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Wed, 11 Mar 2026 15:40:32 +0100 Subject: [PATCH 8/8] refactor(settingsdialog): simplify qss rules Signed-off-by: Jyrki Gadinger --- src/gui/settingsdialog.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index 55ec7c10b1371..0895c49c97fb6 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -434,11 +434,10 @@ void SettingsDialog::customizeStyle() "#Settings { background: palette(window); border-radius: 0; }" /* Navigation */ - "#settings_navigation_scroll { background: palette(alternate-base); border-radius: 12px; padding: 4px; }" - "#settings_navigation { background: palette(alternate-base); border-radius: 12px; padding: 4px; }" + "#settings_navigation, #settings_navigation_scroll { background: palette(alternate-base); border-radius: 12px; padding: 4px; }" /* Content area */ - "#settings_content_scroll { border-radius: 12px; }" + "#settings_content, #settings_content_scroll { background: palette(window); border-radius: 12px; }" /* Panels */ "#generalGroupBox, #advancedGroupBox, #aboutAndUpdatesGroupBox," @@ -550,7 +549,7 @@ void SettingsDialog::setupUi() navigationScroll->setWidget(navigationContainer); _stack = new CurrentPageSizeStackedWidget(this); - _stack->setObjectName(u"stack"_s); + _stack->setObjectName(u"settings_content"_s); auto *contentScroll = new QScrollArea(this); contentScroll->setObjectName("settings_content_scroll"_L1);