diff options
31 files changed, 1686 insertions, 568 deletions
diff --git a/x11-themes/redcore-theme-sddm/files/redcore/Background.qml b/x11-themes/redcore-theme-sddm/files/redcore/Background.qml new file mode 100644 index 00000000..5a384151 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/Background.qml @@ -0,0 +1,69 @@ +/* + * Copyright 2016 Boudhayan Gupta <bgupta@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 + +FocusScope { + id: sceneBackground + + property var sceneBackgroundType + property alias sceneBackgroundColor: sceneColorBackground.color + property alias sceneBackgroundImage: sceneImageBackground.source + + Rectangle { + id: sceneColorBackground + anchors.fill: parent + } + + Image { + id: sceneImageBackground + anchors.fill: parent + sourceSize.width: parent.width + sourceSize.height: parent.height + fillMode: Image.PreserveAspectCrop + smooth: true; + } + + states: [ + State { + name: "imageBackground" + when: sceneBackgroundType === "image" + PropertyChanges { + target: sceneColorBackground + visible: false + } + PropertyChanges { + target: sceneImageBackground + visible: true + } + }, + State { + name: "colorBackground" + when: sceneBackgroundType !== "image" + PropertyChanges { + target: sceneColorBackground + visible: true + } + PropertyChanges { + target: sceneImageBackground + visible: false + } + } + ] +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/BreezeMenuStyle.qml b/x11-themes/redcore-theme-sddm/files/redcore/BreezeMenuStyle.qml new file mode 100644 index 00000000..7d56c149 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/BreezeMenuStyle.qml @@ -0,0 +1,25 @@ +import QtQuick 2.2 + +import org.kde.plasma.core 2.0 as PlasmaCore + +import QtQuick.Controls.Styles 1.4 as QQCS +import QtQuick.Controls 1.3 as QQC + +QQCS.MenuStyle { + frame: Rectangle { + color: PlasmaCore.ColorScope.backgroundColor + border.color: Qt.tint(PlasmaCore.ColorScope.textColor, Qt.rgba(color.r, color.g, color.b, 0.7)) + border.width: 1 + } + itemDelegate.label: QQC.Label { + height: contentHeight * 1.2 + verticalAlignment: Text.AlignVCenter + color: styleData.selected ? PlasmaCore.ColorScope.highlightedTextColor : PlasmaCore.ColorScope.textColor + font.pointSize: config.fontSize + text: styleData.text + } + itemDelegate.background: Rectangle { + visible: styleData.selected + color: PlasmaCore.ColorScope.highlightColor + } +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/KeyboardButton.qml b/x11-themes/redcore-theme-sddm/files/redcore/KeyboardButton.qml new file mode 100644 index 00000000..9989d93e --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/KeyboardButton.qml @@ -0,0 +1,38 @@ +import QtQuick 2.2 + +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents + +import QtQuick.Controls 1.3 as QQC + +PlasmaComponents.ToolButton { + id: keyboardButton + + property int currentIndex: -1 + + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Keyboard Layout: %1", instantiator.objectAt(currentIndex).shortName) + implicitWidth: minimumWidth + font.pointSize: config.fontSize + + visible: menu.items.length > 1 + + Component.onCompleted: currentIndex = Qt.binding(function() {return keyboard.currentLayout}); + + menu: QQC.Menu { + id: keyboardMenu + style: BreezeMenuStyle {} + Instantiator { + id: instantiator + model: keyboard.layouts + onObjectAdded: keyboardMenu.insertItem(index, object) + onObjectRemoved: keyboardMenu.removeItem( object ) + delegate: QQC.MenuItem { + text: modelData.longName + property string shortName: modelData.shortName + onTriggered: { + keyboard.currentLayout = model.index + } + } + } + } +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/LICENSE b/x11-themes/redcore-theme-sddm/files/redcore/LICENSE deleted file mode 100644 index 6b679353..00000000 --- a/x11-themes/redcore-theme-sddm/files/redcore/LICENSE +++ /dev/null @@ -1,337 +0,0 @@ -Creative Commons Legal Code - -Attribution-ShareAlike 3.0 Unported - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL - SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT - RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" - BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION - PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE -COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY -COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS -AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE -BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE -CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE -IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. - -1. Definitions - - a. "Adaptation" means a work based upon the Work, or upon the Work and other - pre-existing works, such as a translation, adaptation, derivative work, - arrangement of music or other alterations of a literary or artistic work, - or phonogram or performance and includes cinematographic adaptations or any - other form in which the Work may be recast, transformed, or adapted - including in any form recognizably derived from the original, except that a - work that constitutes a Collection will not be considered an Adaptation for - the purpose of this License. For the avoidance of doubt, where the Work is - a musical work, performance or phonogram, the synchronization of the Work - in timed-relation with a moving image ("synching") will be considered an - Adaptation for the purpose of this License. - b. "Collection" means a collection of literary or artistic works, such as - encyclopedias and anthologies, or performances, phonograms or broadcasts, - or other works or subject matter other than works listed in Section 1(f) - below, which, by reason of the selection and arrangement of their contents, - constitute intellectual creations, in which the Work is included in its - entirety in unmodified form along with one or more other contributions, - each constituting separate and independent works in themselves, which - together are assembled into a collective whole. A work that constitutes a - Collection will not be considered an Adaptation (as defined below) for the - purposes of this License. - c. "Creative Commons Compatible License" means a license that is listed at - http://creativecommons.org/compatiblelicenses that has been approved by - Creative Commons as being essentially equivalent to this License, - including, at a minimum, because that license: (i) contains terms that have - the same purpose, meaning and effect as the License Elements of this - License; and, (ii) explicitly permits the relicensing of adaptations of - works made available under that license under this License or a Creative - Commons jurisdiction license with the same License Elements as this - License. - d. "Distribute" means to make available to the public the original and copies - of the Work or Adaptation, as appropriate, through sale or other transfer - of ownership. - e. "License Elements" means the following high-level license attributes as - selected by Licensor and indicated in the title of this License: - Attribution, ShareAlike. - f. "Licensor" means the individual, individuals, entity or entities that offer - (s) the Work under the terms of this License. - g. "Original Author" means, in the case of a literary or artistic work, the - individual, individuals, entity or entities who created the Work or if no - individual or entity can be identified, the publisher; and in addition (i) - in the case of a performance the actors, singers, musicians, dancers, and - other persons who act, sing, deliver, declaim, play in, interpret or - otherwise perform literary or artistic works or expressions of folklore; - (ii) in the case of a phonogram the producer being the person or legal - entity who first fixes the sounds of a performance or other sounds; and, - (iii) in the case of broadcasts, the organization that transmits the - broadcast. - h. "Work" means the literary and/or artistic work offered under the terms of - this License including without limitation any production in the literary, - scientific and artistic domain, whatever may be the mode or form of its - expression including digital form, such as a book, pamphlet and other - writing; a lecture, address, sermon or other work of the same nature; a - dramatic or dramatico-musical work; a choreographic work or entertainment - in dumb show; a musical composition with or without words; a - cinematographic work to which are assimilated works expressed by a process - analogous to cinematography; a work of drawing, painting, architecture, - sculpture, engraving or lithography; a photographic work to which are - assimilated works expressed by a process analogous to photography; a work - of applied art; an illustration, map, plan, sketch or three-dimensional - work relative to geography, topography, architecture or science; a - performance; a broadcast; a phonogram; a compilation of data to the extent - it is protected as a copyrightable work; or a work performed by a variety - or circus performer to the extent it is not otherwise considered a literary - or artistic work. - i. "You" means an individual or entity exercising rights under this License - who has not previously violated the terms of this License with respect to - the Work, or who has received express permission from the Licensor to - exercise rights under this License despite a previous violation. - j. "Publicly Perform" means to perform public recitations of the Work and to - communicate to the public those public recitations, by any means or - process, including by wire or wireless means or public digital - performances; to make available to the public Works in such a way that - members of the public may access these Works from a place and at a place - individually chosen by them; to perform the Work to the public by any means - or process and the communication to the public of the performances of the - Work, including by public digital performance; to broadcast and rebroadcast - the Work by any means including signs, sounds or images. - k. "Reproduce" means to make copies of the Work by any means including without - limitation by sound or visual recordings and the right of fixation and - reproducing fixations of the Work, including storage of a protected - performance or phonogram in digital form or other electronic medium. - -2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, -or restrict any uses free from copyright or rights arising from limitations or -exceptions that are provided for in connection with the copyright protection -under copyright law or other applicable laws. - -3. License Grant. Subject to the terms and conditions of this License, Licensor -hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the -duration of the applicable copyright) license to exercise the rights in the -Work as stated below: - - a. to Reproduce the Work, to incorporate the Work into one or more - Collections, and to Reproduce the Work as incorporated in the Collections; - b. to create and Reproduce Adaptations provided that any such Adaptation, - including any translation in any medium, takes reasonable steps to clearly - label, demarcate or otherwise identify that changes were made to the - original Work. For example, a translation could be marked "The original - work was translated from English to Spanish," or a modification could - indicate "The original work has been modified."; - c. to Distribute and Publicly Perform the Work including as incorporated in - Collections; and, - d. to Distribute and Publicly Perform Adaptations. - e. For the avoidance of doubt: - - i. Non-waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme cannot be waived, the Licensor reserves the - exclusive right to collect such royalties for any exercise by You of - the rights granted under this License; - ii. Waivable Compulsory License Schemes. In those jurisdictions in which - the right to collect royalties through any statutory or compulsory - licensing scheme can be waived, the Licensor waives the exclusive right - to collect such royalties for any exercise by You of the rights granted - under this License; and, - iii. Voluntary License Schemes. The Licensor waives the right to collect - royalties, whether individually or, in the event that the Licensor is a - member of a collecting society that administers voluntary licensing - schemes, via that society, from any exercise by You of the rights - granted under this License. - -The above rights may be exercised in all media and formats whether now known or -hereafter devised. The above rights include the right to make such -modifications as are technically necessary to exercise the rights in other -media and formats. Subject to Section 8(f), all rights not expressly granted by -Licensor are hereby reserved. - -4. Restrictions. The license granted in Section 3 above is expressly made -subject to and limited by the following restrictions: - - a. You may Distribute or Publicly Perform the Work only under the terms of - this License. You must include a copy of, or the Uniform Resource - Identifier (URI) for, this License with every copy of the Work You - Distribute or Publicly Perform. You may not offer or impose any terms on - the Work that restrict the terms of this License or the ability of the - recipient of the Work to exercise the rights granted to that recipient - under the terms of the License. You may not sublicense the Work. You must - keep intact all notices that refer to this License and to the disclaimer of - warranties with every copy of the Work You Distribute or Publicly Perform. - When You Distribute or Publicly Perform the Work, You may not impose any - effective technological measures on the Work that restrict the ability of a - recipient of the Work from You to exercise the rights granted to that - recipient under the terms of the License. This Section 4(a) applies to the - Work as incorporated in a Collection, but this does not require the - Collection apart from the Work itself to be made subject to the terms of - this License. If You create a Collection, upon notice from any Licensor You - must, to the extent practicable, remove from the Collection any credit as - required by Section 4(c), as requested. If You create an Adaptation, upon - notice from any Licensor You must, to the extent practicable, remove from - the Adaptation any credit as required by Section 4(c), as requested. - b. You may Distribute or Publicly Perform an Adaptation only under the terms - of: (i) this License; (ii) a later version of this License with the same - License Elements as this License; (iii) a Creative Commons jurisdiction - license (either this or a later license version) that contains the same - License Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); - (iv) a Creative Commons Compatible License. If you license the Adaptation - under one of the licenses mentioned in (iv), you must comply with the terms - of that license. If you license the Adaptation under the terms of any of - the licenses mentioned in (i), (ii) or (iii) (the "Applicable License"), - you must comply with the terms of the Applicable License generally and the - following provisions: (I) You must include a copy of, or the URI for, the - Applicable License with every copy of each Adaptation You Distribute or - Publicly Perform; (II) You may not offer or impose any terms on the - Adaptation that restrict the terms of the Applicable License or the ability - of the recipient of the Adaptation to exercise the rights granted to that - recipient under the terms of the Applicable License; (III) You must keep - intact all notices that refer to the Applicable License and to the - disclaimer of warranties with every copy of the Work as included in the - Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or - Publicly Perform the Adaptation, You may not impose any effective - technological measures on the Adaptation that restrict the ability of a - recipient of the Adaptation from You to exercise the rights granted to that - recipient under the terms of the Applicable License. This Section 4(b) - applies to the Adaptation as incorporated in a Collection, but this does - not require the Collection apart from the Adaptation itself to be made - subject to the terms of the Applicable License. - c. If You Distribute, or Publicly Perform the Work or any Adaptations or - Collections, You must, unless a request has been made pursuant to Section 4 - (a), keep intact all copyright notices for the Work and provide, reasonable - to the medium or means You are utilizing: (i) the name of the Original - Author (or pseudonym, if applicable) if supplied, and/or if the Original - Author and/or Licensor designate another party or parties (e.g., a sponsor - institute, publishing entity, journal) for attribution ("Attribution - Parties") in Licensor's copyright notice, terms of service or by other - reasonable means, the name of such party or parties; (ii) the title of the - Work if supplied; (iii) to the extent reasonably practicable, the URI, if - any, that Licensor specifies to be associated with the Work, unless such - URI does not refer to the copyright notice or licensing information for the - Work; and (iv) , consistent with Ssection 3(b), in the case of an - Adaptation, a credit identifying the use of the Work in the Adaptation - (e.g., "French translation of the Work by Original Author," or "Screenplay - based on original Work by Original Author"). The credit required by this - Section 4(c) may be implemented in any reasonable manner; provided, - however, that in the case of a Adaptation or Collection, at a minimum such - credit will appear, if a credit for all contributing authors of the - Adaptation or Collection appears, then as part of these credits and in a - manner at least as prominent as the credits for the other contributing - authors. For the avoidance of doubt, You may only use the credit required - by this Section for the purpose of attribution in the manner set out above - and, by exercising Your rights under this License, You may not implicitly - or explicitly assert or imply any connection with, sponsorship or - endorsement by the Original Author, Licensor and/or Attribution Parties, as - appropriate, of You or Your use of the Work, without the separate, express - prior written permission of the Original Author, Licensor and/or - Attribution Parties. - d. Except as otherwise agreed in writing by the Licensor or as may be - otherwise permitted by applicable law, if You Reproduce, Distribute or - Publicly Perform the Work either by itself or as part of any Adaptations or - Collections, You must not distort, mutilate, modify or take other - derogatory action in relation to the Work which would be prejudicial to the - Original Author's honor or reputation. Licensor agrees that in those - jurisdictions (e.g. Japan), in which any exercise of the right granted in - Section 3(b) of this License (the right to make Adaptations) would be - deemed to be a distortion, mutilation, modification or other derogatory - action prejudicial to the Original Author's honor and reputation, the - Licensor will waive or not assert, as appropriate, this Section, to the - fullest extent permitted by the applicable national law, to enable You to - reasonably exercise Your right under Section 3(b) of this License (right to - make Adaptations) but not otherwise. - -5. Representations, Warranties and Disclaimer - -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS -THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND -CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, -WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A -PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, -ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. -SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH -EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN -NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, -INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS -LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -7. Termination - - a. This License and the rights granted hereunder will terminate automatically - upon any breach by You of the terms of this License. Individuals or - entities who have received Adaptations or Collections from You under this - License, however, will not have their licenses terminated provided such - individuals or entities remain in full compliance with those licenses. - Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. - b. Subject to the above terms and conditions, the license granted here is - perpetual (for the duration of the applicable copyright in the Work). - Notwithstanding the above, Licensor reserves the right to release the Work - under different license terms or to stop distributing the Work at any time; - provided, however that any such election will not serve to withdraw this - License (or any other license that has been, or is required to be, granted - under the terms of this License), and this License will continue in full - force and effect unless terminated as stated above. - -8. Miscellaneous - - a. Each time You Distribute or Publicly Perform the Work or a Collection, the - Licensor offers to the recipient a license to the Work on the same terms - and conditions as the license granted to You under this License. - b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers - to the recipient a license to the original Work on the same terms and - conditions as the license granted to You under this License. - c. If any provision of this License is invalid or unenforceable under - applicable law, it shall not affect the validity or enforceability of the - remainder of the terms of this License, and without further action by the - parties to this agreement, such provision shall be reformed to the minimum - extent necessary to make such provision valid and enforceable. - d. No term or provision of this License shall be deemed waived and no breach - consented to unless such waiver or consent shall be in writing and signed - by the party to be charged with such waiver or consent. - e. This License constitutes the entire agreement between the parties with - respect to the Work licensed here. There are no understandings, agreements - or representations with respect to the Work not specified here. Licensor - shall not be bound by any additional provisions that may appear in any - communication from You. This License may not be modified without the mutual - written agreement of the Licensor and You. - f. The rights granted under, and the subject matter referenced, in this - License were drafted utilizing the terminology of the Berne Convention for - the Protection of Literary and Artistic Works (as amended on September 28, - 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the - WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright - Convention (as revised on July 24, 1971). These rights and subject matter - take effect in the relevant jurisdiction in which the License terms are - sought to be enforced according to the corresponding provisions of the - implementation of those treaty provisions in the applicable national law. - If the standard suite of rights granted under applicable copyright law - includes additional rights not granted under this License, such additional - rights are deemed to be included in the License; this License is not - intended to restrict the license of any rights under applicable law. - - Creative Commons Notice - - Creative Commons is not a party to this License, and makes no warranty - whatsoever in connection with the Work. Creative Commons will not be liable - to You or any party on any legal theory for any damages whatsoever, - including without limitation any general, special, incidental or - consequential damages arising in connection to this license. - Notwithstanding the foregoing two (2) sentences, if Creative Commons has - expressly identified itself as the Licensor hereunder, it shall have all - rights and obligations of Licensor. - - Except for the limited purpose of indicating to the public that the Work is - licensed under the CCPL, Creative Commons does not authorize the use by - either party of the trademark "Creative Commons" or any related trademark - or logo of Creative Commons without the prior written consent of Creative - Commons. Any permitted use will be in compliance with Creative Commons' - then-current trademark usage guidelines, as may be published on its website - or otherwise made available upon request from time to time. For the - avoidance of doubt, this trademark restriction does not form part of the - License. - - Creative Commons may be contacted at https://creativecommons.org/. diff --git a/x11-themes/redcore-theme-sddm/files/redcore/Login.qml b/x11-themes/redcore-theme-sddm/files/redcore/Login.qml new file mode 100644 index 00000000..7234917f --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/Login.qml @@ -0,0 +1,156 @@ +import "components" + +import QtQuick 2.0 +import QtQuick.Layouts 1.2 +import QtQuick.Controls.Styles 1.4 + +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents + +SessionManagementScreen { + + property bool showUsernamePrompt: !showUserList + property int usernameFontSize + property string usernameFontColor + property string lastUserName + property bool passwordFieldOutlined: config.PasswordFieldOutlined == "true" + property bool hidePasswordRevealIcon: config.HidePasswordRevealIcon == "false" + property int visibleBoundary: mapFromItem(loginButton, 0, 0).y + onHeightChanged: visibleBoundary = mapFromItem(loginButton, 0, 0).y + loginButton.height + units.smallSpacing + + signal loginRequest(string username, string password) + + onShowUsernamePromptChanged: { + if (!showUsernamePrompt) { + lastUserName = "" + } + } + + /* + * 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 + */ + function startLogin() { + var username = showUsernamePrompt ? userNameInput.text : userList.selectedUser + var password = passwordBox.text + + loginButton.forceActiveFocus(); + loginRequest(username, password); + } + + PlasmaComponents.TextField { + id: userNameInput + Layout.fillWidth: true + Layout.minimumHeight: 32 + implicitHeight: usernameFontSize * 2.85 + font.pointSize: usernameFontSize * 0.8 + font.family: config.Font || "Noto Sans" + opacity: 1.0 + text: lastUserName + visible: showUsernamePrompt + focus: showUsernamePrompt && !lastUserName //if there's a username prompt it gets focus first, otherwise password does + placeholderText: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Username") + + style: TextFieldStyle { + textColor: "white" + placeholderTextColor: "white" + background: Rectangle { + radius: 6 + border.color: "#1A73E8" + border.width: 2 + color: "#48316f" + } + } + } + + PlasmaComponents.TextField { + id: passwordBox + Layout.fillWidth: true + Layout.minimumHeight: 32 + implicitHeight: usernameFontSize * 2.85 + font.pointSize: usernameFontSize * 0.8 + opacity: passwordFieldOutlined ? 1.0 : 1.0 + font.family: config.Font || "Noto Sans" + placeholderText: config.PasswordFieldPlaceholderText == "Password" ? i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Password") : config.PasswordFieldPlaceholderText + focus: !showUsernamePrompt || lastUserName + echoMode: TextInput.Password + revealPasswordButtonShown: hidePasswordRevealIcon + onAccepted: startLogin() + + style: TextFieldStyle { + textColor: passwordFieldOutlined ? "white" : "white" + placeholderTextColor: passwordFieldOutlined ? "white" : "white" + passwordCharacter: config.PasswordFieldCharacter == "" ? "●" : config.PasswordFieldCharacter + background: Rectangle { + radius: 6 + border.color: "#1A73E8" + border.width: 2 + color: "#48316f" + } + } + + Keys.onEscapePressed: { + mainStack.currentItem.forceActiveFocus(); + } + + 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 + } + } + + Keys.onReleased: { + if (loginButton.opacity == 0 && length > 0) { + showLoginButton.start() + } + if (loginButton.opacity > 0 && length == 0) { + hideLoginButton.start() + } + } + + Connections { + target: sddm + onLoginFailed: { + passwordBox.selectAll() + passwordBox.forceActiveFocus() + } + } + } + + Image { + id: loginButton + source: "assets/login.svgz" + smooth: true + sourceSize: Qt.size(passwordBox.height, passwordBox.height) + anchors { + left: passwordBox.right + verticalCenter: passwordBox.verticalCenter + } + anchors.leftMargin: 8 + visible: opacity > 0 + opacity: 0 + MouseArea { + anchors.fill: parent + onClicked: startLogin(); + } + PropertyAnimation { + id: showLoginButton + target: loginButton + properties: "opacity" + to: 0.75 + duration: 100 + } + PropertyAnimation { + id: hideLoginButton + target: loginButton + properties: "opacity" + to: 0 + duration: 80 + } + } +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/Main.qml b/x11-themes/redcore-theme-sddm/files/redcore/Main.qml index 4757e0cd..986bc3d7 100644 --- a/x11-themes/redcore-theme-sddm/files/redcore/Main.qml +++ b/x11-themes/redcore-theme-sddm/files/redcore/Main.qml @@ -1,275 +1,481 @@ -/*************************************************************************** -* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com> -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without restriction, -* including without limitation the rights to use, copy, modify, merge, -* publish, distribute, sublicense, and/or sell copies of the Software, -* and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included -* in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE -* OR OTHER DEALINGS IN THE SOFTWARE. -* -***************************************************************************/ - -import QtQuick 2.0 -import SddmComponents 2.0 - -Rectangle { - id: container - width: 640 - height: 480 - - LayoutMirroring.enabled: Qt.locale().textDirection == Qt.RightToLeft +/* + * 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 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 "components" + +PlasmaCore.ColorScope { + id: root + + // 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 + + colorGroup: PlasmaCore.Theme.ComplementaryColorGroup + + width: 1600 + height: 900 + + property string notificationMessage + + LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft LayoutMirroring.childrenInherit: true - TextConstants { id: textConstants } - - Connections { - target: sddm - - onLoginSucceeded: { - errorMessage.color = "steelblue" - errorMessage.text = textConstants.loginSucceeded - } - - onLoginFailed: { - password.text = "" - errorMessage.color = "red" - errorMessage.text = textConstants.loginFailed - } + PlasmaCore.DataSource { + id: keystateSource + engine: "keystate" + connectedSources: "Caps Lock" } - Background { + Item { + id: wallpaper anchors.fill: parent - source: config.background - fillMode: Image.PreserveAspectCrop - onStatusChanged: { - if (status == Image.Error && source != config.defaultBackground) { - source = config.defaultBackground + Repeater { + model: screenModel + + Background { + x: geometry.x; y: geometry.y; width: geometry.width; height: geometry.height + sceneBackgroundType: config.type + sceneBackgroundColor: config.color + sceneBackgroundImage: config.background } } } - Rectangle { + MouseArea { + id: loginScreenRoot anchors.fill: parent - color: "transparent" - //visible: primaryScreen - Clock { - id: clock - anchors.margins: 5 - anchors.top: parent.top; anchors.right: parent.right + property bool uiVisible: true + property bool blockUI: mainStack.depth > 1 || userListComponent.mainPasswordBox.text.length > 0 || inputPanel.keyboardActive || config.type !== "image" + + 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(); + } + } - color: "white" - timeFont.family: "Oxygen" + Keys.onPressed: { + uiVisible = true; + event.accepted = false; } - Image { - id: rectangle - anchors.centerIn: parent - width: Math.max(320, mainColumn.implicitWidth + 50) - height: Math.max(320, mainColumn.implicitHeight + 50) - - source: "rectangle.png" - - Column { - id: mainColumn - anchors.centerIn: parent - spacing: 12 - Text { - anchors.horizontalCenter: parent.horizontalCenter - color: "black" - verticalAlignment: Text.AlignVCenter - height: text.implicitHeight - width: parent.width - text: textConstants.welcomeText.arg(sddm.hostName) - wrapMode: Text.WordWrap - font.pixelSize: 24 - elide: Text.ElideRight - horizontalAlignment: Text.AlignHCenter + //takes one full minute for the ui to disappear + Timer { + id: fadeoutTimer + running: true + interval: 60000 + onTriggered: { + if (!loginScreenRoot.blockUI) { + loginScreenRoot.uiVisible = false; } + } + } + WallpaperFader { + visible: config.type === "image" + anchors.fill: parent + state: loginScreenRoot.uiVisible ? "on" : "off" + source: wallpaper + mainStack: mainStack + footer: footer + clock: clock + } - Column { - width: parent.width - spacing: 4 - Text { - id: lblName - width: parent.width - text: textConstants.userName - font.bold: true - font.pixelSize: 12 - } + DropShadow { + id: clockShadow + anchors.fill: clock + source: clock + visible: !softwareRendering + horizontalOffset: 1 + verticalOffset: 1 + radius: 6 + samples: 14 + spread: 0.3 + color: "black" // matches Breeze window decoration and desktopcontainment + Behavior on opacity { + OpacityAnimator { + duration: 1000 + easing.type: Easing.InOutQuad + } + } + } + + Clock { + id: clock + visible: y > 0 + property Item shadow: clockShadow + y: (userListComponent.userList.y + mainStack.y)/2 - height/2 + anchors.horizontalCenter: parent.horizontalCenter + } - TextBox { - id: name - width: parent.width; height: 30 - text: userModel.lastUser - font.pixelSize: 14 - KeyNavigation.backtab: rebootButton; KeyNavigation.tab: password + StackView { + id: mainStack + anchors { + left: parent.left + right: parent.right + } + height: root.height + units.gridUnit * 3 + + focus: true //StackView is an implicit focus scope, so we need to give this focus so the item inside will have it + + Timer { + //SDDM has a bug in 0.13 where even though we set the focus on the right item within the window, the window doesn't have focus + //it is fixed in 6d5b36b28907b16280ff78995fef764bb0c573db which will be 0.14 + //we need to call "window->activate()" *After* it's been shown. We can't control that in QML so we use a shoddy timer + //it's been this way for all Plasma 5.x without a huge problem + running: true + repeat: false + interval: 200 + onTriggered: mainStack.forceActiveFocus() + } - Keys.onPressed: { - if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { - sddm.login(name.text, password.text, session.index) - event.accepted = true - } - } - } - } + initialItem: Login { + id: userListComponent + userListModel: userModel + userListCurrentIndex: userModel.lastIndex >= 0 ? userModel.lastIndex : 0 + lastUserName: userModel.lastUser + + usernameFontSize: root.generalFontSize + usernameFontColor: root.generalFontColor - Column { - width: parent.width - spacing : 4 - Text { - id: lblPassword - width: parent.width - text: textConstants.password - font.bold: true - font.pixelSize: 12 - } + showUserList: { + if ( !userListModel.hasOwnProperty("count") + || !userListModel.hasOwnProperty("disableAvatarsThreshold")) + return (userList.y + mainStack.y) > 0 - PasswordBox { - id: password - width: parent.width; height: 30 - font.pixelSize: 14 + if ( userListModel.count == 0 ) return false - KeyNavigation.backtab: name; KeyNavigation.tab: session + return userListModel.count <= userListModel.disableAvatarsThreshold && (userList.y + mainStack.y) > 0 + } - Keys.onPressed: { - if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { - sddm.login(name.text, password.text, session.index) - event.accepted = true - } - } + notificationMessage: { + var text = "" + if (keystateSource.data["Caps Lock"]["Locked"]) { + text += i18nd("plasma_lookandfeel_org.kde.lookandfeel","Caps Lock is on") + if (root.notificationMessage) { + text += " • " } } + text += root.notificationMessage + return text + } - Row { - spacing: 4 - width: parent.width / 2 - z: 100 - - Column { - z: 100 - width: parent.width * 1.3 - spacing : 4 - anchors.bottom: parent.bottom - - Text { - id: lblSession - width: parent.width - text: textConstants.session - wrapMode: TextEdit.WordWrap - font.bold: true - font.pixelSize: 12 - } + actionItems: [ + ActionButton { + iconSource: "/usr/share/sddm/themes/Orchis/assets/suspend_primary.svgz" + text: i18ndc("plasma_lookandfeel_org.kde.lookandfeel","Suspend to RAM","Sleep") + onClicked: sddm.suspend() + enabled: sddm.canSuspend + visible: !inputPanel.keyboardActive + }, + ActionButton { + iconSource: "/usr/share/sddm/themes/Orchis/assets/restart_primary.svgz" + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Restart") + onClicked: sddm.reboot() + enabled: sddm.canReboot + visible: !inputPanel.keyboardActive + }, + ActionButton { + iconSource: "/usr/share/sddm/themes/Orchis/assets/shutdown_primary.svgz" + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Shut Down") + onClicked: sddm.powerOff() + enabled: sddm.canPowerOff + visible: !inputPanel.keyboardActive + }, + ActionButton { + iconSource: "/usr/share/sddm/themes/Orchis/assets/switch_primary.svgz" + text: i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "For switching to a username and password prompt", "Other...") + onClicked: mainStack.push(userPromptComponent) + enabled: true + visible: !userListComponent.showUsernamePrompt && !inputPanel.keyboardActive + }] + + onLoginRequest: { + root.notificationMessage = "" + sddm.login(username, password, sessionButton.currentIndex) + } + } - ComboBox { - id: session - width: parent.width; height: 30 - font.pixelSize: 14 + Behavior on opacity { + OpacityAnimator { + duration: units.longDuration + } + } + } - arrowIcon: "angle-down.png" + Loader { + id: inputPanel + state: "hidden" + property bool keyboardActive: item ? item.active : false + onKeyboardActiveChanged: { + if (keyboardActive) { + state = "visible" + } else { + state = "hidden"; + } + } + source: "components/VirtualKeyboard.qml" + anchors { + left: parent.left + right: parent.right + } - model: sessionModel - index: sessionModel.lastIndex + function showHide() { + state = state == "hidden" ? "visible" : "hidden"; + } - KeyNavigation.backtab: password; KeyNavigation.tab: layoutBox + states: [ + State { + name: "visible" + PropertyChanges { + target: mainStack + y: Math.min(0, root.height - inputPanel.height - userListComponent.visibleBoundary) + } + PropertyChanges { + target: inputPanel + y: root.height - inputPanel.height + opacity: 1 + } + }, + State { + name: "hidden" + PropertyChanges { + target: mainStack + y: 0 + } + PropertyChanges { + target: inputPanel + y: root.height - root.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 + } } } - - Column { - z: 101 - width: parent.width * 0.7 - spacing : 4 - anchors.bottom: parent.bottom - - Text { - id: lblLayout - width: parent.width - text: textConstants.layout - wrapMode: TextEdit.WordWrap - font.bold: true - font.pixelSize: 12 + }, + 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 + } } - - LayoutBox { - id: layoutBox - width: parent.width; height: 30 - font.pixelSize: 14 - - arrowIcon: "angle-down.png" - - KeyNavigation.backtab: session; KeyNavigation.tab: loginButton + ScriptAction { + script: { + Qt.inputMethod.hide(); + } } } } + ] + } + - Column { - width: parent.width - Text { - id: errorMessage - anchors.horizontalCenter: parent.horizontalCenter - text: textConstants.prompt - font.pixelSize: 10 + Component { + id: userPromptComponent + Login { + showUsernamePrompt: true + notificationMessage: root.notificationMessage + + // using a model rather than a QObject list to avoid QTBUG-75900 + userListModel: ListModel { + ListElement { + name: "" + iconSource: "" + } + Component.onCompleted: { + // as we can't bind inside ListElement + setProperty(0, "name", i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Type in Username and Password")); } } - Row { - spacing: 4 - anchors.horizontalCenter: parent.horizontalCenter - property int btnWidth: Math.max(loginButton.implicitWidth, - shutdownButton.implicitWidth, - rebootButton.implicitWidth, 80) + 8 - Button { - id: loginButton - text: textConstants.login - width: parent.btnWidth - - onClicked: sddm.login(name.text, password.text, session.index) + onLoginRequest: { + root.notificationMessage = "" + sddm.login(username, password, sessionButton.currentIndex) + } - KeyNavigation.backtab: layoutBox; KeyNavigation.tab: shutdownButton + actionItems: [ + ActionButton { + iconSource: "/usr/share/sddm/themes/Orchis/assets/suspend_primary.svgz" + text: i18ndc("plasma_lookandfeel_org.kde.lookandfeel","Suspend to RAM","Sleep") + onClicked: sddm.suspend() + enabled: sddm.canSuspend + visible: !inputPanel.keyboardActive + }, + ActionButton { + iconSource: "/usr/share/sddm/themes/Orchis/assets/restart_primary.svgz" + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Restart") + onClicked: sddm.reboot() + enabled: sddm.canReboot + visible: !inputPanel.keyboardActive + }, + ActionButton { + iconSource: "/usr/share/sddm/themes/Orchis/assets/shutdown_primary.svgz" + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","Shut Down") + onClicked: sddm.powerOff() + enabled: sddm.canPowerOff + visible: !inputPanel.keyboardActive + }, + ActionButton { + iconSource: "/usr/share/sddm/themes/Orchis/assets/switch_primary.svgz" + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel","List Users") + onClicked: mainStack.pop() + visible: !inputPanel.keyboardActive } + ] + } + } - Button { - id: shutdownButton - text: textConstants.shutdown - width: parent.btnWidth + //Footer + RowLayout { + id: footer + anchors { + bottom: parent.bottom + left: parent.left + right: parent.right + margins: units.smallSpacing + } - onClicked: sddm.powerOff() + Behavior on opacity { + OpacityAnimator { + duration: units.longDuration + } + } - KeyNavigation.backtab: loginButton; KeyNavigation.tab: rebootButton - } + PlasmaComponents.ToolButton { + text: i18ndc("plasma_lookandfeel_org.kde.lookandfeel", "Button to show/hide virtual keyboard", "Virtual Keyboard") + font.pointSize: config.fontSize + iconName: inputPanel.keyboardActive ? "input-keyboard-virtual-on" : "input-keyboard-virtual-off" + onClicked: inputPanel.showHide() + visible: inputPanel.status == Loader.Ready + } - Button { - id: rebootButton - text: textConstants.reboot - width: parent.btnWidth + KeyboardButton { + } - onClicked: sddm.reboot() + SessionButton { + id: sessionButton + } - KeyNavigation.backtab: shutdownButton; KeyNavigation.tab: name - } - } + Item { + Layout.fillWidth: true } + + Battery { } + } + } + + Connections { + target: sddm + onLoginFailed: { + notificationMessage = i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Login Failed") + footer.enabled = true + mainStack.enabled = true + userListComponent.userList.opacity = 1 + } + onLoginSucceeded: { + //note SDDM will kill the greeter at some random point after this + //there is no certainty any transition will finish, it depends on the time it + //takes to complete the init + mainStack.opacity = 0 + footer.opacity = 0 + } + } + + onNotificationMessageChanged: { + if (notificationMessage) { + notificationResetTimer.start(); } } - Component.onCompleted: { - if (name.text == "") - name.focus = true - else - password.focus = true + Timer { + id: notificationResetTimer + interval: 3000 + onTriggered: notificationMessage = "" } } diff --git a/x11-themes/redcore-theme-sddm/files/redcore/README b/x11-themes/redcore-theme-sddm/files/redcore/README deleted file mode 100644 index 56dfea3c..00000000 --- a/x11-themes/redcore-theme-sddm/files/redcore/README +++ /dev/null @@ -1 +0,0 @@ -This theme is based on SDDM Maldives theme, which is included by default in SDDM package. diff --git a/x11-themes/redcore-theme-sddm/files/redcore/SessionButton.qml b/x11-themes/redcore-theme-sddm/files/redcore/SessionButton.qml new file mode 100644 index 00000000..58590c83 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/SessionButton.qml @@ -0,0 +1,59 @@ +/* + * 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 org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents + +import QtQuick.Controls 1.3 as QQC + +PlasmaComponents.ToolButton { + id: root + property int currentIndex: -1 + + implicitWidth: minimumWidth + + visible: menu.items.length > 1 + + text: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Desktop Session: %1", instantiator.objectAt(currentIndex).text || "") + + font.pointSize: config.fontSize + + Component.onCompleted: { + currentIndex = sessionModel.lastIndex + } + + menu: QQC.Menu { + id: menu + style: BreezeMenuStyle {} + Instantiator { + id: instantiator + model: sessionModel + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem( object ) + delegate: QQC.MenuItem { + text: model.name + onTriggered: { + root.currentIndex = model.index + } + } + } + } +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/angle-down.png b/x11-themes/redcore-theme-sddm/files/redcore/angle-down.png Binary files differdeleted file mode 100644 index 4e9aeb02..00000000 --- a/x11-themes/redcore-theme-sddm/files/redcore/angle-down.png +++ /dev/null diff --git a/x11-themes/redcore-theme-sddm/files/redcore/assets/login.svgz b/x11-themes/redcore-theme-sddm/files/redcore/assets/login.svgz Binary files differnew file mode 100644 index 00000000..a1b005b6 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/assets/login.svgz diff --git a/x11-themes/redcore-theme-sddm/files/redcore/assets/logout_primary.svgz b/x11-themes/redcore-theme-sddm/files/redcore/assets/logout_primary.svgz Binary files differnew file mode 100644 index 00000000..fd83ef02 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/assets/logout_primary.svgz diff --git a/x11-themes/redcore-theme-sddm/files/redcore/assets/restart_primary.svgz b/x11-themes/redcore-theme-sddm/files/redcore/assets/restart_primary.svgz Binary files differnew file mode 100644 index 00000000..e749f9b3 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/assets/restart_primary.svgz diff --git a/x11-themes/redcore-theme-sddm/files/redcore/assets/shutdown_primary.svgz b/x11-themes/redcore-theme-sddm/files/redcore/assets/shutdown_primary.svgz Binary files differnew file mode 100644 index 00000000..03592da9 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/assets/shutdown_primary.svgz diff --git a/x11-themes/redcore-theme-sddm/files/redcore/assets/suspend_primary.svgz b/x11-themes/redcore-theme-sddm/files/redcore/assets/suspend_primary.svgz Binary files differnew file mode 100644 index 00000000..6bbf63c9 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/assets/suspend_primary.svgz diff --git a/x11-themes/redcore-theme-sddm/files/redcore/assets/switch_primary.svgz b/x11-themes/redcore-theme-sddm/files/redcore/assets/switch_primary.svgz Binary files differnew file mode 100644 index 00000000..5f344258 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/assets/switch_primary.svgz diff --git a/x11-themes/redcore-theme-sddm/files/redcore/background.jpg b/x11-themes/redcore-theme-sddm/files/redcore/background.jpg Binary files differnew file mode 100644 index 00000000..a550bf7c --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/background.jpg diff --git a/x11-themes/redcore-theme-sddm/files/redcore/components/ActionButton.qml b/x11-themes/redcore-theme-sddm/files/redcore/components/ActionButton.qml new file mode 100644 index 00000000..9fbd2a8a --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/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 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 * 2 + 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 * 3 + 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 +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/components/Battery.qml b/x11-themes/redcore-theme-sddm/files/redcore/components/Battery.qml new file mode 100644 index 00000000..2351c4de --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/components/Battery.qml @@ -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) + } +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/components/Clock.qml b/x11-themes/redcore-theme-sddm/files/redcore/components/Clock.qml new file mode 100644 index 00000000..6e26055c --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/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 1.1 +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/x11-themes/redcore-theme-sddm/files/redcore/components/KeyboardLayoutButton.qml b/x11-themes/redcore-theme-sddm/files/redcore/components/KeyboardLayoutButton.qml new file mode 100644 index 00000000..32edb528 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/components/KeyboardLayoutButton.qml @@ -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]; + } + } +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/components/SessionManagementScreen.qml b/x11-themes/redcore-theme-sddm/files/redcore/components/SessionManagementScreen.qml new file mode 100644 index 00000000..5f882604 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/components/SessionManagementScreen.qml @@ -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 + } + } +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/components/UserDelegate.qml b/x11-themes/redcore-theme-sddm/files/redcore/components/UserDelegate.qml new file mode 100644 index 00000000..960315df --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/components/UserDelegate.qml @@ -0,0 +1,190 @@ +/* + * 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: Math.min(width, height - usernameDelegate.height - units.smallSpacing) + + 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.6 + } + + Item { + id: imageSource + anchors { + bottom: usernameDelegate.top + bottomMargin: units.largeSpacing + horizontalCenter: parent.horizontalCenter + } + Behavior on width { + PropertyAnimation { + from: faceSize + duration: units.longDuration * 2; + } + } + 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 antialised border + //innerRadius = size of the inner circle with contents + //outerRadius = size of the border + //blend = area to blend between two colours + //all sizes are normalised so 0.5 == half the width of the texture + + //if copying into another project don't forget to 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() } +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/components/UserList.qml b/x11-themes/redcore-theme-sddm/files/redcore/components/UserList.qml new file mode 100644 index 00000000..a2d85088 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/components/UserList.qml @@ -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() +} diff --git a/x11-themes/redcore-theme-sddm/files/redcore/components/VirtualKeyboard.qml b/x11-themes/redcore-theme-sddm/files/redcore/components/VirtualKeyboard.qml new file mode 100644 index 00000000..7848b753 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/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/x11-themes/redcore-theme-sddm/files/redcore/components/WallpaperFader.qml b/x11-themes/redcore-theme-sddm/files/redcore/components/WallpaperFader.qml new file mode 100644 index 00000000..31dfe007 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/components/WallpaperFader.qml @@ -0,0 +1,182 @@ +/******************************************************************** + 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 + + 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 + } + }, + 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/x11-themes/redcore-theme-sddm/files/redcore/metadata.desktop b/x11-themes/redcore-theme-sddm/files/redcore/metadata.desktop index de2d7e1e..26e37838 100644 --- a/x11-themes/redcore-theme-sddm/files/redcore/metadata.desktop +++ b/x11-themes/redcore-theme-sddm/files/redcore/metadata.desktop @@ -1,15 +1,16 @@ [SddmGreeterTheme] Name=Redcore -Description=Redcore Theme -Author=Ghiunhan Mamut -Copyright=(c) 2017, Ghiunhan Mamut +Description=ChromeOS Theme +Author=Vince Liuice +Copyright=(c) 2020, Vince Liuice License=CC-BY-SA Type=sddm-theme -Version=0.1 -Website=https://redcorelinux.org +Version=0.1.0 +Website=https://github.com/vinceliuice/Orchis-kde +Screenshot=preview.png MainScript=Main.qml ConfigFile=theme.conf TranslationsDirectory=translations -Email=venerix@redcorelinux.org -Theme-Id=redcore -Theme-API=${COMPONENTS_VERSION} +Email=vinceliuice@hotmail.com +Theme-Id=Orchis +Theme-API=2.0 diff --git a/x11-themes/redcore-theme-sddm/files/redcore/rectangle.png b/x11-themes/redcore-theme-sddm/files/redcore/rectangle.png Binary files differdeleted file mode 100644 index 791b26c9..00000000 --- a/x11-themes/redcore-theme-sddm/files/redcore/rectangle.png +++ /dev/null diff --git a/x11-themes/redcore-theme-sddm/files/redcore/redcore.png b/x11-themes/redcore-theme-sddm/files/redcore/redcore.png Binary files differdeleted file mode 100644 index 9eb8b888..00000000 --- a/x11-themes/redcore-theme-sddm/files/redcore/redcore.png +++ /dev/null diff --git a/x11-themes/redcore-theme-sddm/files/redcore/theme.conf b/x11-themes/redcore-theme-sddm/files/redcore/theme.conf index 4e884605..53dfe0ad 100644 --- a/x11-themes/redcore-theme-sddm/files/redcore/theme.conf +++ b/x11-themes/redcore-theme-sddm/files/redcore/theme.conf @@ -1,2 +1,5 @@ [General] -background=redcore.png +type=image +color=#520A0A +fontSize=10 +background=background.jpg diff --git a/x11-themes/redcore-theme-sddm/files/redcore/theme.conf.user b/x11-themes/redcore-theme-sddm/files/redcore/theme.conf.user new file mode 100644 index 00000000..68c66429 --- /dev/null +++ b/x11-themes/redcore-theme-sddm/files/redcore/theme.conf.user @@ -0,0 +1,2 @@ +[General] +type=image diff --git a/x11-themes/redcore-theme-sddm/redcore-theme-sddm-314-r1.ebuild b/x11-themes/redcore-theme-sddm/redcore-theme-sddm-314-r2.ebuild index e79d5853..e79d5853 100644 --- a/x11-themes/redcore-theme-sddm/redcore-theme-sddm-314-r1.ebuild +++ b/x11-themes/redcore-theme-sddm/redcore-theme-sddm-314-r2.ebuild |