nymea-app/guh-control/ui/magic/SelectActionPage.qml

372 lines
12 KiB
QML

import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.1
import Guh 1.0
import "../components"
import "../paramdelegates"
Page {
id: root
// input
property string text
// output
property var actions: []
signal complete();
header: GuhHeader {
text: "Select action"
onBackPressed: pageStack.pop()
}
ListModel {
id: actionModel
ListElement { interfaceName: "light"; text: "Switch lights..."; identifier: "switchLights" }
ListElement { interfaceName: "mediacontroller"; text: "Control media playback..."; identifier: "controlMedia" }
ListElement { interfaceName: "extendedvolumecontroller"; text: "Mute media playback..."; identifier: "muteMedia" }
ListElement { interfaceName: "notifications"; text: "Notify me..."; identifier: "notify" }
ListElement { interfaceName: ""; text: "Manually configure an action..."; identifier: "manualAction" }
}
DevicesProxy {
id: ifaceFilterModel
devices: Engine.deviceManager.devices
}
Component.onCompleted: {
actualModel.clear()
for (var i = 0; i < actionModel.count; i++) {
ifaceFilterModel.filterInterface = actionModel.get(i).interfaceName;
if (actionModel.get(i).interfaceName === "" || ifaceFilterModel.count > 0) {
actualModel.append(actionModel.get(i))
}
}
}
function actionSelected(identifier) {
switch (identifier) {
case "switchLights":
pageStack.push(switchLightsCompoent)
break;
case "controlMedia":
break;
case "muteMedia":
break;
case "manualAction":
pageStack.push(selectDeviceComponent)
break;
case "notify":
pageStack.push(notificationActionComponent)
}
}
ColumnLayout {
anchors.fill: parent
Label {
Layout.fillWidth: true
Layout.margins: app.margins
text: root.text
font.pixelSize: app.largeFont
}
ListView {
Layout.fillWidth: true
Layout.fillHeight: true
model: ListModel {
id: actualModel
}
delegate: ItemDelegate {
width: parent.width
text: model.text
onClicked: {
root.actionSelected(model.identifier)
}
}
}
}
Component {
id: selectDeviceComponent
Page {
header: GuhHeader {
text: "Select device"
onBackPressed: pageStack.pop()
}
ColumnLayout {
anchors.fill: parent
ListView {
Layout.fillHeight: true
Layout.fillWidth: true
model: Engine.deviceManager.devices
delegate: ItemDelegate {
width: parent.width
Label {
anchors.fill: parent
anchors.margins: app.margins
text: model.name
verticalAlignment: Text.AlignVCenter
}
onClicked: {
var device = Engine.deviceManager.devices.get(index)
pageStack.push(selectDeviceActionComponent, {device: device})
}
}
}
}
}
}
Component {
id: selectDeviceActionComponent
Page {
id: page
property var device
readonly property var deviceClass: Engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId)
header: GuhHeader {
text: "Select action"
onBackPressed: pageStack.pop()
}
ColumnLayout {
anchors.fill: parent
ListView {
Layout.fillHeight: true
Layout.fillWidth: true
model: page.deviceClass.actionTypes
delegate: ItemDelegate {
width: parent.width
Label {
anchors.fill: parent
anchors.margins: app.margins
text: model.name
verticalAlignment: Text.AlignVCenter
}
onClicked: {
var actionType = page.deviceClass.actionTypes.get(index)
if (page.deviceClass.actionTypes.get(index).paramTypes.count == 0) {
// We're all set.
var action = {}
action["deviceId"] = page.device.id
action["actionTypeId"] = actionType.id
root.actions.push(action)
root.complete();
} else {
// need to fill in params
pageStack.push(selectDeviceActionParamComponent, {device: page.device, actionType: actionType})
}
}
}
}
}
}
}
Component {
id: selectDeviceActionParamComponent
Page {
id: page
property var device
property var actionType
header: GuhHeader {
text: "params"
onBackPressed: pageStack.pop()
}
ColumnLayout {
anchors.fill: parent
Repeater {
id: delegateRepeater
model: page.actionType.paramTypes
delegate: ParamDelegate {
paramType: page.actionType.paramTypes.get(index)
value: paramType.defaultValue
}
}
Item {
Layout.fillWidth: true
Layout.fillHeight: true
}
Button {
text: "OK"
Layout.fillWidth: true
Layout.margins: app.margins
onClicked: {
var params = [];
for (var i = 0; i < delegateRepeater.count; i++) {
var paramDelegate = delegateRepeater.itemAt(i);
var param = {}
param["paramTypeId"] = paramDelegate.paramType.id
param["value"] = paramDelegate.value
params.push(param)
}
var action = {};
action["deviceId"] = page.device.id
action["actionTypeId"] = page.actionType.id
action["ruleActionParams"] = params
root.actions.push(action)
root.complete()
}
}
}
}
}
Component {
id: switchLightsCompoent
Page {
header: GuhHeader {
text: "Switch lights"
onBackPressed: pageStack.pop()
}
ColumnLayout {
anchors.fill: parent
SwitchDelegate {
id: switchDelegate
Layout.fillWidth: true
text: "Set selected lights power to"
position: 0
}
ThinDivider {}
Flickable {
Layout.fillHeight: true
Layout.fillWidth: true
interactive: contentHeight > height
clip: true
Column {
width: parent.width
Repeater {
id: lightsRepeater
model: DevicesProxy {
id: lightsModel
devices: Engine.deviceManager.devices
filterInterface: "light"
}
delegate: CheckDelegate {
width: parent.width
text: model.name
}
}
}
}
Button {
Layout.fillWidth: true
Layout.margins: app.margins
text: "OK"
onClicked: {
for (var i = 0; i < lightsRepeater.count; i++) {
if (lightsRepeater.itemAt(i).checkState === Qt.Unchecked) {
continue;
}
var device = lightsModel.get(i);
var deviceClass = Engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId)
var action = {}
action["deviceId"] = device.id
var actionType = deviceClass.actionTypes.findByName("power")
action["actionTypeId"] = actionType.id
var params = [];
var paramType = actionType.paramTypes.getParamType("power");
var param = {}
param["paramTypeId"] = paramType.id
param["value"] = switchDelegate.position === 1 ? true : false;
params.push(param)
action["ruleActionParams"] = params
root.actions.push(action)
}
root.complete();
}
}
}
}
}
Component {
id: notificationActionComponent
Page {
header: GuhHeader {
text: "Send notification"
onBackPressed: pageStack.pop()
}
ColumnLayout {
anchors.fill: parent
spacing: app.margins
Label {
Layout.fillWidth: true
text: "Notification text"
Layout.topMargin: app.margins
Layout.leftMargin: app.margins
Layout.rightMargin: app.margins
}
TextField {
id: notificationTextField
Layout.fillWidth: true
Layout.leftMargin: app.margins
Layout.rightMargin: app.margins
}
ThinDivider {}
Flickable {
Layout.fillHeight: true
Layout.fillWidth: true
interactive: contentHeight > height
clip: true
Column {
width: parent.width
Repeater {
id: notificationsRepeater
model: DevicesProxy {
id: notificationsModel
devices: Engine.deviceManager.devices
filterInterface: "notifications"
}
delegate: CheckDelegate {
width: parent.width
text: model.name
checked: true
}
}
}
}
Button {
Layout.fillWidth: true
Layout.margins: app.margins
text: "OK"
onClicked: {
var action = {}
action["interface"] = "notifications";
action["interfaceAction"] = "notify";
action["ruleActionParams"] = [];
var ruleActionParam = {};
ruleActionParam["paramName"] = "title";
ruleActionParam["value"] = notificationTextField.text
action["ruleActionParams"].push(ruleActionParam)
root.actions.push(action)
root.complete()
}
}
}
}
}
}