147 lines
3.3 KiB
C++
147 lines
3.3 KiB
C++
/***************************************************************************
|
|
|
|
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 <QDebug>
|
|
#include <QMouseEvent>
|
|
|
|
#include <swadjustabledigit.h>
|
|
|
|
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;
|
|
|
|
}
|