Skip to content
7 changes: 7 additions & 0 deletions src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,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
Expand Down Expand Up @@ -225,6 +228,10 @@ set(client_SRCS
integration/fileactionsmodel.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
Expand Down
6 changes: 6 additions & 0 deletions src/gui/generalsettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ class GeneralSettings : public QWidget
~GeneralSettings() override;
[[nodiscard]] QSize sizeHint() const override;

protected:
Ui::GeneralSettings *getUi() const
{
return _ui;
}

public slots:
void slotStyleChanged();
#if defined(BUILD_UPDATER)
Expand Down
4 changes: 2 additions & 2 deletions src/gui/ignorelisteditor.ui
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Global Ignore Settings</string>
<string/>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
Expand All @@ -33,7 +33,7 @@
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Files Ignored by Patterns</string>
<string/>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
Expand Down
265 changes: 265 additions & 0 deletions src/gui/nmcgui/nmcgeneralsettings.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
/*
* Copyright (C) by Mauro Mura
*
* 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 "nmcgeneralsettings.h"
#include "generalsettings.h"
#include "nmclibsync/nmcconfigfile.h"
#include "ui_generalsettings.h"
#include "theme.h"

#include <QAbstractButton>
#include <QCheckBox>
#include <QCoreApplication>
#include <QGridLayout>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QSpacerItem>
#include <QVBoxLayout>
#include <QWidget>

#ifdef Q_OS_WIN
#define BACKGROUND_PALETTE "alternate-base"

Check failure on line 33 in src/gui/nmcgui/nmcgeneralsettings.cpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this macro by "const", "constexpr" or an "enum".

See more on https://sonarcloud.io/project/issues?id=nextmcloud_desktop&issues=AZ6HkGcN7dMYJKuEtfnj&open=AZ6HkGcN7dMYJKuEtfnj&pullRequest=384
#else
#define BACKGROUND_PALETTE "light"
#endif

namespace OCC {

NMCGeneralSettings::NMCGeneralSettings(QWidget *parent)
: GeneralSettings(parent)
{
setDefaultSettings();
setNMCLayout();
}

void NMCGeneralSettings::setDefaultSettings()
{
getUi()->monoIconsCheckBox->setVisible(false);
getUi()->chatNotificationsCheckBox->setVisible(false);
getUi()->callNotificationsCheckBox->setVisible(false);
getUi()->quotaWarningNotificationsCheckBox->setVisible(false);

getUi()->advancedGroupBox->setVisible(false);
getUi()->aboutAndUpdatesGroupBox->setVisible(false);
}

void NMCGeneralSettings::setNMCLayout()
{
// General settings
auto *generalSettingsLabel = new QLabel(QCoreApplication::translate("", "GENERAL_SETTINGS"), this);
generalSettingsLabel->setStyleSheet(QStringLiteral("font-size: 12px; font-weight: bold;"));

getUi()->generalGroupBoxTitle->hide();
getUi()->generalGroupBox->layout()->removeWidget(getUi()->generalGroupBoxTitle);
getUi()->generalGroupBox->layout()->removeWidget(getUi()->chatNotificationsCheckBox);
getUi()->generalGroupBox->layout()->removeWidget(getUi()->serverNotificationsCheckBox);
getUi()->generalGroupBox->layout()->removeWidget(getUi()->autostartCheckBox);
getUi()->generalGroupBox->layout()->removeWidget(getUi()->quotaWarningNotificationsCheckBox);

getUi()->generalGroupBox->setTitle({});
getUi()->generalGroupBox->setObjectName(QStringLiteral("nmcGeneralSettingsBox"));
getUi()->generalGroupBox->setAttribute(Qt::WA_StyledBackground, true);
getUi()->generalGroupBox->setStyleSheet(QStringLiteral(
"#nmcGeneralSettingsBox {"
" background: palette(" BACKGROUND_PALETTE ");"
" border-radius: 4px;"
" border: none;"
"}"
));

auto *generalLayout = static_cast<QGridLayout *>(getUi()->generalGroupBox->layout());
generalLayout->addWidget(generalSettingsLabel, 0, 0);
generalLayout->addWidget(getUi()->autostartCheckBox, 1, 0);
generalLayout->addWidget(getUi()->serverNotificationsCheckBox, 2, 0);
generalLayout->setContentsMargins(16, 16, 16, 16);
generalLayout->setSpacing(8);

getUi()->autostartCheckBox->setFocusPolicy(Qt::NoFocus);
getUi()->serverNotificationsCheckBox->setFocusPolicy(Qt::NoFocus);

// Advanced settings
auto *advancedSettingsLabel = new QLabel(QCoreApplication::translate("", "ADVANCED_SETTINGS"), this);
advancedSettingsLabel->setStyleSheet(QStringLiteral("font-size: 12px; font-weight: bold;"));

auto *advancedSettingsBox = new QGroupBox(this);
advancedSettingsBox->setObjectName(QStringLiteral("nmcAdvancedSettingsBox"));
advancedSettingsBox->setAttribute(Qt::WA_StyledBackground, true);
advancedSettingsBox->setTitle({});
advancedSettingsBox->setLayout(new QVBoxLayout);
advancedSettingsBox->layout()->setContentsMargins(16, 16, 16, 16);
advancedSettingsBox->layout()->setSpacing(8);
advancedSettingsBox->setStyleSheet(QStringLiteral(
"#nmcAdvancedSettingsBox {"
" background: palette(" BACKGROUND_PALETTE ");"
" border-radius: 4px;"
" border: none;"
"}"
));

getUi()->horizontalLayout_10->removeWidget(getUi()->showInExplorerNavigationPaneCheckBox);
getUi()->horizontalLayout_trash->removeWidget(getUi()->moveFilesToTrashCheckBox);
getUi()->horizontalLayout_4->removeWidget(getUi()->ignoredFilesButton);

getUi()->horizontalLayout_3->removeWidget(getUi()->newFolderLimitCheckBox);
getUi()->horizontalLayout_3->removeWidget(getUi()->newFolderLimitSpinBox);
getUi()->horizontalLayout_3->removeWidget(getUi()->label);

auto *newFolderLimitWidget = new QWidget(advancedSettingsBox);
newFolderLimitWidget->setContentsMargins(0, 0, 0, 0);
auto *newFolderLimitLayout = new QHBoxLayout(newFolderLimitWidget);
newFolderLimitLayout->setContentsMargins(0, 0, 0, 0);
newFolderLimitLayout->setSpacing(8);

newFolderLimitLayout->addWidget(getUi()->newFolderLimitCheckBox);
newFolderLimitLayout->addWidget(getUi()->newFolderLimitSpinBox);
newFolderLimitLayout->addWidget(getUi()->label);
newFolderLimitLayout->addStretch();

getUi()->newFolderLimitCheckBox->setVisible(true);
getUi()->newFolderLimitSpinBox->setVisible(true);
getUi()->label->setVisible(true);

getUi()->newFolderLimitCheckBox->setFocusPolicy(Qt::NoFocus);
getUi()->newFolderLimitSpinBox->setFocusPolicy(Qt::ClickFocus);
getUi()->newFolderLimitSpinBox->setKeyboardTracking(true);
getUi()->newFolderLimitSpinBox->setEnabled(getUi()->newFolderLimitCheckBox->isChecked());

connect(getUi()->newFolderLimitCheckBox, &QAbstractButton::toggled,
getUi()->newFolderLimitSpinBox, &QWidget::setEnabled);

newFolderLimitWidget->setVisible(true);

getUi()->ignoredFilesButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
getUi()->ignoredFilesButton->setFocusPolicy(Qt::NoFocus);
getUi()->ignoredFilesButton->setStyleSheet(QStringLiteral(
"QPushButton {"
" min-height: 32px;"
" min-width: 200px;"
" border: 1px solid black;"
" color: black;"
" background-color: #ededed;"
" font-size: 13px;"
" border-radius: 4px;"
"}"
"QPushButton:hover {"
" background-color: white;"
"}"
));

advancedSettingsBox->layout()->addWidget(advancedSettingsLabel);
advancedSettingsBox->layout()->addWidget(newFolderLimitWidget);
advancedSettingsBox->layout()->addWidget(getUi()->showInExplorerNavigationPaneCheckBox);
advancedSettingsBox->layout()->addWidget(getUi()->moveFilesToTrashCheckBox);
advancedSettingsBox->layout()->addItem(new QSpacerItem(1, 8, QSizePolicy::Fixed, QSizePolicy::Fixed));
advancedSettingsBox->layout()->addWidget(getUi()->ignoredFilesButton);

getUi()->showInExplorerNavigationPaneCheckBox->setFocusPolicy(Qt::NoFocus);
getUi()->moveFilesToTrashCheckBox->setFocusPolicy(Qt::NoFocus);

getUi()->gridLayout_3->addWidget(advancedSettingsBox, 2, 0);

// Updates & Info
auto *updatesLabel = new QLabel(QCoreApplication::translate("", "UPDATES_SETTINGS"), this);
updatesLabel->setStyleSheet(QStringLiteral("font-size: 12px; font-weight: bold;"));

auto *dataProtectionBox = new QGroupBox(this);
dataProtectionBox->setObjectName(QStringLiteral("nmcUpdatesInfoBox"));
dataProtectionBox->setAttribute(Qt::WA_StyledBackground, true);
dataProtectionBox->setTitle({});
dataProtectionBox->setLayout(new QVBoxLayout);
dataProtectionBox->layout()->setContentsMargins(16, 16, 16, 16);
dataProtectionBox->layout()->setSpacing(8);
dataProtectionBox->setStyleSheet(QStringLiteral(
"#nmcUpdatesInfoBox {"
" background: palette(" BACKGROUND_PALETTE ");"
" border-radius: 4px;"
" border: none;"
"}"
));

auto *dataAnalysisCheckBox = new QCheckBox(this);
dataAnalysisCheckBox->setText(QCoreApplication::translate("", "DATA_ANALYSIS"));
dataAnalysisCheckBox->setFocusPolicy(Qt::NoFocus);

getUi()->autoCheckForUpdatesCheckBox->setFocusPolicy(Qt::NoFocus);

dataProtectionBox->layout()->addWidget(updatesLabel);
dataProtectionBox->layout()->addWidget(getUi()->autoCheckForUpdatesCheckBox);
dataProtectionBox->layout()->addWidget(dataAnalysisCheckBox);

connect(dataAnalysisCheckBox, &QAbstractButton::toggled, this, [](bool toggle) {
NMCConfigFile cfgFile;
cfgFile.setTransferUsageData(toggle, QString());
});

NMCConfigFile cfgFile;
dataAnalysisCheckBox->setChecked(cfgFile.transferUsageData());

dataProtectionBox->layout()->addItem(new QSpacerItem(1, 8, QSizePolicy::Fixed, QSizePolicy::Fixed));

auto *dataAnalysisImpressum = new QLabel(this);
dataAnalysisImpressum->setText(QStringLiteral("<a href=\"https://www.telekom.de/impressum/\"><span style=\"color:#2238df\">%1</span></a>")
.arg(QCoreApplication::translate("", "IMPRESSUM")));
dataAnalysisImpressum->setTextFormat(Qt::RichText);
dataAnalysisImpressum->setTextInteractionFlags(Qt::TextBrowserInteraction);
dataAnalysisImpressum->setOpenExternalLinks(true);
dataAnalysisImpressum->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
dataAnalysisImpressum->setStyleSheet(QStringLiteral("font-size: 13px"));
dataProtectionBox->layout()->addWidget(dataAnalysisImpressum);

auto *dataAnalysisData = new QLabel(this);
dataAnalysisData->setText(QStringLiteral("<a href=\"https://static.magentacloud.de/privacy/datenschutzhinweise_software.pdf\"><span style=\"color:#2238df\">%1</span></a>")
.arg(QCoreApplication::translate("", "DATA_PROTECTION")));
dataAnalysisData->setTextFormat(Qt::RichText);
dataAnalysisData->setTextInteractionFlags(Qt::TextBrowserInteraction);
dataAnalysisData->setOpenExternalLinks(true);
dataAnalysisData->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
dataAnalysisData->setStyleSheet(QStringLiteral("font-size: 13px"));
dataProtectionBox->layout()->addWidget(dataAnalysisData);

auto *dataAnalysisOpenSource = new QLabel(this);
dataAnalysisOpenSource->setText(QStringLiteral("<a href=\"https://static.magentacloud.de/licences/windowsdesktop.html\"><span style=\"color:#2238df\">%1</span></a>")
.arg(QCoreApplication::translate("", "LICENCE")));
dataAnalysisOpenSource->setTextFormat(Qt::RichText);
dataAnalysisOpenSource->setTextInteractionFlags(Qt::TextBrowserInteraction);
dataAnalysisOpenSource->setOpenExternalLinks(true);
dataAnalysisOpenSource->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
dataAnalysisOpenSource->setStyleSheet(QStringLiteral("font-size: 13px"));
dataProtectionBox->layout()->addWidget(dataAnalysisOpenSource);

auto *dataAnalysisFurtherInfo = new QLabel(this);
dataAnalysisFurtherInfo->setText(QStringLiteral("<a href=\"https://cloud.telekom-dienste.de/hilfe\"><span style=\"color:#2238df\">%1</span></a>")
.arg(QCoreApplication::translate("", "FURTHER_INFO")));
dataAnalysisFurtherInfo->setTextFormat(Qt::RichText);
dataAnalysisFurtherInfo->setTextInteractionFlags(Qt::TextBrowserInteraction);
dataAnalysisFurtherInfo->setOpenExternalLinks(true);
dataAnalysisFurtherInfo->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
dataAnalysisFurtherInfo->setStyleSheet(QStringLiteral("font-size: 13px"));
dataProtectionBox->layout()->addWidget(dataAnalysisFurtherInfo);

dataProtectionBox->layout()->addItem(new QSpacerItem(1, 8, QSizePolicy::Fixed, QSizePolicy::Fixed));

auto *currentVersion = new QLabel(this);
currentVersion->setText(Theme::instance()->about());
currentVersion->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
dataProtectionBox->layout()->addWidget(currentVersion);

getUi()->gridLayout_3->addWidget(dataProtectionBox, 3, 0);

auto *vExpandSpacer = new QSpacerItem(1, 1, QSizePolicy::Fixed, QSizePolicy::Expanding);

Check failure on line 261 in src/gui/nmcgui/nmcgeneralsettings.cpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace the use of "new" with an operation that automatically manages the memory.

See more on https://sonarcloud.io/project/issues?id=nextmcloud_desktop&issues=AZ6HkGcN7dMYJKuEtfnk&open=AZ6HkGcN7dMYJKuEtfnk&pullRequest=384
getUi()->gridLayout_3->layout()->addItem(vExpandSpacer);
}

} // namespace OCC
66 changes: 66 additions & 0 deletions src/gui/nmcgui/nmcgeneralsettings.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Copyright (C) by Mauro Mura
*
* 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_GENERALSETTINGSMAGENTA_H
#define MIRALL_GENERALSETTINGSMAGENTA_H

#include "generalsettings.h"

namespace OCC {

/**
* @brief The NMCGeneralSettings class
*
* This class represents the Magenta-specific implementation of general settings
* for a graphical user interface. It inherits from the base class GeneralSettings.
*
* @ingroup gui
*/
class NMCGeneralSettings : public GeneralSettings
{
Q_OBJECT

public:
/**
* @brief Constructor for NMCGeneralSettings
*
* Creates an instance of NMCGeneralSettings with the specified parent widget.
*
* @param parent The parent widget (default is nullptr).
*/
explicit NMCGeneralSettings(QWidget *parent = nullptr);

/**
* @brief Destructor for NMCGeneralSettings
*/
~NMCGeneralSettings() = default;

protected:
/**
* @brief Set default settings
*
* Sets the default values for Magenta-specific general settings.
*/
void setDefaultSettings();

/**
* @brief Set layout
*
* Sets the layout for the Magenta-specific general settings user interface.
*/
void setNMCLayout();
};

} // namespace OCC
#endif // MIRALL_GENERALSETTINGSMAGENTA_H
Loading