-
Notifications
You must be signed in to change notification settings - Fork 25
/
layeredlayoutwidget.cc
114 lines (90 loc) · 2.97 KB
/
layeredlayoutwidget.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
#include <QHBoxLayout>
#include <QTabBar>
#include <QDebug>
#include "layoutwidget.h"
#include "layeredlayoutwidget.h"
LayeredLayoutWidget::LayeredLayoutWidget(QWidget *parent)
: QWidget(parent)
, mLayout(NULL)
, mSelectedLayer(0)
{
LayoutWidget *layoutWidget = new LayoutWidget;
mLayoutWidget = layoutWidget;
QTabBar *tabBar = new QTabBar;
mTabBar = tabBar;
tabBar->setShape(QTabBar::RoundedEast);
tabBar->addTab("Normal");
tabBar->addTab("Keypad");
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(layoutWidget);
layout->addWidget(tabBar);
connect(tabBar, SIGNAL(currentChanged(int)),
this, SLOT(handleTabChange(int)));
connect(layoutWidget, SIGNAL(physicalKeyClicked(PhysicalKeycode)),
this, SLOT(handlePhysicalKeyClicked(PhysicalKeycode)));
this->setLayout(layout);
}
void LayeredLayoutWidget::setScale(float f) {
mLayoutWidget->setScale(f);
}
void LayeredLayoutWidget::setKeyboardLayout(const Layout& layout) {
mLayout = &layout; // FIXME: aliasing without ownership
mLayoutWidget->setKeyboardLayout(layout);
}
void LayeredLayoutWidget::setMapping(const QByteArray& mapping) {
mMapping = mapping;
mLayoutWidget->setMapping(this->physicalMapping());
}
QByteArray LayeredLayoutWidget::physicalMapping() const {
return mappingForLayer(mSelectedLayer);
}
QByteArray LayeredLayoutWidget::mappingForLayer(unsigned layer) const {
Q_ASSERT(mLayout);
return mMapping.mid(mLayout->keys.count() * layer, mLayout->keys.count());
}
QSet<PhysicalKeycode> LayeredLayoutWidget::physicalSelection() const {
return selectionForLayer(mSelectedLayer);
}
QSet<PhysicalKeycode> LayeredLayoutWidget::selectionForLayer(unsigned layer) const {
Q_ASSERT(mLayout);
const int layoutSize = mLayout->keys.count();
const int lower = layoutSize * layer;
const int upper = layoutSize * (layer + 1);
QSet<PhysicalKeycode> physicalKeys;
LogicalKeycode x;
foreach(x, mSelection) {
if (lower <= x && x < upper) {
physicalKeys << x % layoutSize;
}
}
return physicalKeys;
}
void LayeredLayoutWidget::setSelection(const QSet<LogicalKeycode>& selectedKeys){
mSelection = selectedKeys;
mLayoutWidget->setSelection(physicalSelection());
}
void LayeredLayoutWidget::setSelection(LogicalKeycode selectedKey){
mSelection.clear();
mSelection << selectedKey;
mLayoutWidget->setSelection(physicalSelection());
}
void LayeredLayoutWidget::pushLayerChanges() {
mLayoutWidget->setSelection(physicalSelection());
mLayoutWidget->setMapping(physicalMapping());
}
void LayeredLayoutWidget::setLayer(unsigned layer) {
mSelectedLayer = layer;
mTabBar->setCurrentIndex(layer);
pushLayerChanges();
}
void LayeredLayoutWidget::handleTabChange(int currentIndex) {
mSelectedLayer = currentIndex;
pushLayerChanges();
emit layerSelectionChanged(currentIndex);
}
void LayeredLayoutWidget::handlePhysicalKeyClicked(PhysicalKeycode physicalKeycode) {
emit physicalKeyClicked(physicalKeycode);
emit logicalKeyClicked(
mLayout->physicalKeycodeToLogical(
physicalKeycode, mSelectedLayer));
}