1 //=========================================================
2 // MusE
3 // Linux Music Editor
4 // $Id: nentry.cpp,v 1.1.1.1.2.1 2008/05/21 00:28:54 terminator356 Exp $
5 // (C) Copyright 1999 Werner Schweer (ws@seh.de)
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; version 2 of
10 // the License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 //
21 //=========================================================
22
23 #include <QApplication>
24 #include <QHBoxLayout>
25 #include <QLabel>
26 #include <QLineEdit>
27 #include <QMouseEvent>
28 #include <QTimer>
29 #include <QString>
30 #include <QEvent>
31 #include <QWheelEvent>
32 #include <QKeyEvent>
33 #include <QContextMenuEvent>
34 #include <QWidget>
35
36 #include "nentry.h"
37 #include "gconfig.h"
38
39 #define TIMER1 400
40 #define TIMER2 200
41 #define TIMEC 7
42 #define TIMER3 100
43 #define TIMEC2 20
44 #define TIMER4 50
45
46 namespace MusEGui {
47
NentryFilter(QObject * parent)48 NentryFilter::NentryFilter(QObject* parent)
49 : QObject(parent)
50 {
51 }
52
setText(const QString & s)53 void Nentry::setText(const QString& s)
54 {
55 edit->setText(s);
56 }
57
58 //---------------------------------------------------------
59 // eventFilter
60 //---------------------------------------------------------
61
eventFilter(QObject *,QEvent * event)62 bool NentryFilter::eventFilter(QObject*, QEvent* event)
63 {
64 Nentry* e = (Nentry*)parent();
65 if (event->type() == QEvent::MouseButtonPress) {
66 e->mousePress((QMouseEvent*)event);
67 return true;
68 }
69 if (event->type() == QEvent::MouseMove) {
70 e->mouseMove((QMouseEvent*)event);
71 return true;
72 }
73 if (event->type() == QEvent::MouseButtonDblClick) {
74 e->mouseDoubleClick((QMouseEvent*)event);
75 return true;
76 }
77 if (event->type() == QEvent::MouseButtonRelease) {
78 e->mouseRelease((QMouseEvent*)event);
79 return true;
80 }
81 if (event->type() == QEvent::Wheel) {
82 e->wheel((QWheelEvent*)event);
83 return true;
84 }
85 if (event->type() == QEvent::KeyPress) {
86 return e->keyPress((QKeyEvent*)event);
87 }
88 if (event->type() == QEvent::ContextMenu) {
89 return e->contextMenu((QContextMenuEvent*)event);
90 }
91 return false;
92 }
93
94 //---------------------------------------------------------
95 // Nentry
96 // lineedit int values
97 //---------------------------------------------------------
98
Nentry(QWidget * parent,const QString & txt,int _lPos,bool dark)99 Nentry::Nentry(QWidget* parent, const QString& txt,
100 int _lPos, bool dark) : QFrame(parent)
101 {
102 focusW = 0;
103 lPos = _lPos;
104 edit = new QLineEdit(this);
105 timer = new QTimer(this);
106 filter = new NentryFilter(this);
107 drawFrame = false;
108 edit->installEventFilter(filter);
109 edit->setFrame(drawFrame);
110
111 connect(timer, SIGNAL(timeout()), SLOT(repeat()));
112 connect(edit, SIGNAL(returnPressed()), SLOT(endEdit()));
113 edit->setCursor(QCursor(Qt::ArrowCursor));
114 // edit->setFont(font3);
115 val = 0;
116 layout = new QHBoxLayout(this);
117 if (txt == "") {
118 layout->addWidget(edit, 1, Qt::AlignHCenter);
119 }
120 else {
121 label = new QLabel(txt, this);
122 if (lPos == 0) {
123 layout->addStretch(5);
124 layout->addSpacing(5);
125 layout->addWidget(label);
126 layout->addSpacing(5);
127 layout->addWidget(edit);
128 layout->addSpacing(5);
129 layout->addStretch(5);
130 }
131 else {
132 label->setAlignment(Qt::AlignLeft);
133 layout->addWidget(edit, 0, Qt::AlignRight);
134 layout->addSpacing(5);
135 layout->addWidget(label, 100, Qt::AlignRight|Qt::AlignVCenter);
136 }
137 }
138 if (dark) {
139 setDark();
140 }
141 edit->setFocusPolicy(Qt::NoFocus);
142 }
143
setFocusPolicy(Qt::FocusPolicy policy)144 void Nentry::setFocusPolicy(Qt::FocusPolicy policy)
145 {
146 edit->setFocusPolicy(policy);
147 }
148
setDark()149 void Nentry::setDark()
150 {
151 const QPalette& oldpalette = edit->palette();
152
153 const QColor& newcolor = oldpalette.color(QPalette::Window);
154 QPalette newpalette(oldpalette);
155 newpalette.setColor(QPalette::Base, newcolor);
156
157 edit->setPalette(newpalette);
158 }
159
160 //---------------------------------------------------------
161 // setSize
162 //---------------------------------------------------------
163
setSize(int n)164 void Nentry::setSize(int n)
165 {
166 QString s("0000000000000000");
167 QFontMetrics fm = edit->fontMetrics();
168 int w;
169 if (n <= 16)
170 // Width() is obsolete. Qt >= 5.11 use horizontalAdvance().
171 #if QT_VERSION >= 0x050b00
172 w = fm.horizontalAdvance(s, n);
173 #else
174 w = fm.width(s, n);
175 #endif
176 else
177 // Width() is obsolete. Qt >= 5.11 use horizontalAdvance().
178 #if QT_VERSION >= 0x050b00
179 w = fm.horizontalAdvance('0') * n;
180 #else
181 w = fm.width('0') * n;
182 #endif
183
184 edit->setFixedWidth(w + 14);
185 }
186
187 //---------------------------------------------------------
188 // setFrame
189 //---------------------------------------------------------
190
setFrame(bool flag)191 void Nentry::setFrame(bool flag)
192 {
193 drawFrame = flag;
194 edit->setFrame(drawFrame);
195 }
196
197 //---------------------------------------------------------
198 // endEdit
199 //---------------------------------------------------------
200
endEdit()201 void Nentry::endEdit()
202 {
203 if (edit->isModified()) {
204 if (setSValue(edit->text())) {
205 setString(val, false);
206 return;
207 }
208 edit->setModified(false);
209 }
210 if (focusW)
211 focusW->setFocus();
212 focusW = 0;
213 edit->clearFocus();
214 if (!drawFrame)
215 edit->setFrame(false);
216 setString(val, false);
217 }
218
219 //---------------------------------------------------------
220 // contextMenuEvent
221 //---------------------------------------------------------
222
contextMenu(QContextMenuEvent * e)223 bool Nentry::contextMenu(QContextMenuEvent *e)
224 {
225 e->accept();
226 return true;
227 }
228 //---------------------------------------------------------
229 // mousePress
230 //---------------------------------------------------------
231
mousePress(QMouseEvent * event)232 void Nentry::mousePress(QMouseEvent* event)
233 {
234 button = event->button();
235 starty = event->y();
236 evx = event->x();
237 if (event->button() == Qt::LeftButton) {
238 focusW = qApp->focusWidget();
239 edit->setFocus();
240 edit->setFrame(true);
241 setString(val, true);
242 }
243 else {
244 timecount = 0;
245 repeat();
246 timer->start(TIMER1);
247 }
248 }
249
250 //---------------------------------------------------------
251 // repeat
252 //---------------------------------------------------------
253
repeat()254 void Nentry::repeat()
255 {
256 if (timecount == 1) {
257 ++timecount;
258 timer->stop();
259 timer->start(TIMER2);
260 return;
261 }
262 ++timecount;
263 if (timecount == TIMEC) {
264 timer->stop();
265 timer->start(TIMER3);
266 }
267 if (timecount == TIMEC2) {
268 timer->stop();
269 timer->start(TIMER4);
270 }
271
272 switch (button) {
273 case Qt::LeftButton:
274 if (!MusEGlobal::config.leftMouseButtonCanDecrease)
275 return;
276 // else fall through
277 case Qt::MidButton:
278 decValue(evx);
279 break;
280 case Qt::RightButton:
281 incValue(evx);
282 break;
283 default:
284 break;
285 }
286 if (focusW)
287 focusW->setFocus();
288 edit->clearFocus();
289 }
290
291 //---------------------------------------------------------
292 // mouseRelease
293 //---------------------------------------------------------
294
mouseRelease(QMouseEvent * event)295 void Nentry::mouseRelease(QMouseEvent* event)
296 {
297 button = Qt::NoButton;
298 timer->stop();
299 if (event->button() != Qt::LeftButton) {
300 if (focusW)
301 focusW->setFocus();
302 edit->clearFocus();
303 }
304 }
305
306 //---------------------------------------------------------
307 // mouseMove
308 //---------------------------------------------------------
309
mouseMove(QMouseEvent *)310 void Nentry::mouseMove(QMouseEvent*)
311 {
312 switch (button) {
313 case Qt::LeftButton:
314 break;
315 case Qt::MidButton:
316 break;
317 case Qt::RightButton:
318 break;
319 default:
320 break;
321 }
322 }
323
324 //---------------------------------------------------------
325 // mouseDoubleClick
326 //---------------------------------------------------------
327
mouseDoubleClick(QMouseEvent * event)328 void Nentry::mouseDoubleClick(QMouseEvent* event)
329 {
330 if (event->button() != Qt::LeftButton) {
331 mousePress(event);
332 return;
333 }
334 }
335
336 //---------------------------------------------------------
337 // wheel
338 //---------------------------------------------------------
339
wheel(QWheelEvent * event)340 void Nentry::wheel(QWheelEvent* event)
341 {
342 event->accept();
343
344 const QPoint pixelDelta = event->pixelDelta();
345 const QPoint angleDegrees = event->angleDelta() / 8;
346 int delta = 0;
347 if(!pixelDelta.isNull())
348 delta = pixelDelta.y();
349 else if(!angleDegrees.isNull())
350 delta = angleDegrees.y() / 15;
351 else
352 return;
353
354 if (delta > 0)
355 incValue(delta);
356 else
357 decValue(-delta);
358 }
359
360 //---------------------------------------------------------
361 // setValue
362 //---------------------------------------------------------
363
setValue(int v)364 void Nentry::setValue(int v)
365 {
366 if (v == val)
367 return;
368 if (setString(v)) {
369 if (!drawFrame)
370 edit->setFrame(false);
371 edit->setEnabled(false);
372 }
373 else {
374 edit->setEnabled(true);
375 }
376 val = v;
377 }
378
379 //---------------------------------------------------------
380 // keyPress
381 //---------------------------------------------------------
382
keyPress(QKeyEvent * event)383 bool Nentry::keyPress(QKeyEvent* event)
384 {
385 bool shift = event->modifiers() & Qt::ShiftModifier;
386 bool ctrl = event->modifiers() & Qt::ControlModifier;
387 int key = event->key();
388
389 if (shift) {
390 switch(key) {
391 case Qt::Key_Left:
392 case Qt::Key_Right:
393 return false;
394 default:
395 return true;
396 }
397 return true;
398 }
399 if (ctrl) {
400 switch(key) {
401 case Qt::Key_A:
402 case Qt::Key_B:
403 case Qt::Key_C:
404 case Qt::Key_D:
405 case Qt::Key_E:
406 case Qt::Key_F:
407 case Qt::Key_H:
408 case Qt::Key_V:
409 case Qt::Key_X:
410 case Qt::Key_Z:
411 case Qt::Key_Y:
412 return false;
413 default:
414 return true;
415 }
416 return true;
417 }
418 if (event->modifiers())
419 return true;
420 switch (key) {
421 case Qt::Key_Up: incValue(0); return true;
422 case Qt::Key_Down: decValue(0); return true;
423 case 0x30:
424 case 0x31:
425 case 0x32:
426 case 0x33:
427 case 0x34:
428 case 0x35:
429 case 0x36:
430 case 0x37:
431 case 0x38:
432 case 0x39:
433 case Qt::Key_Minus:
434 case Qt::Key_Left:
435 case Qt::Key_Right:
436 case Qt::Key_Backspace:
437 case Qt::Key_Home:
438 case Qt::Key_End:
439 case Qt::Key_Delete:
440 case Qt::Key_Return:
441 return false;
442 default:
443 break;
444 }
445 return true;
446 }
447
448 } // namespace MusEGui
449