Allow thing settings to be opened directly from the things page

This commit is contained in:
Michael Zanetti 2019-09-26 00:47:06 +02:00
parent d69891538d
commit c529314de6
14 changed files with 230 additions and 108 deletions

View File

@ -72,6 +72,8 @@ QVariant Devices::data(const QModelIndex &index, int role) const
return device->id().toString(); return device->id().toString();
case RoleDeviceClass: case RoleDeviceClass:
return device->deviceClassId().toString(); return device->deviceClassId().toString();
case RoleParentDeviceId:
return device->parentDeviceId().toString();
case RoleSetupComplete: case RoleSetupComplete:
return device->setupComplete(); return device->setupComplete();
case RoleInterfaces: case RoleInterfaces:
@ -133,6 +135,7 @@ QHash<int, QByteArray> Devices::roleNames() const
roles[RoleName] = "name"; roles[RoleName] = "name";
roles[RoleId] = "id"; roles[RoleId] = "id";
roles[RoleDeviceClass] = "deviceClassId"; roles[RoleDeviceClass] = "deviceClassId";
roles[RoleParentDeviceId] = "parentDeviceId";
roles[RoleSetupComplete] = "setupComplete"; roles[RoleSetupComplete] = "setupComplete";
roles[RoleInterfaces] = "interfaces"; roles[RoleInterfaces] = "interfaces";
roles[RoleBaseInterface] = "baseInterface"; roles[RoleBaseInterface] = "baseInterface";

View File

@ -36,6 +36,7 @@ public:
enum Roles { enum Roles {
RoleName, RoleName,
RoleId, RoleId,
RoleParentDeviceId,
RoleDeviceClass, RoleDeviceClass,
RoleSetupComplete, RoleSetupComplete,
RoleInterfaces, RoleInterfaces,

View File

@ -221,11 +221,12 @@ Device* JsonTypes::unpackDevice(const QVariantMap &deviceMap, DeviceClasses *dev
return nullptr; return nullptr;
} }
QUuid parentDeviceId = deviceMap.value("parentId").toUuid();
Device *device = nullptr; Device *device = nullptr;
if (oldDevice) { if (oldDevice) {
device = oldDevice; device = oldDevice;
} else { } else {
device = new Device(deviceClass); device = new Device(deviceClass, parentDeviceId);
} }
device->setName(deviceMap.value("name").toString()); device->setName(deviceMap.value("name").toString());
device->setId(deviceMap.value("id").toUuid()); device->setId(deviceMap.value("id").toUuid());

View File

@ -25,8 +25,9 @@
#include <QDebug> #include <QDebug>
Device::Device(DeviceClass *deviceClass, QObject *parent) : Device::Device(DeviceClass *deviceClass, const QUuid &parentDeviceId, QObject *parent) :
QObject(parent), QObject(parent),
m_parentDeviceId(parentDeviceId),
m_deviceClass(deviceClass) m_deviceClass(deviceClass)
{ {
} }
@ -57,6 +58,16 @@ QUuid Device::deviceClassId() const
return m_deviceClass->id(); return m_deviceClass->id();
} }
QUuid Device::parentDeviceId() const
{
return m_parentDeviceId;
}
bool Device::isChild() const
{
return !m_parentDeviceId.isNull();
}
bool Device::setupComplete() bool Device::setupComplete()
{ {
return m_setupComplete; return m_setupComplete;

View File

@ -37,6 +37,8 @@ class Device : public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY(QUuid id READ id CONSTANT) Q_PROPERTY(QUuid id READ id CONSTANT)
Q_PROPERTY(QUuid deviceClassId READ deviceClassId CONSTANT) Q_PROPERTY(QUuid deviceClassId READ deviceClassId CONSTANT)
Q_PROPERTY(QUuid parentDeviceId READ parentDeviceId CONSTANT)
Q_PROPERTY(bool isChild READ isChild CONSTANT)
Q_PROPERTY(QString name READ name NOTIFY nameChanged) Q_PROPERTY(QString name READ name NOTIFY nameChanged)
Q_PROPERTY(bool setupComplete READ setupComplete NOTIFY setupCompleteChanged) Q_PROPERTY(bool setupComplete READ setupComplete NOTIFY setupCompleteChanged)
Q_PROPERTY(Params *params READ params NOTIFY paramsChanged) Q_PROPERTY(Params *params READ params NOTIFY paramsChanged)
@ -45,7 +47,7 @@ class Device : public QObject
Q_PROPERTY(DeviceClass *deviceClass READ deviceClass CONSTANT) Q_PROPERTY(DeviceClass *deviceClass READ deviceClass CONSTANT)
public: public:
explicit Device(DeviceClass *deviceClass, QObject *parent = nullptr); explicit Device(DeviceClass *deviceClass, const QUuid &parentDeviceId = QUuid(), QObject *parent = nullptr);
QString name() const; QString name() const;
void setName(const QString &name); void setName(const QString &name);
@ -54,6 +56,8 @@ public:
void setId(const QUuid &id); void setId(const QUuid &id);
QUuid deviceClassId() const; QUuid deviceClassId() const;
QUuid parentDeviceId() const;
bool isChild() const;
bool setupComplete(); bool setupComplete();
void setSetupComplete(const bool &setupComplete); void setSetupComplete(const bool &setupComplete);
@ -77,6 +81,7 @@ public:
private: private:
QString m_name; QString m_name;
QUuid m_id; QUuid m_id;
QUuid m_parentDeviceId;
bool m_setupComplete; bool m_setupComplete;
Params *m_params = nullptr; Params *m_params = nullptr;
Params *m_settings = nullptr; Params *m_settings = nullptr;

View File

@ -89,6 +89,7 @@ void Params::addParam(Param *param)
//qDebug() << "Params: loaded param" << param->name(); //qDebug() << "Params: loaded param" << param->name();
m_params.append(param); m_params.append(param);
endInsertRows(); endInsertRows();
emit countChanged();
} }
void Params::clearModel() void Params::clearModel()
@ -96,6 +97,7 @@ void Params::clearModel()
beginResetModel(); beginResetModel();
m_params.clear(); m_params.clear();
endResetModel(); endResetModel();
emit countChanged();
} }
QHash<int, QByteArray> Params::roleNames() const QHash<int, QByteArray> Params::roleNames() const

