diff --git a/kde/plasma/look-and-feel/Sweet-Mars/contents/components/ActionButton.qml b/kde/plasma/look-and-feel/Sweet-Mars/contents/components/ActionButton.qml index 7a66c56..e8371ed 100644 --- a/kde/plasma/look-and-feel/Sweet-Mars/contents/components/ActionButton.qml +++ b/kde/plasma/look-and-feel/Sweet-Mars/contents/components/ActionButton.qml @@ -55,7 +55,7 @@ Item { width: iconSize + units.smallSpacing height: width radius: width / 2 - color: softwareRendering ? PlasmaCore.ColorScope.backgroundColor : PlasmaCore.ColorScope.textColor + color: "#090A0B" opacity: activeFocus || containsMouse ? (softwareRendering ? 0.8 : 0.15) : (softwareRendering ? 0.6 : 0) Behavior on opacity { PropertyAnimation { // OpacityAnimator makes it turn black at random intervals diff --git a/kde/plasma/look-and-feel/Sweet-Mars/contents/logout/Logout.qml b/kde/plasma/look-and-feel/Sweet-Mars/contents/logout/Logout.qml new file mode 100644 index 0000000..6fc7967 --- /dev/null +++ b/kde/plasma/look-and-feel/Sweet-Mars/contents/logout/Logout.qml @@ -0,0 +1,262 @@ +/*************************************************************************** + * Copyright (C) 2014 by Aleix Pol Gonzalez * + * * + * 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.2 +import QtQuick.Layouts 1.2 +import QtQuick.Controls 1.1 as Controls + +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents +import org.kde.kcoreaddons 1.0 as KCoreAddons + +import "../components" +import "timer.js" as AutoTriggerTimer + +import org.kde.plasma.private.sessions 2.0 + +PlasmaCore.ColorScope { + id: root + colorGroup: PlasmaCore.Theme.ComplementaryColorGroup + height: screenGeometry.height + width: screenGeometry.width + + signal logoutRequested() + signal haltRequested() + signal suspendRequested(int spdMethod) + signal rebootRequested() + signal rebootRequested2(int opt) + signal cancelRequested() + signal lockScreenRequested() + + property alias backgroundColor: backgroundRect.color + + function sleepRequested() { + root.suspendRequested(2); + } + + function hibernateRequested() { + root.suspendRequested(4); + } + + property real timeout: 30 + property real remainingTime: root.timeout + property var currentAction: { + switch (sdtype) { + case ShutdownType.ShutdownTypeReboot: + return root.rebootRequested; + case ShutdownType.ShutdownTypeHalt: + return root.haltRequested; + default: + return root.logoutRequested; + } + } + + KCoreAddons.KUser { + id: kuser + } + + // For showing a "other users are logged in" hint + SessionsModel { + id: sessionsModel + includeUnusedSessions: false + } + + Controls.Action { + onTriggered: root.cancelRequested() + shortcut: "Escape" + } + + onRemainingTimeChanged: { + if (remainingTime <= 0) { + root.currentAction(); + } + } + + Timer { + id: countDownTimer + running: true + repeat: true + interval: 1000 + onTriggered: remainingTime-- + Component.onCompleted: { + AutoTriggerTimer.addCancelAutoTriggerCallback(function() { + countDownTimer.running = false; + }); + } + } + + function isLightColor(color) { + return Math.max(color.r, color.g, color.b) > 0.5 + } + + Rectangle { + id: backgroundRect + anchors.fill: parent + //use "black" because this is intended to look like a general darkening of the scene. a dark gray as normal background would just look too "washed out" + color: "#1A1E21" + opacity: 0.2 + } + MouseArea { + anchors.fill: parent + onClicked: root.cancelRequested() + } + UserDelegate { + width: units.gridUnit * 7 + height: width + nameFontSize: theme.defaultFont.pointSize + 2 + anchors { + horizontalCenter: parent.horizontalCenter + bottom: parent.verticalCenter + } + constrainText: false + avatarPath: kuser.faceIconUrl + iconSource: "user-identity" + isCurrent: true + name: kuser.fullName + } + ColumnLayout { + anchors { + top: parent.verticalCenter + topMargin: units.gridUnit * 2 + horizontalCenter: parent.horizontalCenter + } + spacing: units.largeSpacing + + height: Math.max(implicitHeight, units.gridUnit * 10) + width: Math.max(implicitWidth, units.gridUnit * 16) + + PlasmaComponents.Label { + font.pointSize: theme.defaultFont.pointSize + 1 + Layout.maximumWidth: units.gridUnit * 16 + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + font.italic: true + text: i18ndp("plasma_lookandfeel_org.kde.lookandfeel", + "One other user is currently logged in. If the computer is shut down or restarted, that user may lose work.", + "%1 other users are currently logged in. If the computer is shut down or restarted, those users may lose work.", + sessionsModel.count) + visible: sessionsModel.count > 1 + } + + PlasmaComponents.Label { + font.pointSize: theme.defaultFont.pointSize + 1 + Layout.maximumWidth: units.gridUnit * 16 + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + font.italic: true + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "When restarted, the computer will enter the firmware setup screen.") + visible: rebootToFirmwareSetup + } + + RowLayout { + spacing: units.largeSpacing * 2 + Layout.alignment: Qt.AlignHCenter + LogoutButton { + id: suspendButton + iconSource: "system-suspend" + text: i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "Suspend to RAM", "Sleep") + action: root.sleepRequested + KeyNavigation.left: logoutButton + KeyNavigation.right: hibernateButton + visible: spdMethods.SuspendState + } + LogoutButton { + id: hibernateButton + iconSource: "system-suspend-hibernate" + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Hibernate") + action: root.hibernateRequested + KeyNavigation.left: suspendButton + KeyNavigation.right: rebootButton + visible: spdMethods.HibernateState + } + LogoutButton { + id: rebootButton + iconSource: "system-reboot" + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Restart") + action: root.rebootRequested + KeyNavigation.left: hibernateButton + KeyNavigation.right: shutdownButton + focus: sdtype === ShutdownType.ShutdownTypeReboot + visible: maysd + } + LogoutButton { + id: shutdownButton + iconSource: "system-shutdown" + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Shut Down") + action: root.haltRequested + KeyNavigation.left: rebootButton + KeyNavigation.right: logoutButton + focus: sdtype === ShutdownType.ShutdownTypeHalt + visible: maysd + } + LogoutButton { + id: logoutButton + iconSource: "system-log-out" + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Log Out") + action: root.logoutRequested + KeyNavigation.left: shutdownButton + KeyNavigation.right: suspendButton + focus: sdtype === ShutdownType.ShutdownTypeNone + visible: canLogout + } + } + + PlasmaComponents.Label { + font.pointSize: theme.defaultFont.pointSize + 1 + Layout.alignment: Qt.AlignHCenter + //opacity, as visible would re-layout + opacity: countDownTimer.running ? 1 : 0 + Behavior on opacity { + OpacityAnimator { + duration: units.longDuration + easing.type: Easing.InOutQuad + } + } + text: { + switch (sdtype) { + case ShutdownType.ShutdownTypeReboot: + return i18ndp("plasma_lookandfeel_org.kde.lookandfeel", "Restarting in 1 second", "Restarting in %1 seconds", root.remainingTime); + case ShutdownType.ShutdownTypeHalt: + return i18ndp("plasma_lookandfeel_org.kde.lookandfeel", "Shutting down in 1 second", "Shutting down in %1 seconds", root.remainingTime); + default: + return i18ndp("plasma_lookandfeel_org.kde.lookandfeel", "Logging out in 1 second", "Logging out in %1 seconds", root.remainingTime); + } + } + } + + RowLayout { + Layout.alignment: Qt.AlignHCenter + PlasmaComponents.Button { + font.pointSize: theme.defaultFont.pointSize + 1 + enabled: root.currentAction !== null + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "OK") + onClicked: root.currentAction() + } + PlasmaComponents.Button { + font.pointSize: theme.defaultFont.pointSize + 1 + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Cancel") + onClicked: root.cancelRequested() + } + } + } +} diff --git a/kde/plasma/look-and-feel/Sweet-Mars/contents/logout/LogoutButton.qml b/kde/plasma/look-and-feel/Sweet-Mars/contents/logout/LogoutButton.qml new file mode 100644 index 0000000..af1b79d --- /dev/null +++ b/kde/plasma/look-and-feel/Sweet-Mars/contents/logout/LogoutButton.qml @@ -0,0 +1,46 @@ +/*************************************************************************** + * Copyright (C) 2016 Marco Martin * + * * + * 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.2 +import QtQuick.Layouts 1.2 + +import org.kde.plasma.core 2.0 as PlasmaCore + +import "../components" +import "timer.js" as AutoTriggerTimer + +ActionButton { + property var action + onClicked: action() + Layout.alignment: Qt.AlignTop + iconSize: units.iconSizes.huge + circleVisiblity: activeFocus || containsMouse + circleOpacity: 0.55 // Selected option's circle is instantly visible + opacity: activeFocus || containsMouse ? 1 : 0.7 + labelRendering: Text.QtRendering // Remove once we've solved Qt bug: https://bugreports.qt.io/browse/QTBUG-70138 (KDE bug: https://bugs.kde.org/show_bug.cgi?id=401644) + font.underline: false + font.pointSize: theme.defaultFont.pointSize + 1 + Behavior on opacity { + OpacityAnimator { + duration: units.longDuration + easing.type: Easing.InOutQuad + } + } + Keys.onPressed: AutoTriggerTimer.cancelAutoTrigger(); +} diff --git a/kde/plasma/look-and-feel/Sweet-Mars/contents/logout/timer.js b/kde/plasma/look-and-feel/Sweet-Mars/contents/logout/timer.js new file mode 100644 index 0000000..eeb9a4b --- /dev/null +++ b/kde/plasma/look-and-feel/Sweet-Mars/contents/logout/timer.js @@ -0,0 +1,39 @@ +/*************************************************************************** + * Copyright (C) 2018 David Edmundson * + * * + * 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 . * + ***************************************************************************/ + +.pragma library + +//written as a library to share knowledge of when a key was pressed +//between the multiple views, so pressing a key on one cancels all timers + +var callbacks = []; + +function addCancelAutoTriggerCallback(callback) { + callbacks.push(callback); +} + +function cancelAutoTrigger() { + callbacks.forEach(function(c) { + if (!c) { + return; + } + c(); + }); +} +