getting rid of the confusing QskAbstractButton::Checkable state

This commit is contained in:
Uwe Rathmann 2021-08-04 08:24:36 +02:00
parent 1b4be3bc23
commit 66cc68bcda
13 changed files with 67 additions and 45 deletions

View File

@ -27,7 +27,7 @@ void SwitchButtonPage::populate()
hbox1->setSizePolicy( Qt::Vertical, QskSizePolicy::Fixed ); hbox1->setSizePolicy( Qt::Vertical, QskSizePolicy::Fixed );
hbox1->setExtraSpacingAt( Qt::LeftEdge ); hbox1->setExtraSpacingAt( Qt::LeftEdge );
auto label = new QskTextLabel( "Disable the boxes: ", hbox1 ); auto label = new QskTextLabel( "Disable the switches:", hbox1 );
label->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); label->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed );
auto button0 = new QskSwitchButton( hbox1 ); auto button0 = new QskSwitchButton( hbox1 );

View File

@ -45,7 +45,6 @@ MyToggleButton::MyToggleButton( QQuickItem* parent )
: Inherited( parent ) : Inherited( parent )
, m_data( new PrivateData() ) , m_data( new PrivateData() )
{ {
setCheckable( true );
setAcceptHoverEvents( false ); setAcceptHoverEvents( false );
initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed );
@ -55,6 +54,11 @@ MyToggleButton::~MyToggleButton()
{ {
} }
bool MyToggleButton::isCheckable() const
{
return true;
}
void MyToggleButton::setInverted( bool on ) void MyToggleButton::setInverted( bool on )
{ {
if ( m_data->inverted != on ) if ( m_data->inverted != on )

View File

@ -23,6 +23,8 @@ class MyToggleButton : public QskAbstractButton
MyToggleButton( QQuickItem* parent = nullptr ); MyToggleButton( QQuickItem* parent = nullptr );
~MyToggleButton() override; ~MyToggleButton() override;
bool isCheckable() const override final;
void setTextAt( int index, const QString& ); void setTextAt( int index, const QString& );
QString textAt( int index ) const; QString textAt( int index ) const;

View File

@ -335,7 +335,7 @@ void Editor::setupPushButton()
setFontRole( Q::Text, ButtonFontRole ); setFontRole( Q::Text, ButtonFontRole );
setAlignment( Q::Text, Qt::AlignCenter ); setAlignment( Q::Text, Qt::AlignCenter );
for ( auto state1 : { A::NoState, Q::Checkable, Q::Focused, Q::Focused | Q::Checkable } ) for ( auto state1 : { A::NoState, Q::Focused } )
{ {
setBoxBorderColors( Q::Panel | Q::Hovered | state1, borderColors ); setBoxBorderColors( Q::Panel | Q::Hovered | state1, borderColors );
setBoxBorderColors( Q::Panel | Q::Hovered | Q::Flat | state1, borderColors ); setBoxBorderColors( Q::Panel | Q::Hovered | Q::Flat | state1, borderColors );
@ -387,7 +387,7 @@ void Editor::setupDialogButton()
setFontRole( Q::Text, ButtonFontRole ); setFontRole( Q::Text, ButtonFontRole );
setAlignment( Q::Text, Qt::AlignCenter ); setAlignment( Q::Text, Qt::AlignCenter );
for ( auto state1 : { A::NoState, Q::Checkable, Q::Focused, Q::Focused | Q::Checkable } ) for ( auto state1 : { A::NoState, Q::Focused } )
{ {
setBoxBorderColors( Q::Panel | Q::Hovered | state1, borderColors ); setBoxBorderColors( Q::Panel | Q::Hovered | state1, borderColors );
@ -502,8 +502,8 @@ void Editor::setupSwitchButton()
setStrutSize( Q::Groove | A::Vertical, grooveSize.transposed() ); setStrutSize( Q::Groove | A::Vertical, grooveSize.transposed() );
setGradient( Q::Groove, m_pal.darker125 ); setGradient( Q::Groove, m_pal.darker125 );
setGradient( Q::Groove | Q::Checkable | Q::Disabled, m_pal.lighter150 ); setGradient( Q::Groove | Q::Disabled, m_pal.lighter150 );
setGradient( Q::Groove | Q::Checkable | Q::Checked, m_pal.darker200 ); setGradient( Q::Groove | Q::Checked, m_pal.darker200 );
setBoxBorderColors( Q::Groove, m_pal.darker200 ); setBoxBorderColors( Q::Groove, m_pal.darker200 );
setBoxBorderMetrics( Q::Groove, 2 ); setBoxBorderMetrics( Q::Groove, 2 );
@ -514,7 +514,7 @@ void Editor::setupSwitchButton()
setBoxBorderMetrics( Q::Handle, 2 ); setBoxBorderMetrics( Q::Handle, 2 );
setGradient( Q::Handle, QskGradient( Qt::Vertical, m_pal.lighter150, m_pal.lighter125 ) ); setGradient( Q::Handle, QskGradient( Qt::Vertical, m_pal.lighter150, m_pal.lighter125 ) );
setGradient( Q::Handle | Q::Checkable | Q::Checked, m_pal.accentColor ); setGradient( Q::Handle | Q::Checked, m_pal.accentColor );
setGradient( Q::Handle | Q::Disabled, m_pal.lighter125 ); setGradient( Q::Handle | Q::Disabled, m_pal.lighter125 );
setBoxBorderColors( Q::Handle, m_pal.darker200 ); setBoxBorderColors( Q::Handle, m_pal.darker200 );
@ -522,7 +522,7 @@ void Editor::setupSwitchButton()
for( auto state : { A::NoState, Q::Disabled } ) for( auto state : { A::NoState, Q::Disabled } )
{ {
auto aspect = Q::Handle | Q::Checkable | state | A::Position; auto aspect = Q::Handle | state | A::Position;
setMetric( aspect, 0 ); setMetric( aspect, 0 );
setMetric( aspect | Q::Checked, 1 ); setMetric( aspect | Q::Checked, 1 );
@ -581,7 +581,7 @@ void Editor::setupTabButton()
setBoxBorderColors( aspect, borderColors ); setBoxBorderColors( aspect, borderColors );
borderColors.setColorsAt( edge, m_pal.accentColor ); borderColors.setColorsAt( edge, m_pal.accentColor );
for ( auto state : { Q::Checked, Q::Pressed, Q::Checkable | Q::Hovered } ) for ( auto state : { Q::Checked, Q::Pressed, Q::Hovered } )
setBoxBorderColors( aspect | state, borderColors ); setBoxBorderColors( aspect | state, borderColors );
} }
@ -592,8 +592,7 @@ void Editor::setupTabButton()
setAlignment( Q::Text, Qt::AlignCenter ); setAlignment( Q::Text, Qt::AlignCenter );
setColor( Q::Text, m_pal.textColor ); setColor( Q::Text, m_pal.textColor );
setColor( Q::Text | Q::Checkable | Q::Disabled, qskShadedColor( m_pal.textColor, 0.6 ) ); setColor( Q::Text | Q::Disabled, qskShadedColor( m_pal.textColor, 0.6 ) );
setColor( Q::Text | Q::Disabled, QskRgb::Grey600 );
} }
void Editor::setupTabBar() void Editor::setupTabBar()

View File

@ -437,14 +437,11 @@ void Editor::setupPushButton()
setPadding( Q::Panel, 10 ); setPadding( Q::Panel, 10 );
setMetric( Q::Panel | A::Spacing, 4 ); setMetric( Q::Panel | A::Spacing, 4 );
for ( auto state : { A::NoState, Q::Checkable } ) setButton( Q::Panel, Raised );
{ setButton( Q::Panel | Q::Flat | Q::Hovered, Raised );
setButton( Q::Panel | state, Raised );
setButton( Q::Panel | Q::Flat | Q::Hovered | state, Raised );
setButton( Q::Panel | Q::Flat | state, Flat ); setButton( Q::Panel | Q::Flat, Flat );
setButton( Q::Panel | Q::Flat | Q::Disabled | state, Flat ); setButton( Q::Panel | Q::Flat | Q::Disabled, Flat );
}
for ( auto state : { Q::Pressed, Q::Checked } ) for ( auto state : { Q::Pressed, Q::Checked } )
{ {
@ -601,7 +598,7 @@ void Editor::setupTabButton()
// text // text
setAlignment( Q::Text, Qt::AlignCenter ); setAlignment( Q::Text, Qt::AlignCenter );
setColor( Q::Text, m_pal.themeForeground ); setColor( Q::Text, m_pal.themeForeground );
setColor( Q::Text | Q::Checkable | Q::Disabled, m_pal.darker200 ); setColor( Q::Text | Q::Disabled, m_pal.darker200 );
} }
void Editor::setupSlider() void Editor::setupSlider()
@ -868,8 +865,8 @@ void Editor::setupSwitchButton()
setStrutSize( Q::Groove | A::Vertical, grooveSize.transposed() ); setStrutSize( Q::Groove | A::Vertical, grooveSize.transposed() );
setGradient( Q::Groove, m_pal.theme ); setGradient( Q::Groove, m_pal.theme );
setGradient( Q::Groove | Q::Checkable | Q::Checked, m_pal.highlighted ); setGradient( Q::Groove | Q::Checked, m_pal.highlighted );
setGradient( Q::Groove | Q::Checkable | Q::Disabled, m_pal.lighter150 ); setGradient( Q::Groove | Q::Disabled, m_pal.lighter150 );
setBoxBorderColors( Q::Groove | Q::Disabled, m_pal.theme ); setBoxBorderColors( Q::Groove | Q::Disabled, m_pal.theme );
setBoxBorderMetrics( Q::Groove, 2 ); setBoxBorderMetrics( Q::Groove, 2 );
@ -887,7 +884,7 @@ void Editor::setupSwitchButton()
for( auto state : { A::NoState, Q::Disabled } ) for( auto state : { A::NoState, Q::Disabled } )
{ {
auto aspect = Q::Handle | Q::Checkable | state | A::Position; auto aspect = Q::Handle | state | A::Position;
setMetric( aspect, 0 ); setMetric( aspect, 0 );
setMetric( aspect | Q::Checked, 1 ); setMetric( aspect | Q::Checked, 1 );

View File

@ -12,12 +12,13 @@
// Flat/Checkable are no states - we need to get rid of them. TODO ... // Flat/Checkable are no states - we need to get rid of them. TODO ...
QSK_SYSTEM_STATE( QskAbstractButton, Flat, QskAspect::FirstSystemState << 1 ) QSK_SYSTEM_STATE( QskAbstractButton, Flat, QskAspect::FirstSystemState << 1 )
#if 1 #if 1
// Wrong: we are overlapping with the user states, TODO ... // Wrong: we are overlapping with the user states, TODO ...
QSK_STATE( QskAbstractButton, Checked, QskAspect::LastUserState ) QSK_STATE( QskAbstractButton, Checked, QskAspect::LastUserState )
#endif #endif
QSK_SYSTEM_STATE( QskAbstractButton, Pressed, QskAspect::LastSystemState >> 3 ) QSK_SYSTEM_STATE( QskAbstractButton, Pressed, QskAspect::LastSystemState >> 3 )
QSK_SYSTEM_STATE( QskAbstractButton, Checkable, QskAspect::LastSystemState >> 2 )
static QskAbstractButton* qskCheckedSibling( const QskAbstractButton* button ) static QskAbstractButton* qskCheckedSibling( const QskAbstractButton* button )
{ {
@ -82,7 +83,7 @@ void QskAbstractButton::releaseButton()
if ( !isPressed() ) if ( !isPressed() )
return; return;
if ( skinState() & Checkable ) if ( isCheckable() )
{ {
// we will have toggled before released, // we will have toggled before released,
// maybe there is more work to have the signals coming // maybe there is more work to have the signals coming
@ -136,18 +137,9 @@ void QskAbstractButton::setPressed( bool on )
} }
} }
void QskAbstractButton::setCheckable( bool on )
{
if ( on == isCheckable() )
return;
setSkinStateFlag( Checkable, on );
Q_EMIT checkableChanged( on );
}
bool QskAbstractButton::isCheckable() const bool QskAbstractButton::isCheckable() const
{ {
return skinState() & Checkable; return false;
} }
void QskAbstractButton::setChecked( bool on ) void QskAbstractButton::setChecked( bool on )

View File

@ -12,9 +12,6 @@ class QSK_EXPORT QskAbstractButton : public QskControl
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY( bool checkable READ isCheckable
WRITE setCheckable NOTIFY checkableChanged FINAL )
Q_PROPERTY( bool autoRepeat READ autoRepeat Q_PROPERTY( bool autoRepeat READ autoRepeat
WRITE setAutoRepeat NOTIFY autoRepeatChanged FINAL ) WRITE setAutoRepeat NOTIFY autoRepeatChanged FINAL )
@ -36,14 +33,12 @@ class QSK_EXPORT QskAbstractButton : public QskControl
using Inherited = QskControl; using Inherited = QskControl;
public: public:
QSK_STATES( Flat, Checked, Pressed, Checkable ) QSK_STATES( Flat, Checked, Pressed )
QskAbstractButton( QQuickItem* parent = nullptr ); QskAbstractButton( QQuickItem* parent = nullptr );
~QskAbstractButton() override; ~QskAbstractButton() override;
void setCheckable( bool ); virtual bool isCheckable() const;
bool isCheckable() const;
bool isChecked() const; bool isChecked() const;
void setPressed( bool on ); void setPressed( bool on );

View File

@ -25,7 +25,7 @@ class QskPushButton::PrivateData
public: public:
PrivateData( const QString& txt ) PrivateData( const QString& txt )
: text( txt ) : text( txt )
, graphicSourceSize( -1, -1 ) , isCheckable( false )
, isGraphicSourceDirty( false ) , isGraphicSourceDirty( false )
{ {
textOptions.setElideMode( Qt::ElideMiddle ); textOptions.setElideMode( Qt::ElideMiddle );
@ -50,6 +50,7 @@ class QskPushButton::PrivateData
QSizeF graphicSourceSize; QSizeF graphicSourceSize;
bool isCheckable : 1;
bool isGraphicSourceDirty : 1; bool isGraphicSourceDirty : 1;
}; };
@ -69,6 +70,20 @@ QskPushButton::~QskPushButton()
{ {
} }
void QskPushButton::setCheckable( bool on )
{
if ( on != m_data->isCheckable )
{
m_data->isCheckable = on;
Q_EMIT checkableChanged( on );
}
}
bool QskPushButton::isCheckable() const
{
return m_data->isCheckable;
}
void QskPushButton::setCorner( const QskCorner& corner ) void QskPushButton::setCorner( const QskCorner& corner )
{ {
if ( setBoxShapeHint( Panel, corner.metrics() ) ) if ( setBoxShapeHint( Panel, corner.metrics() ) )

View File

@ -33,6 +33,9 @@ class QSK_EXPORT QskPushButton : public QskAbstractButton
WRITE setGraphicSourceSize RESET resetGraphicSourceSize WRITE setGraphicSourceSize RESET resetGraphicSourceSize
NOTIFY graphicSourceSizeChanged FINAL ) NOTIFY graphicSourceSizeChanged FINAL )
Q_PROPERTY( bool checkable READ isCheckable
WRITE setCheckable NOTIFY checkableChanged FINAL )
Q_PROPERTY( bool flat READ isFlat WRITE setFlat NOTIFY flatChanged FINAL ) Q_PROPERTY( bool flat READ isFlat WRITE setFlat NOTIFY flatChanged FINAL )
Q_PROPERTY( QskCorner corner READ corner WRITE setCorner NOTIFY cornerChanged ) Q_PROPERTY( QskCorner corner READ corner WRITE setCorner NOTIFY cornerChanged )
@ -46,6 +49,9 @@ class QSK_EXPORT QskPushButton : public QskAbstractButton
~QskPushButton() override; ~QskPushButton() override;
void setCheckable( bool );
bool isCheckable() const override final;
void setCorner( const QskCorner& ); void setCorner( const QskCorner& );
QskCorner corner() const; QskCorner corner() const;
@ -76,8 +82,8 @@ class QSK_EXPORT QskPushButton : public QskAbstractButton
void setGraphicSourceSize( const QSizeF& ); void setGraphicSourceSize( const QSizeF& );
Q_SIGNALS: Q_SIGNALS:
void checkableChanged( bool );
void cornerChanged(); void cornerChanged();
void borderWidthChanged();
void textChanged(); void textChanged();
void textOptionsChanged(); void textOptionsChanged();
void flatChanged(); void flatChanged();

View File

@ -23,7 +23,6 @@ QskSwitchButton::QskSwitchButton( Qt::Orientation orientation, QQuickItem* paren
: QskAbstractButton( parent ) : QskAbstractButton( parent )
, m_data( new PrivateData( orientation ) ) , m_data( new PrivateData( orientation ) )
{ {
setCheckable( true );
initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed );
} }
@ -31,6 +30,11 @@ QskSwitchButton::~QskSwitchButton()
{ {
} }
bool QskSwitchButton::isCheckable() const
{
return true;
}
Qt::Orientation QskSwitchButton::orientation() const Qt::Orientation QskSwitchButton::orientation() const
{ {
return m_data->orientation; return m_data->orientation;

View File

@ -24,6 +24,8 @@ class QSK_EXPORT QskSwitchButton : public QskAbstractButton
~QskSwitchButton() override; ~QskSwitchButton() override;
bool isCheckable() const final;
Qt::Orientation orientation() const; Qt::Orientation orientation() const;
void setOrientation(Qt::Orientation); void setOrientation(Qt::Orientation);

View File

@ -48,7 +48,6 @@ QskTabButton::QskTabButton( const QString& text, QQuickItem* parent )
initSizePolicy( QskSizePolicy::MinimumExpanding, initSizePolicy( QskSizePolicy::MinimumExpanding,
QskSizePolicy::QskSizePolicy::MinimumExpanding ); QskSizePolicy::QskSizePolicy::MinimumExpanding );
setCheckable( true );
setExclusive( true ); setExclusive( true );
} }
@ -56,6 +55,11 @@ QskTabButton::~QskTabButton()
{ {
} }
bool QskTabButton::isCheckable() const
{
return true;
}
void QskTabButton::setText( const QString& text ) void QskTabButton::setText( const QString& text )
{ {
if ( m_data->text == text ) if ( m_data->text == text )

View File

@ -30,6 +30,8 @@ class QSK_EXPORT QskTabButton : public QskAbstractButton
~QskTabButton() override; ~QskTabButton() override;
bool isCheckable() const override final;
void setText( const QString& text ); void setText( const QString& text );
QString text() const; QString text() const;