View File

@ -30,13 +30,14 @@
class Params : public QAbstractListModel class Params : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(int count READ count NOTIFY countChanged)
public: public:
enum RoleId { enum RoleId {
RoleId, RoleId,
RoleValue RoleValue
}; };
explicit Params(QObject *parent = 0); explicit Params(QObject *parent = nullptr);
QList<Param *> params(); QList<Param *> params();
@ -53,6 +54,9 @@ public:
void clearModel(); void clearModel();
signals:
void countChanged();
protected: protected:
QHash<int, QByteArray> roleNames() const; QHash<int, QByteArray> roleNames() const;

View File

@ -791,11 +791,11 @@
<name>ConfigureThingPage</name> <name>ConfigureThingPage</name>
<message> <message>
<source>Delete Thing</source> <source>Delete Thing</source>
<translation>&quot;Thing&quot; löschen</translation> <translation type="vanished">&quot;Thing&quot; löschen</translation>
</message> </message>
<message> <message>
<source>Rename Thing</source> <source>Rename Thing</source>
<translation>&quot;Thing&quot; umbenennen</translation> <translation type="vanished">&quot;Thing&quot; umbenennen</translation>
</message> </message>
<message> <message>
<source>Remove device error: %1</source> <source>Remove device error: %1</source>
@ -803,7 +803,7 @@
</message> </message>
<message> <message>
<source>Thing parameters</source> <source>Thing parameters</source>
<translation>&quot;Thing&quot; Parameter</translation> <translation type="vanished">&quot;Thing&quot; Parameter</translation>
</message> </message>
<message> <message>
<source>This thing is currently used in one or more rules:</source> <source>This thing is currently used in one or more rules:</source>
@ -823,11 +823,11 @@
</message> </message>
<message> <message>
<source>Reconfigure Thing</source> <source>Reconfigure Thing</source>
<translation>&quot;Thing&quot; neu einrichten</translation> <translation type="vanished">&quot;Thing&quot; neu einrichten</translation>
</message> </message>
<message> <message>
<source>Thing information</source> <source>Thing information</source>
<translation>&quot;Thing&quot; Informationen</translation> <translation type="vanished">&quot;Thing&quot; Informationen</translation>
</message> </message>
<message> <message>
<source>Vendor:</source> <source>Vendor:</source>
@ -839,12 +839,36 @@
</message> </message>
<message> <message>
<source>Thing settings</source> <source>Thing settings</source>
<translation>&quot;Thing&quot; einstellungen</translation> <translation type="vanished">&quot;Thing&quot; einstellungen</translation>
</message> </message>
<message> <message>
<source>Apply</source> <source>Apply</source>
<translation>Anwenden</translation> <translation>Anwenden</translation>
</message> </message>
<message>
<source>Rename</source>
<translation>Umbenennen</translation>
</message>
<message>
<source>Delete</source>
<translation>Löschen</translation>
</message>
<message>
<source>Reconfigure</source>
<translation>Neu einrichten</translation>
</message>
<message>
<source>Information</source>
<translation>Informationen</translation>
</message>
<message>
<source>Parameters</source>
<translation>Parameter</translation>
</message>
<message>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
</context> </context>
<context> <context>
<name>ConnectPage</name> <name>ConnectPage</name>
@ -1289,7 +1313,7 @@
</message> </message>
<message> <message>
<source>Thing details</source> <source>Thing details</source>
<translation>Details</translation> <translation type="vanished">Details</translation>
</message> </message>
<message> <message>
<source>Mark as favorite</source> <source>Mark as favorite</source>
@ -1301,7 +1325,19 @@
</message> </message>
<message> <message>
<source>Thing logs</source> <source>Thing logs</source>
<translation>&quot;Thing&quot; Protokoll</translation> <translation type="vanished">&quot;Thing&quot; Protokoll</translation>
</message>
<message>
<source>Details</source>
<translation>Details</translation>
</message>
<message>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
<message>
<source>Logs</source>
<translation>Protokoll</translation>
</message> </message>
</context> </context>
<context> <context>

