kdeconnect-app: Remove PluginInfoPage wrapper

Base the config page on Kirigami.Page and create them directly.
This commit is contained in:
Carl Schwan 2024-10-05 22:53:32 +02:00
parent 239e53a469
commit e04072c83e
9 changed files with 278 additions and 306 deletions

View file

@ -40,7 +40,6 @@ ecm_target_qml_sources(kdeconnect-app SOURCES
qml/volume.qml qml/volume.qml
qml/MprisSlider.qml qml/MprisSlider.qml
qml/PluginSettings.qml qml/PluginSettings.qml
qml/PluginInfoPage.qml
qml/Settings.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,10 @@ Kirigami.ScrollablePage {
// https://bugreports.qt.io/browse/QTBUG-123123 // https://bugreports.qt.io/browse/QTBUG-123123
Accessible.name: i18nd("kdeconnect-app", "Configure plugin") Accessible.name: i18nd("kdeconnect-app", "Configure plugin")
onTriggered: { onTriggered: {
if (pageStack.lastItem.toString().startsWith("PluginInfoPage")) { pageStack.push(configSource, {
pageStack.lastItem.configFile = configSource; title: name,
pageStack.lastItem.title = name; device: root.device,
pageStack.goForward(); });
} else {
pageStack.push(Qt.resolvedUrl("PluginInfoPage.qml"), {
title: name,
configFile: configSource,
device: root.device,
});
}
} }
} }
] ]

View file

