diff options
author | Timothy Pearson <[email protected]> | 2012-08-07 01:31:43 -0500 |
---|---|---|
committer | Timothy Pearson <[email protected]> | 2012-08-07 01:31:43 -0500 |
commit | 58451e41d9ecfb405f5dd2718444ac78e8d51c8b (patch) | |
tree | 1b52d26a8b3ffe81516df83896285ebfa843d849 /src/styles | |
parent | 0008bc5bcd95694b38b0d0322aac2ea6fdb21298 (diff) | |
download | qt3-58451e41d9ecfb405f5dd2718444ac78e8d51c8b.tar.gz qt3-58451e41d9ecfb405f5dd2718444ac78e8d51c8b.zip |
Extend TQStyle API further and bump Qt version number
Diffstat (limited to 'src/styles')
-rw-r--r-- | src/styles/qcommonstyle.cpp | 47 | ||||
-rw-r--r-- | src/styles/qcommonstyle.h | 9 | ||||
-rw-r--r-- | src/styles/qmotifplusstyle.cpp | 78 | ||||
-rw-r--r-- | src/styles/qmotifplusstyle.h | 11 | ||||
-rw-r--r-- | src/styles/qmotifstyle.cpp | 8 | ||||
-rw-r--r-- | src/styles/qmotifstyle.h | 4 | ||||
-rw-r--r-- | src/styles/qsgistyle.cpp | 124 | ||||
-rw-r--r-- | src/styles/qsgistyle.h | 11 | ||||
-rw-r--r-- | src/styles/qwindowsstyle.cpp | 104 | ||||
-rw-r--r-- | src/styles/qwindowsstyle.h | 9 |
10 files changed, 195 insertions, 210 deletions
diff --git a/src/styles/qcommonstyle.cpp b/src/styles/qcommonstyle.cpp index 38ff35b..e46f264 100644 --- a/src/styles/qcommonstyle.cpp +++ b/src/styles/qcommonstyle.cpp @@ -156,7 +156,7 @@ QStringList getObjectTypeListForObject(const QObject* object) { return objectTypes; } -QStyle::ControlElementFlags getControlElementFlagsForObject(const QObject* object, QStringList objectTypeList, const QStyleOption& opt) { +QStyle::ControlElementFlags getControlElementFlagsForObject(const QObject* object, QStringList objectTypeList, const QStyleOption& opt, bool populateReliantFields) { QStyle::ControlElementFlags cef = (QStyle::ControlElementFlags)0; if (object) { @@ -226,6 +226,11 @@ QStyle::ControlElementFlags getControlElementFlagsForObject(const QObject* objec if (widget->parentWidget()) cef = cef | QStyle::CEF_HasParentWidget; if (widget->focusProxy()) cef = cef | QStyle::CEF_HasFocusProxy; if (widget->hasFocus()) cef = cef | QStyle::CEF_HasFocus; + if (populateReliantFields) { + if (widget->isActiveWindow()) cef = cef | QStyle::CEF_IsActiveWindow; + if (widget->isTopLevel()) cef = cef | QStyle::CEF_IsTopLevel; + if (widget->isVisible()) cef = cef | QStyle::CEF_IsVisible; + } } } else { @@ -240,6 +245,7 @@ QStyleControlElementData populateControlElementDataFromWidget(const QWidget* wid if (widget) { ceData.widgetObjectTypes = getObjectTypeListForObject(widget); + ceData.allDataPopulated = populateReliantFields; const QPixmap* erasePixmap = widget->backgroundPixmap(); if (erasePixmap) { ceData.bgPixmap = *erasePixmap; @@ -373,8 +379,11 @@ QStyleControlElementData populateControlElementDataFromWidget(const QWidget* wid ceData.maxSteps = sb->maxValue(); ceData.currentStep = sb->value(); ceData.startStep = sb->sliderStart(); + ceData.lineStep = sb->lineStep(); ceData.pageStep = sb->pageStep(); - + if (populateReliantFields) { + ceData.sliderRect = sb->sliderRect(); + } } } if (ceData.widgetObjectTypes.contains("QSlider")) { @@ -387,6 +396,9 @@ QStyleControlElementData populateControlElementDataFromWidget(const QWidget* wid ceData.startStep = sl->sliderStart(); ceData.lineStep = sl->lineStep(); ceData.pageStep = sl->pageStep(); + if (populateReliantFields) { + ceData.sliderRect = sl->sliderRect(); + } } } if (ceData.widgetObjectTypes.contains("QDialogButtons")) { @@ -434,6 +446,7 @@ QStyleControlElementData populateControlElementDataFromWidget(const QWidget* wid QWidget* viewport = lv->viewport(); if (viewport) { ceData.viewportData.widgetObjectTypes = getObjectTypeListForObject(viewport); + ceData.viewportData.allDataPopulated = populateReliantFields; const QPixmap* erasePixmap = viewport->backgroundPixmap(); if (erasePixmap) { ceData.viewportData.bgPixmap = *erasePixmap; @@ -470,10 +483,17 @@ QStyleControlElementData populateControlElementDataFromWidget(const QWidget* wid } } } + if (ceData.widgetObjectTypes.contains("QFrame")) { + const QFrame *frame = dynamic_cast<const QFrame*>(widget); + if (frame) { + ceData.frameStyle = frame->frameStyle(); + } + } const QWidget* parentWidget = widget->parentWidget(); if (parentWidget) { ceData.parentWidgetData.widgetObjectTypes = getObjectTypeListForObject(parentWidget); + ceData.parentWidgetData.allDataPopulated = populateReliantFields; const QPixmap* erasePixmap = parentWidget->backgroundPixmap(); if (erasePixmap) { ceData.parentWidgetData.bgPixmap = *erasePixmap; @@ -1111,7 +1131,7 @@ void QCommonStyle::drawControl( ControlElement element, } int tf=AlignVCenter | ShowPrefix; - if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) + if ((!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) || ((styleHint(SH_HideUnderlineAcceleratorWhenAltUp, ceData, elementFlags, QStyleOption::Default, 0, widget)) && (!acceleratorsShown()))) tf |= NoAccel; #ifndef QT_NO_ICONSET @@ -1164,7 +1184,7 @@ void QCommonStyle::drawControl( ControlElement element, { #ifndef QT_NO_CHECKBOX int alignment = QApplication::reverseLayout() ? AlignRight : AlignLeft; - if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) + if ((!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) || ((styleHint(SH_HideUnderlineAcceleratorWhenAltUp, ceData, elementFlags, QStyleOption::Default, 0, widget)) && (!acceleratorsShown()))) alignment |= NoAccel; drawItem(p, r, alignment | AlignVCenter | ShowPrefix, cg, @@ -1186,7 +1206,7 @@ void QCommonStyle::drawControl( ControlElement element, { #ifndef QT_NO_RADIOBUTTON int alignment = QApplication::reverseLayout() ? AlignRight : AlignLeft; - if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) + if ((!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) || ((styleHint(SH_HideUnderlineAcceleratorWhenAltUp, ceData, elementFlags, QStyleOption::Default, 0, widget)) && (!acceleratorsShown()))) alignment |= NoAccel; drawItem(p, r, alignment | AlignVCenter | ShowPrefix, cg, flags & Style_Enabled, (ceData.fgPixmap.isNull())?NULL:&ceData.fgPixmap, ceData.text); @@ -1253,7 +1273,7 @@ void QCommonStyle::drawControl( ControlElement element, pixelMetric( QStyle::PM_DefaultFrameWidth, ceData, elementFlags, widget ) ); int alignment = AlignCenter | ShowPrefix; - if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) + if ((!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) || ((styleHint(SH_HideUnderlineAcceleratorWhenAltUp, ceData, elementFlags, QStyleOption::Default, 0, widget)) && (!acceleratorsShown()))) alignment |= NoAccel; drawItem( p, tr, alignment, cg, flags & Style_Enabled, 0, t->text() ); @@ -1386,7 +1406,7 @@ void QCommonStyle::drawControl( ControlElement element, QMenuItem *mi = opt.menuItem(); int alignment = AlignCenter|ShowPrefix|DontClip|SingleLine; - if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) + if ((!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) || ((styleHint(SH_HideUnderlineAcceleratorWhenAltUp, ceData, elementFlags, QStyleOption::Default, 0, widget)) && (!acceleratorsShown()))) alignment |= NoAccel; drawItem( p, r, alignment, cg, flags & Style_Enabled, mi->pixmap(), mi->text(), -1, @@ -1428,7 +1448,7 @@ void QCommonStyle::drawControl( ControlElement element, ! ceData.text.isNull() && ! (elementFlags & CEF_UsesTextLabel)) { int alignment = AlignCenter | ShowPrefix; - if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) + if ((!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) || ((styleHint(SH_HideUnderlineAcceleratorWhenAltUp, ceData, elementFlags, QStyleOption::Default, 0, widget)) && (!acceleratorsShown()))) alignment |= NoAccel; rect.moveBy(shiftX, shiftY); @@ -1455,7 +1475,7 @@ void QCommonStyle::drawControl( ControlElement element, p->setFont( ceData.font ); QRect pr = rect, tr = rect; int alignment = ShowPrefix; - if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) + if ((!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) || ((styleHint(SH_HideUnderlineAcceleratorWhenAltUp, ceData, elementFlags, QStyleOption::Default, 0, widget)) && (!acceleratorsShown()))) alignment |= NoAccel; if ( ceData.toolButtonTextPosition == QToolButton::Under ) { @@ -2379,7 +2399,7 @@ QRect QCommonStyle::querySubControlMetrics( ComplexControl control, } #endif - QStyleControlElementData ceData = populateControlElementDataFromWidget(widget, QStyleOption()); + QStyleControlElementData ceData = populateControlElementDataFromWidget(widget, QStyleOption(), false); return querySubControlMetrics(control, ceData, getControlElementFlagsForObject(widget, ceData.widgetObjectTypes, QStyleOption()), sc, opt, widget); } @@ -3126,7 +3146,7 @@ QSize QCommonStyle::sizeFromContents(ContentsType contents, int QCommonStyle::styleHint(StyleHint sh, const QWidget * w, const QStyleOption &so, QStyleHintReturn *shr) const { QStyleControlElementData ceData = populateControlElementDataFromWidget(w, QStyleOption(), false); - return styleHint(sh, ceData, getControlElementFlagsForObject(w, ceData.widgetObjectTypes, QStyleOption()), so, shr, w); + return styleHint(sh, ceData, getControlElementFlagsForObject(w, ceData.widgetObjectTypes, QStyleOption(), false), so, shr, w); } /*! \reimp */ @@ -3200,6 +3220,10 @@ int QCommonStyle::styleHint(StyleHint sh, QStyleControlElementData ceData, Contr ret = 1; break; + case SH_HideUnderlineAcceleratorWhenAltUp: + ret = 0; + break; + default: ret = 0; break; @@ -3221,5 +3245,4 @@ QPixmap QCommonStyle::stylePixmap(StylePixmap, QStyleControlElementData, Control return QPixmap(); } - #endif // QT_NO_STYLE diff --git a/src/styles/qcommonstyle.h b/src/styles/qcommonstyle.h index 7cb406f..22b241b 100644 --- a/src/styles/qcommonstyle.h +++ b/src/styles/qcommonstyle.h @@ -38,6 +38,11 @@ ** **********************************************************************/ +// RAJA FIXME +// QMotifPlusStyle +// QSGIStyle +// QWindowsStyle + #ifndef QCOMMONSTYLE_H #define QCOMMONSTYLE_H @@ -241,7 +246,6 @@ public: const QStyleOption& = QStyleOption::Default, const QWidget *widget = 0 ) const; - private: // Disabled copy constructor and operator= #if defined(Q_DISABLE_COPY) @@ -250,9 +254,6 @@ private: #endif }; -Q_EXPORT QStyleControlElementData populateControlElementDataFromWidget(const QWidget* widget, const QStyleOption& opt, bool populateReliantFields=true); -Q_EXPORT QStyle::ControlElementFlags getControlElementFlagsForObject(const QObject* object, QStringList objectTypeList, const QStyleOption& opt); - #endif // QT_NO_STYLE #endif // QCOMMONSTYLE_H diff --git a/src/styles/qmotifplusstyle.cpp b/src/styles/qmotifplusstyle.cpp index 9245e65..86a2558 100644 --- a/src/styles/qmotifplusstyle.cpp +++ b/src/styles/qmotifplusstyle.cpp @@ -69,7 +69,9 @@ struct QMotifPlusStylePrivate scrollbarElement(0), lastElement(0), ref(1) { ; } - QGuardedPtr<QWidget> hoverWidget; + void* hoverWidget; + QStyleControlElementData hoverWidgetData; + QStyle::ControlElementFlags hoverWidgetFlags; bool hovering, sliderActive, mousePressed; int scrollbarElement, lastElement, ref; QPoint mousePos; @@ -176,52 +178,58 @@ void QMotifPlusStyle::polish(QPalette &) /*! \reimp */ -void QMotifPlusStyle::polish(QWidget *widget) +void QMotifPlusStyle::polish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr) { + if (ceData.widgetObjectTypes.contains("QWidget")) { #ifndef QT_NO_FRAME - if (::qt_cast<QFrame*>(widget) && ((QFrame *) widget)->frameStyle() == QFrame::Panel) - ((QFrame *) widget)->setFrameStyle(QFrame::WinPanel); + if ((ceData.widgetObjectTypes.contains("QFrame")) && (ceData.frameStyle == QFrame::Panel)) { + widgetActionRequest(ceData, elementFlags, ptr, WAR_FrameSetStyle, QStyleWidgetActionRequestData(QFrame::WinPanel)); + } #endif #ifndef QT_NO_MENUBAR - if (::qt_cast<QMenuBar*>(widget) && ((QMenuBar *) widget)->frameStyle() != QFrame::NoFrame) - ((QMenuBar *) widget)->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); + if ((ceData.widgetObjectTypes.contains("QMenuBar")) && (ceData.frameStyle != QFrame::NoFrame)) { + widgetActionRequest(ceData, elementFlags, ptr, WAR_FrameSetStyle, QStyleWidgetActionRequestData(QFrame::StyledPanel | QFrame::Raised)); + } #endif #ifndef QT_NO_TOOLBAR - if (::qt_cast<QToolBar*>(widget)) - widget->layout()->setMargin(2); + if (ceData.widgetObjectTypes.contains("QToolBar")) { + widgetActionRequest(ceData, elementFlags, ptr, WAR_SetLayoutMargin, QStyleWidgetActionRequestData(2)); + } #endif + } if (useHoveringHighlight) { - if (::qt_cast<QButton*>(widget) || ::qt_cast<QComboBox*>(widget)) - widget->installEventFilter(this); + if ((ceData.widgetObjectTypes.contains("QButton")) || (ceData.widgetObjectTypes.contains("QComboBox"))) { + installObjectEventHandler(ceData, elementFlags, ptr, this); + } - if (::qt_cast<QScrollBar*>(widget) || ::qt_cast<QSlider*>(widget)) { - widget->setMouseTracking(TRUE); - widget->installEventFilter(this); + if ((ceData.widgetObjectTypes.contains("QScrollBar")) || (ceData.widgetObjectTypes.contains("QSlider"))) { + widgetActionRequest(ceData, elementFlags, ptr, WAR_EnableMouseTracking); + installObjectEventHandler(ceData, elementFlags, ptr, this); } } - QMotifStyle::polish(widget); + QMotifStyle::polish(ceData, elementFlags, ptr); } /*! \reimp */ -void QMotifPlusStyle::unPolish(QWidget *widget) +void QMotifPlusStyle::unPolish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr) { - widget->removeEventFilter(this); - QMotifStyle::unPolish(widget); + removeObjectEventHandler(ceData, elementFlags, ptr, this); + QMotifStyle::unPolish(ceData, elementFlags, ptr); } /*! \reimp */ -void QMotifPlusStyle::polish(QApplication *) +void QMotifPlusStyle::applicationPolish(QStyleControlElementData, ControlElementFlags, void *) { } /*! \reimp */ -void QMotifPlusStyle::unPolish(QApplication *) +void QMotifPlusStyle::applicationUnPolish(QStyleControlElementData, ControlElementFlags, void *) { } @@ -1477,14 +1485,14 @@ QRect QMotifPlusStyle::querySubControlMetrics(ComplexControl control, /*! \reimp */ -bool QMotifPlusStyle::eventFilter(QObject *object, QEvent *event) +bool QMotifPlusStyle::objectEventHandler( QStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, QEvent *event ) { switch(event->type()) { case QEvent::MouseButtonPress: { singleton->mousePressed = TRUE; - if (!::qt_cast<QSlider*>(object)) + if (!ceData.widgetObjectTypes.contains("QSlider")) break; singleton->sliderActive = TRUE; @@ -1495,50 +1503,52 @@ bool QMotifPlusStyle::eventFilter(QObject *object, QEvent *event) { singleton->mousePressed = FALSE; - if (!::qt_cast<QSlider*>(object)) + if (!ceData.widgetObjectTypes.contains("QSlider")) break; singleton->sliderActive = FALSE; - ((QWidget *) object)->repaint(FALSE); + widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); break; } case QEvent::Enter: { - if (! object->isWidgetType()) + if (!ceData.widgetObjectTypes.contains("QWidget")) break; - singleton->hoverWidget = (QWidget *) object; - if (! singleton->hoverWidget->isEnabled()) { + singleton->hoverWidget = source; + singleton->hoverWidgetData = ceData; + singleton->hoverWidgetFlags = elementFlags; + if (!(singleton->hoverWidgetFlags & CEF_IsEnabled)) { singleton->hoverWidget = 0; break; } - singleton->hoverWidget->repaint(FALSE); + widgetActionRequest(singleton->hoverWidgetData, singleton->hoverWidgetFlags, singleton->hoverWidget, WAR_Repaint); break; } case QEvent::Leave: { - if (object != singleton->hoverWidget) + if (source != singleton->hoverWidget) break; - QWidget *w = singleton->hoverWidget; + void *w = singleton->hoverWidget; singleton->hoverWidget = 0; - w->repaint(FALSE); + widgetActionRequest(singleton->hoverWidgetData, singleton->hoverWidgetFlags, w, WAR_Repaint); break; } case QEvent::MouseMove: { - if (! object->isWidgetType() || object != singleton->hoverWidget) + if ((!ceData.widgetObjectTypes.contains("QWidget")) || source != singleton->hoverWidget) break; - if (!::qt_cast<QScrollBar*>(object) && ! ::qt_cast<QSlider*>(object)) + if ((!ceData.widgetObjectTypes.contains("QScrollBar")) && (!ceData.widgetObjectTypes.contains("QSlider"))) break; singleton->mousePos = ((QMouseEvent *) event)->pos(); if (! singleton->mousePressed) { singleton->hovering = TRUE; - singleton->hoverWidget->repaint(FALSE); + widgetActionRequest(singleton->hoverWidgetData, singleton->hoverWidgetFlags, singleton->hoverWidget, WAR_Repaint); singleton->hovering = FALSE; } @@ -1549,7 +1559,7 @@ bool QMotifPlusStyle::eventFilter(QObject *object, QEvent *event) break; } - return QMotifStyle::eventFilter(object, event); + return QMotifStyle::objectEventHandler(ceData, elementFlags, source, event); } diff --git a/src/styles/qmotifplusstyle.h b/src/styles/qmotifplusstyle.h index beb8ae6..24de609 100644 --- a/src/styles/qmotifplusstyle.h +++ b/src/styles/qmotifplusstyle.h @@ -63,11 +63,11 @@ public: virtual ~QMotifPlusStyle(); void polish(QPalette &pal); - void polish(QWidget *widget); - void unPolish(QWidget*widget); + void polish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *); + void unPolish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *); - void polish(QApplication *app); - void unPolish(QApplication *app); + void applicationPolish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *); + void applicationUnPolish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *); void drawPrimitive( PrimitiveElement pe, QPainter *p, @@ -118,8 +118,7 @@ public: int styleHint(StyleHint sh, QStyleControlElementData ceData, ControlElementFlags elementFlags, const QStyleOption & = QStyleOption::Default, QStyleHintReturn* = 0, const QWidget * = 0) const; -protected: - bool eventFilter(QObject *, QEvent *); + bool objectEventHandler( QStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, QEvent *e ); private: diff --git a/src/styles/qmotifstyle.cpp b/src/styles/qmotifstyle.cpp index 1fc7bd0..4c6a0c8 100644 --- a/src/styles/qmotifstyle.cpp +++ b/src/styles/qmotifstyle.cpp @@ -171,9 +171,9 @@ void QMotifStyle::polish( QPalette& pal ) \internal Keep QStyle::polish() visible. */ -void QMotifStyle::polish( QWidget* w ) +void QMotifStyle::polish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr ) { - QStyle::polish(w); + QStyle::polish(ceData, elementFlags, ptr); } /*! @@ -181,9 +181,9 @@ void QMotifStyle::polish( QWidget* w ) \internal Keep QStyle::polish() visible. */ -void QMotifStyle::polish( QApplication* a ) +void QMotifStyle::applicationPolish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr ) { - QStyle::polish(a); + QStyle::applicationPolish(ceData, elementFlags, ptr); } static void rot(QPointArray& a, int n) diff --git a/src/styles/qmotifstyle.h b/src/styles/qmotifstyle.h index 969064c..213795f 100644 --- a/src/styles/qmotifstyle.h +++ b/src/styles/qmotifstyle.h @@ -67,8 +67,8 @@ public: bool useHighlightColors() const; void polish( QPalette& ); - void polish( QWidget* ); - void polish( QApplication* ); + void polish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void * ); + void applicationPolish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void * ); void polishPopupMenu( QPopupMenu* ); diff --git a/src/styles/qsgistyle.cpp b/src/styles/qsgistyle.cpp index 5695348..a66fcda 100644 --- a/src/styles/qsgistyle.cpp +++ b/src/styles/qsgistyle.cpp @@ -65,7 +65,7 @@ struct SliderLastPosition { SliderLastPosition() : rect(0,-1,0,-1), slider(0) {} QRect rect; - const QSlider* slider; + const void* slider; }; #endif @@ -74,7 +74,7 @@ struct ScrollbarLastPosition { ScrollbarLastPosition() : rect( 0,-1, 0,-1 ), scrollbar(0) {} QRect rect; - const QScrollBar *scrollbar; + const void* scrollbar; }; #endif @@ -86,7 +86,7 @@ public: { } - const QWidget *hotWidget; + const void* hotWidget; QPoint mousePos; #ifndef QT_NO_SCROLLBAR ScrollbarLastPosition lastScrollbarRect; @@ -136,10 +136,10 @@ QSGIStyle::~QSGIStyle() bold italic font for menu options. */ void -QSGIStyle::polish( QApplication* app) +QSGIStyle::applicationPolish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr ) { isApplicationStyle = 1; - QMotifStyle::polish( app ); + QMotifStyle::polish( ceData, elementFlags, ptr ); QPalette pal = QApplication::palette(); // check this on SGI-Boxes @@ -181,7 +181,7 @@ QSGIStyle::polish( QApplication* app) /*! \reimp */ void -QSGIStyle::unPolish( QApplication* /* app */ ) +QSGIStyle::applicationUnPolish( QStyleControlElementData, ControlElementFlags, void * ) { QFont f = QApplication::font(); QApplication::setFont( f, TRUE ); // get rid of the special fonts for special widget classes @@ -194,9 +194,9 @@ QSGIStyle::unPolish( QApplication* /* app */ ) hovering. */ void -QSGIStyle::polish( QWidget* w ) +QSGIStyle::polish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr ) { - QMotifStyle::polish(w); + QMotifStyle::polish(ceData, elementFlags, ptr); if ( !isApplicationStyle ) { QPalette sgiPal = QApplication::palette(); @@ -214,7 +214,7 @@ QSGIStyle::polish( QWidget* w ) sgiPal.setColor( QPalette::Disabled, QColorGroup::HighlightedText, sgiPal.disabled().base() ); } - if ( ::qt_cast<QLineEdit*>(w) || ::qt_cast<QTextEdit*>(w) ) { + 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() ); @@ -224,89 +224,89 @@ QSGIStyle::polish( QWidget* w ) sgiPal.setColor( QPalette::Disabled, QColorGroup::Highlight, sgiPal.disabled().midlight() ); sgiPal.setColor( QPalette::Disabled, QColorGroup::HighlightedText, sgiPal.disabled().text() ); - } else if ( ::qt_cast<QMenuBar*>(w) || ::qt_cast<QToolBar*>(w) ) { + } else if ( (ceData.widgetObjectTypes.contains("QMenuBar")) || (ceData.widgetObjectTypes.contains("QToolBar")) ) { sgiPal.setColor( QColorGroup::Button, sgiPal.active().midlight() ); } - w->setPalette( sgiPal ); + widgetActionRequest(ceData, elementFlags, ptr, WAR_SetPalette, QStyleWidgetActionRequestData(sgiPal)); } - if ( ::qt_cast<QButton*>(w) || ::qt_cast<QSlider*>(w) || ::qt_cast<QScrollBar*>(w) ) { - w->installEventFilter( this ); - w->setMouseTracking( TRUE ); + 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 ( ::qt_cast<QScrollBar*>(w) ) - w->setBackgroundMode( QWidget::NoBackground ); + if ( ceData.widgetObjectTypes.contains("QScrollBar") ) { + widgetActionRequest(ceData, elementFlags, ptr, WAR_SetBackgroundMode, QStyleWidgetActionRequestData(QWidget::NoBackground)); + } #endif - } else if ( ::qt_cast<QComboBox*>(w) ) { + } else if ( ceData.widgetObjectTypes.contains("QComboBox") ) { QFont f = QApplication::font(); f.setBold( TRUE ); f.setItalic( TRUE ); - w->setFont( f ); + widgetActionRequest(ceData, elementFlags, ptr, WAR_SetFont, QStyleWidgetActionRequestData(f)); #ifndef QT_NO_MENUBAR - } else if ( ::qt_cast<QMenuBar*>(w) ) { - ((QFrame*) w)->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); - w->setBackgroundMode( QWidget::PaletteBackground ); + } 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 ); - w->setFont( f ); + widgetActionRequest(ceData, elementFlags, ptr, WAR_SetFont, QStyleWidgetActionRequestData(f)); #endif #ifndef QT_NO_POPUPMENU - } else if ( ::qt_cast<QPopupMenu*>(w) ) { - ((QFrame*) w)->setLineWidth( pixelMetric( PM_DefaultFrameWidth, QStyleControlElementData(), CEF_None ) + 1 ); + } 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 ); - w->setFont( f ); + widgetActionRequest(ceData, elementFlags, ptr, WAR_SetFont, QStyleWidgetActionRequestData(f)); #endif - } else if ( ::qt_cast<QToolBar*>(w) || w->inherits("QToolBarSeparator") ) { - w->setBackgroundMode( QWidget::PaletteBackground ); + } else if ( (ceData.widgetObjectTypes.contains("QToolBar")) || (ceData.widgetObjectTypes.contains("QToolBarSeparator")) ) { + widgetActionRequest(ceData, elementFlags, ptr, WAR_SetBackgroundMode, QStyleWidgetActionRequestData(QWidget::PaletteBackground)); } } /*! \reimp */ void -QSGIStyle::unPolish( QWidget* w ) +QSGIStyle::unPolish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr ) { - if ( ::qt_cast<QButton*>(w) || ::qt_cast<QSlider*>(w) || ::qt_cast<QScrollBar*>(w) ) { - w->removeEventFilter( this ); + if ( (ceData.widgetObjectTypes.contains("QButton")) || (ceData.widgetObjectTypes.contains("QSlider")) || (ceData.widgetObjectTypes.contains("QScrollBar")) ) { + removeObjectEventHandler(ceData, elementFlags, ptr, this); #ifndef QT_NO_POPUPMENU - } else if ( ::qt_cast<QPopupMenu*>(w) ) { - ((QFrame*)w)->setLineWidth( pixelMetric( PM_DefaultFrameWidth, QStyleControlElementData(), CEF_None ) ); - w->setFont( QApplication::font() ); + } 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 ( ::qt_cast<QMenuBar*>(w) || ::qt_cast<QComboBox*>(w) ) { - w->setFont( QApplication::font() ); + } else if ( (ceData.widgetObjectTypes.contains("QMenuBar")) || (ceData.widgetObjectTypes.contains("QComboBox")) ) { + widgetActionRequest(ceData, elementFlags, ptr, WAR_SetFont, QStyleWidgetActionRequestData(QApplication::font())); #endif } } /*! \reimp */ -bool QSGIStyle::eventFilter( QObject* o, QEvent* e ) +bool QSGIStyle::objectEventHandler( QStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, QEvent *e ) { - if ( !o->isWidgetType() || e->type() == QEvent::Paint ) - return QMotifStyle::eventFilter( o, e ); - - QWidget *widget = (QWidget*)o; + 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 ( ::qt_cast<QScrollBar*>(widget) ) { - d->lastScrollbarRect.rect = ((QScrollBar*)widget)->sliderRect(); - d->lastScrollbarRect.scrollbar = ((QScrollBar*)widget); - widget->repaint( FALSE ); + 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 ( ::qt_cast<QSlider*>(widget) ) { - d->lastSliderRect.rect = ((QSlider*)widget)->sliderRect(); - d->lastSliderRect.slider = ((QSlider*)widget); - widget->repaint( FALSE ); + if (ceData.widgetObjectTypes.contains("QSlider")) { + d->lastSliderRect.rect = ceData.sliderRect; + d->lastSliderRect.slider = source; + widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); } #endif } @@ -317,52 +317,52 @@ bool QSGIStyle::eventFilter( QObject* o, QEvent* e ) { if ( 0 ) { #ifndef QT_NO_SCROLLBAR - } else if ( ::qt_cast<QScrollBar*>(widget) ) { + } else if (ceData.widgetObjectTypes.contains("QScrollBar")) { QRect oldRect = d->lastScrollbarRect.rect; d->lastScrollbarRect.rect = QRect( 0, -1, 0, -1 ); - widget->repaint( oldRect, FALSE ); + widgetActionRequest(ceData, elementFlags, source, WAR_RepaintRect, QStyleWidgetActionRequestData(oldRect)); #endif #ifndef QT_NO_SLIDER - } else if ( ::qt_cast<QSlider*>(widget) ) { + } else if (ceData.widgetObjectTypes.contains("QSlider")) { QRect oldRect = d->lastSliderRect.rect; d->lastSliderRect.rect = QRect( 0, -1, 0, -1 ); - widget->repaint( oldRect, FALSE ); + widgetActionRequest(ceData, elementFlags, source, WAR_RepaintRect, QStyleWidgetActionRequestData(oldRect)); #endif } } break; case QEvent::MouseMove: - if ( !widget->isActiveWindow() ) + if ( !(elementFlags & CEF_IsActiveWindow) ) break; if ( ((QMouseEvent*)e)->button() ) break; - d->hotWidget = widget; + d->hotWidget = source; d->mousePos = ((QMouseEvent*)e)->pos(); - widget->repaint( FALSE ); + widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); break; case QEvent::Enter: - if ( !widget->isActiveWindow() ) + if ( !(elementFlags & CEF_IsActiveWindow) ) break; - d->hotWidget = widget; - widget->repaint( FALSE ); + d->hotWidget = source; + widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); break; case QEvent::Leave: - if ( !widget->isActiveWindow() ) + if ( !(elementFlags & CEF_IsActiveWindow) ) break; - if ( widget == d->hotWidget) { + if ( source == d->hotWidget) { d->hotWidget = 0; - widget->repaint( FALSE ); + widgetActionRequest(ceData, elementFlags, source, WAR_Repaint); } break; default: break; } - return QMotifStyle::eventFilter( o, e ); + return QMotifStyle::objectEventHandler( ceData, elementFlags, source, e ); } static const int sgiItemFrame = 2; // menu item frame width diff --git a/src/styles/qsgistyle.h b/src/styles/qsgistyle.h index 849d67c..0afacd6 100644 --- a/src/styles/qsgistyle.h +++ b/src/styles/qsgistyle.h @@ -67,10 +67,10 @@ public: #if !defined(Q_NO_USING_KEYWORD) using QMotifStyle::polish; #endif - void polish( QWidget* ); - void unPolish( QWidget* ); - void polish( QApplication* ); - void unPolish( QApplication* ); + void polish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void * ); + void unPolish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void * ); + void applicationPolish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void * ); + void applicationUnPolish( QStyleControlElementData ceData, ControlElementFlags elementFlags, void * ); void drawPrimitive( PrimitiveElement pe, QPainter *p, @@ -124,8 +124,7 @@ public: const QStyleOption& = QStyleOption::Default, const QWidget *widget = 0 ) const; -protected: - bool eventFilter( QObject*, QEvent*); + bool objectEventHandler( QStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, QEvent *e ); private: QSGIStylePrivate *d; diff --git a/src/styles/qwindowsstyle.cpp b/src/styles/qwindowsstyle.cpp index 9514939..ec05b80 100644 --- a/src/styles/qwindowsstyle.cpp +++ b/src/styles/qwindowsstyle.cpp @@ -95,99 +95,42 @@ class QWindowsStyle::Private : public QObject public: Private(QWindowsStyle *parent); - bool hasSeenAlt(const QWidget *widget) const; - bool altDown() const { return alt_down; } - -protected: - bool eventFilter(QObject *o, QEvent *e); + bool objectEventHandler( QStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, QEvent *e ); private: - QPtrList<QWidget> seenAlt; - bool alt_down; int menuBarTimer; }; QWindowsStyle::Private::Private(QWindowsStyle *parent) -: QObject(parent, "QWindowsStylePrivate"), alt_down(FALSE), menuBarTimer(0) +: QObject(parent, "QWindowsStylePrivate"), menuBarTimer(0) { } -// Returns true if the toplevel parent of \a widget has seen the Alt-key -bool QWindowsStyle::Private::hasSeenAlt(const QWidget *widget) const -{ - widget = widget->topLevelWidget(); - return seenAlt.contains(widget); -} - // Records Alt- and Focus events -bool QWindowsStyle::Private::eventFilter(QObject *o, QEvent *e) +bool QWindowsStyle::Private::objectEventHandler( QStyleControlElementData ceData, ControlElementFlags, void* source, QEvent *e ) { - if (!o->isWidgetType()) - return QObject::eventFilter(o, e); + if (!(ceData.widgetObjectTypes.contains("QWidget"))) { + return TRUE; + } - QWidget *widget = ::qt_cast<QWidget*>(o); + QWidget *widget = reinterpret_cast<QWidget*>(source); switch(e->type()) { - case QEvent::KeyPress: - if (((QKeyEvent*)e)->key() == Key_Alt) { - widget = widget->topLevelWidget(); - - // Alt has been pressed - find all widgets that care - QObjectList *l = widget->queryList("QWidget"); - QObjectListIt it( *l ); - QWidget *w; - while ( (w = (QWidget*)it.current()) != 0 ) { - ++it; - if (w->isTopLevel() || !w->isVisible() || - w->style().styleHint(SH_UnderlineAccelerator, QStyleControlElementData(), CEF_None, w)) - l->removeRef(w); - } - // Update states before repainting - seenAlt.append(widget); - alt_down = TRUE; - - // Repaint all relevant widgets - it.toFirst(); - while ( (w = (QWidget*)it.current()) != 0 ) { - ++it; - w->repaint(FALSE); - } - delete l; - } - break; - case QEvent::KeyRelease: - if (((QKeyEvent*)e)->key() == Key_Alt) { - widget = widget->topLevelWidget(); - - // Update state - alt_down = FALSE; - // Repaint only menubars - QObjectList *l = widget->queryList("QMenuBar"); - QObjectListIt it( *l ); - QMenuBar *menuBar; - while ( (menuBar = (QMenuBar*)it.current()) != 0) { - ++it; - menuBar->repaint(FALSE); - } - } - break; case QEvent::FocusIn: case QEvent::FocusOut: { // Menubars toggle based on focus - QMenuBar *menuBar = ::qt_cast<QMenuBar*>(o); + QMenuBar *menuBar = ::qt_cast<QMenuBar*>(widget); if (menuBar && !menuBarTimer) // delayed repaint to avoid flicker menuBarTimer = menuBar->startTimer(0); } break; case QEvent::Close: // Reset widget when closing - seenAlt.removeRef(widget); - seenAlt.removeRef(widget->topLevelWidget()); break; case QEvent::Timer: { - QMenuBar *menuBar = ::qt_cast<QMenuBar*>(o); + QMenuBar *menuBar = ::qt_cast<QMenuBar*>(widget); QTimerEvent *te = (QTimerEvent*)e; if (menuBar && te->timerId() == menuBarTimer) { menuBar->killTimer(te->timerId()); @@ -201,7 +144,7 @@ bool QWindowsStyle::Private::eventFilter(QObject *o, QEvent *e) break; } - return QObject::eventFilter(o, e); + return TRUE; } /*! @@ -230,32 +173,40 @@ QWindowsStyle::~QWindowsStyle() } /*! \reimp */ -void QWindowsStyle::polish(QApplication *app) +bool QWindowsStyle::objectEventHandler( QStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, QEvent *e ) { + if (d) { + return d->objectEventHandler(ceData, elementFlags, source, e); + } + return TRUE; +} + +/*! \reimp */ +void QWindowsStyle::applicationPolish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr) { // We only need the overhead when shortcuts are sometimes hidden - if (!styleHint(SH_UnderlineAccelerator, QStyleControlElementData(), CEF_None, 0)) { + if (styleHint(SH_UnderlineAccelerator, QStyleControlElementData(), CEF_None, 0) && styleHint(SH_HideUnderlineAcceleratorWhenAltUp, QStyleControlElementData(), CEF_None, 0)) { d = new Private(this); - app->installEventFilter(d); + installObjectEventHandler(ceData, elementFlags, ptr, this); } } /*! \reimp */ -void QWindowsStyle::unPolish(QApplication *) +void QWindowsStyle::applicationUnPolish(QStyleControlElementData, ControlElementFlags, void *) { delete d; d = 0; } /*! \reimp */ -void QWindowsStyle::polish(QWidget *widget) +void QWindowsStyle::polish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr) { - QCommonStyle::polish(widget); + QCommonStyle::polish(ceData, elementFlags, ptr); } /*! \reimp */ -void QWindowsStyle::unPolish(QWidget *widget) +void QWindowsStyle::unPolish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *ptr) { - QCommonStyle::polish(widget); + QCommonStyle::polish(ceData, elementFlags, ptr); } /*! \reimp */ @@ -946,8 +897,9 @@ void QWindowsStyle::drawControl( ControlElement element, if ( !s.isNull() ) { // draw text int t = s.find( '\t' ); int text_flags = AlignVCenter|ShowPrefix | DontClip | SingleLine; - if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) + if ((!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, QStyleOption::Default, 0, widget)) || ((styleHint(SH_HideUnderlineAcceleratorWhenAltUp, ceData, elementFlags, QStyleOption::Default, 0, widget)) && (!acceleratorsShown()))) { text_flags |= NoAccel; + } text_flags |= (QApplication::reverseLayout() ? AlignRight : AlignLeft ); if ( t >= 0 ) { // draw tab text int xp = x + w - tab - windowsItemHMargin - windowsItemFrame + 1; diff --git a/src/styles/qwindowsstyle.h b/src/styles/qwindowsstyle.h index d0b400c..d768a04 100644 --- a/src/styles/qwindowsstyle.h +++ b/src/styles/qwindowsstyle.h @@ -61,11 +61,11 @@ public: QWindowsStyle(); ~QWindowsStyle(); - void polish(QApplication*); - void unPolish(QApplication*); + void applicationPolish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *); + void applicationUnPolish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *); - void polish(QWidget*); - void unPolish(QWidget*); + void polish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *); + void unPolish(QStyleControlElementData ceData, ControlElementFlags elementFlags, void *); void polish( QPalette & ); @@ -130,6 +130,7 @@ public: QRect subRect( SubRect r, const QStyleControlElementData ceData, const ControlElementFlags elementFlags, const QWidget *widget ) const; + bool objectEventHandler( QStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, QEvent *e ); private: class Private; |