[app] Fixup plugin config pages

Depending on the content we want to use Page or ScrollablePage

The runcommand config should be a scrollablepage, but isn't right now

The code even (incompletely) works around that

To address this make the individual config files add their page instead of an additional wrapper page
This commit is contained in:
Nicolas Fella 2024-06-06 01:13:59 +02:00
parent 01a605652d
commit 6366ceb530
9 changed files with 278 additions and 284 deletions

View file

@ -40,7 +40,6 @@ ecm_target_qml_sources(kdeconnect-app SOURCES
qml/volume.qml
qml/MprisSlider.qml
qml/PluginSettings.qml
qml/PluginInfoPage.qml
qml/Settings.qml
)

View file

@ -1,31 +0,0 @@
/*
* SPDX-FileCopyrightText: 2019 Nicolas Fella <nicolas.fella@gmx.de>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
import QtQuick
import org.kde.kirigami as Kirigami
Kirigami.Page {
id: root
property string configFile
property string device
actions: loader.item && loader.item.action ? [loader.item.action] : []
onConfigFileChanged: loader.setSource(configFile, {
device: root.device
})
Loader {
anchors.fill: parent
id: loader
Component.onCompleted: setSource(configFile, {
device: root.device
})
}
}

View file

@ -63,17 +63,14 @@ Kirigami.ScrollablePage {
// https://bugreports.qt.io/browse/QTBUG-123123
Accessible.name: i18nd("kdeconnect-app", "Configure plugin")
onTriggered: {
if (pageStack.lastItem.toString().startsWith("PluginInfoPage")) {
pageStack.lastItem.configFile = configSource;
pageStack.lastItem.title = name;
pageStack.goForward();
} else {
pageStack.push(Qt.resolvedUrl("PluginInfoPage.qml"), {
title: name,
configFile: configSource,
device: root.device,
});
if (!pageStack.lastItem.toString().startsWith("PluginSettings")) {
pageStack.pop()
}
pageStack.push(configSource, {
title: name,
device: root.device,
});
}
}
]

View file

@ -10,31 +10,36 @@ import QtQuick.Layouts 1.15
import org.kde.kirigami 2.20 as Kirigami
import org.kde.kdeconnect 1.0
Kirigami.FormLayout {
Kirigami.Page {
property string device
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_clipboard"
}
Kirigami.FormLayout {
Component.onCompleted: {
autoShare.checked = config.getBool("autoShare", config.getBool("sendUnknown", true))
password.checked = config.getBool("sendPassword", true)
}
anchors.fill: parent
QQC2.CheckBox {
id: autoShare
text: i18n("Automatically share the clipboard from this device")
onClicked: config.set("autoShare", checked)
}
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_clipboard"
}
QQC2.CheckBox {
id: password
text: i18n("Including passwords (as marked by password managers)")
onClicked: config.set("sendPassword", checked)
}
Component.onCompleted: {
autoShare.checked = config.getBool("autoShare", config.getBool("sendUnknown", true))
password.checked = config.getBool("sendPassword", true)
}
QQC2.CheckBox {
id: autoShare
text: i18n("Automatically share the clipboard from this device")
onClicked: config.set("autoShare", checked)
}
QQC2.CheckBox {
id: password
text: i18n("Including passwords (as marked by password managers)")
onClicked: config.set("sendPassword", checked)
}
}
}

View file

@ -11,46 +11,52 @@ import org.kde.kirigami 2.20 as Kirigami
import Qt.labs.platform 1.1
import org.kde.kdeconnect 1.0
Kirigami.FormLayout {
Kirigami.Page {
property string device
property var action: Kirigami.Action {
icon.name: "dialog-ok"
text: i18n("Apply")
onTriggered: config.set("ringtone", path.text)
}
FileDialog {
id: fileDialog
currentFile: path.text
onAccepted: {
path.text = currentFile.toString().replace("file://", "")
actions: [
Kirigami.Action {
icon.name: "dialog-ok"
text: i18n("Apply")
onTriggered: config.set("ringtone", path.text)
}
}
]
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_findthisdevice"
Kirigami.FormLayout {
onConfigChanged: {
path.text = getString("ringtone", StandardPaths.writableLocation(StandardPaths.DownloadsLocation).toString().replace("file://", ""))
}
}
anchors.fill: parent
RowLayout {
Kirigami.FormData.label: i18n("Sound to play:")
FileDialog {
id: fileDialog
currentFile: path.text
QQC2.TextField {
id: path
onAccepted: {
path.text = currentFile.toString().replace("file://", "")
}
}
QQC2.Button {
icon.name: "document-open"
onClicked: fileDialog.open()
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_findthisdevice"
onConfigChanged: {
path.text = getString("ringtone", StandardPaths.writableLocation(StandardPaths.DownloadsLocation).toString().replace("file://", ""))
}
}
RowLayout {
Kirigami.FormData.label: i18n("Sound to play:")
QQC2.TextField {
id: path
}
QQC2.Button {
icon.name: "document-open"
onClicked: fileDialog.open()
}
}
}
}

View file

@ -10,48 +10,54 @@ import QtQuick.Layouts 1.15
import org.kde.kirigami 2.20 as Kirigami
import org.kde.kdeconnect 1.0
Kirigami.FormLayout {
Kirigami.Page {
property string device
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_pausemusic"
}
Kirigami.FormLayout {
Component.onCompleted: {
talking.checked = config.getBool("conditionTalking", false)
mute.checked = config.getBool("actionMute", false)
pause.checked = config.getBool("actionPause", true)
resume.checked = config.getBool("actionResume", true)
}
anchors.fill: parent
QQC2.RadioButton {
text: i18n("Pause as soon as phone rings")
checked: !talking.checked
}
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_pausemusic"
}
QQC2.RadioButton {
id: talking
onCheckedChanged: config.set("conditionTalking", checked)
text: i18n("Pause only while talking")
}
Component.onCompleted: {
talking.checked = config.getBool("conditionTalking", false)
mute.checked = config.getBool("actionMute", false)
pause.checked = config.getBool("actionPause", true)
resume.checked = config.getBool("actionResume", true)
}
QQC2.CheckBox {
id: pause
text: i18n("Pause media players")
onClicked: config.set("actionPause", checked)
}
QQC2.RadioButton {
text: i18n("Pause as soon as phone rings")
checked: !talking.checked
}
QQC2.CheckBox {
id: mute
text: i18n("Mute system sound")
onClicked: config.set("actionMute", checked)
}
QQC2.RadioButton {
id: talking
onCheckedChanged: config.set("conditionTalking", checked)
text: i18n("Pause only while talking")
}
QQC2.CheckBox {
id: resume
text: i18n("Resume automatically when call ends")
onClicked: config.set("actionResume", checked)
QQC2.CheckBox {
id: pause
text: i18n("Pause media players")
onClicked: config.set("actionPause", checked)
}
QQC2.CheckBox {
id: mute
text: i18n("Mute system sound")
onClicked: config.set("actionMute", checked)
}
QQC2.CheckBox {
id: resume
text: i18n("Resume automatically when call ends")
onClicked: config.set("actionResume", checked)
}
}
}

View file

@ -9,112 +9,112 @@ import QtQuick.Controls 2.15 as QQC2
import org.kde.kirigami 2.20 as Kirigami
import org.kde.kdeconnect 1.0
ListView {
id: view
Component.onCompleted: {
root.leftPadding = 0
root.rightPadding = 0
root.topPadding = 0
root.bottomPadding = 0
}
Kirigami.ScrollablePage {
id: root
property string device
property var action: Kirigami.Action {
icon.name: "list-add"
text: i18n("Add command")
onTriggered: addDialog.open()
}
actions: [
Kirigami.Action {
icon.name: "list-add"
text: i18n("Add command")
onTriggered: addDialog.open()
}
]
model: CommandsModel {
id: commandModel
deviceId: device
}
ListView {
id: view
delegate: Kirigami.SwipeListItem {
width: parent.width
enabled: true
contentItem: QQC2.Label {
text: i18n("%1 <br> <i>%2</i>", name, command)
model: CommandsModel {
id: commandModel
deviceId: device
}
actions: Kirigami.Action {
text: i18n("Delete")
icon.name: "delete"
onTriggered: commandModel.removeCommand(index)
delegate: Kirigami.SwipeListItem {
width: parent.width
enabled: true
contentItem: QQC2.Label {
text: i18n("%1 <br> <i>%2</i>", name, command)
}
actions: Kirigami.Action {
text: i18n("Delete")
icon.name: "delete"
onTriggered: commandModel.removeCommand(index)
}
}
}
Kirigami.PlaceholderMessage {
icon.name: 'utilities-terminal'
anchors.centerIn: parent
visible: view.count === 0
width: parent.width - Kirigami.Units.gridUnit * 4
text: i18n("No Commands")
explanation: i18n("Add commands to run them remotely from other devices")
helpfulAction: view.action
}
Kirigami.PlaceholderMessage {
icon.name: 'utilities-terminal'
anchors.centerIn: parent
visible: view.count === 0
width: parent.width - Kirigami.Units.gridUnit * 4
text: i18n("No Commands")
explanation: i18n("Add commands to run them remotely from other devices")
helpfulAction: root.actions[0]
}
QQC2.Dialog {
id: addDialog
title: "Add command"
QQC2.Dialog {
id: addDialog
title: "Add command"
standardButtons: QQC2.Dialog.Save | QQC2.Dialog.Cancel
standardButtons: QQC2.Dialog.Save | QQC2.Dialog.Cancel
Kirigami.FormLayout {
QQC2.TextField {
id: nameField
Kirigami.FormData.label: i18n("Name:")
}
QQC2.TextField {
id: commandField
Kirigami.FormData.label: i18n("Command:")
}
QQC2.ComboBox {
Kirigami.FormData.label: i18n("Sample commands:")
textRole: "name"
model: ListModel {
id: sampleCommands
ListElement {
name: "Sample command"
command: ""
}
ListElement {
name: "Suspend"
command: "systemctl suspend"
}
ListElement {
name: "Maximum Brightness"
command: "qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement/Actions/BrightnessControl org.kde.Solid.PowerManagement.Actions.BrightnessControl.setBrightness `qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement/Actions/BrightnessControl org.kde.Solid.PowerManagement.Actions.BrightnessControl.brightnessMax`"
}
ListElement {
name: "Lock Screen"
command: "loginctl lock-session"
}
ListElement {
name: "Unlock Screen"
command: "loginctl unlock-session"
}
ListElement {
name: "Close All Vaults"
command: "qdbus org.kde.kded5 /modules/plasmavault closeAllVaults"
}
ListElement {
name: "Forcefully Close All Vaults"
command: "qdbus org.kde.kded5 /modules/plasmavault forceCloseAllVaults"
}
Kirigami.FormLayout {
QQC2.TextField {
id: nameField
Kirigami.FormData.label: i18n("Name:")
}
onActivated: {
if (index > 0) {
nameField.text = sampleCommands.get(index).name
commandField.text = sampleCommands.get(index).command
QQC2.TextField {
id: commandField
Kirigami.FormData.label: i18n("Command:")
}
QQC2.ComboBox {
Kirigami.FormData.label: i18n("Sample commands:")
textRole: "name"
model: ListModel {
id: sampleCommands
ListElement {
name: "Sample command"
command: ""
}
ListElement {
name: "Suspend"
command: "systemctl suspend"
}
ListElement {
name: "Maximum Brightness"
command: "qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement/Actions/BrightnessControl org.kde.Solid.PowerManagement.Actions.BrightnessControl.setBrightness `qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement/Actions/BrightnessControl org.kde.Solid.PowerManagement.Actions.BrightnessControl.brightnessMax`"
}
ListElement {
name: "Lock Screen"
command: "loginctl lock-session"
}
ListElement {
name: "Unlock Screen"
command: "loginctl unlock-session"
}
ListElement {
name: "Close All Vaults"
command: "qdbus org.kde.kded5 /modules/plasmavault closeAllVaults"
}
ListElement {
name: "Forcefully Close All Vaults"
command: "qdbus org.kde.kded5 /modules/plasmavault forceCloseAllVaults"
}
}
onActivated: {
if (index > 0) {
nameField.text = sampleCommands.get(index).name
commandField.text = sampleCommands.get(index).command
}
}
}
}
}
onAccepted: commandModel.addCommand(nameField.text, commandField.text)
onAccepted: commandModel.addCommand(nameField.text, commandField.text)
}
}
}

View file

@ -10,47 +10,52 @@ import QtQuick.Layouts 1.1
import org.kde.kirigami 2.5 as Kirigami
import org.kde.kdeconnect 1.0
Kirigami.FormLayout {
Kirigami.Page {
property string device
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_sendnotifications"
}
Kirigami.FormLayout {
Component.onCompleted: {
persistent.checked = config.getBool("generalPersistent", false)
includeBody.checked = config.getBool("generalIncludeBody", true)
includeIcon.checked = config.getBool("generalSynchronizeIcons", true)
urgency.value = config.getInt("generalUrgency", 0)
}
anchors.fill: parent
CheckBox {
id: persistent
text: i18n("Persistent notifications only")
onClicked: config.set("generalPersistent", checked)
}
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_sendnotifications"
}
CheckBox {
id: includeBody
text: i18n("Include body")
onClicked: config.set("generalIncludeBody", checked)
}
Component.onCompleted: {
persistent.checked = config.getBool("generalPersistent", false)
includeBody.checked = config.getBool("generalIncludeBody", true)
includeIcon.checked = config.getBool("generalSynchronizeIcons", true)
urgency.value = config.getInt("generalUrgency", 0)
}
CheckBox {
id: includeIcon
text: i18n("Include icon")
onClicked: config.set("generalSynchronizeIcons", checked)
}
CheckBox {
id: persistent
text: i18n("Persistent notifications only")
onClicked: config.set("generalPersistent", checked)
}
SpinBox {
id: urgency
Kirigami.FormData.label: i18n("Minimum urgency level:")
from: 0
to: 2
onValueModified: config.set("generalUrgency", value)
}
CheckBox {
id: includeBody
text: i18n("Include body")
onClicked: config.set("generalIncludeBody", checked)
}
CheckBox {
id: includeIcon
text: i18n("Include icon")
onClicked: config.set("generalSynchronizeIcons", checked)
}
SpinBox {
id: urgency
Kirigami.FormData.label: i18n("Minimum urgency level:")
from: 0
to: 2
onValueModified: config.set("generalUrgency", value)
}
}
}

View file

@ -11,49 +11,56 @@ import org.kde.kirigami 2.20 as Kirigami
import Qt.labs.platform 1.1
import org.kde.kdeconnect 1.0
Kirigami.FormLayout {
Kirigami.Page {
property string device
property var action: Kirigami.Action {
icon.name: "dialog-ok"
text: i18n("Apply")
onTriggered: config.set("incoming_path", path.text)
}
FolderDialog {
id: folderDialog
currentFolder: path.text
onAccepted: {
path.text = currentFolder.toString().replace("file://", "")
actions: [
Kirigami.Action {
icon.name: "dialog-ok"
text: i18n("Apply")
onTriggered: config.set("incoming_path", path.text)
}
}
]
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_share"
Kirigami.FormLayout {
onConfigChanged: {
path.text = getString("incoming_path", StandardPaths.writableLocation(StandardPaths.DownloadsLocation).toString().replace("file://", ""))
}
}
anchors.fill: parent
RowLayout {
Kirigami.FormData.label: i18n("Save files in:")
FolderDialog {
id: folderDialog
currentFolder: path.text
QQC2.TextField {
id: path
onAccepted: {
path.text = currentFolder.toString().replace("file://", "")
}
}
QQC2.Button {
icon.name: "document-open"
onClicked: folderDialog.open()
}
}
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_share"
QQC2.Label {
text: i18n("%1 in the path will be replaced with the specific device name", "%1")
onConfigChanged: {
path.text = getString("incoming_path", StandardPaths.writableLocation(StandardPaths.DownloadsLocation).toString().replace("file://", ""))
}
}
RowLayout {
Kirigami.FormData.label: i18n("Save files in:")
QQC2.TextField {
id: path
}
QQC2.Button {
icon.name: "document-open"
onClicked: folderDialog.open()
}
}
QQC2.Label {
text: i18n("%1 in the path will be replaced with the specific device name", "%1")
}
}
}