/**************************************************************************** ** ** Implementation of Motif-like style class ** ** Created : 981231 ** ** Copyright (C) 1998-2008 Trolltech ASA. All rights reserved. ** ** This file is part of the widgets module of the Qt GUI Toolkit. ** ** This file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free ** Software Foundation and appearing in the files LICENSE.GPL2 ** and LICENSE.GPL3 included in the packaging of this file. ** Alternatively you may (at your option) use any later version ** of the GNU General Public License if such license has been ** publicly approved by Trolltech ASA (or its successors, if any) ** and the KDE Free Qt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** This file may be used under the terms of the Q Public License as ** defined by Trolltech ASA and appearing in the file LICENSE.QPL ** included in the packaging of this file. Licensees holding valid Qt ** Commercial licenses may use this file in accordance with the Qt ** Commercial License Agreement provided with the Software. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted ** herein. ** **********************************************************************/ #include "qsgistyle.h" #if !defined(QT_NO_STYLE_SGI) || defined(QT_PLUGIN) #include "qpopupmenu.h" #include "qapplication.h" #include "qbutton.h" #include "qpainter.h" #include "qdrawutil.h" #include "qpixmap.h" #include "qpalette.h" #include "qwidget.h" #include "qpushbutton.h" #include "qscrollbar.h" #include "qcombobox.h" #include "qslider.h" #include "qtextedit.h" #include "qtoolbar.h" #include "qlineedit.h" #include "qmenubar.h" #include #ifndef QT_NO_SLIDER struct SliderLastPosition { SliderLastPosition() : rect(0,-1,0,-1), slider(0) {} QRect rect; const void* slider; }; #endif #ifndef QT_NO_SCROLLBAR struct ScrollbarLastPosition { ScrollbarLastPosition() : rect( 0,-1, 0,-1 ), scrollbar(0) {} QRect rect; const void* scrollbar; }; #endif class QSGIStylePrivate { public: QSGIStylePrivate() : hotWidget( 0 ), mousePos( -1, -1 ) { } const void* hotWidget; QPoint mousePos; #ifndef QT_NO_SCROLLBAR ScrollbarLastPosition lastScrollbarRect; #endif #ifndef QT_NO_SLIDER SliderLastPosition lastSliderRect; #endif }; /*! \class QSGIStyle qsgistyle.h \brief The QSGIStyle class provides SGI/Irix look and feel. \ingroup appearance This class implements the SGI look and feel. It resembles the SGI/Irix Motif GUI style as closely as QStyle allows. */ /*! Constructs a QSGIStyle. If \a useHighlightCols is FALSE (default value), the style will polish the application's color palette to emulate the Motif way of highlighting, which is a simple inversion between the base and the text color. \sa QMotifStyle::useHighlightColors() */ QSGIStyle::QSGIStyle( bool useHighlightCols ) : QMotifStyle( useHighlightCols ), isApplicationStyle( 0 ) { d = new QSGIStylePrivate; } /*! Destroys the style. */ QSGIStyle::~QSGIStyle() { delete d; } /*! \reimp Changes some application-wide settings to be SGI-like, e.g. sets a bold italic font for menu options. */ void QSGIStyle::applicationPolish( const QStyleControlElementData &ceData, ControlElementFlags elementFlags, void *ptr ) { isApplicationStyle = 1; QMotifStyle::polish( ceData, elementFlags, ptr ); QPalette pal = QApplication::palette(); // check this on SGI-Boxes //pal.setColor( QColorGroup::Background, pal.active().midlight() ); if (pal.active().button() == pal.active().background()) pal.setColor( QColorGroup::Button, pal.active().button().dark(120) ); // darker basecolor in list-widgets pal.setColor( QColorGroup::Base, pal.active().base().dark(130) ); if (! useHighlightColors() ) { pal.setColor( QPalette::Active, QColorGroup::Highlight, pal.active().text() ); pal.setColor( QPalette::Active, QColorGroup::HighlightedText, pal.active().base() ); pal.setColor( QPalette::Inactive, QColorGroup::Highlight, pal.inactive().text() ); pal.setColor( QPalette::Inactive, QColorGroup::HighlightedText, pal.inactive().base() ); pal.setColor( QPalette::Disabled, QColorGroup::Highlight, pal.disabled().text() ); pal.setColor( QPalette::Disabled, QColorGroup::HighlightedText, pal.disabled().base() ); } QApplication::setPalette( pal, TRUE ); // different basecolor and highlighting in Q(Multi)LineEdit pal.setColor( QColorGroup::Base, QColor(211,181,181) ); pal.setColor( QPalette::Active, QColorGroup::Highlight, pal.active().midlight() ); pal.setColor( QPalette::Active, QColorGroup::HighlightedText, pal.active().text() ); pal.setColor( QPalette::Inactive, QColorGroup::Highlight, pal.inactive().midlight() ); pal.setColor( QPalette::Inactive, QColorGroup::HighlightedText, pal.inactive().text() ); pal.setColor( QPalette::Disabled, QColorGroup::Highlight, pal.disabled().midlight() ); pal.setColor( QPalette::Disabled, QColorGroup::HighlightedText, pal.disabled().text() ); QApplication::setPalette( pal, TRUE, "QLineEdit" ); QApplication::setPalette( pal, TRUE, "QTextEdit" ); QApplication::setPalette( pal, TRUE, "QDateTimeEditBase" ); pal = QApplication::palette(); pal.setColor( QColorGroup::Button, pal.active().background() ); QApplication::setPalette( pal, TRUE, "QMenuBar" ); QApplication::setPalette( pal, TRUE, "QToolBar" ); QApplication::setPalette( pal, TRUE, "QPopupMenu" ); } /*! \reimp */ void QSGIStyle::applicationUnPolish( const QStyleControlElementData&, ControlElementFlags, void * ) { QFont f = QApplication::font(); QApplication::setFont( f, TRUE ); // get rid of the special fonts for special widget classes } /*! \reimp Installs an event filter for several widget classes to enable hovering. */ void QSGIStyle::polish( const QStyleControlElementData &ceData, ControlElementFlags elementFlags, void *ptr ) { QMotifStyle::polish(ceData, elementFlags, ptr); if ( !isApplicationStyle ) { QPalette sgiPal = QApplication::palette(); sgiPal.setColor( QColorGroup::Background, sgiPal.active().midlight() ); if (sgiPal.active().button() == sgiPal.active().background()) sgiPal.setColor( QColorGroup::Button, sgiPal.active().button().dark(110) ); sgiPal.setColor( QColorGroup::Base, sgiPal.active().base().dark(130) ); if (! useHighlightColors() ) { sgiPal.setColor( QPalette::Active, QColorGroup::Highlight, sgiPal.active().text() ); sgiPal.setColor( QPalette::Active, QColorGroup::HighlightedText, sgiPal.active().base() ); sgiPal.setColor( QPalette::Inactive, QColorGroup::Highlight, sgiPal.inactive().text() ); sgiPal.setColor( QPalette::Inactive, QColorGroup::HighlightedText, sgiPal.inactive().base() ); sgiPal.setColor( QPalette::Disabled, QColorGroup::Highlight, sgiPal.disabled().text() ); sgiPal.setColor( QPalette::Disabled, QColorGroup::HighlightedText, sgiPal.disabled().base() ); } if ( (ceData.widgetObjectTypes.contains("QLineEdit")) || (ceData.widgetObjectTypes.contains("QTextEdit")) ) { // different basecolor and highlighting in Q(Multi)LineEdit sgiPal.setColor( QColorGroup::Base, QColor(211,181,181) ); sgiPal.setColor( QPalette::Active, QColorGroup::Highlight, sgiPal.active().midlight() ); sgiPal.setColor( QPalette::Active, QColorGroup::HighlightedText, sgiPal.active().text() ); sgiPal.setColor( QPalette::Inactive, QColorGroup::Highlight, sgiPal.inactive().midlight() ); sgiPal.setColor( QPalette::Inactive, QColorGroup::HighlightedText, sgiPal.inactive().text() ); sgiPal.setColor( QPalette::Disabled, QColorGroup::Highlight, sgiPal.disabled().midlight() ); sgiPal.setColor( QPalette::Disabled, QColorGroup::HighlightedText, sgiPal.disabled().text() ); } else if ( (ceData.widgetObjectTypes.contains("QMenuBar")) || (ceData.widgetObjectTypes.contains("QToolBar")) ) { sgiPal.setColor( QColorGroup::Button, sgiPal.active().midlight() ); } widgetActionRequest(ceData, elementFlags, ptr, WAR_SetPalette, QStyleWidgetActionRequestData(sgiPal)); } if ( (ceData.widgetObjectTypes.contains("QButton")) || (ceData.widgetObjectTypes.contains("QSlider")) || (ceData.widgetObjectTypes.contains("QScrollBar")) ) { installObjectEventHandler(ceData, elementFlags, ptr, this); widgetActionRequest(ceData, elementFlags, ptr, WAR_EnableMouseTracking); #ifndef QT_NO_SCROLLBAR if ( ceData.widgetObjectTypes.contains("QScrollBar") ) { widgetActionRequest(ceData, elementFlags, ptr, WAR_SetBackgroundMode, QStyleWidgetActionRequestData(QWidget::NoBackground)); } #endif } else if ( ceData.widgetObjectTypes.contains("QComboBox") ) { QFont f = QApplication::font(); f.setBold( TRUE ); f.setItalic( TRUE ); widgetActionRequest(ceData, elementFlags, ptr, WAR_SetFont, QStyleWidgetActionRequestData(f)); #ifndef QT_NO_MENUBAR } else if ( ceData.widgetObjectTypes.contains("QMenuBar") ) { widgetActionRequest(ceData, elementFlags, ptr, WAR_FrameSetStyle, QStyleWidgetActionRequestData(QFrame::StyledPanel | QFrame::Raised)); widgetActionRequest(ceData, elementFlags, ptr, WAR_SetBackgroundMode, QStyleWidgetActionRequestData(QWidget::PaletteBackground)); QFont f = QApplication::font(); f.setBold( TRUE ); f.setItalic( TRUE ); widgetActionRequest(ceData, elementFlags, ptr, WAR_SetFont, QStyleWidgetActionRequestData(f)); #endif #ifndef QT_NO_POPUPMENU } else if ( ceData.widgetObjectTypes.contains("QPopupMenu") ) { QStyleWidgetActionRequestData requestData; widgetActionRequest(ceData, elementFlags, ptr, WAR_FrameSetLineWidth, QStyleWidgetActionRequestData(pixelMetric( PM_DefaultFrameWidth, QStyleControlElementData(), CEF_None ) + 1)); QFont f = QApplication::font(); f.setBold( TRUE ); f.setItalic( TRUE ); widgetActionRequest(ceData, elementFlags, ptr, WAR_SetFont, QStyleWidgetActionRequestData(f)); #endif } else if ( (ceData.widgetObjectTypes.contains("QToolBar")) || (ceData.widgetObjectTypes.contains("QToolBarSeparator")) ) { widgetActionRequest(ceData, elementFlags, ptr, WAR_SetBackgroundMode, QStyleWidgetActionRequestData(QWidget::PaletteBackground)); } } /*! \reimp */ void QSGIStyle::unPolish( const QStyleControlElementData &ceData, ControlElementFlags elementFlags, void *ptr ) { if ( (ceData.widgetObjectTypes.contains("QButton")) || (ceData.widgetObjectTypes.contains("QSlider")) || (ceData.widgetObjectTypes.contains("QScrollBar")) ) { removeObjectEventHandler(ceData, elementFlags, ptr, this); #ifndef QT_NO_POPUPMENU } else if ( ceData.widgetObjectTypes.contains("QPopupMenu") ) { widgetActionRequest(ceData, elementFlags, ptr, WAR_FrameSetLineWidth, QStyleWidgetActionRequestData(pixelMetric( PM_DefaultFrameWidth, QStyleControlElementData(), CEF_None ))); widgetActionRequest(ceData, elementFlags, ptr, WAR_SetFont, QStyleWidgetActionRequestData(QApplication::font())); #endif #if !defined(QT_NO_MENUBAR) || !defined(QT_NO_COMBOBOX) } else if ( (ceData.widgetObjectTypes.contains("QMenuBar")) || (ceData.widgetObjectTypes.contains("QComboBox")) ) { widgetActionRequest(ceData, elementFlags, ptr, WAR_SetFont, QStyleWidgetActionRequestData(QApplication::font())); #endif } } /*! \reimp */ bool QSGIStyle::objectEventHandler( const QStyleControlElementData &ceData, ControlElementFlags elementFlags, void* source, QEvent *e ) { if ( (!(ceData.widgetObjectTypes.contains("QWidget"))) || (e->type() == QEvent::Paint) ) return QMotifStyle::objectEventHandler( ceData, elementFlags, source, e ); switch ( e->type() ) { case QEvent::MouseButtonPress: { #ifndef QT_NO_SCROLLBAR if (ceData.widgetObjectTypes.contains("QScrollBar")) { d->lastScrollbarRect.rect = ceData.sliderRect; d->lastScrollbarRect.scrollbar = source; widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); } else #endif { #ifndef QT_NO_SLIDER if (ceData.widgetObjectTypes.contains("QSlider")) { d->lastSliderRect.rect = ceData.sliderRect; d->lastSliderRect.slider = source; widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); } #endif } } break; case QEvent::MouseButtonRelease: { if ( 0 ) { #ifndef QT_NO_SCROLLBAR } else if (ceData.widgetObjectTypes.contains("QScrollBar")) { QRect oldRect = d->lastScrollbarRect.rect; d->lastScrollbarRect.rect = QRect( 0, -1, 0, -1 ); widgetActionRequest(ceData, elementFlags, source, WAR_RepaintRect, QStyleWidgetActionRequestData(oldRect)); #endif #ifndef QT_NO_SLIDER } else if (ceData.widgetObjectTypes.contains("QSlider")) { QRect oldRect = d->lastSliderRect.rect; d->lastSliderRect.rect = QRect( 0, -1, 0, -1 ); widgetActionRequest(ceData, elementFlags, source, WAR_RepaintRect, QStyleWidgetActionRequestData(oldRect)); #endif } } break; case QEvent::MouseMove: if ( !(elementFlags & CEF_IsActiveWindow) ) break; if ( ((QMouseEvent*)e)->button() ) break; d->hotWidget = source; d->mousePos = ((QMouseEvent*)e)->pos(); widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); break; case QEvent::Enter: if ( !(elementFlags & CEF_IsActiveWindow) ) break; d->hotWidget = source; widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); break; case QEvent::Leave: if ( !(elementFlags & CEF_IsActiveWindow) ) break; if ( source == d->hotWidget) { d->hotWidget = 0; widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); } break; default: break; } return QMotifStyle::objectEventHandler( ceData, elementFlags, source, e ); } static const int sgiItemFrame = 2; // menu item frame width // static const int sgiSepHeight = 1; // separator item height static const int sgiItemHMargin = 3; // menu item hor text margin static const int sgiItemVMargin = 2; // menu item ver text margin static const int sgiArrowHMargin = 6; // arrow horizontal margin static const int sgiTabSpacing = 12; // space between text and tab // static const int sgiCheckMarkHMargin = 2; // horiz. margins of check mark ### not used?!? static const int sgiCheckMarkSpace = 20; /*! \reimp */ int QSGIStyle::pixelMetric( PixelMetric metric, const QStyleControlElementData &ceData, ControlElementFlags elementFlags, const QWidget *widget ) const { switch ( metric ) { case PM_DefaultFrameWidth: return 2; case PM_ButtonDefaultIndicator: return 4; case PM_ScrollBarExtent: return 21; case PM_IndicatorWidth: case PM_IndicatorHeight: return 14; case PM_ExclusiveIndicatorWidth: case PM_ExclusiveIndicatorHeight: return 12; case PM_SplitterWidth: return QMAX( 10, QApplication::globalStrut().width() ); case PM_MenuIndicatorFrameHBorder: return (sgiItemFrame+2); case PM_MenuIndicatorFrameVBorder: return (sgiItemFrame+4); case PM_MenuIconIndicatorFrameHBorder: case PM_MenuIconIndicatorFrameVBorder: return sgiItemFrame; default: break; } return QMotifStyle::pixelMetric( metric, ceData, elementFlags, widget ); } static void drawPanel( QPainter *p, int x, int y, int w, int h, const QColorGroup &g, bool sunken, int lineWidth, const QBrush* fill) { if ( w == 0 || h == 0 ) return; #if defined(CHECK_RANGE) ASSERT( w > 0 && h > 0 && lineWidth >= 0 ); #endif QPen oldPen = p->pen(); // save pen QPointArray a( 4*lineWidth ); if ( sunken ) p->setPen( g.dark() ); else p->setPen( g.light() ); int x1, y1, x2, y2; int i; int n = 0; x1 = x; y1 = y2 = y; x2 = x+w-2; for ( i=0; idrawLineSegments( a ); n = 0; if ( sunken ) p->setPen( g.light() ); else p->setPen( g.dark() ); x1 = x; y1 = y2 = y+h-1; x2 = x+w-1; for ( i=0; idrawLineSegments( a ); if ( fill ) { // fill with fill color QBrush oldBrush = p->brush(); p->setPen( Qt::NoPen ); p->setBrush( *fill ); p->drawRect( x+lineWidth, y+lineWidth, w-lineWidth*2, h-lineWidth*2 ); p->setBrush( oldBrush ); } p->setPen( oldPen ); // restore pen } static void drawSeparator( QPainter *p, int x1, int y1, int x2, int y2, const QColorGroup &g ) { QPen oldPen = p->pen(); p->setPen( g.midlight() ); p->drawLine( x1, y1, x2, y2 ); p->setPen( g.shadow() ); if ( y2-y1 < x2-x1 ) p->drawLine( x1, y1+1, x2, y2+1 ); else p->drawLine( x1+1, y1, x2+1, y2 ); p->setPen( oldPen ); } static void drawSGIPrefix( QPainter *p, int x, int y, QString* miText ) { if ( miText && (!!(*miText)) ) { int amp = 0; bool nextAmp = FALSE; while ( ( amp = miText->find( '&', amp ) ) != -1 ) { if ( (uint)amp == miText->length()-1 ) return; miText->remove( amp,1 ); nextAmp = (*miText)[amp] == '&'; // next time if && if ( !nextAmp ) { // draw special underlining uint ulx = p->fontMetrics().width(*miText, amp); uint ulw = p->fontMetrics().width(*miText, amp+1) - ulx; p->drawLine( x+ulx, y, x+ulx+ulw, y ); p->drawLine( x+ulx, y+1, x+ulx+ulw/2, y+1 ); p->drawLine( x+ulx, y+2, x+ulx+ulw/4, y+2 ); } amp++; } } } static int get_combo_extra_width( int h, int *return_awh=0 ) { int awh; if ( h < 8 ) { awh = 6; } else if ( h < 14 ) { awh = h - 2; } else { awh = h/2; } if ( return_awh ) *return_awh = awh; return awh*2; } static void get_combo_parameters( const QRect &r, int &ew, int &awh, int &ax, int &ay, int &sh, int &dh, int &sy ) { ew = get_combo_extra_width( r.height(), &awh ); sh = (awh+3)/4; if ( sh < 3 ) sh = 3; dh = sh/2 + 1; ay = r.y() + (r.height()-awh-sh-dh)/2; if ( ay < 0 ) { //panic mode ay = 0; sy = r.height(); } else { sy = ay+awh+dh; } if( QApplication::reverseLayout() ) ax = r.x(); else ax = r.x() + r.width() - ew; ax += (ew-awh)/2; } /*! \reimp */ void QSGIStyle::drawPrimitive( PrimitiveElement pe, QPainter *p, const QStyleControlElementData &ceData, ControlElementFlags elementFlags, const QRect &r, const QColorGroup &cg, SFlags flags, const QStyleOption& opt ) const { const int x = r.x(); const int y = r.y(); const int w = r.width(); const int h = r.height(); const bool sunken = flags & ( Style_Sunken | Style_Down | Style_On ); const int defaultFrameWidth = pixelMetric( PM_DefaultFrameWidth, ceData, elementFlags ); bool hot = ( flags & Style_MouseOver ) && ( flags & Style_Enabled ); bool dis = ! (flags & Style_Enabled); bool act = flags & Style_Active; switch ( pe ) { case PE_ButtonCommand: { QBrush fill; if ( hot ) { if ( sunken ) fill = cg.brush( QColorGroup::Dark ); else fill = cg.brush( QColorGroup::Midlight ); } else if ( sunken ) { fill = cg.brush( QColorGroup::Mid ); } else { fill = cg.brush( QColorGroup::Button ); } drawPanel( p, x, y, w, h, cg, sunken, defaultFrameWidth, &fill ); } break; case PE_PanelPopup: case PE_ButtonBevel: case PE_ButtonTool: { drawPrimitive( PE_ButtonCommand, p, ceData, elementFlags, QRect( x+1, y+1, w-2, h-2 ), cg, flags, opt ); QPen oldPen = p->pen(); QPointArray a; // draw twocolored rectangle p->setPen( sunken ? cg.light() : cg.dark().dark(200) ); a.setPoints( 3, x, y+h-1, x+w-1, y+h-1, x+w-1, y ); p->drawPolyline( a ); p->setPen( cg.dark() ); a.setPoints( 3, x, y+h-2, x, y, x+w-2, y ); p->drawPolyline( a ); p->setPen( oldPen ); } break; case PE_ArrowUp: case PE_ArrowDown: case PE_ArrowLeft: case PE_ArrowRight: { QPointArray a; // arrow polygon switch ( pe ) { case PE_ArrowUp: a.setPoints( 3, 0,-5, -5,4, 4,4 ); break; case PE_ArrowDown: a.setPoints( 3, 0,4, -4,-4, 4,-4 ); break; case PE_ArrowLeft: a.setPoints( 3, -4,0, 4,-5, 4,4 ); break; case PE_ArrowRight: a.setPoints( 3, 4,0, -4,-5, -4,4 ); break; default: return; } p->save(); p->setPen( Qt::NoPen ); a.translate( x+w/2, y+h/2 ); p->setBrush( flags & Style_Enabled ? cg.dark() : cg.light() ); p->drawPolygon( a ); // draw arrow p->restore(); } break; case PE_Indicator: { QRect er = r; er.addCoords( 1, 1, -1, -1 ); int iflags = flags & ~Style_On; drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, er, cg, iflags, opt ); if ( !(flags & QStyle::Style_Off) ) { er = r; er.addCoords( 1, 2, 1, 1 ); drawPrimitive( PE_CheckMark, p, ceData, elementFlags, er, cg, flags, opt ); } } break; case PE_IndicatorMask: { QPen oldPen = p->pen(); QBrush oldBrush = p->brush(); p->setPen( Qt::color1 ); p->setBrush( Qt::color1 ); p->fillRect( x, y, w, h, QBrush( Qt::color0 ) ); QRect er = r; er.addCoords( 1, 1, -1, -1 ); p->fillRect(er, QBrush(Qt::color1)); if ( !(flags & QStyle::Style_Off) ) { er = r; er.addCoords( 1, 2, 1, 1 ); static const QCOORD check_mark[] = { 14,0, 10,0, 11,1, 8,1, 9,2, 7,2, 8,3, 6,3, 7,4, 1,4, 6,5, 1,5, 6,6, 3,6, 5,7, 4,7, 5,8, 5,8, 4,3, 2,3, 3,2, 3,2 }; QPointArray amark; amark = QPointArray( sizeof(check_mark)/(sizeof(QCOORD)*2), check_mark ); amark.translate( er.x()+1, er.y()+1 ); p->drawLineSegments( amark ); amark.translate( -1, -1 ); p->drawLineSegments( amark ); } p->setBrush( oldBrush ); p->setPen( oldPen ); } break; case PE_CheckMark: { static const QCOORD check_mark[] = { 14,0, 10,0, 11,1, 8,1, 9,2, 7,2, 8,3, 6,3, 7,4, 1,4, 6,5, 1,5, 6,6, 3,6, 5,7, 4,7, 5,8, 5,8, 4,3, 2,3, 3,2, 3,2 }; QPen oldPen = p->pen(); QPointArray amark; amark = QPointArray( sizeof(check_mark)/(sizeof(QCOORD)*2), check_mark ); amark.translate( x+1, y+1 ); if ( flags & Style_On ) { p->setPen( flags & Style_Enabled ? cg.shadow() : cg.dark() ); p->drawLineSegments( amark ); amark.translate( -1, -1 ); p->setPen( flags & Style_Enabled ? QColor(255,0,0) : cg.dark() ); p->drawLineSegments( amark ); p->setPen( oldPen ); } else { p->setPen( flags & Style_Enabled ? cg.dark() : cg.mid() ); p->drawLineSegments( amark ); amark.translate( -1, -1 ); p->setPen( flags & Style_Enabled ? QColor(230,120,120) : cg.dark() ); p->drawLineSegments( amark ); p->setPen( oldPen ); } } break; case PE_ExclusiveIndicator: { p->save(); p->eraseRect( x, y, w, h ); p->translate( x, y ); p->setPen( cg.button() ); p->setBrush( hot ? cg.midlight() : cg.button() ); QPointArray a; a.setPoints( 4, 5,0, 11,6, 6,11, 0,5); p->drawPolygon( a ); p->setPen( cg.dark() ); p->drawLine( 0,5, 5,0 ); p->drawLine( 6,0, 11,5 ); p->setPen( flags & Style_Down ? cg.light() : cg.dark() ); p->drawLine( 11,6, 6,11 ); p->drawLine( 5,11, 0,6 ); p->drawLine( 2,7, 5,10 ); p->drawLine( 6,10, 9,7 ); p->setPen( cg.light() ); p->drawLine( 2,5, 5,2 ); if ( flags & Style_On ) { p->setPen( flags & Style_Enabled ? Qt::blue : Qt::darkGray ); p->setBrush( flags & Style_Enabled ? Qt::blue : Qt::darkGray ); a.setPoints(3, 6,2, 8,4, 6,6 ); p->drawPolygon( a ); p->setBrush( Qt::NoBrush ); p->setPen( cg.shadow() ); p->drawLine( 7,7, 9,5 ); } else { p->drawLine( 6,2, 9,5 ); } p->restore(); } break; case PE_ExclusiveIndicatorMask: { p->save(); QPen oldPen = p->pen(); QBrush oldBrush = p->brush(); p->setPen( Qt::color1 ); p->setBrush( Qt::color1 ); QPointArray a; a.setPoints( 8, 0,5, 5,0, 6,0, 11,5, 11,6, 6,11, 5,11, 0,6 ); a.translate( x, y ); p->drawPolygon( a ); p->setBrush( oldBrush ); p->setPen( oldPen ); p->restore(); } break; case PE_Panel: { const int lineWidth = opt.isDefault() ? defaultFrameWidth : opt.lineWidth(); drawPanel( p, x, y, w, h, cg, flags & (Style_Sunken | Style_Down | Style_On), lineWidth, 0 ); if ( lineWidth <= 1 ) return; // draw extra shadinglines QPen oldPen = p->pen(); p->setPen( cg.midlight() ); p->drawLine( x+1, y+h-3, x+1, y+1 ); p->drawLine( x+1, y+1, x+w-3, y+1 ); p->setPen( cg.mid() ); p->drawLine( x+1, y+h-2, x+w-2, y+h-2 ); p->drawLine( x+w-2, y+h-2, x+w-2, y+1 ); p->setPen(oldPen); } break; case PE_ScrollBarSubLine: if ( !r.contains( d->mousePos ) && !(flags & Style_Active) ) flags &= ~Style_MouseOver; drawPrimitive( PE_ButtonCommand, p, ceData, elementFlags, r, cg, flags, opt ); drawPrimitive(((flags & Style_Horizontal) ? PE_ArrowLeft : PE_ArrowUp), p, ceData, elementFlags, r, cg, Style_Enabled | flags); break; case PE_ScrollBarAddLine: if ( !r.contains( d->mousePos ) ) flags &= ~Style_MouseOver; drawPrimitive( PE_ButtonCommand, p, ceData, elementFlags, r, cg, flags, opt ); drawPrimitive(((flags & Style_Horizontal) ? PE_ArrowRight : PE_ArrowDown), p, ceData, elementFlags, r, cg, Style_Enabled | flags); break; case PE_ScrollBarSubPage: case PE_ScrollBarAddPage: if ( !r.contains( d->mousePos ) ) flags &= ~Style_MouseOver; if ( r.isValid() ) qDrawShadePanel( p, x, y, w, h, cg, FALSE, 1, hot ? &cg.brush( QColorGroup::Midlight ) : &cg.brush( QColorGroup::Button ) ); break; case PE_ScrollBarSlider: { if ( !r.isValid() ) break; if ( !(r.contains( d->mousePos ) || flags & Style_Active) || !(flags & Style_Enabled ) ) flags &= ~Style_MouseOver; QPixmap pm( r.width(), r.height() ); QPainter bp( &pm ); drawPrimitive(PE_ButtonBevel, &bp, ceData, elementFlags, QRect(0,0,r.width(),r.height()), cg, flags | Style_Enabled | Style_Raised); if ( flags & Style_Horizontal ) { const int sliderM = r.width() / 2; if ( r.width() > 20 ) { drawSeparator( &bp, sliderM-5, 2, sliderM-5, r.height()-3, cg ); drawSeparator( &bp, sliderM+3, 2, sliderM+3, r.height()-3, cg ); } if ( r.width() > 10 ) drawSeparator( &bp, sliderM-1, 2, sliderM-1, r.height()-3, cg ); } else { const int sliderM = r.height() / 2; if ( r.height() > 20 ) { drawSeparator( &bp, 2, sliderM-5, r.width()-3, sliderM-5, cg ); drawSeparator( &bp, 2, sliderM+3, r.width()-3, sliderM+3, cg ); } if ( r.height() > 10 ) drawSeparator( &bp, 2, sliderM-1, r.width()-3, sliderM-1, cg ); } bp.end(); p->drawPixmap( r.x(), r.y(), pm ); } break; case PE_Splitter: { const int motifOffset = 10; int sw = pixelMetric( PM_SplitterWidth, ceData, elementFlags ); if ( flags & Style_Horizontal ) { int xPos = x + w/2; int kPos = motifOffset; int kSize = sw - 2; qDrawShadeLine( p, xPos, kPos + kSize - 1 , xPos, h, cg ); drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, QRect(xPos-sw/2+1, kPos, kSize, kSize+1), cg, flags, opt ); qDrawShadeLine( p, xPos+2, 0, xPos, kPos, cg ); } else { int yPos = y + h/2; int kPos = w - motifOffset - sw; int kSize = sw - 2; qDrawShadeLine( p, 0, yPos, kPos, yPos, cg ); drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, QRect( kPos, yPos-sw/2+1, kSize+1, kSize ), cg, flags, opt ); qDrawShadeLine( p, kPos + kSize+1, yPos, w, yPos, cg ); } } break; case PE_MenuItemIndicatorFrame: { int x, y, w, h; r.rect(&x, &y, &w, &h); SFlags cflags = Style_Default; if (! dis) cflags |= Style_Enabled; if (act) cflags |= Style_On; QRect er( x+sgiItemFrame+1, y+sgiItemFrame+3, pixelMetric(PM_IndicatorWidth, ceData, elementFlags), pixelMetric(PM_IndicatorHeight, ceData, elementFlags) ); er.addCoords( 1, 1, -1, -1 ); drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, er, cg, cflags, opt ); } break; case PE_MenuItemIndicatorIconFrame: { int x, y, w, h; r.rect(&x, &y, &w, &h); int checkcol = styleHint(SH_MenuIndicatorColumnWidth, ceData, elementFlags, opt, NULL, NULL); drawPanel( p, x+sgiItemFrame, y+sgiItemFrame, checkcol, h-2*sgiItemFrame, cg, TRUE, 1, &cg.brush( QColorGroup::Light ) ); } break; case PE_MenuItemIndicatorCheck: { int x, y, w, h; r.rect(&x, &y, &w, &h); SFlags cflags = Style_Default; if (! dis) cflags |= Style_Enabled; if (act) cflags |= Style_On; QRect er( x+sgiItemFrame+1, y+sgiItemFrame+3, pixelMetric(PM_IndicatorWidth, ceData, elementFlags), pixelMetric(PM_IndicatorHeight, ceData, elementFlags) ); er.addCoords( 1, 1, -1, -1 ); er.addCoords( 0, 1, 1, 1 ); drawPrimitive( PE_CheckMark, p, ceData, elementFlags, er, cg, cflags | Style_On, opt ); } break; default: QMotifStyle::drawPrimitive( pe, p, ceData, elementFlags, r, cg, flags, opt ); break; } } /*! \reimp */ void QSGIStyle::drawControl( ControlElement element, QPainter *p, const QStyleControlElementData &ceData, ControlElementFlags elementFlags, const QRect &r, const QColorGroup &cg, SFlags flags, const QStyleOption& opt, const QWidget *widget ) const { if ( widget == d->hotWidget ) flags |= Style_MouseOver; switch ( element ) { case CE_PushButton: { #ifndef QT_NO_PUSHBUTTON int x1, y1, x2, y2; r.coords( &x1, &y1, &x2, &y2 ); p->setPen( cg.foreground() ); p->setBrush( QBrush( cg.button(),Qt::NoBrush ) ); p->setBrushOrigin( -ceData.bgOffset.x(), -ceData.bgOffset.y() ); int diw = pixelMetric( QStyle::PM_ButtonDefaultIndicator, ceData, elementFlags ); if ( ( elementFlags & CEF_IsDefault ) || ( elementFlags & CEF_AutoDefault ) ) { x1 += diw; y1 += diw; x2 -= diw; y2 -= diw; } QPointArray a; if ( elementFlags & CEF_IsDefault ) { if ( diw == 0 ) { a.setPoints( 9, x1, y1, x2, y1, x2, y2, x1, y2, x1, y1+1, x2-1, y1+1, x2-1, y2-1, x1+1, y2-1, x1+1, y1+1 ); p->setPen( cg.shadow() ); p->drawPolyline( a ); x1 += 2; y1 += 2; x2 -= 2; y2 -= 2; } else { qDrawShadePanel( p, ceData.rect, cg, TRUE ); } } QBrush fill = cg.brush( QColorGroup::Button ); if ( (!( elementFlags & CEF_IsFlat )) || ( elementFlags & CEF_IsOn ) || ( elementFlags & CEF_IsDown ) ) drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, QRect( x1, y1, x2-x1+1, y2-y1+1 ), cg, flags, opt ); if ( p->brush().style() != Qt::NoBrush ) p->setBrush( Qt::NoBrush ); #endif } break; case CE_PopupMenuItem: { #ifndef QT_NO_POPUPMENU if ( ( elementFlags & CEF_UseGenericParameters ) || opt.isDefault()) break; QMenuItem *mi = opt.menuItem(); if ( !mi ) break; int tab = opt.tabWidth(); int maxpmw = opt.maxIconWidth(); bool dis = ! (flags & Style_Enabled); bool checkable = ( elementFlags & CEF_IsCheckable ); bool act = flags & Style_Active; int x, y, w, h; r.rect(&x, &y, &w, &h); if ( checkable ) maxpmw = QMAX( maxpmw, sgiCheckMarkSpace ); int checkcol = maxpmw; if (mi && mi->isSeparator() ) { p->setPen( cg.mid() ); p->drawLine(x, y, x+w, y ); return; } int pw = sgiItemFrame; if ( act && !dis ) { if ( pixelMetric( PM_DefaultFrameWidth, ceData, elementFlags ) > 1 ) drawPanel( p, x, y, w, h, cg, FALSE, pw, &cg.brush( QColorGroup::Light ) ); else drawPanel( p, x+1, y+1, w-2, h-2, cg, FALSE, 1, &cg.brush( QColorGroup::Light ) ); } else { p->fillRect( x, y, w, h, cg.brush( QColorGroup::Button ) ); } if ( !mi ) return; if ( mi->isChecked() ) { if ( mi->iconSet() ) { drawPrimitive(PE_MenuItemIndicatorIconFrame, p, ceData, elementFlags, r, cg, flags, opt); } } else { if ( !act ) p->fillRect( x+sgiItemFrame, y+sgiItemFrame, checkcol, h-2*sgiItemFrame, cg.brush( QColorGroup::Button ) ); } if ( mi->iconSet() ) { QIconSet::Mode mode = QIconSet::Normal; if ( act && !dis ) mode = QIconSet::Active; QPixmap pixmap; if ( checkable && mi->isChecked() ) pixmap = mi->iconSet()->pixmap( QIconSet::Small, mode, QIconSet::On ); else pixmap = mi->iconSet()->pixmap( QIconSet::Small, mode ); int pixw = pixmap.width(); int pixh = pixmap.height(); QRect cr( x+sgiItemFrame, y+sgiItemFrame, checkcol, h-2*sgiItemFrame ); QRect pmr( 0, 0, pixw, pixh ); pmr.moveCenter( cr.center() ); p->setPen( cg.text() ); p->drawPixmap( pmr.topLeft(), pixmap ); } else { if ( checkable ) { if ( mi->isChecked() ) { drawPrimitive(PE_MenuItemIndicatorFrame, p, ceData, elementFlags, r, cg, flags, opt); drawPrimitive(PE_MenuItemIndicatorCheck, p, ceData, elementFlags, r, cg, flags, opt); } } } p->setPen( cg.buttonText() ); QColor discol; if ( dis ) { discol = cg.text(); p->setPen( discol ); } int xm = sgiItemFrame + checkcol + sgiItemHMargin; if ( mi->custom() ) { int m = sgiItemVMargin; p->save(); mi->custom()->paint( p, cg, act, !dis, x+xm, y+m, w-xm-tab+1, h-2*m ); p->restore(); } QString s = mi->text(); if ( !!s ) { int t = s.find( '\t' ); int m = sgiItemVMargin; const int text_flags = AlignVCenter | DontClip | SingleLine; //special underline for &x QString miText = s; if ( t>=0 ) { p->drawText(x+w-tab-sgiItemHMargin-sgiItemFrame, y+m, tab, h-2*m, text_flags, miText.mid( t+1 ) ); miText = s.mid( 0, t ); } QRect br = p->fontMetrics().boundingRect( x+xm, y+m, w-xm-tab+1, h-2*m, text_flags, mi->text() ); drawSGIPrefix( p, br.x()+p->fontMetrics().leftBearing(miText[0]), br.y()+br.height()+p->fontMetrics().underlinePos()-2, &miText ); p->drawText( x+xm, y+m, w-xm-tab+1, h-2*m, text_flags, miText, miText.length() ); } else { if ( mi->pixmap() ) { QPixmap *pixmap = mi->pixmap(); if ( pixmap->depth() == 1 ) p->setBackgroundMode( OpaqueMode ); p->drawPixmap( x+xm, y+sgiItemFrame, *pixmap ); if ( pixmap->depth() == 1 ) p->setBackgroundMode( TransparentMode ); } } if ( mi->popup() ) { int dim = (h-2*sgiItemFrame) / 2; drawPrimitive( PE_ArrowRight, p, ceData, elementFlags, QRect( x+w-sgiArrowHMargin-sgiItemFrame-dim, y+h/2-dim/2, dim, dim ), cg, flags ); } #endif } break; case CE_MenuBarItem: { #ifndef QT_NO_MENUDATA if (opt.isDefault()) break; QMenuItem *mi = opt.menuItem(); bool active = flags & Style_Active; int x, y, w, h; r.rect( &x, &y, &w, &h ); if ( active ) { p->setPen( QPen( cg.shadow(), 1) ); p->drawRect( x, y, w, h ); qDrawShadePanel( p, QRect(x+1,y+1,w-2,h-2), cg, FALSE, 2, &cg.brush( QColorGroup::Light )); } else { p->fillRect( x, y, w, h, cg.brush( QColorGroup::Button )); } if ( mi->pixmap() ) drawItem( p, r, AlignCenter|DontClip|SingleLine, cg, mi->isEnabled(), mi->pixmap(), "", -1, &cg.buttonText() ); if ( !!mi->text() ) { QString* text = new QString(mi->text()); QRect br = p->fontMetrics().boundingRect( x, y-2, w+1, h, AlignCenter|DontClip|SingleLine|ShowPrefix, mi->text() ); drawSGIPrefix( p, br.x()+p->fontMetrics().leftBearing((*text)[0]), br.y()+br.height()+p->fontMetrics().underlinePos()-2, text ); p->drawText( x, y-2, w+1, h, AlignCenter|DontClip|SingleLine, *text, text->length() ); delete text; } #endif } break; case CE_CheckBox: QMotifStyle::drawControl( element, p, ceData, elementFlags, r, cg, flags, opt, widget ); break; default: QMotifStyle::drawControl( element, p, ceData, elementFlags, r, cg, flags, opt, widget ); break; } } /*! \reimp */ void QSGIStyle::drawComplexControl( ComplexControl control, QPainter *p, const QStyleControlElementData &ceData, ControlElementFlags elementFlags, const QRect& r, const QColorGroup& cg, SFlags flags, SCFlags sub, SCFlags subActive, const QStyleOption& opt, const QWidget* widget ) const { if ( widget == d->hotWidget ) flags |= Style_MouseOver; switch ( control ) { case CC_Slider: { #ifndef QT_NO_SLIDER QRect groove = querySubControlMetrics(CC_Slider, ceData, elementFlags, SC_SliderGroove, opt, widget), handle = querySubControlMetrics(CC_Slider, ceData, elementFlags, SC_SliderHandle, opt, widget); if ((sub & SC_SliderGroove) && groove.isValid()) { QRegion region( groove ); if ( ( sub & SC_SliderHandle ) && handle.isValid() ) region = region.subtract( handle ); if ( d->lastSliderRect.slider == widget && d->lastSliderRect.rect.isValid() ) region = region.subtract( d->lastSliderRect.rect ); p->setClipRegion( region ); QRect grooveTop = groove; grooveTop.addCoords( 1, 1, -1, -1 ); drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, grooveTop, cg, flags & ~Style_MouseOver, opt ); if ( flags & Style_HasFocus ) { QRect fr = subRect( SR_SliderFocusRect, ceData, elementFlags, widget ); drawPrimitive( PE_FocusRect, p, ceData, elementFlags, fr, cg, flags & ~Style_MouseOver ); } if ( d->lastSliderRect.slider == widget && d->lastSliderRect.rect.isValid() ) { if ( ( sub & SC_SliderHandle ) && handle.isValid() ) { region = ceData.rect; region = region.subtract( handle ); p->setClipRegion( region ); } else { p->setClipping( FALSE ); } qDrawShadePanel( p, d->lastSliderRect.rect, cg, TRUE, 1, &cg.brush( QColorGroup::Dark ) ); } p->setClipping( FALSE ); } if (( sub & SC_SliderHandle ) && handle.isValid()) { if ( flags & Style_MouseOver && !handle.contains( d->mousePos ) && subActive != SC_SliderHandle ) flags &= ~Style_MouseOver; drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, handle, cg, flags ); if ( ceData.orientation == Horizontal ) { QCOORD mid = handle.x() + handle.width() / 2; qDrawShadeLine( p, mid, handle.y(), mid, handle.y() + handle.height() - 2, cg, TRUE, 1); } else { QCOORD mid = handle.y() + handle.height() / 2; qDrawShadeLine( p, handle.x(), mid, handle.x() + handle.width() - 2, mid, cg, TRUE, 1); } } if ( sub & SC_SliderTickmarks ) QMotifStyle::drawComplexControl( control, p, ceData, elementFlags, r, cg, flags, SC_SliderTickmarks, subActive, opt, widget ); #endif break; } case CC_ComboBox: { #ifndef QT_NO_COMBOBOX if (sub & SC_ComboBoxFrame) { QRect fr = QStyle::visualRect( querySubControlMetrics( CC_ComboBox, ceData, elementFlags, SC_ComboBoxFrame, QStyleOption::Default, widget ), ceData, elementFlags ); drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, fr, cg, flags ); } if ( sub & SC_ComboBoxArrow ) { p->save(); QRect er = QStyle::visualRect( querySubControlMetrics( CC_ComboBox, ceData, elementFlags, SC_ComboBoxArrow, QStyleOption::Default, widget ), ceData, elementFlags ); er.addCoords( 0, 3, 0, 0 ); drawPrimitive( PE_ArrowDown, p, ceData, elementFlags, er, cg, flags | Style_Enabled, opt ); int awh, ax, ay, sh, sy, dh, ew; get_combo_parameters( ceData.rect, ew, awh, ax, ay, sh, dh, sy ); QBrush arrow = cg.brush( QColorGroup::Dark ); p->fillRect( ax, sy-1, awh, sh, arrow ); p->restore(); if ( elementFlags & CEF_HasFocus ) { QRect re = QStyle::visualRect( subRect( SR_ComboBoxFocusRect, ceData, elementFlags, widget ), ceData, elementFlags ); drawPrimitive( PE_FocusRect, p, ceData, elementFlags, re, cg ); } } if ( sub & SC_ComboBoxEditField ) { if ( elementFlags & CEF_IsEditable ) { QRect er = QStyle::visualRect( querySubControlMetrics( CC_ComboBox, ceData, elementFlags, SC_ComboBoxEditField, QStyleOption::Default, widget ), ceData, elementFlags ); er.addCoords( -1, -1, 1, 1); qDrawShadePanel( p, QRect( er.x()-1, er.y()-1, er.width()+2, er.height()+2 ), cg, TRUE, 1, &cg.brush( QColorGroup::Button ) ); } } #endif p->setPen(cg.buttonText()); break; } case CC_ScrollBar: { #ifndef QT_NO_SCROLLBAR bool maxedOut = (ceData.minSteps == ceData.maxSteps); if ( maxedOut ) flags &= ~Style_Enabled; QRect handle = QStyle::visualRect( querySubControlMetrics( CC_ScrollBar, ceData, elementFlags, SC_ScrollBarSlider, opt, widget ), ceData, elementFlags ); if ( sub & SC_ScrollBarGroove ) { } if ( sub & SC_ScrollBarAddLine ) { QRect er = QStyle::visualRect( querySubControlMetrics( CC_ScrollBar, ceData, elementFlags, SC_ScrollBarAddLine, opt, widget ), ceData, elementFlags ); drawPrimitive( PE_ScrollBarAddLine, p, ceData, elementFlags, er, cg, flags, opt ); } if ( sub & SC_ScrollBarSubLine ) { QRect er = QStyle::visualRect( querySubControlMetrics( CC_ScrollBar, ceData, elementFlags, SC_ScrollBarSubLine, opt, widget ), ceData, elementFlags ); drawPrimitive( PE_ScrollBarSubLine, p, ceData, elementFlags, er, cg, flags, opt ); } if ( sub & SC_ScrollBarAddPage ) { QRect er = QStyle::visualRect( querySubControlMetrics( CC_ScrollBar, ceData, elementFlags, SC_ScrollBarAddPage, opt, widget ), ceData, elementFlags ); QRegion region( er ); if ( d->lastScrollbarRect.scrollbar == widget && d->lastScrollbarRect.rect.isValid() && er.intersects( d->lastScrollbarRect.rect ) ) { region = region.subtract( d->lastScrollbarRect.rect ); p->setClipRegion( region ); } if ( sub & SC_ScrollBarSlider && er.intersects( handle ) ) { region = region.subtract( handle ); p->setClipRegion( region ); } drawPrimitive( PE_ScrollBarAddPage, p, ceData, elementFlags, er, cg, flags & ~Style_MouseOver, opt ); if ( d->lastScrollbarRect.scrollbar == widget && d->lastScrollbarRect.rect.isValid() && er.intersects( d->lastScrollbarRect.rect ) ) { if ( sub & SC_ScrollBarSlider && handle.isValid() ) { region = er; region.subtract( handle ); p->setClipRegion( region ); } else { p->setClipping( FALSE ); } qDrawShadePanel( p, d->lastScrollbarRect.rect, cg, TRUE, 1, &cg.brush( QColorGroup::Dark ) ); } p->setClipping( FALSE ); } if ( sub & SC_ScrollBarSubPage ) { QRect er = QStyle::visualRect( querySubControlMetrics( CC_ScrollBar, ceData, elementFlags, SC_ScrollBarSubPage, opt, widget ), ceData, elementFlags ); QRegion region( er ); if ( d->lastScrollbarRect.scrollbar == widget && d->lastScrollbarRect.rect.isValid() && er.intersects( d->lastScrollbarRect.rect ) ) { region = region.subtract( d->lastScrollbarRect.rect ); p->setClipRegion( region ); } if ( sub & SC_ScrollBarSlider && er.intersects( handle ) ) { region = region.subtract( handle ); p->setClipRegion( region ); } drawPrimitive( PE_ScrollBarSubPage, p, ceData, elementFlags, er, cg, flags & ~Style_MouseOver, opt ); if ( d->lastScrollbarRect.scrollbar == widget && d->lastScrollbarRect.rect.isValid() && er.intersects( d->lastScrollbarRect.rect ) ) { if ( sub & SC_ScrollBarSlider && handle.isValid() ) { region = er; region.subtract( handle ); p->setClipRegion( region ); } else { p->setClipping( FALSE ); } qDrawShadePanel( p, d->lastScrollbarRect.rect, cg, TRUE, 1, &cg.brush( QColorGroup::Dark ) ); } p->setClipping( FALSE ); } if ( sub & SC_ScrollBarSlider ) { p->setClipping( FALSE ); if ( subActive == SC_ScrollBarSlider ) flags |= Style_Active; drawPrimitive( PE_ScrollBarSlider, p, ceData, elementFlags, handle, cg, flags, opt ); } #endif } break; default: // QMotifStyle::drawComplexControl( control, p, ceData, elementFlags, r, cg, flags, sub, subActive, opt, widget ); break; } } /*!\reimp */ QSize QSGIStyle::sizeFromContents( ContentsType contents, const QStyleControlElementData &ceData, ControlElementFlags elementFlags, const QSize &contentsSize, const QStyleOption& opt, const QWidget *widget ) const { QSize sz(contentsSize); switch(contents) { case CT_PopupMenuItem: { #ifndef QT_NO_POPUPMENU if ((elementFlags & CEF_UseGenericParameters) || opt.isDefault()) break; QMenuItem *mi = opt.menuItem(); sz = QMotifStyle::sizeFromContents( contents, ceData, elementFlags, contentsSize, opt, widget ); // SGI checkmark items needs a bit more room if ( elementFlags & CEF_IsCheckable ) sz.setWidth( sz.width() + 8 ); // submenu indicator needs a bit more room if (mi->popup()) sz.setWidth( sz.width() + sgiTabSpacing ); #endif break; } case CT_ComboBox: sz.rwidth() += 30; break; default: sz = QMotifStyle::sizeFromContents( contents, ceData, elementFlags, contentsSize, opt, widget ); break; } return sz; } /*! \reimp */ QRect QSGIStyle::subRect( SubRect r, const QStyleControlElementData &ceData, ControlElementFlags elementFlags, const QWidget *widget ) const { QRect rect; switch ( r ) { case SR_ComboBoxFocusRect: { int awh, ax, ay, sh, sy, dh, ew; int fw = pixelMetric( PM_DefaultFrameWidth, ceData, elementFlags, widget ); QRect tr = ceData.rect; tr.addCoords( fw, fw, -fw, -fw ); get_combo_parameters( tr, ew, awh, ax, ay, sh, dh, sy ); rect.setRect(ax-2, ay-2, awh+4, awh+sh+dh+4); } break; default: return QMotifStyle::subRect( r, ceData, elementFlags, widget ); } return rect; } /*! \reimp */ QRect QSGIStyle::querySubControlMetrics( ComplexControl control, const QStyleControlElementData &ceData, ControlElementFlags elementFlags, SubControl sub, const QStyleOption& opt, const QWidget *widget ) const { switch ( control ) { case CC_ComboBox: switch ( sub ) { case SC_ComboBoxFrame: return ceData.rect; case SC_ComboBoxArrow: { int ew, awh, sh, dh, ax, ay, sy; int fw = pixelMetric( PM_DefaultFrameWidth, ceData, elementFlags, widget ); QRect cr = ceData.rect; cr.addCoords( fw, fw, -fw, -fw ); get_combo_parameters( cr, ew, awh, ax, ay, sh, dh, sy ); return QRect( ax, ay, awh, awh ); } case SC_ComboBoxEditField: { int fw = pixelMetric( PM_DefaultFrameWidth, ceData, elementFlags, widget ); QRect rect = ceData.rect; rect.addCoords( fw, fw, -fw, -fw ); int ew = get_combo_extra_width( rect.height() ); rect.addCoords( 1, 1, -1-ew, -1 ); return rect; } default: break; } break; case CC_ScrollBar: return QCommonStyle::querySubControlMetrics( control, ceData, elementFlags, sub, opt, widget ); default: break; } return QMotifStyle::querySubControlMetrics( control, ceData, elementFlags, sub, opt, widget ); } /*! \reimp */ int QSGIStyle::styleHint(StyleHint sh, const QStyleControlElementData &ceData, ControlElementFlags elementFlags, const QStyleOption &opt, QStyleHintReturn *returnData, const QWidget *w) const { int ret; switch (sh) { case SH_MenuIndicatorColumnWidth: { int maxpmw = opt.maxIconWidth(); bool checkable = ( elementFlags & CEF_IsCheckable ); if ( checkable ) maxpmw = QMAX( maxpmw, sgiCheckMarkSpace ); ret = maxpmw; } break; default: ret = QMotifStyle::styleHint(sh, ceData, elementFlags, opt, returnData, w); break; } return ret; } #endif // QT_NO_STYLE_SGI