| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany //
 | 
					
						
							|  |  |  | // written by Christian Daniel                                                   //
 | 
					
						
							| 
									
										
										
										
											2023-11-19 13:31:45 +01:00
										 |  |  | // Copyright (C) 2015-2020, 2023 Edouard Griffiths, F4EXB <f4exb06@gmail.com>    //
 | 
					
						
							|  |  |  | // Copyright (C) 2018 fire <fire@80211.at>                                       //
 | 
					
						
							|  |  |  | // Copyright (C) 2019 Davide Gerhard <rainbow@irh.it>                            //
 | 
					
						
							|  |  |  | // Copyright (C) 2020 Vort <vvort@yandex.ru>                                     //
 | 
					
						
							|  |  |  | // Copyright (C) 2022-2023 Jon Beniston, M7RCE <jon@beniston.com>                //
 | 
					
						
							|  |  |  | // Copyright (C) 2022 Jiří Pinkava <jiri.pinkava@rossum.ai>                      //
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is free software; you can redistribute it and/or modify          //
 | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by          //
 | 
					
						
							|  |  |  | // the Free Software Foundation as version 3 of the License, or                  //
 | 
					
						
							| 
									
										
										
										
											2019-04-11 14:43:33 +02:00
										 |  |  | // (at your option) any later version.                                           //
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful,               //
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | 
					
						
							|  |  |  | // GNU General Public License V3 for more details.                               //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License             //
 | 
					
						
							|  |  |  | // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QKeyEvent>
 | 
					
						
							| 
									
										
										
										
											2017-11-05 13:05:21 +01:00
										 |  |  | #include <QLocale>
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | #include <QMouseEvent>
 | 
					
						
							|  |  |  | #include <QPainter>
 | 
					
						
							|  |  |  | #include <QWheelEvent>
 | 
					
						
							| 
									
										
										
										
											2020-08-12 13:26:49 +03:00
										 |  |  | #include <QApplication>
 | 
					
						
							| 
									
										
										
										
											2023-04-28 15:58:57 +01:00
										 |  |  | #include <QAccessibleValueChangeEvent>
 | 
					
						
							| 
									
										
										
										
											2019-05-11 16:55:39 +02:00
										 |  |  | #include <cstdlib>
 | 
					
						
							| 
									
										
										
										
											2017-11-05 13:05:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | #include "gui/valuedial.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | ValueDial::ValueDial(QWidget *parent, ColorMapper colorMapper) : | 
					
						
							|  |  |  |     QWidget(parent), | 
					
						
							|  |  |  |     m_animationState(0), | 
					
						
							|  |  |  |     m_colorMapper(colorMapper) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     setAutoFillBackground(false); | 
					
						
							|  |  |  |     setAttribute(Qt::WA_OpaquePaintEvent, true); | 
					
						
							|  |  |  |     setAttribute(Qt::WA_NoSystemBackground, true); | 
					
						
							| 
									
										
										
										
											2020-08-12 13:26:49 +03:00
										 |  |  | 	setAttribute(Qt::WA_InputMethodEnabled, true); | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     setMouseTracking(true); | 
					
						
							|  |  |  |     setFocusPolicy(Qt::StrongFocus); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-12 13:26:49 +03:00
										 |  |  | 	setInputMethodHints(Qt::ImhDigitsOnly); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     m_background.setStart(0, 0); | 
					
						
							|  |  |  |     m_background.setFinalStop(0, 1); | 
					
						
							|  |  |  |     m_background.setCoordinateMode(QGradient::ObjectBoundingMode); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ColorMapper::colormap::const_iterator cmit = m_colorMapper.getDialBackgroundColorMap().begin(); | 
					
						
							|  |  |  |     ColorMapper::colormap::const_iterator cmitEnd = m_colorMapper.getDialBackgroundColorMap().end(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; cmit != cmitEnd; ++cmit) { | 
					
						
							|  |  |  |         m_background.setColorAt(cmit->first, cmit->second); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_value = 0; | 
					
						
							|  |  |  |     m_valueNew = 0; | 
					
						
							|  |  |  |     m_valueMin = 0; | 
					
						
							|  |  |  |     m_valueMax = 2200000; | 
					
						
							|  |  |  |     m_numDigits = 7; | 
					
						
							|  |  |  |     m_numDecimalPoints = m_numDigits / 3; | 
					
						
							|  |  |  |     m_cursor = -1; | 
					
						
							|  |  |  |     m_digitWidth = 0; | 
					
						
							|  |  |  |     m_digitHeight = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_hightlightedDigit = -1; | 
					
						
							|  |  |  |     m_text = formatText(m_value); | 
					
						
							|  |  |  |     m_cursorState = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QLocale &cLocale = QLocale::c(); | 
					
						
							| 
									
										
										
										
											2017-11-18 03:51:46 +01:00
										 |  |  |     m_groupSeparator = cLocale.groupSeparator(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     connect(&m_animationTimer, SIGNAL(timeout()), this, SLOT(animate())); | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     connect(&m_blinkTimer, SIGNAL(timeout()), this, SLOT(blink())); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | void ValueDial::setFont(const QFont &font) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     QWidget::setFont(font); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QFontMetrics fm(font); | 
					
						
							| 
									
										
										
										
											2020-11-04 08:59:16 +01:00
										 |  |  |     m_digitWidth = fm.horizontalAdvance('0'); | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     m_digitHeight = fm.ascent(); | 
					
						
							|  |  |  |     if (m_digitWidth < m_digitHeight) { | 
					
						
							|  |  |  |         m_digitWidth = m_digitHeight; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     setFixedWidth((m_numDigits + m_numDecimalPoints) * m_digitWidth + 2); | 
					
						
							|  |  |  |     setFixedHeight(m_digitHeight * 2 + 2); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 18:43:48 +02:00
										 |  |  | void ValueDial::setBold(bool bold) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     QFont f = font(); | 
					
						
							|  |  |  |     f.setBold(bold); | 
					
						
							|  |  |  |     setFont(f); | 
					
						
							| 
									
										
										
										
											2015-07-19 18:43:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ValueDial::setColorMapper(ColorMapper colorMapper) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     m_colorMapper = colorMapper; | 
					
						
							| 
									
										
										
										
											2015-07-19 18:43:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     ColorMapper::colormap::const_iterator cmit = m_colorMapper.getDialBackgroundColorMap().begin(); | 
					
						
							|  |  |  |     ColorMapper::colormap::const_iterator cmitEnd = m_colorMapper.getDialBackgroundColorMap().end(); | 
					
						
							| 
									
										
										
										
											2015-07-19 18:43:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     for (; cmit != cmitEnd; ++cmit) { | 
					
						
							|  |  |  |         m_background.setColorAt(cmit->first, cmit->second); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-19 18:43:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | void ValueDial::setValue(quint64 value) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     m_valueNew = value; | 
					
						
							| 
									
										
										
										
											2023-03-22 17:56:48 +01:00
										 |  |  |     m_textNew = formatText(m_valueNew); | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (m_valueNew < m_valueMin) { | 
					
						
							|  |  |  |         m_valueNew = m_valueMin; | 
					
						
							|  |  |  |     } else if (m_valueNew > m_valueMax) { | 
					
						
							|  |  |  |         m_valueNew = m_valueMax; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 15:58:57 +01:00
										 |  |  |     QAccessibleValueChangeEvent event(this, value); | 
					
						
							|  |  |  |     QAccessible::updateAccessibility(&event); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-22 17:56:48 +01:00
										 |  |  |     if (m_valueNew < m_value) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |         m_animationState = 1; | 
					
						
							| 
									
										
										
										
											2023-03-22 17:56:48 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     else if (m_valueNew > m_value) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |         m_animationState = -1; | 
					
						
							| 
									
										
										
										
											2023-03-22 17:56:48 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_text = m_textNew; | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_animationTimer.start(20); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ValueDial::setValueRange(uint numDigits, quint64 min, quint64 max) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     m_numDigits = numDigits; | 
					
						
							|  |  |  |     m_numDecimalPoints = m_numDigits < 3 ? 0 : (m_numDigits % 3) == 0 ? (m_numDigits / 3) - 1 : m_numDigits / 3; | 
					
						
							|  |  |  |     m_valueMin = min; | 
					
						
							|  |  |  |     m_valueMax = max; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_text = formatText(m_value); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_value < min) { | 
					
						
							|  |  |  |         setValue(min); | 
					
						
							|  |  |  |     } else if (m_value > max) { | 
					
						
							|  |  |  |         setValue(max); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setFixedWidth((m_numDigits + m_numDecimalPoints) * m_digitWidth + 2); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | quint64 ValueDial::findExponent(int digit) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     quint64 e = 1; | 
					
						
							|  |  |  |     int d = (m_numDigits + m_numDecimalPoints) - digit; | 
					
						
							|  |  |  |     d = d - (d / 4) - 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (int i = 0; i < d; i++) { | 
					
						
							|  |  |  |         e *= 10; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return e; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QChar ValueDial::digitNeigh(QChar c, bool dir) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     if (dir) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (c == QChar('0')) { | 
					
						
							|  |  |  |             return QChar('9'); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return QChar::fromLatin1(c.toLatin1() - 1); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (c == QChar('9')) { | 
					
						
							|  |  |  |             return QChar('0'); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return QChar::fromLatin1(c.toLatin1() + 1); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ValueDial::formatText(quint64 value) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     QString str = QString("%1").arg(value, m_numDigits, 10, QChar('0')); | 
					
						
							| 
									
										
										
										
											2017-04-18 01:50:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     for (int i = 0; i < m_numDecimalPoints; i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         int ipoint = m_numDigits - 3 - 3 * i; | 
					
						
							| 
									
										
										
										
											2017-04-18 01:50:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |         if (ipoint != 0) | 
					
						
							|  |  |  |         { // do not insert leading point
 | 
					
						
							|  |  |  |             const QLocale &cLocale = QLocale::c(); | 
					
						
							|  |  |  |             str.insert(ipoint, cLocale.groupSeparator()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-04-18 01:50:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     return str; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | void ValueDial::paintEvent(QPaintEvent *) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     QPainter painter(this); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     painter.setPen(Qt::black); | 
					
						
							|  |  |  |     painter.setBrush(m_background); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     painter.drawRect(0, 0, width() - 1, height() - 1); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     painter.setPen(m_colorMapper.getBoundaryColor()); | 
					
						
							|  |  |  |     painter.setBrush(Qt::NoBrush); | 
					
						
							| 
									
										
										
										
											2018-11-18 11:06:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     for (int i = 1; i < m_numDigits + m_numDecimalPoints; i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         painter.setPen(m_colorMapper.getBoundaryColor()); | 
					
						
							|  |  |  |         painter.drawLine(1 + i * m_digitWidth, 1, 1 + i * m_digitWidth, height() - 1); | 
					
						
							|  |  |  |         painter.setPen(m_colorMapper.getBoundaryAlphaColor()); | 
					
						
							|  |  |  |         painter.drawLine(0 + i * m_digitWidth, 1, 0 + i * m_digitWidth, height() - 1); | 
					
						
							|  |  |  |         painter.drawLine(2 + i * m_digitWidth, 1, 2 + i * m_digitWidth, height() - 1); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-11-18 11:06:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     painter.setPen(m_colorMapper.getBoundaryAlphaColor()); | 
					
						
							|  |  |  |     painter.drawLine(1, 1, 1, height() - 1); | 
					
						
							|  |  |  |     painter.drawLine(width() - 2, 1, width() - 2, height() - 1); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     // dial borders
 | 
					
						
							| 
									
										
										
										
											2017-05-16 20:21:32 +02:00
										 |  |  |     painter.setPen(m_colorMapper.getDarkBorderColor()); | 
					
						
							| 
									
										
										
										
											2017-05-17 00:19:21 +02:00
										 |  |  |     painter.drawLine(0, 0, width() - 2, 0); | 
					
						
							| 
									
										
										
										
											2017-05-16 20:21:32 +02:00
										 |  |  |     painter.drawLine(0, height() - 1, 0, 0); | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     painter.setPen(m_colorMapper.getLightBorderColor()); | 
					
						
							| 
									
										
										
										
											2017-05-17 00:19:21 +02:00
										 |  |  |     painter.drawLine(1, height() - 1, width() - 1, height() - 1); | 
					
						
							|  |  |  |     painter.drawLine(width() - 1, height() - 1, width() - 1, 0); | 
					
						
							| 
									
										
										
										
											2017-05-16 20:21:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     if (m_hightlightedDigit >= 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         painter.setPen(Qt::NoPen); | 
					
						
							|  |  |  |         painter.setBrush(m_colorMapper.getHighlightColor()); | 
					
						
							|  |  |  |         painter.drawRect(2 + m_hightlightedDigit * m_digitWidth, 1, m_digitWidth - 1, height() - 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-08 22:12:20 +01:00
										 |  |  |     QColor secondaryForegroundColor = m_colorMapper.getSecondaryForegroundColor(); | 
					
						
							|  |  |  |     if (!isEnabled()) { | 
					
						
							|  |  |  |         secondaryForegroundColor = secondaryForegroundColor.darker(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     if (m_animationState == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (int i = 0; i < m_text.length(); i++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             painter.setClipRect(1 + i * m_digitWidth, 1, m_digitWidth, m_digitHeight * 2); | 
					
						
							| 
									
										
										
										
											2022-07-08 22:12:20 +01:00
										 |  |  |             painter.setPen(secondaryForegroundColor); | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |             painter.drawText(QRect(1 + i * m_digitWidth, m_digitHeight * 0.6, m_digitWidth, m_digitHeight), Qt::AlignCenter, m_text.mid(i, 1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_text[i] != m_groupSeparator) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 painter.setPen(m_colorMapper.getForegroundColor()); | 
					
						
							|  |  |  |                 painter.drawText(QRect(1 + i * m_digitWidth, m_digitHeight * -0.7, m_digitWidth, m_digitHeight), Qt::AlignCenter, digitNeigh(m_text[i], true)); | 
					
						
							|  |  |  |                 painter.drawText(QRect(1 + i * m_digitWidth, m_digitHeight * 1.9, m_digitWidth, m_digitHeight), Qt::AlignCenter, digitNeigh(m_text[i], false)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         painter.setClipping(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ((m_cursor >= 0) && (m_cursorState)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             painter.setPen(Qt::NoPen); | 
					
						
							| 
									
										
										
										
											2022-07-08 22:12:20 +01:00
										 |  |  |             painter.setBrush(secondaryForegroundColor); | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |             painter.drawRect(4 + m_cursor * m_digitWidth, 1 + m_digitHeight * 1.5, m_digitWidth - 5, m_digitHeight / 6); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-11-18 11:06:41 +01:00
										 |  |  |         for (int i = 0; i < m_text.length(); i++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (m_text[i] == m_textNew[i]) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 painter.setClipRect(1 + i * m_digitWidth, 1, m_digitWidth, m_digitHeight * 2); | 
					
						
							| 
									
										
										
										
											2022-07-08 22:12:20 +01:00
										 |  |  |                 painter.setPen(secondaryForegroundColor); | 
					
						
							| 
									
										
										
										
											2018-11-18 11:06:41 +01:00
										 |  |  |                 painter.drawText(QRect(1 + i * m_digitWidth, m_digitHeight * 0.6, m_digitWidth, m_digitHeight), Qt::AlignCenter, m_text.mid(i, 1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (m_text[i] != m_groupSeparator) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     painter.setPen(m_colorMapper.getForegroundColor()); | 
					
						
							|  |  |  |                     painter.drawText(QRect(1 + i * m_digitWidth, m_digitHeight * -0.7, m_digitWidth, m_digitHeight), Qt::AlignCenter, digitNeigh(m_text[i], true)); | 
					
						
							|  |  |  |                     painter.drawText(QRect(1 + i * m_digitWidth, m_digitHeight * 1.9, m_digitWidth, m_digitHeight), Qt::AlignCenter, digitNeigh(m_text[i], false)); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 int h = m_digitHeight * 0.6 + m_digitHeight * m_animationState / 2.0; | 
					
						
							|  |  |  |                 painter.setClipRect(1 + i * m_digitWidth, 1, m_digitWidth, m_digitHeight * 2); | 
					
						
							| 
									
										
										
										
											2022-07-08 22:12:20 +01:00
										 |  |  |                 painter.setPen(secondaryForegroundColor); | 
					
						
							| 
									
										
										
										
											2018-11-18 11:06:41 +01:00
										 |  |  |                 painter.drawText(QRect(1 + i * m_digitWidth, h, m_digitWidth, m_digitHeight), Qt::AlignCenter, m_text.mid(i, 1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (m_text[i] != m_groupSeparator) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     painter.setPen(m_colorMapper.getForegroundColor()); | 
					
						
							|  |  |  |                     painter.drawText(QRect(1 + i * m_digitWidth, h + m_digitHeight * -0.7, m_digitWidth, m_digitHeight), Qt::AlignCenter, digitNeigh(m_text[i], true)); | 
					
						
							|  |  |  |                     painter.drawText(QRect(1 + i * m_digitWidth, h + m_digitHeight * 1.9, m_digitWidth, m_digitHeight), Qt::AlignCenter, digitNeigh(m_text[i], false)); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | void ValueDial::mousePressEvent(QMouseEvent *event) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     i = (event->x() - 1) / m_digitWidth; | 
					
						
							| 
									
										
										
										
											2016-11-19 12:19:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     if (m_text[i] == m_groupSeparator) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         i++; | 
					
						
							| 
									
										
										
										
											2016-11-19 12:19:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |         if (i > m_numDigits + m_numDecimalPoints) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-11-19 12:19:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Qt::MouseButton mouseButton = event->button(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (mouseButton == Qt::RightButton) // ceil value at current digit
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |         if (m_cursor >= 0) | 
					
						
							| 
									
										
										
										
											2016-11-19 12:19:00 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             m_cursor = -1; | 
					
						
							|  |  |  |             m_blinkTimer.stop(); | 
					
						
							|  |  |  |             update(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         quint64 e = findExponent(i); | 
					
						
							|  |  |  |         m_valueNew = (m_value / e) * e; | 
					
						
							|  |  |  |         setValue(m_valueNew); | 
					
						
							|  |  |  |         emit changed(m_valueNew); | 
					
						
							|  |  |  |         //qDebug("ValueDial::mousePressEvent: Qt::RightButton: i: %d e: %llu new: %llu", i, e, valueNew);
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (mouseButton == Qt::LeftButton) // set cursor at current digit
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-08-12 13:26:49 +03:00
										 |  |  | 		if (qApp->autoSipEnabled()) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			QGuiApplication::inputMethod()->show(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-19 12:19:00 +01:00
										 |  |  |         m_cursor = i; | 
					
						
							|  |  |  |         m_cursorState = true; | 
					
						
							|  |  |  |         m_blinkTimer.start(400); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         update(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | void ValueDial::mouseMoveEvent(QMouseEvent *event) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     int i; | 
					
						
							|  |  |  |     i = (event->x() - 1) / m_digitWidth; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-17 14:41:55 +00:00
										 |  |  |     if ((i >= m_text.size()) || (m_text[i] == m_groupSeparator)) { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |         i = -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     if (i != m_hightlightedDigit) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_hightlightedDigit = i; | 
					
						
							|  |  |  |         update(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | void ValueDial::wheelEvent(QWheelEvent *event) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2022-09-24 21:20:56 +02:00
										 |  |  |     i = (event->position().x() - 1) / m_digitWidth; | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (m_text[i] != m_groupSeparator) { | 
					
						
							|  |  |  |         m_hightlightedDigit = i; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_cursor >= 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_cursor = -1; | 
					
						
							|  |  |  |         m_blinkTimer.stop(); | 
					
						
							|  |  |  |         update(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     quint64 e = findExponent(m_hightlightedDigit); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_animationState == 0) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-09-24 20:23:28 +02:00
										 |  |  |         if (event->angleDelta().y() < 0) | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2017-05-18 01:48:52 +02:00
										 |  |  |             if (event->modifiers() & Qt::ShiftModifier) { | 
					
						
							|  |  |  |                 e *= 5; | 
					
						
							|  |  |  |             } else if (event->modifiers() & Qt::ControlModifier) { | 
					
						
							|  |  |  |                 e *= 2; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (m_value < e) { | 
					
						
							|  |  |  |                 m_valueNew = m_valueMin; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 m_valueNew = m_value - e; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2017-05-18 01:48:52 +02:00
										 |  |  |             if (event->modifiers() & Qt::ShiftModifier) { | 
					
						
							|  |  |  |                 e *= 5; | 
					
						
							|  |  |  |             } else if (event->modifiers() & Qt::ControlModifier) { | 
					
						
							|  |  |  |                 e *= 2; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (m_valueMax - m_value < e) { | 
					
						
							|  |  |  |                 m_valueNew = m_valueMax; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 m_valueNew = m_value + e; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         setValue(m_valueNew); | 
					
						
							|  |  |  |         emit changed(m_valueNew); | 
					
						
							|  |  |  |         event->accept(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | void ValueDial::leaveEvent(QEvent *) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     if (m_hightlightedDigit != -1) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_hightlightedDigit = -1; | 
					
						
							|  |  |  |         update(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | void ValueDial::keyPressEvent(QKeyEvent *value) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     if (m_cursor >= 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ((value->key() == Qt::Key_Return) || (value->key() == Qt::Key_Enter) || (value->key() == Qt::Key_Escape)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_cursor = -1; | 
					
						
							|  |  |  |             m_cursorState = false; | 
					
						
							|  |  |  |             m_blinkTimer.stop(); | 
					
						
							|  |  |  |             update(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ((m_cursor < 0) && (m_hightlightedDigit >= 0)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_cursor = m_hightlightedDigit; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_text[m_cursor] == m_groupSeparator) { | 
					
						
							|  |  |  |             m_cursor++; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_cursor >= m_numDigits + m_numDecimalPoints) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         m_cursorState = true; | 
					
						
							|  |  |  |         m_blinkTimer.start(400); | 
					
						
							|  |  |  |         update(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_cursor < 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ((value->key() == Qt::Key_Left) || (value->key() == Qt::Key_Backspace)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (m_cursor > 0) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_cursor--; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_text[m_cursor] == m_groupSeparator) { | 
					
						
							|  |  |  |                 m_cursor--; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_cursor < 0) { | 
					
						
							|  |  |  |                 m_cursor++; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             m_cursorState = true; | 
					
						
							|  |  |  |             update(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (value->key() == Qt::Key_Right) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (m_cursor < m_numDecimalPoints + m_numDigits) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_cursor++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_text[m_cursor] == m_groupSeparator) { | 
					
						
							|  |  |  |                 m_cursor++; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_cursor >= m_numDecimalPoints + m_numDigits) { | 
					
						
							|  |  |  |                 m_cursor--; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             m_cursorState = true; | 
					
						
							|  |  |  |             update(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (value->key() == Qt::Key_Up) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         quint64 e = findExponent(m_cursor); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-18 01:48:52 +02:00
										 |  |  |         if (value->modifiers() & Qt::ShiftModifier) { | 
					
						
							|  |  |  |             e *= 5; | 
					
						
							|  |  |  |         } else if (value->modifiers() & Qt::ControlModifier) { | 
					
						
							|  |  |  |             e *= 2; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (m_animationState != 0) { | 
					
						
							|  |  |  |             m_value = m_valueNew; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_valueMax - m_value < e) { | 
					
						
							|  |  |  |             m_valueNew = m_valueMax; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             m_valueNew = m_value + e; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         setValue(m_valueNew); | 
					
						
							|  |  |  |         emit changed(m_valueNew); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (value->key() == Qt::Key_Down) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         quint64 e = findExponent(m_cursor); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-18 01:48:52 +02:00
										 |  |  |         if (value->modifiers() & Qt::ShiftModifier) { | 
					
						
							|  |  |  |             e *= 5; | 
					
						
							|  |  |  |         } else if (value->modifiers() & Qt::ControlModifier) { | 
					
						
							|  |  |  |             e *= 2; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (m_animationState != 0) { | 
					
						
							|  |  |  |             m_value = m_valueNew; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_value < e) { | 
					
						
							|  |  |  |             m_valueNew = m_valueMin; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             m_valueNew = m_value - e; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         setValue(m_valueNew); | 
					
						
							|  |  |  |         emit changed(m_valueNew); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (value->text().length() != 1) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QChar c = value->text()[0]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (c >= QChar('0') && (c <= QChar('9'))) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (m_animationState != 0) { | 
					
						
							|  |  |  |             m_value = m_valueNew; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 16:26:27 +01:00
										 |  |  |         int d = c.toLatin1() - '0'; | 
					
						
							|  |  |  |         quint64 e = findExponent(m_cursor); | 
					
						
							|  |  |  |         quint64 v = (m_value / e) % 10; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |         v = m_value - v * e; | 
					
						
							|  |  |  |         v += d * e; | 
					
						
							|  |  |  |         setValue(v); | 
					
						
							|  |  |  |         emit changed(m_valueNew); | 
					
						
							|  |  |  |         m_cursor++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_text[m_cursor] == m_groupSeparator) { | 
					
						
							|  |  |  |             m_cursor++; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_cursor >= m_numDigits + m_numDecimalPoints) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_cursor = -1; | 
					
						
							|  |  |  |             m_blinkTimer.stop(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_cursorState = true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         update(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | void ValueDial::focusInEvent(QFocusEvent *) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     if (m_cursor == -1) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_cursor = 0; | 
					
						
							|  |  |  |         m_cursorState = true; | 
					
						
							|  |  |  |         m_blinkTimer.start(400); | 
					
						
							|  |  |  |         update(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  | void ValueDial::focusOutEvent(QFocusEvent *) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     m_cursor = -1; | 
					
						
							|  |  |  |     m_blinkTimer.stop(); | 
					
						
							|  |  |  |     update(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ValueDial::animate() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     update(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_animationState > 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_animationState++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (m_animationState < 0) { | 
					
						
							|  |  |  |         m_animationState--; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_animationTimer.stop(); | 
					
						
							|  |  |  |         m_animationState = 0; | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (abs(m_animationState) >= 4) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_animationState = 0; | 
					
						
							|  |  |  |         m_animationTimer.stop(); | 
					
						
							|  |  |  |         m_value = m_valueNew; | 
					
						
							|  |  |  |         m_text = m_textNew; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ValueDial::blink() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-26 11:34:35 +02:00
										 |  |  |     if (m_cursor >= 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_cursorState = !m_cursorState; | 
					
						
							|  |  |  |         update(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } |