0cbd3823e
김태훈
슬라이더 새로 구현
|
1
2
3
4
5
6
7
|
#include "slider.h"
#include <QMouseEvent>
#include <QPainter>
#include <QDebug>
Slider::Slider(QWidget *parent) : QWidget(parent),
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
8
9
10
|
isSliderDown_(false),
sliderPosition_(0), value_(0), minimum_(0), maximum_(1),
subVisible_(true),
|
271dda4ae
김태훈
엔코더 구현
|
11
|
focused(false), isSliderMoved_(false),
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
12
|
tickInterval(0), bigTickInterval(0)
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
13
14
15
16
17
|
{
groove.load(":/images/slider/groove.png");
sub.load(":/images/slider/humidity.png");
handle.load(":/images/slider/handle_big.png");
updatePixmapPosition();
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
18
19
20
21
22
23
24
25
26
27
28
|
}
void Slider::setSubPixmap(const QPixmap &pixmap)
{
sub = pixmap;
}
void Slider::setSubPixmap(const QString &fileName)
{
setSubPixmap(QPixmap(fileName));
}
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
29
30
31
32
33
34
35
36
37
|
void Slider::setSubVisible(bool visible)
{
if (subVisible_ == visible)
return;
subVisible_ = visible;
update();
}
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
38
39
|
void Slider::setRange(int min, int max)
{
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
40
41
|
if (minimum_ == min && maximum_ == max)
return;
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
42
43
44
45
46
47
48
|
minimum_ = min;
maximum_ = max;
if (value_ < min)
setValue(min);
else if (value_ > max)
setValue(max);
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
49
50
|
update();
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
51
52
53
54
|
}
void Slider::setMinimum(int min)
{
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
55
56
|
if (minimum_ == min)
return;
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
57
58
59
60
|
minimum_ = min;
if (value_ < min)
setValue(min);
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
61
62
|
update();
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
63
64
65
66
|
}
void Slider::setMaximum(int max)
{
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
67
68
|
if (maximum_ == max)
return;
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
69
70
71
72
|
maximum_ = max;
if (value_ > max)
setValue(max);
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
73
74
75
76
77
78
79
|
update();
}
int Slider::value()
{
return value_;
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
}
bool Slider::isSliderDown()
{
return isSliderDown_;
}
int Slider::sliderPosition()
{
return sliderPosition_;
}
void Slider::setSliderPosition(int value)
{
|
271dda4ae
김태훈
엔코더 구현
|
94
|
value = qBound(minimum_, value, maximum_);
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
95
96
97
98
|
if (sliderPosition_ == value)
return;
sliderPosition_ = value;
|
271dda4ae
김태훈
엔코더 구현
|
99
100
|
if (focused)
isSliderMoved_ = true;
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
101
102
103
104
105
|
emit sliderMoved(value);
update();
}
|
271dda4ae
김태훈
엔코더 구현
|
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
bool Slider::isSliderMoved()
{
return isSliderMoved_;
}
void Slider::focusInEvent(QFocusEvent */*event*/)
{
focused = true;
}
void Slider::focusOutEvent(QFocusEvent *event)
{
QWidget::focusOutEvent(event);
focused = false;
if (isSliderMoved_)
{
isSliderMoved_ = false;
value_ = sliderPosition_;
emit valueChanged(value_);
}
}
void Slider::keyPressEvent(QKeyEvent *event)
{
switch (event->key())
{
|
01249f413
김태훈
엔코더 방향 반전. 하드웨어가 변경됨
|
134
|
case 0x01000032: // Turn left
|
271dda4ae
김태훈
엔코더 구현
|
135
136
137
138
139
|
decrease();
break;
case 0x01000031: // Push
event->ignore();
break;
|
01249f413
김태훈
엔코더 방향 반전. 하드웨어가 변경됨
|
140
|
case 0x01000030: // Turn right
|
271dda4ae
김태훈
엔코더 구현
|
141
142
143
144
145
146
147
148
149
|
increase();
break;
}
}
void Slider::keyReleaseEvent(QKeyEvent *event)
{
switch (event->key())
{
|
01249f413
김태훈
엔코더 방향 반전. 하드웨어가 변경됨
|
150
|
case 0x01000032: // Turn left
|
271dda4ae
김태훈
엔코더 구현
|
151
152
153
154
155
|
decrease();
break;
case 0x01000031: // Push
event->ignore();
break;
|
01249f413
김태훈
엔코더 방향 반전. 하드웨어가 변경됨
|
156
|
case 0x01000030: // Turn right
|
271dda4ae
김태훈
엔코더 구현
|
157
158
159
160
|
increase();
break;
}
}
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
161
162
163
164
165
166
167
|
void Slider::mouseMoveEvent(QMouseEvent *event)
{
if (!isSliderDown_)
return;
setSliderPosition(calcSliderPosition(event->x()));
}
|
1fe669c2e
김태훈
슬라이더 동작 개선
|
168
|
void Slider::mousePressEvent(QMouseEvent *event)
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
169
170
|
{
isSliderDown_ = true;
|
935b853a4
김태훈
새 슬라이더 적용
|
171
172
|
emit sliderPressed();
|
1fe669c2e
김태훈
슬라이더 동작 개선
|
173
174
|
setSliderPosition(calcSliderPosition(event->x()));
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
175
176
177
178
179
|
}
void Slider::mouseReleaseEvent(QMouseEvent */*event*/)
{
isSliderDown_ = false;
|
935b853a4
김태훈
새 슬라이더 적용
|
180
|
emit sliderReleased();
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
181
182
183
184
185
|
}
void Slider::paintEvent(QPaintEvent */*event*/)
{
QPainter painter(this);
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
186
|
painter.drawPixmap(groovePoint, groove);
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
187
188
189
|
QPen tickPen(QColor(71, 71, 71));
tickPen.setWidth(2);
painter.setPen(tickPen);
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
190
|
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
|
if (tickInterval)
for (int tick = minimum_; tick <= maximum_; tick += tickInterval)
{
int x = subPoint.x() + calcSubLength(tick);
painter.drawLine(x, groovePoint.y() + 22, x, groovePoint.y() + 28);
}
else
foreach (int tick, ticks)
{
int x = subPoint.x() + calcSubLength(tick);
painter.drawLine(x, groovePoint.y() + 22, x, groovePoint.y() + 28);
}
if (bigTickInterval)
for (int tick = minimum_; tick <= maximum_; tick += bigTickInterval)
{
int x = subPoint.x() + calcSubLength(tick);
painter.drawLine(x, groovePoint.y() + 22, x, groovePoint.y() + 33);
}
else
foreach (int tick, bigTicks)
{
int x = subPoint.x() + calcSubLength(tick);
painter.drawLine(x, groovePoint.y() + 22, x, groovePoint.y() + 33);
}
if (subVisible_)
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
218
|
{
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
219
220
221
|
int subLength = calcSubLength(sliderPosition_);
if (subLength > 0)
painter.drawPixmap(subPoint, sub, QRect(0, 0, subLength, sub.height()));
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
222
|
|
a2de3cbfc
김태훈
수동 요리에 새 슬라이더 적용
|
223
224
225
|
QPoint handlePoint(subPoint.x() + subLength - handle.width() / 2, (height() - handle.height()) / 2);
painter.drawPixmap(handlePoint, handle);
}
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
|
}
void Slider::resizeEvent(QResizeEvent */*event*/)
{
updatePixmapPosition();
}
int Slider::calcSliderPosition(int mouseX)
{
int x = qBound(grooveMin, mouseX, grooveMax);
qreal pos = (qreal) (x - grooveMin) / (grooveMax - grooveMin) * (maximum_ - minimum_) + minimum_;
return qRound(pos);
}
int Slider::calcSubLength(int value)
{
return handle.width() / 4 + (sub.width() - handle.width() / 2) * (value - minimum_) / (maximum_ - minimum_);
}
void Slider::updatePixmapPosition()
{
grooveMin = (width() - sub.width()) / 2;
grooveMax = width() - grooveMin;
groovePoint = QPoint((width() - groove.width()) / 2, (height() - groove.height()) / 2);
subPoint = QPoint((width() - sub.width()) / 2, (height() - sub.height()) / 2);
}
void Slider::setValue(int value)
{
|
271dda4ae
김태훈
엔코더 구현
|
256
|
value = qBound(minimum_, value, maximum_);
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
257
258
|
setSliderPosition(value);
|
d5ad196eb
김태훈
슬라이더 동작 개선
|
259
260
|
if (value == value_)
return;
|
0cbd3823e
김태훈
슬라이더 새로 구현
|
261
262
263
264
|
value_ = value;
emit valueChanged(value);
}
|
271dda4ae
김태훈
엔코더 구현
|
265
266
267
268
269
270
271
272
273
274
|
void Slider::increase()
{
setSliderPosition(sliderPosition_ + 1);
}
void Slider::decrease()
{
setSliderPosition(sliderPosition_ - 1);
}
|