-
Notifications
You must be signed in to change notification settings - Fork 25
/
triggerspresenter.cc
129 lines (108 loc) · 2.92 KB
/
triggerspresenter.cc
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <QDebug>
#include <QTableView>
#include "triggerspresenter.h"
#include "triggersview.h"
#include "trigger.h"
#include "keyboardmodel.h"
TriggersPresenter::TriggersPresenter()
: mTriggers(NULL)
, mModel(NULL)
, mLayout(NULL)
{
mView = new TriggersView(this);
}
TriggersPresenter::~TriggersPresenter() {
if (!mView->parent()) {
delete mView;
}
}
const Trigger *TriggersPresenter::getTrigger(int index) const {
return &mTriggers->at(index);
}
void TriggersPresenter::setModel(const QSharedPointer<KeyboardModel>& m) {
mView->beforeTriggersChanged();
mModel = m;
mLayout = m->getLayout(); // FIXME: alias without ownership
mTriggers = m->getTriggers();
mView->setKeyboardLayout(*m->getLayout());
mView->afterTriggersChanged();
}
void TriggersPresenter::setTriggerType(int index, Trigger::TriggerType t) {
(*mTriggers)[index].setType(t);
mView->triggerChanged(index);
}
void TriggersPresenter::toggleKeyInTrigger(int index, LogicalKeycode logicalKeycode) {
(*mTriggers)[index].toggleKeyInTrigger(logicalKeycode);
mView->triggerChanged(index);
}
unsigned TriggersPresenter::layerForTrigger(int index) const {
const Trigger *trigger = &(*mTriggers)[index];
const QList<LogicalKeycode>& keys = trigger->triggerKeys();
if (keys.isEmpty()) {
return 0;
}
else {
return mLayout->layerForLogicalKey(keys[0]);
}
}
void TriggersPresenter::setTriggerLayer(int index, unsigned layer) {
Q_ASSERT(mLayout);
// Triggers are simple data keyed by logical keycodes, they don't
// know about keyboard layouts. We, the presenter, apply that
// logic.
Trigger *trigger = &(*mTriggers)[index];
QList<LogicalKeycode> newTriggerKeys;
LogicalKeycode x;
foreach(x, trigger->triggerKeys()) {
PhysicalKeycode pk = mLayout->logicalKeycodeToPhysical(x);
newTriggerKeys << mLayout->physicalKeycodeToLogical(pk, layer);
}
trigger->setTriggerKeys(newTriggerKeys);
mView->triggerChanged(index);
}
void TriggersPresenter::setTriggerProgram(int index, uint16_t program) {
(*mTriggers)[index].setProgram(program);
mView->triggerChanged(index);
}
int TriggersPresenter::getNumTriggers() const {
if (mTriggers)
return mTriggers->count();
else
return 0;
}
int TriggersPresenter::getKeysPerTrigger() const {
if (mModel)
return mModel->getKeysPerTrigger();
else
return 0;
}
int TriggersPresenter::getNumPrograms() const {
if (mModel)
return mModel->getPrograms()->count();
else
return 0;
}
int TriggersPresenter::appendTrigger() {
if (mModel) {
const int newIndex = getNumTriggers();
mView->beforeInsertTrigger(newIndex);
mTriggers->append(Trigger(getKeysPerTrigger()));
mView->afterInsertTrigger();
return newIndex;
}
else
return -1;
}
void TriggersPresenter::removeTrigger(int index) {
if (mModel) {
mView->beforeRemoveTrigger(index);
mTriggers->removeAt(index);
mView->afterRemoveTrigger();
}
}
const Layout* TriggersPresenter::getLayout() const {
if (mModel)
return mModel->getLayout();
else
return NULL;
}