View File

@ -569,22 +569,6 @@
</context> </context>
<context> <context>
<name>ConfigureThingPage</name> <name>ConfigureThingPage</name>
<message>
<source>Delete Thing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rename Thing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reconfigure Thing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing information</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Vendor:</source> <source>Vendor:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -593,18 +577,34 @@
<source>Type</source> <source>Type</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Thing parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing settings</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Apply</source> <source>Apply</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reconfigure</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ConnectPage</name> <name>ConnectPage</name>
@ -875,14 +875,6 @@
<source>Magic</source> <source>Magic</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Thing details</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing logs</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Mark as favorite</source> <source>Mark as favorite</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -899,6 +891,18 @@
<source>Thing runs out of battery!</source> <source>Thing runs out of battery!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DeviceRulesPage</name> <name>DeviceRulesPage</name>

View File

@ -569,22 +569,6 @@
</context> </context>
<context> <context>
<name>ConfigureThingPage</name> <name>ConfigureThingPage</name>
<message>
<source>Delete Thing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rename Thing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reconfigure Thing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing information</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Vendor:</source> <source>Vendor:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -593,18 +577,34 @@
<source>Type</source> <source>Type</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Thing parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing settings</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Apply</source> <source>Apply</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reconfigure</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ConnectPage</name> <name>ConnectPage</name>
@ -875,14 +875,6 @@
<source>Magic</source> <source>Magic</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Thing details</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing logs</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Mark as favorite</source> <source>Mark as favorite</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -899,6 +891,18 @@
<source>Thing runs out of battery!</source> <source>Thing runs out of battery!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DeviceRulesPage</name> <name>DeviceRulesPage</name>

