diff --git a/applets/systemtray/package/contents/ui/main.qml b/applets/systemtray/package/contents/ui/main.qml --- a/applets/systemtray/package/contents/ui/main.qml +++ b/applets/systemtray/package/contents/ui/main.qml @@ -97,15 +97,6 @@ Containment.onAppletRemoved: { } - Connections { - target: plasmoid - onUserConfiguringChanged: { - if (plasmoid.userConfiguring) { - dialog.visible = false - } - } - } - Connections { target: plasmoid.configuration diff --git a/lookandfeel/contents/lockscreen/LockScreen.qml b/lookandfeel/contents/lockscreen/LockScreen.qml --- a/lookandfeel/contents/lockscreen/LockScreen.qml +++ b/lookandfeel/contents/lockscreen/LockScreen.qml @@ -23,39 +23,27 @@ import org.kde.plasma.private.sessions 2.0 import "../components" -Item { +Image { id: root property bool viewVisible: false property bool debug: false property string notification property UserSelect userSelect: null property int interfaceVersion: org_kde_plasma_screenlocker_greeter_interfaceVersion ? org_kde_plasma_screenlocker_greeter_interfaceVersion : 0 signal clearPassword() - LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft - LayoutMirroring.childrenInherit: true + source: backgroundPath || "../components/artwork/background.png" + fillMode: Image.PreserveAspectCrop + asynchronous: false - Rectangle { - anchors.fill: parent - gradient: Gradient { - GradientStop { - position: 0.0 - color: "#1fb4f9" - } - GradientStop { - position: 1.0 - color: "#197cf1" - } + onStatusChanged: { + if (status == Image.Error) { + source = "../components/artwork/background.png"; } - visible: image.status == Image.Null || image.status == Image.Error } - Image { - id: image - anchors.fill: parent - source: backgroundPath - fillMode: Image.PreserveAspectCrop - } + LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft + LayoutMirroring.childrenInherit: true Loader { id: mainLoader diff --git a/lookandfeel/contents/loginmanager/Background.qml b/lookandfeel/contents/loginmanager/Background.qml deleted file mode 100644 --- a/lookandfeel/contents/loginmanager/Background.qml +++ /dev/null @@ -1,56 +0,0 @@ -/*************************************************************************** -* Copyright (c) 2013 Abdurrahman AVCI -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without restriction, -* including without limitation the rights to use, copy, modify, merge, -* publish, distribute, sublicense, and/or sell copies of the Software, -* and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included -* in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE -* OR OTHER DEALINGS IN THE SOFTWARE. -* -***************************************************************************/ - -import QtQuick 2.2 - -Item { - id: container - - property alias source: image.source - property alias fillMode: image.fillMode - property alias status: image.status - - Rectangle { - anchors.fill: parent - gradient: Gradient { - GradientStop { - position: 0.0 - color: "#1fb4f9" - } - GradientStop { - position: 1.0 - color: "#197cf1" - } - } - visible: image.status == Image.Null || image.status == Image.Error - } - - Image { - id: image - anchors.fill: parent - - clip: fillMode == Image.PreserveAspectFit // as this overflows into the other screen potentially - smooth: true - } -} diff --git a/lookandfeel/contents/loginmanager/KeyboardButton.qml b/lookandfeel/contents/loginmanager/KeyboardButton.qml deleted file mode 100644 --- a/lookandfeel/contents/loginmanager/KeyboardButton.qml +++ /dev/null @@ -1,31 +0,0 @@ -import QtQuick 2.2 - -import QtQuick.Controls 1.1 //for Menu - -import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.plasma.components 2.0 as PlasmaComponents - -PlasmaComponents.ToolButton { - id: keyboardButton - - property int currentIndex: -1 - - text: menu.items[currentIndex].text - implicitWidth: minimumWidth - - //if we bind directly we would set text, before we've populated the menu which it gets the text from - Component.onCompleted: currentIndex = Qt.binding(function() {return keyboard.currentLayout}); - - menu: Menu { - id: menu - Instantiator { - model: keyboard.layouts - delegate: MenuItem { - text: modelData.shortName - onTriggered: keyboard.currentLayout = model.index - - } - onObjectAdded: menu.insertItem(index, object); - } - } -} diff --git a/lookandfeel/contents/loginmanager/Login.qml b/lookandfeel/contents/loginmanager/Login.qml deleted file mode 100644 --- a/lookandfeel/contents/loginmanager/Login.qml +++ /dev/null @@ -1,227 +0,0 @@ -import QtQuick 2.2 - -import QtQuick.Layouts 1.1 -import QtQuick.Controls 1.1 - -import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.plasma.components 2.0 as PlasmaComponents - -Item { - id: root - - property bool searching: false - property bool loggingIn: false - property string notificationMessage - property int sessionIndex - - onSearchingChanged: { - mainStack.pop() - if (searching) { - mainStack.push(usernameInput); - } else { - mainStack.push(userView); - } - mainStack.currentItem.forceActiveFocus(); - } - - PlasmaCore.DataSource { - id: timeSource - engine: "time" - connectedSources: ["Local"] - interval: 60000 - intervalAlignment: PlasmaCore.Types.AlignToMinute - } - - PlasmaCore.DataSource { - id: keystateSource - engine: "keystate" - connectedSources: "Caps Lock" - } - - Component { - id: userView - //even though stackview is a scope in itself we need a spacer item to align the user list - //so that components are always the same height. - //if the stackview changes height the animation looks weird - - //FocusScope rather than Item to focus proxy onto the user list - FocusScope { - function incrementCurrentIndex() { - userList.incrementCurrentIndex(); - } - - function decrementCurrentIndex() { - userList.decrementCurrentIndex() - } - - property alias userName: userList.selectedUser - - UserList { - id: userList - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - model: userModel - focus: true - currentIndex: userModel.lastIndex - onUserSelected: nextItemInFocusChain().forceActiveFocus() - } - } - } - - Component { - id: usernameInput - FocusScope { - property alias userName: userNameInput.text - - UserDelegate { - anchors.bottom: userNameInput.top - anchors.horizontalCenter: parent.horizontalCenter - iconSource: "user-none" - } - - PlasmaComponents.TextField { - id: userNameInput - focus: true - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottom: parent.bottom - placeholderText: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Username"); - } - } - } - - function startLogin() { - root.loggingIn = true - root.notificationMessage = "" - sddm.login(mainStack.currentItem.userName, passwordBox.text, root.sessionIndex) - } - - Connections { - target: sddm - onLoginFailed: { - root.loggingIn = false - root.notificationMessage = i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Login Failed") - notificationResetTimer.start(); - } - } - - //Resets the "Login Failed" notification after n seconds - Timer { - id: notificationResetTimer - interval: 5000 - onTriggered: root.notificationMessage = "" - } - - ColumnLayout { - anchors { - horizontalCenter: parent.horizontalCenter - bottom: mainStack.bottom - // so it is positioined above the users but doesn't overlap them - bottomMargin: units.gridUnit * 11 - } - - PlasmaComponents.Label { - Layout.fillWidth: true - height: undefined // unset Label default - horizontalAlignment: Text.AlignHCenter - font.pointSize: dateLabel.font.pointSize * 4 - // there's a bug in Qt's native rendering where it will screw up large fonts - renderType: Text.QtRendering - text: Qt.formatTime(timeSource.data["Local"]["DateTime"]) - } - - PlasmaComponents.Label { - id: dateLabel - Layout.fillWidth: true - height: undefined // unset Label default - horizontalAlignment: Text.AlignHCenter - text: Qt.formatDate(timeSource.data["Local"]["DateTime"], Qt.DefaultLocaleLongDate) - } - } - - //main bit: - StackView { - id: mainStack - anchors.left: parent.left - anchors.right: parent.right - anchors.top: parent.top - anchors.bottom: passwordBox.top - anchors.bottomMargin: units.smallSpacing - - initialItem: searching ? usernameInput : userView - } - - PlasmaComponents.TextField { - id: passwordBox - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - anchors.verticalCenterOffset: units.largeSpacing * 5 - placeholderText: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Password") - focus: true - - enabled: !loggingIn - echoMode: TextInput.Password - - onAccepted: startLogin() - - //focus works in qmlscene - //but this seems to be needed when loaded from SDDM - //I don't understand why, but we have seen this before in the old lock screen - Timer { - interval: 200 - running: true - onTriggered: passwordBox.forceActiveFocus() - } - - Keys.onEscapePressed: { - mainStack.currentItem.forceActiveFocus(); - } - - //if empty and left or right is pressed change selection in user switch - //this cannot be in keys.onLeftPressed as then it doesn't reach the password box - Keys.onPressed: { - if (text.length > 0) { - return; - } - - if (event.key == Qt.Key_Left && mainStack.currentItem.decrementCurrentIndex) { - mainStack.currentItem.decrementCurrentIndex(); - event.accepted = true - } - if (event.key == Qt.Key_Right && mainStack.currentItem.incrementCurrentIndex) { - mainStack.currentItem.incrementCurrentIndex(); - event.accepted = true - } - } - } - - PlasmaComponents.Button { - id: loginButton - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: passwordBox.bottom - anchors.topMargin: units.smallSpacing - - text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Login") - enabled: !loggingIn - - onClicked: startLogin(); - } - - PlasmaComponents.Label { - id: notificationsLabel - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: loginButton.bottom - anchors.topMargin: units.smallSpacing - text: { - var text = "" - if (keystateSource.data["Caps Lock"]["Locked"]) { - text += i18nd("plasma_lookandfeel_org.kde.lookandfeel","Caps Lock is on") - if (root.notificationMessage) { - text += " • " - } - } - text += root.notificationMessage - return text - } - } -} diff --git a/lookandfeel/contents/loginmanager/Main.qml b/lookandfeel/contents/loginmanager/Main.qml --- a/lookandfeel/contents/loginmanager/Main.qml +++ b/lookandfeel/contents/loginmanager/Main.qml @@ -18,123 +18,258 @@ */ import QtQuick 2.2 - import QtQuick.Layouts 1.1 -import QtQuick.Controls 1.1 +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.plasma.extras 2.0 as PlasmaExtras -import org.kde.plasma.workspace.components 2.0 +import SddmComponents 2.0 + +import "./components" -PlasmaCore.ColorScope { +Image { id: root - colorGroup: PlasmaCore.Theme.ComplementaryColorGroup - width: 1600 - height: 900 + width: 1000 + height: 1000 LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft LayoutMirroring.childrenInherit: true Repeater { model: screenModel - Background { - x: geometry.x - y: geometry.y - width: geometry.width - height:geometry.height + x: geometry.x; y: geometry.y; width: geometry.width; height:geometry.height source: config.background fillMode: Image.PreserveAspectCrop + onStatusChanged: { + if (status == Image.Error && source != config.defaultBackground) { + source = config.defaultBackground + } + } } } - Login { - id: login - sessionIndex: sessionButton.currentIndex + property bool debug: false + + Rectangle { + id: debug3 + color: "green" + visible: debug + width: 3 + height: parent.height + anchors.horizontalCenter: root.horizontalCenter + } - anchors.top: parent.top - anchors.topMargin: footer.height - anchors.bottom: footer.top - anchors.left: parent.left - anchors.right: parent.right + Controls.StackView { + id: stackView - searching: !config.usernamePrompt + //Display the loginpromt only in the primary screen + readonly property rect geometry: screenModel.geometry(screenModel.primary) + width: geometry.width + x: geometry.x + height: units.largeSpacing*14 + //Display the BreezeBlock in the middle of each screen + y: geometry.y + (geometry.height / 2) - (height / 2) - focus: true - } + initialItem: BreezeBlock { + id: loginPrompt - //Footer - RowLayout { - id: footer - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: units.smallSpacing - - SessionButton { - id: sessionButton - Component.onCompleted: { - currentIndex = sessionModel.lastIndex + //Enable clipping whilst animating, otherwise the items would be shifted to other screens in multiscreen setups + //As there are only 2 items (loginPrompt and logoutScreenComponent), it's sufficient to do it only in this component + //Remember to enable clipping whilst animating when creating additional items for the StackView! + Controls.Stack.onStatusChanged: { + if(Controls.Stack.status === Controls.Stack.Activating || Controls.Stack.status === Controls.Stack.Deactivating){ + stackView.clip = true; + }else if(Controls.Stack.status === Controls.Stack.Active || Controls.Stack.status === Controls.Stack.Inactive){ + stackView.clip = false; + } } - } - PlasmaComponents.ToolButton { - implicitWidth: minimumWidth - property alias searching : login.searching - iconSource: searching ? "edit-select" : "search" - text: searching ? i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Select User") : - i18nd("plasma_lookandfeel_org.kde.lookandfeel","Search for User") + main: UserSelect { + model: userModel + selectedIndex: userModel.lastIndex + + //Resets the "Login Failed" notification after 3 seconds + Timer { + id: notificationResetTimer + interval: 3000 + onTriggered: notification = "" + } + + Connections { + target: sddm + onLoginFailed: { + notificationResetTimer.restart() + notification = i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Login Failed") + } + } - onClicked: { - searching = !searching } - } - Item { - Layout.fillWidth: true - } - PlasmaComponents.ToolButton { - iconSource: "system-suspend" - text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Suspend") - implicitWidth: minimumWidth - onClicked: sddm.suspend() - visible: sddm.canSuspend - } + controls: Item { + height: childrenRect.height - PlasmaComponents.ToolButton { - iconSource: "system-reboot" - text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Restart") - implicitWidth: minimumWidth - onClicked: sddm.reboot() - visible: sddm.canReboot - } + property alias password: passwordInput.text + property alias sessionIndex: sessionCombo.currentIndex + property alias buttonEnabled: loginButton.enabled + property alias pwFieldEnabled: passwordInput.enabled - PlasmaComponents.ToolButton { - iconSource: "system-shutdown" - text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Shutdown") - implicitWidth: minimumWidth - onClicked: sddm.powerOff() - visible: sddm.canPowerOff - } + ColumnLayout { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 0 + RowLayout { + anchors.horizontalCenter: parent.horizontalCenter + + PlasmaComponents.Button { + id: kbdLayoutButton + implicitWidth: minimumWidth + text: keyboard.layouts[keyboard.currentLayout].shortName + visible: keyboard.layouts.length > 1 + + onClicked: { + var idx = (keyboard.currentLayout + 1) % keyboard.layouts.length; + keyboard.currentLayout = idx; + } + + KeyNavigation.tab: sessionCombo + } + + PlasmaComponents.TextField { + id: passwordInput + placeholderText: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Password") + echoMode: TextInput.Password + onAccepted: loginPrompt.startLogin() + focus: true + + //focus works in qmlscene + //but this seems to be needed when loaded from SDDM + //I don't understand why, but we have seen this before in the old lock screen + Timer { + interval: 200 + running: true + onTriggered: passwordInput.forceActiveFocus() + } + //end hack - BatteryIcon { - implicitWidth: units.iconSizes.medium - implicitHeight: units.iconSizes.medium + Keys.onEscapePressed: { + loginPrompt.mainItem.forceActiveFocus(); + } - visible: pmSource.data["Battery"]["Has Cumulative"] + //if empty and left or right is pressed change selection in user switch + //this cannot be in keys.onLeftPressed as then it doesn't reach the password box + Keys.onPressed: { + if (event.key == Qt.Key_Left && !text) { + loginPrompt.mainItem.decrementCurrentIndex(); + event.accepted = true + } + if (event.key == Qt.Key_Right && !text) { + loginPrompt.mainItem.incrementCurrentIndex(); + event.accepted = true + } + } - hasBattery: true - percent: pmSource.data["Battery"]["Percent"] - pluggedIn: pmSource.data["AC Adapter"] ? pmSource.data["AC Adapter"]["Plugged in"] : false + KeyNavigation.backtab: loginPrompt.mainItem + } + + PlasmaComponents.Button { + id: loginButton + //this keeps the buttons the same width and thus line up evenly around the centre + Layout.minimumWidth: passwordInput.width + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Login") + onClicked: loginPrompt.startLogin(); + + KeyNavigation.tab: kbdLayoutButton + } + } + + BreezeLabel { + id: capsLockWarning + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Caps Lock is on") + visible: keystateSource.data["Caps Lock"]["Locked"] + + anchors.horizontalCenter: parent.horizontalCenter + font.weight: Font.Bold + + PlasmaCore.DataSource { + id: keystateSource + engine: "keystate" + connectedSources: "Caps Lock" + } + } + } + + PlasmaComponents.ComboBox { + id: sessionCombo + model: sessionModel + currentIndex: sessionModel.lastIndex + + width: 200 + textRole: "name" + + anchors.left: parent.left + } + + LogoutOptions { + mode: "" + canShutdown: true + canReboot: true + canLogout: false + exclusive: false + + anchors { + right: parent.right + } + + onModeChanged: { + if (mode) { + stackView.push(logoutScreenComponent, {"mode": mode}) + } + } + onVisibleChanged: if(visible) { + mode = "" + } + } + + Connections { + target: sddm + onLoginFailed: { + //Re-enable button and textfield + passwordInput.enabled = true + passwordInput.selectAll() + passwordInput.forceActiveFocus() + loginButton.enabled = true; + } + } - PlasmaCore.DataSource { - id: pmSource - engine: "powermanagement" - connectedSources: ["Battery", "AC Adapter"] + } + + function startLogin () { + //Disable button and textfield while password check is running + controlsItem.pwFieldEnabled = false; + controlsItem.buttonEnabled = false; + //Clear notification in case the notificationResetTimer hasn't expired yet + mainItem.notification = "" + sddm.login(mainItem.selectedUser, controlsItem.password, controlsItem.sessionIndex) + } + + Component { + id: logoutScreenComponent + LogoutScreen { + onCancel: { + stackView.pop() + } + + onShutdownRequested: { + sddm.powerOff() + } + + onRebootRequested: { + sddm.reboot() + } + } } } - KeyboardButton { } + } } diff --git a/lookandfeel/contents/loginmanager/SessionButton.qml b/lookandfeel/contents/loginmanager/SessionButton.qml deleted file mode 100644 --- a/lookandfeel/contents/loginmanager/SessionButton.qml +++ /dev/null @@ -1,29 +0,0 @@ -import QtQuick 2.2 -import QtQml 2.2 - -import QtQuick.Controls 1.1 //for Menu - -import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.plasma.components 2.0 as PlasmaComponents - -PlasmaComponents.ToolButton { - id: root - property int currentIndex: -1 - - implicitWidth: minimumWidth - - iconSource: "" - text: menu.items[currentIndex].text - - menu: Menu { - Instantiator { - model: sessionModel - delegate: MenuItem { - text: model.name - onTriggered: root.currentIndex = model.index - - } - onObjectAdded: menu.insertItem(index, object); - } - } -} diff --git a/lookandfeel/contents/loginmanager/UserDelegate.qml b/lookandfeel/contents/loginmanager/UserDelegate.qml deleted file mode 100644 --- a/lookandfeel/contents/loginmanager/UserDelegate.qml +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2014 David Edmundson - * Copyright 2014 Aleix Pol Gonzalez - * - * 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 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 org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.plasma.components 2.0 as PlasmaComponents - -Item { - id: wrapper - - property bool isCurrent: ListView.isCurrentItem - - property string name - property string userName - property string iconSource - - implicitWidth: units.gridUnit * 10 //6 wide + 1 either side spacing - implicitHeight: units.gridUnit * 9 + (userName ? usernameDelegate.implicitHeight : 0) - - signal clicked() - - Item { - id: imageSource - implicitWidth: units.gridUnit * 8 - implicitHeight: implicitWidth - - //we sometimes have a path to an image sometimes an icon - //IconItem tries to load a full path as an icon which is rubbish - //we try loading it as a normal image, if that fails we fall back to IconItem - Image { - id: face - source: wrapper.iconSource - fillMode: Image.PreserveAspectCrop - anchors.fill: parent - } - - PlasmaCore.IconItem { - id: faceIcon - source: (face.status === Image.Error || face.status === Image.Null) ? - (userName ? "user-identity" : "user-none") : undefined - visible: valid - anchors.fill: parent - } - } - - ShaderEffect { - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - - implicitWidth: imageSource.width - implicitHeight: imageSource.height - - supportsAtlasTextures: true - - property var source: ShaderEffectSource { - sourceItem: imageSource - hideSource: true - live: false - } - - property var colorBorder: theme.buttonFocusColor - - //draw a circle with an antialised border - //innerRadius = size of the inner circle with contents - //outerRadius = size of the border - //blend = area to blend between two colours - //all sizes are normalised so 0.5 == half the width of the texture - - //if copying into another project don't forget to * qt_Opacity. It's just unused here - //and connect themeChanged to update() - fragmentShader: " - varying highp vec2 qt_TexCoord0; - uniform highp float qt_Opacity; - uniform lowp sampler2D source; - - uniform vec4 colorBorder; - float blend = 0.01; - float innerRadius = 0.48; - float outerRadius = innerRadius + 0.02; - vec4 colorEmpty = vec4(0.0, 0.0, 0.0, 0.0); - - void main() { - vec4 colorSource = texture2D(source, qt_TexCoord0.st); - - vec2 m = qt_TexCoord0 - vec2(0.5, 0.5); - float dist = sqrt(m.x * m.x + m.y * m.y); - - if (dist < innerRadius) - gl_FragColor = colorSource; - else if (dist < innerRadius + blend) - gl_FragColor = mix(colorSource, colorBorder, ((dist - innerRadius) / blend)); - else if (dist < outerRadius) - gl_FragColor = colorBorder; - else if (dist < outerRadius + blend) - gl_FragColor = mix(colorBorder, colorEmpty, ((dist - outerRadius) / blend)); - else - gl_FragColor = colorEmpty; - } - " - } - - PlasmaComponents.Label { - id: usernameDelegate - anchors { - bottom: parent.bottom - left: parent.left - right: parent.right - } - text: wrapper.name - elide: Text.ElideRight - horizontalAlignment: Text.AlignHCenter - //make an indication that this has active focus, this only happens when reached with text navigation - font.underline: wrapper.activeFocus - } - - MouseArea { - anchors.fill: parent - hoverEnabled: true - - onClicked: wrapper.clicked(); - } - - Accessible.name: name - Accessible.role: Accessible.Button - Accessible.onPressAction: wrapper.clicked() -} diff --git a/lookandfeel/contents/loginmanager/UserList.qml b/lookandfeel/contents/loginmanager/UserList.qml deleted file mode 100644 --- a/lookandfeel/contents/loginmanager/UserList.qml +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2014 David Edmundson - * - * 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 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 - -ListView { - id: view - readonly property string selectedUser: currentItem ? currentItem.userName : "" - readonly property int userItemWidth: units.gridUnit * 10 - readonly property int userItemHeight: units.gridUnit * 10 - readonly property int userFaceSize: units.gridUnit * 6 - - implicitHeight: userItemHeight - - activeFocusOnTab : true - - /* - * Signals that a user was explicitly selected - */ - signal userSelected; - - orientation: ListView.Horizontal - highlightRangeMode: ListView.StrictlyEnforceRange - - //centre align selected item (which implicitly centre aligns the rest - preferredHighlightBegin: width/2 - userItemWidth/2 - preferredHighlightEnd: preferredHighlightBegin - - delegate: UserDelegate { - name: model.realName || model.name - userName: model.name - iconSource: model.icon || "" - - onClicked: { - ListView.view.currentIndex = index; - ListView.view.userSelected(); - } - } - - Keys.onEscapePressed: view.userSelected() - Keys.onEnterPressed: view.userSelected() - Keys.onReturnPressed: view.userSelected() -} diff --git a/lookandfeel/contents/loginmanager/breeze.jpg b/lookandfeel/contents/loginmanager/breeze.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0def3436427a3db8bfed9f153a2ce8e5fde505a GIT binary patch literal 61302 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 literal 0 Hc$@ - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lookandfeel/contents/splash/Splash.qml b/lookandfeel/contents/splash/Splash.qml --- a/lookandfeel/contents/splash/Splash.qml +++ b/lookandfeel/contents/splash/Splash.qml @@ -1,6 +1,5 @@ /* * Copyright 2014 Marco Martin - * Copyright 2016 Kai Uwe Broulik * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -19,81 +18,85 @@ */ import QtQuick 2.5 -import QtQuick.Window 2.2 -Item { +Image { + id: root + source: "../components/artwork/background.png" + fillMode: Image.PreserveAspectCrop + property int stage onStageChanged: { if (stage == 1) { - introAnimation.start() + introAnimation.running = true } } - TextMetrics { id: units text: "M" - readonly property int gridUnit: boundingRect.height + property int gridUnit: boundingRect.height } Rectangle { - anchors.fill: parent - gradient: Gradient { - GradientStop { - position: 0.0 - color: "#1fb4f9" + id: topRect + width: parent.width + height: units.gridUnit * 14 + anchors.centerIn: parent + color: "#4C000000" + Column { + id: content + y: units.gridUnit + x: parent.width + Image { + anchors.horizontalCenter: parent.horizontalCenter + source: "images/kde.svgz" + sourceSize.height: units.gridUnit * 8 + sourceSize.width: units.gridUnit * 8 } - GradientStop { - position: 1.0 - color: "#197cf1" + Item { + width: 1 + height: Math.round(units.gridUnit * 3 - progressBar.height/2) } - } - } - - Column { - id: content - anchors.centerIn: parent - spacing: units.gridUnit * 3 - opacity: 0 - - Image { - readonly property int size: units.gridUnit * 8 - anchors.horizontalCenter: parent.horizontalCenter - source: "images/kde.svgz" - width: size - height: size - sourceSize: Qt.size(size * Screen.devicePixelRatio, size * Screen.devicePixelRatio) - } - - Rectangle { - radius: height - color: "#31363b" - height: Math.round(units.gridUnit / 2) - width: height * 32 - Rectangle { + id: progressBar radius: height - anchors { - left: parent.left - top: parent.top - bottom: parent.bottom - } - width: Math.round((parent.width / 5) * (stage - 1)) - Behavior on width { - PropertyAnimation { - duration: 250 - easing.type: Easing.InOutQuad + color: "#31363b" + height: Math.round(units.gridUnit/2) + width: height*32 + Rectangle { + radius: 3 + anchors { + left: parent.left + top: parent.top + bottom: parent.bottom + } + width: (parent.width / 6) * (stage - 1) + color: "#3daee9" + Behavior on width { + PropertyAnimation { + duration: 250 + easing.type: Easing.InOutQuad + } } } } } + Rectangle { + id: separator + height: 1 + color: "#fdfdfd" + width: parent.width + opacity: 0.4 + y: parent.height - units.gridUnit * 4 + } } - OpacityAnimator { + XAnimator { id: introAnimation + running: false target: content - from: 0 - to: 1 + from: root.width + to: root.width / 2 - content.width/2 duration: 1000 easing.type: Easing.InOutQuad }