Added dark mode

Signed-off-by: Claudio Cambra <claudio.cambra@gmail.com>
This commit is contained in:
Claudio Cambra 2022-02-04 03:39:38 +01:00 committed by Matthieu Gallien (Rebase PR Action)
parent 90f59eca21
commit c342c304ac
46 changed files with 450 additions and 124 deletions

View file

@ -31,6 +31,7 @@
#include <QQuickWindow> #include <QQuickWindow>
#include <QScreen> #include <QScreen>
#include <QMenu> #include <QMenu>
#include <QGuiApplication>
#ifdef USE_FDO_NOTIFICATIONS #ifdef USE_FDO_NOTIFICATIONS
#include <QDBusConnection> #include <QDBusConnection>
@ -129,6 +130,12 @@ Systray::Systray()
}); });
#endif #endif
const auto ptr = qobject_cast<QGuiApplication *>(QGuiApplication::instance());
if(ptr) {
_guiAppInstance.reset(ptr);
connect(ptr, &QGuiApplication::paletteChanged, this, &Systray::darkModeChanged);
}
connect(UserModel::instance(), &UserModel::newUserSelected, connect(UserModel::instance(), &UserModel::newUserSelected,
this, &Systray::slotNewUserSelected); this, &Systray::slotNewUserSelected);
connect(UserModel::instance(), &UserModel::addAccount, connect(UserModel::instance(), &UserModel::addAccount,
@ -224,6 +231,24 @@ bool Systray::useNormalWindow() const
return cfg.showMainDialogAsNormalWindow(); return cfg.showMainDialogAsNormalWindow();
} }
bool Systray::darkMode()
{
#if defined(Q_OS_MACOS)
return osXInDarkMode();
// Windows: Check registry for dark mode
#elif defined(Q_OS_WIN)
const auto darkModeSubkey = QStringLiteral("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize");
if (!Utility::registryKeyExists(HKEY_CURRENT_USER, darkModeSubkey)) {
return false;
}
const auto darkMode = Utility::registryGetKeyValue(HKEY_CURRENT_USER, darkModeSubkey, QStringLiteral("AppsUseLightTheme")).toBool();
return darkMode;
// Probably Linux
#else
return Theme::isDarkColor(QGuiApplication::palette().window().color());
#endif
}
Q_INVOKABLE void Systray::setOpened() Q_INVOKABLE void Systray::setOpened()
{ {
_isOpen = true; _isOpen = true;

View file

@ -27,6 +27,7 @@ class QQmlApplicationEngine;
class QQuickWindow; class QQuickWindow;
class QWindow; class QWindow;
class QQuickWindow; class QQuickWindow;
class QGuiApplication;
namespace OCC { namespace OCC {
@ -39,6 +40,7 @@ public:
}; };
#ifdef Q_OS_OSX #ifdef Q_OS_OSX
bool osXInDarkMode();
bool canOsXSendUserNotification(); bool canOsXSendUserNotification();
void sendOsXUserNotification(const QString &title, const QString &message); void sendOsXUserNotification(const QString &title, const QString &message);
void setTrayWindowLevelAndVisibleOnAllSpaces(QWindow *window); void setTrayWindowLevelAndVisibleOnAllSpaces(QWindow *window);
@ -56,6 +58,7 @@ class Systray
Q_PROPERTY(QString windowTitle READ windowTitle CONSTANT) Q_PROPERTY(QString windowTitle READ windowTitle CONSTANT)
Q_PROPERTY(bool useNormalWindow READ useNormalWindow CONSTANT) Q_PROPERTY(bool useNormalWindow READ useNormalWindow CONSTANT)
Q_PROPERTY(bool darkMode READ darkMode NOTIFY darkModeChanged)
public: public:
static Systray *instance(); static Systray *instance();
@ -71,6 +74,7 @@ public:
bool isOpen(); bool isOpen();
QString windowTitle() const; QString windowTitle() const;
bool useNormalWindow() const; bool useNormalWindow() const;
bool darkMode();
Q_INVOKABLE void pauseResumeSync(); Q_INVOKABLE void pauseResumeSync();
Q_INVOKABLE bool syncIsPaused(); Q_INVOKABLE bool syncIsPaused();
@ -93,6 +97,8 @@ signals:
void showFileActivityDialog(const QString &objectName, const int objectId); void showFileActivityDialog(const QString &objectName, const int objectId);
void sendChatMessage(const QString &token, const QString &message, const QString &replyTo); void sendChatMessage(const QString &token, const QString &message, const QString &replyTo);
void darkModeChanged();
public slots: public slots:
void slotNewUserSelected(); void slotNewUserSelected();
@ -119,6 +125,8 @@ private:
QPointer<QQmlApplicationEngine> _trayEngine; QPointer<QQmlApplicationEngine> _trayEngine;
AccessManagerFactory _accessManagerFactory; AccessManagerFactory _accessManagerFactory;
QScopedPointer<QGuiApplication> _guiAppInstance;
}; };
} // namespace OCC } // namespace OCC

View file

@ -56,4 +56,10 @@ void setTrayWindowLevelAndVisibleOnAllSpaces(QWindow *window)
[nativeWindow setLevel:NSMainMenuWindowLevel]; [nativeWindow setLevel:NSMainMenuWindowLevel];
} }
bool osXInDarkMode()
{
NSString *osxMode = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
return [osxMode containsString:@"Dark"];
}
} }

View file

