passwordmanager/qml/EntriesPage.qml

198 lines
6.8 KiB
QML
Raw Normal View History

import QtQuick 2.4
import QtQuick.Layouts 1.2
import QtQml.Models 2.2
import QtQuick.Controls 2.1 as Controls
import org.kde.kirigami 2.4 as Kirigami
Kirigami.ScrollablePage {
id: page
property alias model: delegateModel.model
property alias rootIndex: delegateModel.rootIndex
Layout.fillWidth: true
title: "?"
actions {
main: Kirigami.Action {
iconName: "list-add"
text: qsTr("Add account")
onTriggered: {
model.setInsertTypeToAccount()
model.insertRows(model.rowCount(rootIndex), 1, rootIndex)
}
}
left: Kirigami.Action {
iconName: "edit-paste"
text: qsTr("Paste account")
onTriggered: {
// TODO
}
}
right: Kirigami.Action {
iconName: "folder-add"
text: qsTr("Add category")
onTriggered: {
model.setInsertTypeToNode()
model.insertRows(model.rowCount(rootIndex), 1, rootIndex)
}
}
}
onBackRequested: {
if (fieldsSheet.sheetOpen) {
event.accepted = true
fieldsSheet.close()
}
}
background: Rectangle {
color: Kirigami.Theme.backgroundColor
}
BasicDialog {
id: confirmDeletionDialog
property string entryDesc: "?"
property int entryIndex: -1
standardButtons: Controls.Dialog.Ok | Controls.Dialog.Cancel
title: qsTr("Delete %1?").arg(entryDesc)
function confirmDeletion(entryName, entryIndex) {
var isNode = model.isNode(entryIndex)
var entryType = isNode ? qsTr("category ") : qsTr("account ")
this.entryIndex = entryIndex
this.entryDesc = entryType + entryName
this.open()
}
onAccepted: model.removeRows(this.entryIndex, 1, rootIndex)
}
BasicDialog {
id: renameDialog
property string entryDesc: "?"
property int entryIndex: -1
property alias newEntryName: entryNameTextField.text
standardButtons: newEntryName.length
> 0 ? Controls.Dialog.Ok | Controls.Dialog.Cancel : Controls.Dialog.Cancel
title: qsTr("Rename ") + entryDesc
ColumnLayout {
Controls.TextField {
id: entryNameTextField
Layout.preferredWidth: renameDialog.availableWidth
placeholderText: qsTr("enter new name here")
}
}
function renameEntry(entryName, entryIndex) {
var isNode = model.isNode(entryIndex)
var entryType = isNode ? qsTr("category ") : qsTr("account ")
this.entryIndex = entryIndex
this.entryDesc = entryType + entryName
this.newEntryName = entryName
this.open()
}
onAccepted: model.setData(model.index(this.entryIndex, 0, rootIndex),
newEntryName)
}
// "sheet" to display field model
Kirigami.OverlaySheet {
id: fieldsSheet
parent: applicationWindow().overlay
header: Kirigami.Heading {
text: qsTr("Edit account ") + nativeInterface.currentAccountName
}
ListView {
id: fieldsListView
implicitWidth: Kirigami.Units.gridUnit * 30
model: nativeInterface.fieldModel
delegate: RowLayout {
Controls.TextField {
text: key ? key : ""
onEditingFinished: fieldsListView.model.setData(
fieldsListView.model.index(index,
0), text)
}
Controls.TextField {
text: value ? value : ""
echoMode: isPassword ? TextInput.PasswordEchoOnEdit : TextInput.Normal
onEditingFinished: fieldsListView.model.setData(
fieldsListView.model.index(index,
1), text)
}
}
}
}
// list view to display one hierarchy level of entry model
ListView {
id: listView
model: DelegateModel {
id: delegateModel
function isNode(rowNumber) {
return model.isNode(model.index(rowNumber, 0, rootIndex))
}
function handleEntryClicked(rowNumber, entryName) {
var modelIndex = model.index(rowNumber, 0, rootIndex)
if (model.isNode(modelIndex)) {
root.pushStackEntry(model, modelIndex)
} else {
nativeInterface.currentAccountIndex = modelIndex
fieldsSheet.open()
}
}
delegate: Kirigami.SwipeListItem {
id: listItem
contentItem: RowLayout {
Kirigami.Icon {
width: Kirigami.Units.iconSizes.smallMedium
height: Kirigami.Units.iconSizes.smallMedium
Layout.fillHeight: true
source: delegateModel.isNode(
index) ? "folder-symbolic" : "story-editor"
}
Controls.Label {
Layout.fillWidth: true
Layout.fillHeight: true
height: Math.max(implicitHeight,
Kirigami.Units.iconSizes.smallMedium)
Layout.alignment: verticalCenter
text: name
MouseArea {
anchors.fill: parent
onClicked: delegateModel.handleEntryClicked(index,
name)
}
}
}
actions: [
Kirigami.Action {
iconName: "edit-cut"
text: qsTr("Cut")
onTriggered: showPassiveNotification(text + " " + name)
},
Kirigami.Action {
iconName: "edit-delete"
text: qsTr("Delete")
onTriggered: confirmDeletionDialog.confirmDeletion(
name, index)
},
Kirigami.Action {
iconName: "edit-rename"
text: qsTr("Rename")
onTriggered: renameDialog.renameEntry(name, index)
}
]
}
}
}
}