Files
raDIYo/swadjustabledigit.cpp
2025-08-05 22:36:00 +02:00

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;
}