This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
2018-07-11 23:10:30 +02:00

142 lines
5.4 KiB
C++

#include "ruletemplates.h"
#include "ruletemplate.h"
#include "eventdescriptortemplate.h"
#include "ruleactiontemplate.h"
#include "stateevaluatortemplate.h"
#include "types/ruleactionparam.h"
#include "types/ruleactionparams.h"
#include <QDebug>
RuleTemplates::RuleTemplates(QObject *parent) : QAbstractListModel(parent)
{
RuleTemplate* t;
EventDescriptorTemplate* evt;
StateEvaluatorTemplate* set;
RuleActionTemplate* rat;
RuleActionTemplate* reat; // exit
t = new RuleTemplate("Switch a light", "%0 switches %1", this);
evt = new EventDescriptorTemplate("button", "pressed", 0, EventDescriptorTemplate::SelectionModeDevice);
t->eventDescriptorTemplates()->addEventDescriptorTemplate(evt);
set = new StateEvaluatorTemplate(new StateDescriptorTemplate("light", "power", 1, StateDescriptorTemplate::ValueOperatorEquals, false));
t->setStateEvaluatorTemplate(set);
rat = new RuleActionTemplate("light", "power", 1, RuleActionTemplate::SelectionModeDevice);
rat->ruleActionParams()->setRuleActionParamByName("power", true);
t->ruleActionTemplates()->addRuleActionTemplate(rat);
reat = new RuleActionTemplate("light", "power", 1, RuleActionTemplate::SelectionModeDevice);
reat->ruleActionParams()->setRuleActionParamByName("power", false);
t->ruleExitActionTemplates()->addRuleActionTemplate(reat);
m_list.append(t);
t = new RuleTemplate("Intelligent blinds", "Intelligent blinds %1", this);
set = new StateEvaluatorTemplate(new StateDescriptorTemplate("temperaturesensor", "temperature", 0, StateDescriptorTemplate::ValueOperatorGreater, 20));
t->setStateEvaluatorTemplate(set);
rat = new RuleActionTemplate("simpleclosable", "close", 1, RuleActionTemplate::SelectionModeDevice);
t->ruleActionTemplates()->addRuleActionTemplate(rat);
reat = new RuleActionTemplate("simpleclosable", "open", 1, RuleActionTemplate::SelectionModeDevice);
t->ruleExitActionTemplates()->addRuleActionTemplate(reat);
m_list.append(t);
t = new RuleTemplate("Leave home - This will turn of everything when you press a button.", "Leave home", this);
evt = new EventDescriptorTemplate("button", "pressed", 0, EventDescriptorTemplate::SelectionModeDevice);
t->eventDescriptorTemplates()->addEventDescriptorTemplate(evt);
rat = new RuleActionTemplate("power", "power", 1, RuleActionTemplate::SelectionModeInterface);
t->ruleActionTemplates()->addRuleActionTemplate(rat);
m_list.append(t);
t = new RuleTemplate("Remind me to water my plant", "Remind me to water my %0 plant", this);
evt = new EventDescriptorTemplate("humiditysensor", "humidity", 0, EventDescriptorTemplate::SelectionModeDevice);
t->eventDescriptorTemplates()->addEventDescriptorTemplate(evt);
m_list.append(t);
}
int RuleTemplates::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return m_list.count();
}
QVariant RuleTemplates::data(const QModelIndex &index, int role) const
{
switch (role) {
case RoleDescription:
return m_list.at(index.row())->description();
}
return QVariant();
}
QHash<int, QByteArray> RuleTemplates::roleNames() const
{
QHash<int, QByteArray> roles;
roles.insert(RoleDescription, "description");
return roles;
}
RuleTemplate *RuleTemplates::get(int index) const
{
if (index < 0 || index >= m_list.count()) {
return nullptr;
}
return m_list.at(index);
}
bool RuleTemplatesFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
Q_UNUSED(source_parent)
if (!m_ruleTemplates) {
return false;
}
RuleTemplate *t = m_ruleTemplates->get(source_row);
qDebug() << "---------------" << t->description() << m_filterInterfaceNames;
if (!m_filterInterfaceNames.isEmpty()) {
bool found = false;
for (int i = 0; i < t->eventDescriptorTemplates()->rowCount(); i++) {
if (m_filterInterfaceNames.contains(t->eventDescriptorTemplates()->get(i)->interfaceName())) {
found = true;
break;
}
}
if (!found && t->stateEvaluatorTemplate() && stateEvaluatorTemplateContainsInterface(t->stateEvaluatorTemplate(), m_filterInterfaceNames)) {
found = true;
}
if (!found) {
for (int i = 0; i < t->ruleActionTemplates()->rowCount(); i++) {
if (m_filterInterfaceNames.contains(t->ruleActionTemplates()->get(i)->interfaceName())) {
found = true;
break;
}
}
}
if (!found) {
for (int i = 0; i < t->ruleExitActionTemplates()->rowCount(); i++) {
if (m_filterInterfaceNames.contains(t->ruleExitActionTemplates()->get(i)->interfaceName())) {
found = true;
break;
}
}
}
if (!found) {
return false;
}
}
return true;
}
bool RuleTemplatesFilterModel::stateEvaluatorTemplateContainsInterface(StateEvaluatorTemplate *stateEvaluatorTemplate, const QStringList &interfaceNames) const
{
if (interfaceNames.contains(stateEvaluatorTemplate->stateDescriptorTemplate()->interfaceName())) {
return true;
}
for (int i = 0; i < stateEvaluatorTemplate->childEvaluatorTemplates()->rowCount(); i++) {
if (stateEvaluatorTemplateContainsInterface(stateEvaluatorTemplate->childEvaluatorTemplates()->get(i), interfaceNames)) {
return true;
}
}
return false;
}