View File

@ -568,19 +568,19 @@
<name>ConfigureThingPage</name> <name>ConfigureThingPage</name>
<message> <message>
<source>Delete Thing</source> <source>Delete Thing</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<source>Rename Thing</source> <source>Rename Thing</source>
<translation> </translation> <translation type="vanished"> </translation>
</message> </message>
<message> <message>
<source>Reconfigure Thing</source> <source>Reconfigure Thing</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<source>Thing information</source> <source>Thing information</source>
<translation>() </translation> <translation type="vanished">() </translation>
</message> </message>
<message> <message>
<source>Vendor:</source> <source>Vendor:</source>
@ -592,16 +592,40 @@
</message> </message>
<message> <message>
<source>Thing parameters</source> <source>Thing parameters</source>
<translation>() </translation> <translation type="vanished">() </translation>
</message> </message>
<message> <message>
<source>Thing settings</source> <source>Thing settings</source>
<translation>() </translation> <translation type="vanished">() </translation>
</message> </message>
<message> <message>
<source>Apply</source> <source>Apply</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reconfigure</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ConnectPage</name> <name>ConnectPage</name>
@ -874,11 +898,11 @@
</message> </message>
<message> <message>
<source>Thing details</source> <source>Thing details</source>
<translation> </translation> <translation type="vanished"> </translation>
</message> </message>
<message> <message>
<source>Thing logs</source> <source>Thing logs</source>
<translation> </translation> <translation type="vanished"> </translation>
</message> </message>
<message> <message>
<source>Mark as favorite</source> <source>Mark as favorite</source>
@ -896,6 +920,18 @@
<source>Thing runs out of battery!</source> <source>Thing runs out of battery!</source>
<translation> !</translation> <translation> !</translation>
</message> </message>
<message>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DeviceRulesPage</name> <name>DeviceRulesPage</name>

View File

@ -53,7 +53,7 @@ Item {
} }
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
text: "%1: %2".arg(deviceClass.eventTypes.getEventType(model.typeId).displayName).arg(model.value.trim()) text: deviceClass.eventTypes.getEventType(model.typeId).displayName + (model.value.length > 0 ? (": " + model.value.trim()) : "")
elide: Text.ElideRight elide: Text.ElideRight
font.pixelSize: app.smallFont font.pixelSize: app.smallFont
} }

View File

@ -56,10 +56,11 @@ Page {
thingMenu.addItem(menuEntryComponent.createObject(thingMenu, {text: qsTr("Magic"), iconSource: "../images/magic.svg", functionName: "openDeviceMagicPage"})) thingMenu.addItem(menuEntryComponent.createObject(thingMenu, {text: qsTr("Magic"), iconSource: "../images/magic.svg", functionName: "openDeviceMagicPage"}))
if (root.showDetailsButton) { if (root.showDetailsButton) {
thingMenu.addItem(menuEntryComponent.createObject(thingMenu, {text: qsTr("Thing details"), iconSource: "../images/configure.svg", functionName: "openGenericDevicePage"})) thingMenu.addItem(menuEntryComponent.createObject(thingMenu, {text: qsTr("Details"), iconSource: "../images/info.svg", functionName: "openGenericDevicePage"}))
} }
thingMenu.addItem(menuEntryComponent.createObject(thingMenu, {text: qsTr("Settings"), iconSource: "../images/configure.svg", functionName: "openThingSettingsPage"}))
if (root.showLogsButton) { if (root.showLogsButton) {
thingMenu.addItem(menuEntryComponent.createObject(thingMenu, {text: qsTr("Thing logs"), iconSource: "../images/logs.svg", functionName: "openDeviceLogPage"})) thingMenu.addItem(menuEntryComponent.createObject(thingMenu, {text: qsTr("Logs"), iconSource: "../images/logs.svg", functionName: "openDeviceLogPage"}))
} }
if (engine.jsonRpcClient.ensureServerVersion(1.6)) { if (engine.jsonRpcClient.ensureServerVersion(1.6)) {
@ -84,6 +85,10 @@ Page {
engine.tagsManager.untagDevice(root.device.id, "favorites") engine.tagsManager.untagDevice(root.device.id, "favorites")
} }
} }
function openThingSettingsPage() {
pageStack.push(Qt.resolvedUrl("../thingconfiguration/ConfigureThingPage.qml"), {device: root.device})
}
function openDeviceLogPage() { function openDeviceLogPage() {
pageStack.push(Qt.resolvedUrl("DeviceLogPage.qml"), {device: root.device }); pageStack.push(Qt.resolvedUrl("DeviceLogPage.qml"), {device: root.device });
} }