@ -10,31 +10,33 @@ import QtQuick.Layouts 1.15
import org.kde.kirigami 2.20 as Kirigami import org.kde.kirigami 2.20 as Kirigami
import org.kde.kdeconnect 1.0 import org.kde.kdeconnect 1.0
Kirigami.FormLayout { Kirigami.ScrollablePage {
id: root
property string device property string device
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_clipboard"
}
Component.onCompleted: { Component.onCompleted: {
autoShare.checked = config.getBool("autoShare", config.getBool("sendUnknown", true)) autoShare.checked = config.getBool("autoShare", config.getBool("sendUnknown", true))
password.checked = config.getBool("sendPassword", true) password.checked = config.getBool("sendPassword", true)
} }
QQC2.CheckBox { Kirigami.FormLayout {
id: autoShare KdeConnectPluginConfig {
text: i18n("Automatically share the clipboard from this device") id: config
onClicked: config.set("autoShare", checked) deviceId: device
} pluginName: "kdeconnect_clipboard"
}
QQC2.CheckBox { QQC2.CheckBox {
id: password id: autoShare
text: i18n("Including passwords (as marked by password managers)") text: i18n("Automatically share the clipboard from this device")
onClicked: config.set("sendPassword", checked) 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,48 @@ import org.kde.kirigami 2.20 as Kirigami
import Qt.labs.platform 1.1 import Qt.labs.platform 1.1
import org.kde.kdeconnect 1.0 import org.kde.kdeconnect 1.0
Kirigami.FormLayout { Kirigami.ScrollablePage {
id: root
property string device property string device
property var action: Kirigami.Action { actions: Kirigami.Action {
icon.name: "dialog-ok" icon.name: "dialog-ok"
text: i18n("Apply") text: i18n("Apply")
onTriggered: config.set("ringtone", path.text) onTriggered: config.set("ringtone", path.text)
} }
FileDialog { Kirigami.FormLayout {
id: fileDialog FileDialog {
currentFile: path.text id: fileDialog
currentFile: path.text
onAccepted: { onAccepted: {
path.text = currentFile.toString().replace("file://", "") path.text = currentFile.toString().replace("file://", "")
} }
}
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 { KdeConnectPluginConfig {
icon.name: "document-open" id: config
onClicked: fileDialog.open() 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,51 @@ import QtQuick.Layouts 1.15
import org.kde.kirigami 2.20 as Kirigami import org.kde.kirigami 2.20 as Kirigami
import org.kde.kdeconnect 1.0 import org.kde.kdeconnect 1.0
Kirigami.FormLayout { Kirigami.ScrollablePage {
property string device property string device
KdeConnectPluginConfig { Kirigami.FormLayout {
id: config
deviceId: device
pluginName: "kdeconnect_pausemusic"
}
Component.onCompleted: { KdeConnectPluginConfig {
talking.checked = config.getBool("conditionTalking", false) id: config
mute.checked = config.getBool("actionMute", false) deviceId: device
pause.checked = config.getBool("actionPause", true) pluginName: "kdeconnect_pausemusic"
resume.checked = config.getBool("actionResume", true) }
}
QQC2.RadioButton { Component.onCompleted: {
text: i18n("Pause as soon as phone rings") talking.checked = config.getBool("conditionTalking", false)
checked: !talking.checked mute.checked = config.getBool("actionMute", false)
} pause.checked = config.getBool("actionPause", true)
resume.checked = config.getBool("actionResume", true)
}
QQC2.RadioButton { QQC2.RadioButton {
id: talking text: i18n("Pause as soon as phone rings")
onCheckedChanged: config.set("conditionTalking", checked) checked: !talking.checked
text: i18n("Pause only while talking") }
}
QQC2.CheckBox { QQC2.RadioButton {
id: pause id: talking
text: i18n("Pause media players") onCheckedChanged: config.set("conditionTalking", checked)
onClicked: config.set("actionPause", checked) text: i18n("Pause only while talking")
} }
QQC2.CheckBox { QQC2.CheckBox {
id: mute id: pause
text: i18n("Mute system sound") text: i18n("Pause media players")
onClicked: config.set("actionMute", checked) onClicked: config.set("actionPause", checked)
} }
QQC2.CheckBox { QQC2.CheckBox {
id: resume id: mute
text: i18n("Resume automatically when call ends") text: i18n("Mute system sound")
onClicked: config.set("actionResume", checked) onClicked: config.set("actionMute", checked)
}
QQC2.CheckBox {
id: resume
text: i18n("Resume automatically when call ends")
onClicked: config.set("actionResume", checked)
}
} }
} }

View file

@ -10,135 +10,134 @@ import QtQuick.Controls 2.15 as QQC2
import org.kde.kirigami 2.20 as Kirigami import org.kde.kirigami 2.20 as Kirigami
import org.kde.kdeconnect 1.0 import org.kde.kdeconnect 1.0
ListView { Kirigami.ScrollablePage {
id: view id: root
Component.onCompleted: {
root.leftPadding = 0
root.rightPadding = 0
root.topPadding = 0
root.bottomPadding = 0
}
property string device property string device
property var action: Kirigami.Action { actions: Kirigami.Action {
id: addCommandDialogAction
icon.name: "list-add" icon.name: "list-add"
text: i18n("Add Command…") text: i18n("Add Command…")
onTriggered: addDialog.open() onTriggered: addDialog.open()
} }
model: CommandsModel { ListView {
id: commandModel id: view
deviceId: device
}
delegate: Kirigami.SwipeListItem { model: CommandsModel {
width: parent.width id: commandModel
enabled: true deviceId: device
contentItem: ColumnLayout {
QQC2.Label {
text: name
Layout.fillWidth: true
elide: Text.ElideRight
}
QQC2.Label {
text: command
font.italic: true
Layout.fillWidth: true
elide: Text.ElideRight
}
} }
actions: Kirigami.Action { delegate: Kirigami.SwipeListItem {
text: i18n("Delete") width: parent.width
icon.name: "delete" enabled: true
onTriggered: commandModel.removeCommand(index)
}
}
Kirigami.PlaceholderMessage { contentItem: ColumnLayout {
icon.name: 'utilities-terminal' QQC2.Label {
anchors.centerIn: parent text: name
visible: view.count === 0 Layout.fillWidth: true
width: parent.width - Kirigami.Units.gridUnit * 4 elide: Text.ElideRight
text: i18nc("@info", "No commands configured")
explanation: i18n("@info", "Add commands to run them remotely from other devices")
helpfulAction: view.action
}
Kirigami.Dialog {
id: addDialog
title: i18nc("@title:window", "Add Command")
padding: Kirigami.Units.largeSpacing
preferredWidth: Kirigami.Units.gridUnit * 20
property Kirigami.Action addCommandAction: Kirigami.Action {
text: i18nc("@action:button", "Add")
icon.name: "list-add"
enabled: commandField.length > 0
onTriggered: {
commandModel.addCommand(nameField.text, commandField.text)
addDialog.close();
}
Component.onCompleted: {
// TODO: can be set directly once Qt 6.8 is required
Accessible.Name = i18nc("@action:button accessible", "Add command")
}
}
standardButtons: Kirigami.Dialog.Cancel
customFooterActions: [addCommandAction]
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"
}
} }
onActivated: { QQC2.Label {
if (index > 0) { text: command
nameField.text = sampleCommands.get(index).name font.italic: true
commandField.text = sampleCommands.get(index).command Layout.fillWidth: true
elide: Text.ElideRight
}
}
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: i18nc("@info", "No commands configured")
explanation: i18n("@info", "Add commands to run them remotely from other devices")
helpfulAction: addCommandDialogAction
}
Kirigami.Dialog {
id: addDialog
title: i18nc("@title:window", "Add Command")
padding: Kirigami.Units.largeSpacing
preferredWidth: Kirigami.Units.gridUnit * 20
property Kirigami.Action addCommandAction: Kirigami.Action {
text: i18nc("@action:button", "Add")
icon.name: "list-add"
enabled: commandField.length > 0
onTriggered: {
commandModel.addCommand(nameField.text, commandField.text)
addDialog.close();
}
Component.onCompleted: {
// TODO: can be set directly once Qt 6.8 is required
Accessible.Name = i18nc("@action:button accessible", "Add command")
}
}
standardButtons: Kirigami.Dialog.Cancel
customFooterActions: [addCommandAction]
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"
}
}
onActivated: {
if (index > 0) {
nameField.text = sampleCommands.get(index).name
commandField.text = sampleCommands.get(index).command
}
} }
} }
} }

View file

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

View file

@ -11,49 +11,52 @@ import org.kde.kirigami 2.20 as Kirigami
import Qt.labs.platform 1.1 import Qt.labs.platform 1.1
import org.kde.kdeconnect 1.0 import org.kde.kdeconnect 1.0
Kirigami.FormLayout { Kirigami.ScrollablePage {
id: root
property string device property string device
property var action: Kirigami.Action { actions: Kirigami.Action {
icon.name: "dialog-ok" icon.name: "dialog-ok"
text: i18n("Apply") text: i18n("Apply")
onTriggered: config.set("incoming_path", path.text) onTriggered: config.set("incoming_path", path.text)
} }
FolderDialog { Kirigami.FormLayout {
id: folderDialog FolderDialog {
currentFolder: path.text id: folderDialog
currentFolder: path.text
onAccepted: { onAccepted: {
path.text = currentFolder.toString().replace("file://", "") path.text = currentFolder.toString().replace("file://", "")
} }
}
KdeConnectPluginConfig {
id: config
deviceId: device
pluginName: "kdeconnect_share"
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 { KdeConnectPluginConfig {
icon.name: "document-open" id: config
onClicked: folderDialog.open() deviceId: device
} pluginName: "kdeconnect_share"
}
QQC2.Label { onConfigChanged: {
text: i18n("%1 in the path will be replaced with the specific device name", "%1") 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")
}
} }
} }