summaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/ActionButton.qml128
-rw-r--r--components/Battery.qml56
-rw-r--r--components/Clock.qml50
-rw-r--r--components/KeyboardLayoutButton.qml47
-rw-r--r--components/SessionManagementScreen.qml122
-rw-r--r--components/UserDelegate.qml191
-rw-r--r--components/UserList.qml99
-rw-r--r--components/VirtualKeyboard.qml28
-rw-r--r--components/WallpaperFader.qml184
-rw-r--r--components/artwork/logout_primary.svgzbin0 -> 2514 bytes
-rw-r--r--components/artwork/restart_primary.svgzbin0 -> 1860 bytes
-rw-r--r--components/artwork/shutdown_primary.svgzbin0 -> 1738 bytes
12 files changed, 905 insertions, 0 deletions
diff --git a/components/ActionButton.qml b/components/ActionButton.qml
new file mode 100644
index 0000000..342e0f9
--- /dev/null
+++ b/components/ActionButton.qml
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2016 David Edmundson <davidedmundson@kde.org>
+ *
+ * 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.8
+import org.kde.plasma.core 2.0 as PlasmaCore
+import org.kde.plasma.components 3.0 as PlasmaComponents3
+
+Item {
+ id: root
+ property alias text: label.text
+ property alias iconSource: icon.source
+ property alias containsMouse: mouseArea.containsMouse
+ property alias font: label.font
+ property alias labelRendering: label.renderType
+ property alias circleOpacity: iconCircle.opacity
+ property alias circleVisiblity: iconCircle.visible
+ property int fontSize: PlasmaCore.Theme.defaultFont.pointSize + 1
+ readonly property bool softwareRendering: GraphicsInfo.api === GraphicsInfo.Software
+ signal clicked
+
+ activeFocusOnTab: true
+
+ property int iconSize: units.gridUnit * 3
+
+ implicitWidth: Math.max(iconSize + units.largeSpacing * 2, label.contentWidth)
+ implicitHeight: iconSize + units.smallSpacing + label.implicitHeight
+
+ opacity: activeFocus || containsMouse ? 1 : 0.85
+ Behavior on opacity {
+ PropertyAnimation { // OpacityAnimator makes it turn black at random intervals
+ duration: units.longDuration
+ easing.type: Easing.InOutQuad
+ }
+ }
+
+ Rectangle {
+ id: iconCircle
+ anchors.centerIn: icon
+ width: iconSize + units.smallSpacing
+ height: width
+ radius: width / 2
+ color: softwareRendering ? PlasmaCore.ColorScope.backgroundColor : PlasmaCore.ColorScope.textColor
+ opacity: activeFocus || containsMouse ? (softwareRendering ? 0.8 : 0.15) : (softwareRendering ? 0.6 : 0)
+ Behavior on opacity {
+ PropertyAnimation { // OpacityAnimator makes it turn black at random intervals
+ duration: units.longDuration
+ easing.type: Easing.InOutQuad
+ }
+ }
+ }
+
+ Rectangle {
+ anchors.centerIn: iconCircle
+ width: iconCircle.width
+ height: width
+ radius: width / 2
+ scale: mouseArea.containsPress ? 1 : 0
+ color: PlasmaCore.ColorScope.textColor
+ opacity: 0.15
+ Behavior on scale {
+ PropertyAnimation {
+ duration: units.shortDuration
+ easing.type: Easing.InOutQuart
+ }
+ }
+ }
+
+ PlasmaCore.IconItem {
+ id: icon
+ anchors {
+ top: parent.top
+ horizontalCenter: parent.horizontalCenter
+ }
+ width: iconSize
+ height: iconSize
+
+ colorGroup: PlasmaCore.ColorScope.colorGroup
+ active: mouseArea.containsMouse || root.activeFocus
+ }
+
+ PlasmaComponents3.Label {
+ id: label
+ font.pointSize: root.fontSize
+ anchors {
+ top: icon.bottom
+ topMargin: (softwareRendering ? 1.5 : 1) * units.smallSpacing
+ left: parent.left
+ right: parent.right
+ }
+ style: softwareRendering ? Text.Outline : Text.Normal
+ styleColor: softwareRendering ? PlasmaCore.ColorScope.backgroundColor : "transparent" //no outline, doesn't matter
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignTop
+ wrapMode: Text.WordWrap
+ font.underline: root.activeFocus
+ }
+
+ MouseArea {
+ id: mouseArea
+ hoverEnabled: true
+ onClicked: root.clicked()
+ anchors.fill: parent
+ }
+
+ Keys.onEnterPressed: clicked()
+ Keys.onReturnPressed: clicked()
+ Keys.onSpacePressed: clicked()
+
+ Accessible.onPressAction: clicked()
+ Accessible.role: Accessible.Button
+ Accessible.name: label.text
+}
diff --git a/components/Battery.qml b/components/Battery.qml
new file mode 100644
index 0000000..93796c6
--- /dev/null
+++ b/components/Battery.qml
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2016 Kai Uwe Broulik <kde@privat.broulik.de>
+ *
+ * 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
+
+import org.kde.plasma.core 2.0 as PlasmaCore
+import org.kde.plasma.components 3.0 as PlasmaComponents3
+import org.kde.plasma.workspace.components 2.0 as PW
+
+Row {
+ id: row
+
+ property int fontSize: PlasmaCore.Theme.defaultFont.pointSize
+
+ spacing: PlasmaCore.Units.smallSpacing
+ visible: pmSource.data["Battery"]["Has Cumulative"]
+
+ PlasmaCore.DataSource {
+ id: pmSource
+ engine: "powermanagement"
+ connectedSources: ["Battery", "AC Adapter"]
+ }
+
+ PW.BatteryIcon {
+ id: battery
+ hasBattery: pmSource.data["Battery"]["Has Battery"] || false
+ percent: pmSource.data["Battery"]["Percent"] || 0
+ pluggedIn: pmSource.data["AC Adapter"] ? pmSource.data["AC Adapter"]["Plugged in"] : false
+
+ height: batteryLabel.height
+ width: height
+ }
+
+ PlasmaComponents3.Label {
+ id: batteryLabel
+ font.pointSize: row.fontSize
+ text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","%1%", battery.percent)
+ Accessible.name: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Battery at %1%", battery.percent)
+ }
+}
diff --git a/components/Clock.qml b/components/Clock.qml
new file mode 100644
index 0000000..cece7be
--- /dev/null
+++ b/components/Clock.qml
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016 David Edmundson <davidedmundson@kde.org>
+ *
+ * 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.8
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.5
+import org.kde.plasma.core 2.0
+
+ColumnLayout {
+ readonly property bool softwareRendering: GraphicsInfo.api === GraphicsInfo.Software
+
+ Label {
+ text: Qt.formatTime(timeSource.data["Local"]["DateTime"])
+ color: ColorScope.textColor
+ style: softwareRendering ? Text.Outline : Text.Normal
+ styleColor: softwareRendering ? ColorScope.backgroundColor : "transparent" //no outline, doesn't matter
+ font.pointSize: 48
+ Layout.alignment: Qt.AlignHCenter
+ }
+ Label {
+ text: Qt.formatDate(timeSource.data["Local"]["DateTime"], Qt.DefaultLocaleLongDate)
+ color: ColorScope.textColor
+ style: softwareRendering ? Text.Outline : Text.Normal
+ styleColor: softwareRendering ? ColorScope.backgroundColor : "transparent" //no outline, doesn't matter
+ font.pointSize: 24
+ Layout.alignment: Qt.AlignHCenter
+ }
+ DataSource {
+ id: timeSource
+ engine: "time"
+ connectedSources: ["Local"]
+ interval: 1000
+ }
+}
diff --git a/components/KeyboardLayoutButton.qml b/components/KeyboardLayoutButton.qml
new file mode 100644
index 0000000..483ca25
--- /dev/null
+++ b/components/KeyboardLayoutButton.qml
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Daniel Vrátil <dvratil@redhat.com> *
+ * *
+ * 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.1
+import QtQuick.Controls 1.1 as QQC
+
+import org.kde.plasma.components 3.0 as PlasmaComponents3
+
+import org.kde.plasma.workspace.keyboardlayout 1.0
+
+PlasmaComponents3.ToolButton {
+ id: kbLayoutButton
+
+ icon.name: "input-keyboard"
+ text: layout.currentLayoutDisplayName
+
+ Accessible.name: i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "Button to change keyboard layout", "Switch layout")
+
+ visible: layout.layouts.length > 1
+
+ onClicked: layout.nextLayout()
+
+ KeyboardLayout {
+ id: layout
+ function nextLayout() {
+ var layouts = layout.layouts;
+ var index = (layouts.indexOf(layout.currentLayout)+1) % layouts.length;
+ layout.currentLayout = layouts[index];
+ }
+ }
+}
diff --git a/components/SessionManagementScreen.qml b/components/SessionManagementScreen.qml
new file mode 100644
index 0000000..58110c5
--- /dev/null
+++ b/components/SessionManagementScreen.qml
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2016 David Edmundson <davidedmundson@kde.org>
+ *
+ * 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
+
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 1.1
+
+import org.kde.plasma.core 2.0 as PlasmaCore
+import org.kde.plasma.components 3.0 as PlasmaComponents3
+
+Item {
+ id: root
+
+ /*
+ * Any message to be displayed to the user, visible above the text fields
+ */
+ property alias notificationMessage: notificationsLabel.text
+
+ /*
+ * A list of Items (typically ActionButtons) to be shown in a Row beneath the prompts
+ */
+ property alias actionItems: actionItemsLayout.children
+
+ /*
+ * A model with a list of users to show in the view
+ * The following roles should exist:
+ * - name
+ * - iconSource
+ *
+ * The following are also handled:
+ * - vtNumber
+ * - displayNumber
+ * - session
+ * - isTty
+ */
+ property alias userListModel: userListView.model
+
+ /*
+ * Self explanatory
+ */
+ property alias userListCurrentIndex: userListView.currentIndex
+ property var userListCurrentModelData: userListView.currentItem === null ? [] : userListView.currentItem.m
+ property bool showUserList: true
+
+ property alias userList: userListView
+
+ property int fontSize: PlasmaCore.Theme.defaultFont.pointSize + 2
+
+ default property alias _children: innerLayout.children
+
+ UserList {
+ id: userListView
+ visible: showUserList && y > 0
+ anchors {
+ bottom: parent.verticalCenter
+ left: parent.left
+ right: parent.right
+ }
+ fontSize: root.fontSize
+ }
+
+ //goal is to show the prompts, in ~16 grid units high, then the action buttons
+ //but collapse the space between the prompts and actions if there's no room
+ //ui is constrained to 16 grid units wide, or the screen
+ ColumnLayout {
+ id: prompts
+ anchors.top: parent.verticalCenter
+ anchors.topMargin: units.gridUnit * 0.5
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ PlasmaComponents3.Label {
+ id: notificationsLabel
+ font.pointSize: root.fontSize
+ Layout.maximumWidth: units.gridUnit * 16
+ Layout.alignment: Qt.AlignHCenter
+ Layout.fillWidth: true
+ horizontalAlignment: Text.AlignHCenter
+ wrapMode: Text.WordWrap
+ font.italic: true
+ }
+ ColumnLayout {
+ Layout.minimumHeight: implicitHeight
+ Layout.maximumHeight: units.gridUnit * 10
+ Layout.maximumWidth: units.gridUnit * 16
+ Layout.alignment: Qt.AlignHCenter
+ ColumnLayout {
+ id: innerLayout
+ Layout.alignment: Qt.AlignHCenter
+ Layout.fillWidth: true
+ }
+ Item {
+ Layout.fillHeight: true
+ }
+ }
+ Row { //deliberately not rowlayout as I'm not trying to resize child items
+ id: actionItemsLayout
+ spacing: units.largeSpacing / 2
+ Layout.alignment: Qt.AlignHCenter
+ }
+ Item {
+ Layout.fillHeight: true
+ }
+ }
+}
diff --git a/components/UserDelegate.qml b/components/UserDelegate.qml
new file mode 100644
index 0000000..8658b85
--- /dev/null
+++ b/components/UserDelegate.qml
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2014 David Edmundson <davidedmundson@kde.org>
+ * Copyright 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+ *
+ * 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.8
+import QtGraphicalEffects 1.0
+
+import org.kde.plasma.core 2.0 as PlasmaCore
+import org.kde.plasma.components 3.0 as PlasmaComponents3
+
+Item {
+ id: wrapper
+
+ // If we're using software rendering, draw outlines instead of shadows
+ // See https://bugs.kde.org/show_bug.cgi?id=398317
+ readonly property bool softwareRendering: GraphicsInfo.api === GraphicsInfo.Software
+
+ property bool isCurrent: true
+
+ readonly property var m: model
+ property string name
+ property string userName
+ property string avatarPath
+ property string iconSource
+ property bool constrainText: true
+ property alias nameFontSize: usernameDelegate.font.pointSize
+ property int fontSize: PlasmaCore.Theme.defaultFont.pointSize + 2
+ signal clicked()
+
+ property real faceSize: units.gridUnit * 7
+
+ opacity: isCurrent ? 1.0 : 0.5
+
+ Behavior on opacity {
+ OpacityAnimator {
+ duration: units.longDuration
+ }
+ }
+
+ // Draw a translucent background circle under the user picture
+ Rectangle {
+ anchors.centerIn: imageSource
+ width: imageSource.width - 2 // Subtract to prevent fringing
+ height: width
+ radius: width / 2
+
+ color: PlasmaCore.ColorScope.backgroundColor
+ opacity: 0.9
+ }
+
+ Item {
+ id: imageSource
+ anchors {
+ bottom: usernameDelegate.top
+ bottomMargin: units.largeSpacing
+ horizontalCenter: parent.horizontalCenter
+ }
+ Behavior on width {
+ PropertyAnimation {
+ from: faceSize
+ duration: units.longDuration;
+ }
+ }
+ width: isCurrent ? faceSize : faceSize - units.largeSpacing
+ height: width
+
+ //Image takes priority, taking a full path to a file, if that doesn't exist we show an icon
+ Image {
+ id: face
+ source: wrapper.avatarPath
+ sourceSize: Qt.size(faceSize, faceSize)
+ fillMode: Image.PreserveAspectCrop
+ anchors.fill: parent
+ }
+
+ PlasmaCore.IconItem {
+ id: faceIcon
+ source: iconSource
+ visible: (face.status == Image.Error || face.status == Image.Null)
+ anchors.fill: parent
+ anchors.margins: units.gridUnit * 0.5 // because mockup says so...
+ colorGroup: PlasmaCore.ColorScope.colorGroup
+ }
+ }
+
+ ShaderEffect {
+ anchors {
+ bottom: usernameDelegate.top
+ bottomMargin: units.largeSpacing
+ horizontalCenter: parent.horizontalCenter
+ }
+
+ width: imageSource.width
+ height: imageSource.height
+
+ supportsAtlasTextures: true
+
+ property var source: ShaderEffectSource {
+ sourceItem: imageSource
+ // software rendering is just a fallback so we can accept not having a rounded avatar here
+ hideSource: wrapper.GraphicsInfo.api !== GraphicsInfo.Software
+ live: true // otherwise the user in focus will show a blurred avatar
+ }
+
+ property var colorBorder: PlasmaCore.ColorScope.textColor
+
+ //draw a circle with an antialiased 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 connect themeChanged to update()
+ //but in SDDM that's a bit pointless
+ fragmentShader: "
+ varying highp vec2 qt_TexCoord0;
+ uniform highp float qt_Opacity;
+ uniform lowp sampler2D source;
+
+ uniform lowp vec4 colorBorder;
+ highp float blend = 0.01;
+ highp float innerRadius = 0.47;
+ highp float outerRadius = 0.49;
+ lowp vec4 colorEmpty = vec4(0.0, 0.0, 0.0, 0.0);
+
+ void main() {
+ lowp vec4 colorSource = texture2D(source, qt_TexCoord0.st);
+
+ highp vec2 m = qt_TexCoord0 - vec2(0.5, 0.5);
+ highp 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 ;
+
+ gl_FragColor = gl_FragColor * qt_Opacity;
+ }
+ "
+ }
+
+ PlasmaComponents3.Label {
+ id: usernameDelegate
+ font.pointSize: wrapper.fontSize
+ anchors {
+ bottom: parent.bottom
+ horizontalCenter: parent.horizontalCenter
+ }
+ width: constrainText ? parent.width : implicitWidth
+ text: wrapper.name
+ style: softwareRendering ? Text.Outline : Text.Normal
+ styleColor: softwareRendering ? PlasmaCore.ColorScope.backgroundColor : "transparent" //no outline, doesn't matter
+ elide: Text.ElideRight
+ horizontalAlignment: Text.AlignHCenter
+ //make an indication that this has active focus, this only happens when reached with keyboard navigation
+ font.underline: wrapper.activeFocus
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+
+ onClicked: wrapper.clicked();
+ }
+
+ Accessible.name: name
+ Accessible.role: Accessible.Button
+ function accessiblePressAction() { wrapper.clicked() }
+}
diff --git a/components/UserList.qml b/components/UserList.qml
new file mode 100644
index 0000000..dbac102
--- /dev/null
+++ b/components/UserList.qml
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2014 David Edmundson <davidedmundson@kde.org>
+ *
+ * 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
+import org.kde.plasma.core 2.0 as PlasmaCore
+
+ListView {
+ id: view
+ readonly property string selectedUser: currentItem ? currentItem.userName : ""
+ readonly property int userItemWidth: units.gridUnit * 8
+ readonly property int userItemHeight: units.gridUnit * 8
+ property int fontSize: PlasmaCore.Theme.defaultFont.pointSize + 2
+
+ 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
+
+ // Disable flicking if we only have on user (like on the lockscreen)
+ interactive: count > 1
+
+ delegate: UserDelegate {
+ avatarPath: model.icon || ""
+ iconSource: model.iconName || "user-identity"
+ fontSize: view.fontSize
+
+ name: {
+ var displayName = model.realName || model.name
+
+ if (model.vtNumber === undefined || model.vtNumber < 0) {
+ return displayName
+ }
+
+ if (!model.session) {
+ return i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "Nobody logged in on that session", "Unused")
+ }
+
+
+ var location = ""
+ if (model.isTty) {
+ location = i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "User logged in on console number", "TTY %1", model.vtNumber)
+ } else if (model.displayNumber) {
+ location = i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "User logged in on console (X display number)", "on TTY %1 (Display %2)", model.vtNumber, model.displayNumber)
+ }
+
+ if (location) {
+ return i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "Username (location)", "%1 (%2)", displayName, location)
+ }
+
+ return displayName
+ }
+
+ userName: model.name
+
+ width: userItemWidth
+ height: userItemHeight
+
+ //if we only have one delegate, we don't need to clip the text as it won't be overlapping with anything
+ constrainText: ListView.view.count > 1
+
+ isCurrent: ListView.isCurrentItem
+
+ onClicked: {
+ ListView.view.currentIndex = index;
+ ListView.view.userSelected();
+ }
+ }
+
+ Keys.onEscapePressed: view.userSelected()
+ Keys.onEnterPressed: view.userSelected()
+ Keys.onReturnPressed: view.userSelected()
+}
diff --git a/components/VirtualKeyboard.qml b/components/VirtualKeyboard.qml
new file mode 100644
index 0000000..7848b75
--- /dev/null
+++ b/components/VirtualKeyboard.qml
@@ -0,0 +1,28 @@
+/********************************************************************
+ This file is part of the KDE project.
+
+Copyright (C) 2017 Martin Gräßlin <mgraesslin@kde.org>
+
+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, see <http://www.gnu.org/licenses/>.
+*********************************************************************/
+import QtQuick 2.5
+import QtQuick.VirtualKeyboard 2.1
+
+InputPanel {
+ id: inputPanel
+ property bool activated: false
+ active: activated && Qt.inputMethod.visible
+ visible: active
+ width: parent.width
+}
diff --git a/components/WallpaperFader.qml b/components/WallpaperFader.qml
new file mode 100644
index 0000000..f474acc
--- /dev/null
+++ b/components/WallpaperFader.qml
@@ -0,0 +1,184 @@
+/********************************************************************
+ This file is part of the KDE project.
+
+Copyright (C) 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+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, see <http://www.gnu.org/licenses/>.
+*********************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Controls 1.1
+import QtQuick.Layouts 1.1
+import QtGraphicalEffects 1.0
+
+import org.kde.plasma.core 2.0 as PlasmaCore
+import org.kde.plasma.components 2.0 as PlasmaComponents
+
+import org.kde.plasma.private.sessions 2.0
+import "../components"
+
+Item {
+ id: wallpaperFader
+ property Item clock
+ property Item mainStack
+ property Item footer
+ property alias source: wallpaperBlur.source
+ state: lockScreenRoot.uiVisible ? "on" : "off"
+ property real factor: 0
+ readonly property bool lightBackground: Math.max(PlasmaCore.ColorScope.backgroundColor.r, PlasmaCore.ColorScope.backgroundColor.g, PlasmaCore.ColorScope.backgroundColor.b) > 0.5
+
+ property bool alwaysShowClock: typeof config === "undefined" || typeof config.alwaysShowClock === "undefined" || config.alwaysShowClock === true
+
+ Behavior on factor {
+ NumberAnimation {
+ target: wallpaperFader
+ property: "factor"
+ duration: 1000
+ easing.type: Easing.InOutQuad
+ }
+ }
+ FastBlur {
+ id: wallpaperBlur
+ anchors.fill: parent
+ radius: -100 * wallpaperFader.factor
+ }
+ ShaderEffect {
+ id: wallpaperShader
+ anchors.fill: parent
+ supportsAtlasTextures: true
+ property var source: ShaderEffectSource {
+ sourceItem: wallpaperBlur
+ live: true
+ hideSource: true
+ textureMirroring: ShaderEffectSource.NoMirroring
+ }
+
+ readonly property real contrast: 0.45 * wallpaperFader.factor + (1 - wallpaperFader.factor)
+ readonly property real saturation: 1.7 * wallpaperFader.factor + (1 - wallpaperFader.factor)
+ readonly property real intensity: (wallpaperFader.lightBackground ? 1.7 : 0.45) * wallpaperFader.factor + (1 - wallpaperFader.factor)
+
+ readonly property real transl: (1.0 - contrast) / 2.0;
+ readonly property real rval: (1.0 - saturation) * 0.2126;
+ readonly property real gval: (1.0 - saturation) * 0.7152;
+ readonly property real bval: (1.0 - saturation) * 0.0722;
+
+ property var colorMatrix: Qt.matrix4x4(
+ contrast, 0, 0, 0.0,
+ 0, contrast, 0, 0.0,
+ 0, 0, contrast, 0.0,
+ transl, transl, transl, 1.0).times(Qt.matrix4x4(
+ rval + saturation, rval, rval, 0.0,
+ gval, gval + saturation, gval, 0.0,
+ bval, bval, bval + saturation, 0.0,
+ 0, 0, 0, 1.0)).times(Qt.matrix4x4(
+ intensity, 0, 0, 0,
+ 0, intensity, 0, 0,
+ 0, 0, intensity, 0,
+ 0, 0, 0, 1
+ ));
+
+
+ fragmentShader: "
+ uniform mediump mat4 colorMatrix;
+ uniform mediump sampler2D source;
+ varying mediump vec2 qt_TexCoord0;
+ uniform lowp float qt_Opacity;
+
+ void main(void)
+ {
+ mediump vec4 tex = texture2D(source, qt_TexCoord0);
+ gl_FragColor = tex * colorMatrix * qt_Opacity;
+ }"
+ }
+
+ states: [
+ State {
+ name: "on"
+ PropertyChanges {
+ target: mainStack
+ opacity: 1
+ }
+ PropertyChanges {
+ target: footer
+ opacity: 1
+ }
+ PropertyChanges {
+ target: wallpaperFader
+ factor: 1
+ }
+ PropertyChanges {
+ target: clock.shadow
+ opacity: 0
+ }
+ },
+ State {
+ name: "off"
+ PropertyChanges {
+ target: mainStack
+ opacity: 0
+ }
+ PropertyChanges {
+ target: footer
+ opacity: 0
+ }
+ PropertyChanges {
+ target: wallpaperFader
+ factor: 0
+ }
+ PropertyChanges {
+ target: clock.shadow
+ opacity: 1
+ }
+ }
+ ]
+ transitions: [
+ Transition {
+ from: "off"
+ to: "on"
+ //Note: can't use animators as they don't play well with parallelanimations
+ ParallelAnimation {
+ NumberAnimation {
+ target: mainStack
+ property: "opacity"
+ duration: units.longDuration
+ easing.type: Easing.InOutQuad
+ }
+ NumberAnimation {
+ target: footer
+ property: "opacity"
+ duration: units.longDuration
+ easing.type: Easing.InOutQuad
+ }
+ }
+ },
+ Transition {
+ from: "on"
+ to: "off"
+ ParallelAnimation {
+ NumberAnimation {
+ target: mainStack
+ property: "opacity"
+ duration: 500
+ easing.type: Easing.InOutQuad
+ }
+ NumberAnimation {
+ target: footer
+ property: "opacity"
+ duration: 500
+ easing.type: Easing.InOutQuad
+ }
+ }
+ }
+ ]
+}
diff --git a/components/artwork/logout_primary.svgz b/components/artwork/logout_primary.svgz
new file mode 100644
index 0000000..6a9423f
--- /dev/null
+++ b/components/artwork/logout_primary.svgz
Binary files differ
diff --git a/components/artwork/restart_primary.svgz b/components/artwork/restart_primary.svgz
new file mode 100644
index 0000000..e2312bd
--- /dev/null
+++ b/components/artwork/restart_primary.svgz
Binary files differ
diff --git a/components/artwork/shutdown_primary.svgz b/components/artwork/shutdown_primary.svgz
new file mode 100644
index 0000000..1c60152
--- /dev/null
+++ b/components/artwork/shutdown_primary.svgz
Binary files differ