View File

@ -24,26 +24,36 @@ Page {
id: deviceMenu id: deviceMenu
width: implicitWidth + app.margins width: implicitWidth + app.margins
x: parent.width - width x: parent.width - width
IconMenuItem {
iconSource: "../images/delete.svg" Component.onCompleted: {
text: qsTr("Delete Thing") deviceMenu.addItem(menuEntryComponent.createObject(deviceMenu, {text: qsTr("Rename"), iconSource: "../images/edit.svg", functionName: "renameThing"}))
onTriggered: engine.deviceManager.removeDevice(root.device.id) if (!root.device.isChild) {
} deviceMenu.addItem(menuEntryComponent.createObject(deviceMenu, {text: qsTr("Delete"), iconSource: "../images/delete.svg", functionName: "deleteThing"}))
IconMenuItem { }
iconSource: "../images/edit.svg" if (!root.device.isChild) {
text: qsTr("Rename Thing") deviceMenu.addItem(menuEntryComponent.createObject(deviceMenu, {text: qsTr("Reconfigure"), iconSource: "../images/configure.svg", functionName: "reconfigureThing"}))
onTriggered: {
var popup = renameDialog.createObject(root);
popup.open();
} }
} }
IconMenuItem {
iconSource: "../images/configure.svg" function renameThing() {
text: qsTr("Reconfigure Thing") var popup = renameDialog.createObject(root);
visible: root.device.deviceClass.paramTypes.count > 0 popup.open();
onTriggered: { }
var configPage = pageStack.push(Qt.resolvedUrl("SetupWizard.qml"), {device: root.device})
configPage.done.connect(function() {pageStack.pop(root)}) function deleteThing() {
engine.deviceManager.removeDevice(root.device.id)
}
function reconfigureThing() {
var configPage = pageStack.push(Qt.resolvedUrl("SetupWizard.qml"), {device: root.device})
configPage.done.connect(function() {pageStack.pop(root)})
}
Component {
id: menuEntryComponent
IconMenuItem {
property string functionName: ""
onTriggered: deviceMenu[functionName]()
} }
} }
} }
@ -77,7 +87,7 @@ Page {
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
Layout.margins: app.margins Layout.margins: app.margins
text: qsTr("Thing information") text: qsTr("Information")
color: app.accentColor color: app.accentColor
} }
RowLayout { RowLayout {
@ -106,7 +116,7 @@ Page {
Layout.leftMargin: app.margins Layout.leftMargin: app.margins
Layout.rightMargin: app.margins Layout.rightMargin: app.margins
Layout.topMargin: app.margins Layout.topMargin: app.margins
text: qsTr("Thing parameters") text: qsTr("Parameters")
color: app.accentColor color: app.accentColor
visible: root.deviceClass.paramTypes.count > 0 visible: root.deviceClass.paramTypes.count > 0
} }
@ -126,7 +136,7 @@ Page {
Layout.leftMargin: app.margins Layout.leftMargin: app.margins
Layout.rightMargin: app.margins Layout.rightMargin: app.margins
Layout.topMargin: app.margins Layout.topMargin: app.margins
text: qsTr("Thing settings") text: qsTr("Settings")
color: app.accentColor color: app.accentColor
visible: root.deviceClass.settingsTypes.count > 0 visible: root.deviceClass.settingsTypes.count > 0
} }