Merge PR #245: Allow thing settings to be opened directly from the things page

This commit is contained in:
Simon Stürz 2019-09-27 00:08:43 +02:00
commit e00ab2b9ba
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();
case RoleDeviceClass:
return device->deviceClassId().toString();
case RoleParentDeviceId:
return device->parentDeviceId().toString();
case RoleSetupComplete:
return device->setupComplete();
case RoleInterfaces:
@ -133,6 +135,7 @@ QHash<int, QByteArray> Devices::roleNames() const
roles[RoleName] = "name";
roles[RoleId] = "id";
roles[RoleDeviceClass] = "deviceClassId";
roles[RoleParentDeviceId] = "parentDeviceId";
roles[RoleSetupComplete] = "setupComplete";
roles[RoleInterfaces] = "interfaces";
roles[RoleBaseInterface] = "baseInterface";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -569,22 +569,6 @@
</context>
<context>
<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>
<source>Vendor:</source>
<translation type="unfinished"></translation>
@ -593,18 +577,34 @@
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished"></translation>
</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>
<name>ConnectPage</name>
@ -875,14 +875,6 @@
<source>Magic</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing details</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mark as favorite</source>
<translation type="unfinished"></translation>
@ -899,6 +891,18 @@
<source>Thing runs out of battery!</source>
<translation type="unfinished"></translation>
</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>
<name>DeviceRulesPage</name>

View File

@ -569,22 +569,6 @@
</context>
<context>
<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>
<source>Vendor:</source>
<translation type="unfinished"></translation>
@ -593,18 +577,34 @@
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished"></translation>
</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>
<name>ConnectPage</name>
@ -875,14 +875,6 @@
<source>Magic</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing details</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thing logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mark as favorite</source>
<translation type="unfinished"></translation>
@ -899,6 +891,18 @@
<source>Thing runs out of battery!</source>
<translation type="unfinished"></translation>
</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>
<name>DeviceRulesPage</name>

View File

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

View File

@ -53,7 +53,7 @@ Item {
}
Label {
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
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"}))
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) {
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)) {
@ -84,6 +85,10 @@ Page {
engine.tagsManager.untagDevice(root.device.id, "favorites")
}
}
function openThingSettingsPage() {
pageStack.push(Qt.resolvedUrl("../thingconfiguration/ConfigureThingPage.qml"), {device: root.device})
}
function openDeviceLogPage() {
pageStack.push(Qt.resolvedUrl("DeviceLogPage.qml"), {device: root.device });
}

View File

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