@ -15,8 +15,8 @@ Item {
property string imageSource: "" property string imageSource: ""
property string imageSourceHover: "" property string imageSourceHover: ""
property color textColor: Style.unifiedSearchResulTitleColor property color textColor: Style.ncTextColor
property color textColorHovered: Style.unifiedSearchResulSublineColor property color textColorHovered: Style.ncSecondaryTextColor
signal clicked() signal clicked()

View file

@ -22,10 +22,6 @@ MouseArea {
height: childrenRect.height height: childrenRect.height
ToolTip.visible: containsMouse && !activityContent.childHovered && model.displayLocation !== ""
ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
ToolTip.text: qsTr("In %1").arg(model.displayLocation)
Accessible.role: Accessible.ListItem Accessible.role: Accessible.ListItem
Accessible.name: (model.path !== "" && model.displayPath !== "") ? qsTr("Open %1 locally").arg(model.displayPath) : model.message Accessible.name: (model.path !== "" && model.displayPath !== "") ? qsTr("Open %1 locally").arg(model.displayPath) : model.message
Accessible.onPressAction: root.clicked() Accessible.onPressAction: root.clicked()
@ -36,6 +32,21 @@ MouseArea {
color: (parent.containsMouse ? Style.lightHover : "transparent") color: (parent.containsMouse ? Style.lightHover : "transparent")
} }
ToolTip {
id: activityMouseAreaTooltip
visible: containsMouse && !activityContent.childHovered && model.displayLocation !== ""
delay: Qt.styleHints.mousePressAndHoldInterval
text: qsTr("In %1").arg(model.displayLocation)
contentItem: Label {
text: activityMouseAreaTooltip.text
color: Style.ncTextColor
}
background: Rectangle {
border.color: Style.menuBorder
color: Style.backgroundColor
}
}
ColumnLayout { ColumnLayout {
anchors.left: root.left anchors.left: root.left
anchors.right: root.right anchors.right: root.right

View file

@ -43,8 +43,8 @@ RowLayout {
imageSource: model.modelData.imageSource imageSource: model.modelData.imageSource
imageSourceHover: model.modelData.imageSourceHovered imageSourceHover: model.modelData.imageSourceHovered
textColor: imageSource !== "" ? UserModel.currentUser.headerColor : Style.unifiedSearchResulSublineColor textColor: imageSource !== "" ? UserModel.currentUser.headerColor : Style.ncTextColor
textColorHovered: imageSource !== "" ? Style.lightHover : Style.unifiedSearchResulTitleColor textColorHovered: imageSource !== "" ? Style.lightHover : Style.ncTextColor
bold: primary bold: primary
@ -67,15 +67,27 @@ RowLayout {
id: moreActionsButton id: moreActionsButton
icon.source: "qrc:///client/theme/more.svg" icon.source: "qrc:///client/theme/more.svg"
icon.color: Style.ncTextColor
background: Rectangle { background: Rectangle {
color: parent.hovered ? "white" : root.moreActionsButtonColor color: parent.hovered ? Style.lightHover : root.moreActionsButtonColor
radius: width / 2 radius: width / 2
} }
ToolTip.visible: hovered ToolTip {
ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval id: moreActionsButtonTooltip
ToolTip.text: qsTr("Show more actions") visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
text: qsTr("Show more actions")
contentItem: Label {
text: moreActionsButtonTooltip.text
color: Style.ncTextColor
}
background: Rectangle {
border.color: Style.menuBorder
color: Style.backgroundColor
}
}
Accessible.name: qsTr("Show more actions") Accessible.name: qsTr("Show more actions")

View file

@ -76,7 +76,12 @@ RowLayout {
anchors.right: if(model.thumbnail !== undefined) parent.right anchors.right: if(model.thumbnail !== undefined) parent.right
anchors.bottom: if(model.thumbnail !== undefined) parent.bottom anchors.bottom: if(model.thumbnail !== undefined) parent.bottom
cache: true cache: true
source: icon
property string sourceUrl: Systray.darkMode ?
model.icon.replace("__COLOR__", "white").replace("__WHITE_GOES_HERE__", "-white") :
model.icon.replace("__COLOR__", "black").replace("__WHITE_GOES_HERE__", "")
source: sourceUrl
sourceSize.height: 64 sourceSize.height: 64
sourceSize.width: 64 sourceSize.width: 64
} }
@ -99,7 +104,8 @@ RowLayout {
wrapMode: Text.Wrap wrapMode: Text.Wrap
maximumLineCount: 2 maximumLineCount: 2
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
color: root.activityData.activityTextTitleColor color: Style.ncTextColor
//color: root.activityData.activityTextTitleColor
} }
Label { Label {
@ -114,6 +120,7 @@ RowLayout {
wrapMode: Text.Wrap wrapMode: Text.Wrap
maximumLineCount: 2 maximumLineCount: 2
font.pixelSize: Style.subLinePixelSize font.pixelSize: Style.subLinePixelSize
color: Style.ncTextColor
} }
Label { Label {
@ -125,8 +132,8 @@ RowLayout {
wrapMode: Text.Wrap wrapMode: Text.Wrap
maximumLineCount: 2 maximumLineCount: 2
font.pixelSize: Style.subLinePixelSize font.pixelSize: Style.subLinePixelSize
color: "#808080" color: Style.ncSecondaryTextColor
} }
Loader { Loader {
id: talkReplyTextFieldLoader id: talkReplyTextFieldLoader
@ -152,9 +159,20 @@ RowLayout {
Layout.margins: Style.roundButtonBackgroundVerticalMargins Layout.margins: Style.roundButtonBackgroundVerticalMargins
ToolTip.visible: hovered ToolTip {
ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval id: dismissActionButtonTooltip
ToolTip.text: qsTr("Dismiss") visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
text: qsTr("Dismiss")
contentItem: Label {
text: dismissActionButtonTooltip.text
color: Style.ncTextColor
}
background: Rectangle {
border.color: Style.menuBorder
color: Style.backgroundColor
}
}
Accessible.name: qsTr("Dismiss") Accessible.name: qsTr("Dismiss")
@ -166,7 +184,9 @@ RowLayout {
contentItem: Image { contentItem: Image {
anchors.fill: parent anchors.fill: parent
source: parent.hovered ? "image://svgimage-custom-color/clear.svg/black" : "image://svgimage-custom-color/clear.svg/grey" source: parent.hovered ? Systray.darkMode ?
"image://svgimage-custom-color/clear.svg/white" : "image://svgimage-custom-color/clear.svg/black" :
"image://svgimage-custom-color/clear.svg/grey"
sourceSize.width: 24 sourceSize.width: 24
sourceSize.height: 24 sourceSize.height: 24
} }

View file

@ -1,6 +1,7 @@
import QtQml 2.15 import QtQml 2.15
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
import Style 1.0
AutoSizingMenu { AutoSizingMenu {
id: moreActionsButtonContextMenu id: moreActionsButtonContextMenu
@ -19,6 +20,7 @@ AutoSizingMenu {
delegate: MenuItem { delegate: MenuItem {
id: moreActionsButtonContextMenuEntry id: moreActionsButtonContextMenuEntry
text: model.modelData.label text: model.modelData.label
palette.windowText: Style.ncTextColor
onTriggered: menuEntryTriggered(model.modelData.actionIndex) onTriggered: menuEntryTriggered(model.modelData.actionIndex)
} }
} }

View file

@ -1,7 +1,13 @@
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
import Style 1.0
Menu { Menu {
background: Rectangle {
border.color: Style.menuBorder
color: Style.backgroundColor
}
width: { width: {
var result = 0; var result = 0;
var padding = 0; var padding = 0;

View file

@ -1,6 +1,7 @@
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2 import QtQuick.Layouts 1.2
import Style 1.0
Button { Button {
id: root id: root
@ -26,6 +27,21 @@ Button {
leftPadding: root.text === "" ? 5 : 10 leftPadding: root.text === "" ? 5 : 10
rightPadding: root.text === "" ? 5 : 10 rightPadding: root.text === "" ? 5 : 10
ToolTip {
id: customButtonTooltip
text: root.toolTipText
delay: Qt.styleHints.mousePressAndHoldInterval
visible: root.toolTipText !== "" && root.hovered
contentItem: Label {
text: customButtonTooltip.text
color: Style.ncTextColor
}
background: Rectangle {
border.color: Style.menuBorder
color: Style.backgroundColor
}
}
contentItem: RowLayout { contentItem: RowLayout {
Image { Image {
id: icon id: icon
@ -52,10 +68,4 @@ Button {
elide: Text.ElideRight elide: Text.ElideRight
} }
} }
ToolTip {
text: root.toolTipText
delay: Qt.styleHints.mousePressAndHoldInterval
visible: root.toolTipText !== "" && root.hovered
}
} }

View file

@ -12,8 +12,8 @@ Label {
height: implicitHeight height: implicitHeight
property color textColor: Style.unifiedSearchResulTitleColor property color textColor: Style.ncTextColor
property color textColorHovered: Style.unifiedSearchResulSublineColor property color textColorHovered: Style.ncSecondaryTextColor
Accessible.role: Accessible.Button Accessible.role: Accessible.Button
Accessible.name: text Accessible.name: text
@ -33,9 +33,18 @@ Label {
signal clicked(QtObject mouse) signal clicked(QtObject mouse)
ToolTip { ToolTip {
id: customTextButtonTooltip
text: root.toolTipText text: root.toolTipText
delay: Qt.styleHints.mousePressAndHoldInterval delay: Qt.styleHints.mousePressAndHoldInterval
visible: root.toolTipText !== "" && root.hovered visible: root.toolTipText !== "" && root.hovered
contentItem: Label {
text: customTextButtonTooltip.text
color: Style.ncTextColor
}
background: Rectangle {
border.color: Style.menuBorder
color: Style.backgroundColor
}
} }
MouseArea { MouseArea {

View file

@ -1,6 +1,8 @@
import QtQml 2.15
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Window 2.15 import QtQuick.Window 2.15
import Style 1.0
import com.nextcloud.desktopclient 1.0 as NC import com.nextcloud.desktopclient 1.0 as NC
Window { Window {
@ -15,6 +17,12 @@ Window {
width: 500 width: 500
height: 500 height: 500
Rectangle {
id: background
anchors.fill: parent
color: Style.backgroundColor
}
ActivityList { ActivityList {
isFileActivityList: true isFileActivityList: true
anchors.fill: parent anchors.fill: parent

View file

@ -18,7 +18,7 @@ Button {
icon.width: Style.headerButtonIconSize icon.width: Style.headerButtonIconSize
icon.height: Style.headerButtonIconSize icon.height: Style.headerButtonIconSize
icon.color: Style.ncTextColor icon.color: Style.ncHeaderTextColor
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
Layout.preferredWidth: Style.trayWindowHeaderHeight Layout.preferredWidth: Style.trayWindowHeaderHeight

View file

@ -62,6 +62,7 @@ RowLayout {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
font.bold: true font.bold: true
color: Style.ncTextColor
} }
Loader { Loader {
@ -84,7 +85,7 @@ RowLayout {
text: syncStatus.syncStatusDetailString text: syncStatus.syncStatusDetailString
visible: syncStatus.syncStatusDetailString !== "" visible: syncStatus.syncStatusDetailString !== ""
color: "#808080" color: Style.ncSecondaryTextColor
font.pixelSize: Style.subLinePixelSize font.pixelSize: Style.subLinePixelSize
} }
} }

View file

@ -28,10 +28,13 @@ TextField {
selectByMouse: true selectByMouse: true
palette.text: Style.ncSecondaryTextColor
background: Rectangle { background: Rectangle {
radius: 5 radius: 5
border.color: parent.activeFocus ? UserModel.currentUser.accentColor : Style.menuBorder border.color: parent.activeFocus ? UserModel.currentUser.accentColor : Style.menuBorder
border.width: 1 border.width: 1
color: Style.backgroundColor
} }
Image { Image {

View file

@ -13,7 +13,7 @@ ColumnLayout {
property int fontSize: Style.topLinePixelSize property int fontSize: Style.topLinePixelSize
property string textColor: "grey" property string textColor: Style.ncSecondaryTextColor
Accessible.role: Accessible.ListItem Accessible.role: Accessible.ListItem
Accessible.name: unifiedSearchResultItemFetchMoreText.text Accessible.name: unifiedSearchResultItemFetchMoreText.text

View file

@ -23,8 +23,8 @@ RowLayout {
property int titleFontSize: Style.topLinePixelSize property int titleFontSize: Style.topLinePixelSize
property int sublineFontSize: Style.subLinePixelSize property int sublineFontSize: Style.subLinePixelSize
property string titleColor: "black" property color titleColor: Style.ncTextColor
property string sublineColor: "grey" property color sublineColor: Style.ncSecondaryTextColor
Accessible.role: Accessible.ListItem Accessible.role: Accessible.ListItem
Accessible.name: resultTitle Accessible.name: resultTitle
@ -65,12 +65,12 @@ RowLayout {
} }
Image { Image {
id: unifiedSearchResultThumbnailPlaceholder id: unifiedSearchResultThumbnailPlaceholder
visible: icons && iconPlaceholder && unifiedSearchResultThumbnail.status !== Image.Ready
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Layout.leftMargin: iconLeftMargin Layout.leftMargin: iconLeftMargin
verticalAlignment: Qt.AlignCenter verticalAlignment: Qt.AlignCenter
cache: true cache: true
source: iconPlaceholder source: iconPlaceholder
visible: false
sourceSize.height: unifiedSearchResultItemDetails.iconWidth sourceSize.height: unifiedSearchResultItemDetails.iconWidth
sourceSize.width: unifiedSearchResultItemDetails.iconWidth sourceSize.width: unifiedSearchResultItemDetails.iconWidth
Layout.preferredWidth: unifiedSearchResultItemDetails.iconWidth Layout.preferredWidth: unifiedSearchResultItemDetails.iconWidth

View file

@ -14,8 +14,8 @@ RowLayout {
property int titleFontSize: Style.topLinePixelSize property int titleFontSize: Style.topLinePixelSize
property int sublineFontSize: Style.subLinePixelSize property int sublineFontSize: Style.subLinePixelSize
property string titleColor: "black" property color titleColor: Style.ncTextColor
property string sublineColor: "grey" property color sublineColor: Style.ncSecondaryTextColor
property string iconColor: "#afafaf" property string iconColor: "#afafaf"

View file

@ -13,9 +13,9 @@ Column {
property int itemHeight: Style.trayWindowHeaderHeight property int itemHeight: Style.trayWindowHeaderHeight
property int titleFontSize: Style.topLinePixelSize property int titleFontSize: Style.topLinePixelSize
property int sublineFontSize: Style.subLinePixelSize property int sublineFontSize: Style.subLinePixelSize
property string titleColor: "black" property color titleColor: Style.ncTextColor
property string sublineColor: "grey" property color sublineColor: Style.ncSecondaryTextColor
property string iconColor: "#afafaf" property color iconColor: "#afafaf"
Repeater { Repeater {
model: 10 model: 10

View file

@ -14,8 +14,8 @@ MouseArea {
property int titleFontSize: Style.topLinePixelSize property int titleFontSize: Style.topLinePixelSize
property int sublineFontSize: Style.subLinePixelSize property int sublineFontSize: Style.subLinePixelSize
property string titleColor: "black" property color titleColor: Style.ncTextColor
property string sublineColor: "grey" property color sublineColor: Style.ncSecondaryTextColor
property string currentFetchMoreInProgressProviderId: "" property string currentFetchMoreInProgressProviderId: ""
@ -33,9 +33,18 @@ MouseArea {
hoverEnabled: enabled hoverEnabled: enabled
ToolTip { ToolTip {
id: unifiedSearchResultMouseAreaTooltip
visible: unifiedSearchResultMouseArea.containsMouse visible: unifiedSearchResultMouseArea.containsMouse
text: isFetchMoreTrigger ? qsTr("Load more results") : model.resultTitle + "\n\n" + model.subline text: isFetchMoreTrigger ? qsTr("Load more results") : model.resultTitle + "\n\n" + model.subline
delay: Qt.styleHints.mousePressAndHoldInterval delay: Qt.styleHints.mousePressAndHoldInterval
contentItem: Label {
text: unifiedSearchResultMouseAreaTooltip.text
color: Style.ncTextColor
}
background: Rectangle {
border.color: Style.menuBorder
color: Style.backgroundColor
}
} }
Rectangle { Rectangle {

View file

@ -35,7 +35,7 @@ ColumnLayout {
Label { Label {
id: unifiedSearchResultsNoResultsLabelDetails id: unifiedSearchResultsNoResultsLabelDetails
text: unifiedSearchResultNothingFoundContainer.text text: unifiedSearchResultNothingFoundContainer.text
color: "black" color: Style.ncTextColor
font.pixelSize: Style.topLinePixelSize * 1.25 font.pixelSize: Style.topLinePixelSize * 1.25
wrapMode: Text.Wrap wrapMode: Text.Wrap
maximumLineCount: 2 maximumLineCount: 2

View file

@ -48,7 +48,7 @@ MenuItem {
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
anchors.margins: 1 anchors.margins: 1
color: parent.parent.hovered || parent.parent.visualFocus ? Style.lightHover : "transparent" color: parent.parent.hovered || parent.parent.visualFocus ? Style.lightHover : Style.backgroundColor
} }
} }
@ -61,7 +61,7 @@ MenuItem {
Layout.leftMargin: 7 Layout.leftMargin: 7
verticalAlignment: Qt.AlignCenter verticalAlignment: Qt.AlignCenter
cache: false cache: false
source: model.avatar != "" ? model.avatar : "image://avatars/fallbackBlack" source: model.avatar != "" ? model.avatar : Systray.darkMode ? "image://avatars/fallbackWhite" : "image://avatars/fallbackBlack"
Layout.preferredHeight: Style.accountAvatarSize Layout.preferredHeight: Style.accountAvatarSize
Layout.preferredWidth: Style.accountAvatarSize Layout.preferredWidth: Style.accountAvatarSize
Rectangle { Rectangle {
@ -100,7 +100,7 @@ MenuItem {
id: accountUser id: accountUser
text: name text: name
elide: Text.ElideRight elide: Text.ElideRight
color: "black" color: Style.ncTextColor
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
font.bold: true font.bold: true
width: parent.width width: parent.width
@ -121,7 +121,7 @@ MenuItem {
visible: model.statusMessage !== "" visible: model.statusMessage !== ""
text: statusMessage text: statusMessage
elide: Text.ElideRight elide: Text.ElideRight
color: "black" color: Style.ncTextColor
font.pixelSize: Style.subLinePixelSize font.pixelSize: Style.subLinePixelSize
leftPadding: Style.accountLabelsSpacing leftPadding: Style.accountLabelsSpacing
} }
@ -132,7 +132,7 @@ MenuItem {
height: Style.topLinePixelSize height: Style.topLinePixelSize
text: server text: server
elide: Text.ElideRight elide: Text.ElideRight
color: "black" color: Style.ncTextColor
font.pixelSize: Style.subLinePixelSize font.pixelSize: Style.subLinePixelSize
} }
} }
@ -146,7 +146,7 @@ MenuItem {
flat: true flat: true
icon.source: "qrc:///client/theme/more.svg" icon.source: "qrc:///client/theme/more.svg"
icon.color: "transparent" icon.color: Style.ncTextColor
Accessible.role: Accessible.ButtonMenu Accessible.role: Accessible.ButtonMenu
Accessible.name: qsTr("Account actions") Accessible.name: qsTr("Account actions")
@ -173,6 +173,7 @@ MenuItem {
background: Rectangle { background: Rectangle {
border.color: Style.menuBorder border.color: Style.menuBorder
color: Style.backgroundColor
radius: 2 radius: 2
} }
@ -181,6 +182,7 @@ MenuItem {
height: visible ? implicitHeight : 0 height: visible ? implicitHeight : 0
text: qsTr("Set status") text: qsTr("Set status")
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
palette.windowText: Style.ncTextColor
hoverEnabled: true hoverEnabled: true
onClicked: { onClicked: {
showUserStatusSelectorDialog(index) showUserStatusSelectorDialog(index)
@ -201,6 +203,7 @@ MenuItem {
MenuItem { MenuItem {
text: model.isConnected ? qsTr("Log out") : qsTr("Log in") text: model.isConnected ? qsTr("Log out") : qsTr("Log in")
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
palette.windowText: Style.ncTextColor
hoverEnabled: true hoverEnabled: true
onClicked: { onClicked: {
model.isConnected ? UserModel.logout(index) : UserModel.login(index) model.isConnected ? UserModel.logout(index) : UserModel.login(index)
@ -234,6 +237,7 @@ MenuItem {
id: removeAccountButton id: removeAccountButton
text: qsTr("Remove account") text: qsTr("Remove account")
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
palette.windowText: Style.ncTextColor
hoverEnabled: true hoverEnabled: true
onClicked: { onClicked: {
UserModel.removeAccount(index) UserModel.removeAccount(index)

View file

@ -111,6 +111,7 @@ Window {
radius: Systray.useNormalWindow ? 0.0 : Style.trayWindowRadius radius: Systray.useNormalWindow ? 0.0 : Style.trayWindowRadius
border.width: Style.trayWindowBorderWidth border.width: Style.trayWindowBorderWidth
border.color: Style.menuBorder border.color: Style.menuBorder
color: Style.backgroundColor
Accessible.role: Accessible.Grouping Accessible.role: Accessible.Grouping
Accessible.name: qsTr("Nextcloud desktop main dialog") Accessible.name: qsTr("Nextcloud desktop main dialog")
@ -137,6 +138,7 @@ Window {
Layout.preferredHeight: Style.trayWindowHeaderHeight Layout.preferredHeight: Style.trayWindowHeaderHeight
display: AbstractButton.IconOnly display: AbstractButton.IconOnly
flat: true flat: true
palette: Style.systemPalette
Accessible.role: Accessible.ButtonMenu Accessible.role: Accessible.ButtonMenu
Accessible.name: qsTr("Current account") Accessible.name: qsTr("Current account")
@ -168,9 +170,11 @@ Window {
width: (Style.currentAccountButtonWidth - 2) width: (Style.currentAccountButtonWidth - 2)
height: Math.min(implicitHeight, maxMenuHeight) height: Math.min(implicitHeight, maxMenuHeight)
closePolicy: Menu.CloseOnPressOutsideParent | Menu.CloseOnEscape closePolicy: Menu.CloseOnPressOutsideParent | Menu.CloseOnEscape
palette: Style.palette
background: Rectangle { background: Rectangle {
border.color: Style.menuBorder border.color: Style.menuBorder
color: Style.backgroundColor
radius: Style.currentAccountButtonRadius radius: Style.currentAccountButtonRadius
} }
@ -216,6 +220,7 @@ Window {
id: addAccountButton id: addAccountButton
height: Style.addAccountButtonHeight height: Style.addAccountButtonHeight
hoverEnabled: true hoverEnabled: true
palette: Theme.systemPalette
background: Item { background: Item {
height: parent.height height: parent.height
@ -234,14 +239,14 @@ Window {
Image { Image {
Layout.leftMargin: 12 Layout.leftMargin: 12
verticalAlignment: Qt.AlignCenter verticalAlignment: Qt.AlignCenter
source: "qrc:///client/theme/black/add.svg" source: Systray.darkMode ? "qrc:///client/theme/white/add.svg" : "qrc:///client/theme/black/add.svg"
sourceSize.width: Style.headerButtonIconSize sourceSize.width: Style.headerButtonIconSize
sourceSize.height: Style.headerButtonIconSize sourceSize.height: Style.headerButtonIconSize
} }
Label { Label {
Layout.leftMargin: 14 Layout.leftMargin: 14
text: qsTr("Add account") text: qsTr("Add account")
color: "black" color: Style.ncTextColor
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
} }
// Filler on the right // Filler on the right
@ -267,6 +272,7 @@ Window {
MenuItem { MenuItem {
id: syncPauseButton id: syncPauseButton
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
palette.windowText: Style.ncTextColor
hoverEnabled: true hoverEnabled: true
onClicked: Systray.pauseResumeSync() onClicked: Systray.pauseResumeSync()
@ -289,6 +295,7 @@ Window {
id: settingsButton id: settingsButton
text: qsTr("Settings") text: qsTr("Settings")
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
palette.windowText: Style.ncTextColor
hoverEnabled: true hoverEnabled: true
onClicked: Systray.openSettings() onClicked: Systray.openSettings()
@ -311,6 +318,7 @@ Window {
id: exitButton id: exitButton
text: qsTr("Exit"); text: qsTr("Exit");
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
palette.windowText: Style.ncTextColor
hoverEnabled: true hoverEnabled: true
onClicked: Systray.shutdown() onClicked: Systray.shutdown()
@ -411,6 +419,7 @@ Window {
text: UserModel.currentUser.name text: UserModel.currentUser.name
elide: Text.ElideRight elide: Text.ElideRight
color: UserModel.currentUser.headerTextColor color: UserModel.currentUser.headerTextColor
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
font.bold: true font.bold: true
} }
@ -566,6 +575,7 @@ Window {
background: Rectangle { background: Rectangle {
border.color: Style.menuBorder border.color: Style.menuBorder
color: Style.backgroundColor
radius: 2 radius: 2
} }
@ -578,10 +588,22 @@ Window {
id: appEntry id: appEntry
text: appName text: appName
font.pixelSize: Style.topLinePixelSize font.pixelSize: Style.topLinePixelSize
palette.windowText: Style.ncTextColor
icon.source: appIconUrl icon.source: appIconUrl
icon.color: Style.ncTextColor
onTriggered: UserAppsModel.openAppUrl(appUrl) onTriggered: UserAppsModel.openAppUrl(appUrl)
hoverEnabled: true hoverEnabled: true
background: Item {
height: parent.height
width: parent.width
Rectangle {
anchors.fill: parent
anchors.margins: 1
color: parent.parent.hovered || parent.parent.visualFocus ? Style.lightHover : "transparent"
}
}
Accessible.role: Accessible.MenuItem Accessible.role: Accessible.MenuItem
Accessible.name: qsTr("Open %1 in browser").arg(appName) Accessible.name: qsTr("Open %1 in browser").arg(appName)
Accessible.onPressAction: appEntry.triggered() Accessible.onPressAction: appEntry.triggered()
@ -713,16 +735,16 @@ Window {
delegate: UnifiedSearchResultListItem { delegate: UnifiedSearchResultListItem {
width: unifiedSearchResultsListView.width width: unifiedSearchResultsListView.width
height: trayWindowBackground.Style.unifiedSearchItemHeight height: Style.unifiedSearchItemHeight
isSearchInProgress: unifiedSearchResultsListView.model.isSearchInProgress isSearchInProgress: unifiedSearchResultsListView.model.isSearchInProgress
textLeftMargin: trayWindowBackground.Style.unifiedSearchResultTextLeftMargin textLeftMargin: Style.unifiedSearchResultTextLeftMargin
textRightMargin: trayWindowBackground.Style.unifiedSearchResultTextRightMargin textRightMargin: Style.unifiedSearchResultTextRightMargin
iconWidth: trayWindowBackground.Style.unifiedSearchResulIconWidth iconWidth: Style.unifiedSearchResulIconWidth
iconLeftMargin: trayWindowBackground.Style.unifiedSearchResulIconLeftMargin iconLeftMargin: Style.unifiedSearchResulIconLeftMargin
titleFontSize: trayWindowBackground.Style.unifiedSearchResulTitleFontSize titleFontSize: Style.unifiedSearchResulTitleFontSize
sublineFontSize: trayWindowBackground.Style.unifiedSearchResulSublineFontSize sublineFontSize: Style.unifiedSearchResulSublineFontSize
titleColor: trayWindowBackground.Style.unifiedSearchResulTitleColor titleColor: Style.ncTextColor
sublineColor: trayWindowBackground.Style.unifiedSearchResulSublineColor sublineColor: Style.ncSecondaryTextColor
currentFetchMoreInProgressProviderId: unifiedSearchResultsListView.model.currentFetchMoreInProgressProviderId currentFetchMoreInProgressProviderId: unifiedSearchResultsListView.model.currentFetchMoreInProgressProviderId
fetchMoreTriggerClicked: unifiedSearchResultsListView.model.fetchMoreTriggerClicked fetchMoreTriggerClicked: unifiedSearchResultsListView.model.fetchMoreTriggerClicked
resultClicked: unifiedSearchResultsListView.model.resultClicked resultClicked: unifiedSearchResultsListView.model.resultClicked

View file

@ -33,6 +33,7 @@
#include "activitydata.h" #include "activitydata.h"
#include "activitylistmodel.h" #include "activitylistmodel.h"
#include "systray.h"
#include "theme.h" #include "theme.h"
@ -215,41 +216,48 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const
} }
case ActionIconRole: { case ActionIconRole: {
auto colorIconPath = QStringLiteral("qrc:///client/theme/__COLOR__/"); // We will replace __COLOR__ in QML
if (a._type == Activity::NotificationType) { if (a._type == Activity::NotificationType) {
return "qrc:///client/theme/black/bell.svg"; colorIconPath.append("bell.svg");
return colorIconPath;
} else if (a._type == Activity::SyncResultType) { } else if (a._type == Activity::SyncResultType) {
return "qrc:///client/theme/black/state-error.svg"; colorIconPath.append("state-error.svg");
return colorIconPath;
} else if (a._type == Activity::SyncFileItemType) { } else if (a._type == Activity::SyncFileItemType) {
if (a._status == SyncFileItem::NormalError if (a._status == SyncFileItem::NormalError
|| a._status == SyncFileItem::FatalError || a._status == SyncFileItem::FatalError
|| a._status == SyncFileItem::DetailError || a._status == SyncFileItem::DetailError
|| a._status == SyncFileItem::BlacklistedError) { || a._status == SyncFileItem::BlacklistedError) {
return "qrc:///client/theme/black/state-error.svg"; colorIconPath.append("state-error.svg");
return colorIconPath;
} else if (a._status == SyncFileItem::SoftError } else if (a._status == SyncFileItem::SoftError
|| a._status == SyncFileItem::Conflict || a._status == SyncFileItem::Conflict
|| a._status == SyncFileItem::Restoration || a._status == SyncFileItem::Restoration
|| a._status == SyncFileItem::FileLocked || a._status == SyncFileItem::FileLocked
|| a._status == SyncFileItem::FileNameInvalid) { || a._status == SyncFileItem::FileNameInvalid) {
return "qrc:///client/theme/black/state-warning.svg"; colorIconPath.append("state-warning.svg");
return colorIconPath;
} else if (a._status == SyncFileItem::FileIgnored) { } else if (a._status == SyncFileItem::FileIgnored) {
return "qrc:///client/theme/black/state-info.svg"; colorIconPath.append("state-info.svg");
return colorIconPath;
} else { } else {
// File sync successful // File sync successful
if (a._fileAction == "file_created") { if (a._fileAction == "file_created") {
return a._previews.empty() ? "qrc:///client/theme/colored/add.svg" return a._previews.empty() ? QStringLiteral("qrc:///client/theme/colored/add.svg")
: "qrc:///client/theme/colored/add-bordered.svg"; : QStringLiteral("qrc:///client/theme/colored/add-bordered.svg");
} else if (a._fileAction == "file_deleted") { } else if (a._fileAction == "file_deleted") {
return a._previews.empty() ? "qrc:///client/theme/colored/delete.svg" return a._previews.empty() ? QStringLiteral("qrc:///client/theme/colored/delete.svg")
: "qrc:///client/theme/colored/delete-bordered.svg"; : QStringLiteral("qrc:///client/theme/colored/delete-bordered.svg");
} else { } else {
return a._previews.empty() ? "qrc:///client/theme/change.svg" return a._previews.empty() ? colorIconPath % QStringLiteral("change.svg")
: "qrc:///client/theme/colored/change-bordered.svg"; : QStringLiteral("qrc:///client/theme/colored/change-bordered.svg");
} }
} }
} else { } else {
// We have an activity // We have an activity
if (a._icon.isEmpty()) { if (a._icon.isEmpty()) {
return "qrc:///client/theme/black/activity.svg"; colorIconPath.append("activity.svg");
return colorIconPath;
} }
return a._icon; return a._icon;
@ -390,7 +398,21 @@ void ActivityListModel::ingestActivities(const QJsonArray &activities)
for (const auto &activ : activities) { for (const auto &activ : activities) {
const auto json = activ.toObject(); const auto json = activ.toObject();
const auto a = Activity::fromActivityJson(json, _accountState->account()); auto a = Activity::fromActivityJson(json, _accountState->account());
auto colorIconPath = QStringLiteral("qrc:///client/theme/__COLOR__/");
if(a._icon.contains("change.svg")) {
colorIconPath.append("change.svg");
a._icon = colorIconPath;
} else if(a._icon.contains("calendar.svg")) {
colorIconPath.append("calendar.svg");
a._icon = colorIconPath;
} else if(a._icon.contains("personal.svg")) {
colorIconPath.append("user.svg");
a._icon = colorIconPath;
} else if(a._icon.contains("core/img/actions")) {
a._icon.insert(a._icon.indexOf(".svg"), "__WHITE_GOES_HERE__");
}
list.append(a); list.append(a);
_currentItem = list.last()._id; _currentItem = list.last()._id;

View file

@ -115,6 +115,7 @@ signals:
void sendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row); void sendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row);
protected: protected:
void setup();
void activitiesReceived(const QJsonDocument &json, int statusCode); void activitiesReceived(const QJsonDocument &json, int statusCode);
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;

View file

@ -19,6 +19,7 @@
#include "guiutility.h" #include "guiutility.h"
#include "folderman.h" #include "folderman.h"
#include "networkjobs.h" #include "networkjobs.h"
#include "systray.h"
#include <algorithm> #include <algorithm>
@ -30,17 +31,17 @@ QString imagePlaceholderUrlForProviderId(const QString &providerId)
{ {
if (providerId.contains(QStringLiteral("message"), Qt::CaseInsensitive) if (providerId.contains(QStringLiteral("message"), Qt::CaseInsensitive)
|| providerId.contains(QStringLiteral("talk"), Qt::CaseInsensitive)) { || providerId.contains(QStringLiteral("talk"), Qt::CaseInsensitive)) {
return QStringLiteral("qrc:///client/theme/black/wizard-talk.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral("qrc:///client/theme/white/wizard-talk.svg") : QStringLiteral("qrc:///client/theme/black/wizard-talk.svg");
} else if (providerId.contains(QStringLiteral("file"), Qt::CaseInsensitive)) { } else if (providerId.contains(QStringLiteral("file"), Qt::CaseInsensitive)) {
return QStringLiteral("qrc:///client/theme/black/edit.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral("qrc:///client/theme/white/edit.svg") : QStringLiteral("qrc:///client/theme/black/edit.svg");
} else if (providerId.contains(QStringLiteral("deck"), Qt::CaseInsensitive)) { } else if (providerId.contains(QStringLiteral("deck"), Qt::CaseInsensitive)) {
return QStringLiteral("qrc:///client/theme/black/deck.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral("qrc:///client/theme/white/deck.svg") : QStringLiteral("qrc:///client/theme/black/deck.svg");
} else if (providerId.contains(QStringLiteral("calendar"), Qt::CaseInsensitive)) { } else if (providerId.contains(QStringLiteral("calendar"), Qt::CaseInsensitive)) {
return QStringLiteral("qrc:///client/theme/black/calendar.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral("qrc:///client/theme/white/calendar.svg") : QStringLiteral("qrc:///client/theme/black/calendar.svg");
} else if (providerId.contains(QStringLiteral("mail"), Qt::CaseInsensitive)) { } else if (providerId.contains(QStringLiteral("mail"), Qt::CaseInsensitive)) {
return QStringLiteral("qrc:///client/theme/black/email.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral("qrc:///client/theme/white/email.svg") : QStringLiteral("qrc:///client/theme/black/email.svg");
} else if (providerId.contains(QStringLiteral("comment"), Qt::CaseInsensitive)) { } else if (providerId.contains(QStringLiteral("comment"), Qt::CaseInsensitive)) {
return QStringLiteral("qrc:///client/theme/black/comment.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral("qrc:///client/theme/white/comment.svg") : QStringLiteral("qrc:///client/theme/black/comment.svg");
} }
return QStringLiteral("qrc:///client/theme/change.svg"); return QStringLiteral("qrc:///client/theme/change.svg");
@ -50,20 +51,20 @@ QString localIconPathFromIconPrefix(const QString &iconNameWithPrefix)
{ {
if (iconNameWithPrefix.contains(QStringLiteral("message"), Qt::CaseInsensitive) if (iconNameWithPrefix.contains(QStringLiteral("message"), Qt::CaseInsensitive)
|| iconNameWithPrefix.contains(QStringLiteral("talk"), Qt::CaseInsensitive)) { || iconNameWithPrefix.contains(QStringLiteral("talk"), Qt::CaseInsensitive)) {
return QStringLiteral(":/client/theme/black/wizard-talk.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral(":/client/theme/white/wizard-talk.svg") : QStringLiteral(":/client/theme/black/wizard-talk.svg");
} else if (iconNameWithPrefix.contains(QStringLiteral("folder"), Qt::CaseInsensitive)) { } else if (iconNameWithPrefix.contains(QStringLiteral("folder"), Qt::CaseInsensitive)) {
return QStringLiteral(":/client/theme/black/folder.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral(":/client/theme/white/folder.svg") : QStringLiteral(":/client/theme/black/folder.svg");
} else if (iconNameWithPrefix.contains(QStringLiteral("deck"), Qt::CaseInsensitive)) { } else if (iconNameWithPrefix.contains(QStringLiteral("deck"), Qt::CaseInsensitive)) {
return QStringLiteral(":/client/theme/black/deck.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral(":/client/theme/white/deck.svg") : QStringLiteral(":/client/theme/black/deck.svg");
} else if (iconNameWithPrefix.contains(QStringLiteral("contacts"), Qt::CaseInsensitive)) { } else if (iconNameWithPrefix.contains(QStringLiteral("contacts"), Qt::CaseInsensitive)) {
return QStringLiteral(":/client/theme/black/wizard-groupware.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral(":/client/theme/white/wizard-groupware.svg") : QStringLiteral(":/client/theme/black/wizard-groupware.svg");
} else if (iconNameWithPrefix.contains(QStringLiteral("calendar"), Qt::CaseInsensitive)) { } else if (iconNameWithPrefix.contains(QStringLiteral("calendar"), Qt::CaseInsensitive)) {
return QStringLiteral(":/client/theme/black/calendar.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral(":/client/theme/white/calendar.svg") : QStringLiteral(":/client/theme/black/calendar.svg");
} else if (iconNameWithPrefix.contains(QStringLiteral("mail"), Qt::CaseInsensitive)) { } else if (iconNameWithPrefix.contains(QStringLiteral("mail"), Qt::CaseInsensitive)) {
return QStringLiteral(":/client/theme/black/email.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral(":/client/theme/white/email.svg") : QStringLiteral(":/client/theme/black/email.svg");
} }
return QStringLiteral(":/client/theme/change.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral(":/client/theme/white/change.svg") : QStringLiteral(":/client/theme/change.svg");
} }
QString iconUrlForDefaultIconName(const QString &defaultIconName) QString iconUrlForDefaultIconName(const QString &defaultIconName)
@ -78,17 +79,18 @@ QString iconUrlForDefaultIconName(const QString &defaultIconName)
const auto parts = defaultIconName.split(QLatin1Char('-')); const auto parts = defaultIconName.split(QLatin1Char('-'));
if (parts.size() > 1) { if (parts.size() > 1) {
const QString blackOrWhite = OCC::Systray::instance()->darkMode() ? QStringLiteral(":/client/theme/white/") : QStringLiteral(":/client/theme/black/");
const QString blackIconFilePath = blackOrWhite + parts[1] + QStringLiteral(".svg");
if (QFile::exists(blackIconFilePath)) {
return blackIconFilePath;
}
const QString iconFilePath = QStringLiteral(":/client/theme/") + parts[1] + QStringLiteral(".svg"); const QString iconFilePath = QStringLiteral(":/client/theme/") + parts[1] + QStringLiteral(".svg");
if (QFile::exists(iconFilePath)) { if (QFile::exists(iconFilePath)) {
return iconFilePath; return iconFilePath;
} }
const QString blackIconFilePath = QStringLiteral(":/client/theme/black/") + parts[1] + QStringLiteral(".svg");
if (QFile::exists(blackIconFilePath)) {
return blackIconFilePath;
}
} }
const auto iconNameFromIconPrefix = localIconPathFromIconPrefix(defaultIconName); const auto iconNameFromIconPrefix = localIconPathFromIconPrefix(defaultIconName);
@ -98,7 +100,7 @@ QString iconUrlForDefaultIconName(const QString &defaultIconName)
} }
} }
return QStringLiteral(":/client/theme/change.svg"); return OCC::Systray::instance()->darkMode() ? QStringLiteral(":/client/theme/white/change.svg") : QStringLiteral(":/client/theme/change.svg");
} }
QString generateUrlForThumbnail(const QString &thumbnailUrl, const QUrl &serverUrl) QString generateUrlForThumbnail(const QString &thumbnailUrl, const QUrl &serverUrl)
@ -123,57 +125,59 @@ QString generateUrlForThumbnail(const QString &thumbnailUrl, const QUrl &serverU
return thumbnailUrlCopy; return thumbnailUrlCopy;
} }
QString generateUrlForIcon(const QString &fallackIcon, const QUrl &serverUrl) QString generateUrlForIcon(const QString &fallbackIcon, const QUrl &serverUrl)
{ {
auto serverUrlCopy = serverUrl; auto serverUrlCopy = serverUrl;
auto fallackIconCopy = fallackIcon; auto fallbackIconCopy = fallbackIcon;
if (fallackIconCopy.startsWith(QLatin1Char('/')) || fallackIconCopy.startsWith(QLatin1Char('\\'))) { if (fallbackIconCopy.startsWith(QLatin1Char('/')) || fallbackIconCopy.startsWith(QLatin1Char('\\'))) {
// relative image resource URL, just needs some concatenation with current server URL // relative image resource URL, just needs some concatenation with current server URL
// some icons may contain parameters after (?) // some icons may contain parameters after (?)
const QStringList fallackIconPathSplitted = const QStringList fallbackIconPathSplitted =
fallackIconCopy.contains(QLatin1Char('?')) ? fallackIconCopy.split(QLatin1Char('?')) : QStringList{fallackIconCopy}; fallbackIconCopy.contains(QLatin1Char('?')) ? fallbackIconCopy.split(QLatin1Char('?')) : QStringList{fallbackIconCopy};
Q_ASSERT(!fallackIconPathSplitted.isEmpty()); Q_ASSERT(!fallbackIconPathSplitted.isEmpty());
serverUrlCopy.setPath(fallackIconPathSplitted[0]); serverUrlCopy.setPath(fallbackIconPathSplitted[0]);
fallackIconCopy = serverUrlCopy.toString(); fallbackIconCopy = serverUrlCopy.toString();
if (fallackIconPathSplitted.size() > 1) { if (fallbackIconPathSplitted.size() > 1) {
fallackIconCopy += QLatin1Char('?') + fallackIconPathSplitted[1]; fallbackIconCopy += QLatin1Char('?') + fallbackIconPathSplitted[1];
} }
} else if (!fallackIconCopy.isEmpty()) { } else if (!fallbackIconCopy.isEmpty()) {
// could be one of names for standard icons (e.g. icon-mail) // could be one of names for standard icons (e.g. icon-mail)
const auto defaultIconUrl = iconUrlForDefaultIconName(fallackIconCopy); const auto defaultIconUrl = iconUrlForDefaultIconName(fallbackIconCopy);
if (!defaultIconUrl.isEmpty()) { if (!defaultIconUrl.isEmpty()) {
fallackIconCopy = defaultIconUrl; fallbackIconCopy = defaultIconUrl;
} }
} }
return fallackIconCopy; return fallbackIconCopy;
} }
QString iconsFromThumbnailAndFallbackIcon(const QString &thumbnailUrl, const QString &fallackIcon, const QUrl &serverUrl) QString iconsFromThumbnailAndFallbackIcon(const QString &thumbnailUrl, const QString &fallbackIcon, const QUrl &serverUrl)
{ {
if (thumbnailUrl.isEmpty() && fallackIcon.isEmpty()) { if (thumbnailUrl.isEmpty() && fallbackIcon.isEmpty()) {
return {}; return {};
} }
if (serverUrl.isEmpty()) { if (serverUrl.isEmpty()) {
const QStringList listImages = {thumbnailUrl, fallackIcon}; const QStringList listImages = {thumbnailUrl, fallbackIcon};
return listImages.join(QLatin1Char(';')); return listImages.join(QLatin1Char(';'));
} }
const auto urlForThumbnail = generateUrlForThumbnail(thumbnailUrl, serverUrl); const auto urlForThumbnail = generateUrlForThumbnail(thumbnailUrl, serverUrl);
const auto urlForFallackIcon = generateUrlForIcon(fallackIcon, serverUrl); const auto urlForFallbackIcon = generateUrlForIcon(fallbackIcon, serverUrl);
if (urlForThumbnail.isEmpty() && !urlForFallackIcon.isEmpty()) { qDebug() << "SEARCH" << urlForThumbnail << urlForFallbackIcon;
return urlForFallackIcon;
if (urlForThumbnail.isEmpty() && !urlForFallbackIcon.isEmpty()) {
return urlForFallbackIcon;
} }
if (!urlForThumbnail.isEmpty() && urlForFallackIcon.isEmpty()) { if (!urlForThumbnail.isEmpty() && urlForFallbackIcon.isEmpty()) {
return urlForThumbnail; return urlForThumbnail;
} }
const QStringList listImages{urlForThumbnail, urlForFallackIcon}; const QStringList listImages{urlForThumbnail, urlForFallbackIcon};
return listImages.join(QLatin1Char(';')); return listImages.join(QLatin1Char(';'));
} }

View file

@ -899,4 +899,16 @@ QColor Theme::errorBoxBorderColor() const
return QColor{"black"}; return QColor{"black"};
} }
QPalette Theme::systemPalette()
{
if(!_guiAppInstance) {
const auto ptr = qobject_cast<QGuiApplication *>(QGuiApplication::instance());
if(ptr) {
_guiAppInstance.reset(ptr);
connect(ptr, &QGuiApplication::paletteChanged, this, &Theme::systemPaletteChanged);
}
}
return QGuiApplication::palette();
}
} // end namespace client } // end namespace client

View file

@ -17,6 +17,8 @@
#include <QIcon> #include <QIcon>
#include <QObject> #include <QObject>
#include <QPalette>
#include <QGuiApplication>
#include "syncresult.h" #include "syncresult.h"
class QString; class QString;
@ -24,7 +26,6 @@ class QObject;
class QPixmap; class QPixmap;
class QColor; class QColor;
class QPaintDevice; class QPaintDevice;
class QPalette;
namespace OCC { namespace OCC {
@ -66,6 +67,8 @@ class OWNCLOUDSYNC_EXPORT Theme : public QObject
Q_PROPERTY(QColor errorBoxTextColor READ errorBoxTextColor CONSTANT) Q_PROPERTY(QColor errorBoxTextColor READ errorBoxTextColor CONSTANT)
Q_PROPERTY(QColor errorBoxBackgroundColor READ errorBoxBackgroundColor CONSTANT) Q_PROPERTY(QColor errorBoxBackgroundColor READ errorBoxBackgroundColor CONSTANT)
Q_PROPERTY(QColor errorBoxBorderColor READ errorBoxBorderColor CONSTANT) Q_PROPERTY(QColor errorBoxBorderColor READ errorBoxBorderColor CONSTANT)
Q_PROPERTY(QPalette systemPalette READ systemPalette NOTIFY systemPaletteChanged)
public: public:
enum CustomMediaType { enum CustomMediaType {
oCSetupTop, // ownCloud connect page oCSetupTop, // ownCloud connect page
@ -590,6 +593,8 @@ public:
static constexpr const char *themePrefix = ":/client/theme/"; static constexpr const char *themePrefix = ":/client/theme/";
QPalette systemPalette();
protected: protected:
#ifndef TOKEN_AUTH_ONLY #ifndef TOKEN_AUTH_ONLY
QIcon themeIcon(const QString &name, bool sysTray = false) const; QIcon themeIcon(const QString &name, bool sysTray = false) const;
@ -606,6 +611,7 @@ protected:
signals: signals:
void systrayUseMonoIconsChanged(bool); void systrayUseMonoIconsChanged(bool);
void systemPaletteChanged(const QPalette &palette);
private: private:
Theme(Theme const &); Theme(Theme const &);
@ -613,6 +619,7 @@ private:
static Theme *_instance; static Theme *_instance;
bool _mono = false; bool _mono = false;
QScopedPointer<QGuiApplication> _guiAppInstance;
#ifndef TOKEN_AUTH_ONLY #ifndef TOKEN_AUTH_ONLY
mutable QHash<QString, QIcon> _iconCache; mutable QHash<QString, QIcon> _iconCache;
#endif #endif

View file

@ -92,6 +92,7 @@
<file>theme/colored/folder@2x.png</file> <file>theme/colored/folder@2x.png</file>
<file>theme/black/control-next.svg</file> <file>theme/black/control-next.svg</file>
<file>theme/black/control-prev.svg</file> <file>theme/black/control-prev.svg</file>
<file>theme/black/settings.svg</file>
<file>theme/black/state-error.svg</file> <file>theme/black/state-error.svg</file>
<file>theme/black/state-error-16.png</file> <file>theme/black/state-error-16.png</file>
<file>theme/black/state-offline.svg</file> <file>theme/black/state-offline.svg</file>
@ -112,10 +113,21 @@
<file>theme/black/state-warning-64.png</file> <file>theme/black/state-warning-64.png</file>
<file>theme/black/state-warning-128.png</file> <file>theme/black/state-warning-128.png</file>
<file>theme/black/state-warning-256.png</file> <file>theme/black/state-warning-256.png</file>
<file>theme/white/bell.svg</file>
<file>theme/white/calendar.svg</file>
<file>theme/white/change.svg</file>
<file>theme/white/close.svg</file>
<file>theme/white/confirm.svg</file>
<file>theme/white/control-next.svg</file> <file>theme/white/control-next.svg</file>
<file>theme/white/control-prev.svg</file> <file>theme/white/control-prev.svg</file>
<file>theme/white/comment.svg</file>
<file>theme/white/deck.svg</file>
<file>theme/white/edit.svg</file>
<file>theme/white/email.svg</file>
<file>theme/white/settings.svg</file>
<file>theme/white/state-error.svg</file> <file>theme/white/state-error.svg</file>
<file>theme/white/state-error-16.png</file> <file>theme/white/state-error-16.png</file>
<file>theme/white/state-info.svg</file>
<file>theme/white/state-offline.svg</file> <file>theme/white/state-offline.svg</file>
<file>theme/white/state-offline-16.png</file> <file>theme/white/state-offline-16.png</file>
<file>theme/white/state-offline-32.png</file> <file>theme/white/state-offline-32.png</file>
@ -136,6 +148,7 @@
<file>theme/white/state-warning-256.png</file> <file>theme/white/state-warning-256.png</file>
<file>theme/white/wizard-files.png</file> <file>theme/white/wizard-files.png</file>
<file>theme/white/wizard-files@2x.png</file> <file>theme/white/wizard-files@2x.png</file>
<file>theme/white/wizard-groupware.svg</file>
<file>theme/white/wizard-groupware.png</file> <file>theme/white/wizard-groupware.png</file>
<file>theme/white/wizard-groupware@2x.png</file> <file>theme/white/wizard-groupware@2x.png</file>
<file>theme/white/wizard-nextcloud.png</file> <file>theme/white/wizard-nextcloud.png</file>
@ -183,6 +196,8 @@
<file>theme/black/deck.svg</file> <file>theme/black/deck.svg</file>
<file>theme/black/state-info.svg</file> <file>theme/black/state-info.svg</file>
<file>theme/close.svg</file> <file>theme/close.svg</file>
<file>theme/black/close.svg</file>
<file>theme/white/close.svg</file>
<file>theme/files.svg</file> <file>theme/files.svg</file>
<file>theme/public.svg</file> <file>theme/public.svg</file>
<file>theme/settings.svg</file> <file>theme/settings.svg</file>

View file

@ -8,15 +8,18 @@ QtObject {
readonly property int pixelSize: fontMetrics.font.pixelSize readonly property int pixelSize: fontMetrics.font.pixelSize
// Colors // Colors
property color ncBlue: Theme.wizardHeaderBackgroundColor readonly property color ncBlue: Theme.wizardHeaderBackgroundColor
property color ncTextColor: Theme.wizardHeaderTitleColor readonly property color ncTextColor: Theme.systemPalette.windowText
property color lightHover: "#f7f7f7" readonly property color ncSecondaryTextColor: "#808080"
property color menuBorder: "#bdbdbd" readonly property color ncHeaderTextColor: "white"
readonly property color lightHover: Theme.systemPalette.highlight
readonly property color menuBorder: Systray.darkMode ? Qt.lighter(backgroundColor, 3) : Qt.darker(backgroundColor, 1.5)
readonly property color backgroundColor: Theme.systemPalette.base
// ErrorBox colors // ErrorBox colors
property color errorBoxTextColor: Theme.errorBoxTextColor readonly property color errorBoxTextColor: Theme.errorBoxTextColor
property color errorBoxBackgroundColor: Theme.errorBoxBackgroundColor readonly property color errorBoxBackgroundColor: Theme.errorBoxBackgroundColor
property color errorBoxBorderColor: Theme.errorBoxBorderColor readonly property color errorBoxBorderColor: Theme.errorBoxBorderColor
// Fonts // Fonts
// We are using pixel size because this is cross platform comparable, point size isn't // We are using pixel size because this is cross platform comparable, point size isn't
@ -79,8 +82,6 @@ QtObject {
readonly property int unifiedSearchResulIconLeftMargin: 12 readonly property int unifiedSearchResulIconLeftMargin: 12
readonly property int unifiedSearchResulTitleFontSize: topLinePixelSize readonly property int unifiedSearchResulTitleFontSize: topLinePixelSize
readonly property int unifiedSearchResulSublineFontSize: subLinePixelSize readonly property int unifiedSearchResulSublineFontSize: subLinePixelSize
readonly property string unifiedSearchResulTitleColor: "black"
readonly property string unifiedSearchResulSublineColor: "grey"
readonly property var fontMetrics: FontMetrics {} readonly property var fontMetrics: FontMetrics {}

1
theme/black/change.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" version="1.1" height="16"><path d="m8 2c-2.142 0-4.125 1.145-5.196 3l1.948 1.125c0.671-1.162 1.906-1.875 3.2476-1.875 1.1906 0 2.297 0.56157 3 1.5l-1.5 1.5h4.5v-4.5l-1.406 1.406c-1.129-1.348-2.802-2.1563-4.594-2.1563z"/><path d="m2 8.75v4.5l1.408-1.41c1.116 1.334 2.817 2.145 4.592 2.16 2.16 0.01827 4.116-1.132 5.196-3.002l-1.948-1.125c-0.677 1.171-1.9005 1.886-3.248 1.875-1.18-0.01-2.3047-0.572-3-1.5l1.5-1.5z"/></svg>

After

Width:  |  Height:  |  Size: 493 B

1
theme/black/close.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"><path d="m12.95 11.536l-1.414 1.414-3.536-3.536-3.535 3.536-1.415-1.414 3.536-3.536-3.536-3.536 1.415-1.414 3.535 3.536 3.516-3.555 1.434 1.434-3.536 3.535z"/></svg>

After

Width:  |  Height:  |  Size: 243 B

1
theme/black/confirm.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" version="1.1" height="16"><path d="m8.5 0.5c-0.8974 0-1.3404 1.0909-0.6973 1.7168l4.7837 4.7832h-11.573c-1.3523-0.019125-1.3523 2.0191 0 2h11.572l-4.7832 4.7832c-0.98163 0.94251 0.47155 2.3957 1.4141 1.4141l6.4911-6.49c0.387-0.3878 0.391-1.0228 0-1.414l-6.4906-6.4903c-0.1883-0.1935-0.4468-0.30268-0.7168-0.3027z"/></svg>

After

Width:  |  Height:  |  Size: 393 B

1
theme/black/settings.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><g><path d="M0,0h24v24H0V0z" fill="none"/><path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"/></g></svg>

After

Width:  |  Height:  |  Size: 1 KiB

2
theme/white/activity.svg Normal file
View file

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1"><path fill="#fff" d="m32 2-20 36h22l-2 24 20-36h-22z"/>
</svg>

After

Width:  |  Height:  |  Size: 140 B

39
theme/white/bell.svg Normal file
View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
width="16"
version="1.1"
viewBox="0 0 16 16"
id="svg4"
sodipodi:docname="bell.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#ffffff"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="39.375"
inkscape:cx="8"
inkscape:cy="8"
inkscape:window-width="1471"
inkscape:window-height="826"
inkscape:window-x="170"
inkscape:window-y="133"
inkscape:window-maximized="0"
inkscape:current-layer="svg4" />
<path
d="m8 2c-0.5523 0-1 0.4477-1 1 0 0.0472 0.021 0.0873 0.0273 0.1328-1.7366 0.4362-3.0273 1.9953-3.0273 3.8672v2l-1 1v1h10v-1l-1-1v-2c0-1.8719-1.291-3.431-3.0273-3.8672 0.0063-0.0455 0.0273-0.0856 0.0273-0.1328 0-0.5523-0.4477-1-1-1zm-2 10c0 1.1046 0.8954 2 2 2s2-0.8954 2-2z"
fill="#ffffff"
id="path2"
style="fill:#ffffff;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
theme/white/calendar.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" version="1.1" height="32" viewbox="0 0 32 32"><path fill="#fff" d="m8 2c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm16 0c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm-13 4v2c0 1.662-1.338 3-3 3s-3-1.338-3-3v-1.875a3.993 3.993 0 0 0 -3 3.875v16c0 2.216 1.784 4 4 4h20c2.216 0 4-1.784 4-4v-16a3.993 3.993 0 0 0 -3 -3.875v1.875c0 1.662-1.338 3-3 3s-3-1.338-3-3v-2zm-4.906 10h19.812a0.09 0.09 0 0 1 0.094 0.094v9.812a0.09 0.09 0 0 1 -0.094 0.094h-19.812a0.09 0.09 0 0 1 -0.094 -0.094v-9.812a0.09 0.09 0 0 1 0.094 -0.094z"/></svg>

After

Width:  |  Height:  |  Size: 646 B

1
theme/white/change.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" version="1.1" height="16"><path fill="#fff" d="m8 2c-2.142 0-4.125 1.145-5.196 3l1.948 1.125c0.671-1.162 1.906-1.875 3.2476-1.875 1.1906 0 2.297 0.56157 3 1.5l-1.5 1.5h4.5v-4.5l-1.406 1.406c-1.129-1.348-2.802-2.1563-4.594-2.1563z"/><path fill="#fff" d="m2 8.75v4.5l1.408-1.41c1.116 1.334 2.817 2.145 4.592 2.16 2.16 0.01827 4.116-1.132 5.196-3.002l-1.948-1.125c-0.677 1.171-1.9005 1.886-3.248 1.875-1.18-0.01-2.3047-0.572-3-1.5l1.5-1.5z"/></svg>

After

Width:  |  Height:  |  Size: 517 B

1
theme/white/close.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"><path fill="#fff" d="m12.95 11.536l-1.414 1.414-3.536-3.536-3.535 3.536-1.415-1.414 3.536-3.536-3.536-3.536 1.415-1.414 3.535 3.536 3.516-3.555 1.434 1.434-3.536 3.535z"/></svg>

After

Width:  |  Height:  |  Size: 255 B

1
theme/white/comment.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#fff"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18zM20 4v13.17L18.83 16H4V4h16zM6 12h12v2H6zm0-3h12v2H6zm0-3h12v2H6z"/></svg>

After

Width:  |  Height:  |  Size: 299 B

1
theme/white/confirm.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" version="1.1" height="16"><path fill="#fff" d="m8.5 0.5c-0.8974 0-1.3404 1.0909-0.6973 1.7168l4.7837 4.7832h-11.573c-1.3523-0.019125-1.3523 2.0191 0 2h11.572l-4.7832 4.7832c-0.98163 0.94251 0.47155 2.3957 1.4141 1.4141l6.4911-6.49c0.387-0.3878 0.391-1.0228 0-1.414l-6.4906-6.4903c-0.1883-0.1935-0.4468-0.30268-0.7168-0.3027z"/></svg>

After

Width:  |  Height:  |  Size: 405 B

8
theme/white/deck.svg Normal file
View file

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16">
<g fill="#fff">
<rect ry="1" height="8" width="14" y="7" x="1"/>
<rect ry=".5" height="1" width="12" y="5" x="2"/>
<rect ry=".5" height="1" width="10" y="3" x="3"/>
<rect ry=".5" height="1" width="8" y="1" x="4"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 364 B

47
theme/white/edit.svg Normal file
View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg2"
width="16"
height="16"
viewBox="0 0 16 16"
sodipodi:docname="edit.svg"
inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs6" />
<sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="5.8388225"
inkscape:cx="39.99094"
inkscape:cy="20.466455"
inkscape:window-width="2560"
inkscape:window-height="1367"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g8"
inkscape:snap-bbox="true"
width="16px" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g8">
<path
style="fill:#fff;stroke-width:0.237748"
d="m 8.0529525,14.60266 -5.533428,0.06384 -0.117155,-0.305305 -0.117156,-0.305304 0.06349,-6.2966204 0.06349,-6.2966201 4.281826,-0.064566 4.2818265,-0.064584 1.36947,1.3839101 1.36947,1.3839101 -0.06421,5.2187458 -0.06421,5.2187625 z m -1.95565,-1.84695 h 1.901987 v -0.475502 -0.475503 h -1.901987 -1.901988 v 0.475503 0.475502 z M 7.9992895,9.9027285 H 11.803266 V 9.4272255 8.9517225 H 7.9992895 4.1953145 v 0.475503 0.475503 z m -1.42649,-2.8529819 h 2.377485 v -0.475503 -0.475503 h -2.377485 -2.377485 v 0.475503 0.475503 z m 0.475496,-2.8529817 h 2.852983 V 3.721262 3.2457591 H 7.0482955 4.1953145 V 3.721262 4.1967649 Z"
id="path783" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

1
theme/white/email.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 24 24" width="16px" fill="#fff"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></svg>

After

Width:  |  Height:  |  Size: 264 B

1
theme/white/settings.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#fff"><g><path d="M0,0h24v24H0V0z" fill="none"/><path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"/></g></svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4.2333 4.2333" version="1.1" height="16" width="16"><g id="g3830" transform="matrix(.87498 0 0 .87498 .26458 -255.9)"><circle id="circle3818" stroke-width=".25066" fill="#fff" r="2.1167" cy="294.88" cx="2.1167" /><g id="g3828" stroke-linejoin="round" stroke-linecap="round" fill="none" /></g><path style="fill:#000;stroke-width:0.17859235" d="m 1.6076619,2.1122981 c 0.027682,0.068222 0.058043,0.1232286 0.115014,0.043934 0.072686,-0.047862 0.314322,-0.2548509 0.29682,-0.061078 C 1.953774,2.4553739 1.8705497,2.8125586 1.8105428,3.1738508 1.7403561,3.3728027 1.9237704,3.5430012 2.1028984,3.4078068 2.295421,3.3181535 2.4582973,3.1779584 2.6256382,3.0488362 2.599921,2.9911507 2.5809903,2.9077482 2.5191973,2.9868644 2.4356161,3.0297263 2.2566665,3.2222491 2.2163047,3.07116 2.2725613,2.681829 2.3904322,2.3041062 2.4600833,1.9170966 2.5309844,1.7376113 2.3950755,1.5200858 2.210054,1.6736753 1.985742,1.7836882 1.8010774,1.9562083 1.6076619,2.1122981 Z M 2.4041839,0.77839186 C 2.1702279,0.77446305 2.0636081,1.1609366 2.2889917,1.2561264 2.4716917,1.3236342 2.659928,1.1286114 2.6086721,0.94358974 2.5911701,0.8467927 2.5018738,0.77035521 2.4038266,0.77749894 Z" /></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB