Merge PR #109: Dont ask the user for confirmation to cancel a rule edit if there was no change

This commit is contained in:
Jenkins 2018-12-21 02:26:29 +01:00
commit 41f2f8fb70
35 changed files with 284 additions and 4 deletions

View File

@ -1,6 +1,7 @@
#include "calendaritem.h"
#include "repeatingoption.h"
#include <QDebug>
CalendarItem::CalendarItem(QObject *parent) : QObject(parent)
{
@ -60,3 +61,14 @@ CalendarItem *CalendarItem::clone() const
ret->m_startTime = this->m_startTime;
return ret;
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool CalendarItem::operator ==(CalendarItem *other) const
{
COMPARE(m_dateTime, other->dateTime());
COMPARE(m_startTime, other->startTime());
COMPARE(m_duration, other->duration());
COMPARE(m_repeatingOption, other->repeatingOption());
return true;
}

View File

@ -29,6 +29,7 @@ public:
RepeatingOption* repeatingOption() const;
CalendarItem* clone() const;
bool operator==(CalendarItem* other) const;
signals:
void durationChanged();

View File

@ -50,3 +50,16 @@ CalendarItem *CalendarItems::get(int index) const
}
return m_list.at(index);
}
bool CalendarItems::operator==(CalendarItems *other) const
{
if (rowCount() != other->rowCount()) {
return false;
}
for (int i = 0; i < rowCount(); i++) {
if (!get(i)->operator==(other->get(i))) {
return false;
}
}
return true;
}

View File

@ -21,6 +21,8 @@ public:
Q_INVOKABLE CalendarItem* createNewCalendarItem() const;
Q_INVOKABLE CalendarItem* get(int index) const;
bool operator==(CalendarItems *other) const;
signals:
void countChanged();

View File

@ -1,4 +1,5 @@
#include "eventdescriptor.h"
#include <QDebug>
EventDescriptor::EventDescriptor(QObject *parent) : QObject(parent)
{
@ -74,3 +75,15 @@ EventDescriptor *EventDescriptor::clone() const
}
return ret;
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool EventDescriptor::operator==(EventDescriptor *other) const
{
COMPARE(m_deviceId, other->deviceId());
COMPARE(m_eventTypeId, other->eventTypeId());
COMPARE(m_interfaceName, other->interfaceName());
COMPARE(m_interfaceEvent, other->interfaceEvent());
COMPARE_PTR(m_paramDescriptors, other->paramDescriptors());
return true;
}

View File

@ -35,6 +35,7 @@ public:
ParamDescriptors* paramDescriptors() const;
EventDescriptor* clone() const;
bool operator==(EventDescriptor* other) const;
signals:
void deviceIdChanged();

View File

@ -1,6 +1,8 @@
#include "eventdescriptors.h"
#include "eventdescriptor.h"
#include <QDebug>
EventDescriptors::EventDescriptors(QObject *parent) :
QAbstractListModel(parent)
{
@ -61,3 +63,18 @@ void EventDescriptors::removeEventDescriptor(int index)
endRemoveRows();
emit countChanged();
}
bool EventDescriptors::operator==(EventDescriptors *other) const
{
qDebug() << "EventDescriptors comparison";
if (rowCount() != other->rowCount()) {
qDebug() << "EventDescriptors count not matching";
return false;
}
for (int i = 0; i < rowCount(); i++) {
if (!get(i)->operator==(other->get(i))) {
return false;
}
}
return true;
}

View File

@ -26,6 +26,8 @@ public:
Q_INVOKABLE void addEventDescriptor(EventDescriptor *eventDescriptor);
Q_INVOKABLE void removeEventDescriptor(int index);
bool operator==(EventDescriptors* other) const;
signals:
void countChanged();

View File

@ -1,5 +1,7 @@
#include "paramdescriptor.h"
#include <QDebug>
ParamDescriptor::ParamDescriptor(QObject *parent) : Param(parent)
{
@ -40,3 +42,14 @@ ParamDescriptor *ParamDescriptor::clone() const
ret->setOperatorType(this->operatorType());
return ret;
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool ParamDescriptor::operator==(ParamDescriptor *other) const
{
COMPARE(m_paramTypeId, other->paramTypeId());
COMPARE(m_paramName, other->paramName());
COMPARE(m_value, other->value());
COMPARE(m_operator, other->operatorType());
return true;
}

View File

@ -28,6 +28,7 @@ public:
void setOperatorType(ValueOperator operatorType);
ParamDescriptor* clone() const;
bool operator==(ParamDescriptor *other) const;
signals:
void paramNameChanged();

View File

@ -98,3 +98,16 @@ void ParamDescriptors::clear()
endResetModel();
emit countChanged();
}
bool ParamDescriptors::operator==(ParamDescriptors *other) const
{
if (rowCount() != other->rowCount()) {
return false;
}
for (int i = 0; i < rowCount(); i++) {
if (!get(i)->operator==(other->get(i))) {
return false;
}
}
return true;
}

View File

@ -42,6 +42,8 @@ public:
Q_INVOKABLE void setParamDescriptorByName(const QString &paramName, const QVariant &value, ValueOperator operatorType);
Q_INVOKABLE void clear();
bool operator==(ParamDescriptors *other) const;
signals:
void countChanged();

View File

