From 8f49a45768eb97d76f8ddca89f09bab4e5e7cbc9 Mon Sep 17 00:00:00 2001 From: memurats Date: Fri, 24 Oct 2025 15:07:30 +0200 Subject: [PATCH 1/2] account settings dialog changes --- src/gui/CMakeLists.txt | 7 ++ src/gui/accountsettings.cpp | 5 +- src/gui/accountsettings.h | 8 +- src/gui/accountsettings.ui | 25 ++++- src/gui/nmcgui/nmcaccountsettings.cpp | 147 ++++++++++++++++++++++++++ src/gui/nmcgui/nmcaccountsettings.h | 85 +++++++++++++++ src/gui/settingsdialog.cpp | 5 +- 7 files changed, 274 insertions(+), 8 deletions(-) create mode 100644 src/gui/nmcgui/nmcaccountsettings.cpp create mode 100644 src/gui/nmcgui/nmcaccountsettings.h diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index c3a77451aee2d..81b3bcc44e0bf 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/accountsettings.cpp b/src/gui/accountsettings.cpp index f246a7026495e..c302f9e613a2f 100644 --- a/src/gui/accountsettings.cpp +++ b/src/gui/accountsettings.cpp @@ -1172,7 +1172,6 @@ void AccountSettings::showConnectionLabel(const QString &message, QStringList er _ui->connectLabel->setToolTip({}); _ui->connectLabel->setStyleSheet(errStyle); } - _ui->accountStatus->setVisible(!message.isEmpty()); } void AccountSettings::slotEnableCurrentFolder(bool terminate) @@ -1268,9 +1267,10 @@ void AccountSettings::slotUpdateQuota(qint64 total, qint64 used) const auto totalStr = Utility::octetsToString(total); const auto percentStr = Utility::compactFormatDouble(percent, 1); const auto toolTip = tr("%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.").arg(usedStr, totalStr, percentStr); - _ui->quotaInfoLabel->setText(tr("%1 of %2 in use").arg(usedStr, totalStr)); + _ui->quotaInfoLabel->setText(QCoreApplication::translate("", "%1_OF_%2").arg(usedStr, totalStr)); _ui->quotaInfoLabel->setToolTip(toolTip); _ui->quotaProgressBar->setToolTip(toolTip); + _ui->quotaInfoText->setText(QCoreApplication::translate("", "USED_STORAGE_%1").arg(percentStr)); } else { _ui->quotaProgressBar->setVisible(false); _ui->quotaInfoLabel->setToolTip({}); @@ -1282,6 +1282,7 @@ void AccountSettings::slotUpdateQuota(qint64 total, qint64 used) const auto usedStr = Utility::octetsToString(used); _ui->quotaInfoLabel->setText(tr("%1 in use").arg(usedStr)); } + _ui->quotaInfoText->setText(QCoreApplication::translate("", "USED_STORAGE_%1").arg(QString::number(0))); } } diff --git a/src/gui/accountsettings.h b/src/gui/accountsettings.h index 6db64c3f7e229..f9b904171417b 100644 --- a/src/gui/accountsettings.h +++ b/src/gui/accountsettings.h @@ -108,6 +108,7 @@ protected slots: const QVector &roles); void slotPossiblyUnblacklistE2EeFoldersAndRestartSync(); + void checkClientSideEncryptionState(); void slotE2eEncryptionCertificateNeedMigration(); private slots: @@ -124,9 +125,14 @@ private slots: void setupE2eEncryption(); void forgetE2eEncryption(); - void checkClientSideEncryptionState(); void removeActionFromEncryptionMessage(const QString &actionId); +protected: + Ui::AccountSettings *getUi() const + { + return _ui; + } + private: bool event(QEvent *) override; QAction *addActionToEncryptionMessage(const QString &actionTitle, const QString &actionId); diff --git a/src/gui/accountsettings.ui b/src/gui/accountsettings.ui index 2db413221b169..b09eea0e43e04 100644 --- a/src/gui/accountsettings.ui +++ b/src/gui/accountsettings.ui @@ -14,7 +14,7 @@ Form - + @@ -66,9 +66,28 @@ + + + + + 0 + 0 + + + + 0% of memory used + + + Qt::PlainText + + + false + + + - + @@ -257,7 +276,7 @@ - + QTabWidget::Rounded diff --git a/src/gui/nmcgui/nmcaccountsettings.cpp b/src/gui/nmcgui/nmcaccountsettings.cpp new file mode 100644 index 0000000000000..391ac940c4db6 --- /dev/null +++ b/src/gui/nmcgui/nmcaccountsettings.cpp @@ -0,0 +1,147 @@ +/* + * 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 "nmcgui/nmcaccountsettings.h" + #include "ui_accountsettings.h" + #include "../common/utility.h" + #include "guiutility.h" + + #include + #include + #include + #include + #include + #include + #include + #include + + namespace OCC { + + NMCAccountSettings::NMCAccountSettings(AccountState *accountState, QWidget *parent) + : AccountSettings(accountState, parent) + , m_liveAccountButton(new CustomButton(QCoreApplication::translate("", "ADD_LIVE_BACKUP"), QIcon(QLatin1String(":/client/theme/NMCIcons/action-add.svg")).pixmap(24,24))) + , m_liveTitle(new QLabel(QCoreApplication::translate("", "LIVE_BACKUPS"))) + , m_liveDescription(new QLabel(QCoreApplication::translate("", "LIVE_DESCRIPTION"))) + , m_folderSync(new QLabel(QCoreApplication::translate("", "YOUR_FOLDER_SYNC"))) + { + setDefaultSettings(); + setLayout(); + connect(m_liveAccountButton, &CustomButton::clicked, this, &NMCAccountSettings::slotAddFolder); + } + + void NMCAccountSettings::setDefaultSettings() + { + getUi()->encryptionMessage->setCloseButtonVisible(true); + getUi()->selectiveSyncStatus->setVisible(false); + getUi()->selectiveSyncNotification->setVisible(false); + getUi()->accountStatus->setVisible(false); + getUi()->bigFolderUi->setVisible(false); + getUi()->gridLayout->setSpacing(8); + } + + void NMCAccountSettings::setLayout() + { + // Entferne alte Quota-Widgets + getUi()->storageGroupBox->removeWidget(getUi()->quotaInfoLabel); + getUi()->storageGroupBox->removeWidget(getUi()->quotaProgressBar); + getUi()->storageGroupBox->removeWidget(getUi()->quotaInfoText); + + getUi()->gridLayout->removeWidget(getUi()->encryptionMessage); + getUi()->gridLayout->addWidget(getUi()->encryptionMessage, 0, 0); + + // Titel für Folder Sync + m_folderSync->setStyleSheet("font-size: 15px; font-weight: 600; padding: 8px;"); + m_folderSync->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + getUi()->gridLayout->addWidget(m_folderSync, 1, 0); + + // Live-Backup-Bereich + auto *liveHLayout = new QHBoxLayout(); + liveHLayout->setContentsMargins(8, 8, 8, 8); + + auto *liveVLayout = new QVBoxLayout(); + auto *liveWidget = new QWidget(this); + liveWidget->setStyleSheet("QWidget {border-radius: 4px;}"); + liveWidget->setLayout(liveHLayout); + + liveHLayout->addLayout(liveVLayout); + liveHLayout->addStretch(); + + const QString styleSheet = QStringLiteral( + "QPushButton { font-size: %5px; border: %1px solid; border-color: black; " + "border-radius: 4px; background-color: %2; color: %3; } " + "QPushButton:hover { background-color: %4; }"); + + m_liveAccountButton->setStyleSheet(styleSheet.arg("0", "#E20074", "white", "#c00063", "13")); + m_liveAccountButton->setFixedSize(180, 32); + m_liveAccountButton->setLeftIconMargin(4); + + liveHLayout->addWidget(m_liveAccountButton); + + liveVLayout->addWidget(m_liveTitle); + m_liveTitle->setStyleSheet("font-size: 15px; font-weight: 600;"); + + liveVLayout->addWidget(m_liveDescription); + m_liveDescription->setStyleSheet("font-size: 13px;"); + m_liveDescription->setText(QCoreApplication::translate("", "LIVE_BACKUPS_DESCRIPTION")); + m_liveDescription->setWordWrap(true); + m_liveDescription->setFixedWidth(450); + + getUi()->gridLayout->addWidget(liveWidget, 4, 0); + + // Speicherbereich + auto *magentaHLayout = new QHBoxLayout(); + magentaHLayout->setSpacing(32); + + auto *quotaVLayout = new QVBoxLayout(); + quotaVLayout->setSpacing(4); + quotaVLayout->addSpacing(12); + + quotaVLayout->addWidget(getUi()->quotaInfoLabel); + getUi()->quotaInfoLabel->setStyleSheet("QLabel { font-size: 18px; padding: 8px; font-weight: 500; }"); + + quotaVLayout->addWidget(getUi()->quotaProgressBar); + getUi()->quotaProgressBar->setStyleSheet( + "QProgressBar { background-color: #e5e5e5; color: black; border: 1px solid black; border-radius: 4px; margin-left: 8px; } " + "QProgressBar::chunk { background-color: #E20074; }"); + getUi()->quotaProgressBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + + quotaVLayout->addWidget(getUi()->quotaInfoText); + getUi()->quotaInfoText->setStyleSheet("QLabel { font-size: 13px; padding: 8px; }"); + + quotaVLayout->addSpacing(20); + magentaHLayout->addLayout(quotaVLayout); + + auto *storageLinkButton = new QPushButton(QCoreApplication::translate("", "STORAGE_EXTENSION"), this); + storageLinkButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + storageLinkButton->setStyleSheet( + "QPushButton { height: 32px; width: 180px; border: 1px solid black; background-color: #ededed; " + "color: black; font-size: 13px; border-radius: 4px; } " + "QPushButton::hover { background-color: white; }"); + + connect(storageLinkButton, &QPushButton::clicked, this, []() { + QDesktopServices::openUrl(QUrl(QStringLiteral("https://cloud.telekom-dienste.de/tarife"))); + }); + + magentaHLayout->addWidget(storageLinkButton); + magentaHLayout->addSpacing(8); + + getUi()->gridLayout->addLayout(magentaHLayout, 5, 0); + + // Sichtbarkeit initial ausblenden + getUi()->encryptionMessage->hide(); + checkClientSideEncryptionState(); + } + + } // namespace OCC + \ No newline at end of file diff --git a/src/gui/nmcgui/nmcaccountsettings.h b/src/gui/nmcgui/nmcaccountsettings.h new file mode 100644 index 0000000000000..b8ebc65c86516 --- /dev/null +++ b/src/gui/nmcgui/nmcaccountsettings.h @@ -0,0 +1,85 @@ +/* + * 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_ACCOUNTSETTINGSMAGENTA_H + #define MIRALL_ACCOUNTSETTINGSMAGENTA_H + + #include + #include + #include + #include + + #include + + namespace OCC { + + /** + * @brief A QPushButton with a custom left icon margin. + */ + class CustomButton : public QPushButton { + Q_OBJECT + + public: + explicit CustomButton(const QString &text, const QIcon &icon, QWidget *parent = nullptr) + : QPushButton(text, parent) + , m_icon(icon) + { + setIconSize(QSize(24, 24)); + } + + void setLeftIconMargin(int margin) { m_leftMargin = margin; } + + protected: + void paintEvent(QPaintEvent *event) override { + QPushButton::paintEvent(event); + // Optional icon rendering (currently disabled) + // if (!m_icon.isNull()) { + // QRect iconRect(m_leftMargin, + // (height() - iconSize().height()) / 2, + // iconSize().width(), + // iconSize().height()); + // QPainter painter(this); + // painter.drawPixmap(iconRect, m_icon.pixmap(iconSize())); + // } + } + + private: + QIcon m_icon; + int m_leftMargin = 4; + }; + + /** + * @brief Erweiterte AccountSettings-Ansicht für Magenta. + */ + class NMCAccountSettings : public AccountSettings { + Q_OBJECT + + public: + explicit NMCAccountSettings(AccountState *accountState, QWidget *parent = nullptr); + ~NMCAccountSettings() override = default; + + private: + void setDefaultSettings(); + void setLayout(); + + CustomButton *m_liveAccountButton = nullptr; + QLabel *m_liveTitle = nullptr; + QLabel *m_liveDescription = nullptr; + QLabel *m_folderSync = nullptr; + }; + + } // namespace OCC + + #endif // MIRALL_ACCOUNTSETTINGSMAGENTA_H + \ No newline at end of file diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index dc6ab9cb802ca..c9f0f2a9dda6f 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -12,6 +12,7 @@ #include "generalsettings.h" #include "networksettings.h" #include "accountsettings.h" +#include "nmcgui/nmcaccountsettings.h" #include "configfile.h" #include "progressdispatcher.h" #include "owncloudgui.h" @@ -235,7 +236,7 @@ void SettingsDialog::accountAdded(AccountState *s) } _toolBar->insertAction(_toolBar->actions().at(0), accountAction); - auto accountSettings = new AccountSettings(s, this); + auto accountSettings = new NMCAccountSettings(s, this); QString objectName = QLatin1String("accountSettings_"); objectName += s->account()->displayName(); accountSettings->setObjectName(objectName); @@ -297,7 +298,7 @@ void SettingsDialog::slotAccountDisplayNameChanged() void SettingsDialog::accountRemoved(AccountState *s) { for (auto it = _actionGroupWidgets.begin(); it != _actionGroupWidgets.end(); ++it) { - auto as = qobject_cast(*it); + auto as = qobject_cast(*it); if (!as) { continue; } From e5e4bbd17086b254c8d6fd5ba75c967674e551d7 Mon Sep 17 00:00:00 2001 From: memurats Date: Mon, 27 Oct 2025 14:51:59 +0100 Subject: [PATCH 2/2] 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 81b3bcc44e0bf..5440742d96f7c 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