From 0e471c9727d29155030ab13ab910a965a24b2cc4 Mon Sep 17 00:00:00 2001 From: memurats Date: Fri, 24 Oct 2025 11:52:03 +0200 Subject: [PATCH 1/7] main settings dialog changes --- src/gui/CMakeLists.txt | 7 ++ src/gui/nmcgui/nmcsettingsdialog.cpp | 96 ++++++++++++++++++++++++++++ src/gui/nmcgui/nmcsettingsdialog.h | 70 ++++++++++++++++++++ src/gui/owncloudgui.cpp | 3 +- src/gui/settingsdialog.cpp | 39 +++++------ src/gui/settingsdialog.h | 10 ++- theme/account.svg | 12 ++-- theme/network.svg | 8 ++- theme/settings.svg | 12 ++-- 9 files changed, 222 insertions(+), 35 deletions(-) create mode 100644 src/gui/nmcgui/nmcsettingsdialog.cpp create mode 100644 src/gui/nmcgui/nmcsettingsdialog.h diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 54d32c3580e86..06f095611462a 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -6,6 +6,9 @@ find_package(Qt${QT_MAJOR_VERSION} REQUIRED COMPONENTS Widgets Svg Qml Quick Qui find_package(KF6Archive REQUIRED) find_package(KF6GuiAddons) +#NMC customization: needed to find the ui file in a different location than the header file +set(CMAKE_AUTOUIC_SEARCH_PATHS "${CMAKE_SOURCE_DIR}/src/gui") + if(CMAKE_BUILD_TYPE MATCHES Debug) add_definitions(-DQT_QML_DEBUG) endif() @@ -260,6 +263,10 @@ set(client_SRCS wizard/wizardproxysettingsdialog.cpp ) +file(GLOB NMC_FILES "nmcgui/*") +set(NMC_SRCS ${NMC_FILES}) +list(APPEND client_SRCS ${NMC_SRCS}) + if (NOT DISABLE_ACCOUNT_MIGRATION) list(APPEND client_SRCS legacyaccountselectiondialog.h diff --git a/src/gui/nmcgui/nmcsettingsdialog.cpp b/src/gui/nmcgui/nmcsettingsdialog.cpp new file mode 100644 index 0000000000000..2ed349e7f1018 --- /dev/null +++ b/src/gui/nmcgui/nmcsettingsdialog.cpp @@ -0,0 +1,96 @@ +/* + * Copyright (C) by Eugen Fischer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "nmcsettingsdialog.h" +#include +#include +#include +#include "settingsdialog.h" + +namespace OCC { + +NMCSettingsDialog::NMCSettingsDialog(ownCloudGui *gui, QWidget *parent) + : SettingsDialog(gui, parent) +{ + setLayout(); + + // The window has no background widget, use palette + // QPalette palette; + // palette.setColor(QPalette::Window, QColor("#F3f3f3")); + // setPalette(palette); + + setFixedSize(760,760); + + getToolBar()->setFixedHeight(92); // 76px button height + 8 + 8 margin top and bottom + getToolBar()->setContentsMargins(8, 0, 8, 0); // Left margin not accepted, Qt bug? +} + +void NMCSettingsDialog::slotAccountAvatarChanged() +{ + //Intercept the base class slot, so the round avatar is not set. (dont pass to base class) + //Fix Account button size, for ech new created account + fixAccountButton(); +} + +void OCC::NMCSettingsDialog::setLayout() const +{ + //Fix network and general settings button size + const auto actions = getToolBar()->actions(); + for(auto *action : actions) + { + if((action->text() == QCoreApplication::translate("OCC::SettingsDialog","General") || action->text() == QCoreApplication::tr("General")) || + (action->text() == QCoreApplication::translate("OCC::SettingsDialog","Network") || action->text() == QCoreApplication::tr("Network")) || + (action->text() == QCoreApplication::translate("OCC::SettingsDialog","Account") || action->text() == QCoreApplication::tr("Account"))) + { + auto *widget = getToolBar()->widgetForAction(action); + if(widget) + { + widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + widget->setFixedSize(76, 76); + } + } + } + + //Fix initial account button size and stylesheet + fixAccountButton(); +} + +void NMCSettingsDialog::fixAccountButton() const +{ + auto toolbar = getToolBar(); + + // Sicher prüfen, ob ein Spacer schon existiert + auto *firstAction = toolbar->actions().at(0); + auto *firstWidget = toolbar->widgetForAction(firstAction); + if (!firstWidget || !firstWidget->objectName().startsWith("spacer_left")) { + auto *spacer = new QWidget(toolbar); + spacer->setFixedWidth(16); + spacer->setObjectName("spacer_left"); + spacer->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + toolbar->insertWidget(firstAction, spacer); + } + + // Account-Button anpassen + if (toolbar->actions().size() > 1) { + auto action = toolbar->actions().at(1); // Index 1, da davor Spacer + auto *widget = toolbar->widgetForAction(action); + if(widget) + { + widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + widget->setFixedSize(152, 76); + } + } +} + +} // namespace OCC diff --git a/src/gui/nmcgui/nmcsettingsdialog.h b/src/gui/nmcgui/nmcsettingsdialog.h new file mode 100644 index 0000000000000..2e917e809d8f6 --- /dev/null +++ b/src/gui/nmcgui/nmcsettingsdialog.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) by Eugen Fischer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#ifndef MIRALL_SETTINGSDIALOGMAGENTA_H +#define MIRALL_SETTINGSDIALOGMAGENTA_H + +#include + +namespace OCC { + +/** + * @brief The NMCSettingsDialog class + * + * This class represents the settings dialog specific to the Magenta theme. + * It inherits from SettingsDialog and provides additional functionalities + * or customizations related to the Magenta theme. + * + * @ingroup gui + */ +class NMCSettingsDialog : public SettingsDialog +{ + Q_OBJECT + +public: + /** + * @brief Constructor for NMCSettingsDialog + * + * @param gui Pointer to the ownCloudGui instance. + * @param parent Pointer to the parent QWidget (default is nullptr). + */ + explicit NMCSettingsDialog(ownCloudGui *gui, QWidget *parent = nullptr); + + /** + * @brief Destructor for NMCSettingsDialog + */ + ~NMCSettingsDialog() = default; + +public slots: + /** + * @brief Slot for handling changes in the account avatar + */ + void slotAccountAvatarChanged(); + + // NMCGuiInterface interface +protected: + /** + * @brief Sets the layout for the NMCSettingsDialog + */ + void setLayout() const; + +private: + /** + * @brief Fixes the appearance of the account button + */ + void fixAccountButton() const; +}; + +} // namespace OCC +#endif // MIRALL_SETTINGSDIALOGMAGENTA_H diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp index 1ab9ce9d5616f..2dae9feb721a2 100644 --- a/src/gui/owncloudgui.cpp +++ b/src/gui/owncloudgui.cpp @@ -21,6 +21,7 @@ #include "owncloudsetupwizard.h" #include "progressdispatcher.h" #include "settingsdialog.h" +#include "nmcgui/nmcsettingsdialog.h" #include "theme.h" #include "wheelhandler.h" #include "syncconflictsmodel.h" @@ -611,7 +612,7 @@ void ownCloudGui::slotShowGuiMessage(const QString &title, const QString &messag void ownCloudGui::slotShowSettings() { if (_settingsDialog.isNull()) { - _settingsDialog = new SettingsDialog(this); + _settingsDialog = new NMCSettingsDialog(this); _settingsDialog->setAttribute(Qt::WA_DeleteOnClose, true); #ifdef Q_OS_MACOS diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index dc6ab9cb802ca..3177f9a813c3f 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -6,6 +6,7 @@ #include "settingsdialog.h" #include "ui_settingsdialog.h" +#include "QtWidgets/qmainwindow.h" #include "folderman.h" #include "theme.h" @@ -37,10 +38,13 @@ namespace { const QString TOOLBAR_CSS() { - return QStringLiteral("QToolBar { background: %1; margin: 0; padding: 0; border: none; border-bottom: 1px solid %2; spacing: 0; } " - "QToolBar QToolButton { background: %1; border: none; border-bottom: 1px solid %2; margin: 0; padding: 5px; } " - "QToolBar QToolBarExtension { padding:0; } " - "QToolBar QToolButton:checked { background: %3; color: %4; }"); + return QStringLiteral( + "QToolBar { background: %1; margin: 0; padding: 0; border: none; spacing: 0; } " + "QToolBar QToolButton { background: %1; border: none; border-radius: 4px; margin: 0; padding: 6px; } " + "QToolBar QToolBarExtension { padding: 0; } " + "QToolBar QToolButton:hover { background: %2; } " + "QToolBar QToolButton:checked { background: %3; }" + ); } const float buttonSizeRatio = 1.618f; // golden ratio @@ -64,7 +68,7 @@ QString shortDisplayNameForSettings(OCC::Account *account, int width) host = fm.elidedText(host, Qt::ElideMiddle, width); user = fm.elidedText(user, Qt::ElideRight, width); } - return QStringLiteral("%1\n%2").arg(user, host); + return QStringLiteral("%1").arg(user); } } @@ -117,6 +121,12 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) auto *generalSettings = new GeneralSettings; _ui->stack->addWidget(generalSettings); + // Adds space between general and network actions + auto *spacer2 = new QWidget(); + spacer2->setFixedWidth(8); + spacer2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + _toolBar->addWidget(spacer2); + // Connect styleChanged events to our widgets, so they can adapt (Dark-/Light-Mode switching) connect(this, &SettingsDialog::styleChanged, generalSettings, &GeneralSettings::slotStyleChanged); @@ -230,7 +240,7 @@ void SettingsDialog::accountAdded(AccountState *s) const auto accountAction = createColorAwareAction(QLatin1String(":/client/theme/account.svg"), actionText); if (!brandingSingleAccount) { - accountAction->setToolTip(s->account()->displayName()); + accountAction->setToolTip(shortDisplayNameForSettings(s->account().data(), static_cast(height * buttonSizeRatio))); accountAction->setIconText(shortDisplayNameForSettings(s->account().data(), static_cast(height * buttonSizeRatio))); } @@ -289,6 +299,7 @@ void SettingsDialog::slotAccountDisplayNameChanged() QString displayName = account->displayName(); action->setText(displayName); auto height = _toolBar->sizeHint().height(); + action->setToolTip(shortDisplayNameForSettings(account, static_cast(height * buttonSizeRatio))); action->setIconText(shortDisplayNameForSettings(account, static_cast(height * buttonSizeRatio))); } } @@ -330,19 +341,9 @@ void SettingsDialog::accountRemoved(AccountState *s) void SettingsDialog::customizeStyle() { QString highlightColor(palette().highlight().color().name()); - QString highlightTextColor(palette().highlightedText().color().name()); - QString dark(palette().dark().color().name()); - QString background(palette().base().color().name()); - _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, dark, highlightColor, highlightTextColor)); - - const auto &allActions = _actionGroup->actions(); - for (const auto a : allActions) { - QIcon icon = Theme::createColorAwareIcon(a->property("iconPath").toString(), palette()); - a->setIcon(icon); - auto *btn = qobject_cast(_toolBar->widgetForAction(a)); - if (btn) - btn->setIcon(icon); - } + QString midlightColor(palette().mid().color().name()); + + _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, highlightColor, midlightColor)); } class ToolButtonAction : public QWidgetAction diff --git a/src/gui/settingsdialog.h b/src/gui/settingsdialog.h index 2b3080288807a..dd500299aa602 100644 --- a/src/gui/settingsdialog.h +++ b/src/gui/settingsdialog.h @@ -45,11 +45,16 @@ class SettingsDialog : public QDialog QWidget* currentPage(); + QToolBar *getToolBar() const + { + return _toolBar; + } + public slots: void showFirstPage(); void showIssuesList(OCC::AccountState *account); void slotSwitchPage(QAction *action); - void slotAccountAvatarChanged(); + virtual void slotAccountAvatarChanged(); void slotAccountDisplayNameChanged(); signals: @@ -66,9 +71,10 @@ private slots: void accountAdded(OCC::AccountState *); void accountRemoved(OCC::AccountState *); -private: +protected: void customizeStyle(); +private: QAction *createColorAwareAction(const QString &iconName, const QString &fileName); QAction *createActionWithIcon(const QIcon &icon, const QString &text, const QString &iconPath = QString()); diff --git a/theme/account.svg b/theme/account.svg index 8168da5fa5ee5..bde174912436d 100644 --- a/theme/account.svg +++ b/theme/account.svg @@ -1,7 +1,7 @@ - - - - - + + + icon/user_file/user/default@svg + + - + \ No newline at end of file diff --git a/theme/network.svg b/theme/network.svg index ca6455df5b41e..2f9e7bdf3cc61 100644 --- a/theme/network.svg +++ b/theme/network.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + /svg/icon/home/wifi/default + + + + \ No newline at end of file diff --git a/theme/settings.svg b/theme/settings.svg index a9c68e4067248..434caf275d458 100644 --- a/theme/settings.svg +++ b/theme/settings.svg @@ -1,7 +1,7 @@ - - - - - + + + /svg/icon/service/settings/default + + - + \ No newline at end of file From ea3642c4943f0a21e612114de4907c5d874b6c9b Mon Sep 17 00:00:00 2001 From: memurats Date: Mon, 27 Oct 2025 12:31:09 +0100 Subject: [PATCH 2/7] added missing background definition --- src/gui/settingsdialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index 3177f9a813c3f..e0b7ab072b936 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -340,6 +340,7 @@ void SettingsDialog::accountRemoved(AccountState *s) void SettingsDialog::customizeStyle() { + QString background(palette().base().color().name()); QString highlightColor(palette().highlight().color().name()); QString midlightColor(palette().mid().color().name()); From d34f735149a95c3e3ec18f74edd0f17321e07548 Mon Sep 17 00:00:00 2001 From: memurats Date: Mon, 27 Oct 2025 14:49:19 +0100 Subject: [PATCH 3/7] updated gui cmake file --- src/gui/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 06f095611462a..96fb9c4f5ac4a 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -6,9 +6,6 @@ find_package(Qt${QT_MAJOR_VERSION} REQUIRED COMPONENTS Widgets Svg Qml Quick Qui find_package(KF6Archive REQUIRED) find_package(KF6GuiAddons) -#NMC customization: needed to find the ui file in a different location than the header file -set(CMAKE_AUTOUIC_SEARCH_PATHS "${CMAKE_SOURCE_DIR}/src/gui") - if(CMAKE_BUILD_TYPE MATCHES Debug) add_definitions(-DQT_QML_DEBUG) endif() @@ -26,6 +23,9 @@ endif() configure_file(${CMAKE_SOURCE_DIR}/theme.qrc.in ${CMAKE_SOURCE_DIR}/theme.qrc) set(theme_dir ${CMAKE_SOURCE_DIR}/theme) +#NMC customization: needed to find the ui file in a different location than the header file +set(CMAKE_AUTOUIC_SEARCH_PATHS "${CMAKE_SOURCE_DIR}/src/gui") + set(client_UI_SRCS accountsettings.ui conflictdialog.ui From 6dc6df764bb24e13f5280a0784b6fe675047b52b Mon Sep 17 00:00:00 2001 From: memurats Date: Fri, 21 Nov 2025 10:50:25 +0100 Subject: [PATCH 4/7] changed button checked color --- src/gui/settingsdialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index e0b7ab072b936..5dc2ffe7a4392 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -342,9 +342,9 @@ void SettingsDialog::customizeStyle() { QString background(palette().base().color().name()); QString highlightColor(palette().highlight().color().name()); - QString midlightColor(palette().mid().color().name()); + QString darkColor(palette().dark().color().name()); - _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, highlightColor, midlightColor)); + _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, highlightColor, darkColor)); } class ToolButtonAction : public QWidgetAction From 40f96dbb8b33cbed47606eb00b42b8786c153483 Mon Sep 17 00:00:00 2001 From: memurats Date: Fri, 21 Nov 2025 11:46:06 +0100 Subject: [PATCH 5/7] changed checked button color --- src/gui/settingsdialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index 5dc2ffe7a4392..7103cf1f26a57 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -342,9 +342,9 @@ void SettingsDialog::customizeStyle() { QString background(palette().base().color().name()); QString highlightColor(palette().highlight().color().name()); - QString darkColor(palette().dark().color().name()); + QString lightColor(palette().light().color().name()); - _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, highlightColor, darkColor)); + _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, highlightColor, lightColor)); } class ToolButtonAction : public QWidgetAction From 12343f12284b16c9f652352711013c51755d878c Mon Sep 17 00:00:00 2001 From: memurats Date: Fri, 21 Nov 2025 14:03:10 +0100 Subject: [PATCH 6/7] btn color --- src/gui/settingsdialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index 7103cf1f26a57..2335a9ef2bafc 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -342,9 +342,9 @@ void SettingsDialog::customizeStyle() { QString background(palette().base().color().name()); QString highlightColor(palette().highlight().color().name()); - QString lightColor(palette().light().color().name()); + QString buttonColor(palette().button().color().name()); - _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, highlightColor, lightColor)); + _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, highlightColor, buttonColor)); } class ToolButtonAction : public QWidgetAction From 71cebd4883431f188bd776406392605b7e84c586 Mon Sep 17 00:00:00 2001 From: memurats Date: Fri, 21 Nov 2025 14:39:26 +0100 Subject: [PATCH 7/7] restore btn color --- src/gui/settingsdialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index 2335a9ef2bafc..e0b7ab072b936 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -342,9 +342,9 @@ void SettingsDialog::customizeStyle() { QString background(palette().base().color().name()); QString highlightColor(palette().highlight().color().name()); - QString buttonColor(palette().button().color().name()); + QString midlightColor(palette().mid().color().name()); - _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, highlightColor, buttonColor)); + _toolBar->setStyleSheet(TOOLBAR_CSS().arg(background, highlightColor, midlightColor)); } class ToolButtonAction : public QWidgetAction