author | sandman <sandman> | 2002-06-29 23:45:19 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-06-29 23:45:19 (UTC) |
commit | 769df90a59d6aa840b8d6568287001e66e263f01 (patch) (side-by-side diff) | |
tree | 415c7e4ff70a9b035c31b28971a568bc2827ae34 /noncore/styles/theme/othemestyle.cpp | |
parent | 0f179c0cc471b659b30dec4762c9c36678063f31 (diff) | |
download | opie-769df90a59d6aa840b8d6568287001e66e263f01.zip opie-769df90a59d6aa840b8d6568287001e66e263f01.tar.gz opie-769df90a59d6aa840b8d6568287001e66e263f01.tar.bz2 |
*** empty log message ***
Diffstat (limited to 'noncore/styles/theme/othemestyle.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/styles/theme/othemestyle.cpp | 1532 |
1 files changed, 1532 insertions, 0 deletions
diff --git a/noncore/styles/theme/othemestyle.cpp b/noncore/styles/theme/othemestyle.cpp new file mode 100644 index 0000000..61127b8 --- a/dev/null +++ b/noncore/styles/theme/othemestyle.cpp @@ -0,0 +1,1532 @@ +/* This file is part of the KDE libraries + Copyright (C) 1999 Daniel M. Duley <mosfet@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "othemestyle.h" +#include "othemebase.h" +#include <qpe/qpeapplication.h> +#include <qbitmap.h> +#define INCLUDE_MENUITEM_DEF +#include <qmenudata.h> +#include <qpopupmenu.h> +#include <qtabbar.h> +#include <qglobal.h> + +#include <limits.h> +#include <stdio.h> + +#define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2) + +OThemeStyle::OThemeStyle( const QString &configFile ) + : OThemeBase( configFile ) +{ + setScrollBarExtent( getSBExtent(), getSBExtent() ); + setButtonDefaultIndicatorWidth( 0 ); // We REALLY should support one, see drawPushButton() below! +} + +OThemeStyle::~OThemeStyle() +{} + +void OThemeStyle::polish( QApplication * /*app*/ ) +{} + +void OThemeStyle::polish( QPalette &p ) +{ + oldPalette = p; + + QColor bg = oldPalette. color ( QPalette::Normal, QColorGroup::Background ); + + if ( bgcolor. isValid ( )) + bg = bgcolor; + + if ( isColor ( Background )) + bg = colorGroup ( oldPalette. active ( ), Background )-> background ( ); + + p = QPalette ( bg, bg ); + + if ( isPixmap( Background ) ) + p. setBrush ( QColorGroup::Background, QBrush ( bg, *uncached ( Background ))); + + if ( fgcolor. isValid ( )) { + p. setColor ( QColorGroup::Foreground, fgcolor ); + p. setColor ( QColorGroup::ButtonText, fgcolor ); + } + if ( selfgcolor. isValid ( )) + p. setColor ( QColorGroup::HighlightedText, selfgcolor ); + if ( selbgcolor. isValid ( )) + p. setColor ( QColorGroup::Highlight, selbgcolor ); + if ( winfgcolor. isValid ( )) + p. setColor ( QColorGroup::Text, winfgcolor ); + if ( winbgcolor. isValid ( )) + p. setColor ( QColorGroup::Base, winbgcolor ); + +} + + +void OThemeStyle::unPolish( QApplication *app ) +{ + app->setPalette( oldPalette, true ); +} + +void OThemeStyle::polish( QWidget *w ) +{ + if ( !w->isTopLevel() ) { + if ( w->inherits( "QGroupBox" ) + || w->inherits( "QTabWidget" ) ) { + w->setAutoMask( TRUE ); + return ; + } + if ( w->inherits( "QLabel" ) + || w->inherits( "QSlider" ) + || w->inherits( "QButton" ) + || w->inherits( "QProgressBar" ) + ) { + w->setBackgroundOrigin( QWidget::ParentOrigin ); + } + } + if ( w->inherits( "QPopupMenu" ) ) { + popupPalette = w->palette(); + if ( isColor( MenuItem ) || isColor( MenuItemDown ) ) { + QPalette newPal( w->palette() ); + w->setPalettePropagation( QWidget::SamePalette ); + if ( isColor( MenuItem ) ) { + newPal.setNormal( *colorGroup( newPal.normal(), MenuItem ) ); + newPal.setDisabled( *colorGroup( newPal.normal(), MenuItem ) ); + } + if ( isColor( MenuItemDown ) ) + newPal.setActive( *colorGroup( newPal.active(), MenuItemDown ) ); + w->setPalette( newPal ); + } + } + if ( w->inherits( "QCheckBox" ) ) { + if ( isColor( IndicatorOff ) || isColor( IndicatorOn ) ) { + QPalette newPal( w->palette() ); + w->setPalettePropagation( QWidget::SamePalette ); + if ( isColor( IndicatorOff ) ) { + newPal.setNormal( *colorGroup( newPal.normal(), IndicatorOff ) ); + newPal.setDisabled( *colorGroup( newPal.normal(), IndicatorOff ) ); + } + if ( isColor( IndicatorOn ) ) + newPal.setActive( *colorGroup( newPal.active(), IndicatorOn ) ); + w->setPalette( newPal ); + } + } + if ( w->inherits( "QRadioButton" ) ) { + if ( isColor( ExIndicatorOff ) || isColor( ExIndicatorOn ) ) { + QPalette newPal( w->palette() ); + w->setPalettePropagation( QWidget::SamePalette ); + if ( isColor( ExIndicatorOff ) ) { + newPal.setNormal( *colorGroup( newPal.normal(), ExIndicatorOff ) ); + newPal.setDisabled( *colorGroup( newPal.normal(), + ExIndicatorOff ) ); + } + if ( isColor( ExIndicatorOn ) ) + newPal.setActive( *colorGroup( newPal.active(), ExIndicatorOn ) ); + w->setPalette( newPal ); + } + } +} + +void OThemeStyle::unPolish( QWidget* w ) +{ + if ( !w->isTopLevel() ) { + if ( w->inherits( "QGroupBox" ) + || w->inherits( "QTabWidget" ) ) { + w->setAutoMask( FALSE ); + return ; + } + if ( w->inherits( "QLabel" ) + || w->inherits( "QSlider" ) + || w->inherits( "QButton" ) + || w->inherits( "QProgressBar" ) + ) { + w->setBackgroundOrigin( QWidget::WidgetOrigin ); + } + } + if ( w->inherits( "QPopupMenu" ) ) + w->unsetPalette(); + if ( w->inherits( "QCheckBox" ) ) + w->unsetPalette(); + if ( w->inherits( "QRadioButton" ) ) + w->unsetPalette(); +} + +void OThemeStyle::drawBaseButton( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, bool + rounded, WidgetType type, const QBrush * ) +{ + int offset = borderPixmap( type ) ? 0 : decoWidth( type ); + QPen oldPen = p->pen(); + + // handle reverse bevel here since it uses decowidth differently + if ( gradientHint( type ) == GrReverseBevel ) { + int i; + bitBlt( p->device(), x, y, scalePixmap( w, h, type ), 0, 0, w, h, + Qt::CopyROP, true ); + p->setPen( g.text() ); + for ( i = 0; i < borderWidth( type ); ++i, ++x, ++y, w -= 2, h -= 2 ) + p->drawRect( x, y, w, h ); + } + // same with KDE style borders + else if ( !borderPixmap( type ) && shade() == KDE ) { + qDrawWinButton( p, x, y, w, h, g, sunken ); + if ( isPixmap( type ) ) + p->drawTiledPixmap( x + 4, y + 4, w - 6, h - 6, + *scalePixmap( w - 6, h - 6, + type ) ); + else + p->fillRect( x + 4, y + 4, w - 6, h - offset * 6, + g.brush( QColorGroup::Button ) ); + + } + else { + if ( ( w - offset * 2 ) > 0 && ( h - offset * 2 ) > 0 ) { + if ( isPixmap( type ) ) + if ( rounded ) + p->drawTiledPixmap( x, y, w, h, *scalePixmap( w, h, type ) ); + else + p->drawTiledPixmap( x + offset, y + offset, w - offset * 2, + h - offset * 2, + *scalePixmap( w - offset * 2, h - offset * 2, + type ) ); + else + p->fillRect( x + offset, y + offset, w - offset * 2, h - offset * 2, + g.brush( QColorGroup::Button ) ); + } + if ( borderPixmap( type ) ) + bitBlt( p->device(), x, y, scaleBorder( w, h, type ), 0, 0, w, h, + Qt::CopyROP, false ); + else + drawShade( p, x, y, w, h, g, sunken, rounded, + highlightWidth( type ), borderWidth( type ), shade() ); + } + p->setPen( oldPen ); +} + +void OThemeStyle::drawButton( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, + const QBrush *fill ) +{ + drawBaseButton( p, x, y, w, h, g, sunken, roundButton(), sunken ? + PushButtonDown : PushButton, fill ); +} + +void OThemeStyle::drawPushButton( QPushButton* btn, QPainter *p ) +{ + bool sunken = btn->isOn() || btn->isDown(); + int diw = buttonDefaultIndicatorWidth(); + drawBaseButton( p, diw, diw, btn->width() - 2 * diw, btn->height() - 2 * diw, + *colorGroup( btn->colorGroup(), sunken ? PushButtonDown : + PushButton ), sunken, roundButton(), + sunken ? PushButtonDown : PushButton, NULL ); + // TODO if diw, draw fancy default button indicator +} + +void OThemeStyle::drawBaseMask( QPainter *p, int x, int y, int w, int h, + bool round ) +{ + // round edge fills + static const QCOORD btm_left_fill[] = { + 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, + 1, 2, 2, 2, 3, 2, 4, 2, 2, 3, 3, 3, 4, 3, 3, 4, 4, 4 + }; + + static const QCOORD btm_right_fill[] = { + 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, + 1, 0, 2, 1, 2, 2, 2, 3, 2, 0, 3, 1, 3, 2, 3, 0, 4, 1, 4 + }; + + static const QCOORD top_left_fill[] = { + 3, 0, 4, 0, 2, 1, 3, 1, 4, 1, 1, 2, 2, 2, 3, 2, 4, 2, 0, 3, + 1, 3, 2, 3, 3, 3, 4, 3, 0, 4, 1, 4, 2, 4, 3, 4, 4, 4 + }; + + static const QCOORD top_right_fill[] = { + 0, 0, 1, 0, 0, 1, 1, 1, 2, 1, 0, 2, 1, 2, 2, 2, 3, 2, 0, + 3, 1, 3, 2, 3, 3, 3, 4, 3, 0, 4, 1, 4, 2, 4, 3, 4, 4, 4 + }; + + QBrush fillBrush( color1, SolidPattern ); + p->setPen( color1 ); + if ( round && w > 19 && h > 19 ) { + int x2 = x + w - 1; + int y2 = y + h - 1; + QPointArray a( QCOORDARRLEN( top_left_fill ), top_left_fill ); + a.translate( 1, 1 ); + p->drawPoints( a ); + a.setPoints( QCOORDARRLEN( btm_left_fill ), btm_left_fill ); + a.translate( 1, h - 6 ); + p->drawPoints( a ); + a.setPoints( QCOORDARRLEN( top_right_fill ), top_right_fill ); + a.translate( w - 6, 1 ); + p->drawPoints( a ); + a.setPoints( QCOORDARRLEN( btm_right_fill ), btm_right_fill ); + a.translate( w - 6, h - 6 ); + p->drawPoints( a ); + + p->fillRect( x + 6, y, w - 12, h, fillBrush ); + p->fillRect( x, y + 6, x + 6, h - 12, fillBrush ); + p->fillRect( x2 - 6, y + 6, x2, h - 12, fillBrush ); + p->drawLine( x + 6, y, x2 - 6, y ); + p->drawLine( x + 6, y2, x2 - 6, y2 ); + p->drawLine( x, y + 6, x, y2 - 6 ); + p->drawLine( x2, y + 6, x2, y2 - 6 ); + + } + else + p->fillRect( x, y, w, h, fillBrush ); +} + +void OThemeStyle::drawButtonMask( QPainter *p, int x, int y, int w, int h ) +{ + drawBaseMask( p, x, y, w, h, roundButton() ); +} + +void OThemeStyle::drawComboButtonMask( QPainter *p, int x, int y, int w, int h ) +{ + drawBaseMask( p, x, y, w, h, roundComboBox() ); +} + +void OThemeStyle::drawBevelButton( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, + const QBrush * ) +{ + WidgetType type = sunken ? BevelDown : Bevel; + drawBaseButton( p, x, y, w, h, *colorGroup( g, type ), sunken, false, type ); +} + +#if 0 +void OThemeStyle::drawKToolBarButton( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, + bool raised, bool enabled, bool popup, + KToolButtonType type, const QString &btext, + const QPixmap *pixmap, QFont *font, + QWidget * ) +{ + QFont tmp_font( QString::fromLatin1( "Helvetica" ), 10 ); + if ( font ) + tmp_font = *font; + QFontMetrics fm( tmp_font ); + WidgetType widget = sunken ? ToolButtonDown : ToolButton; + + drawBaseButton( p, x, y, w, h, *colorGroup( g, widget ), sunken, false, + widget ); + int dx, dy; + if ( type == Icon ) { // icon only + if ( pixmap ) { + dx = ( w - pixmap->width() ) / 2; + dy = ( h - pixmap->height() ) / 2; + if ( sunken ) { + ++dx; + ++dy; + } + p->drawPixmap( x + dx, y + dy, *pixmap ); + } + } + else if ( type == IconTextRight ) { // icon and text (if any) + if ( pixmap ) { + dx = 4; + dy = ( h - pixmap->height() ) / 2; + if ( sunken ) { + ++dx; + ++dy; + } + p->drawPixmap( x + dx, y + dy, *pixmap ); + } + if ( !btext.isNull() ) { + int tf = AlignVCenter | AlignLeft; + if ( pixmap ) + dx = 4 + pixmap->width() + 2; + else + dx = 4; + dy = 0; + if ( sunken ) { + ++dx; + ++dy; + } + if ( font ) + p->setFont( *font ); + if ( raised ) + p->setPen( KGlobalSettings::toolBarHighlightColor() ); + p->drawText( x + dx, y + dy, w - dx, h, tf, btext ); + } + } + else if ( type == Text ) { // only text, even if there is a icon + if ( !btext.isNull() ) { + int tf = AlignTop | AlignLeft; + if ( !enabled ) + p->setPen( g.dark() ); + dx = ( w - fm.width( btext ) ) / 2; + dy = ( h - fm.lineSpacing() ) / 2; + if ( sunken ) { + ++dx; + ++dy; + } + if ( font ) + p->setFont( *font ); + if ( raised ) + p->setPen( KGlobalSettings::toolBarHighlightColor() ); + p->drawText( x + dx, y + dy, fm.width( btext ), fm.lineSpacing(), tf, btext ); + } + } + else if ( type == IconTextBottom ) { + if ( pixmap ) { + dx = ( w - pixmap->width() ) / 2; + dy = ( h - fm.lineSpacing() - pixmap->height() ) / 2; + if ( sunken ) { + ++dx; + ++dy; + } + p->drawPixmap( x + dx, y + dy, *pixmap ); + } + if ( !btext.isNull() ) { + int tf = AlignBottom | AlignHCenter; + dx = ( w - fm.width( btext ) ) / 2; + dy = h - fm.lineSpacing() - 4; + if ( sunken ) { + ++dx; + ++dy; + } + if ( font ) + p->setFont( *font ); + if ( raised ) + p->setPen( KGlobalSettings::toolBarHighlightColor() ); + p->drawText( x + dx, y + dy, fm.width( btext ), fm.lineSpacing(), tf, btext ); + } + } + if ( popup ) { + if ( enabled ) + qDrawArrow ( p, DownArrow, WindowsStyle, false, w - 5, h - 5, 0, 0, + g, true ); + else + qDrawArrow ( p, DownArrow, WindowsStyle, false, w - 5, h - 5, + 0, 0, g, false ); + } +} + +void OThemeStyle::drawKBarHandle( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, KToolBarPos, QBrush * ) +{ + if ( w > h ) + drawBaseButton( p, x, y, w, h, *colorGroup( g, HBarHandle ), false, false, + HBarHandle ); + else + drawBaseButton( p, x, y, w, h, *colorGroup( g, VBarHandle ), false, false, + VBarHandle ); +} + +void OThemeStyle::drawKToolBar( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, KToolBarPos, QBrush * ) +{ + drawBaseButton( p, x, y, w, h, *colorGroup( g, ToolBar ), false, false, + ToolBar ); +} +#endif + +QRect OThemeStyle::buttonRect( int x, int y, int w, int h ) +{ + int spacing = decoWidth( PushButton ) > decoWidth( PushButtonDown ) ? + decoWidth( PushButton ) : decoWidth( PushButtonDown ); + return ( QRect( x + spacing, y + spacing, w - ( spacing * 2 ), h - ( spacing * 2 ) ) ); +} + +void OThemeStyle::drawComboButton( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, bool, + bool, const QBrush * ) +{ + WidgetType widget = sunken ? ComboBoxDown : ComboBox; + drawBaseButton( p, x, y, w, h, *colorGroup( g, widget ), sunken, + roundComboBox(), widget ); + if ( !sunken && isPixmap( ComboDeco ) ) + p->drawPixmap( w - uncached( ComboDeco ) ->width() - + decoWidth( ComboBox ) - 2, + y + ( h - uncached( ComboDeco ) -> + height() ) / 2, *uncached( ComboDeco ) ); + else if ( sunken && isPixmap( ComboDecoDown ) ) + p->drawPixmap( w - uncached( ComboDecoDown ) ->width() - + decoWidth( ComboBoxDown ) - 2, + y + ( h - uncached( ComboDecoDown ) -> + height() ) / 2, *uncached( ComboDecoDown ) ); + else { + qDrawArrow( p, Qt::DownArrow, Qt::MotifStyle, false, w - 15, y + 6, 10, + h - 15, *colorGroup( g, widget ), true ); + qDrawShadeRect( p, w - 14, y + 7 + ( h - 15 ), 10, 3, *colorGroup( g, widget ) ); + } +} + +void OThemeStyle::drawScrollBarControls( QPainter *p, const QScrollBar *sb, + int sliderStart, uint controls, + uint activeControl ) +{ + int sliderMin, sliderMax, sliderLength, buttonDim; + QRect add + , sub, addPage, subPage, slider; + int addX, addY, subX, subY; + bool horizontal = sb->orientation() == QScrollBar::Horizontal; + int len = ( horizontal ) ? sb->width() : sb->height(); + int extent = ( horizontal ) ? sb->height() : sb->width(); + int offset = decoWidth( horizontal ? HScrollGroove : VScrollGroove ); + QColorGroup g = sb->colorGroup(); + + scrollBarMetrics( sb, sliderMin, sliderMax, sliderLength, buttonDim ); + if ( sliderStart > sliderMax ) + sliderStart = sliderMax; + + int sliderEnd = sliderStart + sliderLength; + int sliderWidth = extent - offset * 2; + + // Scary button placement code >:-P Feel free to improve this if you + // want. I get a headache just looking at it... (mosfet) + if ( scrollBarLayout() == SBOpposite ) { + if ( horizontal ) { + subY = addY = ( extent - buttonDim ) / 2; + subX = offset; + addX = len - buttonDim - offset; + } + else { + subX = addX = ( extent - buttonDim ) / 2; + subY = offset; + addY = len - buttonDim - offset; + } + sub.setRect( subX, subY, buttonDim, buttonDim ); + add.setRect( addX, addY, buttonDim, buttonDim ); + if ( horizontal ) { + subPage.setRect( sub.right() + 1, offset, + sliderStart - sub.right() - 1 , sliderWidth ); + addPage.setRect( sliderEnd, offset, addX - sliderEnd, sliderWidth ); + slider.setRect( sliderStart, offset, sliderLength, sliderWidth ); + } + else { + subPage.setRect( offset, sub.bottom() + 1, sliderWidth, + sliderStart - sub.bottom() - 1 ); + addPage.setRect( offset, sliderEnd, sliderWidth, addY - sliderEnd ); + slider.setRect( offset, sliderStart, sliderWidth, sliderLength ); + } + } + else if ( horizontal ) { + subY = addY = ( extent - buttonDim ) / 2; + if ( scrollBarLayout() == SBBottomLeft ) { + subX = offset; + addX = buttonDim + offset; + subPage.setRect( buttonDim * 2, 0, sliderStart - 1, extent ); + addPage.setRect( sliderEnd, 0, len - sliderEnd, extent ); + slider.setRect( sliderStart, 0, sliderLength, extent ); + } + else { + subX = len - buttonDim - buttonDim - offset; + addX = len - buttonDim - offset; + subPage.setRect( offset + 1, offset, sliderStart - 1 , sliderWidth ); + addPage.setRect( sliderEnd, offset, subX - sliderEnd, sliderWidth ); + slider.setRect( sliderStart, offset, sliderLength, sliderWidth ); + } + sub.setRect( subX, subY, buttonDim, buttonDim ); + add.setRect( addX, addY, buttonDim, buttonDim ); + } + else { // BottomLeft and BottomRight vertical bars are the same. + subX = addX = ( extent - buttonDim ) / 2; + subY = len - buttonDim - buttonDim - offset; + addY = len - buttonDim - offset; + subPage.setRect( offset, offset + 1, sliderWidth, + sliderStart - offset - 1 ); + addPage.setRect( offset, sliderEnd, sliderWidth, subY - sliderEnd ); + slider.setRect( offset, sliderStart, sliderWidth, sliderLength ); + sub.setRect( subX, subY, buttonDim, buttonDim ); + add.setRect( addX, addY, buttonDim, buttonDim ); + } + // End of the button placement code + + bool active; + if ( ( controls & QStyle::SubPage ) ) { + drawScrollBarGroove( p, sb, horizontal, subPage, g ); + } + if ( ( controls & QStyle::AddPage ) ) { + drawScrollBarGroove( p, sb, horizontal, addPage, g ); + } + if ( controls & QStyle::AddLine ) { + active = activeControl == QStyle::AddLine; + drawBaseButton( p, add.x(), add.y(), add.width(), add.height(), + *colorGroup( g, active ? ScrollButtonDown : ScrollButton ), + active, false, active ? ScrollButtonDown : ScrollButton ); + drawArrow( p, ( horizontal ) ? RightArrow : DownArrow, active, add.x() + 3, + add.y() + 3, add.width() - 6, add.height() - 6, + *colorGroup( g, active ? ScrollButtonDown : ScrollButton ) ); + } + if ( controls & QStyle::SubLine ) { + active = activeControl == QStyle::SubLine; + p->setPen( g.dark() ); + p->drawRect( sub ); + drawBaseButton( p, sub.x(), sub.y(), sub.width(), sub.height(), + *colorGroup( g, active ? ScrollButtonDown : ScrollButton ), + active, false, active ? ScrollButtonDown : ScrollButton ); + drawArrow( p, ( horizontal ) ? LeftArrow : UpArrow, active, sub.x() + 3, + sub.y() + 3, sub.width() - 6, sub.height() - 6, + *colorGroup( g, active ? ScrollButtonDown : ScrollButton ) ); + } + if ( controls & QStyle::Slider ) { + active = activeControl == QStyle::Slider; + WidgetType widget = horizontal ? + active ? HScrollBarSliderDown : HScrollBarSlider : + active ? VScrollBarSliderDown : VScrollBarSlider; + + drawBaseButton( p, slider.x(), slider.y(), slider.width(), + slider.height(), *colorGroup( g, widget ), active, false, + widget ); + int spaceW = horizontal ? slider.width() - decoWidth( widget ) - 4 : + slider.width(); + int spaceH = horizontal ? slider.height() : + slider.height() - decoWidth( widget ) - 4; +widget = active ? horizontal ? HScrollDecoDown : VScrollDecoDown : + horizontal ? HScrollDeco : VScrollDeco; + if ( isPixmap( widget ) ) { + if ( spaceW >= uncached( widget ) ->width() && + spaceH >= uncached( widget ) ->height() ) { + p->drawPixmap( slider.x() + ( slider.width() - + uncached( widget ) ->width() ) / 2, + slider.y() + ( slider.height() - + uncached( widget ) ->height() ) / 2, + *uncached( widget ) ); + } + } + } +} + +void OThemeStyle::drawScrollBarGroove( QPainter *p, const QScrollBar *sb, + bool horizontal, QRect r, QColorGroup g ) + +{ + WidgetType widget = ( horizontal ) ? HScrollGroove : VScrollGroove; + if ( !isPixmap( widget ) ) { + p->fillRect( r, colorGroup( g, widget ) ->brush( QColorGroup::Background ) ); + } + else { + // If the groove is pixmapped we make a full-sized image (it gets + // cached) then bitBlt it to the appropriate rect. + QPixmap buffer( sb->size() ); + QPainter bPainter( &buffer ); + bPainter.drawTiledPixmap( 0, 0, buffer.width(), buffer.height(), + *scalePixmap( buffer.width(), buffer.height(), + widget ) ); + bitBlt( p->device(), r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), + r.height(), Qt::CopyROP ); + } + // Do the borders and frame + drawShade( p, sb->rect().x(), sb->rect().y(), sb->rect().width(), + sb->rect().height(), *colorGroup( g, widget ), true, false, + highlightWidth( widget ), borderWidth( widget ), shade() ); +} + +void OThemeStyle::scrollBarMetrics( const QScrollBar *sb, int &sliderMin, + int &sliderMax, int &sliderLength, + int &buttonDim ) +{ + bool horizontal = sb->orientation() == QScrollBar::Horizontal; + int offset = decoWidth( horizontal ? HScrollGroove : VScrollGroove ); + int maxlen; + int len = horizontal ? sb->width() : sb->height(); + int extent = horizontal ? sb->height() : sb->width(); + + if ( len > ( extent - offset * 2 - 1 ) * 2 + offset * 2 ) + buttonDim = extent - offset * 2; + else + buttonDim = ( len - offset * 2 ) / 2 - 1; + maxlen = len - offset * 2 - buttonDim * 2 - 1; + + switch ( scrollBarLayout() ) { + case SBBottomLeft: + sliderMin = ( horizontal ) ? buttonDim * 2 + offset + 1 : offset + 1; + break; + case SBBottomRight: + sliderMin = offset + 1; + break; + case SBOpposite: + default: + sliderMin = offset + buttonDim; + break; + } + if ( sb->maxValue() == sb->minValue() ) + sliderLength = maxlen; + else + sliderLength = ( sb->pageStep() * maxlen ) / ( sb->maxValue() - + sb->minValue() + sb->pageStep() ); + if ( sliderLength < 12 || ( sb->maxValue() - sb->minValue() ) > INT_MAX / 2 ) + sliderLength = 12; + if ( sliderLength > maxlen ) + sliderLength = maxlen; + sliderMax = sliderMin + maxlen - sliderLength; +} + +QStyle::ScrollControl OThemeStyle::scrollBarPointOver( const QScrollBar *sb, + int sliderStart, + const QPoint &p ) +{ + if ( !sb->rect().contains( p ) ) + return ( QStyle::NoScroll ); + int sliderMin, sliderMax, sliderLength, buttonDim; + int pos = ( sb->orientation() == QScrollBar::Horizontal ) ? p.x() : p.y(); + scrollBarMetrics( sb, sliderMin, sliderMax, sliderLength, buttonDim ); + + if ( scrollBarLayout() == SBOpposite ) { + if ( pos < sliderMin ) + return QStyle::SubLine; + if ( pos < sliderStart ) + return SubPage; + if ( pos < sliderStart + sliderLength ) + return QStyle::Slider; + if ( pos < sliderMax + sliderLength ) + return QStyle::AddPage; + return QStyle::AddLine; + } + if ( scrollBarLayout() == SBBottomLeft && sb->orientation() == + QScrollBar::Horizontal ) { + if ( pos <= buttonDim ) + return ( QStyle::SubLine ); + else if ( pos <= buttonDim * 2 ) + return ( QStyle::AddLine ); + else if ( pos < sliderStart ) + return ( QStyle::SubPage ); + else if ( pos < sliderStart + sliderLength ) + return ( QStyle::Slider ); + return ( AddPage ); + } + else { + if ( pos < sliderStart ) + return QStyle::SubPage; + if ( pos < sliderStart + sliderLength ) + return QStyle::Slider; + if ( pos < sliderMax + sliderLength ) + return QStyle::AddPage; + if ( pos < sliderMax + sliderLength + buttonDim ) + return QStyle::SubLine; + return QStyle::AddLine; + } +} + +QSize OThemeStyle::exclusiveIndicatorSize() const +{ + if ( isPixmap( ExIndicatorOn ) ) + return ( uncached( ExIndicatorOn ) ->size() ); + else + return ( QWindowsStyle::exclusiveIndicatorSize() ); +} + +QSize OThemeStyle::indicatorSize() const +{ + if ( isPixmap( IndicatorOn ) ) + return ( uncached( IndicatorOn ) ->size() ); + else + return ( QWindowsStyle::indicatorSize() ); +} + +void OThemeStyle::drawExclusiveIndicator( QPainter* p, int x, int y, int w, + int h, const QColorGroup &g, bool on, + bool down, bool enabled ) +{ + if ( isPixmap( ( on || down ) ? ExIndicatorOn : ExIndicatorOff ) ) { + p->drawPixmap( x, y, *uncached( ( on || down ) ? ExIndicatorOn : + ExIndicatorOff ) ); + } + else { + QWindowsStyle::drawExclusiveIndicator( p, x, y, w, h, + *colorGroup( g, ExIndicatorOn ), + on, down, enabled ); + } + +} + +void OThemeStyle::drawIndicator( QPainter* p, int x, int y, int w, int h, + const QColorGroup &g, int state, bool down, + bool enabled ) +{ + if ( isPixmap( ( down || state != QButton::Off ) ? + IndicatorOn : IndicatorOff ) ) { + p->drawPixmap( x, y, *uncached( ( down || state != QButton::Off ) ? + IndicatorOn : IndicatorOff ) ); + } + else { + QWindowsStyle::drawIndicator( p, x, y, w, h, + *colorGroup( g, IndicatorOn ), state, + down, enabled ); + } +} + +void OThemeStyle::drawExclusiveIndicatorMask( QPainter *p, int x, int y, int w, + int h, bool on ) +{ + if ( isPixmap( ( on ) ? ExIndicatorOn : ExIndicatorOff ) ) { + const QBitmap * mask = uncached( ( on ) ? ExIndicatorOn : ExIndicatorOff ) -> + mask(); + if ( mask ) { + p->drawPixmap( x, y, *mask ); + } + else + p->fillRect( x, y, w, h, QBrush( color1, SolidPattern ) ); + } + else + QWindowsStyle::drawExclusiveIndicatorMask( p, x, y, w, h, on ); +} + +void OThemeStyle::drawIndicatorMask( QPainter *p, int x, int y, int w, int h, + int state ) +{ + if ( isPixmap( ( state != QButton::Off ) ? IndicatorOn : IndicatorOff ) ) { + const QBitmap * mask = uncached( ( state != QButton::Off ) ? IndicatorOn : + IndicatorOff ) ->mask(); + if ( mask ) + p->drawPixmap( x, y, *mask ); + else + p->fillRect( x, y, w, h, QBrush( color1, SolidPattern ) ); + } + else + QWindowsStyle::drawIndicatorMask( p, x, y, w, h, state ); +} + +void OThemeStyle::drawSliderGroove( QPainter *p, int x, int y, int w, int h, + const QColorGroup& g, QCOORD c, + Orientation orient ) +{ + if ( roundSlider() ) + QWindowsStyle::drawSliderGroove( p, x, y, w, h, + *colorGroup( g, SliderGroove ), + c, orient ); + else + drawBaseButton( p, x, y, w, h, *colorGroup( g, SliderGroove ), true, + false, SliderGroove ); +} + +void OThemeStyle::drawSlider( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, Orientation orient, + bool tickAbove, bool tickBelow ) +{ + if ( isPixmap( Slider ) ) { + if ( orient == Qt::Horizontal ) + p->drawPixmap( x, y + ( h - uncached( Slider ) ->height() ) / 2, + *uncached( Slider ) ); + else + p->drawPixmap( x + ( w - uncached( Slider ) ->width() ) / 2, + y, *uncached( Slider ) ); + } + else { + QWindowsStyle::drawSlider( p, x, y, w, h, *colorGroup( g, Slider ), + orient, tickAbove, tickBelow ); + } +} + +void OThemeStyle::drawSliderMask( QPainter *p, int x, int y, int w, int h, + Orientation orient, bool tickAbove, + bool tickBelow ) +{ + // This is odd. If we fill in the entire region it still masks the slider + // properly. I have no idea, this used to be different in Qt betas... + if ( isPixmap( Slider ) ) + p->fillRect( x, y, w, h, QBrush( color1, SolidPattern ) ); + else + QWindowsStyle::drawSliderMask( p, x, y, w, h, orient, tickAbove, + tickBelow ); +} + +int OThemeStyle::defaultFrameWidth() const +{ + return ( frameWidth() ); +} + +void OThemeStyle::getButtonShift( int &x, int &y ) +{ + x = buttonXShift(); + y = buttonYShift(); +} + +int OThemeStyle::sliderLength() const +{ + return ( sliderButtonLength() ); +} + +void OThemeStyle::drawArrow( QPainter *p, Qt::ArrowType type, bool down, int x, + int y, int w, int h, const QColorGroup &g, + bool enabled, const QBrush * ) +{ + // Handles pixmapped arrows. A little inefficent because you can specify + // some as pixmaps and some as default types. + WidgetType widget; + switch ( type ) { + case UpArrow: +widget = enabled ? down ? SunkenArrowUp : ArrowUp : DisArrowUp; + break; + case DownArrow: +widget = enabled ? down ? SunkenArrowDown : ArrowDown : DisArrowDown; + break; + case LeftArrow: +widget = enabled ? down ? SunkenArrowLeft : ArrowLeft : DisArrowLeft; + break; + case RightArrow: + default: +widget = enabled ? down ? SunkenArrowRight : ArrowRight : DisArrowRight; + break; + } + if ( isPixmap( widget ) ) { + p->drawPixmap( x + ( w - uncached( widget ) ->width() ) / 2, + y + ( h - uncached( widget ) ->height() ) / 2, + *uncached( widget ) ); + return ; + } + const QColorGroup *cg = colorGroup( g, widget ); + // Standard arrow types + if ( arrowType() == MotifArrow ) + qDrawArrow( p, type, Qt::MotifStyle, down, x, y, w, h, *cg, enabled ); + else if ( arrowType() == SmallArrow ) { + QColorGroup tmp( *cg ); + tmp.setBrush( QColorGroup::Button, QBrush( NoBrush ) ); + QWindowsStyle::drawArrow( p, type, false, x, y, w, h, + tmp, true ); + } + else { + QPointArray a; + int x2 = x + w - 1, y2 = y + h - 1; + switch ( type ) { + case Qt::UpArrow: + a.setPoints( 4, x, y2, x2, y2, x + w / 2, y, x, y2 ); + break; + case Qt::DownArrow: + a.setPoints( 4, x, y, x2, y, x + w / 2, y2, x, y ); + break; + case Qt::LeftArrow: + a.setPoints( 4, x2, y, x2, y2, x, y + h / 2, x2, y ); + break; + default: + a.setPoints( 4, x, y, x, y2, x2, y + h / 2, x, y ); + break; + } + QBrush oldBrush = p->brush(); + QPen oldPen = p->pen(); + p->setBrush( cg->brush( QColorGroup::Shadow ) ); + p->setPen( cg->shadow() ); + p->drawPolygon( a ); + p->setBrush( oldBrush ); + p->setPen( oldPen ); + } +} + +/* This is where we draw the borders and highlights. The new round button + * code is a pain in the arse. We don't want to be calculating arcs so + * use a whole lotta QPointArray's ;-) The code is made a lot more complex + * because you can have variable width border and highlights... + * I may want to cache this if round buttons are used, but am concerned + * about excessive cache misses. This is a memory/speed tradeoff that I + * have to test. + */ +void OThemeStyle::drawShade( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, bool rounded, + int hWidth, int bWidth, ShadeStyle style ) +{ + int i, sc, bc, x2, y2; + QPen highPen, lowPen; + + if ( style == Motif ) { + highPen.setColor( sunken ? g.dark() : g.light() ); + lowPen.setColor( sunken ? g.light() : g.dark() ); + } + else { + highPen.setColor( sunken ? g.shadow() : g.light() ); + lowPen.setColor( sunken ? g.light() : g.shadow() ); + } + + // Advanced round buttons + if ( rounded && w > 19 && h > 19 ) { + x2 = x + w - 1, y2 = y + h - 1; + QPointArray bPntArray, hPntArray, lPntArray; + QPointArray bLineArray, hLineArray, lLineArray; + // borders + for ( i = 0, bc = 0; i < bWidth; ++i ) { + bPntArray.putPoints( bc, 24, x + 4, y + 1, x + 5, y + 1, x + 3, y + 2, x + 2, y + 3, + x + 1, y + 4, x + 1, y + 5, x + 1, y2 - 5, x + 1, y2 - 4, x + 2, y2 - 3, + x2 - 5, y + 1, x2 - 4, y + 1, x2 - 3, y + 2, x2 - 5, y2 - 1, + x2 - 4, y2 - 1, x2 - 3, y2 - 2, x2 - 2, y2 - 3, x2 - 1, y2 - 5, + x2 - 1, y2 - 4, x + 3, y2 - 2, x + 4, y2 - 1, x + 5, y2 - 1, + x2 - 2, y + 3, x2 - 1, y + 4, x2 - 1, y + 5 ); + bc += 24; + // ellispe edges don't match exactly, so fill in blanks + if ( i < bWidth - 1 || hWidth != 0 ) { + bPntArray.putPoints( bc, 20, x + 6, y + 1, x + 4, y + 2, x + 3, y + 3, + x + 2, y + 4, x + 1, y + 6, x2 - 6, y + 1, x2 - 4, y + 2, + x2 - 3, y + 3, x + 2, y2 - 4, x + 1, y2 - 6, x2 - 6, y2 - 1, + x2 - 4, y2 - 2, x2 - 3, y2 - 3, x2 - 2, y2 - 4, x2 - 1, y2 - 6, + x + 6, y2 - 1, x + 4, y2 - 2, x + 3, y2 - 3, x2 - 1, y + 6, + x2 - 2, y + 4 ); + bc += 20; + } + bLineArray.putPoints( i * 8, 8, x + 6, y, x2 - 6, y, x, y + 6, x, y2 - 6, + x + 6, y2, x2 - 6, y2, x2, y + 6, x2, y2 - 6 ); + ++x, ++y; + --x2, --y2; + } + // highlights + for ( i = 0, sc = 0; i < hWidth; ++i ) { + hPntArray.putPoints( sc, 12, x + 4, y + 1, x + 5, y + 1, // top left + x + 3, y + 2, x + 2, y + 3, x + 1, y + 4, x + 1, y + 5, + x + 1, y2 - 5, x + 1, y2 - 4, x + 2, y2 - 3, // half corners + x2 - 5, y + 1, x2 - 4, y + 1, x2 - 3, y + 2 ); + lPntArray.putPoints( sc, 12, x2 - 5, y2 - 1, x2 - 4, y2 - 1, // btm right + x2 - 3, y2 - 2, x2 - 2, y2 - 3, x2 - 1, y2 - 5, x2 - 1, y2 - 4, + x + 3, y2 - 2, x + 4, y2 - 1, x + 5, y2 - 1, //half corners + x2 - 2, y + 3, x2 - 1, y + 4, x2 - 1, y + 5 ); + sc += 12; + if ( i < hWidth - 1 ) { + hPntArray.putPoints( sc, 10, x + 6, y + 1, x + 4, y + 2, // top left + x + 3, y + 3, x + 2, y + 4, x + 1, y + 6, + x2 - 6, y + 1, x2 - 4, y + 2, // half corners + x2 - 3, y + 3, x + 2, y2 - 4, x + 1, y2 - 6 ); + lPntArray.putPoints( sc, 10, x2 - 6, y2 - 1, x2 - 4, y2 - 2, // btm right + x2 - 3, y2 - 3, x2 - 2, y2 - 4, x2 - 1, y2 - 6, + x + 6, y2 - 1, x + 4, y2 - 2, // half corners + x + 3, y2 - 3, x2 - 1, y + 6, x2 - 2, y + 4 ); + sc += 10; + } + hLineArray.putPoints( i * 4, 4, x + 6, y, x2 - 6, y, x, y + 6, x, y2 - 6 ); + lLineArray.putPoints( i * 4, 4, x + 6, y2, x2 - 6, y2, x2, y + 6, x2, y2 - 6 ); + ++x, ++y; + --x2, --y2; + } + p->setPen( Qt::black ); + p->drawPoints( bPntArray ); + p->drawLineSegments( bLineArray ); + p->setPen( highPen ); + p->drawPoints( hPntArray ); + p->drawLineSegments( hLineArray ); + p->setPen( lowPen ); + p->drawPoints( lPntArray ); + p->drawLineSegments( lLineArray ); + } + // Rectangular buttons + else { + QPointArray highShade( hWidth * 4 ); + QPointArray lowShade( hWidth * 4 ); + + p->setPen( g.shadow() ); + for ( i = 0; i < bWidth && w > 2 && h > 2; ++i, ++x, ++y, w -= 2, h -= 2 ) + p->drawRect( x, y , w, h ); + + if ( !hWidth ) + return ; + + x2 = x + w - 1, y2 = y + h - 1; + for ( i = 0; i < hWidth; ++i, ++x, ++y, --x2, --y2 ) { + highShade.putPoints( i * 4, 4, x, y, x2, y, x, y, x, y2 ); + lowShade.putPoints( i * 4, 4, x, y2, x2, y2, x2, y, x2, y2 ); + } + if ( style == Windows && hWidth > 1 ) { + p->setPen( highPen ); + p->drawLineSegments( highShade, 0, 2 ); + p->setPen( lowPen ); + p->drawLineSegments( lowShade, 0, 2 ); + + p->setPen( ( sunken ) ? g.dark() : g.mid() ); + p->drawLineSegments( highShade, 4 ); + p->setPen( ( sunken ) ? g.mid() : g.dark() ); + p->drawLineSegments( lowShade, 4 ); + } + else { + p->setPen( ( sunken ) ? g.dark() : g.light() ); + p->drawLineSegments( highShade ); + p->setPen( ( sunken ) ? g.light() : g.dark() ); + p->drawLineSegments( lowShade ); + } + } +} + +void OThemeStyle::drawPushButtonLabel( QPushButton *btn, QPainter *p ) +{ + WidgetType widget = btn->isDown() || btn->isOn() ? PushButtonDown : + PushButton; + const QColorGroup *cg = colorGroup( btn->colorGroup(), widget ); + int x, y, w, h; + + QRect r = btn->rect(); + r.rect( &x, &y, &w, &h ); + x += decoWidth( widget ); + y += decoWidth( widget ); + w -= decoWidth( widget ) * 2; + h -= decoWidth( widget ) * 2; + bool act = btn->isOn() || btn->isDown(); + + // If this is a button with an associated popup menu, draw an arrow first + if ( btn->popup() ) { + int dx = menuButtonIndicatorWidth( btn->height() ); + + QColorGroup g( btn->colorGroup() ); + int xx = x + w - dx - 4; + int yy = y - 3; + int hh = h + 6; + + if ( !act ) { + p->setPen( g.light() ); + p->drawLine( xx, yy + 3, xx, yy + hh - 4 ); + } + else { + p->setPen( g.button() ); + p->drawLine( xx, yy + 4, xx, yy + hh - 4 ); + } + drawArrow( p, DownArrow, FALSE, + x + w - dx - 2, y + 2, dx, h - 4, + btn->colorGroup(), + btn->isEnabled() ); + w -= dx; + } + + // Next, draw iconset, if any + if ( btn->iconSet() && !btn->iconSet() ->isNull() ) { + QIconSet::Mode mode = btn->isEnabled() + ? QIconSet::Normal : QIconSet::Disabled; + if ( mode == QIconSet::Normal && btn->hasFocus() ) + mode = QIconSet::Active; + QPixmap pixmap = btn->iconSet() ->pixmap( QIconSet::Small, mode ); + int pixw = pixmap.width(); + int pixh = pixmap.height(); + + p->drawPixmap( x + 6, y + h / 2 - pixh / 2, pixmap ); + x += pixw + 8; + w -= pixw + 8; + } + + if ( widget == PushButtonDown ) { + drawItem( p, x + buttonXShift(), y + buttonYShift(), + w, h, AlignCenter | ShowPrefix, *cg, btn->isEnabled(), + btn->pixmap(), btn->text(), -1, &cg->buttonText() ); + } + else { + drawItem( p, x, y, w, h, AlignCenter | ShowPrefix, *cg, + btn->isEnabled(), btn->pixmap(), btn->text(), -1, + &cg->buttonText() ); + } +} + +int OThemeStyle::splitterWidth() const +{ + return ( splitWidth() ); +} + +void OThemeStyle::drawSplitter( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, Orientation ) +{ + drawBaseButton( p, x, y, w, h, *colorGroup( g, Splitter ), false, false, + Splitter ); +} + +void OThemeStyle::drawCheckMark( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool act, bool dis ) +{ + if ( isPixmap( CheckMark ) ) { + if ( !dis ) + p->drawPixmap( x + ( w - uncached( CheckMark ) ->width() ) / 2, + y + ( h - uncached( CheckMark ) ->height() ) / 2, + *uncached( CheckMark ) ); + } + else + QWindowsStyle::drawCheckMark( p, x, y, w, h, *colorGroup( g, CheckMark ), + act, dis ); +} + +int OThemeStyle::popupMenuItemHeight( bool /*checkable*/, QMenuItem *mi, + const QFontMetrics &fm ) +{ + int h2, h = 0; + int offset = QMAX( decoWidth( MenuItemDown ), decoWidth( MenuItem ) ) + 4; + + if ( mi->isSeparator() ) + return ( 2 ); + if ( mi->isChecked() ) + h = isPixmap( CheckMark ) ? uncached( CheckMark ) ->height() + offset : + offset + 16; + if ( mi->pixmap() ) { + h2 = mi->pixmap() ->height() + offset; + h = h2 > h ? h2 : h; + } + if ( mi->iconSet() ) { + h2 = mi->iconSet() -> + pixmap( QIconSet::Small, QIconSet::Normal ).height() + offset; + h = h2 > h ? h2 : h; + } + h2 = fm.height() + offset; + h = h2 > h ? h2 : h; + return ( h ); +} + +void OThemeStyle::drawPopupMenuItem( QPainter* p, bool checkable, int maxpmw, + int tab, QMenuItem* mi, + const QPalette& pal, bool act, + bool enabled, int x, int y, int w, int h ) +{ + // I changed the following method to be based from Qt's instead of my own + // wacky code. Works much better now :P (mosfet) + static const int motifItemFrame = 2; // menu item frame width + static const int motifItemHMargin = 5; // menu item hor text margin + static const int motifItemVMargin = 4; // menu item ver text margin + + static const int motifArrowHMargin = 6; // arrow horizontal margin + static const int windowsRightBorder = 12; // right border on windowsstatic const int windowsCheckMarkWidth = 12; // checkmarks width on windows + bool dis = !enabled; + const QColorGroup &g = dis ? *colorGroup( pal.normal(), MenuItem ) : + *colorGroup( pal.normal(), MenuItemDown ); + + QColorGroup itemg = dis ? *colorGroup( pal.disabled(), MenuItem ) + : act ? *colorGroup( pal.active(), MenuItemDown ) + : *colorGroup( pal.normal(), MenuItem ); + + maxpmw = QMAX( maxpmw, 20 ); + int checkcol = maxpmw; + + if ( mi && mi->isSeparator() ) { + p->setPen( g.dark() ); + p->drawLine( x, y, x + w, y ); + p->setPen( g.light() ); + p->drawLine( x, y + 1, x + w, y + 1 ); + return ; + } + if ( act ) { + drawBaseButton( p, x, y, w, h, g, true, false, MenuItemDown ); + } + else { + drawShade( p, x, y, w, h, *colorGroup( g, MenuItem ), false, false, + highlightWidth( MenuItem ), borderWidth( MenuItem ), + shade() ); + int dw = decoWidth( MenuItem ); + if ( !isPixmap( MenuItem ) ) + p->fillRect( x + dw, y + dw, w - dw * 2, h - dw * 2, + colorGroup( g, MenuItem ) -> + brush( QColorGroup::Background ) ); + else { + // process inactive item pixmaps as one large item + p->drawTiledPixmap( x + dw, y + dw, w - dw * 2, h - dw * 2, *scalePixmap + // (w, p->window().height(), MenuItem), + ( w, p->clipRegion().boundingRect().height(), MenuItem ), + x, y ); + } + + if ( checkable && mi && mi->isChecked() ) { + // draw 'pressed' border around checkable items + // This is extremely important for items that have an iconset + // because the checkmark isn't drawn in that case + // An alternative would be superimposing the checkmark over + // the iconset instead or not drawing the iconset at all. + int mw = checkcol + motifItemFrame; + drawShade( p, x, y, mw, h, g, true, false, + highlightWidth( MenuItemDown ), + borderWidth( MenuItemDown ), shade() ); + } + } + if ( !mi ) + return ; + if ( mi->iconSet() ) { + QIconSet::Mode mode = dis ? QIconSet::Disabled : QIconSet::Normal; + if ( act && !dis ) + mode = QIconSet::Active; + QPixmap pixmap = mi->iconSet() ->pixmap( QIconSet::Small, mode ); + int pixw = pixmap.width(); + int pixh = pixmap.height(); + QRect cr( x, y, checkcol, h ); + QRect pmr( 0, 0, pixw, pixh ); + pmr.moveCenter( cr.center() ); + p->setPen( itemg.text() ); + p->drawPixmap( pmr.topLeft(), pixmap ); + + } + else if ( checkable ) { + int mw = checkcol + motifItemFrame; + int mh = h - 2 * motifItemFrame; + if ( mi->isChecked() ) { + drawCheckMark( p, x + motifItemFrame, + y + motifItemFrame, mw, mh, itemg, act, dis ); + } + } + + p->setPen( colorGroup( g, act ? MenuItemDown : MenuItem ) ->text() ); + + QColor discol; + if ( dis ) { + discol = itemg.text(); + p->setPen( discol ); + } + + int xm = motifItemFrame + checkcol + motifItemHMargin; + + QString s = mi->text(); + if ( !s.isNull() ) { + int t = s.find( '\t' ); + int m = motifItemVMargin; + const int text_flags = AlignVCenter | ShowPrefix | DontClip | SingleLine; + if ( t >= 0 ) { + if ( dis && !act ) { + p->setPen( g.light() ); + p->drawText( x + w - tab - windowsRightBorder - motifItemHMargin - motifItemFrame + 1, + y + m + 1, tab, h - 2 * m, text_flags, s.mid( t + 1 ) ); + p->setPen( discol ); + } + p->drawText( x + w - tab - windowsRightBorder - motifItemHMargin - motifItemFrame, + y + m, tab, h - 2 * m, text_flags, s.mid( t + 1 ) ); + } + if ( dis && !act ) { + p->setPen( g.light() ); + p->drawText( x + xm + 1, y + m + 1, w - xm + 1, h - 2 * m, text_flags, s, t ); + p->setPen( discol ); + } + p->drawText( x + xm, y + m, w - xm - tab + 1, h - 2 * m, text_flags, s, t ); + } + else if ( mi->pixmap() ) { + QPixmap * pixmap = mi->pixmap(); + if ( pixmap->depth() == 1 ) + p->setBackgroundMode( OpaqueMode ); + p->drawPixmap( x + xm, y + motifItemFrame, *pixmap ); + if ( pixmap->depth() == 1 ) + p->setBackgroundMode( TransparentMode ); + } + if ( mi->popup() ) { + int dim = ( h - 2 * motifItemFrame ) / 2; + if ( act ) { + if ( !dis ) + discol = colorGroup( g, MenuItemDown ) ->text(); + //discol = white; + QColorGroup g2( discol, g.highlight(), + white, white, + dis ? discol : white, + discol, white ); + drawArrow( p, RightArrow, true, + x + w - motifArrowHMargin - motifItemFrame - dim, y + h / 2 - dim / 2, + dim, dim, g2, TRUE ); + } + else { + drawArrow( p, RightArrow, + false, + x + w - motifArrowHMargin - motifItemFrame - dim, y + h / 2 - dim / 2, + dim, dim, g, mi->isEnabled() ); + } + } +} + +void OThemeStyle::drawFocusRect( QPainter *p, const QRect &r, + const QColorGroup &g, const QColor *c, + bool atBorder ) +{ + p->setPen( g.dark() ); + if ( !is3DFocus() ) + QWindowsStyle::drawFocusRect( p, r, g, c, atBorder ); + else { + int i = focusOffset(); + p->drawLine( r.x() + i, r.y() + 1 + i, r.x() + i, r.bottom() - 1 - i ); + p->drawLine( r.x() + 1 + i, r.y() + i, r.right() - 1 - i, r.y() + i ); + p->setPen( g.light() ); + p->drawLine( r.right() - i, r.y() + 1 + i, r.right() - i, r.bottom() - 1 - i ); + p->drawLine( r.x() + 1 + i, r.bottom() - i, r.right() - 1 - i, r.bottom() - i ); + } +} + +#if 0 +void OThemeStyle::drawKMenuBar( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool, QBrush * ) +{ + drawBaseButton( p, x, y, w, h, *colorGroup( g, MenuBar ), false, false, + MenuBar ); +} + +void OThemeStyle::drawKMenuItem( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool active, + QMenuItem *mi, QBrush * ) +{ + const QColorGroup * cg = colorGroup( g, active ? MenuBarItem : MenuBar ); + QColor btext = cg->buttonText(); + if ( active ) + drawBaseButton( p, x, y, w, h, *cg, false, false, MenuBarItem ); + //qDrawShadePanel(p, x, y, w, h, *cg, false, 1); + + drawItem( p, x, y, w, h, AlignCenter | ShowPrefix | DontClip | SingleLine, + *cg, mi->isEnabled(), mi->pixmap(), mi->text(), + -1, &btext ); + ; +} + +void OThemeStyle::drawKProgressBlock( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, QBrush * ) +{ + drawBaseButton( p, x, y, w, h, *colorGroup( g, ProgressBar ), false, false, + ProgressBar ); +} + +void OThemeStyle::getKProgressBackground( const QColorGroup &g, QBrush &bg ) +{ + const QColorGroup * cg = colorGroup( g, ProgressBg ); + bg.setColor( cg->color( QColorGroup::Background ) ); + if ( isPixmap( ProgressBg ) ) + bg.setPixmap( *uncached( ProgressBg ) ); +} +#endif + +void OThemeStyle::tabbarMetrics( const QTabBar* t, int& hframe, int& vframe, int& overlap ) +{ + QCommonStyle::tabbarMetrics( t, hframe, vframe, overlap ); +} + +void OThemeStyle::drawTab( QPainter* p, const QTabBar* tb, QTab* t , + bool selected ) +{ + WidgetType widget = selected ? ActiveTab : InactiveTab; + const QColorGroup *cg = colorGroup( tb->colorGroup(), widget ); + int i; + int x = t->r.x(), y = t->r.y(); + int x2 = t->r.right(), y2 = t->r.bottom(); + int bWidth = borderWidth( widget ); + int hWidth = highlightWidth( widget ); + if ( tb->shape() == QTabBar::RoundedAbove ) { + if ( !selected ) { + p->fillRect( x, y, x2 - x + 1, 2, + tb->palette().normal().brush( QColorGroup::Background ) ); + y += 2; + } + p->setPen( cg->text() ); + i = 0; + if ( i < bWidth ) { + p->drawLine( x, y + 1, x, y2 ); + p->drawLine( x2, y + 1, x2, y2 ); + p->drawLine( x + 1, y, x2 - 1, y ); + if ( selected ? activeTabLine() : inactiveTabLine() ) { + p->drawLine( x, y2, x2, y2 ); + --y2; + } + ++i, ++x, ++y, --x2; + } + for ( ; i < bWidth; ++i, ++x, ++y, --x2 ) { + p->drawLine( x, y, x, y2 ); + p->drawLine( x2, y, x2, y2 ); + p->drawLine( x, y, x2, y ); + if ( selected ? activeTabLine() : inactiveTabLine() ) { + p->drawLine( x, y2, x2, y2 ); + --y2; + } + } + i = 0; + if ( i < hWidth && bWidth == 0 ) { + p->setPen( cg->light() ); + p->drawLine( x, y + 1, x, y2 ); + p->drawLine( x + 1, y, x2 - 1, y ); + p->setPen( cg->dark() ); + p->drawLine( x2, y + 1, x2, y2 ); + if ( selected ? activeTabLine() : inactiveTabLine() ) { + p->drawLine( x, y2, x2, y2 ); + --y2; + } + ++i, ++x, ++y, --x2; + } + for ( ; i < hWidth; ++i, ++x, ++y, --x2 ) { + p->setPen( cg->light() ); + p->drawLine( x, y, x, y2 ); + p->drawLine( x, y, x2, y ); + p->setPen( cg->dark() ); + p->drawLine( x2, y + 1, x2, y2 ); + if ( selected ? activeTabLine() : inactiveTabLine() ) { + p->drawLine( x, y2, x2, y2 ); + --y2; + } + } + if ( isPixmap( widget ) ) + p->drawTiledPixmap( x, y, x2 - x + 1, y2 - y + 1, + *scalePixmap( x2 - x + 1, y2 - y + 1, widget ) ); + else + p->fillRect( x, y, x2 - x + 1, y2 - y + 1, cg->background() ); + } + else if ( tb->shape() == QTabBar::RoundedBelow ) { + if ( !selected ) { + p->fillRect( x, y2 - 2, x2 - x + 1, 2, + tb->palette().normal().brush( QColorGroup::Background ) ); + y2 -= 2; + } + p->setPen( cg->text() ); + i = 0; + if ( i < bWidth ) { + p->drawLine( x, y, x, y2 - 1 ); + p->drawLine( x2, y, x2, y2 - 1 ); + p->drawLine( x + 1, y2, x2 - 1, y2 ); + if ( selected ? activeTabLine() : inactiveTabLine() ) { + p->drawLine( x, y, x2, y ); + ++y; + } + } + for ( ; i < bWidth; ++i, ++x, --x2, --y2 ) { + p->drawLine( x, y, x, y2 ); + p->drawLine( x2, y, x2, y2 ); + p->drawLine( x, y2, x2, y2 ); + if ( selected ? activeTabLine() : inactiveTabLine() ) { + p->drawLine( x, y, x2, y ); + ++y; + } + } + i = 0; + if ( i < hWidth && bWidth == 0 ) { + p->setPen( cg->dark() ); + p->drawLine( x + 1, y2, x2 - 1, y2 ); + p->drawLine( x2, y, x2, y2 - 1 ); + p->setPen( cg->light() ); + p->drawLine( x, y, x, y2 - 1 ); + if ( selected ? activeTabLine() : inactiveTabLine() ) { + p->drawLine( x, y, x2, y ); + ++y; + } + ++i, ++x, --x2, --y2; + } + for ( ; i < hWidth; ++i, ++x, --x2, --y2 ) { + p->setPen( cg->dark() ); + p->drawLine( x, y2, x2, y2 ); + p->drawLine( x2, y, x2, y2 ); + p->setPen( cg->light() ); + p->drawLine( x, y, x, y2 ); + if ( selected ? activeTabLine() : inactiveTabLine() ) { + p->drawLine( x, y, x2, y ); + ++y; + } + } + if ( isPixmap( widget ) ) + p->drawTiledPixmap( x, y, x2 - x + 1, y2 - y + 1, + *scalePixmap( x2 - x + 1, y2 - y + 1, widget ) ); + else + p->fillRect( x, y, x2 - x + 1, y2 - y + 1, cg->background() ); + } + else + QCommonStyle::drawTab( p, tb, t, selected ); +} + +void OThemeStyle::drawTabMask( QPainter* p, const QTabBar* tb, QTab* t, + bool selected ) +{ + QRect r( t->r ); + + if ( tb->shape() == QTabBar::RoundedAbove ) { + if ( !selected ) + r.setTop( r.top() + 2 ); + p->drawLine( r.left() + 1, r.top(), r.right() - 1, r.top() ); + QBrush b( color1, SolidPattern ); + p->fillRect( r.left(), r.top() + 1, r.width(), r.height() - 1, b ); + } + else if ( tb->shape() == QTabBar::RoundedBelow ) { + if ( !selected ) + r.setBottom( r.bottom() - 2 ); + p->drawLine( r.left() + 1, r.bottom(), r.right() - 1, r.bottom() ); + QBrush b( color1, SolidPattern ); + p->fillRect( r.left(), r.top(), r.width(), r.height() - 1, b ); + } + else + QCommonStyle::drawTabMask( p, tb, t, selected ); + +} + + +//#include "kthemestyle.moc" + |