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

127 lines
2.7 KiB
C++

#include <swbuttongroup.h>
#include <raDIYoglobals.h>
#include <swradiobutton.h>
#include <QAbstractButton>
#include <QDebug>
SWDialButtonGroup::SWDialButtonGroup(QObject *parent)
: QButtonGroup{parent}
{
}
void SWDialButtonGroup::addKeyButton( SWRadioButton* button, int id, const QString& key )
{
button->setKey( key );
QButtonGroup::addButton( button, id );
}
/**
* @brief Gibt den Button mit gegebenen ID zurück
*/
SWRadioButton& SWDialButtonGroup::buttonAt( int id )
{
// Du HONK! Das ist der Index, _nicht_ die ID
//return *( dynamic_cast<SWDialButton*>( buttons().at( id ) ) );
return *( dynamic_cast<SWRadioButton*>( button( id ) ) );
}
void SWDialButtonGroup::setCurrentActiveId( int newID )
{
// schon Ok, dass darf vorkommen
//Q_ASSERT( newID >= 0 );
//Q_ASSERT( newID < buttons().size() );
if( newID >= 0 && newID < buttons().size() )
{
// unhover & uncheck current button
if( _hoverdID > -1 )
buttonAt( _hoverdID ).unHover();
_checkedID = _hoverdID = newID;
buttonAt(_checkedID ).setChecked( true );
}
}
/**
* @brief 'Klick' von aussen, kommt von den RotaryDials.
* Wird 'umgewandelt' in SIGNAL 'idClicked'
*/
void SWDialButtonGroup::onDialPushed()
{
Q_ASSERT( _hoverdID >= 0 );
Q_ASSERT( _hoverdID < buttons().size() );
emit idClicked( _hoverdID );
}
/**
* @param delta
* Schiebt den 'Hover'-Anzeigestatus zum nächsten Button innerhalb der Buttongroup.
* @param forward Vorwärts, also auf dem Bildschirm nach rechts oder eben nach links.
*
* Das ist ein Hack: Ich möchte einem einzelnen Button den Focus, also hier den Hover-Zustand
* aus dem Programm heraus zuweisen. Das wird für die Steuerung per RotaryDial gebraucht.
* Experimente ::notify( QHoverEvent( QHoverEnter ... ) waren erstmal ohne Wirkung.
* Derzeit wird einfach ein ge-hovertes (helleres) Icon gesetzt.
*/
void SWDialButtonGroup::onDialDeltaChanged( int delta )
{
int listSize = buttons().size();
if( !listSize )
return;
// hatten wir schon einen button ge-hovert?
if( _hoverdID > -1 )
buttonAt( _hoverdID ).unHover();
// wir sucne den nächsten Button zum Hovern, einen,
// der nicht 'gecheckt' oder 'unsichtbar' ist.
//SWRadioButton* tmpBtn = nullptr;
QAbstractButton* tmpBtn = nullptr;
do
{
_hoverdID = ( _hoverdID + delta ) % listSize;
if( _hoverdID < 0 )
_hoverdID = listSize - 1;
//tmpBtn = buttons().at( _hoverdID );
tmpBtn = button( _hoverdID );
}
while( !tmpBtn->isEnabled()|| tmpBtn->isChecked() || !tmpBtn->isVisible() );
//while( !tmpBtn->isVisible() );
buttonAt( _hoverdID ).hover();
}