Diffstat (limited to 'noncore/settings/sysinfo/otabwidget.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/settings/sysinfo/otabwidget.cpp | 193 |
1 files changed, 179 insertions, 14 deletions
diff --git a/noncore/settings/sysinfo/otabwidget.cpp b/noncore/settings/sysinfo/otabwidget.cpp index 5d5b3e6..5154196 100644 --- a/noncore/settings/sysinfo/otabwidget.cpp +++ b/noncore/settings/sysinfo/otabwidget.cpp @@ -21,13 +21,66 @@ +#include <qpe/config.h> #include <qpe/resource.h> +#include <qcombobox.h> #include <qlist.h> #include <qtabbar.h> +#include <qwidgetstack.h> +OTabWidget::OTabWidget( QWidget *parent, const char *name = 0x0, + TabStyle s = Global, TabPosition p = Top ) + : QWidget( parent, name ) +{ + if ( s == Global ) + { + Config config( "qpe" ); + config.setGroup( "Appearance" ); + tabBarStyle = ( TabStyle ) config.readNumEntry( "TabStyle", (int) IconTab ); + if ( tabBarStyle <= Global || tabBarStyle > IconList) + { + tabBarStyle = IconTab; + } + QString pos = config.readEntry( "TabPosition", "Top"); + if ( pos == "Top" ) + { + tabBarPosition = Top; + } + else + { + tabBarPosition = Bottom; + } + } + else + { + tabBarStyle = s; + tabBarPosition = p; + } + + widgetStack = new QWidgetStack( this, "widgetstack" ); + widgetStack->setFrameStyle( QFrame::StyledPanel | QFrame::Raised ); + widgetStack->setLineWidth( style().defaultFrameWidth() ); + + tabBarStack = new QWidgetStack( this, "tabbarstack" ); + + tabBar = new QTabBar( tabBarStack, "tabbar" ); + tabBarStack->addWidget( tabBar, 0 ); + connect( tabBar, SIGNAL( selected( int ) ), this, SLOT( slotTabBarSelected( int ) ) ); -OTabWidget::OTabWidget( QWidget *parent, const char *name ) - : QTabWidget( parent, name ) + tabList = new QComboBox( false, tabBarStack, "tablist" ); + tabBarStack->addWidget( tabList, 1 ); + connect( tabList, SIGNAL( activated( int ) ), this, SLOT( slotTabListSelected( int ) ) ); + + if ( tabBarStyle == TextTab || tabBarStyle == IconTab ) + { + tabBarStack->raiseWidget( tabBar ); + } + else if ( tabBarStyle == TextList || tabBarStyle == IconList ) { - connect( this, SIGNAL( currentChanged( QWidget * ) ), - this, SLOT( tabChangedSlot( QWidget * ) ) ); + tabBarStack->raiseWidget( tabList ); + } + + if ( tabBarPosition == Bottom ) + { + tabBar->setShape( QTabBar::RoundedBelow ); + } } @@ -40,22 +93,81 @@ void OTabWidget::addTab( QWidget *child, const QString &icon, const QString &lab { - Tabs.append( TabInfo( child, icon, label ) ); - QTabWidget::addTab( child, loadSmooth( icon ), QString::null ); + QPixmap iconset = loadSmooth( icon ); + + // Add to tabBar + QTab * tab = new QTab(); + if ( tabBarStyle == IconTab ) + { + tab->label = QString::null; + } + else + { + tab->label = label; + } + if ( tabBarStyle == IconTab || tabBarStyle == IconList) + { + tab->iconset = new QIconSet( iconset ); + } + int tabid = tabBar->addTab( tab ); + tabBar->setCurrentTab( tab ); + + // Add to tabList + + if ( tabBarStyle == IconTab || tabBarStyle == IconList ) + { + tabList->insertItem( iconset, label, -1 ); + } + else + { + tabList->insertItem( label ); + } + tabList->setCurrentItem( tabList->count()-1 ); + + // Add child to widget list + widgetStack->addWidget( child, tabid ); + widgetStack->raiseWidget( child ); + + // Save tab information + tabs.append( TabInfo( tabid, child, icon, label ) ); + + setUpLayout( FALSE ); +} + +OTabWidget::TabStyle OTabWidget::tabStyle() const +{ + return tabBarStyle; } -void OTabWidget::tabChangedSlot( QWidget *child ) +void OTabWidget::setTabStyle( TabStyle s ) { - TabInfoList::Iterator it; + tabBarStyle = s; +} + +OTabWidget::TabPosition OTabWidget::tabPosition() const +{ + return tabBarPosition; +} - if ( CurrentTab != 0x0 ) +void OTabWidget::setTabPosition( TabPosition p ) { - changeTab( (*CurrentTab).control(), loadSmooth( (*CurrentTab).icon() ), QString::null ); + tabBarPosition = p; } - for ( it = Tabs.begin(); it != Tabs.end(); ++it ) +void OTabWidget::slotTabBarSelected( int id ) { - if ( (*it).control() == child ) + + TabInfoList::Iterator newtab = tabs.begin(); + while ( newtab != tabs.end() && (*newtab).id() != id ) + newtab++; + if ( (*newtab).id() == id ) { - CurrentTab = it; - changeTab( (*CurrentTab).control(), loadSmooth( (*CurrentTab).icon() ), (*CurrentTab).label() ); + selectTab( newtab ); + } } + +void OTabWidget::slotTabListSelected( int index ) +{ + TabInfoList::Iterator newtab = tabs.at( index ); + if ( newtab != tabs.end() ) + { + selectTab( newtab ); } @@ -71 +183,54 @@ QPixmap OTabWidget::loadSmooth( const QString &name ) +void OTabWidget::selectTab( TabInfoList::Iterator tab ) +{ + if ( tabBarStyle == IconTab ) + { + if ( currentTab != 0x0 ) + { + tabBar->tab( (*currentTab).id() )->label = QString::null; + } + tabBar->tab( (*tab).id() )->label = (*tab).label(); + currentTab = tab; + } + tabBar->layoutTabs(); + tabBar->update(); + + widgetStack->raiseWidget( (*tab).control() ); + + setUpLayout( FALSE ); +} + +void OTabWidget::setUpLayout( bool onlyCheck ) +{ + QSize t( tabBarStack->sizeHint() ); + if ( t.width() > width() ) + t.setWidth( width() ); + int lw = widgetStack->lineWidth(); + if ( tabBarPosition == Bottom ) + { + tabBarStack->setGeometry( QMAX(0, lw-2), height() - t.height() - lw, t.width(), t.height() ); + widgetStack->setGeometry( 0, 0, width(), height()-t.height()+QMAX(0, lw-2) ); + } + else + { // Top + tabBarStack->setGeometry( QMAX(0, lw-2), 0, t.width(), t.height() ); + widgetStack->setGeometry( 0, t.height()-lw, width(), height()-t.height()+QMAX(0, lw-2)); + } + + if ( !onlyCheck ) + update(); + if ( autoMask() ) + updateMask(); +} + +QSize OTabWidget::sizeHint() const +{ + QSize s( widgetStack->sizeHint() ); + QSize t( tabBarStack->sizeHint() ); + return QSize( QMAX( s.width(), t.width()), s.height() + t.height() ); +} + +void OTabWidget::resizeEvent( QResizeEvent * ) +{ + setUpLayout( FALSE ); +} |