tPasswordDelegate.qml - sailfish-safe - Sailfish frontend for safe(1)
 (HTM) git clone git://git.z3bra.org/sailfish-safe.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tPasswordDelegate.qml (3834B)
       ---
            1 /*
            2  *   Copyright (C) 2019  Daniel Vrátil <dvratil@kde.org>
            3  *
            4  *   This program is free software: you can redistribute it and/or modify
            5  *   it under the terms of the GNU General Public License as published by
            6  *   the Free Software Foundation, either version 3 of the License, or
            7  *   (at your option) any later version.
            8  *
            9  *   This program is distributed in the hope that it will be useful,
           10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
           11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
           12  *   GNU General Public License for more details.
           13  *
           14  *   You should have received a copy of the GNU General Public License
           15  *   along with this program.  If not, see <https://www.gnu.org/licenses/>.
           16  */
           17 
           18 import QtQuick 2.2
           19 import QtQml.Models 2.2
           20 import Sailfish.Silica 1.0
           21 import harbour.safe 0.1
           22 
           23 ListItem {
           24     id: listItem
           25 
           26     property var modelData
           27     property var password : null
           28 
           29     signal folderSelected()
           30 
           31     contentHeight: password === null ? Theme.itemSizeSmall : Theme.itemSizeLarge
           32 
           33     Row {
           34         anchors {
           35             fill: parent
           36             leftMargin: Theme.horizontalPageMargin
           37             rightMargin: Theme.horizontalPageMargin
           38             verticalCenter: parent.verticalCenter
           39             topMargin: Theme.paddingMedium
           40         }
           41 
           42         Column {
           43             spacing: Theme.paddingSmall
           44             width: parent.width
           45 
           46             Row {
           47                 spacing: Theme.paddingMedium
           48 
           49                 Image {
           50                     anchors.verticalCenter: parent.verticalCenter
           51                     source:  "image://theme/"
           52                                 + ((modelData.type === PasswordsModel.FolderEntry) ? "icon-m-levels" : "icon-m-device-lock")
           53                                 + "?"
           54                                 + (listItem.highlighted ? Theme.highlightColor : Theme.primaryColor)
           55                     width: Theme.iconSizeSmall
           56                     height: width
           57                 }
           58 
           59                 Label {
           60                     id: label
           61                     text: modelData.name
           62                 }
           63             }
           64 
           65             Row {
           66                 visible: password !== null
           67                 width: parent.width
           68 
           69                 Label {
           70                     id: errorLabel
           71 
           72                     visible: password !== null && password.hasError
           73 
           74                     text: password ? password.error : ""
           75                     font.pixelSize: Theme.fontSizeTiny
           76                 }
           77 
           78                 Label {
           79                     id: okLabel
           80 
           81                     visible: password !== null && password.valid
           82 
           83                     text: qsTr("Password copied to clipboard")
           84                     font.pixelSize: Theme.fontSizeTiny
           85                 }
           86             }
           87         }
           88     }
           89 
           90     RemorseItem {
           91         id: remorse
           92 
           93         cancelText: qsTr("Expire password")
           94 
           95         // HACK: override RemorseItem._execute() to act as cancel when the timer expires
           96         function _execute(closeAfterExecute) {
           97             cancel()
           98         }
           99 
          100         onCanceled: {
          101             if (listItem.password) {
          102                 listItem.password.expirePassword();
          103             }
          104         }
          105     }
          106 
          107     onClicked: {
          108         if (modelData.type === PasswordsModel.FolderEntry) {
          109             listItem.folderSelected()
          110         } else {
          111             modelData.password.requestPassword()
          112             listItem.password = modelData.password
          113             listItem.password.validChanged.connect(function() {
          114                 if (listItem.password.valid) {
          115                     remorse.execute(listItem, qsTr("Password will expire"),
          116                         function() {
          117                             if (listItem.password) {
          118                                 listItem.password.expirePassword();
          119                             }
          120                     }, listItem.password.defaultTimeout);
          121                 }
          122             });
          123         }
          124     }
          125 }