From 62b2a33145ef8dbcb413f1879cd241a370659daf Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 16 Jul 2019 00:03:33 +0200 Subject: [PATCH] browseritemactions --- libnymea-app-core/devicemanager.cpp | 3 +- libnymea-app-core/devicemanager.h | 2 +- nymea-app/resources.qrc | 1 + .../ui/components/BrowserContextMenu.qml | 93 +++++++++++++++++++ .../ui/devicepages/DeviceBrowserPage.qml | 35 +------ nymea-app/ui/devicepages/MediaDevicePage.qml | 41 +++++--- 6 files changed, 132 insertions(+), 43 deletions(-) create mode 100644 nymea-app/ui/components/BrowserContextMenu.qml diff --git a/libnymea-app-core/devicemanager.cpp b/libnymea-app-core/devicemanager.cpp index 2e06d1b9..d5666ab4 100644 --- a/libnymea-app-core/devicemanager.cpp +++ b/libnymea-app-core/devicemanager.cpp @@ -521,13 +521,14 @@ void DeviceManager::executeBrowserItemResponse(const QVariantMap ¶ms) emit executeBrowserItemReply(params); } -int DeviceManager::executeBrowserItemAction(const QUuid &deviceId, const QString &itemId, const QUuid &actionTypeId, const QVariantMap ¶ms) +int DeviceManager::executeBrowserItemAction(const QUuid &deviceId, const QString &itemId, const QUuid &actionTypeId, const QVariantList ¶ms) { QVariantMap data; data.insert("deviceId", deviceId); data.insert("itemId", itemId); data.insert("actionTypeId", actionTypeId); data.insert("params", params); + qDebug() << "params:" << params; return m_jsonClient->sendCommand("Actions.ExecuteBrowserItemAction", data, this, "executeBrowserItemActionResponse"); } diff --git a/libnymea-app-core/devicemanager.h b/libnymea-app-core/devicemanager.h index 11225ce3..d26fec3a 100644 --- a/libnymea-app-core/devicemanager.h +++ b/libnymea-app-core/devicemanager.h @@ -77,7 +77,7 @@ public: Q_INVOKABLE BrowserItems* browseDevice(const QUuid &deviceId, const QString &itemId = QString()); Q_INVOKABLE void refreshBrowserItems(BrowserItems *browserItems); Q_INVOKABLE int executeBrowserItem(const QUuid &deviceId, const QString &itemId); - Q_INVOKABLE int executeBrowserItemAction(const QUuid &deviceId, const QString &itemId, const QUuid &actionTypeId, const QVariantMap ¶ms = QVariantMap()); + Q_INVOKABLE int executeBrowserItemAction(const QUuid &deviceId, const QString &itemId, const QUuid &actionTypeId, const QVariantList ¶ms = QVariantList()); private: Q_INVOKABLE void notificationReceived(const QVariantMap &data); diff --git a/nymea-app/resources.qrc b/nymea-app/resources.qrc index b3a8aa00..2dfbea2f 100644 --- a/nymea-app/resources.qrc +++ b/nymea-app/resources.qrc @@ -188,5 +188,6 @@ ui/devicelistpages/MediaDeviceListPage.qml ui/components/MediaControls.qml ui/components/MediaArtworkImage.qml + ui/components/BrowserContextMenu.qml diff --git a/nymea-app/ui/components/BrowserContextMenu.qml b/nymea-app/ui/components/BrowserContextMenu.qml new file mode 100644 index 00000000..96db7d8a --- /dev/null +++ b/nymea-app/ui/components/BrowserContextMenu.qml @@ -0,0 +1,93 @@ +import QtQuick 2.5 +import QtQuick.Controls 2.1 +import QtQuick.Layouts 1.1 +import Nymea 1.0 +import "../delegates" + +MeaDialog { + id: root + + property Device device + property string itemId + property alias actionTypeIds: actionListView.model + + signal activated(var actionTypeId, var params) + + standardButtons: Dialog.NoButton + + StackView { + id: stackView + Layout.fillWidth: true + Layout.minimumHeight: actionListView.implicitHeight + + property var actionTypeId + + initialItem: ListView { + id: actionListView + width: parent.width + implicitHeight: contentHeight + + interactive: contentHeight > height + clip: true + delegate: NymeaListItemDelegate { + width: parent.width + text: actionType.displayName + progressive: false + property ActionType actionType: root.device.deviceClass.browserItemActionTypes.getActionType(modelData) + onClicked: { + var hasParams = actionType.paramTypes.count > 0 + if (hasParams) { + stackView.actionTypeId = actionType.id + stackView.push(paramComponent, {model: actionType.paramTypes}) + return; + } + + var params = [] + root.activated(actionType.id, params) + root.accept() + } + } + } + + Component { + id: paramComponent + + Repeater { + id: paramListView + + delegate: ParamDelegate { + width: parent.width + paramType: paramListView.model.get(index) + } + } + } + } + + RowLayout { + Layout.fillWidth: true + + Button { + text: qsTr("Cancel") + onClicked: root.reject() + } + Item { Layout.fillWidth: true } + Button { + text: qsTr("OK") + visible: stackView.depth > 1 + onClicked: { + var params = [] + print("k", stackView.currentItem.count) + for (var i = 0; i < stackView.currentItem.count; i++) { + print("juhu", i) + var param = {} + param["paramTypeId"] = stackView.currentItem.itemAt(i).paramType.id + param["value"] = stackView.currentItem.itemAt(i).value + params.push(param) + } + print("have params", params.length) + root.activated(stackView.actionTypeId, params) + root.accept(); + } + } + } +} diff --git a/nymea-app/ui/devicepages/DeviceBrowserPage.qml b/nymea-app/ui/devicepages/DeviceBrowserPage.qml index 5bf8209e..05d23ab5 100644 --- a/nymea-app/ui/devicepages/DeviceBrowserPage.qml +++ b/nymea-app/ui/devicepages/DeviceBrowserPage.qml @@ -82,9 +82,12 @@ Page { onPressAndHold: { print("show actions:", model.actionTypeIds) - var popup = actionDialogComponent.createObject(this, {title: model.displayName, itemId: model.id, actionTypeIds: model.actionTypeIds}); + var actionDialogComponent = Qt.createComponent(Qt.resolvedUrl("../components/BrowserContextMenu.qml")); + var popup = actionDialogComponent.createObject(this, {device: root.device, title: model.displayName, itemId: model.id, actionTypeIds: model.actionTypeIds}); + popup.activated.connect(function(actionTypeId, params) { + root.executeBrowserItemAction(model.id, actionTypeId, params) + }) popup.open() -// root.device.deviceClass.browserItemActionTypes.getActionType() } } @@ -95,32 +98,4 @@ Page { } } - Component { - id: actionDialogComponent - MeaDialog { - id: actionDialog - - property string itemId - property alias actionTypeIds: actionListView.model - - ListView { - id: actionListView - Layout.fillWidth: true - implicitHeight: count * 50 - interactive: contentHeight > height - clip: true - delegate: NymeaListItemDelegate { - width: parent.width - text: actionType.displayName - progressive: false - property ActionType actionType: root.device.deviceClass.browserItemActionTypes.getActionType(modelData) - onClicked: { - var params = [] - root.executeBrowserItemAction(actionDialog.itemId, actionType.id, params) - actionDialog.close() - } - } - } - } - } } diff --git a/nymea-app/ui/devicepages/MediaDevicePage.qml b/nymea-app/ui/devicepages/MediaDevicePage.qml index 947f0d71..f4ef6ef5 100644 --- a/nymea-app/ui/devicepages/MediaDevicePage.qml +++ b/nymea-app/ui/devicepages/MediaDevicePage.qml @@ -46,6 +46,11 @@ DevicePageBase { d.pendingItemId = itemId d.pendingBrowserItemId = engine.deviceManager.executeBrowserItem(device.id, itemId); } + function executeBrowserItemAction(itemId, actionTypeId, params) { + print("params2:", JSON.stringify(params)) + d.pendingItemId = itemId + d.pendingBrowserItemId = engine.deviceManager.executeBrowserItemAction(device.id, itemId, actionTypeId, params); + } readonly property State playbackState: device.states.getState(deviceClass.stateTypes.findByName("playbackStatus").id) @@ -57,17 +62,19 @@ DevicePageBase { Connections { target: engine.deviceManager - onExecuteBrowserItemReply: { - print("Execute reply:", params, params.id, params["id"], d.pendingBrowserItemId) - if (params.id === d.pendingBrowserItemId) { - d.pendingBrowserItemId = -1; - d.pendingItemId = "" - print("yep finished") - if (params.params.deviceError === "DeviceErrorNoError") { - swipeView.currentIndex = 0; - } else { - header.showInfo(qsTr("Error: %").arg(params.params.deviceError), true) - } + onExecuteBrowserItemReply: executionFinished(params) + onExecuteBrowserItemActionReply: executionFinished(params) + } + function executionFinished(params) { + print("Execute reply:", params, params.id, params["id"], d.pendingBrowserItemId) + if (params.id === d.pendingBrowserItemId) { + d.pendingBrowserItemId = -1; + d.pendingItemId = "" + print("yep finished") + if (params.params.deviceError === "DeviceErrorNoError") { + swipeView.currentIndex = 0; + } else { + header.showInfo(qsTr("Error: %1").arg(params.params.deviceError), true) } } } @@ -163,6 +170,8 @@ DevicePageBase { iconName: model.thumbnail fallbackIcon: "../images/browser/" + (model.mediaIcon && model.mediaIcon !== "MediaBrowserIconNone" ? model.mediaIcon : model.icon) + ".svg" enabled: model.browsable || model.executable + busy: d.pendingItemId === model.id + secondaryIconName: model.actionTypeIds.length > 0 ? "../images/navigation-menu.svg" : "" onClicked: { print("clicked:", model.id) @@ -172,6 +181,16 @@ DevicePageBase { internalPageStack.push(internalBrowserPage, {device: root.device, nodeId: model.id}) } } + onPressAndHold: { + print("show actions:", model.actionTypeIds) + var actionDialogComponent = Qt.createComponent(Qt.resolvedUrl("../components/BrowserContextMenu.qml")); + var popup = actionDialogComponent.createObject(root, {device: root.device, title: model.displayName, itemId: model.id, actionTypeIds: model.actionTypeIds}); + popup.activated.connect(function(actionTypeId, params) { + print("params:", JSON.stringify(params)) + root.executeBrowserItemAction(model.id, actionTypeId, params) + }) + popup.open() + } } BusyIndicator {