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