void ConfigDelegateBase::drawConfigWrench ( QPainter* painter, QStyleOptionViewItemV4& opt, QStyleOptionToolButton& topt ) const { const QWidget* w = opt.widget; QStyle* style = w ? w->style() : QApplication::style(); // draw it the same size as the check belox topt.font = opt.font; topt.icon = QIcon( RESPATH "images/configure.png" ); topt.iconSize = QSize( 16, 16 ); topt.subControls = QStyle::SC_ToolButton; topt.activeSubControls = QStyle::SC_None; topt.features = QStyleOptionToolButton::None; bool pressed = ( m_configPressed == opt.index ); topt.state = pressed ? QStyle::State_On : QStyle::State_Raised; if( opt.state & QStyle::State_MouseOver || pressed ) topt.state |= QStyle::State_HasFocus; style->drawComplexControl( QStyle::CC_ToolButton, &topt, painter, w ); }
bool RenderThemeQt::paintMenuList(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r) { QStyle* style = 0; QPainter* painter = 0; QWidget* widget = 0; if (!getStylePainterAndWidgetFromPaintInfo(i, style, painter, widget)) return true; QStyleOptionComboBox opt; opt.initFrom(widget); EAppearance appearance = applyTheme(opt, o); const QPoint topLeft = r.topLeft(); painter->translate(topLeft); opt.rect.moveTo(QPoint(0,0)); opt.rect.setSize(r.size()); opt.frame = false; style->drawComplexControl(QStyle::CC_ComboBox, &opt, painter, widget); painter->translate(-topLeft); return false; }
bool QDecorationStyled::paint(QPainter *painter, const QWidget *widget, int decorationRegion, DecorationState state) { if (decorationRegion == None) return false; bool isActive = (widget == qApp->activeWindow()); QPalette pal = qApp->palette(); //ideally, the difference between Active and Inactive should be enough, so we shouldn't need to test this if (!isActive) { //pal.setCurrentColorGroup(QPalette::Disabled); //Can't do this either, because of palette limitations //copied from Q3TitleBar: pal.setColor(QPalette::Inactive, QPalette::Highlight, pal.color(QPalette::Inactive, QPalette::Dark)); pal.setColor(QPalette::Inactive, QPalette::Base, pal.color(QPalette::Inactive, QPalette::Dark)); pal.setColor(QPalette::Inactive, QPalette::HighlightedText, pal.color(QPalette::Inactive, QPalette::Window)); } Qt::WindowFlags flags = widget->windowFlags(); bool hasBorder = !widget->isMaximized(); bool hasTitle = flags & Qt::WindowTitleHint; bool hasSysMenu = flags & Qt::WindowSystemMenuHint; bool hasContextHelp = flags & Qt::WindowContextHelpButtonHint; bool hasMinimize = flags & Qt::WindowMinimizeButtonHint; bool hasMaximize = flags & Qt::WindowMaximizeButtonHint; bool paintAll = (DecorationRegion(decorationRegion) == All); bool handled = false; QStyle *style = QApplication::style(); // In the case of a borderless title bar, the title bar must be expanded one // borderWidth to the left, right and up. bool noTitleBorder = style->styleHint(QStyle::SH_TitleBar_NoBorder, 0, widget); int borderWidth = style->pixelMetric(QStyle::PM_MDIFrameWidth, 0, 0); int titleHeight = titleBarHeight(widget) + (noTitleBorder ? borderWidth : 0); int titleExtra = noTitleBorder ? borderWidth : 0; if ((paintAll || decorationRegion & Borders) && state == Normal && hasBorder) { QRegion newClip = painter->clipRegion(); if (hasTitle) { // reduce flicker QRect rect(widget->rect()); QRect r(rect.left() - titleExtra, rect.top() - titleHeight, rect.width() + 2 * titleExtra, titleHeight); newClip -= r; } if (!newClip.isEmpty()) { QRect br = QDecoration::region(widget).boundingRect(); painter->save(); painter->setClipRegion(newClip); QStyleOptionFrame opt; opt.palette = pal; opt.rect = br; opt.lineWidth = borderWidth; if (isActive) opt.state |= QStyle::State_Active; bool porterDuff = painter->paintEngine()->hasFeature(QPaintEngine::PorterDuff); if (porterDuff) painter->setCompositionMode(QPainter::CompositionMode_Source); painter->fillRect(br, pal.window()); if (porterDuff) painter->setCompositionMode(QPainter::CompositionMode_SourceOver); style->drawPrimitive(QStyle::PE_FrameWindow, &opt, painter, 0); painter->restore(); decorationRegion &= (~Borders); handled |= true; } } if (hasTitle) { painter->save(); QStyleOptionTitleBar opt; opt.subControls = (decorationRegion & Title ? QStyle::SC_TitleBarLabel : QStyle::SubControl(0)) | (decorationRegion & Menu ? QStyle::SC_TitleBarSysMenu : QStyle::SubControl(0)) | (decorationRegion & Help ? QStyle::SC_TitleBarContextHelpButton : QStyle::SubControl(0)) | (decorationRegion & Minimize ? QStyle::SC_TitleBarMinButton : QStyle::SubControl(0)) | (decorationRegion & Maximize ? QStyle::SC_TitleBarMaxButton : QStyle::SubControl(0)) | (decorationRegion & (Minimize | Maximize) ? QStyle::SC_TitleBarNormalButton : QStyle::SubControl(0)) | (decorationRegion & Close ? QStyle::SC_TitleBarCloseButton : QStyle::SubControl(0)); opt.titleBarFlags = widget->windowFlags(); opt.titleBarState = widget->windowState(); if (isActive) opt.titleBarState |= QStyle::State_Active; opt.text = windowTitleFor(widget); opt.icon = widget->windowIcon(); opt.palette = pal; opt.rect = QRect(widget->rect().x() - titleExtra, -titleHeight, widget->rect().width() + 2 * titleExtra, titleHeight); if (paintAll) { painter->setClipRegion(opt.rect); } else { const QRect widgetRect = widget->rect(); QRegion newClip = opt.rect; if (!(decorationRegion & Menu) && hasSysMenu) newClip -= region(widget, widgetRect, Menu); if (!(decorationRegion & Title) && hasTitle) newClip -= region(widget, widgetRect, Title); if (!(decorationRegion & Help) && hasContextHelp) newClip -= region(widget, widgetRect, Help); if (!(decorationRegion & Minimize) && hasMinimize) newClip -= region(widget, widgetRect, Minimize); if (!(decorationRegion & Maximize) && hasMaximize) newClip -= region(widget, widgetRect, Maximize); if (!(decorationRegion & (Minimize | Maximize)) && (hasMaximize | hasMinimize)) newClip -= region(widget, widgetRect, Normal); if (!(decorationRegion & Close)) newClip -= region(widget, widgetRect, Close); painter->setClipRegion(newClip); } if (state == Pressed) opt.activeSubControls = opt.subControls; style->drawComplexControl(QStyle::CC_TitleBar, &opt, painter, 0); painter->restore(); decorationRegion &= ~(Title | Menu | Help | Normalize | Minimize | Maximize | Close); handled |= true; } return handled; }
nsresult nsNativeThemeQt::DrawWidgetBackground(QPainter *qPainter, nsRenderingContext* aContext, nsIFrame* aFrame, PRUint8 aWidgetType, const nsRect& aRect, const nsRect& aClipRect) { gfxContext* context = aContext->ThebesContext(); nsRefPtr<gfxASurface> surface = context->CurrentSurface(); context->UpdateSurfaceClip(); QStyle* style = qApp->style(); qPainter->save(); gfxPoint offs = surface->GetDeviceOffset(); qPainter->translate(offs.x, offs.y); gfxMatrix ctm = context->CurrentMatrix(); if (!ctm.HasNonTranslation()) { ctm.x0 = NSToCoordRound(ctm.x0); ctm.y0 = NSToCoordRound(ctm.y0); } QMatrix qctm(ctm.xx, ctm.yx, ctm.xy, ctm.yy, ctm.x0, ctm.y0); qPainter->setWorldMatrix(qctm, true); PRInt32 p2a = aContext->AppUnitsPerDevPixel(); QRect r = qRectInPixels(aRect, p2a); QRect cr = qRectInPixels(aClipRect, p2a); QStyle::State extraFlags = QStyle::State_None; switch (aWidgetType) { case NS_THEME_RADIO: case NS_THEME_CHECKBOX: { QStyleOptionButton opt; InitButtonStyle (aWidgetType, aFrame, r, opt); if (aWidgetType == NS_THEME_CHECKBOX) { style->drawPrimitive (QStyle::PE_IndicatorCheckBox, &opt, qPainter); } else { style->drawPrimitive (QStyle::PE_IndicatorRadioButton, &opt, qPainter); } break; } case NS_THEME_BUTTON: case NS_THEME_BUTTON_BEVEL: { QStyleOptionButton opt; InitButtonStyle (aWidgetType, aFrame, r, opt); if (aWidgetType == NS_THEME_BUTTON) { style->drawPrimitive(QStyle::PE_PanelButtonCommand, &opt, qPainter); if (IsDefaultButton(aFrame)) style->drawPrimitive(QStyle::PE_FrameDefaultButton, &opt, qPainter); } else { style->drawPrimitive(QStyle::PE_PanelButtonBevel, &opt, qPainter); style->drawPrimitive(QStyle::PE_FrameButtonBevel, &opt, qPainter); } break; } case NS_THEME_SCROLLBAR: { qPainter->fillRect(r, qApp->palette().brush(QPalette::Normal, QPalette::Window)); break; } case NS_THEME_SCROLLBAR_TRACK_HORIZONTAL: { qPainter->fillRect(r, qApp->palette().brush(QPalette::Active, QPalette::Window)); break; } case NS_THEME_SCROLLBAR_TRACK_VERTICAL: { qPainter->fillRect(r, qApp->palette().brush(QPalette::Active, QPalette::Window)); break; } case NS_THEME_SCROLLBAR_BUTTON_LEFT: { QStyleOptionSlider opt; InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)opt, QStyle::State_Horizontal); opt.orientation = Qt::Horizontal; style->drawControl(QStyle::CE_ScrollBarSubLine, &opt, qPainter, NULL); break; } case NS_THEME_SCROLLBAR_BUTTON_RIGHT: { QStyleOptionSlider opt; InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)opt, QStyle::State_Horizontal); opt.orientation = Qt::Horizontal; style->drawControl(QStyle::CE_ScrollBarAddLine, &opt, qPainter, NULL); break; } case NS_THEME_SCROLLBAR_BUTTON_UP: { QStyleOptionSlider opt; InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)opt); opt.orientation = Qt::Vertical; style->drawControl(QStyle::CE_ScrollBarSubLine, &opt, qPainter, NULL); break; } case NS_THEME_SCROLLBAR_BUTTON_DOWN: { QStyleOptionSlider opt; InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)opt); opt.orientation = Qt::Vertical; style->drawControl(QStyle::CE_ScrollBarAddLine, &opt, qPainter, NULL); break; } case NS_THEME_SCROLLBAR_THUMB_HORIZONTAL: { extraFlags |= QStyle::State_Horizontal; QStyleOptionSlider option; InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)option, extraFlags); option.orientation = Qt::Horizontal; style->drawControl(QStyle::CE_ScrollBarSlider, &option, qPainter, NULL); break; } case NS_THEME_SCROLLBAR_THUMB_VERTICAL: { QStyleOptionSlider option; InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)option, extraFlags); option.orientation = Qt::Vertical; style->drawControl(QStyle::CE_ScrollBarSlider, &option, qPainter, NULL); break; } case NS_THEME_DROPDOWN: { QStyleOptionComboBox comboOpt; InitComboStyle(aWidgetType, aFrame, r, comboOpt); style->drawComplexControl(QStyle::CC_ComboBox, &comboOpt, qPainter); break; } case NS_THEME_DROPDOWN_BUTTON: { QStyleOptionComboBox option; InitComboStyle(aWidgetType, aFrame, r, option); style->drawPrimitive(QStyle::PE_FrameDefaultButton, &option, qPainter); style->drawPrimitive(QStyle::PE_IndicatorSpinDown, &option, qPainter); break; } case NS_THEME_DROPDOWN_TEXT: case NS_THEME_DROPDOWN_TEXTFIELD: case NS_THEME_TEXTFIELD: case NS_THEME_TEXTFIELD_MULTILINE: case NS_THEME_LISTBOX: { QStyleOptionFrameV2 frameOpt; nsEventStates eventState = GetContentState(aFrame, aWidgetType); if (!IsDisabled(aFrame, eventState)) frameOpt.state |= QStyle::State_Enabled; frameOpt.rect = r; frameOpt.features = QStyleOptionFrameV2::Flat; if (aWidgetType == NS_THEME_TEXTFIELD || aWidgetType == NS_THEME_TEXTFIELD_MULTILINE) { QRect contentRect = style->subElementRect(QStyle::SE_LineEditContents, &frameOpt); contentRect.adjust(mFrameWidth, mFrameWidth, -mFrameWidth, -mFrameWidth); qPainter->fillRect(contentRect, QBrush(Qt::white)); } frameOpt.palette = mNoBackgroundPalette; style->drawPrimitive(QStyle::PE_FrameLineEdit, &frameOpt, qPainter, NULL); break; } case NS_THEME_MENUPOPUP: { QStyleOptionMenuItem option; InitPlainStyle(aWidgetType, aFrame, r, (QStyleOption&)option, extraFlags); style->drawPrimitive(QStyle::PE_FrameMenu, &option, qPainter, NULL); break; } default: break; } qPainter->restore(); return NS_OK; }
void AccountFactoryWrapperDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QStyleOptionViewItemV4 opt = option; initStyleOption( &opt, index ); const int center = opt.rect.height() / 2 + opt.rect.top(); const int topIcon = center - ICON_SIZE/2; // draw the background const QWidget* w = opt.widget; QStyle* style = w ? w->style() : QApplication::style(); style->drawPrimitive( QStyle::PE_PanelItemViewItem, &opt, painter, w ); Account* acc = qobject_cast< Account* >( index.data( AccountFactoryWrapper::AccountRole ).value< QObject* >() ); Q_ASSERT( acc ); // Checkbox on left edge, then text const QRect checkRect( PADDING/4, PADDING/4 + opt.rect.top(), opt.rect.height() - PADDING/4, opt.rect.height() - PADDING/4 ); m_cachedCheckRects[ index ] = checkRect; QStyleOptionViewItemV4 opt2 = opt; opt2.rect = checkRect; opt.checkState == Qt::Checked ? opt2.state |= QStyle::State_On : opt2.state |= QStyle::State_Off; style->drawPrimitive( QStyle::PE_IndicatorViewItemCheck, &opt2, painter, w ); // name on left painter->drawText( opt.rect.adjusted( checkRect.right() + PADDING, PADDING, -PADDING, -PADDING ), Qt::AlignLeft | Qt::AlignVCenter, acc->accountFriendlyName() ); // remove, config, status on right const QRect pmRect( opt.rect.right() - PADDING - ICON_SIZE, topIcon, ICON_SIZE, ICON_SIZE ); painter->drawPixmap( pmRect, TomahawkUtils::defaultPixmap( TomahawkUtils::ListRemove, TomahawkUtils::Original, pmRect.size() ) ); m_cachedButtonRects[ index ] = pmRect; const QRect confRect( pmRect.left() - PADDING - CONFIG_WRENCH_SIZE, center - CONFIG_WRENCH_SIZE/2, CONFIG_WRENCH_SIZE, CONFIG_WRENCH_SIZE ); QStyleOptionToolButton topt; topt.rect = confRect; topt.pos = confRect.topLeft(); topt.font = opt.font; topt.icon = ImageRegistry::instance()->pixmap( RESPATH "images/configure.svg", QSize( CONFIG_WRENCH_SIZE - 8, CONFIG_WRENCH_SIZE - 8 ) ); topt.iconSize = QSize( CONFIG_WRENCH_SIZE - 8, CONFIG_WRENCH_SIZE - 8 ); topt.subControls = QStyle::SC_ToolButton; topt.activeSubControls = QStyle::SC_None; topt.features = QStyleOptionToolButton::None; bool pressed = ( m_configPressed == opt.index ); topt.state = pressed ? QStyle::State_On : QStyle::State_Raised; if( opt.state & QStyle::State_MouseOver || pressed ) topt.state |= QStyle::State_HasFocus; style->drawComplexControl( QStyle::CC_ToolButton, &topt, painter, w ); m_cachedConfigRects[ index ] = confRect; QPixmap p; QString statusText; Account::ConnectionState state = acc->connectionState(); const QRect connectIconRect( confRect.left() - PADDING - ICON_SIZE, topIcon, ICON_SIZE, ICON_SIZE ); if ( state == Account::Connected ) { p = TomahawkUtils::defaultPixmap( TomahawkUtils::SipPluginOnline, TomahawkUtils::Original, connectIconRect.size() ); statusText = tr( "Online" ); } else if ( state == Account::Connecting ) { p = TomahawkUtils::defaultPixmap( TomahawkUtils::SipPluginOffline, TomahawkUtils::Original, connectIconRect.size() ); statusText = tr( "Connecting..." ); } else { p = TomahawkUtils::defaultPixmap( TomahawkUtils::SipPluginOffline, TomahawkUtils::Original, connectIconRect.size() ); statusText = tr( "Offline" ); } painter->drawPixmap( connectIconRect, p ); int width = painter->fontMetrics().width( statusText ); painter->drawText( QRect( connectIconRect.left() - PADDING - width, center - painter->fontMetrics().height()/2, width, painter->fontMetrics().height() ), statusText ); }