From 4e6953ba8122c0025349c0fa983bf52718b24528 Mon Sep 17 00:00:00 2001 From: wackyideas <17151-wackyideas@users.noreply.gitgud.io> Date: Fri, 13 Aug 2021 15:38:28 +0200 Subject: [PATCH] Added System Tray modification, updated SevenStart --- .../SevenStart/contents/pics/menu_select.png | Bin 10029 -> 10373 bytes .../contents/ui/MenuRepresentation.qml | 157 ++++++++-- .../SevenStart/contents/ui/main.qml | 25 +- .../contents/applet/CompactApplet.qml | 83 +++++ .../System Tray/contents/config/config.qml | 35 +++ .../System Tray/contents/config/main.xml | 39 +++ .../System Tray/contents/ui/ConfigEntries.qml | 296 ++++++++++++++++++ .../System Tray/contents/ui/ConfigGeneral.qml | 49 +++ .../contents/ui/CurrentItemHighLight.qml | 182 +++++++++++ .../contents/ui/ExpandedRepresentation.qml | 231 ++++++++++++++ .../System Tray/contents/ui/ExpanderArrow.qml | 112 +++++++ .../contents/ui/HiddenItemsView.qml | 71 +++++ .../contents/ui/PlasmoidPopupsContainer.qml | 157 ++++++++++ .../contents/ui/SystemTrayState.qml | 107 +++++++ .../contents/ui/items/AbstractItem.qml | 216 +++++++++++++ .../contents/ui/items/ItemLoader.qml | 36 +++ .../contents/ui/items/PlasmoidItem.qml | 141 +++++++++ .../contents/ui/items/PulseAnimation.qml | 53 ++++ .../contents/ui/items/StatusNotifierItem.qml | 118 +++++++ .../System Tray/contents/ui/main.qml | 238 ++++++++++++++ Plasma Widgets/System Tray/metadata.desktop | 108 +++++++ Plasma Widgets/System Tray/metadata.json | 117 +++++++ README.md | 16 + Screenshots/System_Tray.png | Bin 0 -> 83164 bytes 24 files changed, 2555 insertions(+), 32 deletions(-) create mode 100644 Plasma Widgets/System Tray/contents/applet/CompactApplet.qml create mode 100644 Plasma Widgets/System Tray/contents/config/config.qml create mode 100644 Plasma Widgets/System Tray/contents/config/main.xml create mode 100644 Plasma Widgets/System Tray/contents/ui/ConfigEntries.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/ConfigGeneral.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/CurrentItemHighLight.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/ExpandedRepresentation.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/ExpanderArrow.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/HiddenItemsView.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/PlasmoidPopupsContainer.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/SystemTrayState.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/items/AbstractItem.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/items/ItemLoader.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/items/PlasmoidItem.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/items/PulseAnimation.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/items/StatusNotifierItem.qml create mode 100644 Plasma Widgets/System Tray/contents/ui/main.qml create mode 100644 Plasma Widgets/System Tray/metadata.desktop create mode 100644 Plasma Widgets/System Tray/metadata.json create mode 100644 Screenshots/System_Tray.png diff --git a/Plasma Widgets/SevenStart/contents/pics/menu_select.png b/Plasma Widgets/SevenStart/contents/pics/menu_select.png index ada270170aa692bc2f10f21fe4d165de81b2edaf..8cbaa18c9e868fbde7347a4366aa1395a77a8df0 100644 GIT binary patch delta 6678 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 delta 6502 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 M07*qoM6N<$f(Z17ssI20 diff --git a/Plasma Widgets/SevenStart/contents/ui/MenuRepresentation.qml b/Plasma Widgets/SevenStart/contents/ui/MenuRepresentation.qml index 73b3e89..cc6d71c 100644 --- a/Plasma Widgets/SevenStart/contents/ui/MenuRepresentation.qml +++ b/Plasma Widgets/SevenStart/contents/ui/MenuRepresentation.qml @@ -511,6 +511,10 @@ PlasmaCore.Dialog { return shortcuts.home else if (val === 5) return shortcuts.movies + else if (val === 6) + return "~/Downloads" + else if (val === 7) + return "/" } } @@ -643,36 +647,7 @@ PlasmaCore.Dialog { size: iconSizeSide //onClicked: executable.exec("dolphin --new-window "+folderDialog.getPath(2)) } - ListDelegate { - text: "Music" - Image { - property bool hovered: false - source: "../pics/menu_select.png" - smooth: true - opacity: hovered ? 1.0 : 0.0 - width: parent.width - height: parent.height - MouseArea { - enabled: !root.hoverDisabled - acceptedButtons: Qt.LeftButton - onEntered: { - parent.hovered = true - } - onExited: { - parent.hovered = false - } - onClicked: { - root.visible = false; - executable.exec("dolphin --new-window "+folderDialog.getPath(3)) - } - hoverEnabled: true - anchors.fill: parent - } - } - icon: "folder-music" - size: iconSizeSide - //onClicked: executable.exec("dolphin --new-window "+folderDialog.getPath(3)) - } + ListDelegate { text: "Pictures" Image { @@ -703,6 +678,36 @@ PlasmaCore.Dialog { size: iconSizeSide //onClicked: executable.exec("dolphin --new-window "+folderDialog.getPath(1)) } + ListDelegate { + text: "Music" + Image { + property bool hovered: false + source: "../pics/menu_select.png" + smooth: true + opacity: hovered ? 1.0 : 0.0 + width: parent.width + height: parent.height + MouseArea { + enabled: !root.hoverDisabled + acceptedButtons: Qt.LeftButton + onEntered: { + parent.hovered = true + } + onExited: { + parent.hovered = false + } + onClicked: { + root.visible = false; + executable.exec("dolphin --new-window "+folderDialog.getPath(3)) + } + hoverEnabled: true + anchors.fill: parent + } + } + icon: "folder-music" + size: iconSizeSide + //onClicked: executable.exec("dolphin --new-window "+folderDialog.getPath(3)) + } ListDelegate { text: "Videos" Image { @@ -733,6 +738,66 @@ PlasmaCore.Dialog { size: iconSizeSide //onClicked: executable.exec("dolphin --new-window "+folderDialog.getPath(5)) } + ListDelegate { + text: "Downloads" + Image { + property bool hovered: false + source: "../pics/menu_select.png" + smooth: true + opacity: hovered ? 1.0 : 0.0 + width: parent.width + height: parent.height + MouseArea { + enabled: !root.hoverDisabled + acceptedButtons: Qt.LeftButton + onEntered: { + parent.hovered = true + } + onExited: { + parent.hovered = false + } + onClicked: { + root.visible = false; + executable.exec("dolphin --new-window "+folderDialog.getPath(6)) + } + hoverEnabled: true + anchors.fill: parent + } + } + icon: "folder-music" + size: iconSizeSide + //onClicked: executable.exec("dolphin --new-window "+folderDialog.getPath(5)) + } + ListDelegate { + text: "Computer" + Image { + property bool hovered: false + source: "../pics/menu_select.png" + smooth: true + opacity: hovered ? 1.0 : 0.0 + width: parent.width + height: parent.height + MouseArea { + enabled: !root.hoverDisabled + acceptedButtons: Qt.LeftButton + onEntered: { + parent.hovered = true + } + onExited: { + parent.hovered = false + } + onClicked: { + root.visible = false; + executable.exec("dolphin --new-window "+folderDialog.getPath(7)) + } + hoverEnabled: true + anchors.fill: parent + } + } + icon: "folder-music" + size: iconSizeSide + //onClicked: executable.exec("dolphin --new-window "+folderDialog.getPath(5)) + } ListDelegate { text: "System Settings" @@ -754,7 +819,37 @@ PlasmaCore.Dialog { } onClicked: { root.visible = false; - logic.openUrl("file:///usr/share/applications/systemsettings.desktop") + executable.exec("systemsettings5") + } + hoverEnabled: true + anchors.fill: parent + } + } + icon: "configure" + size: iconSizeSide + //onClicked: logic.openUrl("file:///usr/share/applications/systemsettings.desktop") + } + ListDelegate { + text: "Default Programs" + Image { + property bool hovered: false + source: "../pics/menu_select.png" + smooth: true + opacity: hovered ? 1.0 : 0.0 + width: parent.width + height: parent.height + MouseArea { + enabled: !root.hoverDisabled + acceptedButtons: Qt.LeftButton + onEntered: { + parent.hovered = true + } + onExited: { + parent.hovered = false + } + onClicked: { + root.visible = false; + executable.exec("systemsettings5 componentchooser") } hoverEnabled: true anchors.fill: parent diff --git a/Plasma Widgets/SevenStart/contents/ui/main.qml b/Plasma Widgets/SevenStart/contents/ui/main.qml index f24234b..5da27b4 100644 --- a/Plasma Widgets/SevenStart/contents/ui/main.qml +++ b/Plasma Widgets/SevenStart/contents/ui/main.qml @@ -44,11 +44,33 @@ Item { property QtObject globalFavorites: rootModel.favoritesModel property QtObject systemFavorites: rootModel.systemFavoritesModel +PlasmaCore.DataSource { + id: menu_executable + engine: "executable" + connectedSources: [] + onNewData: { + var exitCode = data["exit code"] + var exitStatus = data["exit status"] + var stdout = data["stdout"] + var stderr = data["stderr"] + exited(sourceName, exitCode, exitStatus, stdout, stderr) + disconnectSource(sourceName) + } + function exec(cmd) { + if (cmd) { + connectSource(cmd) + } + } + signal exited(string cmd, int exitCode, int exitStatus, string stdout, string stderr) + } function action_menuedit() { processRunner.runMenuEditor(); } - + function action_taskman() { + menu_executable.exec("ksysguard"); + } + Component { id: compactRepresentation CompactRepresentation {} @@ -197,6 +219,7 @@ Item { Component.onCompleted: { plasmoid.setAction("menuedit", i18n("Edit Applications...")); + plasmoid.setAction("taskman", i18n("Task Manager")); rootModel.refreshed.connect(reset); diff --git a/Plasma Widgets/System Tray/contents/applet/CompactApplet.qml b/Plasma Widgets/System Tray/contents/applet/CompactApplet.qml new file mode 100644 index 0000000..5da557c --- /dev/null +++ b/Plasma Widgets/System Tray/contents/applet/CompactApplet.qml @@ -0,0 +1,83 @@ +/* + * Copyright 2011 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Layouts 1.1 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.plasmoid 2.0 + + +PlasmaCore.ToolTipArea { + id: appletRoot + objectName: "org.kde.desktop-CompactApplet" + anchors.fill: parent + + mainText: plasmoid.toolTipMainText + subText: plasmoid.toolTipSubText + location: if (plasmoid.parent && plasmoid.parent.inHiddenLayout && plasmoid.location !== PlasmaCore.Types.LeftEdge) { + return PlasmaCore.Types.RightEdge; + } else { + return plasmoid.location; + } + active: !plasmoid.expanded + textFormat: plasmoid.toolTipTextFormat + mainItem: plasmoid.toolTipItem ? plasmoid.toolTipItem : null + + property Item fullRepresentation + property Item compactRepresentation + + Connections { + target: plasmoid + function onContextualActionsAboutToShow() { + appletRoot.hideToolTip() + } + } + + Layout.minimumWidth: { + switch (plasmoid.formFactor) { + case PlasmaCore.Types.Vertical: + return 0; + case PlasmaCore.Types.Horizontal: + return height; + default: + return PlasmaCore.Units.gridUnit * 3; + } + } + + Layout.minimumHeight: { + switch (plasmoid.formFactor) { + case PlasmaCore.Types.Vertical: + return width; + case PlasmaCore.Types.Horizontal: + return 0; + default: + return PlasmaCore.Units.gridUnit * 3; + } + } + + onCompactRepresentationChanged: { + if (compactRepresentation) { + compactRepresentation.parent = appletRoot; + compactRepresentation.anchors.fill = appletRoot; + compactRepresentation.visible = true; + } + appletRoot.visible = true; + } +} + diff --git a/Plasma Widgets/System Tray/contents/config/config.qml b/Plasma Widgets/System Tray/contents/config/config.qml new file mode 100644 index 0000000..e6eeac3 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/config/config.qml @@ -0,0 +1,35 @@ +/*************************************************************************** + * Copyright 2013 by Sebastian Kügler * + * * + * 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. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ***************************************************************************/ + +import QtQuick 2.0 + +import org.kde.plasma.configuration 2.0 + +ConfigModel { + ConfigCategory { + name: i18n("General") + icon: "plasma" + source: "ConfigGeneral.qml" + } + ConfigCategory { + name: i18n("Entries") + icon: "preferences-desktop-notification" + source: "ConfigEntries.qml" + } +} diff --git a/Plasma Widgets/System Tray/contents/config/main.xml b/Plasma Widgets/System Tray/contents/config/main.xml new file mode 100644 index 0000000..4e2fdf5 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/config/main.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + false + + + + + false + + + + false + + + + + diff --git a/Plasma Widgets/System Tray/contents/ui/ConfigEntries.qml b/Plasma Widgets/System Tray/contents/ui/ConfigEntries.qml new file mode 100644 index 0000000..3bc9ecb --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/ConfigEntries.qml @@ -0,0 +1,296 @@ +/* + * Copyright 2013 Sebastian Kügler + * Copyright 2014 Marco Martin + * Copyright 2019 Konrad Materka + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. + */ + +import QtQuick 2.5 +import QtQuick.Controls 2.5 as QQC2 +import QtQuick.Layouts 1.3 + +import org.kde.kquickcontrols 2.0 as KQC +import org.kde.kirigami 2.10 as Kirigami + +ColumnLayout { + id: iconsPage + + signal configurationChanged + + property var cfg_shownItems: [] + property var cfg_hiddenItems: [] + property var cfg_extraItems: [] + property alias cfg_showAllItems: showAllCheckBox.checked + + QQC2.CheckBox { + id: showAllCheckBox + text: i18n("Always show all entries") + } + + function categoryName(category) { + switch (category) { + case "ApplicationStatus": + return i18n("Application Status") + case "Communications": + return i18n("Communications") + case "SystemServices": + return i18n("System Services") + case "Hardware": + return i18n("Hardware Control") + case "UnknownCategory": + default: + return i18n("Miscellaneous") + } + } + + QQC2.ScrollView { + id: scrollView + + Layout.fillWidth: true + Layout.fillHeight: true + contentHeight: itemsList.implicitHeight + + Component.onCompleted: scrollView.background.visible = true + + property bool scrollBarVisible: QQC2.ScrollBar.vertical && QQC2.ScrollBar.vertical.visible + property var scrollBarWidth: scrollBarVisible ? QQC2.ScrollBar.vertical.width : 0 + + ListView { + id: itemsList + + property var visibilityColumnWidth: Kirigami.Units.gridUnit + property var keySequenceColumnWidth: Kirigami.Units.gridUnit + + clip: true + + model: plasmoid.nativeInterface.configSystemTrayModel + + header: Kirigami.AbstractListItem { + + hoverEnabled: false + + RowLayout { + Kirigami.Heading { + text: i18nc("Name of the system tray entry", "Entry") + level: 2 + Layout.fillWidth: true + } + Kirigami.Heading { + text: i18n("Visibility") + level: 2 + Layout.preferredWidth: itemsList.visibilityColumnWidth + Component.onCompleted: itemsList.visibilityColumnWidth = Math.max(implicitWidth, itemsList.visibilityColumnWidth) + } + Kirigami.Heading { + text: i18n("Keyboard Shortcut") + level: 2 + Layout.preferredWidth: itemsList.keySequenceColumnWidth + Component.onCompleted: itemsList.keySequenceColumnWidth = Math.max(implicitWidth, itemsList.keySequenceColumnWidth) + } + QQC2.Button { // Configure button column + icon.name: "configure" + enabled: false + opacity: 0 + } + } + } + + section { + property: "category" + delegate: Kirigami.ListSectionHeader { + label: categoryName(section) + } + } + + delegate: Kirigami.AbstractListItem { + highlighted: false + hoverEnabled: false + + property bool isPlasmoid: model.itemType === "Plasmoid" + + contentItem: RowLayout { + RowLayout { + Layout.fillWidth: true + + Kirigami.Icon { + implicitWidth: Kirigami.Units.iconSizes.smallMedium + implicitHeight: Kirigami.Units.iconSizes.smallMedium + source: model.decoration + } + QQC2.Label { + Layout.fillWidth: true + text: model.display + elide: Text.ElideRight + wrapMode: Text.NoWrap + } + } + + QQC2.ComboBox { + id: visibilityComboBox + + property var contentWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding) + implicitWidth: Math.max(contentWidth, itemsList.visibilityColumnWidth) + Component.onCompleted: itemsList.visibilityColumnWidth = Math.max(implicitWidth, itemsList.visibilityColumnWidth) + + enabled: (!showAllCheckBox.checked || isPlasmoid) && itemId + textRole: "text" + model: comboBoxModel() + + currentIndex: { + var value + + if (cfg_shownItems.indexOf(itemId) !== -1) { + value = "shown" + } else if (cfg_hiddenItems.indexOf(itemId) !== -1) { + value = "hidden" + } else if (isPlasmoid && cfg_extraItems.indexOf(itemId) === -1) { + value = "disabled" + } else { + value = "auto" + } + + for (var i = 0; i < model.length; i++) { + if (model[i].value === value) { + return i + } + } + + return 0 + } + + property var myCurrentValue: model[currentIndex].value + + onActivated: { + var shownIndex = cfg_shownItems.indexOf(itemId) + var hiddenIndex = cfg_hiddenItems.indexOf(itemId) + var extraIndex = cfg_extraItems.indexOf(itemId) + + switch (myCurrentValue) { + case "auto": + if (shownIndex > -1) { + cfg_shownItems.splice(shownIndex, 1) + } + if (hiddenIndex > -1) { + cfg_hiddenItems.splice(hiddenIndex, 1) + } + if (extraIndex === -1) { + cfg_extraItems.push(itemId) + } + break + case "shown": + if (shownIndex === -1) { + cfg_shownItems.push(itemId) + } + if (hiddenIndex > -1) { + cfg_hiddenItems.splice(hiddenIndex, 1) + } + if (extraIndex === -1) { + cfg_extraItems.push(itemId) + } + break + case "hidden": + if (shownIndex > -1) { + cfg_shownItems.splice(shownIndex, 1) + } + if (hiddenIndex === -1) { + cfg_hiddenItems.push(itemId) + } + if (extraIndex === -1) { + cfg_extraItems.push(itemId) + } + break + case "disabled": + if (shownIndex > -1) { + cfg_shownItems.splice(shownIndex, 1) + } + if (hiddenIndex > -1) { + cfg_hiddenItems.splice(hiddenIndex, 1) + } + if (extraIndex > -1) { + cfg_extraItems.splice(extraIndex, 1) + } + break + } + iconsPage.configurationChanged() + } + + function comboBoxModel() { + var autoElement = {"value": "auto", "text": i18n("Shown when relevant")} + var shownElement = {"value": "shown", "text": i18n("Always shown")} + var hiddenElement = {"value": "hidden", "text": i18n("Always hidden")} + var disabledElement = {"value": "disabled", "text": i18n("Disabled")} + + if (showAllCheckBox.checked) { + if (isPlasmoid) { + return [autoElement, disabledElement] + } else { + return [shownElement] + } + } else { + if (isPlasmoid) { + return [autoElement, shownElement, hiddenElement, disabledElement] + } else { + return [autoElement, shownElement, hiddenElement] + } + } + } + } + KQC.KeySequenceItem { + id: keySequenceItem + Layout.minimumWidth: itemsList.keySequenceColumnWidth + Layout.preferredWidth: itemsList.keySequenceColumnWidth + Component.onCompleted: itemsList.keySequenceColumnWidth = Math.max(implicitWidth, itemsList.keySequenceColumnWidth) + + visible: isPlasmoid + enabled: visibilityComboBox.myCurrentValue !== "disabled" + keySequence: model.applet ? model.applet.globalShortcut : "" + onKeySequenceChanged: { + if (model.applet && keySequence !== model.applet.globalShortcut) { + model.applet.globalShortcut = keySequence + + itemsList.keySequenceColumnWidth = Math.max(implicitWidth, itemsList.keySequenceColumnWidth) + } + } + } + // Placeholder for when KeySequenceItem is not visible + Item { + Layout.minimumWidth: itemsList.keySequenceColumnWidth + Layout.maximumWidth: itemsList.keySequenceColumnWidth + visible: !keySequenceItem.visible + } + + QQC2.Button { + readonly property QtObject configureAction: (model.applet && model.applet.action("configure")) || null + + Accessible.name: configureAction ? configureAction.text : "" + icon.name: "configure" + enabled: configureAction && configureAction.visible && configureAction.enabled + // Still reserve layout space, so not setting visible to false + opacity: enabled ? 1 : 0 + onClicked: configureAction.trigger() + + QQC2.ToolTip { + // Strip out ampersands right before non-whitespace characters, i.e. + // those used to determine the alt key shortcut + text: parent.Accessible.name.replace(/&(?=\S)/g, "") + } + } + } + } + } + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/ConfigGeneral.qml b/Plasma Widgets/System Tray/contents/ui/ConfigGeneral.qml new file mode 100644 index 0000000..e2b3de7 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/ConfigGeneral.qml @@ -0,0 +1,49 @@ + + +/*************************************************************************** + * Copyright (C) 2020 Konrad Materka * + * * + * 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. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ***************************************************************************/ +import QtQuick 2.14 +import QtQuick.Controls 2.14 as QQC2 +import QtQuick.Layouts 1.13 + +import org.kde.plasma.core 2.1 as PlasmaCore + +import org.kde.kirigami 2.13 as Kirigami + +ColumnLayout { + property bool cfg_scaleIconsToFit + + Kirigami.FormLayout { + Layout.fillHeight: true + + QQC2.RadioButton { + Kirigami.FormData.label: i18nc("The arrangement of system tray icons in the Panel", "Panel icon size:") + text: i18n("Small") + checked: cfg_scaleIconsToFit == false + onToggled: cfg_scaleIconsToFit = !checked + } + QQC2.RadioButton { + id: automaticRadioButton + text: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? i18n("Scale with Panel height") + : i18n("Scale with Panel width") + checked: cfg_scaleIconsToFit == true + onToggled: cfg_scaleIconsToFit = checked + } + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/CurrentItemHighLight.qml b/Plasma Widgets/System Tray/contents/ui/CurrentItemHighLight.qml new file mode 100644 index 0000000..59f731c --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/CurrentItemHighLight.qml @@ -0,0 +1,182 @@ +/* + * Copyright 2011 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.12 +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore + +PlasmaCore.FrameSvgItem { + id: currentItemHighLight + + property int location + + property bool animationEnabled: true + property var highlightedItem: null + + z: -1 // always draw behind icons + opacity: systemTrayState.expanded ? 0.8 : 0 + + MouseArea + { + id: trayItemHighlight + + anchors.fill: parent + + hoverEnabled: true + property int highlightOpacity: 0 + onEntered: highlightOpacity = 1 + onExited: highlightOpacity = 0 + } + + + imagePath: "widgets/tabbar" + prefix: { + var prefix = "" + switch (location) { + case PlasmaCore.Types.LeftEdge: + prefix = "west-active-tab"; + break; + case PlasmaCore.Types.TopEdge: + prefix = "north-active-tab"; + break; + case PlasmaCore.Types.RightEdge: + prefix = "east-active-tab"; + break; + default: + prefix = "south-active-tab"; + } + if (!hasElementPrefix(prefix)) { + prefix = "active-tab"; + } + return prefix; + } + + // update when System Tray is expanded - applet activated or hidden icons shown + Connections { + target: systemTrayState + + function onActiveAppletChanged() { + Qt.callLater(updateHighlightedItem); + } + + function onExpandedChanged() { + Qt.callLater(updateHighlightedItem); + } + } + + // update when applet changes parent (e.g. moves from active to hidden icons) + Connections { + target: systemTrayState.activeApplet + + function onParentChanged() { + Qt.callLater(updateHighlightedItem); + } + } + + // update when System Tray size changes + Connections { + target: parent + + function onWidthChanged() { + Qt.callLater(updateHighlightedItem); + } + + function onHeightChanged() { + Qt.callLater(updateHighlightedItem); + } + } + + // update when scale of newly added tray item changes (check 'add' animation in GridView in main.qml) + Connections { + target: !!highlightedItem && highlightedItem.parent ? highlightedItem.parent : null + + function onScaleChanged() { + Qt.callLater(updateHighlightedItem); + } + } + + function updateHighlightedItem() { + if (systemTrayState.expanded) { + if (systemTrayState.activeApplet && systemTrayState.activeApplet.parent && systemTrayState.activeApplet.parent.inVisibleLayout) { + changeHighlightedItem(systemTrayState.activeApplet.parent.container); + } else { // 'Show hiden items' popup + changeHighlightedItem(parent); + } + } else { + highlightedItem = null; + } + } + + function changeHighlightedItem(nextItem) { + // do not animate the first appearance + // or when the property value of a highlighted item changes + if (!highlightedItem || (highlightedItem === nextItem)) { + animationEnabled = false; + } + + highlightedItem = nextItem; + + const p = parent.mapFromItem(highlightedItem, 0, 0) + x = p.x; + y = p.y; + width = highlightedItem.width + height = highlightedItem.height + + animationEnabled = true; + } + + Behavior on opacity { + NumberAnimation { + duration: PlasmaCore.Units.longDuration + easing.type: systemTrayState.expanded ? Easing.OutCubic : Easing.InCubic + } + } + Behavior on x { + id: xAnim + enabled: animationEnabled + NumberAnimation { + duration: PlasmaCore.Units.longDuration + easing.type: Easing.InOutCubic + } + } + Behavior on y { + id: yAnim + enabled: animationEnabled + NumberAnimation { + duration: PlasmaCore.Units.longDuration + easing.type: Easing.InOutCubic + } + } + Behavior on width { + id: widthAnim + enabled: animationEnabled + NumberAnimation { + duration: PlasmaCore.Units.longDuration + easing.type: Easing.InOutCubic + } + } + Behavior on height { + id: heightAnim + enabled: animationEnabled + NumberAnimation { + duration: PlasmaCore.Units.longDuration + easing.type: Easing.InOutCubic + } + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/ExpandedRepresentation.qml b/Plasma Widgets/System Tray/contents/ui/ExpandedRepresentation.qml new file mode 100644 index 0000000..714aae2 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/ExpandedRepresentation.qml @@ -0,0 +1,231 @@ +/* + * Copyright 2016 Marco Martin + * Copyright 2020 Nate Graham + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.12 +import QtQuick.Layouts 1.12 + +import org.kde.plasma.core 2.0 as PlasmaCore +// We still need PC2 here for that version of Menu, as PC2 Menu is still very problematic with QActions +// Not being a proper popup window, makes it a showstopper to be used in Plasma +import org.kde.plasma.components 2.0 as PC2 +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.extras 2.0 as PlasmaExtras + +Item { + id: popup + //set width/height to avoid useless Dialog resize + readonly property int defaultWidth: PlasmaCore.Units.gridUnit * 24 + readonly property int defaultHeight: PlasmaCore.Units.gridUnit * 24 + + width: defaultWidth + Layout.minimumWidth: defaultWidth + Layout.preferredWidth: defaultWidth + Layout.maximumWidth: defaultWidth + + height: defaultHeight + Layout.minimumHeight: defaultHeight + Layout.preferredHeight: defaultHeight + Layout.maximumHeight: defaultHeight + + property alias hiddenLayout: hiddenItemsView.layout + + // Header + PlasmaExtras.PlasmoidHeading { + id: plasmoidHeading + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: trayHeading.height + bottomPadding + container.headingHeight + Behavior on height { + NumberAnimation { duration: PlasmaCore.Units.shortDuration/2; easing.type: Easing.InOutQuad } + } + } + + // Main content layout + ColumnLayout { + id: expandedRepresentation + anchors.fill: parent + // TODO: remove this so the scrollview fully touches the header; + // add top padding internally + spacing: plasmoidHeading.bottomPadding + + // Header content layout + RowLayout { + id: trayHeading + + PlasmaComponents.ToolButton { + id: backButton + visible: systemTrayState.activeApplet && systemTrayState.activeApplet.expanded && (hiddenLayout.itemCount > 0) + icon.name: LayoutMirroring.enabled ? "go-previous-symbolic-rtl" : "go-previous-symbolic" + onClicked: systemTrayState.setActiveApplet(null) + } + + PlasmaExtras.Heading { + Layout.fillWidth: true + leftPadding: systemTrayState.activeApplet ? 0 : PlasmaCore.Units.smallSpacing * 2 + + level: 1 + text: systemTrayState.activeApplet ? systemTrayState.activeApplet.title : i18n("Status and Notifications") + } + + PlasmaComponents.ToolButton { + id: actionsButton + visible: visibleActions > 0 + checked: visibleActions > 1 ? configMenu.status !== PC2.DialogStatus.Closed : singleAction && singleAction.checked + property QtObject applet: systemTrayState.activeApplet || plasmoid + onAppletChanged: { + configMenu.clearMenuItems(); + updateVisibleActions(); + } + property int visibleActions: 0 + property QtObject singleAction + + function updateVisibleActions() { + let newSingleAction = null; + let newVisibleActions = 0; + for (let i in applet.contextualActions) { + let action = applet.contextualActions[i]; + if (action.visible && action !== actionsButton.applet.action("configure")) { + newVisibleActions++; + newSingleAction = action; + action.changed.connect(() => {updateVisibleActions()}); + } + } + if (newVisibleActions > 1) { + newSingleAction = null; + } + visibleActions = newVisibleActions; + singleAction = newSingleAction; + } + Connections { + target: actionsButton.applet + function onContextualActionsChanged() { + Qt.callLater(actionsButton.updateVisibleActions); + } + } + icon.name: "application-menu" + checkable: visibleActions > 1 || (singleAction && singleAction.checkable) + contentItem.opacity: visibleActions > 1 + // NOTE: it needs an IconItem because QtQuickControls2 buttons cannot load QIcons as their icon + PlasmaCore.IconItem { + parent: actionsButton + anchors.centerIn: parent + active: actionsButton.hovered + implicitWidth: PlasmaCore.Units.iconSizes.smallMedium + implicitHeight: implicitWidth + source: actionsButton.singleAction !== null ? actionsButton.singleAction.icon : "" + visible: actionsButton.singleAction + } + onToggled: { + if (visibleActions > 1) { + if (checked) { + configMenu.openRelative(); + } else { + configMenu.close(); + } + } + } + onClicked: { + if (singleAction) { + singleAction.trigger(); + } + } + PlasmaComponents.ToolTip { + text: actionsButton.singleAction ? actionsButton.singleAction.text : i18n("More actions") + } + PC2.Menu { + id: configMenu + visualParent: actionsButton + placement: PlasmaCore.Types.BottomPosedLeftAlignedPopup + } + + Instantiator { + model: actionsButton.applet.contextualActions + delegate: PC2.MenuItem { + id: menuItem + action: modelData + } + onObjectAdded: { + if (object.action !== actionsButton.applet.action("configure")) { + configMenu.addMenuItem(object); + } + } + } + } + PlasmaComponents.ToolButton { + icon.name: "configure" + visible: actionsButton.applet && actionsButton.applet.action("configure") + PlasmaComponents.ToolTip { + text: parent.visible ? actionsButton.applet.action("configure").text : "" + } + onClicked: actionsButton.applet.action("configure").trigger(); + } + + PlasmaComponents.ToolButton { + id: pinButton + checkable: true + checked: plasmoid.configuration.pin + onToggled: plasmoid.configuration.pin = checked + icon.name: "window-pin" + PlasmaComponents.ToolTip { + text: i18n("Keep Open") + } + } + } + + // Grid view of all available items + HiddenItemsView { + id: hiddenItemsView + Layout.fillWidth: true + Layout.fillHeight: true + Layout.topMargin: PlasmaCore.Units.smallSpacing + visible: !systemTrayState.activeApplet + } + + // Container for currently visible item + PlasmoidPopupsContainer { + id: container + Layout.fillWidth: true + Layout.fillHeight: true + visible: systemTrayState.activeApplet + + // We need to add margin on the top so it matches the dialog's own margin + Layout.topMargin: mergeHeadings ? 0 : dialog.margins.top + } + } + + // Footer + PlasmaExtras.PlasmoidHeading { + id: plasmoidFooter + location: PlasmaExtras.PlasmoidHeading.Location.Footer + anchors { + bottom: parent.bottom + left: parent.left + right: parent.right + } + visible: container.appletHasFooter + height: container.footerHeight + // So that it doesn't appear over the content view, which results in + // the footer controls being inaccessible + z: -9999 + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/ExpanderArrow.qml b/Plasma Widgets/System Tray/contents/ui/ExpanderArrow.qml new file mode 100644 index 0000000..74b740f --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/ExpanderArrow.qml @@ -0,0 +1,112 @@ +/*************************************************************************** + * Copyright 2013 Sebastian Kügler * + * Copyright 2015 Marco Martin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ***************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import org.kde.plasma.core 2.0 as PlasmaCore + +PlasmaCore.ToolTipArea { + id: tooltip + + property bool vertical: plasmoid.formFactor === PlasmaCore.Types.Vertical + implicitWidth: PlasmaCore.Units.iconSizes.smallMedium + implicitHeight: implicitWidth + + subText: systemTrayState.expanded ? i18n("Close popup") : i18n("Show hidden icons") + + MouseArea { + id: arrowMouseArea + anchors.fill: parent + onClicked: systemTrayState.expanded = !systemTrayState.expanded + + readonly property int arrowAnimationDuration: PlasmaCore.Units.shortDuration + + PlasmaCore.Svg { + id: arrowSvg + imagePath: "widgets/arrows" + } + + PlasmaCore.SvgItem { + id: arrow + + anchors.centerIn: parent + width: Math.min(parent.width, parent.height) + height: width + + rotation: systemTrayState.expanded ? 180 : 0 + Behavior on rotation { + RotationAnimation { + duration: arrowMouseArea.arrowAnimationDuration + } + } + opacity: systemTrayState.expanded ? 0 : 1 + Behavior on opacity { + NumberAnimation { + duration: arrowMouseArea.arrowAnimationDuration + } + } + + svg: arrowSvg + elementId: { + if (plasmoid.location === PlasmaCore.Types.TopEdge) { + return "down-arrow"; + } else if (plasmoid.location === PlasmaCore.Types.LeftEdge) { + return "right-arrow"; + } else if (plasmoid.location === PlasmaCore.Types.RightEdge) { + return "left-arrow"; + } else { + return "up-arrow"; + } + } + } + + PlasmaCore.SvgItem { + anchors.centerIn: parent + width: arrow.width + height: arrow.height + + rotation: systemTrayState.expanded ? 0 : -180 + Behavior on rotation { + RotationAnimation { + duration: arrowMouseArea.arrowAnimationDuration + } + } + opacity: systemTrayState.expanded ? 1 : 0 + Behavior on opacity { + NumberAnimation { + duration: arrowMouseArea.arrowAnimationDuration + } + } + + svg: arrowSvg + elementId: { + if (plasmoid.location === PlasmaCore.Types.TopEdge) { + return "up-arrow"; + } else if (plasmoid.location === PlasmaCore.Types.LeftEdge) { + return "left-arrow"; + } else if (plasmoid.location === PlasmaCore.Types.RightEdge) { + return "right-arrow"; + } else { + return "down-arrow"; + } + } + } + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/HiddenItemsView.qml b/Plasma Widgets/System Tray/contents/ui/HiddenItemsView.qml new file mode 100644 index 0000000..f7c45c8 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/HiddenItemsView.qml @@ -0,0 +1,71 @@ +/* + * Copyright 2016 Marco Martin + * Copyright 2020 Konrad Materka + * Copyright 2020 Nate Graham + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQuick.Layouts 1.1 +import org.kde.plasma.core 2.1 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents // For Highlight +import org.kde.plasma.extras 2.0 as PlasmaExtras + +import "items" + +MouseArea { + id: hiddenTasksView + + property alias layout: hiddenTasks + + hoverEnabled: true + onExited: hiddenTasks.currentIndex = -1 + + PlasmaExtras.ScrollArea { + width: parent.width + height: parent.height + frameVisible: false + + horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff + verticalScrollBarPolicy: systemTrayState.activeApplet ? Qt.ScrollBarAlwaysOff : Qt.ScrollBarAsNeeded + + GridView { + id: hiddenTasks + + readonly property int rows: 4 + readonly property int columns: 4 + + cellWidth: hiddenTasks.width / hiddenTasks.columns + cellHeight: hiddenTasks.height / hiddenTasks.rows + + currentIndex: -1 + highlight: PlasmaComponents.Highlight {} + highlightMoveDuration: 0 + + readonly property int itemCount: model.count + + model: PlasmaCore.SortFilterModel { + sourceModel: plasmoid.nativeInterface.systemTrayModel + filterRole: "effectiveStatus" + filterCallback: function(source_row, value) { + return value === PlasmaCore.Types.PassiveStatus + } + } + delegate: ItemLoader {} + } + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/PlasmoidPopupsContainer.qml b/Plasma Widgets/System Tray/contents/ui/PlasmoidPopupsContainer.qml new file mode 100644 index 0000000..0a7d200 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/PlasmoidPopupsContainer.qml @@ -0,0 +1,157 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.4 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.4 +//needed for units +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents3 +import org.kde.plasma.extras 2.0 as PlasmaExtras + +StackView { + id: mainStack + focus: true + + Layout.minimumWidth: PlasmaCore.Units.gridUnit * 12 + Layout.minimumHeight: PlasmaCore.Units.gridUnit * 12 + + readonly property Item activeApplet: systemTrayState.activeApplet + + /* Heading */ + property bool appletHasHeading: false + property bool mergeHeadings: appletHasHeading && activeApplet.fullRepresentationItem.header.visible + property int headingHeight: mergeHeadings ? activeApplet.fullRepresentationItem.header.height : 0 + /* Footer */ + property bool appletHasFooter: false + property bool mergeFooters: appletHasFooter && activeApplet.fullRepresentationItem.footer.visible + property int footerHeight: mergeFooters ? activeApplet.fullRepresentationItem.footer.height : 0 + + onActiveAppletChanged: { + mainStack.appletHasHeading = false + mainStack.appletHasFooter = false + if (activeApplet != null) { + //reset any potential anchor + activeApplet.fullRepresentationItem.anchors.left = undefined; + activeApplet.fullRepresentationItem.anchors.top = undefined; + activeApplet.fullRepresentationItem.anchors.right = undefined; + activeApplet.fullRepresentationItem.anchors.bottom = undefined; + activeApplet.fullRepresentationItem.anchors.centerIn = undefined; + activeApplet.fullRepresentationItem.anchors.fill = undefined; + + if (activeApplet.fullRepresentationItem instanceof PlasmaComponents3.Page) { + if (activeApplet.fullRepresentationItem.header && activeApplet.fullRepresentationItem.header instanceof PlasmaExtras.PlasmoidHeading) { + mainStack.appletHasHeading = true + activeApplet.fullRepresentationItem.header.background.visible = false + } + if (activeApplet.fullRepresentationItem.footer && activeApplet.fullRepresentationItem.footer instanceof PlasmaExtras.PlasmoidHeading) { + mainStack.appletHasFooter = true + activeApplet.fullRepresentationItem.footer.background.visible = false + } + } + + mainStack.replace({item: activeApplet.fullRepresentationItem, immediate: !systemTrayState.expanded, properties: {focus: true}}); + } else { + mainStack.replace(emptyPage); + } + } + + onCurrentItemChanged: { + if (currentItem !== null && plasmoid.expanded) { + currentItem.forceActiveFocus(); + } + } + + Connections { + target: plasmoid + function onAppletRemoved(applet) { + if (applet === systemTrayState.activeApplet) { + mainStack.clear() + } + } + } + //used to animate away to nothing + Item { + id: emptyPage + } + + delegate: StackViewDelegate { + id: transitioner + function transitionFinished(properties) { + properties.exitItem.opacity = 1 + } + property bool goingLeft: { + const unFlipped = systemTrayState.oldVisualIndex < systemTrayState.newVisualIndex + + if (Qt.application.layoutDirection == Qt.LeftToRight) { + return unFlipped + } else { + return !unFlipped + } + } + replaceTransition: StackViewTransition { + ParallelAnimation { + PropertyAnimation { + target: enterItem + property: "x" + from: root.vertical ? 0 : (transitioner.goingLeft ? enterItem.width : -enterItem.width) + to: 0 + easing.type: Easing.InOutQuad + duration: PlasmaCore.Units.shortDuration + } + SequentialAnimation { + PropertyAction { + target: enterItem + property: "opacity" + value: 0 + } + PauseAnimation { + duration: root.vertical ? (PlasmaCore.Units.shortDuration/2) : 0 + } + PropertyAnimation { + target: enterItem + property: "opacity" + from: 0 + to: 1 + easing.type: Easing.InOutQuad + duration: (PlasmaCore.Units.shortDuration/2) + } + } + } + ParallelAnimation { + PropertyAnimation { + target: exitItem + property: "x" + from: 0 + to: root.vertical ? 0 : (transitioner.goingLeft ? -exitItem.width : exitItem.width) + easing.type: Easing.InOutQuad + duration: PlasmaCore.Units.shortDuration + } + PropertyAnimation { + target: exitItem + property: "opacity" + from: 1 + to: 0 + easing.type: Easing.InOutQuad + duration: PlasmaCore.Units.shortDuration/2 + } + } + } + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/SystemTrayState.qml b/Plasma Widgets/System Tray/contents/ui/SystemTrayState.qml new file mode 100644 index 0000000..edf9ca3 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/SystemTrayState.qml @@ -0,0 +1,107 @@ +/* + * Copyright 2020 Konrad Materka + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.12 +import org.kde.plasma.core 2.1 as PlasmaCore +import org.kde.plasma.plasmoid 2.0 + +//This object contains state of the SystemTray, mainly related to the 'expanded' state +QtObject { + //true if System Tray is 'expanded'. It may be when: + // - there is an active applet or + // - 'Status and Notification' with hidden items is shown + property bool expanded: false + //set when there is an applet selected + property Item activeApplet + + //allow expanded change only when activated at least once + //this is to suppress expanded state change during Plasma startup + property bool acceptExpandedChange: false + + // These properties allow us to keep track of where the expanded applet + // was and is on the panel, allowing PlasmoidPopupContainer.qml to animate + // depending on their locations. + property int oldVisualIndex: -1 + property int newVisualIndex: -1 + + function setActiveApplet(applet, visualIndex) { + if (visualIndex === undefined) { + oldVisualIndex = -1 + newVisualIndex = -1 + } else { + oldVisualIndex = newVisualIndex + newVisualIndex = visualIndex + } + + const oldApplet = activeApplet + activeApplet = applet + if (oldApplet && oldApplet !== applet) { + oldApplet.expanded = false + } + expanded = true + } + + onExpandedChanged: { + if (expanded) { + plasmoid.status = PlasmaCore.Types.RequiresAttentionStatus + } else { + plasmoid.status = PlasmaCore.Types.PassiveStatus; + if (activeApplet) { + // if not expanded we don't have an active applet anymore + activeApplet.expanded = false + activeApplet = null + } + } + acceptExpandedChange = false + plasmoid.expanded = expanded + } + + //listen on SystemTray AppletInterface signals + property Connections plasmoidConnections: Connections { + target: plasmoid + //emitted when activation is requested, for example by using a global keyboard shortcut + function onActivated() { + acceptExpandedChange = true + } + //emitted when the configuration dialog is opened + function onUserConfiguringChanged() { + if (plasmoid.userConfiguring) { + systemTrayState.expanded = false + } + } + function onExpandedChanged() { + if (acceptExpandedChange) { + expanded = plasmoid.expanded + } else { + plasmoid.expanded = expanded + } + } + } + + property Connections activeAppletConnections: Connections { + target: activeApplet + + function onExpandedChanged() { + if (!activeApplet.expanded) { + expanded = false + } + } + } + +} diff --git a/Plasma Widgets/System Tray/contents/ui/items/AbstractItem.qml b/Plasma Widgets/System Tray/contents/ui/items/AbstractItem.qml new file mode 100644 index 0000000..b2c7c72 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/items/AbstractItem.qml @@ -0,0 +1,216 @@ +/* + * Copyright 2016 Marco Martin + * Copyright 2020 Konrad Materka + * Copyright 2020 Nate Graham + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.2 +import QtQuick.Layouts 1.1 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents3 + +PlasmaCore.ToolTipArea { + id: abstractItem + + height: inVisibleLayout ? visibleLayout.cellHeight : hiddenTasks.cellHeight + width: inVisibleLayout ? visibleLayout.cellWidth : hiddenTasks.cellWidth + + property var model: itemModel + + property string itemId + property alias text: label.text + property alias iconContainer: iconContainer + property int /*PlasmaCore.Types.ItemStatus*/ status: model.status || PlasmaCore.Types.UnknownStatus + property int /*PlasmaCore.Types.ItemStatus*/ effectiveStatus: model.effectiveStatus || PlasmaCore.Types.UnknownStatus + readonly property bool inHiddenLayout: effectiveStatus === PlasmaCore.Types.PassiveStatus + readonly property bool inVisibleLayout: effectiveStatus === PlasmaCore.Types.ActiveStatus + + signal clicked(var mouse) + signal pressed(var mouse) + signal wheel(var wheel) + signal contextMenu(var mouse) + + /* subclasses need to assign to this tooltip properties + mainText: + subText: + */ + + location: { + if (inHiddenLayout) { + if (LayoutMirroring.enabled && plasmoid.location !== PlasmaCore.Types.RightEdge) { + return PlasmaCore.Types.LeftEdge; + } else if (plasmoid.location !== PlasmaCore.Types.LeftEdge) { + return PlasmaCore.Types.RightEdge; + } + } + + return plasmoid.location; + } + +//BEGIN CONNECTIONS + + onContainsMouseChanged: { + if (inHiddenLayout && containsMouse) { + root.hiddenLayout.currentIndex = index + } + else if(!inHiddenLayout) { + itemHighLight.opacity = containsMouse ? 1 : 0 + } + + } + +//END CONNECTIONS + + PlasmaCore.FrameSvgItem { + id: itemHighLight + anchors.fill: parent + property int location + + property bool animationEnabled: true + property var highlightedItem: null + + z: -1 // always draw behind icons + opacity: 0 + + imagePath: "widgets/tabbar" + prefix: { + var prefix = "" + switch (location) { + case PlasmaCore.Types.LeftEdge: + prefix = "west-active-tab"; + break; + case PlasmaCore.Types.TopEdge: + prefix = "north-active-tab"; + break; + case PlasmaCore.Types.RightEdge: + prefix = "east-active-tab"; + break; + default: + prefix = "south-active-tab"; + } + if (!hasElementPrefix(prefix)) { + prefix = "active-tab"; + } + return prefix; + } + Behavior on opacity { + NumberAnimation { + duration: PlasmaCore.Units.longDuration + easing.type: Easing.InOutQuad + //easing.type: systemTrayState.expanded ? Easing.OutCubic : Easing.InCubic + } + } + } + PulseAnimation { + targetItem: iconContainer + running: (abstractItem.status === PlasmaCore.Types.NeedsAttentionStatus || + abstractItem.status === PlasmaCore.Types.RequiresAttentionStatus ) && + PlasmaCore.Units.longDuration > 0 + } + + function activated() { + //activatedAnimation.start() + } + + SequentialAnimation { + id: activatedAnimation + loops: 1 + + ScaleAnimator { + target: iconContainer + from: 1 + to: 0.5 + duration: PlasmaCore.Units.shortDuration + easing.type: Easing.InQuad + } + + ScaleAnimator { + target: iconContainer + from: 0.5 + to: 1 + duration: PlasmaCore.Units.shortDuration + easing.type: Easing.OutQuad + } + } + + MouseArea { + anchors.fill: abstractItem + hoverEnabled: true + drag.filterChildren: true + acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton + onClicked: abstractItem.clicked(mouse) + onPressed: { + abstractItem.hideToolTip() + abstractItem.pressed(mouse) + } + onPressAndHold: { + abstractItem.contextMenu(mouse) + } + onWheel: { + abstractItem.wheel(wheel); + //Don't accept the event in order to make the scrolling by mouse wheel working + //for the parent scrollview this icon is in. + wheel.accepted = false; + } + } + + ColumnLayout { + anchors.fill: abstractItem + spacing: 0 + + Item { + id: iconContainer + + property alias container: abstractItem + property alias inVisibleLayout: abstractItem.inVisibleLayout + readonly property int size: abstractItem.inVisibleLayout ? root.itemSize : PlasmaCore.Units.iconSizes.medium + + Layout.alignment: Qt.Bottom | Qt.AlignHCenter + Layout.fillHeight: abstractItem.inHiddenLayout ? true : false + implicitWidth: root.vertical && abstractItem.inVisibleLayout ? abstractItem.width : size + implicitHeight: !root.vertical && abstractItem.inVisibleLayout ? abstractItem.height : size + Layout.topMargin: abstractItem.inHiddenLayout ? Math.round(PlasmaCore.Units.smallSpacing * 1.5): 0 + } + PlasmaComponents3.Label { + id: label + + Layout.fillWidth: true + Layout.fillHeight: abstractItem.inHiddenLayout ? true : false + Layout.leftMargin: abstractItem.inHiddenLayout ? PlasmaCore.Units.smallSpacing : 0 + Layout.rightMargin: abstractItem.inHiddenLayout ? PlasmaCore.Units.smallSpacing : 0 + Layout.bottomMargin: abstractItem.inHiddenLayout ? PlasmaCore.Units.smallSpacing : 0 + + visible: abstractItem.inHiddenLayout + + verticalAlignment: Text.AlignTop + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideRight + wrapMode: Text.Wrap + maximumLineCount: 3 + + opacity: visible ? 1 : 0 + Behavior on opacity { + NumberAnimation { + duration: PlasmaCore.Units.longDuration + easing.type: Easing.InOutQuad + } + } + } + } +} + diff --git a/Plasma Widgets/System Tray/contents/ui/items/ItemLoader.qml b/Plasma Widgets/System Tray/contents/ui/items/ItemLoader.qml new file mode 100644 index 0000000..64034f5 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/items/ItemLoader.qml @@ -0,0 +1,36 @@ +/* + * Copyright 2020 Konrad Materka + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.0 + +Loader { + id: itemLoader + + property var itemModel: model + + source: { + if (model.itemType === "Plasmoid" && model.hasApplet) { + return "PlasmoidItem.qml" + } else if (model.itemType === "StatusNotifier") { + return "StatusNotifierItem.qml" + } + console.warn("SystemTray ItemLoader: Invalid state, cannot determine source!") + return "" + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/items/PlasmoidItem.qml b/Plasma Widgets/System Tray/contents/ui/items/PlasmoidItem.qml new file mode 100644 index 0000000..5592e57 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/items/PlasmoidItem.qml @@ -0,0 +1,141 @@ +/* + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import QtQml 2.15 + +import org.kde.plasma.core 2.0 as PlasmaCore + +AbstractItem { + id: plasmoidContainer + + property Item applet: model.applet || null + text: applet ? applet.title : "" + + itemId: applet ? applet.pluginName : "" + mainText: applet ? applet.toolTipMainText : "" + subText: applet ? applet.toolTipSubText : "" + mainItem: applet && applet.toolTipItem ? applet.toolTipItem : null + textFormat: applet ? applet.toolTipTextFormat : "" + active: systemTrayState.activeApplet !== applet + + onClicked: { + if (!applet) { + return + } + //forward click event to the applet + if (mouse.button === Qt.LeftButton || mouse.button === Qt.MidButton) { + const mouseArea = findMouseArea(applet.compactRepresentationItem) + if (mouseArea) { + mouseArea.clicked(mouse) + } else if (mouse.button === Qt.LeftButton) {//falback + applet.expanded = true + } + } + } + onPressed: { + if (mouse.button === Qt.RightButton) { + plasmoidContainer.contextMenu(mouse); + } + } + onContextMenu: { + if (applet) { + plasmoid.nativeInterface.showPlasmoidMenu(applet, 0, plasmoidContainer.inHiddenLayout ? applet.height : 0); + } + } + onWheel: { + if (!applet) { + return + } + //forward wheel event to the applet + const mouseArea = findMouseArea(applet.compactRepresentationItem) + if (mouseArea) { + mouseArea.wheel(wheel) + } + } + + //some heuristics to find MouseArea + function findMouseArea(item) { + if (!item) { + return null + } + + if (item instanceof MouseArea) { + return item + } + for (var i = 0; i < item.children.length; i++) { + const child = item.children[i] + if (child instanceof MouseArea && child.enabled) { + //check if MouseArea covers the entire item + if (child.anchors.fill === item || (child.x === 0 && child.y === 0 && child.height === item.height && child.width === item.width)) { + return child + } + } + } + + return null + } + + //This is to make preloading effective, minimizes the scene changes + function preloadFullRepresentationItem(fullRepresentationItem) { + if (fullRepresentationItem && fullRepresentationItem.parent === null) { + fullRepresentationItem.width = expandedRepresentation.width + fullRepresentationItem.width = expandedRepresentation.height + fullRepresentationItem.parent = preloadedStorage; + } + } + + onAppletChanged: { + if (applet) { + applet.parent = plasmoidContainer.iconContainer + applet.anchors.fill = applet.parent + applet.visible = true + + preloadFullRepresentationItem(applet.fullRepresentationItem) + } + } + + Connections { + target: applet + + //activation using global keyboard shortcut + function onActivated() { + plasmoidContainer.activated() + } + + function onExpandedChanged(expanded) { + if (expanded) { + systemTrayState.setActiveApplet(applet, model.row) + plasmoidContainer.activated() + } + } + + function onFullRepresentationItemChanged(fullRepresentationItem) { + preloadFullRepresentationItem(fullRepresentationItem) + } + } + + Binding { + property: "hideOnWindowDeactivate" + value: !plasmoid.configuration.pin + target: plasmoidContainer.applet + when: null !== plasmoidContainer.applet + restoreMode: Binding.RestoreBinding + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/items/PulseAnimation.qml b/Plasma Widgets/System Tray/contents/ui/items/PulseAnimation.qml new file mode 100644 index 0000000..0506a35 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/items/PulseAnimation.qml @@ -0,0 +1,53 @@ +/* + * Copyright 2013 Sebastian Kügler + * Copyright 2015 Kai Uwe Broulik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. + */ + +import QtQuick 2.2 +import org.kde.plasma.core 2.0 as PlasmaCore + +SequentialAnimation { + id: pulseAnimation + objectName: "pulseAnimation" + + property Item targetItem + readonly property int duration: PlasmaCore.Units.veryLongDuration * 5 + + loops: Animation.Infinite + alwaysRunToEnd: true + + ScaleAnimator { + target: targetItem + from: 1 + to: 1.2 + duration: pulseAnimation.duration * 0.15 + easing.type: Easing.InQuad + } + + ScaleAnimator { + target: targetItem + from: 1.2 + to: 1 + duration: pulseAnimation.duration * 0.15 + easing.type: Easing.InQuad + } + + PauseAnimation { + duration: pulseAnimation.duration * 0.7 + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/items/StatusNotifierItem.qml b/Plasma Widgets/System Tray/contents/ui/items/StatusNotifierItem.qml new file mode 100644 index 0000000..e7c1571 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/items/StatusNotifierItem.qml @@ -0,0 +1,118 @@ +/* + * Copyright 2016 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.1 +import org.kde.plasma.core 2.0 as PlasmaCore + +AbstractItem { + id: taskIcon + + itemId: model.Id + text: model.Title || model.ToolTipTitle + mainText: model.ToolTipTitle !== "" ? model.ToolTipTitle : model.Title + subText: model.ToolTipSubTitle + textFormat: Text.AutoText + + PlasmaCore.IconItem { + id: iconItem + parent: taskIcon.iconContainer + anchors.fill: iconItem.parent + + source: { + if (model.status === PlasmaCore.Types.NeedsAttentionStatus) { + if (model.AttentionIcon) { + return model.AttentionIcon + } + if (model.AttentionIconName) { + return model.AttentionIconName + } + } + return model.Icon ? model.Icon : model.IconName + } + active: taskIcon.containsMouse + } + + onContextMenu: { + openContextMenu(plasmoid.nativeInterface.popupPosition(taskIcon, mouse.x, mouse.y)) + } + + onClicked: { + var pos = plasmoid.nativeInterface.popupPosition(taskIcon, mouse.x, mouse.y); + var service = model.Service; + + switch (mouse.button) { + case Qt.LeftButton: + var operation = service.operationDescription("Activate"); + operation.x = pos.x; + operation.y = pos.y; + var job = service.startOperationCall(operation); + job.finished.connect(function () { + if (!job.result) { + // On error try to invoke the context menu. + // Workaround primarily for apps using libappindicator. + openContextMenu(pos); + } + }); + taskIcon.activated() + break; + case Qt.RightButton: + openContextMenu(pos); + break; + + case Qt.MiddleButton: + var operation = service.operationDescription("SecondaryActivate"); + operation.x = pos.x; + + operation.y = pos.y; + service.startOperationCall(operation); + taskIcon.activated() + break; + } + } + + function openContextMenu(pos) { + var service = model.Service; + var operation = service.operationDescription("ContextMenu"); + operation.x = pos.x; + operation.y = pos.y; + + var job = service.startOperationCall(operation); + job.finished.connect(function () { + plasmoid.nativeInterface.showStatusNotifierContextMenu(job, taskIcon); + }); + } + + onWheel: { + //don't send activateVertScroll with a delta of 0, some clients seem to break (kmix) + if (wheel.angleDelta.y !== 0) { + var service = model.Service; + var operation = service.operationDescription("Scroll"); + operation.delta =wheel.angleDelta.y; + operation.direction = "Vertical"; + service.startOperationCall(operation); + } + if (wheel.angleDelta.x !== 0) { + var service = model.Service; + var operation = service.operationDescription("Scroll"); + operation.delta =wheel.angleDelta.x; + operation.direction = "Horizontal"; + service.startOperationCall(operation); + } + } +} diff --git a/Plasma Widgets/System Tray/contents/ui/main.qml b/Plasma Widgets/System Tray/contents/ui/main.qml new file mode 100644 index 0000000..e284732 --- /dev/null +++ b/Plasma Widgets/System Tray/contents/ui/main.qml @@ -0,0 +1,238 @@ +/* + * Copyright 2011 Marco Martin + * Copyright 2020 Konrad Materka + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, 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 Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.5 +import QtQuick.Layouts 1.1 +import org.kde.plasma.core 2.1 as PlasmaCore +import org.kde.plasma.plasmoid 2.0 +import org.kde.draganddrop 2.0 as DnD +import org.kde.kirigami 2.5 as Kirigami + +import "items" + +MouseArea { + id: root + + readonly property bool vertical: plasmoid.formFactor === PlasmaCore.Types.Vertical + + Layout.minimumWidth: vertical ? PlasmaCore.Units.iconSizes.small : mainLayout.implicitWidth + PlasmaCore.Units.smallSpacing + Layout.minimumHeight: vertical ? mainLayout.implicitHeight + PlasmaCore.Units.smallSpacing : PlasmaCore.Units.iconSizes.small + + LayoutMirroring.enabled: !vertical && Qt.application.layoutDirection === Qt.RightToLeft + LayoutMirroring.childrenInherit: true + + readonly property alias systemTrayState: systemTrayState + readonly property alias itemSize: tasksGrid.itemSize + readonly property alias visibleLayout: tasksGrid + readonly property alias hiddenLayout: expandedRepresentation.hiddenLayout + + onWheel: { + // Don't propagate unhandled wheel events + wheel.accepted = true; + } + + SystemTrayState { + id: systemTrayState + } + + //being there forces the items to fully load, and they will be reparented in the popup one by one, this item is *never* visible + Item { + id: preloadedStorage + visible: false + } + + CurrentItemHighLight { + location: plasmoid.location + parent: root + } + + DnD.DropArea { + anchors.fill: parent + + preventStealing: true; + + /** Extracts the name of the system tray applet in the drag data if present + * otherwise returns null*/ + function systemTrayAppletName(event) { + if (event.mimeData.formats.indexOf("text/x-plasmoidservicename") < 0) { + return null; + } + var plasmoidId = event.mimeData.getDataAsByteArray("text/x-plasmoidservicename"); + + if (!plasmoid.nativeInterface.isSystemTrayApplet(plasmoidId)) { + return null; + } + return plasmoidId; + } + + onDragEnter: { + if (!systemTrayAppletName(event)) { + event.ignore(); + } + } + + onDrop: { + var plasmoidId = systemTrayAppletName(event); + if (!plasmoidId) { + event.ignore(); + return; + } + + if (plasmoid.configuration.extraItems.indexOf(plasmoidId) < 0) { + var extraItems = plasmoid.configuration.extraItems; + extraItems.push(plasmoidId); + plasmoid.configuration.extraItems = extraItems; + } + } + } + + //Main Layout + GridLayout { + id: mainLayout + + rowSpacing: 0 + columnSpacing: 0 + anchors.fill: parent + + flow: vertical ? GridLayout.TopToBottom : GridLayout.LeftToRight + + GridView { + id: tasksGrid + + Layout.alignment: Qt.AlignCenter + + interactive: false //disable features we don't need + flow: vertical ? GridView.LeftToRight : GridView.TopToBottom + + // The icon size to display when not using the auto-scaling setting + readonly property int smallIconSize: PlasmaCore.Units.iconSizes.smallMedium + readonly property bool autoSize: plasmoid.configuration.scaleIconsToFit + + readonly property int gridThickness: root.vertical ? root.width : root.height + // Should change to 2 rows/columns on a 56px panel (in standard DPI) + readonly property int rowsOrColumns: autoSize ? 1 : Math.max(1, Math.min(count, Math.floor(gridThickness / (smallIconSize + PlasmaCore.Units.smallSpacing)))) + + // Add margins only if the panel is larger than a small icon (to avoid large gaps between tiny icons) + readonly property int smallSizeCellLength: gridThickness < smallIconSize ? smallIconSize : smallIconSize + PlasmaCore.Units.smallSpacing * 2 + cellHeight: { + if (root.vertical) { + return autoSize ? root.width + PlasmaCore.Units.smallSpacing : smallSizeCellLength + } else { + return autoSize ? root.height : Math.floor(root.height / rowsOrColumns) + } + } + cellWidth: { + if (root.vertical) { + return autoSize ? root.width : Math.floor(root.width / rowsOrColumns) + } else { + return autoSize ? root.height + PlasmaCore.Units.smallSpacing : smallSizeCellLength + } + } + + //depending on the form factor, we are calculating only one dimention, second is always the same as root/parent + implicitHeight: root.vertical ? cellHeight * Math.ceil(count / rowsOrColumns) : root.height + implicitWidth: !root.vertical ? cellWidth * Math.ceil(count / rowsOrColumns) : root.width + + // Used only by AbstractItem, but it's easiest to keep it here since it + // uses dimensions from this item to calculate the final value + readonly property int itemSize: { + if (autoSize) { + const size = Math.min(implicitWidth / rowsOrColumns, implicitHeight / rowsOrColumns) + return PlasmaCore.Units.roundToIconSize(Math.min(size, PlasmaCore.Units.iconSizes.enormous)) + } else { + return smallIconSize + } + } + + model: PlasmaCore.SortFilterModel { + sourceModel: plasmoid.nativeInterface.systemTrayModel + filterRole: "effectiveStatus" + filterCallback: function(source_row, value) { + return value === PlasmaCore.Types.ActiveStatus + } + } + + delegate: ItemLoader {} + + add: Transition { + enabled: itemSize > 0 + + NumberAnimation { + property: "scale" + from: 0 + to: 1 + easing.type: Easing.InOutQuad + duration: PlasmaCore.Units.longDuration + } + } + + displaced: Transition { + //ensure scale value returns to 1.0 + //https://doc.qt.io/qt-5/qml-qtquick-viewtransition.html#handling-interrupted-animations + NumberAnimation { + property: "scale" + to: 1 + easing.type: Easing.InOutQuad + duration: PlasmaCore.Units.longDuration + } + } + + move: Transition { + NumberAnimation { + properties: "x,y" + easing.type: Easing.InOutQuad + duration: PlasmaCore.Units.longDuration + } + } + } + + ExpanderArrow { + id: expander + Layout.fillWidth: vertical + Layout.fillHeight: !vertical + Layout.alignment: vertical ? Qt.AlignVCenter : Qt.AlignHCenter + visible: root.hiddenLayout.itemCount > 0 + } + } + + //Main popup + PlasmaCore.Dialog { + id: dialog + visualParent: root + flags: Qt.WindowStaysOnTopHint + location: plasmoid.location + hideOnWindowDeactivate: !plasmoid.configuration.pin + visible: systemTrayState.expanded + + onVisibleChanged: { + systemTrayState.expanded = visible + } + mainItem: ExpandedRepresentation { + id: expandedRepresentation + + Keys.onEscapePressed: { + systemTrayState.expanded = false + } + + LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft + LayoutMirroring.childrenInherit: true + } + } +} diff --git a/Plasma Widgets/System Tray/metadata.desktop b/Plasma Widgets/System Tray/metadata.desktop new file mode 100644 index 0000000..408860a --- /dev/null +++ b/Plasma Widgets/System Tray/metadata.desktop @@ -0,0 +1,108 @@ +[Desktop Entry] +Name=System Tray +Name[af]=Stelsellaai +Name[ar]=صينية النظام +Name[ast]=Bandexa del sistema +Name[az]=Sistem Çəkməcəsi +Name[be]=Сістэмны трэй +Name[be@latin]=Systemny trej +Name[bg]=Системен панел +Name[bn]=সিস্টেম ট্রে +Name[bn_IN]=সিস্টেম ট্রে +Name[br]=Barlenn ar reizhiad +Name[bs]=Sistemska kaseta +Name[ca]=Safata del sistema +Name[ca@valencia]=Safata del sistema +Name[cs]=Systémová část panelu +Name[csb]=Systemòwi zabiérnik +Name[cy]=Bar Tasgau +Name[da]=Statusområde +Name[de]=Systemabschnitt der Kontrollleiste +Name[el]=Πλαίσιο συστήματος +Name[en_GB]=System Tray +Name[eo]=Sistempleto +Name[es]=Bandeja del sistema +Name[et]=Süsteemne dokk +Name[eu]=Sistema-erretilua +Name[fa]=سینی سیستم +Name[fi]=Ilmoitusalue +Name[fr]=Boîte à miniatures +Name[fy]=Systeemfak +Name[ga]=Tráidire an Chórais +Name[gl]=Bandexa do sistema +Name[gu]=સિસ્ટમ ટ્રે +Name[he]=מגש המערכת +Name[hi]=तंत्र तश्तरी +Name[hne]=तंत्र तस्तरी +Name[hr]=Sistemski blok +Name[hsb]=Systemowa wotkładka +Name[hu]=Paneltálca +Name[ia]=Tabuliero de systema +Name[id]=System Tray +Name[is]=Kerfisbakki +Name[it]=Vassoio di sistema +Name[ja]=システムトレイ +Name[ka]=სისტემური პანელი +Name[kk]=Жүйелік сөре +Name[km]=ថាស​ប្រព័ន្ធ +Name[kn]=ವ್ಯವಸ್ಥಾ ಖಾನೆ (ಟ್ರೇ) +Name[ko]=시스템 트레이 +Name[lt]=Sistemos dėklas +Name[lv]=Sistēmas ikonu josla +Name[mai]=तंत्र तश्तरी +Name[mk]=Системска лента +Name[ml]=സിസ്റ്റം ട്രേ +Name[mr]=प्रणाली ट्रे +Name[ms]=Dulang Sistem +Name[nb]=Systemkurv +Name[nds]=Paneel-Systeemafsnitt +Name[ne]=प्रणाली ट्रे +Name[nl]=Systeemvak +Name[nn]=Systemtrau +Name[or]=ତନ୍ତ୍ର ଧାରକ +Name[pa]=ਸਿਸਟਮ ਟਰੇ +Name[pl]=Tacka systemowa +Name[pt]=Bandeja do Sistema +Name[pt_BR]=Área de notificação +Name[ro]=Tavă de sistem +Name[ru]=Системный лоток +Name[se]=Vuogádatgárcu +Name[si]=පද්ධතිය තැටිය +Name[sk]=Systémová lišta +Name[sl]=Sistemska vrstica +Name[sr]=системска касета +Name[sr@ijekavian]=системска касета +Name[sr@ijekavianlatin]=sistemska kaseta +Name[sr@latin]=sistemska kaseta +Name[sv]=Systembricka +Name[ta]=சாதனத் தட்டு +Name[te]=వ్యవస్థ ట్రె +Name[tg]=Лавҳачаи низомӣ +Name[th]=ถาดระบบ +Name[tr]=Sistem Çekmecesi +Name[ug]=سىستېما قوندىقى +Name[uk]=Системний лоток +Name[vi]=Khay hệ thống +Name[wa]=Boesse ås imådjetes sistinme +Name[xh]=Itreyi Yendlela yokusebenza +Name[x-test]=xxSystem Trayxx +Name[zh_CN]=系统托盘 +Name[zh_TW]=系統匣 +Icon=preferences-desktop-notification +Type=Service +X-KDE-ServiceTypes=Plasma/Applet,Plasma/Containment + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml +X-KDE-PluginInfo-Author=Marco Martin +X-KDE-PluginInfo-Email=mart@kde.org +X-KDE-PluginInfo-Name=org.kde.plasma.private.systemtray +X-KDE-PluginInfo-Version=1.0 +X-KDE-PluginInfo-Website=https://www.kde.org/plasma-desktop +X-KDE-PluginInfo-Category=Windows and Tasks +X-KDE-PluginInfo-License=GPL-2.0+ +X-KDE-PluginInfo-EnabledByDefault=true +X-Plasma-ContainmentType=Panel +#this is the internal implementation: can't be loaded directly +NoDisplay=true +X-KDE-FormFactors=desktop diff --git a/Plasma Widgets/System Tray/metadata.json b/Plasma Widgets/System Tray/metadata.json new file mode 100644 index 0000000..cd635b0 --- /dev/null +++ b/Plasma Widgets/System Tray/metadata.json @@ -0,0 +1,117 @@ +{ + "KPlugin": { + "Authors": [ + { + "Email": "mart@kde.org", + "Name": "Marco Martin" + } + ], + "Category": "Windows and Tasks", + "EnabledByDefault": true, + "FormFactors": [ + "desktop" + ], + "Icon": "preferences-desktop-notification", + "Id": "org.kde.plasma.private.systemtray", + "License": "GPL-2.0+", + "Name": "System Tray", + "Name[af]": "Stelsellaai", + "Name[ar]": "صينية النظام", + "Name[ast]": "Bandexa del sistema", + "Name[az]": "Sistem Çəkməcəsi", + "Name[be@latin]": "Systemny trej", + "Name[be]": "Сістэмны трэй", + "Name[bg]": "Системен панел", + "Name[bn]": "সিস্টেম ট্রে", + "Name[bn_IN]": "সিস্টেম ট্রে", + "Name[br]": "Barlenn ar reizhiad", + "Name[bs]": "Sistemska kaseta", + "Name[ca@valencia]": "Safata del sistema", + "Name[ca]": "Safata del sistema", + "Name[cs]": "Systémová část panelu", + "Name[csb]": "Systemòwi zabiérnik", + "Name[cy]": "Bar Tasgau", + "Name[da]": "Statusområde", + "Name[de]": "Systemabschnitt der Kontrollleiste", + "Name[el]": "Πλαίσιο συστήματος", + "Name[en_GB]": "System Tray", + "Name[eo]": "Sistempleto", + "Name[es]": "Bandeja del sistema", + "Name[et]": "Süsteemne dokk", + "Name[eu]": "Sistema-erretilua", + "Name[fa]": "سینی سیستم", + "Name[fi]": "Ilmoitusalue", + "Name[fr]": "Boîte à miniatures", + "Name[fy]": "Systeemfak", + "Name[ga]": "Tráidire an Chórais", + "Name[gl]": "Bandexa do sistema", + "Name[gu]": "સિસ્ટમ ટ્રે", + "Name[he]": "מגש המערכת", + "Name[hi]": "तंत्र तश्तरी", + "Name[hne]": "तंत्र तस्तरी", + "Name[hr]": "Sistemski blok", + "Name[hsb]": "Systemowa wotkładka", + "Name[hu]": "Paneltálca", + "Name[ia]": "Tabuliero de systema", + "Name[id]": "System Tray", + "Name[is]": "Kerfisbakki", + "Name[it]": "Vassoio di sistema", + "Name[ja]": "システムトレイ", + "Name[ka]": "სისტემური პანელი", + "Name[kk]": "Жүйелік сөре", + "Name[km]": "ថាស​ប្រព័ន្ធ", + "Name[kn]": "ವ್ಯವಸ್ಥಾ ಖಾನೆ (ಟ್ರೇ)", + "Name[ko]": "시스템 트레이", + "Name[lt]": "Sistemos dėklas", + "Name[lv]": "Sistēmas ikonu josla", + "Name[mai]": "तंत्र तश्तरी", + "Name[mk]": "Системска лента", + "Name[ml]": "സിസ്റ്റം ട്രേ", + "Name[mr]": "प्रणाली ट्रे", + "Name[ms]": "Dulang Sistem", + "Name[nb]": "Systemkurv", + "Name[nds]": "Paneel-Systeemafsnitt", + "Name[ne]": "प्रणाली ट्रे", + "Name[nl]": "Systeemvak", + "Name[nn]": "Systemtrau", + "Name[or]": "ତନ୍ତ୍ର ଧାରକ", + "Name[pa]": "ਸਿਸਟਮ ਟਰੇ", + "Name[pl]": "Tacka systemowa", + "Name[pt]": "Bandeja do Sistema", + "Name[pt_BR]": "Área de notificação", + "Name[ro]": "Tavă de sistem", + "Name[ru]": "Системный лоток", + "Name[se]": "Vuogádatgárcu", + "Name[si]": "පද්ධතිය තැටිය", + "Name[sk]": "Systémová lišta", + "Name[sl]": "Sistemska vrstica", + "Name[sr@ijekavian]": "системска касета", + "Name[sr@ijekavianlatin]": "sistemska kaseta", + "Name[sr@latin]": "sistemska kaseta", + "Name[sr]": "системска касета", + "Name[sv]": "Systembricka", + "Name[ta]": "சாதனத் தட்டு", + "Name[te]": "వ్యవస్థ ట్రె", + "Name[tg]": "Лавҳачаи низомӣ", + "Name[th]": "ถาดระบบ", + "Name[tr]": "Sistem Çekmecesi", + "Name[ug]": "سىستېما قوندىقى", + "Name[uk]": "Системний лоток", + "Name[vi]": "Khay hệ thống", + "Name[wa]": "Boesse ås imådjetes sistinme", + "Name[x-test]": "xxSystem Trayxx", + "Name[xh]": "Itreyi Yendlela yokusebenza", + "Name[zh_CN]": "系统托盘", + "Name[zh_TW]": "系統匣", + "ServiceTypes": [ + "Plasma/Applet", + "Plasma/Containment" + ], + "Version": "1.0", + "Website": "https://www.kde.org/plasma-desktop" + }, + "NoDisplay": true, + "X-Plasma-API": "declarativeappletscript", + "X-Plasma-ContainmentType": "Panel", + "X-Plasma-MainScript": "ui/main.qml" +} diff --git a/README.md b/README.md index d80bd9f..0fb6b19 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,10 @@ there are any improvements to be made here, any and all effort would be greatly +### System Tray + + + ### Plasma Style @@ -272,6 +276,16 @@ or inconsistencies, for now post them in the next desktop threads. Make sure that your panel's width is set to 40. Also make sure that you're using the ```Icons-only Task Manager``` widget to make it look closer to Windows 7. +#### Modified System Tray + +This modification will add hover animations to the default system tray plasmoid, as well as remove the annoying popup animation which happens upon clicking on an item. +Since the system tray is a complex plasmoid, its files have to be replaced with a modified version provided in this theme. To do this, copy the ```org.kde.plasma.private.systemtray``` found in the ```Plasma Widgets``` folder to the following directory: + +```/usr/share/plasma/plasmoids/``` + +This will override the default System Tray plasmoid. It is not recommended to edit this particular plasmoid, so proceed with caution. Make sure to back up the original plasmoid somewhere safe. + + #### Digital Clock Lite Install the widget ```Digital Clock Lite``` (https://www.kde-look.org/p/1225135/) and replace the ugly large clock widget with @@ -282,6 +296,8 @@ it. By default it should already look a lot like Windows 7's clock, but if it do You can tweak the other settings to your liking. +#### Show Desktop (Win7) + Lastly, install the ```Show Desktop (Win7)``` widget (https://www.kde-look.org/p/1100895/) and configure it to these settings: In Look: diff --git a/Screenshots/System_Tray.png b/Screenshots/System_Tray.png new file mode 100644 index 0000000000000000000000000000000000000000..bccc892426b424417936241f3fa2eeeb25ba9355 GIT binary patch literal 83164 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 literal 0 HcmV?d00001