aboutsummaryrefslogtreecommitdiff
path: root/confui/ui_automation.cpp
blob: d4e84a7e27f49846509c6d99941bca51d0a2745a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "ui_tab_automations.h"
#include "ui_automation.h"
#include "mesh_connector.h"

using std::pair;

CDAutomationWidget::~CDAutomationWidget() { }
CDAutomationWidget::CDAutomationWidget(QWidget* parent) : QWidget(parent) {
	_parent = (CDAutomationsTabWidget*) parent;
	main_layout = new QHBoxLayout;

	dropdown_button = new QComboBox;
	dropdown_action = new QComboBox;
	dropdown_light = new QComboBox;
	button_remove = new QPushButton("Delete");

	main_layout->addWidget(dropdown_button);
	main_layout->addWidget(dropdown_action);
	main_layout->addWidget(dropdown_light);
	main_layout->addStretch();
	main_layout->addWidget(button_remove);

	connect(button_remove, &QPushButton::clicked, this, &CDAutomationWidget::remove);

	connect(dropdown_button, qOverload<int>(&QComboBox::activated), this, &CDAutomationWidget::apply);
	connect(dropdown_action, qOverload<int>(&QComboBox::activated), this, &CDAutomationWidget::apply);
	connect(dropdown_light, qOverload<int>(&QComboBox::activated), this, &CDAutomationWidget::apply);

	update();
	setLayout(main_layout);
}

void CDAutomationWidget::set_automation(cd_link_t link) {
	_id = link;
	_automation = g_cd_mesh_connector->get_link(link);
}

void CDAutomationWidget::update() {
	map<cd_uid_t, cd_s_node*> nodes = g_cd_mesh_connector->get_nodes(false);

	dropdown_button->clear();
	dropdown_light->clear();
	for (pair<cd_uid_t, cd_s_node*> node : nodes) {
		QString label = "";
		label.append(QString::fromLocal8Bit(node.second->name, node.second->name_len));
		label.append(" (");
		label.append(QString::fromStdString(CDMeshConnector::cd_mac_to_string(node.second->address)));
		label.append(")");

		dropdown_button->addItem(label, node.second->id);
		dropdown_light->addItem(label, node.second->id);
	}

	dropdown_action->clear();
	dropdown_action->addItem("Toggles", CD_AUTOMATION_TYPE_TOGGLE);
	dropdown_action->addItem("Switches on", CD_AUTOMATION_TYPE_TURN_ON);
	dropdown_action->addItem("Switches off", CD_AUTOMATION_TYPE_TURN_OFF);

	if (_automation == nullptr) return;

	dropdown_button->setCurrentIndex(_automation->button == nullptr ? -1 : dropdown_button->findData(_automation->button->id));
	dropdown_action->setCurrentIndex(dropdown_action->findData(_automation->type));
	dropdown_light->setCurrentIndex(_automation->light == nullptr ? -1 : dropdown_light->findData(_automation->light->id));
}

bool CDAutomationWidget::conf_valid() {
	if (dropdown_button->currentIndex() == -1) return false;
	if (dropdown_action->currentIndex() == -1) return false;
	if (dropdown_light->currentIndex() == -1) return false;
	return true;
}

void CDAutomationWidget::apply() {
	if (!conf_valid()) return;

	_automation->button = g_cd_mesh_connector->get_node(dropdown_button->findData(dropdown_button->currentIndex()));
	_automation->type = (enum cd_e_automation_type) dropdown_action->findData(dropdown_action->currentIndex());
	_automation->light = g_cd_mesh_connector->get_node(dropdown_light->findData(dropdown_light->currentIndex()));
	_automation->valid = true;

	g_cd_mesh_connector->update_link(_automation);
}

void CDAutomationWidget::remove() {
	g_cd_mesh_connector->remove_link(_id);
	if (_parent != nullptr) _parent->update();
}