chore: initial commit
This commit is contained in:
commit
67c7ccd66b
11102 changed files with 455009 additions and 0 deletions
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* 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 2.0 as PlasmaComponents
|
||||
|
||||
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: config.fontSize
|
||||
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: "#09090C"
|
||||
border.color: "#9B79CC"
|
||||
border.width: 1
|
||||
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
|
||||
}
|
||||
|
||||
PlasmaComponents.Label {
|
||||
id: label
|
||||
font.pointSize: Math.max(fontSize + 1,theme.defaultFont.pointSize + 1)
|
||||
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
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* 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 2.0 as PlasmaComponents
|
||||
import org.kde.plasma.workspace.components 2.0 as PW
|
||||
|
||||
Row {
|
||||
spacing: 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
|
||||
}
|
||||
|
||||
PlasmaComponents.Label {
|
||||
id: batteryLabel
|
||||
font.pointSize: config.fontSize
|
||||
height: undefined
|
||||
text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","%1%", battery.percent)
|
||||
Accessible.name: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Battery at %1%", battery.percent)
|
||||
}
|
||||
}
|
|
@ -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: 34
|
||||
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: 17
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
DataSource {
|
||||
id: timeSource
|
||||
engine: "time"
|
||||
connectedSources: ["Local"]
|
||||
interval: 1000
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
/***************************************************************************
|
||||
* 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 2.0 as PlasmaComponents
|
||||
|
||||
import org.kde.plasma.workspace.keyboardlayout 1.0
|
||||
|
||||
PlasmaComponents.ToolButton {
|
||||
|
||||
property int fontSize: config.fontSize
|
||||
|
||||
id: kbLayoutButton
|
||||
|
||||
iconName: "input-keyboard"
|
||||
implicitWidth: minimumWidth
|
||||
text: layout.currentLayoutDisplayName
|
||||
font.pointSize: Math.max(fontSize,theme.defaultFont.pointSize)
|
||||
|
||||
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];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
/*
|
||||
* 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 2.0 as PlasmaComponents
|
||||
|
||||
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: config.fontSize
|
||||
|
||||
default property alias _children: innerLayout.children
|
||||
|
||||
UserList {
|
||||
id: userListView
|
||||
visible: showUserList && y > 0
|
||||
anchors {
|
||||
bottom: parent.verticalCenter
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
}
|
||||
}
|
||||
|
||||
//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
|
||||
PlasmaComponents.Label {
|
||||
id: notificationsLabel
|
||||
font.pointSize: Math.max(fontSize + 1,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
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,189 @@
|
|||
/*
|
||||
* 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 org.kde.plasma.core 2.0 as PlasmaCore
|
||||
import org.kde.plasma.components 2.0 as PlasmaComponents
|
||||
|
||||
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: config.fontSize
|
||||
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: "#232831"
|
||||
}
|
||||
|
||||
|
||||
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: "#00000000"
|
||||
|
||||
//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;
|
||||
}
|
||||
"
|
||||
}
|
||||
|
||||
PlasmaComponents.Label {
|
||||
id: usernameDelegate
|
||||
font.pointSize: Math.max(fontSize + 2,theme.defaultFont.pointSize + 2)
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
height: implicitHeight // work around stupid bug in Plasma Components that sets the height
|
||||
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() }
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* 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
|
||||
|
||||
ListView {
|
||||
id: view
|
||||
readonly property string selectedUser: currentItem ? currentItem.userName : ""
|
||||
readonly property int userItemWidth: units.gridUnit * 8
|
||||
readonly property int userItemHeight: units.gridUnit * 8
|
||||
|
||||
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 {
|
||||
avatarPath: model.icon || ""
|
||||
iconSource: model.iconName || "user-identity"
|
||||
|
||||
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()
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -0,0 +1,178 @@
|
|||
/********************************************************************
|
||||
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" || config.alwaysShowClock === true
|
||||
|
||||
Behavior on factor {
|
||||
NumberAnimation {
|
||||
target: wallpaperFader
|
||||
property: "factor"
|
||||
duration: 1000
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
}
|
||||
FastBlur {
|
||||
id: wallpaperBlur
|
||||
anchors.fill: parent
|
||||
radius: 50 * 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.65 * wallpaperFader.factor + (1 - wallpaperFader.factor)
|
||||
readonly property real saturation: 1.6 * wallpaperFader.factor + (1 - wallpaperFader.factor)
|
||||
readonly property real intensity: (wallpaperFader.lightBackground ? 1.7 : 0.6) * 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
|
||||
}
|
||||
PropertyChanges {
|
||||
target: clock
|
||||
opacity: 1
|
||||
anchors.horizontalCenter: formBg.horizontalCenter
|
||||
// y: parent.height - height - 10
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "off"
|
||||
PropertyChanges {
|
||||
target: mainStack
|
||||
opacity: 0
|
||||
}
|
||||
PropertyChanges {
|
||||
target: footer
|
||||
opacity: 0
|
||||
}
|
||||
PropertyChanges {
|
||||
target: wallpaperFader
|
||||
factor: 0
|
||||
}
|
||||
PropertyChanges {
|
||||
target: clock.shadow
|
||||
opacity: wallpaperFader.alwaysShowClock ? 1 : 0
|
||||
}
|
||||
PropertyChanges {
|
||||
target: clock
|
||||
opacity: wallpaperFader.alwaysShowClock ? 1 : 0
|
||||
}
|
||||
}
|
||||
]
|
||||
transitions: [
|
||||
Transition {
|
||||
from: "off"
|
||||
to: "on"
|
||||
//Note: can't use animators as they don't play well with parallelanimations
|
||||
NumberAnimation {
|
||||
targets: [mainStack, footer, clock]
|
||||
property: "opacity"
|
||||
duration: units.longDuration
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
},
|
||||
Transition {
|
||||
from: "on"
|
||||
to: "off"
|
||||
NumberAnimation {
|
||||
targets: [mainStack, footer, clock]
|
||||
property: "opacity"
|
||||
duration: 500
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
After editing SVG files be sure to run currentColorFillFix.sh from plasma-framework
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,20 @@
|
|||
[kdeglobals][KDE]
|
||||
widgetStyle=kvantum
|
||||
|
||||
[kdeglobals][General]
|
||||
ColorScheme=Dracula
|
||||
|
||||
[kdeglobals][Icons]
|
||||
Theme=candy-icons
|
||||
|
||||
[kcminputrc][Mouse]
|
||||
cursorTheme=breeze_cursors
|
||||
|
||||
[plasmarc][Theme]
|
||||
name=Dracula
|
||||
|
||||
[kwinrc][org.kde.kdecoration2]
|
||||
library=org.kde.kwin.aurorae
|
||||
theme=__aurorae__svg__Dracula
|
||||
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
/********************************************************************
|
||||
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.0
|
||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||
import "../osd"
|
||||
|
||||
PlasmaCore.FrameSvgItem {
|
||||
id: osd
|
||||
|
||||
// OSD Timeout in msecs - how long it will stay on the screen
|
||||
property int timeout: 1800
|
||||
// This is either a text or a number, if showingProgress is set to true,
|
||||
// the number will be used as a value for the progress bar
|
||||
property var osdValue
|
||||
// Icon name to display
|
||||
property string icon
|
||||
// Set to true if the value is meant for progress bar,
|
||||
// false for displaying the value as normal text
|
||||
property bool showingProgress: false
|
||||
|
||||
objectName: "onScreenDisplay"
|
||||
visible: false
|
||||
width: osdItem.width + margins.left + margins.right
|
||||
height: osdItem.height + margins.top + margins.bottom
|
||||
imagePath: "widgets/background"
|
||||
|
||||
function show() {
|
||||
osd.visible = true;
|
||||
hideAnimation.restart();
|
||||
}
|
||||
|
||||
// avoid leaking ColorScope of lock screen theme into the OSD "popup"
|
||||
PlasmaCore.ColorScope {
|
||||
width: osdItem.width
|
||||
height: osdItem.height
|
||||
anchors.centerIn: parent
|
||||
colorGroup: PlasmaCore.Theme.NormalColorGroup
|
||||
|
||||
OsdItem {
|
||||
id: osdItem
|
||||
rootItem: osd
|
||||
}
|
||||
}
|
||||
|
||||
SequentialAnimation {
|
||||
id: hideAnimation
|
||||
// prevent press and hold from flickering
|
||||
PauseAnimation { duration: 100 }
|
||||
NumberAnimation {
|
||||
target: osd
|
||||
property: "opacity"
|
||||
from: 1
|
||||
to: 0
|
||||
duration: osd.timeout
|
||||
easing.type: Easing.InQuad
|
||||
}
|
||||
ScriptAction {
|
||||
script: {
|
||||
osd.visible = false;
|
||||
osd.opacity = 1;
|
||||
osd.icon = "";
|
||||
osd.osdValue = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
/********************************************************************
|
||||
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.5
|
||||
import QtQuick.Controls 1.1
|
||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||
import org.kde.plasma.private.sessions 2.0
|
||||
import "../components"
|
||||
|
||||
Item {
|
||||
id: root
|
||||
property bool viewVisible: false
|
||||
property bool debug: false
|
||||
property string notification
|
||||
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
|
||||
|
||||
Loader {
|
||||
id: mainLoader
|
||||
anchors.fill: parent
|
||||
opacity: 0
|
||||
onItemChanged: opacity = 1
|
||||
|
||||
focus: true
|
||||
|
||||
Behavior on opacity {
|
||||
OpacityAnimator {
|
||||
duration: units.longDuration
|
||||
easing.type: Easing.InCubic
|
||||
}
|
||||
}
|
||||
}
|
||||
Connections {
|
||||
id:loaderConnection
|
||||
target: org_kde_plasma_screenlocker_greeter_view
|
||||
onFrameSwapped: {
|
||||
mainLoader.source = "LockScreenUi.qml";
|
||||
loaderConnection.target = null;
|
||||
}
|
||||
}
|
||||
Component.onCompleted: {
|
||||
if (root.interfaceVersion < 2) {
|
||||
mainLoader.source = "LockScreenUi.qml";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,543 @@
|
|||
/********************************************************************
|
||||
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.8
|
||||
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.extras 2.0 as PlasmaExtras
|
||||
|
||||
|
||||
import org.kde.plasma.private.sessions 2.0
|
||||
import "../components"
|
||||
|
||||
PlasmaCore.ColorScope {
|
||||
|
||||
id: lockScreenUi
|
||||
// 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
|
||||
readonly property bool lightBackground: Math.max(PlasmaCore.ColorScope.backgroundColor.r, PlasmaCore.ColorScope.backgroundColor.g, PlasmaCore.ColorScope.backgroundColor.b) > 0.5
|
||||
|
||||
colorGroup: PlasmaCore.Theme.ComplementaryColorGroup
|
||||
|
||||
Connections {
|
||||
target: authenticator
|
||||
onFailed: {
|
||||
root.notification = i18nd("plasma_lookandfeel_org.kde.lookandfeel","Unlocking failed");
|
||||
}
|
||||
onGraceLockedChanged: {
|
||||
if (!authenticator.graceLocked) {
|
||||
root.notification = "";
|
||||
root.clearPassword();
|
||||
}
|
||||
}
|
||||
onMessage: {
|
||||
root.notification = msg;
|
||||
}
|
||||
onError: {
|
||||
root.notification = err;
|
||||
}
|
||||
}
|
||||
|
||||
SessionManagement {
|
||||
id: sessionManagement
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: sessionManagement
|
||||
onAboutToSuspend: {
|
||||
mainBlock.mainPasswordBox.text = "";
|
||||
}
|
||||
}
|
||||
|
||||
SessionsModel {
|
||||
id: sessionsModel
|
||||
showNewSessionEntry: false
|
||||
}
|
||||
|
||||
PlasmaCore.DataSource {
|
||||
id: keystateSource
|
||||
engine: "keystate"
|
||||
connectedSources: "Caps Lock"
|
||||
}
|
||||
|
||||
Loader {
|
||||
id: changeSessionComponent
|
||||
active: false
|
||||
source: "ChangeSession.qml"
|
||||
visible: false
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: lockScreenRoot
|
||||
|
||||
property bool uiVisible: false
|
||||
property bool blockUI: mainStack.depth > 1 || mainBlock.mainPasswordBox.text.length > 0 || inputPanel.keyboardActive
|
||||
|
||||
x: parent.x
|
||||
y: parent.y
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
hoverEnabled: true
|
||||
drag.filterChildren: true
|
||||
onPressed: uiVisible = true;
|
||||
onPositionChanged: uiVisible = true;
|
||||
onUiVisibleChanged: {
|
||||
if (blockUI) {
|
||||
fadeoutTimer.running = false;
|
||||
} else if (uiVisible) {
|
||||
fadeoutTimer.restart();
|
||||
}
|
||||
}
|
||||
onBlockUIChanged: {
|
||||
if (blockUI) {
|
||||
fadeoutTimer.running = false;
|
||||
uiVisible = true;
|
||||
} else {
|
||||
fadeoutTimer.restart();
|
||||
}
|
||||
}
|
||||
Keys.onEscapePressed: {
|
||||
uiVisible = !uiVisible;
|
||||
if (inputPanel.keyboardActive) {
|
||||
inputPanel.showHide();
|
||||
}
|
||||
if (!uiVisible) {
|
||||
mainBlock.mainPasswordBox.text = "";
|
||||
}
|
||||
}
|
||||
Keys.onPressed: {
|
||||
uiVisible = true;
|
||||
event.accepted = false;
|
||||
}
|
||||
Timer {
|
||||
id: fadeoutTimer
|
||||
interval: 10000
|
||||
onTriggered: {
|
||||
if (!lockScreenRoot.blockUI) {
|
||||
lockScreenRoot.uiVisible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: PropertyAnimation { id: launchAnimation; target: lockScreenRoot; property: "opacity"; from: 0; to: 1; duration: 1000 }
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "onOtherSession"
|
||||
// for slide out animation
|
||||
PropertyChanges { target: lockScreenRoot; y: lockScreenRoot.height }
|
||||
// we also change the opacity just to be sure it's not visible even on unexpected screen dimension changes with possible race conditions
|
||||
PropertyChanges { target: lockScreenRoot; opacity: 0 }
|
||||
}
|
||||
]
|
||||
|
||||
transitions:
|
||||
Transition {
|
||||
// we only animate switchting to another session, because kscreenlocker doesn't get notified when
|
||||
// coming from another session back and so we wouldn't know when to trigger the animation exactly
|
||||
from: ""
|
||||
to: "onOtherSession"
|
||||
|
||||
PropertyAnimation { id: stateChangeAnimation; properties: "y"; duration: 300; easing.type: Easing.InQuad}
|
||||
PropertyAnimation { properties: "opacity"; duration: 300}
|
||||
|
||||
onRunningChanged: {
|
||||
// after the animation has finished switch session: since we only animate the transition TO state "onOtherSession"
|
||||
// and not the other way around, we don't have to check the state we transitioned into
|
||||
if (/* lockScreenRoot.state == "onOtherSession" && */ !running) {
|
||||
mainStack.currentItem.switchSession()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WallpaperFader {
|
||||
anchors.fill: parent
|
||||
state: lockScreenRoot.uiVisible ? "on" : "off"
|
||||
source: wallpaper
|
||||
mainStack: mainStack
|
||||
footer: footer
|
||||
clock: clock
|
||||
z: -3
|
||||
}
|
||||
|
||||
DropShadow {
|
||||
id: clockShadow
|
||||
anchors.fill: clock
|
||||
source: clock
|
||||
visible: !softwareRendering
|
||||
horizontalOffset: 1
|
||||
verticalOffset: 1
|
||||
radius: 6
|
||||
samples: 14
|
||||
spread: 0.3
|
||||
color: lockScreenUi.lightBackground ? PlasmaCore.ColorScope.backgroundColor : "black" // black matches Breeze window decoration and desktopcontainment
|
||||
Behavior on opacity {
|
||||
OpacityAnimator {
|
||||
duration: 1000
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Clock {
|
||||
id: clock
|
||||
property Item shadow: clockShadow
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
y: (mainBlock.userList.y + mainStack.y)/2 - height/2
|
||||
visible: y > 0
|
||||
Layout.alignment: Qt.AlignBaseline
|
||||
}
|
||||
|
||||
ListModel {
|
||||
id: users
|
||||
|
||||
Component.onCompleted: {
|
||||
users.append({name: kscreenlocker_userName,
|
||||
realName: kscreenlocker_userName,
|
||||
icon: kscreenlocker_userImage,
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
StackView {
|
||||
id: mainStack
|
||||
anchors.centerIn: parent
|
||||
|
||||
height: lockScreenRoot.height + units.gridUnit * 3
|
||||
width: parent.width / 3
|
||||
focus: true //StackView is an implicit focus scope, so we need to give this focus so the item inside will have it
|
||||
|
||||
initialItem: MainBlock {
|
||||
id: mainBlock
|
||||
lockScreenUiVisible: lockScreenRoot.uiVisible
|
||||
|
||||
showUserList: userList.y + mainStack.y > 0
|
||||
|
||||
Stack.onStatusChanged: {
|
||||
// prepare for presenting again to the user
|
||||
if (Stack.status == Stack.Activating) {
|
||||
mainPasswordBox.remove(0, mainPasswordBox.length)
|
||||
mainPasswordBox.focus = true
|
||||
}
|
||||
}
|
||||
userListModel: users
|
||||
notificationMessage: {
|
||||
var text = ""
|
||||
if (keystateSource.data["Caps Lock"]["Locked"]) {
|
||||
text += i18nd("plasma_lookandfeel_org.kde.lookandfeel","Caps Lock is on")
|
||||
if (root.notification) {
|
||||
text += " • "
|
||||
}
|
||||
}
|
||||
text += root.notification
|
||||
return text
|
||||
}
|
||||
|
||||
onLoginRequest: {
|
||||
root.notification = ""
|
||||
authenticator.tryUnlock(password)
|
||||
}
|
||||
|
||||
actionItems: [
|
||||
ActionButton {
|
||||
text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Switch User")
|
||||
iconSource: "system-switch-user"
|
||||
onClicked: {
|
||||
// If there are no existing sessions to switch to, create a new one instead
|
||||
if (((sessionsModel.showNewSessionEntry && sessionsModel.count === 1) ||
|
||||
(!sessionsModel.showNewSessionEntry && sessionsModel.count === 0)) &&
|
||||
sessionsModel.canSwitchUser) {
|
||||
mainStack.pop({immediate:true})
|
||||
sessionsModel.startNewSession(true /* lock the screen too */)
|
||||
lockScreenRoot.state = ''
|
||||
} else {
|
||||
mainStack.push(switchSessionPage)
|
||||
}
|
||||
}
|
||||
visible: sessionsModel.canStartNewSession && sessionsModel.canSwitchUser
|
||||
//Button gets cut off on smaller displays without this.
|
||||
anchors{
|
||||
verticalCenter: parent.top
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
Loader {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: item ? item.implicitHeight : 0
|
||||
active: config.showMediaControls
|
||||
source: "MediaControls.qml"
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
if (defaultToSwitchUser) { //context property
|
||||
// If we are in the only session, then going to the session switcher is
|
||||
// a pointless extra step; instead create a new session immediately
|
||||
if (((sessionsModel.showNewSessionEntry && sessionsModel.count === 1) ||
|
||||
(!sessionsModel.showNewSessionEntry && sessionsModel.count === 0)) &&
|
||||
sessionsModel.canStartNewSession) {
|
||||
sessionsModel.startNewSession(true /* lock the screen too */)
|
||||
} else {
|
||||
mainStack.push({
|
||||
item: switchSessionPage,
|
||||
immediate: true});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loader {
|
||||
id: inputPanel
|
||||
state: "hidden"
|
||||
readonly property bool keyboardActive: item ? item.active : false
|
||||
anchors {
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
}
|
||||
function showHide() {
|
||||
state = state == "hidden" ? "visible" : "hidden";
|
||||
}
|
||||
Component.onCompleted: inputPanel.source = "../components/VirtualKeyboard.qml"
|
||||
|
||||
onKeyboardActiveChanged: {
|
||||
if (keyboardActive) {
|
||||
state = "visible";
|
||||
} else {
|
||||
state = "hidden";
|
||||
}
|
||||
}
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "visible"
|
||||
PropertyChanges {
|
||||
target: mainStack
|
||||
y: Math.min(0, lockScreenRoot.height - inputPanel.height - mainBlock.visibleBoundary)
|
||||
}
|
||||
PropertyChanges {
|
||||
target: inputPanel
|
||||
y: lockScreenRoot.height - inputPanel.height
|
||||
opacity: 1
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "hidden"
|
||||
PropertyChanges {
|
||||
target: mainStack
|
||||
y: 0
|
||||
}
|
||||
PropertyChanges {
|
||||
target: inputPanel
|
||||
y: lockScreenRoot.height - lockScreenRoot.height/4
|
||||
opacity: 0
|
||||
}
|
||||
}
|
||||
]
|
||||
transitions: [
|
||||
Transition {
|
||||
from: "hidden"
|
||||
to: "visible"
|
||||
SequentialAnimation {
|
||||
ScriptAction {
|
||||
script: {
|
||||
inputPanel.item.activated = true;
|
||||
Qt.inputMethod.show();
|
||||
}
|
||||
}
|
||||
ParallelAnimation {
|
||||
NumberAnimation {
|
||||
target: mainStack
|
||||
property: "y"
|
||||
duration: units.longDuration
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
NumberAnimation {
|
||||
target: inputPanel
|
||||
property: "y"
|
||||
duration: units.longDuration
|
||||
easing.type: Easing.OutQuad
|
||||
}
|
||||
OpacityAnimator {
|
||||
target: inputPanel
|
||||
duration: units.longDuration
|
||||
easing.type: Easing.OutQuad
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
Transition {
|
||||
from: "visible"
|
||||
to: "hidden"
|
||||
SequentialAnimation {
|
||||
ParallelAnimation {
|
||||
NumberAnimation {
|
||||
target: mainStack
|
||||
property: "y"
|
||||
duration: units.longDuration
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
NumberAnimation {
|
||||
target: inputPanel
|
||||
property: "y"
|
||||
duration: units.longDuration
|
||||
easing.type: Easing.InQuad
|
||||
}
|
||||
OpacityAnimator {
|
||||
target: inputPanel
|
||||
duration: units.longDuration
|
||||
easing.type: Easing.InQuad
|
||||
}
|
||||
}
|
||||
ScriptAction {
|
||||
script: {
|
||||
Qt.inputMethod.hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Component {
|
||||
id: switchSessionPage
|
||||
SessionManagementScreen {
|
||||
property var switchSession: finalSwitchSession
|
||||
|
||||
Stack.onStatusChanged: {
|
||||
if (Stack.status == Stack.Activating) {
|
||||
focus = true
|
||||
}
|
||||
}
|
||||
|
||||
userListModel: sessionsModel
|
||||
|
||||
// initiating animation of lockscreen for session switch
|
||||
function initSwitchSession() {
|
||||
lockScreenRoot.state = 'onOtherSession'
|
||||
}
|
||||
|
||||
// initiating session switch and preparing lockscreen for possible return of user
|
||||
function finalSwitchSession() {
|
||||
mainStack.pop({immediate:true})
|
||||
sessionsModel.switchUser(userListCurrentModelData.vtNumber)
|
||||
lockScreenRoot.state = ''
|
||||
}
|
||||
|
||||
Keys.onLeftPressed: userList.decrementCurrentIndex()
|
||||
Keys.onRightPressed: userList.incrementCurrentIndex()
|
||||
Keys.onEnterPressed: initSwitchSession()
|
||||
Keys.onReturnPressed: initSwitchSession()
|
||||
Keys.onEscapePressed: mainStack.pop()
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: units.largeSpacing
|
||||
|
||||
PlasmaComponents.Button {
|
||||
Layout.fillWidth: true
|
||||
font.pointSize: theme.defaultFont.pointSize + 1
|
||||
text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Switch to This Session")
|
||||
onClicked: initSwitchSession()
|
||||
visible: sessionsModel.count > 0
|
||||
}
|
||||
|
||||
PlasmaComponents.Button {
|
||||
Layout.fillWidth: true
|
||||
font.pointSize: theme.defaultFont.pointSize + 1
|
||||
text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Start New Session")
|
||||
onClicked: {
|
||||
mainStack.pop({immediate:true})
|
||||
sessionsModel.startNewSession(true /* lock the screen too */)
|
||||
lockScreenRoot.state = ''
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
actionItems: [
|
||||
ActionButton {
|
||||
iconSource: "go-previous"
|
||||
text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Back")
|
||||
onClicked: mainStack.pop()
|
||||
//Button gets cut off on smaller displays without this.
|
||||
anchors{
|
||||
verticalCenter: parent.top
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loader {
|
||||
active: root.viewVisible
|
||||
source: "LockOsd.qml"
|
||||
anchors {
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
bottom: parent.bottom
|
||||
bottomMargin: units.largeSpacing
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: footer
|
||||
z: -2
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
margins: units.smallSpacing
|
||||
}
|
||||
|
||||
|
||||
|
||||
PlasmaComponents.ToolButton {
|
||||
text: i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "Button to show/hide virtual keyboard", "Virtual Keyboard")
|
||||
iconName: inputPanel.keyboardActive ? "input-keyboard-virtual-on" : "input-keyboard-virtual-off"
|
||||
onClicked: inputPanel.showHide()
|
||||
|
||||
visible: inputPanel.status == Loader.Ready
|
||||
}
|
||||
|
||||
KeyboardLayoutButton {
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
Battery {}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
// version support checks
|
||||
if (root.interfaceVersion < 1) {
|
||||
// ksmserver of 5.4, with greeter of 5.5
|
||||
root.viewVisible = true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* 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.2
|
||||
import QtQuick.Controls 2.4
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
|
||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||
import org.kde.plasma.components 2.0 as PlasmaComponents
|
||||
|
||||
import "../components"
|
||||
|
||||
SessionManagementScreen {
|
||||
|
||||
property Item mainPasswordBox: passwordBox
|
||||
property bool lockScreenUiVisible: false
|
||||
|
||||
//the y position that should be ensured visible when the on screen keyboard is visible
|
||||
property int visibleBoundary: mapFromItem(loginButton, 0, 0).y
|
||||
onHeightChanged: visibleBoundary = mapFromItem(loginButton, 0, 0).y + loginButton.height + units.smallSpacing
|
||||
/*
|
||||
* Login has been requested with the following username and password
|
||||
* If username field is visible, it will be taken from that, otherwise from the "name" property of the currentIndex
|
||||
*/
|
||||
signal loginRequest(string password)
|
||||
|
||||
function startLogin() {
|
||||
var password = passwordBox.text
|
||||
|
||||
//this is partly because it looks nicer
|
||||
//but more importantly it works round a Qt bug that can trigger if the app is closed with a TextField focused
|
||||
//See https://bugreports.qt.io/browse/QTBUG-55460
|
||||
loginButton.forceActiveFocus();
|
||||
loginRequest(password);
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
TextField {
|
||||
id: passwordBox
|
||||
font.pointSize: theme.defaultFont.pointSize + 1
|
||||
Layout.fillWidth: true
|
||||
placeholderText: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Password")
|
||||
focus: true
|
||||
echoMode: TextInput.Password
|
||||
inputMethodHints: Qt.ImhHiddenText | Qt.ImhSensitiveData | Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
|
||||
enabled: !authenticator.graceLocked
|
||||
|
||||
placeholderTextColor: "#C3C7D1"
|
||||
palette.text: "#C3C7D1"
|
||||
|
||||
background: Rectangle {
|
||||
color: "#272834"
|
||||
opacity: 0.9
|
||||
radius: parent.width / 2
|
||||
height: 30
|
||||
anchors.fill: parent
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
|
||||
|
||||
onAccepted: {
|
||||
if (lockScreenUiVisible) {
|
||||
startLogin();
|
||||
}
|
||||
}
|
||||
|
||||
//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) {
|
||||
userList.decrementCurrentIndex();
|
||||
event.accepted = true
|
||||
}
|
||||
if (event.key == Qt.Key_Right && !text) {
|
||||
userList.incrementCurrentIndex();
|
||||
event.accepted = true
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: root
|
||||
onClearPassword: {
|
||||
passwordBox.forceActiveFocus()
|
||||
passwordBox.selectAll()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
id: loginButton
|
||||
Accessible.name: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Unlock")
|
||||
implicitHeight: passwordBox.height - units.smallSpacing * 0.5 // otherwise it comes out taller than the password field
|
||||
text: ">"
|
||||
Layout.leftMargin: 30
|
||||
|
||||
contentItem: Text {
|
||||
text: loginButton.text
|
||||
font: loginButton.font
|
||||
opacity: enabled ? 1.0 : 0.3
|
||||
color: "#ffffff"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
id: buttonBackground
|
||||
width: 30
|
||||
height: 40
|
||||
radius: width / 2
|
||||
rotation: -90
|
||||
anchors.centerIn: parent
|
||||
color: "#9B79CC"
|
||||
|
||||
}
|
||||
|
||||
onClicked: startLogin()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,162 @@
|
|||
/********************************************************************
|
||||
This file is part of the KDE project.
|
||||
|
||||
Copyright (C) 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 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.Layouts 1.1
|
||||
|
||||
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
|
||||
|
||||
Item {
|
||||
visible: mpris2Source.hasPlayer
|
||||
implicitHeight: controlsRow.height + controlsRow.y
|
||||
|
||||
RowLayout {
|
||||
id: controlsRow
|
||||
anchors.bottom: parent.bottom
|
||||
y: units.smallSpacing // some distance to the password field
|
||||
width: parent.width
|
||||
height: units.gridUnit * 3
|
||||
spacing: 0
|
||||
|
||||
enabled: mpris2Source.canControl
|
||||
|
||||
PlasmaCore.DataSource {
|
||||
id: mpris2Source
|
||||
|
||||
readonly property string source: "@multiplex"
|
||||
readonly property var playerData: data[source]
|
||||
|
||||
readonly property bool hasPlayer: sources.length > 1 && !!playerData
|
||||
readonly property string identity: hasPlayer ? playerData.Identity : ""
|
||||
readonly property bool playing: hasPlayer && playerData.PlaybackStatus === "Playing"
|
||||
readonly property bool canControl: hasPlayer && playerData.CanControl
|
||||
readonly property bool canGoBack: hasPlayer && playerData.CanGoPrevious
|
||||
readonly property bool canGoNext: hasPlayer && playerData.CanGoNext
|
||||
|
||||
readonly property var currentMetadata: hasPlayer ? playerData.Metadata : ({})
|
||||
|
||||
readonly property string track: {
|
||||
var xesamTitle = currentMetadata["xesam:title"]
|
||||
if (xesamTitle) {
|
||||
return xesamTitle
|
||||
}
|
||||
// if no track title is given, print out the file name
|
||||
var xesamUrl = currentMetadata["xesam:url"] ? currentMetadata["xesam:url"].toString() : ""
|
||||
if (!xesamUrl) {
|
||||
return ""
|
||||
}
|
||||
var lastSlashPos = xesamUrl.lastIndexOf('/')
|
||||
if (lastSlashPos < 0) {
|
||||
return ""
|
||||
}
|
||||
var lastUrlPart = xesamUrl.substring(lastSlashPos + 1)
|
||||
return decodeURIComponent(lastUrlPart)
|
||||
}
|
||||
readonly property string artist: currentMetadata["xesam:artist"] || ""
|
||||
readonly property string albumArt: currentMetadata["mpris:artUrl"] || ""
|
||||
|
||||
engine: "mpris2"
|
||||
connectedSources: [source]
|
||||
|
||||
function startOperation(op) {
|
||||
var service = serviceForSource(source)
|
||||
var operation = service.operationDescription(op)
|
||||
return service.startOperationCall(operation)
|
||||
}
|
||||
|
||||
function goPrevious() {
|
||||
startOperation("Previous");
|
||||
}
|
||||
function goNext() {
|
||||
startOperation("Next");
|
||||
}
|
||||
function playPause(source) {
|
||||
startOperation("PlayPause");
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
id: albumArt
|
||||
Layout.preferredWidth: height
|
||||
Layout.fillHeight: true
|
||||
asynchronous: true
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: mpris2Source.albumArt
|
||||
sourceSize.height: height
|
||||
visible: status === Image.Loading || status === Image.Ready
|
||||
}
|
||||
|
||||
Item { // spacer
|
||||
width: units.smallSpacing
|
||||
height: 1
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: 0
|
||||
|
||||
PlasmaComponents.Label {
|
||||
Layout.fillWidth: true
|
||||
wrapMode: Text.NoWrap
|
||||
elide: Text.ElideRight
|
||||
text: mpris2Source.track || i18nd("plasma_lookandfeel_org.kde.lookandfeel", "No media playing")
|
||||
textFormat: Text.PlainText
|
||||
font.pointSize: theme.defaultFont.pointSize + 1
|
||||
maximumLineCount: 1
|
||||
}
|
||||
|
||||
PlasmaExtras.DescriptiveLabel {
|
||||
Layout.fillWidth: true
|
||||
wrapMode: Text.NoWrap
|
||||
elide: Text.ElideRight
|
||||
// if no artist is given, show player name instead
|
||||
text: mpris2Source.artist || mpris2Source.identity || ""
|
||||
textFormat: Text.PlainText
|
||||
font.pointSize: theme.smallestFont.pointSize + 1
|
||||
maximumLineCount: 1
|
||||
}
|
||||
}
|
||||
|
||||
PlasmaComponents.ToolButton {
|
||||
enabled: mpris2Source.canGoBack
|
||||
iconName: LayoutMirroring.enabled ? "media-skip-forward" : "media-skip-backward"
|
||||
onClicked: mpris2Source.goPrevious()
|
||||
visible: mpris2Source.canGoBack || mpris2Source.canGoNext
|
||||
Accessible.name: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Previous track")
|
||||
}
|
||||
|
||||
PlasmaComponents.ToolButton {
|
||||
Layout.fillHeight: true
|
||||
Layout.preferredWidth: height // make this button bigger
|
||||
iconName: mpris2Source.playing ? "media-playback-pause" : "media-playback-start"
|
||||
onClicked: mpris2Source.playPause()
|
||||
Accessible.name: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Play or Pause media")
|
||||
}
|
||||
|
||||
PlasmaComponents.ToolButton {
|
||||
enabled: mpris2Source.canGoNext
|
||||
iconName: LayoutMirroring.enabled ? "media-skip-backward" : "media-skip-forward"
|
||||
onClicked: mpris2Source.goNext()
|
||||
visible: mpris2Source.canGoBack || mpris2Source.canGoNext
|
||||
Accessible.name: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Next track")
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
import QtQuick 2.5
|
||||
import QtQuick.Controls 2.5 as QQC2
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
ColumnLayout {
|
||||
property alias cfg_alwaysShowClock: alwaysClock.checked
|
||||
property alias cfg_showMediaControls: showMediaControls.checked
|
||||
|
||||
spacing: 0
|
||||
|
||||
RowLayout {
|
||||
spacing: units.largeSpacing / 2
|
||||
|
||||
QQC2.Label {
|
||||
Layout.minimumWidth: formAlignment - units.largeSpacing //to match wallpaper config...
|
||||
horizontalAlignment: Text.AlignRight
|
||||
text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Clock:")
|
||||
}
|
||||
QQC2.CheckBox {
|
||||
id: alwaysClock
|
||||
text: i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "verb, to show something", "Always show")
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: units.largeSpacing / 2
|
||||
|
||||
QQC2.Label {
|
||||
Layout.minimumWidth: formAlignment - units.largeSpacing //to match wallpaper config...
|
||||
horizontalAlignment: Text.AlignRight
|
||||
text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Media controls:")
|
||||
}
|
||||
QQC2.CheckBox {
|
||||
id: showMediaControls
|
||||
text: i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "verb, to show something", "Show")
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
|
||||
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
|
||||
<kcfgfile name=""/>
|
||||
|
||||
<group name="General">
|
||||
<entry name="alwaysShowClock" type="Bool">
|
||||
<label>If true, the clock is shown even when the computer is idle and the password prompt is hidden.</label>
|
||||
<default>true</default>
|
||||
</entry>
|
||||
<entry name="showMediaControls" type="Bool">
|
||||
<label>If true, shows any currently playing media along with controls to pause it.</label>
|
||||
<default>true</default>
|
||||
</entry>
|
||||
</group>
|
||||
|
||||
</kcfg>
|
|
@ -0,0 +1,262 @@
|
|||
/***************************************************************************
|
||||
* Copyright (C) 2014 by 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, 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: "#1e1f29"
|
||||
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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
/***************************************************************************
|
||||
* Copyright (C) 2016 Marco Martin <mart@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, 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();
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
/***************************************************************************
|
||||
* Copyright (C) 2018 David Edmundson <davidedmundson@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, 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();
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright 2014 Martin Klapetek <mklapetek@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.0
|
||||
import QtQuick.Window 2.2
|
||||
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 PlasmaExtra
|
||||
|
||||
PlasmaCore.Dialog {
|
||||
id: root
|
||||
location: PlasmaCore.Types.Floating
|
||||
type: PlasmaCore.Dialog.OnScreenDisplay
|
||||
outputOnly: true
|
||||
|
||||
// OSD Timeout in msecs - how long it will stay on the screen
|
||||
property int timeout: 1800
|
||||
// This is either a text or a number, if showingProgress is set to true,
|
||||
// the number will be used as a value for the progress bar
|
||||
property var osdValue
|
||||
// Icon name to display
|
||||
property string icon
|
||||
// Set to true if the value is meant for progress bar,
|
||||
// false for displaying the value as normal text
|
||||
property bool showingProgress: false
|
||||
|
||||
mainItem: OsdItem {
|
||||
rootItem: root
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* Copyright 2014 Martin Klapetek <mklapetek@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.0
|
||||
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 PlasmaExtra
|
||||
import QtQuick.Window 2.2
|
||||
|
||||
Item {
|
||||
property QtObject rootItem
|
||||
height: Math.min(units.gridUnit * 15, Screen.desktopAvailableHeight / 5)
|
||||
width: height
|
||||
|
||||
// /--------------------\
|
||||
// | spacing |
|
||||
// | /----------------\ |
|
||||
// | | | |
|
||||
// | | icon | |
|
||||
// | | | |
|
||||
// | | | |
|
||||
// | \----------------/ |
|
||||
// | spacing |
|
||||
// | [progressbar/text] |
|
||||
// | spacing |
|
||||
// \--------------------/
|
||||
|
||||
PlasmaCore.IconItem {
|
||||
id: icon
|
||||
|
||||
height: parent.height - Math.max(progressBar.height, label.height)
|
||||
- ((units.smallSpacing/2) * 3) //it's an svg
|
||||
width: parent.width
|
||||
|
||||
source: rootItem.icon
|
||||
}
|
||||
|
||||
PlasmaComponents.ProgressBar {
|
||||
id: progressBar
|
||||
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
margins: Math.floor(units.smallSpacing / 2)
|
||||
}
|
||||
|
||||
visible: rootItem.showingProgress
|
||||
minimumValue: 0
|
||||
maximumValue: 100
|
||||
|
||||
value: Number(rootItem.osdValue)
|
||||
}
|
||||
PlasmaExtra.Heading {
|
||||
id: label
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
margins: Math.floor(units.smallSpacing / 2)
|
||||
}
|
||||
|
||||
visible: !rootItem.showingProgress
|
||||
text: rootItem.showingProgress ? "" : (rootItem.osdValue ? rootItem.osdValue : "")
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
wrapMode: Text.WordWrap
|
||||
maximumLineCount: 2
|
||||
elide: Text.ElideLeft
|
||||
minimumPointSize: theme.defaultFont.pointSize
|
||||
fontSizeMode: Text.HorizontalFit
|
||||
textFormat: Text.PlainText
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 123 KiB |
Binary file not shown.
After Width: | Height: | Size: 375 KiB |
Binary file not shown.
After Width: | Height: | Size: 242 KiB |
|
@ -0,0 +1,109 @@
|
|||
import QtQuick 2.5
|
||||
|
||||
Image {
|
||||
id: root
|
||||
source: "images/background.png"
|
||||
|
||||
property int stage
|
||||
|
||||
onStageChanged: {
|
||||
if (stage == 1) {
|
||||
introAnimation.running = true
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
id: content
|
||||
anchors.fill: parent
|
||||
opacity: 0
|
||||
TextMetrics {
|
||||
id: units
|
||||
text: "M"
|
||||
property int gridUnit: boundingRect.height
|
||||
property int largeSpacing: units.gridUnit
|
||||
property int smallSpacing: Math.max(2, gridUnit/4)
|
||||
}
|
||||
|
||||
Image {
|
||||
id: logo
|
||||
property real size: units.gridUnit * 12
|
||||
anchors.centerIn: parent
|
||||
source: "images/logo.png"
|
||||
sourceSize.width: 150
|
||||
sourceSize.height: 150
|
||||
|
||||
ParallelAnimation {
|
||||
running: true
|
||||
|
||||
ScaleAnimator {
|
||||
target: logo
|
||||
from: 0
|
||||
to: 1
|
||||
duration: 700
|
||||
}
|
||||
SequentialAnimation {
|
||||
loops: Animation.Infinite
|
||||
|
||||
ScaleAnimator {
|
||||
target: logo
|
||||
from: 0.97
|
||||
to: 1
|
||||
duration: 1000
|
||||
}
|
||||
ScaleAnimator {
|
||||
target: logo
|
||||
from: 1
|
||||
to: 0.97
|
||||
duration: 1000
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
id: busyIndicator
|
||||
//in the middle of the remaining space
|
||||
y: parent.height - (parent.height - logo.y) / 3 - height/2
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
source: "images/busy02.svg"
|
||||
sourceSize.height: units.gridUnit * 2
|
||||
sourceSize.width: units.gridUnit * 2
|
||||
RotationAnimator on rotation {
|
||||
id: rotationAnimator
|
||||
from: 0
|
||||
to: 360
|
||||
duration: 800
|
||||
loops: Animation.Infinite
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
id: busyIndicator2
|
||||
//in the middle of the remaining space
|
||||
y: parent.height - (parent.height - logo.y) / 3 - height/2
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
source: "images/busy02.svg"
|
||||
sourceSize.height: units.gridUnit * 3
|
||||
sourceSize.width: units.gridUnit * 3
|
||||
RotationAnimator on rotation {
|
||||
id: rotationAnimator2
|
||||
from: 360
|
||||
to: 0
|
||||
duration: 800
|
||||
loops: Animation.Infinite
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
OpacityAnimator {
|
||||
id: introAnimation
|
||||
running: false
|
||||
target: content
|
||||
from: 0
|
||||
to: 1
|
||||
duration: 1000
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 1.4 MiB |
|
@ -0,0 +1,55 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="44px"
|
||||
height="44px"
|
||||
viewBox="0 0 44 44"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="busy02.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="713"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="12.182401"
|
||||
inkscape:cx="22"
|
||||
inkscape:cy="22"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
fill="#bd93f9"
|
||||
d="M42,23.5 C41.2,23.5 40.5,22.8 40.5,22 C40.5,11.8 32.2,3.5 22,3.5 C21.2,3.5 20.5,2.8 20.5,2 C20.5,1.2 21.2,0.5 22,0.5 C33.9,0.5 43.5,10.1 43.5,22 C43.5,22.8 42.8,23.5 42,23.5 Z M22,43.5 C10.1,43.5 0.5,33.9 0.5,22 C0.5,21.2 1.2,20.5 2,20.5 C2.8,20.5 3.5,21.2 3.5,22 C3.5,32.2 11.8,40.5 22,40.5 C22.8,40.5 23.5,41.2 23.5,42 C23.5,42.8 22.8,43.5 22,43.5 Z"
|
||||
id="path2"
|
||||
style="fill:#bd93f9;fill-opacity:1" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
|
@ -0,0 +1,13 @@
|
|||
[Desktop Entry]
|
||||
Name=Dracula
|
||||
X-KDE-PluginInfo-Author=EliverLara
|
||||
X-KDE-PluginInfo-Category=Plasma Look And Feel
|
||||
X-KDE-PluginInfo-Email=eliverlara@gmail.com
|
||||
X-KDE-PluginInfo-EnabledByDefault=true
|
||||
X-KDE-PluginInfo-License=GPL 3+
|
||||
X-KDE-PluginInfo-Name=Dracula
|
||||
X-KDE-PluginInfo-Version=0.1
|
||||
X-KDE-PluginInfo-Website=https://github.com/EliverLara/Ant-Dracula/tree/master/kde
|
||||
X-KDE-ServiceTypes=Plasma/LookAndFeel
|
||||
|
||||
X-KPackage-Dependencies=kns://colorschemes.knsrc/api.kde-look.org/1370679,kns://plasma-themes.knsrc/api.kde-look.org/1370687,kns://plasma-themes.knsrc/api.kde-look.org/1420691,kns://aurorae.knsrc/api.kde-look.org/1370682,kns://sddmtheme.knsrc/api.kde-look.org/1374247,kns://wallpaper.knsrc/api.kde-look.org/1378234
|
Loading…
Add table
Add a link
Reference in a new issue