/*************************************************************************** source::worx raDIYo Copyright © 2020-2022 c.holzheuer chris@sourceworx.org 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; either version 2 of the License, or (at your option) any later version. ***************************************************************************/ #include #include #include using namespace std::chrono; /** * @brief Standartkonstruktor: Erzeugt ein AdjustableDigit Widget, also * eine FlipDigit, deren Zahlerwert per Maus, Touchscreen oder RotaryDial * geändert werden kann. * Erbt von @see SWFlipDigit * @param parent */ SWAdjustableDigit::SWAdjustableDigit( QWidget* parent ) : SWFlipDigit( parent ) { _fontScale = 0.75; //0.85 //_fontFamily = "Valley Grrrl NF"; //_fontFamily = "Lansbury FG"; //_fontFamily = "Selznick Remix NF"; //_fontFamily = "Josefin Sans Thin"; //_fontFamily = "ThickDeco"; } /** * @brief Setzt einen Zahlenwert. Wenn der Wert nicht in den * vorgegebenen Wertebereich passt, wird er angepasst und * SIGNAL valueOverflow ausgelöst. * @see setRange */ void SWAdjustableDigit::setValue( int value ) { _value = qBound( _rangeFrom, value, _rangeTo ); if( value > _rangeTo ) emit valueOverflow( value ); else if( value < _rangeFrom ) emit valueOverflow( value ); preparePixmap(); update(); emit valueChanged( _value ); } /** * @brief Teil der Maussteuerung, mit der Zahlenwert der Klappzahl * geändert werden kann. * @param event */ void SWAdjustableDigit::mousePressEvent( QMouseEvent* event ) { // timer merken _timerID = startTimer( 200 ); // aktuelle Y-Pos/Höhe des Mauszeigers merken, um // delta plus oder minus zu ermitteln _posY = event->pos().y(); int middle = rect().height() / 2; _delta = _posY >= middle ? -1 : +1 ; setValue( _value + _delta ); _waiting = true; } /** * @brief Teil der Maussteuerung, mit der Zahlenwert der Klappzahl * geändert werden kann. * @param event */ void SWAdjustableDigit::mouseMoveEvent( QMouseEvent* event ) { // Wenn wir uns dem Digit 'rausgezappelt haben, dann ist schluss ... if( !rect().contains( event->pos() ) ) mouseReleaseEvent( event ); } /** * @brief Teil der Maussteuerung, mit der Zahlenwert der Klappzahl * geändert werden kann. * @param event */ void SWAdjustableDigit::mouseReleaseEvent( QMouseEvent* ) { // und schluss killTimer( _timerID ); _delta = 0; _timerID = -1; _waiting = false; } /** * @brief Timersteuerung. Verlangsamt die Wertänderung per Maus. */ void SWAdjustableDigit::timerEvent( QTimerEvent* ) { // zwei Fälle: der erste TimerEvent kommt // wenn die 'Festhalthürde' von 200 ms genommen ist, // dann kommen die Hoch/Runterzähl TickerEvents. // zähltimer tick if( !_waiting && _delta ) { setValue( _value + _delta ); return; } // erster Timer: alten Timer wegschmeissen ... killTimer( _timerID ); // ...und den neuen schnelleren starten _timerID = startTimer( 100 ); _waiting = false; }