diff --git a/examples/boxes/main.cpp b/examples/boxes/main.cpp index 50ebd5ea..ee75d6c5 100644 --- a/examples/boxes/main.cpp +++ b/examples/boxes/main.cpp @@ -366,6 +366,7 @@ class TabView : public QskTabView : QskTabView( parentItem ) { setMargins( 10 ); + setAutoFitTabs( true ); auto* tab1 = new QskLinearBox( Qt::Horizontal, 5 ); diff --git a/examples/tabview/main.cpp b/examples/tabview/main.cpp index 1dbf7808..7d76da9a 100644 --- a/examples/tabview/main.cpp +++ b/examples/tabview/main.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -82,15 +83,25 @@ int main( int argc, char* argv[] ) auto tabView = new TabView(); auto rotateButton = new QskPushButton( "Rotate" ); - rotateButton->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); rotateButton->setFocus( true ); - QObject::connect( rotateButton, &QskPushButton::clicked, tabView, &TabView::rotate ); + QObject::connect( rotateButton, &QskPushButton::clicked, + tabView, &TabView::rotate ); + + auto autoFitButton = new QskPushButton( "Fit Tabs" ); + autoFitButton->setCheckable( true ); + QObject::connect( autoFitButton, &QskPushButton::toggled, + tabView, &QskTabView::setAutoFitTabs ); + + auto buttonBox = new QskLinearBox( Qt::Horizontal ); + buttonBox->addItem( rotateButton ); + buttonBox->addItem( autoFitButton ); + buttonBox->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); auto layoutBox = new QskLinearBox( Qt::Vertical ); layoutBox->setDefaultAlignment( Qt::AlignLeft ); layoutBox->setMargins( 5 ); layoutBox->setSpacing( 10 ); - layoutBox->addItem( rotateButton ); + layoutBox->addItem( buttonBox ); layoutBox->addItem( tabView ); auto focusIndicator = new QskFocusIndicator(); @@ -98,7 +109,7 @@ int main( int argc, char* argv[] ) focusIndicator->setBoxBorderColorsHint( QskFocusIndicator::Panel, Qt::red ); QskWindow window; - window.resize( 600, 400 ); + window.resize( 800, 600 ); window.addItem( layoutBox ); window.addItem( focusIndicator ); diff --git a/src/common/QskSizePolicy.cpp b/src/common/QskSizePolicy.cpp index d24123dd..dfdd00ca 100644 --- a/src/common/QskSizePolicy.cpp +++ b/src/common/QskSizePolicy.cpp @@ -4,7 +4,10 @@ *****************************************************************************/ #include "QskSizePolicy.h" -#include + +#ifndef QT_NO_DEBUG +#include +#endif QskSizePolicy::Policy QskSizePolicy::policy( Qt::Orientation orientation ) const { diff --git a/src/controls/QskTabBar.cpp b/src/controls/QskTabBar.cpp index a215e6cd..d6cf9717 100644 --- a/src/controls/QskTabBar.cpp +++ b/src/controls/QskTabBar.cpp @@ -22,6 +22,11 @@ static inline Qt::Orientation qskOrientation( int position ) return Qt::Vertical; } +static inline void qskTransposeSizePolicy( QskControl* control ) +{ + control->setSizePolicy( control->sizePolicy().transposed() ); +} + namespace { class ButtonBox final : public QskLinearBox @@ -270,9 +275,11 @@ void QskTabBar::setPosition( Qsk::Position position ) if ( orientation != m_data->buttonBox->orientation() ) { - setSizePolicy( sizePolicy().transposed() ); + qskTransposeSizePolicy( this ); m_data->buttonBox->setOrientation( orientation ); + qskTransposeSizePolicy( m_data->buttonBox ); + m_data->scrollBox->setOrientation( orientation ); } @@ -308,6 +315,34 @@ bool QskTabBar::autoScrollFocusButton() const return m_data->scrollBox->autoScrollFocusItem(); } +void QskTabBar::setAutoFitTabs( bool on ) +{ + const auto orientation = qskOrientation( m_data->position ); + int policy = m_data->buttonBox->sizePolicy( orientation ); + + if ( ( policy & QskSizePolicy::GrowFlag ) != on ) + { + if ( on ) + policy |= QskSizePolicy::GrowFlag; + else + policy &= ~QskSizePolicy::GrowFlag; + + // we need operators for QskSizePolicy::Policy: TODO ... + m_data->buttonBox->setSizePolicy( + orientation, static_cast< QskSizePolicy::Policy >( policy ) ); + + polish(); + + Q_EMIT autoFitTabsChanged( on ); + } +} + +bool QskTabBar::autoFitTabs() const +{ + const auto policy = m_data->buttonBox->sizePolicy( orientation() ); + return ( policy & QskSizePolicy::GrowFlag ); +} + void QskTabBar::setTextOptions( const QskTextOptions& options ) { if ( options != m_data->textOptions ) diff --git a/src/controls/QskTabBar.h b/src/controls/QskTabBar.h index 141bc2d0..84807dc3 100644 --- a/src/controls/QskTabBar.h +++ b/src/controls/QskTabBar.h @@ -23,6 +23,9 @@ class QSK_EXPORT QskTabBar : public QskBox Q_PROPERTY( bool autoScrollFocusButton READ autoScrollFocusButton WRITE setAutoScrollFocusedButton NOTIFY autoScrollFocusedButtonChanged FINAL ) + Q_PROPERTY( bool autoFitTabs READ autoFitTabs + WRITE setAutoFitTabs NOTIFY autoFitTabsChanged FINAL ) + Q_PROPERTY( int count READ count NOTIFY countChanged FINAL ) Q_PROPERTY( int currentIndex READ currentIndex @@ -46,9 +49,12 @@ class QSK_EXPORT QskTabBar : public QskBox Qt::Orientation orientation() const; - void setAutoScrollFocusedButton( bool on ); + void setAutoScrollFocusedButton( bool ); bool autoScrollFocusButton() const; + void setAutoFitTabs( bool ); + bool autoFitTabs() const; + void ensureButtonVisible( const QskTabButton* ); void setTextOptions( const QskTextOptions& ); @@ -95,6 +101,7 @@ class QSK_EXPORT QskTabBar : public QskBox void textOptionsChanged( const QskTextOptions& ); void positionChanged( Qsk::Position ); void autoScrollFocusedButtonChanged( bool ); + void autoFitTabsChanged( bool ); protected: void componentComplete() override; diff --git a/src/controls/QskTabButton.cpp b/src/controls/QskTabButton.cpp index 3ef4848e..96c85d97 100644 --- a/src/controls/QskTabButton.cpp +++ b/src/controls/QskTabButton.cpp @@ -45,7 +45,8 @@ QskTabButton::QskTabButton( const QString& text, QQuickItem* parent ) if ( parent ) m_data->tabBar = qskFindTabBar( this ); - initSizePolicy( QskSizePolicy::Minimum, QskSizePolicy::Fixed ); + initSizePolicy( QskSizePolicy::MinimumExpanding, + QskSizePolicy::QskSizePolicy::MinimumExpanding ); setCheckable( true ); setExclusive( true ); diff --git a/src/controls/QskTabView.cpp b/src/controls/QskTabView.cpp index 98286e8d..8d5de46f 100644 --- a/src/controls/QskTabView.cpp +++ b/src/controls/QskTabView.cpp @@ -71,6 +71,9 @@ QskTabView::QskTabView( Qsk::Position tabPosition, QQuickItem* parent ) connect( m_data->tabBar, &QskTabBar::positionChanged, this, &QskTabView::tabPositionChanged ); + + connect( m_data->tabBar, &QskTabBar::autoFitTabsChanged, + this, &QskTabView::autoFitTabsChanged ); } QskTabView::~QskTabView() @@ -103,6 +106,16 @@ Qsk::Position QskTabView::tabPosition() const return m_data->tabBar->position(); } +void QskTabView::setAutoFitTabs( bool on ) +{ + m_data->tabBar->setAutoFitTabs( on ); +} + +bool QskTabView::autoFitTabs() const +{ + return m_data->tabBar->autoFitTabs(); +} + Qt::Orientation QskTabView::orientation() const { return qskTransposed( m_data->tabBar->orientation() ); diff --git a/src/controls/QskTabView.h b/src/controls/QskTabView.h index f369672c..7cf5e794 100644 --- a/src/controls/QskTabView.h +++ b/src/controls/QskTabView.h @@ -21,6 +21,9 @@ class QSK_EXPORT QskTabView : public QskControl Q_PROPERTY( Qsk::Position tabPosition READ tabPosition WRITE setTabPosition NOTIFY tabPositionChanged FINAL ) + Q_PROPERTY( bool autoFitTabs READ autoFitTabs + WRITE setAutoFitTabs NOTIFY autoFitTabsChanged FINAL ) + Q_PROPERTY( Qt::Orientation orientation READ orientation ) Q_PROPERTY( int count READ count NOTIFY countChanged FINAL ) @@ -44,6 +47,9 @@ class QSK_EXPORT QskTabView : public QskControl void setTabPosition( Qsk::Position ); Qsk::Position tabPosition() const; + void setAutoFitTabs( bool ); + bool autoFitTabs() const; + Qt::Orientation orientation() const; int addTab( QskTabButton*, QQuickItem* ); @@ -76,6 +82,7 @@ class QSK_EXPORT QskTabView : public QskControl void currentIndexChanged( int index ); void countChanged( int ); void tabPositionChanged( Qsk::Position ); + void autoFitTabsChanged( bool ); protected: bool event( QEvent* event ) override;