void Style::drawComboBox(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { ASSURE_OPTION(cmb, ComboBox); B_STATES if ( widget && widget->inherits("WebView") ) { if (!(config.btn.backLightHover || cmb->editable)) { // paints hardcoded black text bypassing the style?! grrr... QStyleOptionComboBox *_cmb = const_cast<QStyleOptionComboBox*>(cmb); _cmb->palette.setColor(config.btn.std_role[Bg], QColor(230,230,230,255)); _cmb->palette.setColor(config.btn.active_role[Bg], QColor(255,255,255,255)); } widget = 0; } const int f1 = F(1), f2 = F(2); QRect ar; const QComboBox *combo = widget ? qobject_cast<const QComboBox*>(widget) : 0; QColor c = CONF_COLOR(btn.std, Bg); const bool listShown = combo && combo->view() && ((QWidget*)(combo->view()))->isVisible(); if (listShown) // this messes up hover hover = hover || QRect(widget->mapToGlobal(RECT.topLeft()), RECT.size()).contains(QCursor::pos()); if (isEnabled && (cmb->subControls & SC_ComboBoxArrow) && (!combo || combo->count() > 0)) { // do we have an arrow? ar = subControlRect(CC_ComboBox, cmb, SC_ComboBoxArrow, widget); ar.setBottom(ar.bottom()-f2); } // the frame if ((cmb->subControls & SC_ComboBoxFrame) && cmb->frame) { if (cmb->editable) drawLineEdit(option, painter, widget, false); else { if (!ar.isNull()) { animStep = (appType == GTK || !widget) ? 6*hover : Animator::Hover::step(widget); if (listShown) animStep = 6; int btn_layer = config.btn.layer; Gradients::Type btn_grd = config.btn.gradient; config.btn.round = !config.btn.round; const bool comboNotSmallerThanTool = config.chooser.layer == Raised || config.chooser.layer == Inlay || config.btn.tool.frame == Sunken || config.btn.tool.frame == Relief; if (comboNotSmallerThanTool && widget && qobject_cast<QToolBar*>(widget->parentWidget())) { GRAD(btn) = GRAD(btn.tool); config.btn.layer = config.btn.tool.frame; } else { GRAD(btn) = GRAD(chooser); config.btn.layer = config.chooser.layer; } drawButtonFrame(option, painter, widget, animStep); config.btn.round = !config.btn.round; config.btn.layer = btn_layer; config.btn.gradient = btn_grd; } else shadows.sunken[!config.btn.round][isEnabled].render(RECT, painter); } } // the arrow if (!ar.isNull()) { if (!(ar.width()%2) ) ar.setWidth(ar.width()-1); const int dy = ar.height()/4; QRect rect = ar.adjusted(0, dy, 0, -dy); Navi::Direction dir = Navi::S; bool upDown = false; if (listShown) dir = (config.leftHanded) ? Navi::E : Navi::W; else if (combo) { if (combo->currentIndex() == 0) dir = Navi::S; else if (combo->currentIndex() == combo->count()-1) dir = Navi::N; else upDown = true; } painter->save(); painter->setPen(Qt::NoPen); if (cmb->editable) { if (upDown || dir == Navi::N) dir = Navi::S; upDown = false; // shall never look like spinbox! hover = hover && (cmb->activeSubControls == SC_ComboBoxArrow); if (!sunken) { painter->setBrush(FCOLOR(Base).dark(105)); rect.translate(0, f2); drawArrow(dir, rect, painter); rect.translate(0, -f2); } if (hover || listShown) painter->setBrush(FCOLOR(Highlight)); else painter->setBrush( Colors::mid(FCOLOR(Base), FCOLOR(Text)) ); } else if (config.btn.backLightHover) painter->setBrush(Colors::mid(c, CONF_COLOR(btn.std, Fg), 6-animStep, 3+animStep)); else { c = Colors::mid(c, CONF_COLOR(btn.active, Bg)); c = Colors::mid(c, CONF_COLOR(btn.active, Bg), 6-animStep, animStep); masks.rect[!config.btn.round].render(ar, painter, GRAD(chooser), ori[1], c, RECT.height()-f2, QPoint(0, ar.y() - RECT.y()) ); painter->setBrush(Colors::mid(c, CONF_COLOR(btn.active, Fg), 1,2)); } if (upDown) { rect.setBottom(rect.y() + rect.height()/2); rect.translate(0, -1); drawArrow(Navi::N, rect, painter); rect.translate(0, rect.height()); drawArrow(Navi::S, rect, painter); } else { if (dir == Navi::N) // loooks unbalanced otherwise rect.translate(0, -f1); drawArrow(dir, rect, painter); } painter->restore(); } }
static void create_pixmaps() { if(pixmaps_created) return; pixmaps_created = true; titleHeight = QFontMetrics(options()->font(true)).height(); if (titleHeight < handleSize) titleHeight = handleSize; titleHeight &= ~1; // Make title height even if (titleHeight < 14) titleHeight = 14; btnWidth1 = titleHeight + 3; btnWidth2 = 3*titleHeight/2 + 6; // titlebar QPainter p; QPainter maskPainter; int i, x, y; titlePix = new QPixmap(33, 12); titlePix->fill( Qt::transparent ); QBitmap mask(33, 12); mask.fill(Qt::color0); p.begin(titlePix); maskPainter.begin(&mask); maskPainter.setPen(Qt::color1); for(i=0, y=2; i < 3; ++i, y+=4){ for(x=1; x <= 33; x+=3){ p.setPen(options()->color(KDecoration::ColorTitleBar, true).light(150)); p.drawPoint(x, y); maskPainter.drawPoint(x, y); p.setPen(options()->color(KDecoration::ColorTitleBar, true).dark(150)); p.drawPoint(x+1, y+1); maskPainter.drawPoint(x+1, y+1); } } p.end(); maskPainter.end(); titlePix->setMask(mask); if(QPixmap::defaultDepth() > 8){ aUpperGradient = new QPixmap(32, titleHeight+2); iUpperGradient = new QPixmap(32, titleHeight+2); QColor bgColor = options()->color(KDecoration::ColorTitleBar, true); gradientFill(aUpperGradient, bgColor.light(120), bgColor.dark(120)); bgColor = options()->color(KDecoration::ColorTitleBar, false); gradientFill(iUpperGradient, bgColor.light(120), bgColor.dark(120)); } // buttons (active/inactive, sunken/unsunken, 2 sizes each) QPalette g = options()->palette(KDecoration::ColorButtonBg, true); g.setCurrentColorGroup( QPalette::Active ); QColor c = g.color( QPalette::Background ); btnPix1 = new QPixmap(btnWidth1, titleHeight); btnDownPix1 = new QPixmap(btnWidth1, titleHeight); btnPix2 = new QPixmap(btnWidth2, titleHeight); btnDownPix2 = new QPixmap(btnWidth2, titleHeight); iBtnPix1 = new QPixmap(btnWidth1, titleHeight); iBtnDownPix1 = new QPixmap(btnWidth1, titleHeight); iBtnPix2 = new QPixmap(btnWidth2, titleHeight); iBtnDownPix2 = new QPixmap(btnWidth2, titleHeight); if(QPixmap::defaultDepth() > 8){ gradientFill(btnPix1, c.light(120), c.dark(130), true); gradientFill(btnPix2, c.light(120), c.dark(130), true); gradientFill(btnDownPix1, c.light(120), c.dark(130), true); gradientFill(btnDownPix2, c.light(120), c.dark(130), true); g = options()->palette(KDecoration::ColorButtonBg, false); g.setCurrentColorGroup( QPalette::Active ); c = g.color(QPalette::Background); gradientFill(iBtnPix1, c.light(120), c.dark(130), true); gradientFill(iBtnPix2, c.light(120), c.dark(130), true); gradientFill(iBtnDownPix1, c.light(120), c.dark(130), true); gradientFill(iBtnDownPix2, c.light(120), c.dark(130), true); } else{ btnPix1->fill(c.rgb()); btnDownPix1->fill(c.rgb()); btnPix2->fill(c.rgb()); btnDownPix2->fill(c.rgb()); g = options()->palette(KDecoration::ColorButtonBg, false); g.setCurrentColorGroup( QPalette::Active ); c = g.background().color(); iBtnPix1->fill(c.rgb()); iBtnDownPix1->fill(c.rgb()); iBtnPix2->fill(c.rgb()); iBtnDownPix2->fill(c.rgb()); } g = options()->palette(KDecoration::ColorButtonBg, true); g.setCurrentColorGroup( QPalette::Active ); c = g.background().color(); drawButtonFrame(btnPix1, g, false); drawButtonFrame(btnDownPix1, g, true); drawButtonFrame(btnPix2, g, false); drawButtonFrame(btnDownPix2, g, true); g = options()->palette(KDecoration::ColorButtonBg, false); g.setCurrentColorGroup( QPalette::Active ); c = g.background().color(); drawButtonFrame(iBtnPix1, g, false); drawButtonFrame(iBtnDownPix1, g, true); drawButtonFrame(iBtnPix2, g, false); drawButtonFrame(iBtnDownPix2, g, true); if(qGray(options()->color(KDecoration::ColorButtonBg, true).rgb()) > 128) btnForeground = Qt::black; else btnForeground = Qt::white; }
void ManhattanStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { if (!panelWidget(widget)) return QProxyStyle::drawComplexControl(control, option, painter, widget); QRect rect = option->rect; switch (control) { case CC_ToolButton: if (const QStyleOptionToolButton *toolbutton = qstyleoption_cast<const QStyleOptionToolButton *>(option)) { bool reverse = option->direction == Qt::RightToLeft; bool drawborder = (widget && widget->property("showborder").toBool()); bool frame = (widget && widget->property("extraframe").toBool()); if (frame) drawButtonFrame(painter, rect); else if (drawborder) drawButtonSeparator(painter, rect, reverse); QRect button, menuarea; button = subControlRect(control, toolbutton, SC_ToolButton, widget); menuarea = subControlRect(control, toolbutton, SC_ToolButtonMenu, widget); State bflags = toolbutton->state; if (bflags & State_AutoRaise) { if (!(bflags & State_MouseOver)) bflags &= ~State_Raised; } State mflags = bflags; if (toolbutton->state & State_Sunken) { if (toolbutton->activeSubControls & SC_ToolButton) bflags |= State_Sunken; if (toolbutton->activeSubControls & SC_ToolButtonMenu) mflags |= State_Sunken; } QStyleOption tool(0); tool.palette = toolbutton->palette; if (toolbutton->subControls & SC_ToolButton) { tool.rect = button; tool.state = bflags; drawPrimitive(PE_PanelButtonTool, &tool, painter, widget); } QStyleOptionToolButton label = *toolbutton; label.palette = panelPalette(option->palette, lightColored(widget)); int fw = pixelMetric(PM_DefaultFrameWidth, option, widget); label.rect = button.adjusted(fw, fw, -fw, -fw); drawControl(CE_ToolButtonLabel, &label, painter, widget); if (toolbutton->subControls & SC_ToolButtonMenu) { tool.state = mflags; tool.rect = menuarea.adjusted(1, 1, -1, -1); if (mflags & (State_Sunken | State_On | State_Raised)) { painter->setPen(Qt::gray); painter->drawLine(tool.rect.topLeft(), tool.rect.bottomLeft()); if (mflags & (State_Sunken)) { QColor shade(0, 0, 0, 50); painter->fillRect(tool.rect.adjusted(0, -1, 1, 1), shade); #if !defined(Q_OS_MAC) } else if (mflags & State_MouseOver) { QColor shade(255, 255, 255, 50); painter->fillRect(tool.rect.adjusted(0, -1, 1, 1), shade); #endif } } tool.rect = tool.rect.adjusted(2, 2, -2, -2); drawPrimitive(PE_IndicatorArrowDown, &tool, painter, widget); } else if (toolbutton->features & QStyleOptionToolButton::HasMenu && !widget->property("noArrow").toBool()) { int arrowSize = 6; QRect ir = toolbutton->rect.adjusted(1, 1, -1, -1); QStyleOptionToolButton newBtn = *toolbutton; newBtn.palette = panelPalette(option->palette); newBtn.rect = QRect(ir.right() - arrowSize - 1, ir.height() - arrowSize - 2, arrowSize, arrowSize); drawPrimitive(PE_IndicatorArrowDown, &newBtn, painter, widget); } } break; case CC_ComboBox: if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { painter->save(); bool isEmpty = cb->currentText.isEmpty() && cb->currentIcon.isNull(); bool reverse = option->direction == Qt::RightToLeft; bool drawborder = !(widget && widget->property("hideborder").toBool()); bool inverse = (widget && widget->property("inverse").toBool()); bool alignarrow = !(widget && widget->property("alignarrow").toBool()); if (drawborder) drawButtonSeparator(painter, rect, reverse || inverse); QStyleOption toolbutton = *option; if (isEmpty) toolbutton.state &= ~(State_Enabled | State_Sunken); painter->save(); if (drawborder) { if(inverse) painter->setClipRect(toolbutton.rect.adjusted(2, 0, 0, 0)); else painter->setClipRect(toolbutton.rect.adjusted(0, 0, -2, 0)); } drawPrimitive(PE_PanelButtonTool, &toolbutton, painter, widget); painter->restore(); // Draw arrow int menuButtonWidth = 12; int left = !reverse ? rect.right() - menuButtonWidth : rect.left(); int right = !reverse ? rect.right() : rect.left() + menuButtonWidth; QRect arrowRect((left + right) / 2 + (reverse ? 6 : -6), rect.center().y() - 3, 9, 9); if (!alignarrow) { int labelwidth = option->fontMetrics.width(cb->currentText); if (reverse) arrowRect.moveLeft(qMax(rect.width() - labelwidth - menuButtonWidth - 2, 4)); else arrowRect.moveLeft(qMin(labelwidth + menuButtonWidth - 2, rect.width() - menuButtonWidth - 4)); } if (option->state & State_On) arrowRect.translate(QProxyStyle::pixelMetric(PM_ButtonShiftHorizontal, option, widget), QProxyStyle::pixelMetric(PM_ButtonShiftVertical, option, widget)); QStyleOption arrowOpt = *option; arrowOpt.rect = arrowRect; if (isEmpty) arrowOpt.state &= ~(State_Enabled | State_Sunken); if (styleHint(SH_ComboBox_Popup, option, widget)) { arrowOpt.rect.translate(0, -3); drawPrimitive(PE_IndicatorArrowUp, &arrowOpt, painter, widget); arrowOpt.rect.translate(0, 6); drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, painter, widget); } else { drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, painter, widget); } painter->restore(); } break; default: QProxyStyle::drawComplexControl(control, option, painter, widget); break; } }