Quick GUI: Edit field in separate dialog

Editing tables is just not so nice on mobile devices
This commit is contained in:
Marius Kittler 2018-11-20 18:09:04 +01:00
parent c0703ed471
commit 702883b44a
1 changed files with 161 additions and 51 deletions

View File

@ -14,13 +14,73 @@ Kirigami.ScrollablePage {
color: Kirigami.Theme.backgroundColor
}
// dialog to edit certain field
BasicDialog {
id: fieldDialog
property int entryIndex: -1
property alias fieldName: fieldNameEdit.text
property alias fieldValue: fieldValueEdit.text
property alias isPassword: fieldIsPasswordCheckBox.checked
title: qsTr("Edit field of ") + nativeInterface.currentAccountName
standardButtons: Controls.Dialog.Ok | Controls.Dialog.Cancel
onAccepted: {
var column0 = fieldsListView.model.index(entryIndex, 0)
var column1 = fieldsListView.model.index(entryIndex, 1)
fieldsListView.model.setData(column0, fieldName)
fieldsListView.model.setData(column1, fieldValue)
fieldsListView.model.setData(column0, isPassword ? 1 : 0,
0x0100 + 1)
}
ColumnLayout {
Controls.TextField {
id: fieldNameEdit
Layout.preferredWidth: fieldDialog.availableWidth
text: fieldDialog.fieldName
Keys.onPressed: fieldDialog.acceptOnReturn(event)
}
Controls.TextField {
id: fieldValueEdit
Layout.preferredWidth: fieldDialog.availableWidth
text: fieldDialog.fieldValue
echoMode: fieldDialog.isPassword
&& !showCharactersCheckBox.checked ? TextInput.PasswordEchoOnEdit : TextInput.Normal
Keys.onPressed: fieldDialog.acceptOnReturn(event)
}
RowLayout {
Layout.preferredWidth: fieldDialog.availableWidth
Controls.CheckBox {
id: fieldIsPasswordCheckBox
text: qsTr("Mark as password")
checked: false
}
Controls.CheckBox {
id: showCharactersCheckBox
text: qsTr("Show characters")
checked: false
visible: fieldDialog.isPassword
}
}
}
function init(model, index) {
entryIndex = index
fieldName = model.key ? model.key : ""
fieldValue = model.actualValue ? model.actualValue : ""
isPassword = model.isPassword ? true : false
}
}
// component representing a field
Component {
id: fieldsListDelegateComponent
Kirigami.BasicListItem {
Kirigami.SwipeListItem {
id: fieldsListItem
contentItem: RowLayout {
id: fieldRow
property bool isLastRow: model.isPassword === undefined
Kirigami.ListItemDragHandle {
listItem: fieldsListItem
listView: fieldsListView
@ -29,67 +89,117 @@ Kirigami.ScrollablePage {
oldIndex, 1,
fieldsListView.model.index(-1, 0),
newIndex)
opacity: fieldRow.isLastRow ? 0 : 100
}
Controls.TextField {
Item {
Layout.fillWidth: true
text: model.key ? model.key : ""
onEditingFinished: fieldsListView.model.setData(
fieldsListView.model.index(index,
0), text)
}
Controls.TextField {
Layout.fillWidth: true
text: model.actualValue ? model.actualValue : ""
echoMode: model.isPassword
&& (!activeFocus
|| !main.showPasswordsOnFocus) ? TextInput.PasswordEchoOnEdit : TextInput.Normal
onEditingFinished: fieldsListView.model.setData(
fieldsListView.model.index(index,
1), text)
}
Kirigami.Icon {
source: "handle-left"
width: Kirigami.Units.iconSizes.smallMedium
height: Kirigami.Units.iconSizes.smallMedium
Layout.fillHeight: true
RowLayout {
anchors.fill: parent
Controls.Label {
Layout.fillWidth: true
Layout.fillHeight: true
text: {
if (fieldRow.isLastRow) {
return "click to add new field"
}
var pieces = []
if (model.key) {
pieces.push(model.key)
}
if (model.value) {
pieces.push(model.value)
}
return pieces.join(": ")
}
color: fieldRow.isLastRow ? "gray" : palette.text
}
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: fieldContextMenu.popup()
onClicked: {
if (mouse.button === Qt.RightButton) {
fieldContextMenu.popup()
return
}
fieldDialog.init(model, index)
fieldDialog.open()
}
onPressAndHold: fieldContextMenu.popup()
}
}
Controls.Menu {
id: fieldContextMenu
Controls.MenuItem {
icon.name: model.isPassword ? "password-show-off" : "password-show-on"
text: model.isPassword ? qsTr("Mark as normal field") : qsTr(
"Mark as password field")
onClicked: fieldsListView.model.setData(
fieldsListView.model.index(index, 0),
model.isPassword ? 0 : 1, 0x0100 + 1)
}
Controls.MenuItem {
icon.name: "edit-copy"
text: model.isPassword ? qsTr("Copy password") : qsTr(
"Copy value")
onClicked: showPassiveNotification(
nativeInterface.copyToClipboard(
model.actualValue) ? qsTr("Copied") : qsTr(
"Unable to access clipboard"))
}
Controls.MenuItem {
icon.name: "edit-delete"
text: qsTr("Delete field")
onClicked: fieldsListView.model.removeRows(index, 1)
}
Controls.MenuItem {
icon.name: "list-add"
text: qsTr("Insert empty field after this")
onClicked: fieldsListView.model.insertRows(index + 1, 1)
Controls.Menu {
id: fieldContextMenu
Controls.MenuItem {
icon.name: model.isPassword ? "password-show-off" : "password-show-on"
text: model.isPassword ? qsTr("Mark as normal field") : qsTr(
"Mark as password field")
onClicked: fieldsListView.model.setData(
fieldsListView.model.index(index,
0),
model.isPassword ? 0 : 1, 0x0100 + 1)
}
Controls.MenuItem {
icon.name: "edit-copy"
text: model.isPassword ? qsTr("Copy password") : qsTr(
"Copy value")
onClicked: showPassiveNotification(
nativeInterface.copyToClipboard(
model.actualValue) ? qsTr("Copied") : qsTr(
"Unable to access clipboard"))
}
Controls.MenuItem {
icon.name: "edit-delete"
text: qsTr("Delete field")
onClicked: fieldsListView.model.removeRows(index, 1)
}
Controls.MenuItem {
icon.name: "list-add"
text: qsTr("Insert empty field after this")
onClicked: fieldsListView.model.insertRows(
index + 1, 1)
}
}
}
}
actions: [
Kirigami.Action {
iconName: model.isPassword ? "password-show-off" : "password-show-on"
text: model.isPassword ? qsTr(
"Mark as normal field") : qsTr(
"Mark as password field")
onTriggered: fieldsListView.model.setData(
fieldsListView.model.index(index, 0),
model.isPassword ? 0 : 1, 0x0100 + 1)
visible: !fieldRow.isLastRow
},
Kirigami.Action {
iconName: "edit-copy"
text: model.isPassword ? qsTr("Copy password") : qsTr(
"Copy value")
onTriggered: showPassiveNotification(
nativeInterface.copyToClipboard(
model.actualValue) ? qsTr("Copied") : qsTr(
"Unable to access clipboard"))
shortcut: StandardKey.Cut
visible: !fieldRow.isLastRow
},
Kirigami.Action {
iconName: "edit-delete"
text: qsTr("Delete field")
onTriggered: fieldsListView.model.removeRows(index, 1)
shortcut: StandardKey.Delete
visible: !fieldRow.isLastRow
},
Kirigami.Action {
iconName: "list-add"
text: qsTr("Insert empty field after this")
enabled: !nativeInterface.hasEntryFilter
onTriggered: fieldsListView.model.insertRows(index + 1, 1)
visible: !fieldRow.isLastRow
}
]
}
}