@ -159,6 +159,28 @@ Rule *Rule::clone() const
return ret;
}
bool Rule::compare(Rule *other) const
{
qDebug() << "comparing rule" << this << "to" << other;
return this->operator==(other);
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a && !b) return true; if (!a || !b) return false; if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool Rule::operator==(Rule *other) const
{
COMPARE(m_id, other->id());
COMPARE(m_name, other->name());
COMPARE(m_enabled, other->enabled());
COMPARE(m_executable, other->executable());
COMPARE_PTR(m_eventDescriptors, other->eventDescriptors());
COMPARE_PTR(m_stateEvaluator, other->stateEvaluator());
COMPARE_PTR(m_actions, other->actions());
COMPARE_PTR(m_exitActions, other->exitActions());
COMPARE_PTR(m_timeDescriptor, other->timeDescriptor());
return true;
}
QDebug operator <<(QDebug &dbg, Rule *rule)
{
dbg << rule->name() << " (Enabled:" << rule->enabled() << "Active:" << rule->active() << ")" << endl;

View File

@ -52,6 +52,9 @@ public:
Q_INVOKABLE Rule *clone() const;
Q_INVOKABLE bool compare(Rule* other) const;
bool operator==(Rule *other) const;
signals:
void nameChanged();
void enabledChanged();

View File

@ -3,6 +3,8 @@
#include "ruleactionparam.h"
#include "ruleactionparams.h"
#include <QDebug>
RuleAction::RuleAction(QObject *parent) : QObject(parent)
{
m_ruleActionParams = new RuleActionParams(this);
@ -77,3 +79,15 @@ RuleAction *RuleAction::clone() const
}
return ret;
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool RuleAction::operator==(RuleAction *other) const
{
COMPARE(m_deviceId, other->deviceId());
COMPARE(m_actionTypeId, other->actionTypeId());
COMPARE(m_interfaceName, other->interfaceName());
COMPARE(m_interfaceAction, other->interfaceAction());
COMPARE_PTR(m_ruleActionParams, other->ruleActionParams());
return true;
}

View File

@ -33,6 +33,7 @@ public:
RuleActionParams* ruleActionParams() const;
RuleAction *clone() const;
bool operator==(RuleAction *other) const;
signals:
void deviceIdChanged();

View File

@ -1,5 +1,7 @@
#include "ruleactionparam.h"
#include <QDebug>
RuleActionParam::RuleActionParam(const QString &paramName, const QVariant &value, QObject *parent):
Param(parent),
m_paramName(paramName)
@ -61,3 +63,15 @@ RuleActionParam *RuleActionParam::clone() const
ret->setEventParamTypeId(eventParamTypeId());
return ret;
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool RuleActionParam::operator==(RuleActionParam *other) const
{
COMPARE(m_paramTypeId, other->paramTypeId());
COMPARE(m_paramName, other->paramName());
COMPARE(m_eventTypeId, other->eventTypeId());
COMPARE(m_eventParamTypeId, other->eventParamTypeId());
COMPARE(m_value, other->value());
return true;
}

View File

@ -27,6 +27,7 @@ public:
void setEventParamTypeId(const QString &eventParamTypeId);
RuleActionParam* clone() const;
bool operator==(RuleActionParam *other) const;
signals:
void paramNameChanged();
void eventTypeIdChanged();

View File

@ -98,3 +98,16 @@ RuleActionParam *RuleActionParams::get(int index) const
{
return m_list.at(index);
}
bool RuleActionParams::operator==(RuleActionParams *other) const
{
if (rowCount() != other->rowCount()) {
return false;
}
for (int i = 0; i < rowCount(); i++) {
if (!get(i)->operator==(other->get(i))) {
return false;
}
}
return true;
}

View File

@ -31,6 +31,8 @@ public:
Q_INVOKABLE void setRuleActionParamEvent(const QString &paramTypeId, const QString &eventTypeId, const QString &eventParamTypeId);
Q_INVOKABLE RuleActionParam* get(int index) const;
bool operator==(RuleActionParams *other) const;
signals:
void countChanged();

View File

@ -48,3 +48,16 @@ RuleAction *RuleActions::createNewRuleAction() const
{
return new RuleAction();
}
bool RuleActions::operator==(RuleActions *other) const
{
if (rowCount() != other->rowCount()) {
return false;
}
for (int i = 0; i < rowCount(); i++) {
if (!get(i)->operator==(other->get(i))) {
return false;
}
}
return true;
}

View File

@ -21,6 +21,7 @@ public:
Q_INVOKABLE RuleAction* get(int index) const;
Q_INVOKABLE RuleAction* createNewRuleAction() const;
bool operator==(RuleActions *other) const;
signals:
void countChanged();

View File

@ -1,5 +1,7 @@
#include "statedescriptor.h"
#include <QDebug>
StateDescriptor::StateDescriptor(const QUuid &deviceId, const QUuid &stateTypeId, StateDescriptor::ValueOperator valueOperator, const QVariant &value, QObject *parent):
QObject(parent),
m_deviceId(deviceId),
@ -110,3 +112,16 @@ StateDescriptor *StateDescriptor::clone() const
ret->setInterfaceState(interfaceState());
return ret;
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool StateDescriptor::operator==(StateDescriptor *other) const
{
COMPARE(m_deviceId, other->deviceId());
COMPARE(m_stateTypeId, other->stateTypeId());
COMPARE(m_interfaceName, other->interfaceName());
COMPARE(m_interfaceState, other->interfaceState());
COMPARE(m_operator, other->valueOperator());
COMPARE(m_value, other->value());
return true;
}

View File

@ -49,6 +49,7 @@ public:
void setValue(const QVariant &value);
StateDescriptor* clone() const;
bool operator==(StateDescriptor *other) const;
signals:
void deviceIdChanged();

View File

@ -2,6 +2,8 @@
#include "stateevaluators.h"
#include "statedescriptor.h"
#include <QDebug>
StateEvaluator::StateEvaluator(QObject *parent) : QObject(parent)
{
m_childEvaluators = new StateEvaluators(this);
@ -75,3 +77,13 @@ StateEvaluator *StateEvaluator::clone() const
}
return ret;
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool StateEvaluator::operator==(StateEvaluator *other) const
{
COMPARE(m_operator, other->stateOperator());
COMPARE_PTR(m_stateDescriptor, other->stateDescriptor());
COMPARE_PTR(m_childEvaluators, other->childEvaluators());
return true;
}

View File

@ -34,6 +34,7 @@ public:
Q_INVOKABLE StateEvaluator* addChildEvaluator();
StateEvaluator* clone() const;
bool operator==(StateEvaluator *other) const;
signals:
void stateOperatorChanged();

View File

@ -56,3 +56,16 @@ void StateEvaluators::remove(int index)
{
take(index)->deleteLater();
}
bool StateEvaluators::operator==(StateEvaluators *other) const
{
if (rowCount() != other->rowCount()) {
return false;
}
for (int i = 0; i < rowCount(); i++) {
if (!get(i)->operator==(other->get(i))) {
return false;
}
}
return true;
}

View File

@ -26,6 +26,8 @@ public:
// StateEvaluator will be deleted
Q_INVOKABLE void remove(int index);
bool operator==(StateEvaluators *other) const;
signals:
void countChanged();

View File

@ -3,6 +3,8 @@
#include "timeeventitems.h"
#include "calendaritems.h"
#include <QDebug>
TimeDescriptor::TimeDescriptor(QObject *parent) : QObject(parent)
{
m_timeEventItems = new TimeEventItems(this);
@ -18,3 +20,12 @@ CalendarItems *TimeDescriptor::calendarItems() const
{
return m_calendarItems;
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool TimeDescriptor::operator==(TimeDescriptor *other) const
{
COMPARE_PTR(m_timeEventItems, other->timeEventItems());
COMPARE_PTR(m_calendarItems, other->calendarItems());
return true;
}

View File

@ -18,6 +18,8 @@ public:
TimeEventItems* timeEventItems() const;
CalendarItems* calendarItems() const;
bool operator==(TimeDescriptor* other) const;
signals:
public slots:

View File

@ -2,6 +2,8 @@
#include "repeatingoption.h"
#include <QDebug>
TimeEventItem::TimeEventItem(QObject *parent):
QObject(parent),
m_repeatingOption(new RepeatingOption(this))
@ -47,3 +49,13 @@ TimeEventItem *TimeEventItem::clone() const
ret->m_repeatingOption = this->m_repeatingOption;
return ret;
}
#define COMPARE(a, b) if (a != b) { qDebug() << a << "!=" << b; return false; }
#define COMPARE_PTR(a, b) if (!a->operator==(b)) { qDebug() << a << "!=" << b; return false; }
bool TimeEventItem::operator==(TimeEventItem *other) const
{
COMPARE(m_time, other->time());
COMPARE(m_dateTime, other->dateTime());
COMPARE(m_repeatingOption, other->repeatingOption());
return true;
}

View File

@ -26,6 +26,7 @@ public:
RepeatingOption* repeatingOption() const;
TimeEventItem* clone() const;
bool operator==(TimeEventItem *other) const;
signals:
void dateTimeChanged();

View File

@ -53,3 +53,16 @@ TimeEventItem *TimeEventItems::createNewTimeEventItem() const
{
return new TimeEventItem();
}
bool TimeEventItems::operator==(TimeEventItems *other) const
{
if (rowCount() != other->rowCount()) {
return false;
}
for (int i = 0; i < rowCount(); i++) {
if (!get(i)->operator==(other->get(i))) {
return false;
}
}
return true;
}

View File

@ -21,6 +21,7 @@ public:
Q_INVOKABLE TimeEventItem* get(int index) const;
Q_INVOKABLE TimeEventItem* createNewTimeEventItem() const;
bool operator==(TimeEventItems *other) const;
signals:
void countChanged();

View File

@ -7,8 +7,8 @@ import Nymea 1.0
Page {
id: root
property var rule: null
property var initialDeviceToBeAdded: null
property Rule rule: null
property Device initialDeviceToBeAdded: null
property bool busy: false
@ -27,7 +27,23 @@ Page {
signal cancel();
Component.onCompleted: print("+++ created editrulepage")
Component.onDestruction: print("--- destroying editrulepage")
Component.onDestruction: {
print("--- destroying editrulepage")
d.backupRule.destroy();
}
onRuleChanged: d.createRuleBackup();
QtObject {
id: d
property Rule backupRule: null
function createRuleBackup() {
if (backupRule !== null) {
backupRule.destroy();
}
backupRule = root.rule.clone();
}
}
function addEventDescriptor(interfaceMode) {
if (interfaceMode === undefined) {
@ -208,6 +224,12 @@ Page {
header: GuhHeader {
text: root.rule.name.length === 0 ? qsTr("Add new magic") : qsTr("Edit %1").arg(root.rule.name)
onBackPressed: {
if (root.rule.compare(d.backupRule)) {
print("Rule has not been changed. Exiting EditRulePage");
root.cancel();
return;
}
print("Rule has changed. Asking for cancellation dialog")
var component = Qt.createComponent(Qt.resolvedUrl("../components/MeaDialog.qml"));
var popup = component.createObject(root, {headerIcon: "../images/question.svg",
title: qsTr("Cancel?"),
@ -349,7 +371,7 @@ Page {
}
}
Repeater {
model: ["light-on", "light-off", "alarm-clock", "media-play", "network-secure", "notification", "sensors", "shutter-10", "attention", "eye"]
model: ["light-on", "light-off", "alarm-clock", "media-playback-start", "network-secure", "notification", "sensors", "shutter/shutter-050", "attention", "eye"]
delegate: Item {
Layout.fillWidth: true
Layout.preferredHeight: app.iconSize + app.margins