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 {