/* Domino widget style for KDE 3 Copyright (C) 2006 Michael Lentner based on the KDE style "Plastik": Copyright (C) 2003 Sandro Giessl based on the KDE style "dotNET": Copyright (C) 2001-2002, Chris Lee Carsten Pfeiffer Karol Szwed Drawing routines completely reimplemented from KDE3 HighColor, which was originally based on some stuff from the KDE2 HighColor. based on drawing routines of the style "Keramik": Copyright (c) 2002 Malte Starostik (c) 2002,2003 Maksim Orlovich based on the KDE3 HighColor Style Copyright (C) 2001-2002 Karol Szwed (C) 2001-2002 Fredrik Höglund Drawing routines adapted from the KDE2 HCStyle, Copyright (C) 2000 Daniel M. Duley (C) 2000 Dirk Mueller (C) 2001 Martijn Klingens Progressbar code based on KStyle, Copyright (C) 2001-2002 Karol Szwed This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include #include #include #include #include #include #include #include #include #include #include #include FT_FREETYPE_H #include "domino.h" #include // #include #include // popupmenu item constants... static const int itemHMargin = 6; static const int itemFrame = 7; static const int arrowHMargin = 6; ButtonContour::ButtonContour() { state = Contour_Default; alpha_mode = false; for(int t = 0; t < num_types; t++) for(int s = 0; s < num_states; s++) created[t][s] = 0; for(int s = 0; s < num_states; s++) shadowCreated[s] = 0; ContourType ty; ty = Contour_Sunken; for(int s = 0; s < num_states; s++) { c1[ty][s] = qRgba(31, 31, 31, 32); // top first shadow line c4[ty][s] = qRgba(255, 255, 255, 78); // bottom first shadow line c5[ty][s] = qRgba(255, 255, 255, 30); // bottom second shadow line c6[ty][s] = qRgba(217, 217, 217, 34); // first left shadow line } ty = Contour_Raised; for(int s = 0; s < num_states; s++) { c1[ty][s] = qRgba(0, 0, 0, 14); // top first shadow line c4[ty][s] = qRgba(0, 0, 0, 26); // bottom first shadow line c5[ty][s] = qRgba(0, 0, 0, 10); // bottom second shadow line c6[ty][s] = qRgba(0, 0, 0, 12); // first left shadow line } ty = Contour_Simple; for(int s = 0; s < num_states; s++) { c1[ty][s] = qRgba(0, 0, 0, 0); // top first shadow line c4[ty][s] = qRgba(0, 0, 0, 0); // bottom first shadow line c5[ty][s] = qRgba(0, 0, 0, 0); // bottom second shadow line c6[ty][s] = qRgba(0, 0, 0, 0); // first left shadow line } drawButtonSunkenShadow = true; } ButtonContour::~ButtonContour() { for(int t = 0; t < num_types; t++) { for(int s = 0; s < num_states; s++) { if(created[t][s]) { delete btnEdges[t][s]; delete btnVLines[t][s]; delete btnHLines[t][s]; } } } for(int s = 0; s < num_states; s++) { if(shadowCreated[s]) delete buttonShadowRectangular[s]; } } RubberWidget::RubberWidget(Window window ) : QWidget() { setWState(WState_Disabled|WState_Polished); QWidget::create( window, true, true); } RubberWidget::~RubberWidget() { } Rubber::Rubber(uint col) { rubber = 0; parent = 0; window = 0; mask = QRegion(); Display *dpy = qt_xdisplay(); int screen = qt_xscreen(); visual = 0; colormap = 0; int event_base, error_base; if ( XRenderQueryExtension( dpy, &event_base, &error_base ) ) { int nvi; XVisualInfo templ; templ.screen = screen; templ.depth = 32; templ.c_class = TrueColor; XVisualInfo *xvi = XGetVisualInfo( dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &templ, &nvi ); for ( int i = 0; i < nvi; i++ ) { XRenderPictFormat *format = XRenderFindVisualFormat( dpy, xvi[i].visual ); if ( format->type == PictTypeDirect && format->direct.alphaMask ) { visual = xvi[i].visual; colormap = XCreateColormap( dpy, RootWindow( dpy, screen ), visual, AllocNone ); break; } } } wsa.border_pixel = 0; wsa.colormap = colormap; wsa.background_pixel = 0x00000000; wsa.override_redirect = true; color = col; } void Rubber::create(QRect& r, QRegion& m) { if(parent) return; mask = m; wsa.background_pixel = 0x00000000; Window parentwin = XCreateWindow(qt_xdisplay(), qApp->desktop()->winId(), r.x(), r.y(), r.width(), r.height(), 0, 32, InputOutput, visual, CWBackPixel|CWColormap|CWBorderPixel|CWOverrideRedirect, &wsa); parent = new RubberWidget(parentwin); wsa.background_pixel = color; window = XCreateWindow(qt_xdisplay(), parentwin, 0, 0, r.width(), r.height(), 0, 32, InputOutput, visual, CWBackPixel|CWColormap|CWBorderPixel|CWOverrideRedirect, &wsa); rubber = new RubberWidget(window); #ifdef ShapeInput QBitmap bm(r.width(), r.height(), true); XShapeCombineMask(qt_xdisplay(), rubber->winId(), ShapeInput, 0, 0, bm.handle(), ShapeSet); #endif XShapeCombineRegion( qt_xdisplay(), rubber->winId(), ShapeBounding, 0, 0, mask.handle(), ShapeSet ); rubber->show(); parent->show(); XFlush(qt_xdisplay()); } Rubber::~Rubber() { } void Rubber::updateMask(QRegion& m) { if(mask != m) XShapeCombineRegion( qt_xdisplay(), rubber->winId(), ShapeBounding, 0, 0, m.handle(), ShapeSet ); } // -- Style Plugin Interface ------------------------- class DominoStylePlugin : public QStylePlugin { public: DominoStylePlugin() {} ~DominoStylePlugin() {} QStringList keys() const { return QStringList() << "Domino"; } QStyle* create( const QString& key ) { if (key.lower() == "domino") return new DominoStyle; return 0; } }; KDE_Q_EXPORT_PLUGIN( DominoStylePlugin ) // -- end -- DominoStyle::DominoStyle() : KStyle( KStyle::Default /*AllowMenuTransparency*/, ThreeButtonScrollBar ) { konsoleMode = false; kickerMode = false; konquerorMode = false; flatMode = false; viewPortPressed = false; oldRubberRect = QRect(); rubber = 0; ignoreNextFocusRect = false; #if KDE_VERSION < 0x30506 compositeManagerRunning = true; #endif configMode = "0"; // temporaly to avoid cache problems between the configs previewStyle and this style spinWidgetDown = false; popupTimer = new QTimer(this); QColor background = qApp->palette().active().background(); QColor buttonColor = qApp->palette().active().button(); QColor highlight = qApp->palette().active().highlight(); QSettings settings; // _contrast = settings.readNumEntry("/Qt/KDE/contrast", 0); settings.beginGroup("/domino/Settings"); //konqTabBarContrast = 150; konqTabBarContrast = settings.readNumEntry("/konqTabBarContrast", 15)+100; _animateProgressBar = settings.readBoolEntry("/animateProgressBar", true); _centerTabs = settings.readBoolEntry("/centerTabs", false); _drawTriangularExpander = settings.readBoolEntry("/drawTriangularExpander", true); _customCheckMarkColor = settings.readBoolEntry("/customCheckMarkColor", false); _checkMarkColor.setNamedColor( settings.readEntry("/checkMarkColor", "black") ); groupBoxSettings.tintBackground = settings.readBoolEntry("/tintGroupBoxBackground", true); groupBoxSettings.customColor = settings.readBoolEntry("/customGroupBoxBackgroundColor", false); groupBoxSettings.brightness = settings.readNumEntry("/groupBoxBrightness", 10); groupBoxSettings.color = settings.readEntry("/groupBoxBackgroundColor", darkenColor(background, 10).name()); bool customToolTipColor = settings.readBoolEntry("/customToolTipColor", false); _toolTipColor = customToolTipColor? settings.readEntry("/toolTipColor", QColor(218,218,179).name()) : QColor(218,218,179); //_toolTipColor = QColor(255,255,220); // yellow _smoothScrolling = settings.readBoolEntry("/smoothScrolling", true); _buttonHeightAdjustment = settings.readNumEntry("/buttonHeightAdjustment", 0); _customPopupMenuColor = settings.readBoolEntry("/customPopupMenuColor", false); _popupMenuColor = _customPopupMenuColor ? settings.readEntry("/popupMenuColor", background.name()) : background.name(); _customSelMenuItemColor = settings.readBoolEntry("/customSelMenuItemColor", false); _selMenuItemColor = _customSelMenuItemColor ? settings.readEntry("/selMenuItemColor", highlight.name()) : highlight.name(); _drawPopupMenuGradient = settings.readBoolEntry("/drawPopupMenuGradient", true); _indentPopupMenuItems = settings.readBoolEntry("/indentPopupMenuItems", true); _toolBtnAsBtn = settings.readBoolEntry("/drawToolButtonAsButton", true); _highlightToolBtnIcon = settings.readBoolEntry("/highlightToolBtnIcon", false); rubberBandType = (RubberType) settings.readNumEntry("/rubberBandType", DistRubber); if(rubberBandType == ArgbRubber) { int dummy; if(XQueryExtension(qt_xdisplay(), "Composite", &dummy, &dummy, &dummy)) { QColor c = settings.readEntry("/rubberBandColor", highlight.name()); int a = settings.readNumEntry("/rubberBandOpacity", 30)*255/100; _argbRubberBandColor = qRgba(c.red(), c.green(), c.blue(), a); rubber = new Rubber(preMultiplyColor(_argbRubberBandColor)); } else rubberBandType = DistRubber; } focusIndicatorSettings.indicateFocus = settings.readBoolEntry("/indicateFocus", true); if(focusIndicatorSettings.indicateFocus) { focusIndicatorSettings.color = settings.readEntry("/indicatorColor", highlight.name()); focusIndicatorSettings.opacity = settings.readNumEntry("/indicatorColorOpacity", 60)*255/100; focusIndicatorSettings.buttonColor = settings.readEntry("/indicatorButtonColor", highlight.name()); focusIndicatorSettings.buttonOpacity = settings.readNumEntry("/indicatorColorButtonOpacity", 60)*255/100; } focusIndicatorSettings.drawUnderline = settings.readBoolEntry("/drawFocusUnderline", true); buttonContour = new ButtonContour(); buttonContour->setDefaultType((ContourType)settings.readNumEntry("/buttonContourType", Contour_Raised), false); // we need to know the ContourType to adjust the contour colors buttonContour->setColor(Contour_Default, settings.readEntry("/buttonContourColor", background.dark(250).name())); buttonContour->setColor(Contour_DefaultButton, settings.readEntry("/buttonDefaultContourColor", highlight.name())); buttonContour->setColor(Contour_MouseOver, settings.readEntry("/buttonMouseOverContourColor", background.dark(250).name())); buttonContour->setColor(Contour_Pressed, settings.readEntry("/buttonPressedContourColor", background.dark(250).name())); buttonContour->drawButtonSunkenShadow = settings.readBoolEntry("/drawButtonSunkenShadow", true); buttonContour->setDefaultType(buttonContour->defaultType); // create this time the tinted pixmaps if(buttonContour->defaultType == Contour_Raised) buttonContour->drawButtonSunkenShadow = false; _customSliderHandleContourColor = settings.readBoolEntry("/customSliderHandleContourColor", false); bool drawTextEffect = settings.readBoolEntry("/drawTextEffect", true); if(drawTextEffect) { textEffectSettings.mode = settings.readNumEntry("/textEffectMode", 0) ? TextEffect_Everywhere : TextEffect_OnlyButton; textEffectSettings.color = settings.readEntry("/textEffectColor", Qt::white.name()); textEffectSettings.opacity = settings.readNumEntry("/textEffectOpacity", 60)*255/100; textEffectSettings.buttonColor = settings.readEntry("/textEffectButtonColor", Qt::white.name()); textEffectSettings.buttonOpacity = settings.readNumEntry("/textEffectButtonOpacity", 60)*255/100; int textEffectPos = settings.readNumEntry("/textEffectPos", 5); switch(textEffectPos) { case 0: textEffectSettings.pos = QPoint(-1,-1); break; case 1: textEffectSettings.pos = QPoint(0,-1); break; case 2: textEffectSettings.pos = QPoint(1,-1); break; case 3: textEffectSettings.pos = QPoint(1,0); break; case 4: textEffectSettings.pos = QPoint(1,1); break; case 5: textEffectSettings.pos = QPoint(0,1); break; case 6: textEffectSettings.pos = QPoint(-1,1); break; case 7: textEffectSettings.pos = QPoint(-1,0); break; default: textEffectSettings.pos = QPoint(0,1); } int textEffectButtonPos = settings.readNumEntry("/textEffectButtonPos", 5); switch(textEffectButtonPos) { case 0: textEffectSettings.buttonPos = QPoint(-1,-1); break; case 1: textEffectSettings.buttonPos = QPoint(0,-1); break; case 2: textEffectSettings.buttonPos = QPoint(1,-1); break; case 3: textEffectSettings.buttonPos = QPoint(1,0); break; case 4: textEffectSettings.buttonPos = QPoint(1,1); break; case 5: textEffectSettings.buttonPos = QPoint(0,1); break; case 6: textEffectSettings.buttonPos = QPoint(-1,1); break; case 7: textEffectSettings.buttonPos = QPoint(-1,0); break; default: textEffectSettings.buttonPos = QPoint(0,1); } } else textEffectSettings.mode = TextEffect_None; btnSurface.numGradients = settings.readNumEntry("/btnSurface_numGradients", 2); btnSurface.g1Color1 = settings.readEntry("/btnSurface_g1Color1", buttonColor.name()); btnSurface.g1Color2 = settings.readEntry("/btnSurface_g1Color2", buttonColor.dark(120).name()); btnSurface.g2Color1 = settings.readEntry("/btnSurface_g2Color1", buttonColor.dark(120).name()); btnSurface.g2Color2 = settings.readEntry("/btnSurface_g2Color2", buttonColor.dark(110).name()); btnSurface.background = settings.readEntry("/btnSurface_background", buttonColor.name()); btnSurface.g1Top = settings.readNumEntry("/btnSurface_g1Top", 0); btnSurface.g1Bottom = settings.readNumEntry("/btnSurface_g1Bottom", 50); btnSurface.g2Top = settings.readNumEntry("/btnSurface_g2Top", 50); btnSurface.g2Bottom = settings.readNumEntry("/btnSurface_g2Bottom", 100); activeTabTopSurface.numGradients = settings.readNumEntry("/activeTabTopSurface_numGradients", 2); activeTabTopSurface.g1Color1 = settings.readEntry("/activeTabTopSurface_g1Color1", background.light(110).name()); activeTabTopSurface.g1Color2 = settings.readEntry("/activeTabTopSurface_g1Color2", background.name()); activeTabTopSurface.g2Color1 = settings.readEntry("/activeTabTopSurface_g2Color1", background.name()); activeTabTopSurface.g2Color2 = settings.readEntry("/activeTabTopSurface_g2Color2", background.name()); activeTabTopSurface.background = settings.readEntry("/activeTabTopSurface_background", background.name()); activeTabTopSurface.g1Top = settings.readNumEntry("/activeTabTopSurface_g1Top", 0); activeTabTopSurface.g1Bottom = settings.readNumEntry("/activeTabTopSurface_g1Bottom", 50); activeTabTopSurface.g2Top = settings.readNumEntry("/activeTabTopSurface_g2Top", 50); activeTabTopSurface.g2Bottom = settings.readNumEntry("/activeTabTopSurface_g2Bottom", 100); tabTopSurface.numGradients = settings.readNumEntry("/tabTopSurface_numGradients", 2); tabTopSurface.g1Color1 = settings.readEntry("/tabTopSurface_g1Color1", background.light(110).name()); tabTopSurface.g1Color2 = settings.readEntry("/tabTopSurface_g1Color2", background.dark(110).name()); tabTopSurface.g2Color1 = settings.readEntry("/tabTopSurface_g2Color1", background.dark(110).name()); tabTopSurface.g2Color2 = settings.readEntry("/tabTopSurface_g2Color2", background.dark(110).name()); tabTopSurface.background = settings.readEntry("/tabTopSurface_background", background.dark(110).name()); tabTopSurface.g1Top = settings.readNumEntry("/tabTopSurface_g1Top", 0); tabTopSurface.g1Bottom = settings.readNumEntry("/tabTopSurface_g1Bottom", 50); tabTopSurface.g2Top = settings.readNumEntry("/tabTopSurface_g2Top", 50); tabTopSurface.g2Bottom = settings.readNumEntry("/tabTopSurface_g2Bottom", 100); activeTabBottomSurface.numGradients = settings.readNumEntry("/activeTabBottomSurface_numGradients", 2); activeTabBottomSurface.g1Color1 = settings.readEntry("/activeTabBottomSurface_g1Color1", background.name()); activeTabBottomSurface.g1Color2 = settings.readEntry("/activeTabBottomSurface_g1Color2", background.name()); activeTabBottomSurface.g2Color1 = settings.readEntry("/activeTabBottomSurface_g2Color1", background.name()); activeTabBottomSurface.g2Color2 = settings.readEntry("/activeTabBottomSurface_g2Color2", background.dark(120).name()); activeTabBottomSurface.background = settings.readEntry("/activeTabBottomSurface_background", background.name()); activeTabBottomSurface.g1Top = settings.readNumEntry("/activeTabBottomSurface_g1Top", 0); activeTabBottomSurface.g1Bottom = settings.readNumEntry("/activeTabBottomSurface_g1Bottom", 50); activeTabBottomSurface.g2Top = settings.readNumEntry("/activeTabBottomSurface_g2Top", 50); activeTabBottomSurface.g2Bottom = settings.readNumEntry("/activeTabBottomSurface_g2Bottom", 100); tabBottomSurface.numGradients = settings.readNumEntry("/tabBottomSurface_numGradients", 2); tabBottomSurface.g1Color1 = settings.readEntry("/tabBottomSurface_g1Color1", background.dark(110).name()); tabBottomSurface.g1Color2 = settings.readEntry("/tabBottomSurface_g1Color2", background.dark(110).name()); tabBottomSurface.g2Color1 = settings.readEntry("/tabBottomSurface_g2Color1", background.dark(110).name()); tabBottomSurface.g2Color2 = settings.readEntry("/tabBottomSurface_g2Color2", background.dark(120).name()); tabBottomSurface.background = settings.readEntry("/tabBottomSurface_background", background.dark(110).name()); tabBottomSurface.g1Top = settings.readNumEntry("/tabBottomSurface_g1Top", 0); tabBottomSurface.g1Bottom = settings.readNumEntry("/tabBottomSurface_g1Bottom", 50); tabBottomSurface.g2Top = settings.readNumEntry("/tabBottomSurface_g2Top", 50); tabBottomSurface.g2Bottom = settings.readNumEntry("/tabBottomSurface_g2Bottom", 100); scrollBarSurface.numGradients = settings.readNumEntry("/scrollBarSurface_numGradients", 2); scrollBarSurface.g1Color1 = settings.readEntry("/scrollBarSurface_g1Color1", buttonColor.name()); scrollBarSurface.g1Color2 = settings.readEntry("/scrollBarSurface_g1Color2", buttonColor.dark(120).name()); scrollBarSurface.g2Color1 = settings.readEntry("/scrollBarSurface_g2Color1", buttonColor.dark(120).name()); scrollBarSurface.g2Color2 = settings.readEntry("/scrollBarSurface_g2Color2", buttonColor.dark(110).name()); scrollBarSurface.background = settings.readEntry("/scrollBarSurface_background", buttonColor.name()); scrollBarSurface.g1Top = settings.readNumEntry("/scrollBarSurface_g1Top", 0); scrollBarSurface.g1Bottom = settings.readNumEntry("/scrollBarSurface_g1Bottom", 50); scrollBarSurface.g2Top = settings.readNumEntry("/scrollBarSurface_g2Top", 50); scrollBarSurface.g2Bottom = settings.readNumEntry("/scrollBarSurface_g2Bottom", 100); scrollBarGrooveSurface.numGradients = settings.readNumEntry("/scrollBarGrooveSurface_numGradients", 0); scrollBarGrooveSurface.g1Color1 = settings.readEntry("/scrollBarGrooveSurface_g1Color1", background.name()); scrollBarGrooveSurface.g1Color2 = settings.readEntry("/scrollBarGrooveSurface_g1Color2", background.dark(120).name()); scrollBarGrooveSurface.g2Color1 = settings.readEntry("/scrollBarGrooveSurface_g2Color1", background.dark(120).name()); scrollBarGrooveSurface.g2Color2 = settings.readEntry("/scrollBarGrooveSurface_g2Color2", background.dark(110).name()); scrollBarGrooveSurface.background = settings.readEntry("/scrollBarGrooveSurface_background", background.dark(150).name()); scrollBarGrooveSurface.g1Top = settings.readNumEntry("/scrollBarGrooveSurface_g1Top", 0); scrollBarGrooveSurface.g1Bottom = settings.readNumEntry("/scrollBarGrooveSurface_g1Bottom", 50); scrollBarGrooveSurface.g2Top = settings.readNumEntry("/scrollBarGrooveSurface_g2Top", 50); scrollBarGrooveSurface.g2Bottom = settings.readNumEntry("/scrollBarGrooveSurface_g2Bottom", 100); headerSurface.numGradients = settings.readNumEntry("/headerSurface_numGradients", 2); headerSurface.g1Color1 = settings.readEntry("/headerSurface_g1Color1", background.name()); headerSurface.g1Color2 = settings.readEntry("/headerSurface_g1Color2", background.dark(120).name()); headerSurface.g2Color1 = settings.readEntry("/headerSurface_g2Color1", background.dark(120).name()); headerSurface.g2Color2 = settings.readEntry("/headerSurface_g2Color2", background.dark(110).name()); headerSurface.background = settings.readEntry("/headerSurface_background", background.name()); headerSurface.g1Top = settings.readNumEntry("/headerSurface_g1Top", 0); headerSurface.g1Bottom = settings.readNumEntry("/headerSurface_g1Bottom", 50); headerSurface.g2Top = settings.readNumEntry("/headerSurface_g2Top", 50); headerSurface.g2Bottom = settings.readNumEntry("/headerSurface_g2Bottom", 100); // checkBoxes + radioButtons checkItemSurface.numGradients = settings.readNumEntry("/checkItemSurface_numGradients", 2); checkItemSurface.g1Color1 = settings.readEntry("/checkItemSurface_g1Color1", buttonColor.name()); checkItemSurface.g1Color2 = settings.readEntry("/checkItemSurface_g1Color2", buttonColor.dark(120).name()); checkItemSurface.g2Color1 = settings.readEntry("/checkItemSurface_g2Color1", buttonColor.dark(120).name()); checkItemSurface.g2Color2 = settings.readEntry("/checkItemSurface_g2Color2", buttonColor.dark(110).name()); checkItemSurface.background = settings.readEntry("/checkItemSurface_background", buttonColor.name()); checkItemSurface.g1Top = settings.readNumEntry("/checkItemSurface_g1Top", 0); checkItemSurface.g1Bottom = settings.readNumEntry("/checkItemSurface_g1Bottom", 50); checkItemSurface.g2Top = settings.readNumEntry("/checkItemSurface_g2Top", 50); checkItemSurface.g2Bottom = settings.readNumEntry("/checkItemSurface_g2Bottom", 100); settings.endGroup(); if(!strcmp(qApp->argv()[0], "konqueror")) { KGlobal::config()->setGroup("General"); minTabLength = KGlobal::config()->readNumEntry("MinimumTabLength", 3); } else minTabLength = 0; if(!strcmp(qApp->className(), "KApplication")) { QString oldgroup = KGlobal::config()->group(); KGlobal::config()->setGroup("KDE"); macStyleBar = KGlobal::config()->readBoolEntry("macStyle", false); KGlobal::config()->setGroup(oldgroup); // reset the group, do not interfere with the application KApplicationMode = true; } else { macStyleBar = false; KApplicationMode = false; } hoverWidget = 0; horizontalLine = 0; verticalLine = 0; sideRepaint = 0; hoveredToolBoxTab = 0; checkMark = createCheckMark(_customCheckMarkColor? _checkMarkColor : qApp->palette().active().foreground()); radioIndicator = createRadioIndicator(_customCheckMarkColor? _checkMarkColor : qApp->palette().active().foreground()); popupFrame = new QPixmap(tintImage(qembed_findImage("popup5"), _popupMenuColor.dark(150) )); // setup pixmap cache... pixmapCache = new QIntCache(150000, 499); pixmapCache->setAutoDelete(true); if ( _animateProgressBar ) { animationTimer = new QTimer( this ); connect( animationTimer, SIGNAL(timeout()), this, SLOT(updateProgressPos()) ); } scrollDistance = 0; scrollWidget = 0; scrollTimer = new QTimer(this); connect( scrollTimer, SIGNAL(timeout()), this, SLOT(updateScrollPos()) ); QColor tabContour2 = qApp->palette().active().background().dark(150); border1= new QPixmap(tintImage(qembed_findImage("border1"), tabContour2)); } void DominoStyle::updateProgressPos() { QProgressBar* pb; //Update the registered progressbars. QMap::iterator iter; bool visible = false; for (iter = progAnimWidgets.begin(); iter != progAnimWidgets.end(); iter++) { if ( !dynamic_cast(iter.key()) ) continue; pb = dynamic_cast(iter.key()); if ( iter.key() -> isEnabled() && pb->progress() != pb->totalSteps() && pb->progress()) { // update animation Offset of the current Widget iter.data() = (iter.data() + 1) % 20; iter.key()->update(); } if (iter.key()->isVisible()) visible = true; } if (!visible) animationTimer->stop(); } void DominoStyle::updateScrollPos() { if(dynamic_cast(scrollWidget) && scrollDistance != 0) { int scroll; if(scrollDistance < 0) { if(scrollDistance < -200) scroll = +45; else if(scrollDistance < -100) scroll = +30; else scroll = +15; scrollDistance += scroll; scrollDistance = QMIN(scrollDistance, 0); } else { if(scrollDistance > 200) scroll = -45; else if(scrollDistance > 100) scroll = -30; else scroll = -15; scrollDistance += scroll; scrollDistance = QMAX(scrollDistance, 0); } if(scrollVertical) scrollWidget->scrollBy(0, scroll); else scrollWidget->scrollBy(scroll, 0); } else if(scrollTimer->isActive()) { scrollTimer->stop(); } } DominoStyle::~DominoStyle() { delete pixmapCache; delete horizontalLine; delete verticalLine; delete checkMark; delete radioIndicator; delete border1; delete popupFrame; delete buttonContour; } void DominoStyle::polish(QApplication* app) { if(!qstrcmp(app->name(), "konsole")) konsoleMode = true; else if(!qstrcmp(app->name(), "konqueror")) konquerorMode = true; else if(!qstrcmp(app->name(), "kicker")) kickerMode = true; QPixmapCache::clear(); } void DominoStyle::polish(QPalette &p) { p.setBrush(QColorGroup::Button, p.active().background()); if(!_customPopupMenuColor) _popupMenuColor = qApp->palette().active().background(); if(!_customSelMenuItemColor) _selMenuItemColor = qApp->palette().active().highlight(); QColor tabContour2 = qApp->palette().active().background().dark(150); delete border1; border1= new QPixmap(tintImage(qembed_findImage("border1"), tabContour2)); delete popupFrame; popupFrame = new QPixmap(tintImage(qembed_findImage("popup5"), _popupMenuColor.dark(150))); if(!_customCheckMarkColor) { delete checkMark; checkMark = createCheckMark(qApp->palette().active().foreground()); delete radioIndicator; radioIndicator = createRadioIndicator(qApp->palette().active().foreground()); } } void DominoStyle::polish(QWidget* widget) { if(!strcmp(widget->name(), "__khtml")) { // is it a khtml widget...? khtmlWidgets[widget] = true; connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(khtmlWidgetDestroyed(QObject*))); } else if((!strcmp(widget->name(), "kfile button") || (widget->isA("KLineEdit") && widget->parentWidget())) && !strcmp(widget->parentWidget()->name(), "__khtml")) { widget->setBackgroundMode(Qt::NoBackground); widget->parentWidget()->setBackgroundMode(Qt::NoBackground); khtmlWidgets[widget] = true; connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(khtmlWidgetDestroyed(QObject*))); } if(dynamic_cast(widget)) { setDominoButtonPalette(widget, Palette_Widget); if (widget->isA("KDockButton_Private")) widget->setFixedSize(13, 13); // 12x12 pixmap + 1px top and right spacing else { ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); if(widget->parentWidget() && widget->parentWidget()->paletteBackgroundPixmap() && !khtmlWidgets.contains(widget)) { widget->setBackgroundMode(Qt::PaletteButton); widget->setBackgroundPixmap(*widget->parentWidget()->paletteBackgroundPixmap()); widget->setBackgroundOrigin(setPixmapOrigin(widget->parentWidget()->backgroundOrigin())); } } widget->installEventFilter(this); } else if(dynamic_cast(widget)) { ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { KToolBarButton* tb = static_cast(widget); //setDominoButtonPalette(widget); // ### changing the palette breaks them! if(tb->popupDelay() < 1) tb->setPopupDelay(5); // now we have time to draw a pressed button widget->installEventFilter(this); } else if(dynamic_cast(widget)) { QToolButton* tb = static_cast(widget); tb->setBackgroundMode(Qt::PaletteBackground); tb->setPaletteForegroundColor(tb->palette().active().buttonText()); setDominoButtonPalette(widget, Palette_Widget); if(tb->popupDelay() < 1) { disconnect(tb, SIGNAL(pressed()), tb, SLOT(popupPressed())); connect(tb, SIGNAL(pressed()), this, SLOT(toolPopupPressed())); connect(tb, SIGNAL(released()), this, SLOT(toolPopupReleased())); } if(tb->popupDelay() < 1) tb->setPopupDelay(5); if(tb->parentWidget() && tb->parentWidget()->paletteBackgroundPixmap()) { tb->setPaletteBackgroundPixmap(*tb->parentWidget()->paletteBackgroundPixmap()); tb->setBackgroundOrigin(setPixmapOrigin(tb->parentWidget()->backgroundOrigin())); } // if(widget->isA("TaskContainer")) // ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); // else widget->installEventFilter(this); ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); } else if(dynamic_cast(widget)) { ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { QComboBox* cb = static_cast(widget); ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); if(widget->parentWidget() && widget->parentWidget()->paletteBackgroundPixmap() && !khtmlWidgets.contains(widget)) { widget->setBackgroundMode(Qt::PaletteButton); widget->setBackgroundOrigin(setPixmapOrigin(widget->parentWidget()->backgroundOrigin())); } setDominoButtonPalette(widget, Palette_Widget); if(cb->listBox()) cb->listBox()->setFrameStyle(QFrame::Panel|QFrame::Sunken); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { QGroupBox* gb = dynamic_cast(widget); gb->setAlignment(Qt::AlignHCenter); if(!gb->isFlat() && !gb->lineWidth() <= 0) { if(gb->layout() && gb->layout()->margin() < 7) gb->layout()->setMargin(7); bool groupBoxFrame = gb->frameShape() == QFrame::GroupBoxPanel; if(groupBoxFrame) ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); if(groupBoxSettings.tintBackground && groupBoxFrame) { QColor color = getGroupBoxColor(gb); QPalette pal(widget->palette()); int h, s, v; pal.active().foreground().hsv(&h, &s, &v); pal.setColor(QPalette::Active, QColorGroup::Background, color); pal.setColor(QPalette::Inactive, QColorGroup::Background, color); pal.setColor(QPalette::Disabled, QColorGroup::Background, color); pal.setColor(QPalette::Disabled, QColorGroup::Text, alphaBlendColors(pal.active().foreground(), color, 40)); gb->setPalette(pal); if(gb->isCheckable()) { ((QCheckBox*)gb->child("qt_groupbox_checkbox", 0, false))->setPaletteBackgroundColor(gb->parentWidget()->paletteBackgroundColor()); } } connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(groupBoxDestroyed(QObject*))); } widget->installEventFilter(this); } else if(dynamic_cast(widget)) { // Don't like this widget... too much private stuff and the spinBox/spinWidget mess. // We check here if the spinBox has a backgroundPixmap. If it's a spinWidget without a spinBox, well, maybe we should fill the widget black then >:) if(widget->parentWidget() && widget->parentWidget()->parentWidget() && widget->parentWidget()->parentWidget()->paletteBackgroundPixmap()) { QWidget::BackgroundOrigin origin = widget->parentWidget()->backgroundOrigin(); if(origin == QWidget::WidgetOrigin) { widget->parentWidget()->setBackgroundOrigin(QWidget::ParentOrigin); widget->setBackgroundOrigin(QWidget::AncestorOrigin); } else widget->setBackgroundOrigin(setPixmapOrigin(origin)); } ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); setDominoButtonPalette(widget, Palette_Widget); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { connect(dynamic_cast(widget), SIGNAL(valueChanged(int)), this, SLOT(spinBoxValueChanged(int))); } else if(dynamic_cast(widget)) { QLineEdit* le = dynamic_cast(widget); QRect r = le->rect(); le->setFrameRect(QRect(r.x()+1, r.y(), r.width()-1, r.height())); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { widget->installEventFilter(this); } else if(dynamic_cast(widget)) { widget->installEventFilter(this); } else if(dynamic_cast(widget)) { setDominoButtonPalette(widget, Palette_Widget); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { if(widget->isA("PanelKMenu")) widget->setPaletteForegroundColor(alphaBlendColors(_popupMenuColor, qApp->palette().active().foreground(), 150)); widget->setBackgroundMode( NoBackground ); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { widget->installEventFilter(this); } else if(dynamic_cast(widget)) { QTabBar* tb = dynamic_cast(widget); if(widget->parentWidget() && widget->parentWidget()->isA("KonqFrameTabs")) { tb->setShape(QTabBar::RoundedBelow); widget->setEraseColor(widget->paletteBackgroundColor().dark(konqTabBarContrast)); } connect(tb, SIGNAL(layoutChanged()), this, SLOT(updateTabWidgetFrame())); connect(tb, SIGNAL(selected(int)), this, SLOT(updateTabWidgetFrame())); setDominoButtonPalette(widget, Palette_Widget); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { ((DominoQWidget*)dynamic_cast(widget)->viewport())->setWFlags(Qt::WNoAutoErase); ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); dynamic_cast(widget)->viewport()->installEventFilter(this); // rubberband if(strcmp(widget->className(), "KDIconView")) widget->installEventFilter(this); } else if(dynamic_cast(widget)) { dynamic_cast(widget)->viewport()->installEventFilter(this); // rubberband if(widget->isA("KonqTreeViewWidget")) { // konqi frames QFrame* f = dynamic_cast(widget); f->setFrameStyle(QFrame::Box|QFrame::Plain); f->setLineWidth(1); } if(!widget->isA("KopeteContactListView") && !widget->isA("ViewTree")) // they have their own mousewheel handling widget->installEventFilter(this); } else if(widget->isA("KActiveLabel")) { // before QScrollView if(dynamic_cast(widget->parentWidget())) widget->setPaletteBackgroundColor(widget->parentWidget()->paletteBackgroundColor()); } else if(dynamic_cast(widget)) { dynamic_cast(widget)->viewport()->installEventFilter(this); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { QFrame* f = dynamic_cast(widget); if((konquerorMode && widget->isA("KHTMLView")) || f->parentWidget() && !strcmp(f->parentWidget()->name(), "KonqFrame")) { // konqi frames f->setFrameStyle(QFrame::Box|QFrame::Plain); f->setLineWidth(1); widget->installEventFilter(this); } else if(_smoothScrolling && !widget->isA("TaskBar") && !widget->isA("Gwenview::ImageView")) widget->installEventFilter(this); } else if(dynamic_cast(widget)) { ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); } else if(dynamic_cast(widget)) { widget->installEventFilter(this); } else if(dynamic_cast(widget) || dynamic_cast(widget)) { widget->setBackgroundMode(Qt::PaletteBackground); } else if(widget->isA("KonqCheckBox")) { widget->installEventFilter(this); } else if(widget->isA("QTipLabel")) { widget->installEventFilter(this); } else if(widget->isA("QWhatsThat")) { widget->installEventFilter(this); } else if(widget->isA("KonqFileTip")) { widget->installEventFilter(this); } else if(dynamic_cast(widget) && widget->parentWidget() && widget->parentWidget()->isA("QToolBox")) { widget->installEventFilter(this); } else if( dynamic_cast(widget) && _animateProgressBar) { setDominoButtonPalette(widget, Palette_Widget); progAnimWidgets[widget] = 0; connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(progressBarDestroyed(QObject*))); // if (!animationTimer->isActive()) // animationTimer->start( 50, false ); widget->installEventFilter(this); } else if(dynamic_cast(widget)) { widget->installEventFilter(this); } else if(dynamic_cast(widget)) { QFrame* f = dynamic_cast(widget); switch (f->frameShape()) { case QFrame::Box: f->setFrameStyle(QFrame::StyledPanel|QFrame::Sunken); f->setLineWidth(2); break; case QFrame::Panel: if(kickerMode && f->parentWidget() && f->parentWidget()->isA("ClockApplet")) { f->setLineWidth(0); break; } case QFrame::WinPanel: f->setLineWidth(1); widget->installEventFilter(this); break; case QFrame::LineEditPanel: { widget->installEventFilter(this); break; } case QFrame::TabWidgetPanel: if(dynamic_cast(widget)) { if(f->parentWidget() && f->parentWidget()->isA("KonqFrameTabs")) break; f->setLineWidth(4); f->setFrameRect(QRect(0, 0, f->width(), f->height()-1)); f->setMargin(0); QWidget* w = widget->parentWidget(); for(int i=0; i<3; i++) { // the third parentcheck is for the tabWidget on kcm khtml_plugins if(!w) break; if(dynamic_cast(w)) { widget->setPaletteBackgroundColor(qApp->palette().active().background()); break; } w = w->parentWidget(); } if(dynamic_cast(widget)->widget(0)) // only if it has contents ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); } case QFrame::HLine: case QFrame::VLine: { widget->installEventFilter(this); break; } case QFrame::StyledPanel: if(dynamic_cast(widget)) { widget->installEventFilter(this); } else if(widget->isA("QWorkspaceChild")) { f->setFrameStyle(QFrame::Panel|QFrame::Sunken); f->setLineWidth(1); widget->installEventFilter(this); } else if(widget->isA("KAnimWidget")) f->setLineWidth(0); default: break; } } // else if (dynamic_cast(widget)) { // widget->installEventFilter(this); // } else if (dynamic_cast(widget)) { // widget->installEventFilter(this); else if(widget->isA("QDateTimeEditor")) { widget->installEventFilter(this); } else if(widget->inherits("QDockWindowHandle") || widget->isA("QDockWindowResizeHandle") || widget->isA("AppletHandleDrag")) { // !qstrcmp(widget->name(), "qt_dockwidget_internal") widget->installEventFilter(this); } else if(widget->isA("KDockWidget") && widget->parentWidget() && widget->parentWidget()->parentWidget() && widget->parentWidget()->parentWidget()->isA("Sidebar_Widget")) { widget->setEraseColor(widget->palette().active().base()); } // widget->installEventFilter(this); //qDebug("className %s, name: %s", widget->className(), widget->name()); } void DominoStyle::unPolish(QWidget* widget) { if( !strcmp(widget->name(), "__khtml") || (!strcmp(widget->name(), "kfile button") && !strcmp(widget->parentWidget()->name(), "__khtml"))) { // is it a khtml widget...? khtmlWidgets.remove(widget); } if (dynamic_cast(widget) || dynamic_cast(widget) || dynamic_cast(widget) || dynamic_cast(widget) || dynamic_cast(widget) || dynamic_cast(widget) || dynamic_cast(widget) || widget->isA("AppletHandleDrag") || widget->isA("QDockWindowHandle")) { ((DominoQWidget*)widget)->clearWFlags(Qt::WNoAutoErase); widget->removeEventFilter(this); } else if(widget->isA("KonqCheckBox") || widget->isA("QWhatsThat") || widget->isA("QTipLabel")) { widget->removeEventFilter(this); widget->setPaletteBackgroundColor(qApp->palette().active().background()); widget->setBackgroundMode(Qt::PaletteBackground); } else if(dynamic_cast(widget) || dynamic_cast(widget)) { widget->removeEventFilter(this); widget->setBackgroundMode(Qt::PaletteBackground); } else if(dynamic_cast(widget)) { ((DominoQWidget*)widget)->clearWFlags(Qt::WNoAutoErase); widget->removeEventFilter(this); } else if(dynamic_cast(widget)) { // after KonqCheckBox ((DominoQWidget*)widget)->clearWFlags(Qt::WNoAutoErase); widget->removeEventFilter(this); } else if(dynamic_cast(widget)) { widget->removeEventFilter(this); widget->setBackgroundMode(Qt::PaletteButton); } else if(dynamic_cast(widget)) { widget->removeEventFilter(this); widget->setBackgroundMode(Qt::PaletteBackground); static_cast(widget)->setLineWidth(2); widget->clearMask(); } else if(dynamic_cast(widget)) { widget->removeEventFilter(this); widget->setBackgroundMode(Qt::PaletteBackground); } else if(dynamic_cast(widget)) { widget->removeEventFilter(this); ((DominoQWidget*)widget)->clearWFlags(Qt::WNoAutoErase); QGroupBox* gb = dynamic_cast(widget); gb->setBackgroundMode(Qt::PaletteBackground); gb->setPalette(qApp->palette()); gb->setAlignment(Qt::AlignLeft|Qt::AlignBottom); } else if(dynamic_cast(widget)) { widget->removeEventFilter(this); widget->setBackgroundMode(Qt::PaletteBase); QLineEdit* le = dynamic_cast(widget); QRect r = le->rect(); le->setFrameRect(QRect(r.x()-1, r.y(), r.width()+1, r.height())); widget->clearMask(); } else if(dynamic_cast(widget) ) { progAnimWidgets.remove(widget); } else if(dynamic_cast(widget) || dynamic_cast(widget) ) { widget->removeEventFilter(this); widget->setBackgroundMode(Qt::PaletteButton); } if(widget->isA("KonqFileTip")) { widget->removeEventFilter(this); widget->setPaletteBackgroundColor(widget->palette().active().background()); QFrame* f = dynamic_cast(widget); f->setMargin(1); f->setFrameStyle(QFrame::Plain|QFrame::Box); QObjectList *list = const_cast(widget->children()); QObjectListIt it( *list ); QObject * o; while ( (o = it.current()) != 0 ) { ++it; if(dynamic_cast(o)) { QLabel* l = dynamic_cast(o); l->setBackgroundOrigin(QWidget::WidgetOrigin); l->setBackgroundMode(Qt::PaletteBackground); l->setPaletteBackgroundColor(l->palette().active().background()); } } } else if(dynamic_cast(widget)) { QFrame* f = dynamic_cast(widget); if((konquerorMode && widget->isA("KHTMLView")) || f->parentWidget() && !strcmp(f->parentWidget()->name(), "KonqFrame")) { // konqi frames widget->removeEventFilter(this); f->setFrameStyle(QFrame::NoFrame|QFrame::Plain); f->setLineWidth(0); } } else if(dynamic_cast(widget)) { widget->removeEventFilter(this); } else if(dynamic_cast(widget)) { widget->removeEventFilter(this); QFrame* f = dynamic_cast(widget); switch(f->frameShape()) { case QFrame::Panel: if(widget->isA("QWorkspaceChild")) { f->setFrameStyle(QFrame::StyledPanel|QFrame::Sunken); f->setLineWidth(2); } break; case QFrame::WinPanel: f->setLineWidth(2); break; case QFrame::TabWidgetPanel: f->setLineWidth(2); f->setMargin(2); f->setFrameRect(QRect(0, 0, 0, 0)); break; case QFrame::StyledPanel: if(widget->isA("KAnimWidget")) f->setLineWidth(2); break; default: break; } } KStyle::unPolish(widget); } void DominoStyle::khtmlWidgetDestroyed(QObject* obj) { khtmlWidgets.remove(static_cast(obj)); } void DominoStyle::groupBoxDestroyed(QObject* obj) { groupBoxPixmaps.remove(static_cast(obj)); } void DominoStyle::progressBarDestroyed(QObject* obj) { progAnimWidgets.remove(static_cast(obj)); } void DominoStyle::renderContour(QPainter *p, const QRect &r, const QColor &backgroundColor, const QColor &contour, const uint flags) const { if((r.width() <= 0)||(r.height() <= 0)) return; const bool drawLeft = flags&Draw_Left; const bool drawRight = flags&Draw_Right; const bool drawTop = flags&Draw_Top; const bool drawBottom = flags&Draw_Bottom; // const bool disabled = flags&Is_Disabled; const bool alphaBlend = flags&Draw_AlphaBlend; const bool roundUpperLeft = flags&Round_UpperLeft; const bool roundUpperRight = flags&Round_UpperRight; const bool roundBottomLeft = flags&Round_BottomLeft; const bool roundBottomRight = flags&Round_BottomRight; const bool isButton = flags&Is_Button; const bool isHorizontal = flags&Is_Horizontal; const bool isScrollBarBtn = flags&Is_ScrollBarBtn; QColor appButtonColor = qApp->palette().active().button(); if(isButton) { QRect sr = QRect(r.x(), r.y()+2, r.width(), r.height()-5); // surface rect int top = sr.y()+sr.height()*btnSurface.g1Top/100; int bottom = sr.height()*btnSurface.g1Bottom/100; int top2 = sr.y()+sr.height()*btnSurface.g2Top/100; int bottom2 = sr.y()+sr.height()*btnSurface.g2Bottom/100-top2; int left = sr.x()+sr.width()*btnSurface.g1Top/100; int width = sr.width()*btnSurface.g1Bottom/100; int left2 = sr.x()+sr.width()*btnSurface.g2Top/100; int width2 = sr.width()*btnSurface.g2Bottom/100-left2; // darker surface colors for the inner part of the contour QColor insideBackground; QColor gr1TopColor; QColor gr1BottomColor; QColor gr2TopColor; QColor gr2BottomColor; const int alphaInside = qAlpha(buttonContour->color3()); insideBackground = alphaBlendColors(buttonContour->color3(), ((contour != appButtonColor) ? alphaBlendColors(contour, btnSurface.background, 127) : btnSurface.background), alphaInside); switch (btnSurface.numGradients) { case 2:{ gr1TopColor = alphaBlendColors(buttonContour->color3(), ((contour != appButtonColor) ? alphaBlendColors(contour, btnSurface.g1Color1, 127) : btnSurface.g1Color1), alphaInside); gr1BottomColor = alphaBlendColors(buttonContour->color3(), ((contour != appButtonColor) ? alphaBlendColors(contour, btnSurface.g1Color2, 127) : btnSurface.g1Color2), alphaInside); gr2TopColor = alphaBlendColors(buttonContour->color3(), ((contour != appButtonColor) ? alphaBlendColors(contour, btnSurface.g2Color1, 127) : btnSurface.g2Color1), alphaInside); gr2BottomColor = alphaBlendColors(buttonContour->color3(), ((contour != appButtonColor) ? alphaBlendColors(contour, btnSurface.g2Color2, 127) : btnSurface.g2Color2), alphaInside); break; } case 1: { gr1TopColor = alphaBlendColors(buttonContour->color3(), ((contour != appButtonColor) ? alphaBlendColors(contour, btnSurface.g1Color1, 127) : btnSurface.g1Color1), alphaInside); gr1BottomColor = alphaBlendColors(buttonContour->color3(), ((contour != appButtonColor) ? alphaBlendColors(contour, btnSurface.g1Color2, 127) : btnSurface.g1Color2), alphaInside); break; } default: { insideBackground = insideBackground; gr1TopColor = insideBackground; gr1BottomColor = insideBackground; gr2TopColor = insideBackground; gr2BottomColor = insideBackground; break; } } if(flags & Is_Down) { gr1TopColor = darkenColor(gr1TopColor, 15); gr1BottomColor = darkenColor(gr1BottomColor, 15); gr2TopColor = darkenColor(gr2TopColor, 15); gr2BottomColor = darkenColor(gr2BottomColor, 15); insideBackground = darkenColor(insideBackground, 15); } QRegion clip; if(drawTop) clip += QRegion(r.left()+6, r.top()+2, r.width()-12, 1); if(drawBottom) clip += QRegion(r.left()+6, r.bottom()-3, r.width()-12, 1); if(drawLeft) clip += QRegion(r.left()+2, r.top()+6, 1, r.height()-13); if(drawRight) clip += QRegion(r.right()-2, r.top()+6, 1, r.height()-13); p->setClipRegion(clip); p->fillRect(sr, insideBackground); switch(btnSurface.numGradients) { case 1: if(isHorizontal) renderGradient(p, QRect(sr.x(), top, sr.width(), bottom), gr1TopColor, gr1BottomColor, true); else renderGradient(p, QRect(left, sr.y(), width, sr.height()), gr1TopColor, gr1BottomColor, false); break; case 2: if(isHorizontal) { renderGradient(p, QRect(r.x(), top, r.width(), bottom), gr1TopColor, gr1BottomColor, true); renderGradient(p, QRect(r.x(), top2, r.width(), bottom2), gr2TopColor, gr2BottomColor, true); } else { renderGradient(p, QRect(left, sr.y(), width, sr.height()), gr1TopColor,gr1BottomColor, false); renderGradient(p, QRect(left2, sr.y(), width2, sr.height()), gr2TopColor,gr2BottomColor, false); } default: break; } p->setClipping(false); const QColor color1 = alphaBlendColors(buttonContour->color1(), backgroundColor, qAlpha(buttonContour->color1())); // 1.top const QColor color4 = alphaBlendColors(buttonContour->color4(), backgroundColor, qAlpha(buttonContour->color4())); // 3.bottom const QColor color5 = alphaBlendColors(buttonContour->color5(), backgroundColor, qAlpha(buttonContour->color5())); // 4.bottom const QColor color2 = alphaBlendColors(buttonContour->color2(), backgroundColor, qAlpha(buttonContour->color2())); // 2.top 2.left 2.bottom const QColor color6 = alphaBlendColors(buttonContour->color6(), backgroundColor, qAlpha(buttonContour->color6())); // 1.left if(roundUpperLeft) p->drawPixmap(r.left(), r.top(), *buttonContour->buttonEdges(), 0, 0, 6, 6); if(roundUpperRight) p->drawPixmap(r.right()-5, r.top(), *buttonContour->buttonEdges(), 6, 0, 6, 6); if(roundBottomLeft) p->drawPixmap(r.left(), r.bottom()-6, *buttonContour->buttonEdges(), 0, 6, 6, 7); if(roundBottomRight) p->drawPixmap(r.right()-5, r.bottom()-6, *buttonContour->buttonEdges(), 6, 6, 6, 7); if(drawTop) { if(!alphaBlend) { p->setPen(color1); p->drawLine(r.left()+6, r.top(), r.right()-6, r.top()); p->setPen(color2); p->drawLine(r.left()+6, r.top()+1, r.right()-6, r.top()+1); } else { p->drawTiledPixmap(r.left()+6, r.top(), r.width()-12, 2, *buttonContour->buttonHLines(), 0, 0); } } if(drawBottom) { if(!alphaBlend) { p->setPen(color2); p->drawLine(r.left()+6, r.bottom()-2, r.right()-6, r.bottom()-2); p->setPen(color4); p->drawLine(r.left()+6, r.bottom()-1, r.right()-6, r.bottom()-1); p->setPen(color5); p->drawLine(r.left()+6, r.bottom(), r.right()-6, r.bottom()); } else { p->drawTiledPixmap(r.left()+6, r.bottom()-2, r.width()-12, 3, *buttonContour->buttonHLines(), 0, 4); } } if(drawLeft) { if(!alphaBlend) { p->setPen(color6); p->drawLine(r.left(), r.top()+6, r.left(), r.bottom()-7); p->setPen(color2); p->drawLine(r.left()+1, r.top()+6, r.left()+1, r.bottom()-7); } else { p->drawTiledPixmap(r.left(), r.top()+6, 2, r.height()-13, *buttonContour->buttonVLines(), 0, 0); } } if(drawRight) { if(!alphaBlend) { p->setPen(color2); p->drawLine(r.right()-1, r.top()+6, r.right()-1, r.bottom()-7); p->setPen(color6); p->drawLine(r.right(), r.top()+6, r.right(), r.bottom()-7); } else { p->drawTiledPixmap(r.right()-1, r.top()+6, 2, r.height()-13, *buttonContour->buttonVLines(), 4, 0); } } } else if(isScrollBarBtn) { QColor background; QColor gr1TopColor; QColor gr1BottomColor; QColor gr2TopColor; QColor gr2BottomColor; if(contour != appButtonColor) { gr1TopColor = alphaBlendColors(contour, scrollBarSurface.g1Color1, 127); gr1BottomColor = alphaBlendColors(contour, scrollBarSurface.g1Color2, 127); gr2TopColor = alphaBlendColors(contour, scrollBarSurface.g2Color1, 127); gr2BottomColor = alphaBlendColors(contour, scrollBarSurface.g2Color2, 127); background = alphaBlendColors(contour, scrollBarSurface.background, 127); } else { gr1TopColor = scrollBarSurface.g1Color1; gr1BottomColor = scrollBarSurface.g1Color2; gr2TopColor = scrollBarSurface.g2Color1; gr2BottomColor = scrollBarSurface.g2Color2; background = scrollBarSurface.background; } QColor btnContour = buttonContour->contourColor(Contour_Default); QColor whiteColor( qRgba(Qt::white.red(), Qt::white.green(), Qt::white.blue(), 23)); // first white layer QColor blackColor( qRgba(btnContour.red(), btnContour.green(), btnContour.blue(), 35)); // second contour layer gr1TopColor = blendColors(gr1TopColor, whiteColor); gr1TopColor = blendColors(gr1TopColor, blackColor); gr1BottomColor = blendColors(gr1BottomColor, whiteColor); gr1BottomColor = blendColors(gr1BottomColor, blackColor); gr2TopColor = blendColors(gr2TopColor, whiteColor); gr2TopColor = blendColors(gr2TopColor, blackColor); gr2BottomColor = blendColors(gr2BottomColor, whiteColor); gr2BottomColor = blendColors(gr2BottomColor, blackColor); background = blendColors(background, whiteColor); background = blendColors(background, blackColor); QRegion clip; if(drawTop) clip += QRegion(r.left(), r.top()+1, r.width(), 1); if(drawBottom) clip += QRegion(r.left(), r.bottom()-1, r.width(), 1); if(drawLeft) clip += QRegion(r.left()+1, r.top(), 1, r.height()); if(drawRight) clip += QRegion(r.right()-1, r.top(), 1, r.height()); p->setClipRegion(clip); QRect sr = r; int top = sr.y()+sr.height()*scrollBarSurface.g1Top/100; int bottom = sr.height()*scrollBarSurface.g1Bottom/100; int top2 = sr.y()+sr.height()*scrollBarSurface.g2Top/100; int bottom2 = sr.height()*scrollBarSurface.g2Bottom/100-top2; int left = sr.x()+sr.width()*scrollBarSurface.g1Top/100; int width = sr.width()*scrollBarSurface.g1Bottom/100; int left2 = sr.x()+sr.width()*scrollBarSurface.g2Top/100; int width2 = sr.width()*scrollBarSurface.g2Bottom/100-left2; p->fillRect(sr, background); switch(scrollBarSurface.numGradients) { case 1: if(isHorizontal) renderGradient(p, QRect(sr.x(), top, sr.width(), bottom), gr1TopColor, gr1BottomColor, true); else renderGradient(p, QRect(left, sr.y(), width, sr.height()), gr1TopColor, gr1BottomColor, false); break; case 2: if(isHorizontal) { renderGradient(p, QRect(r.x(), top, r.width(), bottom), gr1TopColor, gr1BottomColor, true); renderGradient(p, QRect(r.x(), top2, r.width(), bottom2), gr2TopColor, gr2BottomColor, true); } else { renderGradient(p, QRect(left, sr.y(), width, sr.height()), gr1TopColor,gr1BottomColor, false); renderGradient(p, QRect(left2, sr.y(), width2, sr.height()), gr2TopColor,gr2BottomColor, false); } default: break; } p->setClipping(false); QColor color1 = alphaBlendColors(buttonContour->contourColor(Contour_Default), backgroundColor, 203); // like btn contour QColor color2 = alphaBlendColors(QColor(255, 255, 255), color1, 25); p->setPen(color1); if(drawTop) { p->drawLine(r.left(), r.top(), r.right(), r.top()); // top } if(drawBottom) { p->drawLine(r.left(), r.bottom(), r.right(), r.bottom()); // bottom } if(drawLeft) { p->drawLine(r.left(), r.top(), r.left(), r.bottom()); // left } if(drawRight) { p->drawLine(r.right(), r.top(), r.right(), r.bottom()); // right } color1 = blendColors(color1, whiteColor); p->setPen(color2); if(roundUpperLeft) { renderPixel(p, QPoint(r.x()+1, r.y()+1), 127, color1, color1, true); p->drawPoint(r.x(), r.y()); } if(roundUpperRight) { renderPixel(p, QPoint(r.right()-1, r.top()+1), 127, color1, color1, true); p->drawPoint(r.right(), r.y()); } if(roundBottomLeft) { renderPixel(p, QPoint(r.x()+1, r.bottom()-1), 127, color1, color1, true); p->drawPoint(r.x(), r.bottom()); } if(roundBottomRight) { renderPixel(p, QPoint(r.right()-1, r.bottom()-1), 127, color1, color1, true); p->drawPoint(r.right(), r.bottom()); } } return; } void DominoStyle::renderSurface(QPainter *p, const QRect &r, const QColor &backgroundColor, const QColor &buttonColor, const QColor &/*highlightColor*/, const uint flags) const { if((r.width() <= 0)||(r.height() <= 0)) return; const DSurface* ds = 0; const bool isButton = flags&Is_Button; const bool isScrollBarBtn = flags&Is_ScrollBarBtn; const bool isScrollBarGroove = flags&Is_ScrollBarGroove; const bool isCheckItem = flags&Is_CheckItem; const bool isHeader = flags&Is_Header; const bool isTabTop = flags&Is_TabTop; const bool isActiveTabTop = flags&Is_ActiveTabTop; const bool isTabBottom = flags&Is_TabBottom; const bool isActiveTabBottom = flags&Is_ActiveTabBottom; const bool horizontal = flags&Is_Horizontal; const bool isDown = flags&Is_Down; if(isButton) ds = &btnSurface; else if(isCheckItem) ds = &checkItemSurface; else if(isScrollBarBtn) ds = &scrollBarSurface; else if(isScrollBarGroove) ds = &scrollBarGrooveSurface; else if(isHeader) ds = &headerSurface; else if(isTabTop) ds = &tabTopSurface; else if(isActiveTabTop) ds = &activeTabTopSurface; else if(isTabBottom) ds = &tabBottomSurface; else if(isActiveTabBottom) ds = &activeTabBottomSurface; QColor g1Color1; QColor g1Color2; QColor g2Color1; QColor g2Color2; QColor background; if(buttonColor != qApp->palette().active().button()) { g2Color1 = alphaBlendColors(buttonColor, ds->g2Color1, 127); g2Color2 = alphaBlendColors(buttonColor, ds->g2Color2, 127); g1Color1 = alphaBlendColors(buttonColor, ds->g1Color1, 127); g1Color2 = alphaBlendColors(buttonColor, ds->g1Color2, 127); background = alphaBlendColors(buttonColor, ds->background, 127); } else { g1Color1 = ds->g1Color1; g1Color2 = ds->g1Color2; g2Color1 = ds->g2Color1; g2Color2 = ds->g2Color2; background = ds->background; } if(isDown) { g1Color1 = darkenColor(g1Color1, 15); g1Color2 = darkenColor(g1Color2, 15); g2Color1 = darkenColor(g2Color1, 15); g2Color2 = darkenColor(g2Color2, 15); background = darkenColor(background, 15); } if(isButton) { // button / toolButton / comboBox / spinWidget / slider / progressBar if(!flatMode) { QRegion mask(r.x()+2, r.y(), r.width()-4, r.height()); mask += QRegion(r.x()+1, r.y()+1, r.width()-2, r.height()-2); mask += QRegion(r.x(), r.y()+2, r.width(), r.height()-4); p->setClipRegion(mask, QPainter::CoordPainter); } QRect re = r; if(re.x() < 0 ) { re.setWidth(re.width()+QABS(re.x())); re.setX(0); } else if(re.y() < 0 ) { re.setHeight(re.height()+QABS(re.y())); re.setY(0); } QPixmap pix(re.width(), re.height()); pix.fill(background); QPainter painter(&pix); int top = re.height()*btnSurface.g1Top/100; int bottom = re.height()*btnSurface.g1Bottom/100; int top2 = re.height()*btnSurface.g2Top/100; int bottom2 = re.height()*btnSurface.g2Bottom/100-top2; int left = re.width()*btnSurface.g1Top/100; int width = re.width()*btnSurface.g1Bottom/100; int left2 = re.width()*btnSurface.g2Top/100; int width2 = re.width()*btnSurface.g2Bottom/100-left2; switch (btnSurface.numGradients) { case 1:{ if(horizontal) { renderGradient(&painter, QRect(0, top, re.width(), bottom), g1Color1, g1Color2, true); } else { renderGradient(&painter, QRect(left, 0, width, re.height()), g1Color1, g1Color2, false); } break; } case 2: { if(horizontal) { renderGradient(&painter, QRect(0, top, re.width(), bottom), g1Color1, g1Color2, true); renderGradient(&painter, QRect(0, top2, re.width(), bottom2), g2Color1, g2Color2, true); } else { renderGradient(&painter, QRect(left, 0, width, re.height()), g1Color1, g1Color2, false); renderGradient(&painter, QRect(left2, 0, width2, re.height()), g2Color1, g2Color2, false); } } default: break; } p->drawPixmap(r.x(), r.y(), pix); p->setClipping(false); } else if(isTabTop || isActiveTabTop || isTabBottom || isActiveTabBottom) { int top = r.y()+r.height()*ds->g1Top/100; int bottom = r.height()*ds->g1Bottom/100; int top2 = r.y()+r.height()*ds->g2Top/100; int bottom2 = r.height()*ds->g2Bottom/100-top2; p->fillRect(r, background); switch (ds->numGradients) { case 1:{ renderGradient(p, QRect(r.x(), top, r.width(), bottom), g1Color1, g1Color2, true); break; } case 2: { renderGradient(p, QRect(r.x(), top, r.width(), bottom), g1Color1, g1Color2, true); renderGradient(p, QRect(r.x(), top2, r.width(), bottom2), g2Color1, g2Color2, true); } default: break; } } else if(isScrollBarBtn) { int top = r.height()*scrollBarSurface.g1Top/100; int bottom = r.height()*scrollBarSurface.g1Bottom/100; int top2 = r.height()*scrollBarSurface.g2Top/100; int bottom2 = r.height()*scrollBarSurface.g2Bottom/100-top2; int left = r.width()*scrollBarSurface.g1Top/100; int width = r.width()*scrollBarSurface.g1Bottom/100; int left2 = r.width()*scrollBarSurface.g2Top/100; int width2 = r.width()*scrollBarSurface.g2Bottom/100-left2; p->fillRect(r, background); switch (scrollBarSurface.numGradients) { case 1: { if(horizontal) { renderGradient(p, QRect(r.left(), top, r.width(), bottom), g1Color1, g1Color2, true); } else { renderGradient(p, QRect(left, r.top(), width, r.height()), g1Color1, g1Color2, false); } break; } case 2: { if(horizontal) { renderGradient(p, QRect(r.left(), top, r.width(), bottom), g1Color1, g1Color2, true); renderGradient(p, QRect(r.left(), top2, r.width(), bottom2), g2Color1, g2Color2, true); } else { renderGradient(p, QRect(left, r.top(), width, r.height()), g1Color1, g1Color2, false); renderGradient(p, QRect(left2, r.top(), width2, r.height()), g2Color1, g2Color2, false); } } default: break; } } else if(isScrollBarGroove) { int top = r.height()*scrollBarGrooveSurface.g1Top/100; int bottom = r.height()*scrollBarGrooveSurface.g1Bottom/100; int top2 = r.height()*scrollBarGrooveSurface.g2Top/100; int bottom2 = r.height()*scrollBarGrooveSurface.g2Bottom/100-top2; int left = r.width()*scrollBarGrooveSurface.g1Top/100; int width = r.width()*scrollBarGrooveSurface.g1Bottom/100; int left2 = r.width()*scrollBarGrooveSurface.g2Top/100; int width2 = r.width()*scrollBarGrooveSurface.g2Bottom/100-left2; p->fillRect(r, background); switch (scrollBarGrooveSurface.numGradients) { case 1: { if(horizontal) { renderGradient(p, QRect(r.left(), top, r.width(), bottom), g1Color1, g1Color2, true); } else { renderGradient(p, QRect(left, r.top(), width, r.height()), g1Color1, g1Color2, false); } break; } case 2: { if(horizontal) { renderGradient(p, QRect(r.left(), top, r.width(), bottom), g1Color1, g1Color2, true); renderGradient(p, QRect(r.left(), top2, r.width(), bottom2), g2Color1, g2Color2, true); } else { renderGradient(p, QRect(left, r.top(), width, r.height()), g1Color1, g1Color2, false); renderGradient(p, QRect(left2, r.top(), width2, r.height()), g2Color1, g2Color2, false); } } default: break; } } else if(isCheckItem) { QPixmap pix(r.width(), r.height()); pix.fill(background); QPainter painter(&pix); int top = r.height()*checkItemSurface.g1Top/100; int bottom = r.height()*checkItemSurface.g1Bottom/100; int top2 = r.height()*checkItemSurface.g2Top/100; int bottom2 = r.height()*checkItemSurface.g2Bottom/100-top2; switch(checkItemSurface.numGradients) { case 1:{ renderGradient(&painter, QRect(0, top, r.width(), bottom), g1Color1, g1Color2, true); break; } case 2: { renderGradient(&painter, QRect(0, top, r.width(), bottom), g1Color1, g1Color2, true); renderGradient(&painter, QRect(0, top2, r.width(), bottom2), g2Color1, g2Color2, true); break; } default: break; } painter.end(); p->drawPixmap(QRect(r.x(), r.y()+3, r.width(), r.height()-7), pix); } else if(isHeader) { QHeader* hdr = dynamic_cast(p->device()); bool needErasePixmap = false; QRect re = r; bool horizontal = false; bool drawTop = false; if(hdr) { if(hdr->orientation() == Qt::Horizontal) { horizontal = true; bool hasErasePixmap = hdr->erasePixmap(); if(hasErasePixmap && !isDown) { hdr->erase(r); return; } else if(!hasErasePixmap && !isDown) { needErasePixmap = true; re = QRect(0, 0, 10, r.height()); } } else if(hdr->sectionAt(r.top()+hdr->offset()) == 0 && r.y() == 0) drawTop = true; } QPixmap pix(re.width(), re.height()); pix.fill(background); QPainter painter(&pix); int top = re.height()*headerSurface.g1Top/100; int bottom = re.height()*headerSurface.g1Bottom/100; int top2 = re.height()*headerSurface.g2Top/100; int bottom2 = re.height()*headerSurface.g2Bottom/100-top2; switch (headerSurface.numGradients) { case 1:{ renderGradient(&painter, QRect(0, top, re.width(), bottom), g1Color1, g1Color2, true); break; } case 2: { renderGradient(&painter, QRect(0, top, re.width(), bottom), g1Color1, g1Color2, true); renderGradient(&painter, QRect(0, top2, re.width(), bottom2), g2Color1, g2Color2, true); break; } default: break; } painter.setPen(alphaBlendColors(buttonContour->contourColor(Contour_Default), backgroundColor, 179)); if(horizontal || drawTop) painter.drawLine(0, re.y(), re.width(), re.y()); painter.drawLine(0, re.height()-1, re.width(), re.height()-1); if(needErasePixmap) { hdr->setUpdatesEnabled(false); hdr->setErasePixmap(pix); hdr->setUpdatesEnabled(true); hdr->erase(r); } else { // same problem as with the scrollbars, if we don't clip, the text above will be randomly erased. p->setClipRect(re); p->drawPixmap(r.x(), r.y(), pix); p->setClipping(false); } } } void DominoStyle::renderPixel(QPainter *p, const QPoint &pos, const int alpha, const QColor &color, const QColor &background, bool fullAlphaBlend) const { if(fullAlphaBlend) // full alpha blend: paint into an image with alpha buffer and convert to a pixmap ... { QRgb rgb = color.rgb(); // generate a quite unique key -- use the unused width field to store the alpha value. CacheEntry search(cAlphaDot, alpha, 0, rgb); int key = search.key(); CacheEntry *cacheEntry; if( (cacheEntry = pixmapCache->find(key)) ) { if( search == *cacheEntry ) { // match! we can draw now... if(cacheEntry->pixmap) p->drawPixmap(pos, *(cacheEntry->pixmap) ); return; } else { //Remove old entry in case of a conflict! pixmapCache->remove( key ); } } QImage aImg(1,1,32); // 1x1 aImg.setAlphaBuffer(true); aImg.setPixel(0,0,qRgba(qRed(rgb),qGreen(rgb),qBlue(rgb),alpha)); QPixmap *result = new QPixmap(aImg); p->drawPixmap(pos, *result); // add to the cache... CacheEntry *toAdd = new CacheEntry(search); toAdd->pixmap = result; bool insertOk = pixmapCache->insert( key, toAdd, result->depth()/8); if(!insertOk) delete result; } else // don't use an alpha buffer: calculate the resulting color from the alpha value, the fg- and the bg-color. { QRgb rgb_a = color.rgb(); QRgb rgb_b = background.rgb(); int a = alpha; if(a>255) a = 255; if(a<0) a = 0; int a_inv = 255 - a; QColor res = QColor( qRgb(qRed(rgb_b)*a_inv/255 + qRed(rgb_a)*a/255, qGreen(rgb_b)*a_inv/255 + qGreen(rgb_a)*a/255, qBlue(rgb_b)*a_inv/255 + qBlue(rgb_a)*a/255) ); p->setPen(res); p->drawPoint(pos); } } void DominoStyle::renderButtonShadow(QPainter *p, const QRect &r, const uint flags) const { if((!buttonContour->drawButtonSunkenShadow && buttonContour->defaultType == Contour_Sunken) || (buttonContour->defaultType != Contour_Sunken && !flatMode)) return; if(flags&Round_UpperLeft) { bitBlt(p->device(), r.left(), r.top(), buttonContour->shadowRound(), 0, 0, 5, 5, Qt::CopyROP); } else if(flags&Rectangular_UpperLeft){ bitBlt(p->device(), r.left(), r.top(), buttonContour->shadowRectangular(), 0, 0, 5, 5, Qt::CopyROP); } if(flags&Round_UpperRight) { bitBlt(p->device(), r.right()-6, r.top(), buttonContour->shadowRound(), 5, 0, 5, 5, Qt::CopyROP); } else if(flags&Rectangular_UpperRight){ bitBlt(p->device(), r.right()-6, r.top(), buttonContour->shadowRectangular(), 5, 0, 5, 5, Qt::CopyROP); } if(flags&Round_BottomLeft) { bitBlt(p->device(), r.left(), r.bottom()-5, buttonContour->shadowRound(), 0, 5, 4, 4, Qt::CopyROP); } else if(flags&Rectangular_BottomLeft) bitBlt(p->device(), r.left(), r.bottom()-5, buttonContour->shadowRectangular(), 0, 5, 4, 4, Qt::CopyROP); if(flags&Round_BottomRight) { bitBlt(p->device(), r.right()-5, r.bottom()-5, buttonContour->shadowRound(), 4, 5, 4, 4, Qt::CopyROP); } else if(flags&Rectangular_BottomRight) bitBlt(p->device(), r.right()-5, r.bottom()-5, buttonContour->shadowRectangular(), 4, 5, 4, 4, Qt::CopyROP); if(flags&Draw_Top) p->drawTiledPixmap(r.left()+5, r.top(), r.width()-12, 3, *buttonContour->shadowHLines(), 0, 0); if(flags&Draw_Left) p->drawTiledPixmap(r.left(), r.top()+5, 3, r.height()-11, *buttonContour->shadowVLines(), 0, 0); if(flags&Draw_Right) p->drawTiledPixmap(r.right()-4, r.top()+5, 3, r.height()-11, *buttonContour->shadowVLines(), 3, 0); if(flags&Draw_Bottom) p->drawTiledPixmap(r.left()+4, r.bottom()-3, r.width()-10, 2, *buttonContour->shadowHLines(), 0, 3); } void DominoStyle::renderButton(QPainter *p, const QRect &r, const QColorGroup &g, bool sunken, bool /*mouseOver*/, bool horizontal, bool enabled, bool khtmlMode) const { uint contourFlags = Draw_Left|Draw_Right|Draw_Top|Draw_Bottom; if(!enabled) contourFlags|=Is_Disabled; if(khtmlMode || buttonContour->alphaMode() /* || kickerMode*/) { contourFlags|=Draw_AlphaBlend; } uint surfaceFlags = Is_Button; if(horizontal) { surfaceFlags|=Is_Horizontal; contourFlags|=Is_Horizontal; } if(!enabled) surfaceFlags|=Is_Disabled; else { if(sunken) { surfaceFlags|=Is_Down; contourFlags|=Is_Down; } } // QColor buttonColor = khtmlMode ? g.button() : qApp->palette().active().background(); if (!flatMode) { contourFlags |= Round_UpperLeft|Round_UpperRight|Round_BottomLeft|Round_BottomRight|Is_Button; renderSurface(p, QRect(r.x()+2, r.y()+2, r.width()-4, r.height()-5), g.background(), g.button(), g.button(), surfaceFlags); renderContour(p, r, g.background(), g.button(), contourFlags); if(sunken) { renderButtonShadow(p, QRect(r.x()+2, r.y()+2, r.width()-2, r.height()-3), contourFlags); } } else { renderSurface(p, QRect(r.x()-3, r.y()-1, r.width()+6, r.height()+2), g.background(), g.button(), g.button(), surfaceFlags); if(sunken) { contourFlags |= Rectangular_UpperLeft|Rectangular_UpperRight|Rectangular_BottomLeft|Rectangular_BottomRight; renderButtonShadow(p, QRect(r.x()-2, r.y()-2, r.width()+4, r.height()+4), contourFlags); } } } void DominoStyle::renderHeader(QPainter *p, const QRect &r, const QColorGroup &g, bool sunken, bool /*mouseOver*/, bool /*horizontal*/, bool /*enabled*/) const { p->save(); bool drawLeft = true; QHeader* hd = dynamic_cast(p->device()); if(hd && hd->orientation() == Qt::Horizontal) drawLeft = r.x() == 0 && hd->sectionAt(r.left()+hd->offset()) == 0; uint surfaceFlags = Is_Header|Is_Horizontal; if(sunken) surfaceFlags |= Is_Down; renderSurface(p, QRect(r.left(), r.top(), r.width(), r.height()), g.button(), g.button(), g.button(), surfaceFlags); // p->setPen(buttonContour->contourColor(Contour_Default)); p->setPen(alphaBlendColors(buttonContour->contourColor(Contour_Default), g.background(), 179)); if(drawLeft) p->drawLine(r.left(), r.top(), r.left(), r.bottom()); if(!hd) p->drawLine(r.right(), r.top(), r.left(), r.top()); p->drawLine(r.right(), r.top(), r.right(), r.bottom()); p->restore(); } void DominoStyle::renderGradient(QPainter *painter, const QRect &rect, const QColor &c1, const QColor &c2, bool horizontal) const { if((rect.width() <= 0)||(rect.height() <= 0)) return; // generate a quite unique key for this surface. CacheEntry search(cGradientTile, horizontal ? 0 : rect.width(), horizontal ? rect.height() : 0, c1.rgb(), c2.rgb(), horizontal ); int key = search.key(); CacheEntry *cacheEntry; if( (cacheEntry = pixmapCache->find(key)) ) { if( search == *cacheEntry ) { // match! we can draw now... if(cacheEntry->pixmap) { painter->drawTiledPixmap(rect, *(cacheEntry->pixmap) ); } return; } else { // Remove old entry in case of a conflict! // This shouldn't happen very often, see comment in CacheEntry. pixmapCache->remove(key); } } // there wasn't anything matching in the cache, create the pixmap now... QPixmap *result = new QPixmap(horizontal ? 10 : rect.width(), horizontal ? rect.height() : 10); QPainter p(result); int r_w = result->rect().width(); int r_h = result->rect().height(); int r_x, r_y, r_x2, r_y2; result->rect().coords(&r_x, &r_y, &r_x2, &r_y2); int rDiff, gDiff, bDiff; int rc, gc, bc; register int x, y; rDiff = ( c2.red()) - (rc = c1.red()); gDiff = ( c2.green()) - (gc = c1.green()); bDiff = ( c2.blue()) - (bc = c1.blue()); register int rl = rc << 16; register int gl = gc << 16; register int bl = bc << 16; int rdelta = ((1<<16) / (horizontal ? r_h : r_w)) * rDiff; int gdelta = ((1<<16) / (horizontal ? r_h : r_w)) * gDiff; int bdelta = ((1<<16) / (horizontal ? r_h : r_w)) * bDiff; // these for-loops could be merged, but the if's in the inner loop // would make it slow if(horizontal) { for ( y = 0; y < r_h; y++ ) { rl += rdelta; gl += gdelta; bl += bdelta; p.setPen(QColor(rl>>16, gl>>16, bl>>16)); p.drawLine(r_x, r_y+y, r_x2, r_y+y); } } else { for( x = 0; x < r_w; x++) { rl += rdelta; gl += gdelta; bl += bdelta; p.setPen(QColor(rl>>16, gl>>16, bl>>16)); p.drawLine(r_x+x, r_y, r_x+x, r_y2); } } p.end(); // draw the result... painter->drawTiledPixmap(rect, *result); // insert into cache using the previously created key. CacheEntry *toAdd = new CacheEntry(search); toAdd->pixmap = result; bool insertOk = pixmapCache->insert( key, toAdd, result->width()*result->height()*result->depth()/8 ); if(!insertOk) delete result; } void DominoStyle::renderTab(QPainter *p, const QRect &r, const QColorGroup &g, bool /*mouseOver*/, const bool selected, const bool bottom, const TabPosition pos, const bool /*triangular*/, const bool /*cornerWidget*/, const bool konqTab) const { const bool isFirst = (pos == First); const bool isLast = (pos == Last); const bool isSingle = (pos == Single); QPixmap buffer(r.width(), r.height()); QPainter painter(&buffer); QColor tabContour2 = g.background().dark(150); QPixmap* tabEdges; if(!(tabEdges = QPixmapCache::find(QString::number(tabContour2.pixel(), 16)+"tabEdges"))) { QImage img1 = tintImage(qembed_findImage("border1"), tabContour2); QImage img2 = qembed_findImage("tabInsideWhite"); blend(img1, img2, img2); tabEdges = new QPixmap(img2); QPixmapCache::insert(QString::number(tabContour2.pixel(), 16)+"tabEdges", tabEdges); } QPixmap* tabHLines; if(!(tabHLines = QPixmapCache::find("tabHLines"))) { tabHLines = new QPixmap(qembed_findImage("tabHLines")); QPixmapCache::insert("tabHLines", tabHLines); } QPixmap* tabVLines; if(!(tabVLines = QPixmapCache::find("tabVLines"))) { tabVLines = new QPixmap(qembed_findImage("tabVLines")); QPixmapCache::insert("tabVLines", tabVLines); } if(konqTab) { const QColor background = g.background().dark(konqTabBarContrast); if (selected) { ///painter.fillRect(0, r.height()-9, r.width(), 9, background); // rect below gradient ///painter.fillRect(0, 0, r.width(), r.height()-9, g.background()); // rect above gradient painter.fillRect(0, 0, r.width(), 2, g.background()); // rect above gradient painter.translate(0, 2); renderSurface(&painter, QRect(1, 0, r.width()-2, r.height()-3), g.background(), g.button(), g.button(), Is_ActiveTabBottom); painter.translate(0, -2); QPixmap* tabEdges2; QString position = isFirst ? "first" : isLast ? "last" : isSingle ? "single" : "middle"; if(!(tabEdges2 = QPixmapCache::find(position+"tabEdges2-k-sel"+QString::number(g.background().pixel(), 16)+QString::number(r.height())))) { tabEdges2 = new QPixmap(16, 8); tabEdges2->fill(background); QPainter painter2(tabEdges2); // parts of the unselected tabs under the rounded edges if(!isSingle) { if(!isFirst) { painter2.translate(0, -r.height()+12); renderSurface(&painter2, QRect(0, 0, 3, r.height()-5-3), g.background(), g.button(), g.button(), Is_TabBottom); painter2.resetXForm(); painter2.drawTiledPixmap(0, 3, 3, 1, *tabHLines, 0, 2); // left painter2.setPen(alphaBlendColors(QColor(0,0,0), background, 79)); // bottomShadow1 painter2.drawLine(0, 4, 1, 4); painter2.setPen(alphaBlendColors(QColor(0,0,0), background, 30)); // bottomShadow2 painter2.drawPoint(2,4); // last point from bottomShadow1 a tad lighter (will be overpainted by the circle) painter2.drawLine(0, 5, 3, 5); } if(!isLast) { painter2.translate(0, -r.height()+12); renderSurface(&painter2, QRect(13, 0, 3, r.height()-5-3), g.background(), g.button(), g.button(), Is_TabBottom); painter2.resetXForm(); painter2.drawTiledPixmap(13, 3, 3, 1, *tabHLines, 0, 2); // right painter2.setPen(alphaBlendColors(QColor(0,0,0), background, 79)); // bottomShadow1 painter2.drawLine(14, 4, 15, 4); painter2.setPen(alphaBlendColors(QColor(0,0,0), background, 30)); // bottomShadow2 painter2.drawPoint(13,4); painter2.drawLine(12, 5, 15, 5); } } // fill the rect under the gradients (faster as clipping the gradients) painter2.fillRect(QRect(0, 6, 16, 2), background); painter2.end(); QPixmap tabEdgesMask = qembed_findImage("groupBoxMask"); // this fits because the tab frame is just an inverted groupbox frame, but pssst ;) painter2.begin(&tabEdgesMask); painter2.translate(0, -r.height()+19); renderSurface(&painter2, QRect(0, 0, 16, r.height()-3), g.background(), g.button(), g.button(), Is_ActiveTabBottom); painter2.end(); bitBlt(tabEdges2, 0, 0, &tabEdgesMask, 0, 8); QPixmap circle = qembed_findImage("tabWidget"); bitBlt(tabEdges2, 0, 0, &circle, 0, 8); QPixmapCache::insert(position+"tabEdges2-k-sel"+QString::number(g.background().pixel(), 16)+QString::number(r.height()), tabEdges2); } painter.setPen(alphaBlendColors(QColor(0,0,0), background, 79)); // bottomShadow1 painter.drawLine(8, r.height()-3, r.width()-9, r.height()-3); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 30)); // bottomShadow2 painter.drawLine(8, r.height()-2, r.width()-9, r.height()-2); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 35)); painter.translate(0,3); if(isFirst || isSingle) painter.drawLine(0, -1, 0, r.height()-13); // left else renderTabSeparator(&painter, QRect(0, 0, 1, r.height()-5-3), g.button(), false); if(isLast || isSingle) painter.drawLine(r.width()-1, -1, r.width()-1, r.height()-13); // right else renderTabSeparator(&painter, QRect(r.width()-1, 0, 1, r.height()-5-3), g.button(), false); painter.translate(0,-3); bitBlt(&buffer, 0, r.height()-9, tabEdges2, 0, 0, 8, 8); bitBlt(&buffer, r.width()-8, r.height()-9, tabEdges2, 8, 0, 8, 8); painter.drawTiledPixmap(8, r.height()-4, r.width()-16, 1, *tabHLines, 0, 2); painter.drawTiledPixmap(1, 2, 1, r.height()-11, *tabVLines); // left painter.drawTiledPixmap(r.width()-2, 2, 1, r.height()-11, *tabVLines); // right painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 20)); painter.drawPoint(0,1); painter.drawPoint(r.width()-1,1); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 50)); painter.drawPoint(0,2); painter.drawPoint(r.width()-1,2); //QColor tmp = alphaBlendColors(QColor(255,255,255), g.background(), 14); QColor tmp = g.background(); painter.setPen(alphaBlendColors(tmp, activeTabBottomSurface.g1Top == 0 ? activeTabBottomSurface.g1Color1 : activeTabBottomSurface.background, 127)); // painter.drawPoint(1,2); // painter.drawPoint(r.width()-2,2); painter.drawLine(1,2, r.width()-2, 2); // under the tab painter.setPen(background); painter.drawLine(0, r.height()-1, r.width(), r.height()-1); } else { // unselected painter.setPen(g.background());// 0. tabbarline painter.drawLine(0, 0, r.width(), 0); painter.setPen(g.background().dark(120));//QColor(110,110,110) // 1. tabbarline painter.drawLine(0, 1, r.width(), 1); painter.setPen(g.background().dark(konqTabBarContrast+20)); //QColor(110,110,110) // topline // painter.setPen(g.background().dark(150-15)); painter.setPen(g.background().dark(150-15)); painter.drawLine(0, 2, r.width(), 2); if(isFirst || isLast) { painter.translate(0, 3); renderSurface(&painter, QRect(1, 0, r.width()-2, r.height()-5-3), g.background(), g.button(), g.button(), Is_TabBottom); painter.translate(0, -3); QPixmap* tabEdges2; if(!(tabEdges2 = QPixmapCache::find("tabEdges2-k"+QString::number(g.background().pixel(), 16)+QString::number(r.height())))) { tabEdges2 = new QPixmap(16, 8); tabEdges2->fill(background); QPixmap tabEdgesMask = qembed_findImage("groupBoxMask"); QPainter painter2(&tabEdgesMask); painter2.translate(0, -r.height()+19+3); renderSurface(&painter2, QRect(1, 0, 14, r.height()-5-3), g.background(), g.button(), g.button(), Is_TabBottom); painter2.end(); bitBlt(tabEdges2, 0, 0, &tabEdgesMask, 0, 8); QPixmap circle = qembed_findImage("tabWidget"); bitBlt(tabEdges2, 0, 0, &circle, 0, 8); QPixmapCache::insert("tabEdges2-k"+QString::number(g.background().pixel(), 16)+QString::number(r.height()), tabEdges2); } if(isFirst) { painter.translate(0,3); renderTabSeparator(&painter, QRect(r.width()-1, 0, 1, r.height()-5-3), g.button(), false);// right painter.translate(0,-3); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 79)); // bottomShadow1 painter.drawLine(8, r.height()-5, r.width()-1, r.height()-5); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 30)); // bottomShadow2 painter.drawLine(8, r.height()-4, r.width()-1, r.height()-4); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 35)); painter.drawLine(0, 2, 0, r.height()-11); // left bitBlt(&buffer, 0, r.height()-11, tabEdges2, 0, 0, 8, 8); painter.drawTiledPixmap(8, r.height()-6, r.width()-8, 1, *tabHLines, 0, 2); // bottom painter.drawTiledPixmap(1, 3, 1, r.height()-14, *tabVLines); // left } else { painter.translate(0,3); renderTabSeparator(&painter, QRect(0, 0, 1, r.height()-5-3), g.button(), false); // left painter.translate(0,-3); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 79)); // bottomShadow1 painter.drawLine(0, r.height()-5, r.width()-8, r.height()-5); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 30)); // bottomShadow2 painter.drawLine(0, r.height()-4, r.width()-8, r.height()-4); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 35)); painter.drawLine(r.width()-1, 2, r.width()-1, r.height()-11); // right bitBlt(&buffer, r.width()-8, r.height()-11, tabEdges2, 8, 0, 8, 8); painter.drawTiledPixmap(0, r.height()-6, r.width()-8, 1, *tabHLines, 0, 2); // bottom painter.drawTiledPixmap(r.width()-2, 3, 1, r.height()-14, *tabVLines); // right } } else { // middle painter.translate(0,3); renderTabSeparator(&painter, QRect(0, 0, 1, r.height()-5-3), g.button(), false); // left renderTabSeparator(&painter, QRect(r.width()-1, 0, 1, r.height()-5-3), g.button(), false);// right painter.translate(0,-3); painter.translate(0, 3); renderSurface(&painter, QRect(1, 0, r.width()-2, r.height()-5-3), g.background(), g.button(), g.button(), Is_TabBottom); painter.translate(0, -3); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 79)); // bottomShadow1 painter.drawLine(0, r.height()-5, r.width()-1, r.height()-5); painter.setPen(alphaBlendColors(QColor(0,0,0), background, 30)); // bottomShadow2 painter.drawLine(0, r.height()-4, r.width()-1, r.height()-4); painter.drawTiledPixmap(0, r.height()-6, r.width(), 1, *tabHLines, 0, 2); // bottom } painter.fillRect(QRect(0, r.height()-3, r.width(), 3), background); } p->drawPixmap(r.left(), r.top(), buffer); } else { // standard tabs if(bottom) { if (selected) { renderSurface(&painter, QRect(1, 0, r.width()-2, r.height()-2), g.background(), g.button(), g.button(), Is_ActiveTabBottom); QPixmap* tabEdges2; QString position = isFirst ? "first" : isLast ? "last" : isSingle ? "single" : "middle"; if(!(tabEdges2 = QPixmapCache::find(position+"tabEdges2-bottom-sel"+QString::number(g.background().pixel(), 16)+QString::number(r.height())))) { tabEdges2 = new QPixmap(16, 8); tabEdges2->fill(g.background()); QPainter painter2(tabEdges2); if(!isSingle) { if(!isFirst) { painter2.translate(0, -r.height()+8); renderSurface(&painter2, QRect(0, 0, 2, r.height()-5), g.background(), g.button(), g.button(), Is_TabBottom); painter2.resetXForm(); painter2.drawTiledPixmap(0, 2, 2, 1, *tabHLines, 0, 2); // left painter2.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 79)); painter2.drawLine(0, 3, 1,3); painter2.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 30)); painter2.drawLine(0, 4, 3, 4); } if(!isLast) { painter2.translate(0, -r.height()+8); renderSurface(&painter2, QRect(14, 0, 2, r.height()-5), g.background(), g.button(), g.button(), Is_TabBottom); painter2.resetXForm(); painter2.drawTiledPixmap(14, 2, 2, 1, *tabHLines, 0, 2); // right painter2.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 79)); painter2.drawLine(14, 3, 15, 3); painter2.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 30)); painter2.drawLine(12, 4, 15, 4); } } painter2.fillRect(QRect(0, 5, 16, 3), g.background()); painter2.end(); QPixmap tabEdgesMask = qembed_findImage("groupBoxMask"); painter2.begin(&tabEdgesMask); painter2.translate(0, -r.height()+16); renderSurface(&painter2, QRect(1, 0, 14, r.height()-2), g.background(), g.button(), g.button(), Is_ActiveTabBottom); painter2.end(); bitBlt(tabEdges2, 0, 0, &tabEdgesMask, 0, 8); QPixmap circle = qembed_findImage("tabWidget"); bitBlt(tabEdges2, 0, 0, &circle, 0, 8); QPixmapCache::insert(position+"tabEdges2-bottom-sel"+QString::number(g.background().pixel(), 16)+QString::number(r.height()), tabEdges2); } painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 79)); // bottomShadow1 painter.drawLine(8, r.height()-2, r.width()-9, r.height()-2); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 30)); // bottomShadow2 painter.drawLine(8, r.height()-1, r.width()-9, r.height()-1); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 35)); if(isFirst || isSingle) painter.drawLine(0, 0, 0, r.height()-8); // left else renderTabSeparator(&painter, QRect(0, 0, 1, r.height()-5), g.button(), false); if(isLast || isSingle) painter.drawLine(r.width()-1, 0, r.width()-1, r.height()-8); // right else renderTabSeparator(&painter, QRect(r.width()-1, 0, 1, r.height()-5), g.button(), false); bitBlt(&buffer, 0, r.bottom()-7, tabEdges2, 0, 0, 8, 8); bitBlt(&buffer, r.width()-8, r.bottom()-7, tabEdges2, 8, 0, 8, 8); painter.drawTiledPixmap(8, r.height()-3, r.width()-16, 1, *tabHLines, 0, 2); // bottom painter.drawTiledPixmap(1, 0, 1, r.height()-8, *tabVLines); // left painter.drawTiledPixmap(r.width()-2, 0, 1, r.height()-8, *tabVLines); // right painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 35)); // clip the first pixels of the separators painter.drawPoint(0, 0); painter.drawPoint(r.width()-1, 0); } else { // unselected renderSurface(&painter, QRect(1, 0, r.width()-2, r.height()-5), g.background(), g.button(), g.button(), Is_TabBottom); if(isFirst || isLast) { QPixmap* tabEdges2; if(!(tabEdges2 = QPixmapCache::find("tabEdges2-bottom"+QString::number(g.background().pixel(), 16)+QString::number(r.height())))) { tabEdges2 = new QPixmap(16, 8); tabEdges2->fill(g.background()); QPixmap tabEdgesMask = qembed_findImage("groupBoxMask"); QPainter painter2(&tabEdgesMask); painter2.translate(0, -r.height()+19); renderSurface(&painter2, QRect(1, 0, 14, r.height()-5), g.background(), g.button(), g.button(), Is_TabBottom); painter2.end(); bitBlt(tabEdges2, 0, 0, &tabEdgesMask, 0, 8); QPixmap circle = qembed_findImage("tabWidget"); bitBlt(tabEdges2, 0, 0, &circle, 0, 8); QPixmapCache::insert("tabEdges2-bottom"+QString::number(g.background().pixel(), 16)+QString::number(r.height()), tabEdges2); } if(isFirst) { renderTabSeparator(&painter, QRect(r.width()-1, 0, 1, r.height()-5), g.button(), false);// right painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 79)); // bottomShadow1 painter.drawLine(8, r.height()-5, r.width()-1, r.height()-5); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 30)); // bottomShadow2 painter.drawLine(8, r.height()-4, r.width()-1, r.height()-4); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 35)); painter.drawLine(0, 1, 0, r.height()-12); // left bitBlt(&buffer, 0, r.height()-11, tabEdges2, 0, 0, 8, 8); painter.drawTiledPixmap(1, 1, 1, r.height()-12, *tabVLines); // left painter.drawTiledPixmap(8, r.height()-6, r.width()-8, 1, *tabHLines, 0, 2); // bottom painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 55)); painter.drawLine(0, 0, r.width()-1, 0); // top } else { renderTabSeparator(&painter, QRect(0, 0, 1, r.height()-5), g.button(), false); // left painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 79)); // bottomShadow1 painter.drawLine(0, r.height()-5, r.width()-8, r.height()-5); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 30)); // bottomShadow2 painter.drawLine(0, r.height()-4, r.width()-8, r.height()-4); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 35)); painter.drawLine(r.width()-1, 1, r.width()-1, r.height()-12); // right bitBlt(&buffer, r.width()-8, r.height()-11, tabEdges2, 8, 0, 8, 8); painter.drawTiledPixmap(r.width()-2, 1, 1, r.height()-12, *tabVLines); // right painter.drawTiledPixmap(0, r.height()-6, r.width()-8, 1, *tabHLines, 0, 2); // bottom painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 55)); painter.drawLine(0, 0, r.width()-1, 0); // top } } else { // middle renderTabSeparator(&painter, QRect(0, 0, 1, r.height()-5), g.button(), false); // left renderTabSeparator(&painter, QRect(r.width()-1, 0, 1, r.height()-5), g.button(), false);// right painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 79)); // bottomShadow1 painter.drawLine(0, r.height()-5, r.width()-1, r.height()-5); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 30)); // bottomShadow2 painter.drawLine(0, r.height()-4, r.width()-1, r.height()-4); painter.drawTiledPixmap(0, r.height()-6, r.width(), 1, *tabHLines, 0, 2); // bottom painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 55)); painter.drawLine(0, 0, r.width()-1, 0); // top } painter.fillRect(QRect(0, r.height()-3, r.width(), 3), g.background()); // rect under the tab, clips also the tabSeperator } } else { // above if (selected) { renderSurface(&painter, QRect(1, 1, r.width()-2, r.height()), g.background(), g.button(), g.button(), Is_ActiveTabTop); QPixmap* tabEdges2; QString position = isFirst ? "first" : isLast ? "last" : isSingle ? "single" : "middle"; if(!(tabEdges2 = QPixmapCache::find(position+"tabEdges2-top-sel"+QString::number(g.background().pixel(), 16)+QString::number(r.height())))) { tabEdges2 = new QPixmap(16,8); tabEdges2->fill(g.background()); QPainter painter2(tabEdges2); if(!isSingle) { painter2.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 25)); if(!isFirst) { renderSurface(&painter2, QRect(0, 4, 2, r.height()), g.background(), g.button(), g.button(), Is_TabTop); painter2.drawLine(0, 3, 1, 3); // topLine painter2.drawTiledPixmap(0, 4, 2, 2, *tabHLines); } if(!isLast) { renderSurface(&painter2, QRect(14, 4, 2, r.height()), g.background(), g.button(), g.button(), Is_TabTop); painter2.drawLine(14, 3, 15, 3); // topLine painter2.drawTiledPixmap(14, 4, 2, 2, *tabHLines); } } painter2.end(); QPixmap tabEdgesMask = qembed_findImage("groupBoxMask"); painter2.begin(&tabEdgesMask); renderSurface(&painter2, QRect(1, 1, 14, r.height()), g.background(), g.button(), g.button(), Is_ActiveTabTop); painter2.end(); bitBlt(tabEdges2, 0, 0, &tabEdgesMask); QPixmap circle = qembed_findImage("tabWidget"); bitBlt(tabEdges2, 0, 0, &circle); QPixmapCache::insert(position+"tabEdges2-top-sel"+QString::number(g.background().pixel(), 16)+QString::number(r.height()), tabEdges2); } /////////////////////////////////////////////// painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 35)); ///painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 40)); if(isFirst || isSingle) painter.drawLine(0, 8, 0, r.height()-1); // left else renderTabSeparator(&painter, QRect(0, 4, 1, r.height()), g.button(), true); if(isLast || isSingle) painter.drawLine(r.width()-1, 8, r.width()-1, r.height()-1); // right else renderTabSeparator(&painter, QRect(r.width()-1, 4, 1, r.height()), g.button(), true); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 25)); painter.drawLine(8, 0, r.width()-9, 0); // top bitBlt(&buffer, 0, 0, tabEdges2, 0, 0, 8, 8, Qt::CopyROP); bitBlt(&buffer, r.width()-8, 0, tabEdges2, 8, 0, 8, 8, Qt::CopyROP); painter.drawTiledPixmap(8, 1, r.width()-16, 2, *tabHLines); // top painter.drawTiledPixmap(1, 8, 1, r.height()-1, *tabVLines); // left painter.drawTiledPixmap(r.width()-2, 8, 1, r.height()-1, *tabVLines); // right painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 35)); // clip the last pixels of the separators painter.drawPoint(0, r.height()-1); painter.drawPoint(r.width()-1, r.height()-1); } else { // unselected painter.fillRect(0, 0, r.width(), 10, g.background()); painter.setPen(g.background().dark(150)); renderSurface(&painter, QRect(1, 4, r.width()-2, r.height()), g.background(), g.button(), g.button(), Is_TabTop); if(isFirst || isLast) { QPixmap* tabEdges2; if(!(tabEdges2 = QPixmapCache::find("tabEdges2-top"+QString::number(g.background().pixel(), 16)+QString::number(r.height())))) { tabEdges2 = new QPixmap(16, 8); tabEdges2->fill(g.background()); QPixmap tabEdgesMask = qembed_findImage("groupBoxMask"); QPainter painter2(&tabEdgesMask); renderSurface(&painter2, QRect(1, 1, r.width()-2, r.height()), g.background(), g.button(), g.button(), Is_TabTop); painter2.end(); bitBlt(tabEdges2, 0, 0, &tabEdgesMask); QPixmap circle = qembed_findImage("tabWidget"); bitBlt(tabEdges2, 0, 0, &circle); QPixmapCache::insert("tabEdges2-top"+QString::number(g.background().pixel(), 16)+QString::number(r.height()), tabEdges2); } if(isFirst) { // darker separator renderTabSeparator(&painter, QRect(r.width()-1, 4, 1, r.height()), g.button(), true); // left painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 25)); painter.drawLine(8, 3, r.width()-1, 3); // topLine painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 35)); painter.drawLine(0, 10, 0, r.height()-1); // left painter.drawLine(1, r.height()-1, r.width()-1, r.height()-1); // bottom painter.drawTiledPixmap(8, 4, r.width()-1, 2, *tabHLines); // top painter.drawTiledPixmap(1, 11, 1, r.height()-12, *tabVLines); // left bitBlt(&buffer, 0, 3, tabEdges2, 0, 0, 8, 8); } else { // darker separator renderTabSeparator(&painter, QRect(0, 4, 1, r.height()), g.button(), true); // right painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 25)); painter.drawLine(0, 3, r.width()-9, 3); // topLine painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 35)); painter.drawLine(r.width()-1, 10, r.width()-1, r.height()-1); // right painter.drawLine(0, r.height()-1, r.width()-2, r.height()-1); // bottom painter.drawTiledPixmap(0, 4, r.width()-8, 2, *tabHLines); // top painter.drawTiledPixmap(r.width()-2, 11, 1, r.height()-12, *tabVLines); // right bitBlt(&buffer, r.width()-8, 3, tabEdges2, 8, 0, 8, 8); } } else { // middle renderTabSeparator(&painter, QRect(r.width()-1, 4, 1, r.height()), g.button(), true); // left renderTabSeparator(&painter, QRect(0, 4, 1, r.height()), g.button(), true); // right painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 25)); painter.drawLine(0, 3, r.width()-1, 3); // top painter.drawTiledPixmap(0, 4, r.width(), 2, *tabHLines); painter.setPen(alphaBlendColors(QColor(0,0,0), g.background(), 35)); painter.drawLine(0, r.height()-1, r.width()-1, r.height()-1); // bottom } } } p->drawPixmap(r.left(), r.top(), buffer); } } void DominoStyle::drawKStylePrimitive(KStylePrimitive kpe, QPainter *p, const QWidget* widget, const QRect &r, const QColorGroup &cg, SFlags flags, const QStyleOption& opt) const { //return KStyle::drawKStylePrimitive(kpe, p, widget, r, cg, flags, opt); // SLIDER // ------ switch( kpe ) { case KPE_SliderGroove: { bool horizontal = ((const QSlider*)widget)->orientation() == Horizontal; QRect re; if(horizontal) re.setRect(r.left(), r.y()+r.height()/2-3, r.width(), 4); else re.setRect(r.x()+r.width()/2-3, r.top(), 4, r.height()); bool parentBgPix = widget->parentWidget() ? widget->parentWidget()->paletteBackgroundPixmap() : 0; QString hori = horizontal ? "1" : "0"; QString trans = parentBgPix ? "1" : "0"; QPixmap* sliderGroove; if(!(sliderGroove = QPixmapCache::find(QString::number(cg.background().pixel(), 16)+"sliderGroove"+hori+trans))) { if(parentBgPix) { // ### the pix are transparent! if(!horizontal) { QWMatrix m; m.rotate(-90); sliderGroove = new QPixmap(qembed_findImage("slGHBody").xForm(m)); } else sliderGroove = new QPixmap(qembed_findImage("slGHBody")); } else { const QColor c1 = alphaBlendColors(QColor(0,0,0), cg.background(), 11); const QColor c2 = alphaBlendColors(QColor(53,53,53), cg.background(), 155); const QColor c3 = alphaBlendColors(QColor(67,67,67), cg.background(), 146); const QColor c4 = alphaBlendColors(QColor(83,83,83), cg.background(), 140); const QColor c5 = alphaBlendColors(QColor(101,101,101), cg.background(), 134); const QColor c6 = alphaBlendColors(QColor(254,254,254), cg.background(), 43); const QColor c7 = alphaBlendColors(QColor(255,255,255), cg.background(), 9); sliderGroove = new QPixmap(7, 7); QPainter painter(sliderGroove); QRect rr = sliderGroove->rect(); if (horizontal) { painter.setPen(c1); painter.drawLine(0, 0, 7, 0); painter.setPen(c2); painter.drawLine(0, 1, 7, 1); painter.setPen(c3); painter.drawLine(0, 2, 7, 2); painter.setPen(c4); painter.drawLine(0, 3, 7, 3); painter.setPen(c5); painter.drawLine(0, 4, 7, 4); painter.setPen(c6); painter.drawLine(0, 5, 7, 5); painter.setPen(c7); painter.drawLine(0, 6, 7, 6); } else { painter.setPen(c1); painter.drawLine(0, 0, 0, 7); painter.setPen(c2); painter.drawLine(1, 0, 1 , 7); painter.setPen(c3); painter.drawLine(2, 0, 2 , 7); painter.setPen(c4); painter.drawLine(3, 0, 3, 7); painter.setPen(c5); painter.drawLine(4, 0, 4, 7); painter.setPen(c6); painter.drawLine(5, 0, 5, 7); painter.setPen(c7); painter.drawLine(6, 0, 6, 7); } } QPixmapCache::insert(QString::number(cg.background().pixel(), 16)+"sliderGroove"+hori+trans, sliderGroove); } if (horizontal) { QPixmap* slGh; if(parentBgPix || !(slGh = QPixmapCache::find(QString::number(cg.background().pixel(), 16)+"slGh"))) { // rounded edges if(parentBgPix) slGh = new QPixmap(qembed_findImage("slGh")); else { slGh = new QPixmap(6, 7); slGh->fill(cg.background()); QPixmap pix = qembed_findImage("slGh"); bitBlt(slGh, 0, 0, &pix, 0, 0, -1, -1, Qt::CopyROP); } QPixmapCache::insert(QString::number(cg.background().pixel(), 16)+"slGh",slGh ); } bitBlt(p->device(), re.x(), re.y(), slGh, 0, 0, 3, 7, Qt::CopyROP); bitBlt(p->device(), r.width()-3, re.y(), slGh, 3, 0, 3, 7, Qt::CopyROP); p->drawTiledPixmap(re.x()+3, re.y(), r.width()-6, 7, *sliderGroove); } else { QPixmap* slGv; if(parentBgPix || !(slGv = QPixmapCache::find(QString::number(cg.background().pixel(), 16)+"slGv"))) { if(parentBgPix) slGv = new QPixmap(qembed_findImage("slGv")); else { slGv = new QPixmap(7, 6); slGv->fill(cg.background()); QPixmap pix = qembed_findImage("slGv"); bitBlt(slGv, 0, 0, &pix, 0, 0, -1, -1, Qt::CopyROP); } QPixmapCache::insert(QString::number(cg.background().pixel(), 16)+"slGv",slGv ); } bitBlt(p->device(), re.x(), re.y(), slGv, 0, 0, 7, 3, Qt::CopyROP); bitBlt(p->device(), re.x(), re.height()-3, slGv, 0, 3, 7, 3, Qt::CopyROP); p->drawTiledPixmap(re.x(), re.y()+3, 7, r.height()-6, *sliderGroove); } break; } case KPE_SliderHandle: { const QSlider* slider = (const QSlider*)widget; int y, x; if(slider->orientation() == Horizontal) { x = r.x(); y =r.y()+r.height()/2-8+1; } else { y = r.y()+1; x = r.x()+r.width()/2-8; } QPixmap* handle; if(!(handle = QPixmapCache::find("sliderHandle"+QString::number(cg.button().pixel(), 16)))) { QPixmap insidePix = qembed_findImage("sliderHandle2inside"); // a filled antialiased circle to draw the gradients on QPainter painter(&insidePix); flatMode=true; renderSurface(&painter, QRect(1, 0, 13, 15), cg.background(), cg.button(), cg.button(), Is_Button|Is_Horizontal); flatMode=false; QImage inside = insidePix.convertToImage(); QImage circle = tintImage(qembed_findImage("sliderHandle2circle"), _customSliderHandleContourColor ? buttonContour->contourColor(Contour_Default) : alphaBlendColors(black, cg.button(), 110)); QImage shadow = qembed_findImage("sliderHandle2shadow"); blend(shadow, inside, inside); blend(circle, inside, inside); handle = new QPixmap(inside); QPixmapCache::insert("sliderHandle"+QString::number(cg.button().pixel(), 16), handle ); } bitBlt(p->device(), x, y, handle, 0, 0, -1, -1, Qt::CopyROP); break; } case KPE_ListViewExpander: { QWidget* w = dynamic_cast(p->device()); p->setPen( cg.text() ); QColor bg = w ? w->paletteBackgroundColor() : cg.background(); QString hasBgPix = w && w->paletteBackgroundPixmap() ? "1" : "0"; QString expanded = flags & Style_Off ? "1" : "0"; QPixmap* lve; if(_drawTriangularExpander) { if(!(lve = QPixmapCache::find(QString::number(bg.pixel(), 16)+QString::number(cg.text().pixel(), 16)+"lveT"+hasBgPix+expanded))) { QWMatrix m; m.rotate(90); if(w && !w->paletteBackgroundPixmap()) { QImage img = tintImage(qembed_findImage("lveTriangular"), cg.text()); int w=7, h=9; if(flags & Style_Off) { w=9, h=7; img = img.xForm(m); } QImage imgBG(w,h,32); imgBG.fill(bg.rgb()); bitBlt(&imgBG, 0, 0, &img); lve = new QPixmap(imgBG); } else { if(flags & Style_Off) lve = new QPixmap(tintImage(qembed_findImage("lveTriangular").xForm(m), cg.text())); else lve = new QPixmap(tintImage(qembed_findImage("lveTriangular"), cg.text())); } QPixmapCache::insert(QString::number(bg.pixel(), 16)+QString::number(cg.text().pixel(), 16)+"lveT"+hasBgPix+expanded, lve); } p->drawPixmap(r.x(), r.y(), *lve); } else { if(!(lve = QPixmapCache::find(QString::number(bg.pixel(), 16)+QString::number(cg.text().pixel(), 16)+"lveC"+hasBgPix+expanded))) { if(w && !w->paletteBackgroundPixmap()) { lve = new QPixmap(11,11); lve->fill(bg); QPainter painter(lve); painter.drawPixmap(0, 0, tintImage(qembed_findImage("lve"), cg.text())); // plus or minus painter.drawLine( 3, 5, 7, 5 ); if ( flags & Style_On ) // Collapsed = On painter.drawLine( 5, 3, 5, 7 ); QPixmapCache::insert(QString::number(bg.pixel(), 16)+QString::number(cg.text().pixel(), 16)+"lveC"+hasBgPix+expanded, lve); } else { QImage img = QImage(11, 11, 32); img.setAlphaBuffer(true); for(int x=0; x < img.width(); ++x) { for(int y=0; y < img.height(); ++y) { img.setPixel(x, y, qRgba(0, 0, 0, 0)); } } QImage img2 = tintImage(qembed_findImage("lve"), cg.text()); bitBlt(&img, 0, 0, &img2); int r, b, g; int a = 255; cg.text().getRgb(&r, &g, &b); // minus img.setPixel(3, 5, qRgba(r, b, g, a)); img.setPixel(4, 5, qRgba(r, b, g, a)); img.setPixel(5, 5, qRgba(r, b, g, a)); img.setPixel(6, 5, qRgba(r, b, g, a)); img.setPixel(7, 5, qRgba(r, b, g, a)); if ( flags & Style_Off ) lve = new QPixmap(img); QPixmapCache::insert(QString::number(bg.pixel(), 16)+QString::number(cg.text().pixel(), 16)+"lveC"+hasBgPix+"1", new QPixmap(img)); // plus img.setPixel(5, 3, qRgba(r, b, g, a)); img.setPixel(5, 4, qRgba(r, b, g, a)); img.setPixel(5, 6, qRgba(r, b, g, a)); img.setPixel(5, 7, qRgba(r, b, g, a)); if ( flags & Style_On ) lve = new QPixmap(img); QPixmapCache::insert(QString::number(bg.pixel(), 16)+QString::number(cg.text().pixel(), 16)+"lveC"+hasBgPix+"0", new QPixmap(img)); } } p->drawPixmap(r.x()-1,r.y()-1, *lve); } break; } // copied and slightly modified from KStyle. case KPE_ListViewBranch: { if(_drawTriangularExpander) break; // Typical Windows style listview branch element (dotted line). // Create the dotline pixmaps if not already created if ( !verticalLine ) { // make 128*1 and 1*128 bitmaps that can be used for // drawing the right sort of lines. verticalLine = new QBitmap( 1, 129, true ); horizontalLine = new QBitmap( 128, 1, true ); QPointArray a( 64 ); QPainter p2; p2.begin( verticalLine ); int i; for( i=0; i < 64; i++ ) a.setPoint( i, 0, i*2+1 ); p2.setPen( color1 ); p2.drawPoints( a ); p2.end(); QApplication::flushX(); verticalLine->setMask( *verticalLine ); p2.begin( horizontalLine ); for( i=0; i < 64; i++ ) a.setPoint( i, i*2+1, 0 ); p2.setPen( color1 ); p2.drawPoints( a ); p2.end(); QApplication::flushX(); horizontalLine->setMask( *horizontalLine ); } p->setPen( cg.mid() ); if (flags & Style_Horizontal) { int point = r.x(); int other = r.y(); int end = r.x()+r.width(); int thickness = r.height(); while( point < end ) { int i = 128; if ( i+point > end ) i = end-point; p->drawPixmap( point, other, *horizontalLine, 0, 0, i, thickness ); point += i; } } else { int point = r.y(); int other = r.x(); int end = r.y()+r.height(); int thickness = r.width(); int pixmapoffset = (flags & Style_NoChange) ? 0 : 1; // ### Hackish while( point < end ) { int i = 128; if ( i+point > end ) i = end-point; p->drawPixmap( other, point, *verticalLine, 0, pixmapoffset, thickness, i ); point += i; } } break; } default: KStyle::drawKStylePrimitive(kpe, p, widget, r, cg, flags, opt); } } void DominoStyle::drawPrimitive(PrimitiveElement pe, QPainter *p, const QRect &r, const QColorGroup &cg, SFlags flags, const QStyleOption &opt ) const { bool down = flags & Style_Down; bool on = flags & Style_On; bool sunken = flags & Style_Sunken; bool horiz = flags & Style_Horizontal; const bool enabled = flags & Style_Enabled; const bool mouseOver = flags & Style_MouseOver; // bool hasFocus = flags & Style_HasFocus; int x = r.x(); int y = r.y(); int w = r.width(); int h = r.height(); //return KStyle::drawPrimitive(pe, p, r, cg, flags, opt); switch(pe) { case PE_FocusRect: { if(rubberBandType == DistRubber || (rubberBandType == ArgbRubber && !compositeManagerRunning)) { p->drawWinFocusRect( r ); break; } QWidget* w = dynamic_cast(p->device()); if(rubberBandType == ArgbRubber && compositeManagerRunning && viewPortPressed && dynamic_cast(w->parentWidget())) { QListView* lv = dynamic_cast(w->parentWidget()); if(!lv->currentItem()) break; QRect sr = lv->itemRect(lv->currentItem()); QRect rr = r.normalize(); int step = lv->rootIsDecorated() ? (lv->currentItem()->depth()+1)*lv->treeStepSize() : lv->currentItem()->depth()*lv->treeStepSize(); if(dynamic_cast(lv->currentItem())) step += 16+lv->itemMargin()+4; // why is the focusrect misused as a rubberband!? if((lv->selectionMode() == QListView::Multi || lv->selectionMode() == QListView::Extended) && !((sr.y() == rr.y()) && (sr.height() == rr.height()) && (sr.x()+step == rr.x()))) { QScrollView* sv = static_cast(w); QPoint po = w->mapFrom(sv, r.topLeft()); QRect re = QRect(po.x(), po.y(), r.width(), r.height()); drawPrimitive(PE_RubberBand, p, r, cg, flags, opt); break; } } if(ignoreNextFocusRect) { ignoreNextFocusRect= false; break; } QColor color = alphaBlendColors(cg.highlight(), cg.foreground(), 160); if(w && (w->isA("QViewportWidget") || dynamic_cast(p->device())->isA("RegionGrabber"))) { // QListView, QListBox, KSnapshot... // we can't be sure if the pixamp edges will be erased, so only a simple rect. p->setPen(QPen(color, 1, Qt::SolidLine)); p->drawRect(r); break; } QPixmap* edges; if(!(edges = QPixmapCache::find("fre"+QString::number(color.pixel(), 16)))) { edges = new QPixmap(tintImage(qembed_findImage("focusRectEdges"), color)); QPixmapCache::insert("fre"+QString::number(color.pixel(), 16), edges); } p->drawPixmap(r.left(), r.top(), *edges, 0, 0, 3, 3); p->drawPixmap(r.left(), r.bottom()-2, *edges, 0, 3, 3, 3); p->drawPixmap(r.right()-2, r.top(), *edges, 3, 0, 3, 3); p->drawPixmap(r.right()-2, r.bottom()-2, *edges, 3, 3, 3, 3); p->setPen(color); p->drawLine(r.left()+3, r.top(), r.right()-2, r.y()); p->drawLine(r.left()+3, r.bottom(), r.right()-2, r.bottom()); p->drawLine(r.left(), r.top()+3, r.left(), r.bottom()-2); p->drawLine(r.right(), r.top()+3, r.right(), r.bottom()-2); break; } case PE_HeaderSection: { // also taskbar buttons if(dynamic_cast(p->device()) && dynamic_cast(p->device())->isA("PanelKMenu")) { QWidget* w = dynamic_cast(p->device()); if(w->parentWidget() && w->parentWidget()->paletteBackgroundPixmap()) { QPixmap pix(w->width(), w->height()); QPainter painter(&pix); QPoint point = QPoint(w->geometry().x(), w->geometry().y()); painter.drawTiledPixmap( 0, 0, w->width(), w->height(), *w->parentWidget()->backgroundPixmap(), point.x(), point.y() ); // if the PopupTitle is hovered by the mouse, we don't have access to the parent background pixmap, // so it must have have its own one. w->setUpdatesEnabled(false); w->setErasePixmap(pix); w->setUpdatesEnabled(true); w->erase(); } else w->erase(r); break; } renderHeader(p, r, cg, (on||down||sunken), mouseOver, true, enabled ); break; } // BUTTONS // ------- case PE_ButtonTool: case PE_ButtonDropDown: case PE_ButtonBevel: case PE_ButtonCommand: { // the above promitives are not called from within the style if(dynamic_cast(p->device())) // more likely a backgroundPixmap than a doublebuffer buttonContour->setAlphaMode(); renderButton(p, r, cg, (on||down), mouseOver, true, enabled, khtmlWidgets.contains(opt.widget()) ); buttonContour->reset(); break; } case PE_ButtonDefault: { break; } case PE_SpinWidgetPlus: case PE_SpinWidgetMinus: { p->setPen( cg.buttonText() ); int l = QMIN( w-2, h-2 ); // make the length even so that we get a nice symmetric plus... if(l%2 != 0) --l; QPoint c = r.center(); p->drawLine( c.x()-l/2, c.y(), c.x()+l/2, c.y() ); if ( pe == PE_SpinWidgetPlus ) { p->drawLine( c.x(), c.y()-l/2, c.x(), c.y()+l/2 ); } break; } case PE_ScrollBarSlider: { QColor buttonColor = cg.button(); QPixmap buffer; if(horiz) buffer.resize(r.width()-14, r.height()); else buffer.resize(r.width(), r.height()-14); if(buffer.isNull()) break; QRect br = buffer.rect(); QPainter painter(&buffer); if(horiz) { uint surfaceFlags = Is_ScrollBarBtn|Is_Horizontal; renderSurface(&painter, br, cg.button(), cg.button(), buttonColor, surfaceFlags); uint contourFlags = Is_ScrollBarBtn|Is_Horizontal|Draw_Top|Draw_Bottom; renderContour(&painter, QRect(-2, 0, br.width()+4, br.height()), cg.button(), buttonColor, contourFlags); p->drawPixmap(r.left()+7, r.y(), buffer); } else { uint surfaceFlags = Is_ScrollBarBtn; renderSurface(&painter, br, cg.button(), cg.button(), buttonColor, surfaceFlags); uint contourFlags = Is_ScrollBarBtn|Draw_Left|Draw_Right; renderContour(&painter, QRect(0, -2, br.width(), br.height()+4), cg.button(), buttonColor, contourFlags); bitBlt(p->device(), r.x(), r.y()+7, &buffer, 0, 0, -1, -1, Qt::CopyROP); } break; } case PE_ScrollBarAddPage: { // bottom / right QColor buttonColor = cg.button(); QColor contourColor = alphaBlendColors(buttonContour->contourColor(Contour_Default), buttonColor, 203); QPixmap* addPageBtn; QPixmap buffer; uint surfaceFlags = Is_ScrollBarBtn; if(horiz) surfaceFlags |= Is_Horizontal; int sl = 6; if(sliderlen < 14) sl = sliderlen/2-1; //// button part if(horiz) { buffer.resize(r.width()+sl, r.height()); if(buffer.isNull()) break; if(!(addPageBtn = QPixmapCache::find(QString::number(buttonColor.pixel(), 16)+"ah"+configMode ))) { QPixmap gradientPix = qembed_findImage("scrollBtnHMask"); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), buttonColor, buttonColor, buttonColor, surfaceFlags); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollBtnHShadow"); QImage img3 = tintImage(qembed_findImage("scrollBtnHContour"), contourColor); blend(img2, img1, img1); blend(img3, img1, img1); addPageBtn = new QPixmap(img1); QPixmapCache::insert(QString::number(buttonColor.pixel(), 16)+"ah"+configMode, addPageBtn); } } else { buffer.resize(r.width(), r.height()+sl); if(buffer.isNull()) break; if(!(addPageBtn = QPixmapCache::find(QString::number(buttonColor.pixel(), 16)+"av"+configMode ))) { QPixmap gradientPix = qembed_findImage("scrollBtnVMask"); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), buttonColor, buttonColor, buttonColor, surfaceFlags); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollBtnVShadow"); QImage img3 = tintImage(qembed_findImage("scrollBtnVContour"), contourColor); blend(img2, img1, img1); blend(img3, img1, img1); addPageBtn = new QPixmap(img1); QPixmapCache::insert(QString::number(buttonColor.pixel(), 16)+"av"+configMode, addPageBtn); } } QRect br(buffer.rect() ); QPainter bp(&buffer); //// groove if(sliderlen >= 10) { surfaceFlags = Is_ScrollBarGroove; if(horiz) surfaceFlags |= Is_Horizontal; QColor grooveLine = alphaBlendColors(black, buttonColor, 80); renderSurface(&bp, QRect(0, 0, br.width(), br.height()), grooveLine, grooveLine, grooveLine, surfaceFlags); bp.setClipRegion(horiz ? QRect(0, 1, br.width(), br.height()-2) : QRect(1, 0, br.width()-2, br.height())); renderSurface(&bp, QRect(0, 0, br.width(), br.height()), buttonColor, buttonColor, buttonColor, surfaceFlags); bp.setClipping(false); } else { renderSurface(&bp, QRect(0, 0, br.width(), br.height()), buttonColor, buttonColor, buttonColor, surfaceFlags); uint contourFlags = Is_ScrollBarBtn; contourFlags |= (horiz)? Draw_Top|Draw_Bottom : Draw_Left|Draw_Right; renderContour(&bp, horiz?QRect(-2, 0, br.width()+4, br.height()):QRect(0, -2, br.width(), br.height()+4), buttonColor, buttonColor, contourFlags); } QString docked = (!horiz && r.height() == 1) || (horiz && r.width() == 1) ? "1" : "0"; QPixmap* sliderCap; if(horiz) { if(!(sliderCap = QPixmapCache::find("sHCap"+QString::number(buttonColor.pixel(), 16)+docked+configMode))) { if(r.width() == 1) { QPixmap gradientPix(16, 15); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn|Is_Horizontal); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollSliderHDockedShadow"); QImage img3 = tintImage(qembed_findImage("scrollSliderHDockedContour"), contourColor); bitBlt(&img1, 0, 0, &img2); bitBlt(&img1, 0, 0, &img3); sliderCap = new QPixmap(img1); } else { QPixmap gradientPix = qembed_findImage("scrollSliderHMask"); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn|Is_Horizontal); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollSliderHShadow"); QImage img3 = tintImage(qembed_findImage("scrollSliderHContour"), contourColor); blend(img2, img1, img1); blend(img3, img1, img1); sliderCap = new QPixmap(img1); } QPixmapCache::insert("sHCap"+QString::number(buttonColor.pixel(), 16)+docked+configMode, sliderCap); } } else { if(!(sliderCap = QPixmapCache::find("sVCap"+QString::number(buttonColor.pixel(), 16)+docked+configMode))) { if(r.height() == 1) { QPixmap gradientPix(15, 16); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollSliderVDockedShadow"); QImage img3 = tintImage(qembed_findImage("scrollSliderVDockedContour"), contourColor); bitBlt(&img1, 0, 0, &img2); bitBlt(&img1, 0, 0, &img3); sliderCap = new QPixmap(img1); } else { QPixmap gradientPix = qembed_findImage("scrollSliderVMask"); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollSliderVShadow"); QImage img3 = tintImage(qembed_findImage("scrollSliderVContour"), contourColor); blend(img2, img1, img1); blend(img3, img1, img1); sliderCap = new QPixmap(img1); } QPixmapCache::insert("sVCap"+QString::number(buttonColor.pixel(), 16)+docked+configMode, sliderCap); } } //////////// if(horiz) { if(sliderlen >= 10) { bp.drawPixmap(br.right()-8, 0, *addPageBtn, 9, 0, 9, 15); bp.drawPixmap(-6+sl, 0, *sliderCap, 8, 0, 8, 15); } bitBlt(p->device(), r.x()-sl, r.y(), &buffer, 0, 0, br.width(), br.height(), Qt::CopyROP); } else { if(sliderlen >= 10) { bp.drawPixmap(0, br.bottom()-8, *addPageBtn, 0, 9, 15, 9); bp.drawPixmap(0, (br.height() <= 6)? br.bottom()-6 :br.top(), *sliderCap, 0, 8, 15, 8); } bitBlt(p->device(), r.x(), r.y()-sl, &buffer, 0, 0, br.width(), br.height(), Qt::CopyROP); } break; } case PE_ScrollBarSubPage: { // top / left QColor buttonColor = cg.button(); QColor contourColor = alphaBlendColors(buttonContour->contourColor(Contour_Default), buttonColor, 203); QPixmap* subPageBtn; QPixmap buffer; uint surfaceFlags = Is_ScrollBarBtn; if(horiz) surfaceFlags |= Is_Horizontal; int sl = 6; if(sliderlen < 14) sl = sliderlen/2; //// button part if(horiz) { buffer.resize(r.width()+sl, r.height()); if(buffer.isNull()) break; if(!(subPageBtn = QPixmapCache::find(QString::number(buttonColor.pixel(), 16)+"sh"+configMode ))) { QPixmap gradientPix = qembed_findImage("scrollBtnHMask"); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), buttonColor, buttonColor, buttonColor, surfaceFlags); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollBtnHShadow"); QImage img3 = tintImage(qembed_findImage("scrollBtnHContour"), contourColor); blend(img2, img1, img1); blend(img3, img1, img1); subPageBtn = new QPixmap(img1); QPixmapCache::insert(QString::number(buttonColor.pixel(), 16)+"sh"+configMode, subPageBtn); } } else { buffer.resize(r.width(), r.height()+sl); if(buffer.isNull()) break; if(!(subPageBtn = QPixmapCache::find(QString::number(buttonColor.pixel(), 16)+"sv"+configMode ))) { QPixmap gradientPix = qembed_findImage("scrollBtnVMask"); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), buttonColor, buttonColor, buttonColor, surfaceFlags); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollBtnVShadow"); QImage img3 = tintImage(qembed_findImage("scrollBtnVContour"), contourColor); blend(img2, img1, img1); blend(img3, img1, img1); subPageBtn = new QPixmap(img1); QPixmapCache::insert(QString::number(buttonColor.pixel(), 16)+"sv"+configMode, subPageBtn); } } QRect br(buffer.rect()); QPainter bp(&buffer); //// groove if(sliderlen >= 10) { surfaceFlags = Is_ScrollBarGroove; if(horiz) surfaceFlags |= Is_Horizontal; QColor grooveLine = alphaBlendColors(black, buttonColor, 80); renderSurface(&bp, QRect(0, 0, br.width(), br.height()), grooveLine, grooveLine, grooveLine, surfaceFlags); bp.setClipRegion(horiz ? QRect(0, 1, br.width(), br.height()-2) : QRect(1, 0, br.width()-2, br.height())); renderSurface(&bp, QRect(0, 0, br.width(), br.height()), buttonColor, buttonColor, buttonColor, surfaceFlags); bp.setClipping(false); } else { renderSurface(&bp, QRect(0, 0, br.width(), br.height()), buttonColor, buttonColor, buttonColor, surfaceFlags); uint contourFlags = Is_ScrollBarBtn; contourFlags |= (horiz)? Draw_Top|Draw_Bottom : Draw_Left|Draw_Right; renderContour(&bp, horiz?QRect(-2, 0, br.width()+4, br.height()):QRect(0, -2, br.width(), br.height()+4), buttonColor, buttonColor, contourFlags); } QString docked = (!horiz && r.bottom() == 15) || (horiz && r.right() == 15) ? "1" : "0"; QPixmap* sliderCap; if(horiz) { if(!(sliderCap = QPixmapCache::find("sHCap"+QString::number(buttonColor.pixel(), 16)+docked+configMode))) { if(r.right() == 15) { QPixmap gradientPix(16, 15); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn|Is_Horizontal); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollSliderHDockedShadow"); QImage img3 = tintImage(qembed_findImage("scrollSliderHDockedContour"), contourColor); bitBlt(&img1, 0, 0, &img2); bitBlt(&img1, 0, 0, &img3); sliderCap = new QPixmap(img1); } else { QPixmap gradientPix = qembed_findImage("scrollSliderHMask"); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn|Is_Horizontal); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollSliderHShadow"); QImage img3 = tintImage(qembed_findImage("scrollSliderHContour"), contourColor); blend(img2, img1, img1); blend(img3, img1, img1); sliderCap = new QPixmap(img1); } QPixmapCache::insert("sHCap"+QString::number(buttonColor.pixel(), 16)+docked+configMode, sliderCap); } } else { if(!(sliderCap = QPixmapCache::find("sVCap"+QString::number(buttonColor.pixel(), 16)+docked+configMode))) { if(r.bottom() == 15) { QPixmap gradientPix(15, 16); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollSliderVDockedShadow"); QImage img3 = tintImage(qembed_findImage("scrollSliderVDockedContour"), contourColor); bitBlt(&img1, 0, 0, &img2); bitBlt(&img1, 0, 0, &img3); sliderCap = new QPixmap(img1); } else { QPixmap gradientPix = qembed_findImage("scrollSliderVMask"); QPainter painter(&gradientPix); renderSurface(&painter, QRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn); QImage img1 = gradientPix.convertToImage(); QImage img2 = qembed_findImage("scrollSliderVShadow"); QImage img3 = tintImage(qembed_findImage("scrollSliderVContour"), contourColor); blend(img2, img1, img1); blend(img3, img1, img1); sliderCap = new QPixmap(img1); } QPixmapCache::insert("sVCap"+QString::number(buttonColor.pixel(), 16)+docked+configMode, sliderCap); } } if(horiz) { if(sliderlen >= 10) { bp.drawPixmap(0, 0, *subPageBtn, 0, 0, 9, 15); bp.drawPixmap((br.width() <= 6)? -2 : br.width()-8, 0, *sliderCap, 0, 0, 8, 15); } } else { if(sliderlen >= 10) { bp.drawPixmap(0, 0, *subPageBtn, 0, 0, 15, 9); bp.drawPixmap(0, br.bottom()-sl-2+1, *sliderCap, 0, 0, 15, 8); } } bitBlt(p->device(), r.x(), r.y(), &buffer, 0, 0, br.width(), br.height(), Qt::CopyROP); break; } // SCROLLBAR BUTTONS // ----------------- case PE_ScrollBarSubLine: { // top / left button uint contourFlags = Is_ScrollBarBtn; QRect cr = r; QRect ar = r; QRect sr = r; if(horiz) { contourFlags |= Is_Horizontal|Draw_Top|Draw_Bottom; if(r.x() == 0) { // = single Button sr.setX(2); sr.setWidth(13); ar.setX(3); contourFlags |= Draw_Left|Round_BottomLeft|Round_UpperLeft; } else { cr.setWidth(17); cr.setX(cr.x()-2); } } else { ar.setX(1); contourFlags |= Draw_Left|Draw_Right; if(r.y() == 0) { sr.setY(2); sr.setHeight(13); ar.setY(3); contourFlags |= Draw_Top|Round_UpperLeft|Round_UpperRight; } else { cr.setHeight(17); cr.setY(cr.y()-2); } } if(horiz) { renderSurface(p, QRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn|Is_Horizontal); renderContour(p, QRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags); } else { p->setClipRegion(QRect(sr.x()+2, sr.y(), sr.width()-4, sr.height())); renderSurface(p, QRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn); p->setClipping(false); renderContour(p, QRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags); } QColor color = dynamic_cast(p->device()) ? dynamic_cast(p->device())->palette().active().buttonText() : cg.buttonText(); p->setPen(color); drawPrimitive((horiz ? PE_ArrowLeft : PE_ArrowUp), p, ar, cg, flags); break; } case PE_ScrollBarAddLine: { // bottom / right button QRect cr = r; QRect ar = r; QRect sr = r; if(horiz) { sr.setWidth(13); ar.setX(r.x()-4); } else { sr.setHeight(13); ar.setY(r.y()-2); ar.setX(r.x()+1); } if(horiz) { uint contourFlags = Is_ScrollBarBtn|Is_Horizontal|Draw_Top|Draw_Bottom|Draw_Right|Round_UpperRight|Round_BottomRight; renderSurface(p, QRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn|Is_Horizontal); renderContour(p, QRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags); } else { p->setClipRegion(QRect(sr.x()+2, sr.y(), sr.width()-4, sr.height())); renderSurface(p, QRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn); p->setClipping(false); uint contourFlags = Is_ScrollBarBtn|Draw_Bottom|Draw_Left|Draw_Right|Round_BottomLeft|Round_BottomRight; renderContour(p, QRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags); } QColor color = dynamic_cast(p->device()) ? dynamic_cast(p->device())->palette().active().buttonText() : cg.buttonText(); p->setPen(color); drawPrimitive((horiz ? PE_ArrowRight : PE_ArrowDown), p, ar, cg, flags); break; } case PE_ScrollBarSubLine2: { // second top / left button // ### remove uint contourFlags = Is_ScrollBarBtn; QRect cr = r; QRect ar = r; QRect sr = r; if(horiz) { contourFlags |= Is_Horizontal|Draw_Top|Draw_Bottom; } else { ar.setX(1); contourFlags |= Draw_Left|Draw_Right; } if(horiz) { renderSurface(p, QRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn|Is_Horizontal); renderContour(p, QRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags); } else { p->setClipRegion(QRect(sr.x()+2, sr.y(), sr.width()-4, sr.height())); renderSurface(p, QRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn); p->setClipping(false); renderContour(p, QRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags); } QColor color = dynamic_cast(p->device()) ? dynamic_cast(p->device())->palette().active().buttonText() : cg.buttonText(); p->setPen(color); drawPrimitive((horiz ? PE_ArrowLeft : PE_ArrowUp), p, ar, cg, flags); break; } // CHECKBOXES // ---------- case PE_Indicator: { break; } case PE_IndicatorMask: { p->fillRect (r.x()+3, r.y()+3, r.width()-6, r.height()-7, color1); break; } // RADIOBUTTONS // ------------ case PE_ExclusiveIndicator: { break; } case PE_ExclusiveIndicatorMask: { QPointArray pa(8); pa.setPoint(0, 3,6); pa.setPoint(1, 6,3); pa.setPoint(2, 10,3); pa.setPoint(3, 13,6); pa.setPoint(4, 13,10); pa.setPoint(5, 10,13); pa.setPoint(6, 6,13); pa.setPoint(7, 3,10); p->setBrush(color1); p->setPen(color1); p->drawPolygon(pa); break; } // GENERAL PANELS // -------------- case PE_Splitter: { p->fillRect(r, cg.background()); int ch, cs, cv; cg.background().getHsv(ch, cs, cv); if(cv < 100) p->setPen(alphaBlendColors(cg.background(), white, 120)); else p->setPen(alphaBlendColors(cg.background(), black, 180)); p->setPen(dGetColor(cg.background(), 55)); if (w > h) { int ycenter = r.height()/2; for(int k =r.width()/2-5; k < r.width()/2+5; k+=3) { p->drawRect(k, ycenter-1, 2,2); } } else { int xcenter = r.width()/2; for(int k =r.height()/2-5; k < r.height()/2+5; k+=3) { p->drawRect( xcenter-1, k, 2,2); } } break; } case PE_GroupBoxFrame: case PE_PanelGroupBox: { // QFrame::GroupBoxPanel break; } case PE_WindowFrame: { if ( opt.isDefault() || opt.lineWidth() <= 0 ) break; p->setPen(cg.background().dark(120)); p->drawRect(r); p->setPen(cg.background().light(110)); p->drawRect(QRect(r.x()+1, r.y()+1, r.width()-2, r.height()-2)); break; } case PE_Panel: { // QFrame::StyledPanel if(kickerMode) break; p->save(); // inside rect p->setPen(cg.background().dark(120)); p->drawLine(r.x()+1, r.y()+1, r.right()-1, r.y()+1); //top p->drawLine(r.x()+1, r.bottom()-1, r.right()-1, r.bottom()-1); p->drawLine(r.x()+1, r.y()+1, r.x()+1, r.bottom()-1); p->drawLine(r.right()-1, r.y()+1, r.right()-1, r.bottom()-1); // outside rect p->setPen(cg.background()); p->drawLine(r.x(), r.y(), r.right(), r.y()); //top p->setPen(alphaBlendColors(white, cg.background(), 30)); p->drawLine(r.x(), r.y()+1, r.x(), r.bottom()); p->drawLine(r.right(), r.y()+1, r.right(), r.bottom()); p->setPen(alphaBlendColors(white, cg.background(), 50)); p->drawLine(r.x()+1, r.bottom(), r.right()-1, r.bottom()); p->restore(); // maybe we are a KArrowButton and need to draw the arrow break; } case PE_PanelLineEdit: { // QFrame::LineEditPanel break; } case PE_PanelTabWidget: { // QFrame::TabWidgetPanel // we get a wrong clip rect p->setClipping(false); bool roundTopLeft = true; bool roundTopRight = true; bool roundBottomLeft = true; bool roundBottomRight = true; bool tabsAbove = true; // p->fillRect(QRect(r.x()-10, r.y()-10, r.width()+20, r.height()+20), yellow); QRect tr; QWidget* w = dynamic_cast(p->device()); QTabWidget* tw = w ? dynamic_cast(w->parentWidget()) : 0; bool tabBarHidden = tw && !((DominoQTabWidget*)tw)->tabBar()->isVisible(); if(tw && !tabBarHidden) { tabsAbove = tw->tabPosition() == QTabWidget::Top; if(tw->count() != 0) { QTabBar* tb = ((DominoQTabWidget*)tw)->tabBar(); QRect gr = tb->geometry(); if(tb->isVisible()) { tr = tb->tabAt(tw->currentPageIndex())->rect(); tr.setHeight(3); tr.moveBy(gr.x(), tabsAbove ? 0 : r.height()-2); } if(!tw->cornerWidget(Qt::TopLeft) && gr.x() < 7) { if(tabsAbove) roundTopLeft = false; else roundBottomLeft = false; } if(!tw->cornerWidget(Qt::TopRight) && gr.x()+gr.width() > tw->width()-7) { if(tabsAbove) roundTopRight = false; else roundBottomRight = false; } } } QBrush background = tw ? tw->colorGroup().brush(QColorGroup::Background) : cg.brush(QColorGroup::Background); QColor bottomGradient = alphaBlendColors(QColor(0,0,0), cg.background(), 11); QColor topGradient = alphaBlendColors(QColor(255,255,255), cg.background(), 15); QColor tabContour2 = cg.background().dark(150); QString tabPos = tabsAbove ? "1" : "0"; QPixmap* tabWEdges; if(!(tabWEdges = QPixmapCache::find("tabWEdges"+tabPos+QString::number(background.color().pixel(), 16)+QString::number(cg.background().pixel(), 16)))) { tabWEdges = new QPixmap(16,16); QPainter painter(tabWEdges); painter.fillRect(tabWEdges->rect(), background); painter.end(); QPixmap tabWEdgesMask = qembed_findImage("groupBoxMask"); painter.begin(&tabWEdgesMask); painter.fillRect(tabWEdgesMask.rect(), cg.brush(QColorGroup::Background)); painter.end(); bitBlt(tabWEdges, 0, 0, &tabWEdgesMask); QPixmap circle = qembed_findImage("tabWidget"); bitBlt(tabWEdges, 0, 0, &circle); QPixmapCache::insert("tabWEdges"+tabPos+QString::number(background.color().pixel(), 16)+QString::number(cg.background().pixel(), 16), tabWEdges); } QRect re = QRect(r.x(), r.y(), r.width(), r.height()+1); QColor bg = cg.background(); QColor bg2 = background.color(); // parent color // top QColor c1 = alphaBlendColors(QColor(0,0,0), bg2, 25); QColor c2 = alphaBlendColors(QColor(255,255,255), bg, 70); QColor c3 = alphaBlendColors(QColor(255,255,255), bg, 30); // left + right QColor c4 = alphaBlendColors(QColor(0,0,0), bg2, 40); // QColor c5 = alphaBlendColors(QColor(255,255,255), bg, 30); QColor c6 = alphaBlendColors(QColor(255,255,255), bg, 4); // bottom QColor c7 = alphaBlendColors(QColor(249,249,249), bg, 25); QColor c8 = alphaBlendColors(QColor(0,0,0), bg2, 79); QColor c9 = alphaBlendColors(QColor(0,0,0), bg2, 30); // top p->setPen(c1); p->drawLine(re.left(), re.y(), re.right(), re.y()); p->setPen(c2); p->drawLine(re.left(), re.y()+1, re.right(), re.y()+1); p->setPen(c3); p->drawLine(re.left(), re.y()+2, re.right(), re.y()+2); // bottom p->setPen(c7); p->drawLine(re.left()+1, re.bottom()-2, re.right(), re.bottom()-2); p->setPen(c8); p->drawLine(re.left()+1, re.bottom()-1, re.right(), re.bottom()-1); p->setPen(c9); p->drawLine(re.left(), re.bottom(), re.right(), re.bottom()); // left p->setPen(c4); p->drawLine(re.left(), re.y()+1, re.left(), re.bottom()-1); p->setPen(c3); p->drawLine(re.left()+1, re.y()+2, re.left()+1, re.bottom()-2); p->setPen(c6); p->drawLine(re.left()+2, re.y()+3, re.left()+2, re.bottom()-3); // right p->drawLine(re.right()-2, re.y()+3, re.right()-2, re.bottom()-3); p->setPen(c3); p->drawLine(re.right()-1, re.y()+2, re.right()-1, re.bottom()-2); p->setPen(c4); p->drawLine(re.right(), re.y()+1, re.right(), re.bottom()-1); // unpainted area p->setPen(bg); p->drawLine(re.left()+3, re.y()+3, re.right()-3, re.y()+3); p->drawLine(re.left()+3, re.bottom()-4, re.right()-3, re.bottom()-4); p->drawLine(re.left()+3, re.bottom()-3, re.right()-3, re.bottom()-3); p->drawLine(re.left()+3, re.y()+3, re.left()+3, re.bottom()-4); p->drawLine(re.right()-3, re.y()+3, re.right()-3, re.bottom()-4); if(roundTopLeft) { bitBlt(p->device(), re.x(), re.y(), tabWEdges, 0, 0, 8, 8, Qt::CopyROP); } if(roundTopRight) { bitBlt(p->device(), re.width()-8, re.y(), tabWEdges, 8, 0, 8, 8, Qt::CopyROP); } if(roundBottomLeft) { bitBlt(p->device(), re.x(), re.height()-8, tabWEdges, 0, 8, 8, 8, Qt::CopyROP); } if(roundBottomRight) { bitBlt(p->device(), re.width()-8, re.height()-8, tabWEdges, 8, 8, 8, 8, Qt::CopyROP); } // paint over the frame to not disturb the transition from the tabWidget to the current tab if(tr.isValid()) { p->fillRect(tr, cg.background()); // ### shrink if(tabsAbove) { QColor p1 = alphaBlendColors(QColor(255,255,255), bg, 50); QColor p2 = alphaBlendColors(QColor(255,255,255), bg, 25); QColor p3 = alphaBlendColors(QColor(255,255,255), bg, 10); p->setPen(p1); p->drawPoint(tr.left(), tr.top()+1); p->drawPoint(tr.right(), tr.top()+1); p->setPen(p2); p->drawPoint(tr.left()+1, tr.top()+1); p->drawPoint(tr.left(), tr.top()+2); p->drawPoint(tr.right()-1, tr.top()+1); p->drawPoint(tr.right(), tr.top()+2); p->setPen(p3); p->drawPoint(tr.left()+1, tr.top()+2); p->drawPoint(tr.right()-1, tr.top()+2); } else { QColor p1 = alphaBlendColors(QColor(255,255,255), bg, 17); QColor p2 = alphaBlendColors(QColor(255,255,255), bg, 10); p->setPen(p1); p->drawPoint(tr.left(), tr.top()); p->drawPoint(tr.right(), tr.top()); p->setPen(p2); p->drawPoint(tr.left()+1, tr.top()); p->drawPoint(tr.right()-1, tr.top()); } } break; } case PE_PanelPopup: { // QFrame::PopupPanel QPopupMenu* pm = dynamic_cast(p->device()); QColor background = dynamic_cast(p->device()) ? cg.base() : _customPopupMenuColor ? _popupMenuColor : cg.background(); QRegion mask(x, y+5, w, h-10); mask += QRegion(x+5, y, w-10, h); mask += QRegion(x+1, y+2, w-2, h-4); mask += QRegion(x+2, y+1, w-4, h-2); if(_drawPopupMenuGradient) { QPixmap buffer(r.width(), r.height()); QPainter bp(&buffer); renderGradient(&bp, r, lightenColor(background, 18), darkenColor(background, 12), true); if(pm) { pm->setUpdatesEnabled(false); pm->setPaletteBackgroundPixmap(buffer); pm->setUpdatesEnabled(true); } else { p->setClipRegion(mask); p->drawPixmap(r, buffer); p->setClipping(false); } } else { if(pm) { pm->setUpdatesEnabled(false); pm->setPaletteBackgroundColor(background); pm->setUpdatesEnabled(true); } } if(pm) { if(pm->isA("PrettyPopupMenu") || pm->isA("Amarok::Menu") || pm->isA("Digikam::DPopupMenu")) { // these popups have a side pixmap and are drawing the frame after the contents QRect cr = pm->contentsRect(); if(QApplication::reverseLayout()) pm->erase(mask-QRegion(cr.width()+3, cr.y(), r.width()-cr.width()-6, cr.height()-1)); else pm->erase(mask-QRegion(r.x()+3, cr.y(), r.width()-cr.width()-6, cr.height()-1)); ((DominoQFrame*)pm)->drawContents(p ); } else pm->erase(mask); } bitBlt(p->device(), r.x(), r.y(), popupFrame, 0, 0, 5, 5, Qt::CopyROP); bitBlt(p->device(), r.width()-5, r.y(), popupFrame, 5, 0, 5, 5, Qt::CopyROP); bitBlt(p->device(), r.x(), r.bottom()-4, popupFrame, 0, 5, 5, 5, Qt::CopyROP); bitBlt(p->device(), r.width()-5, r.bottom()-4, popupFrame, 5, 5, 5, 5, Qt::CopyROP); p->setPen(background.dark(150)); p->drawLine(r.x()+5, r.y(), r.width()-6, r.y()); p->drawLine(r.x()+5, r.bottom(), r.width()-6, r.bottom()); p->drawLine(r.x(), r.y()+5, r.x(), r.bottom()-5); p->drawLine(r.width()-1, r.y()+5, r.width()-1, r.bottom()-5); break; } // MENU / TOOLBAR PANEL // -------------------- case PE_PanelMenuBar: // QFrame::MenuBarPanel case PE_PanelDockWindow: { // QFrame::ToolBarPanel p->setPen(cg.background()); // overpainting the menus leads to flicker so we draw only the frame here. if(dynamic_cast(p->device())) p->drawRect(r); else p->fillRect(r, cg.brush(QColorGroup::Background)); // colorpreview in kcontrol break; } case PE_StatusBarSection: { break; } case PE_TabBarBase: { break; } // TOOLBAR/DOCK WINDOW HANDLE // -------------------------- case PE_DockWindowResizeHandle: { QWidget* w = dynamic_cast(p->device()); // QDockWindowResizeHandle if(w && !w->erasePixmap()) { QPixmap pix(r.size()); QPainter painter(&pix); renderGradient(&painter, r, lightenColor(cg.background(), 40), darkenColor(cg.background(), 30), horiz); w->setErasePixmap(pix); } break; } case PE_DockWindowHandle: { QWidget* widget = dynamic_cast(p->device()); // qt_dockwidget_internal - QDockWindowHandle int ch, cs, cv; cg.background().getHsv(ch, cs, cv); if(cv < 100) p->setPen(alphaBlendColors(cg.background(), white, 120)); else p->setPen(alphaBlendColors(cg.background(), black, 180)); if(widget && widget == hoverWidget) { if (w > h) { int ycenter = r.height()/2; for(int k = r.width()/2-5; k < r.width()/2+5; k+=3) { p->drawRect(k, ycenter-1, 2, 2); } } else { int xcenter = r.width()/2; for(int k = r.height()/2-5; k < r.height()/2+5; k+=3) { p->drawRect(xcenter-1, k, 2, 2); } } } break; } // TOOLBAR SEPARATOR // ----------------- case PE_DockWindowSeparator: { if(!_toolBtnAsBtn) { int ch, cs, cv; cg.background().getHsv(ch, cs, cv); if(cv < 100) p->setPen(alphaBlendColors(cg.background(), white, 150)); else p->setPen(alphaBlendColors(cg.background(), black, 150)); if(horiz) { int x = r.width()/2; for(int i = 2; i < r.height()-4; i += 3) p->drawPoint(x, i); } else { int y = r.height()/2; for(int i = 2; i < r.width()-4; i += 3) p->drawPoint(i, y); } } break; } case PE_CheckMark: { if( flags & Style_On ) { if(flags & Style_Enabled) p->drawPixmap(r.x()+1, r.y()+1, *checkMark, 0, 0, 16, 17); else p->drawPixmap(r.x()+1, r.y()+1, *checkMark, 16, 0, 16, 17); } else if ( flags & Style_Off ) { } else {// tristate p->setPen(_customCheckMarkColor ? _checkMarkColor : qApp->palette().active().foreground()); p->drawLine(6,6,11,6); p->drawLine(6,8,11,8); p->drawLine(6,10,11,10); } break; } case PE_SpinWidgetUp: case PE_SpinWidgetDown: { QPixmap* arrow; bool isEnabled = (flags & Style_Enabled); QString enabled = isEnabled ? "1" : "0"; QColor color = p->pen().color(); if(!(arrow = QPixmapCache::find(QString::number(color.pixel(), 16)+"spinArrows"+enabled))) { QImage ar = tintImage(qembed_findImage("spinBoxArrows"), color); if(!isEnabled) { // make it transparent ar = setImageOpacity(ar, 25); } arrow = new QPixmap(ar); QPixmapCache::insert(QString::number(color.pixel(), 16)+"spinArrows"+enabled, arrow); } if(textEffectSettings.mode) { QPixmap* effectArrow; if(!(effectArrow = QPixmapCache::find(QString::number(textEffectSettings.buttonColor.pixel(), 16)+"spinEArrows"+enabled))) { QImage img = tintImage(qembed_findImage("spinBoxArrows"), textEffectSettings.buttonColor); int opacity = textEffectSettings.buttonOpacity*100/255; effectArrow = new QPixmap(setImageOpacity(img, !isEnabled ? opacity*25/100 : opacity)); QPixmapCache::insert(QString::number(textEffectSettings.buttonColor.pixel(), 16)+"spinEArrows"+enabled, effectArrow); } bitBlt(p->device(), r.x()+7/2+1+textEffectSettings.buttonPos.x(), r.y()+r.height()/2-3+textEffectSettings.buttonPos.y(), effectArrow, 0, pe == PE_SpinWidgetDown ? 5 : 0, 7, 5); } bitBlt(p->device(), r.x()+7/2+1, r.y()+r.height()/2-3, arrow, 0, pe == PE_SpinWidgetDown ? 5 : 0, 7, 5); break; } case PE_HeaderArrow: case PE_ArrowUp: case PE_ArrowDown: case PE_ArrowLeft: case PE_ArrowRight: { QRect re = r; int x2, w2, h2; int x = -4; switch (pe) { case PE_ArrowUp: { x2 = 10; w2 = 7; h2 = 5; break; } case PE_ArrowDown: { x2 = 17; w2 = 7; h2 = 5; break; } case PE_ArrowLeft: { x += 1; x2 = 0; w2 = 5; h2 = 7; break; } case PE_ArrowRight: { x += 2; x2 = 5; w2 = 5; h2 = 7; break; } default: { if(flags & Style_Up) { x2 = 10; w2 = 7; h2 = 5; } else { x2 = 17; w2 = 7; h2 = 5; } break; } } QPixmap* arrow; bool isEnabled = (flags & Style_Enabled); QString enabled = isEnabled ? "1" : "0"; QColor color = p->pen().color(); if(!(arrow = QPixmapCache::find(QString::number(color.pixel(), 16)+"scrollBarArrows"+enabled))) { QImage ar = tintImage(qembed_findImage("scrollBarArrows"), color); if(!isEnabled) { ar = setImageOpacity(ar, 25); } arrow = new QPixmap(ar); QPixmapCache::insert(QString::number(color.pixel(), 16)+"scrollBarArrows"+enabled, arrow); } if(/*pe == PE_HeaderArrow &&*/ textEffectSettings.mode) { QPixmap* effectArrow; if(!(effectArrow = QPixmapCache::find(QString::number(textEffectSettings.buttonColor.pixel(), 16)+"scrollBarEArrows"+enabled))) { QImage img = tintImage(qembed_findImage("scrollBarArrows"), textEffectSettings.buttonColor); int opacity = textEffectSettings.buttonOpacity*100/255; effectArrow = new QPixmap(setImageOpacity(img, !isEnabled ? opacity*25/100 : opacity)); QPixmapCache::insert(QString::number(textEffectSettings.buttonColor.pixel(), 16)+"scrollBarEArrows"+enabled, effectArrow); } p->drawPixmap(re.x()+re.width()/2+x+textEffectSettings.buttonPos.x(), re.y()+re.height()/2-3+textEffectSettings.buttonPos.y(), *effectArrow, x2, 0, w2, h2); } p->drawPixmap(re.x()+re.width()/2+x, re.y()+re.height()/2-3, *arrow, x2, 0, w2, h2); break; } case PE_CheckListIndicator: { // the rect in not correctly calculated in Qt, so the controller rect is 2px above the drawn rect. QCheckListItem *item = opt.checkListItem(); QListView *lv = item->listView(); if(!item) return; QString state = flags& Style_On ? "1" : "0"; state += flags& Style_Selected ? "1" : "0"; state += flags& Style_NoChange ? "1" : "0"; QColor background = flags& Style_Selected ? cg.highlight() : cg.base(); QColor foreground = cg.text(); QPixmap* pix; if(!(pix = QPixmapCache::find(QString::number(background.pixel(), 16)+QString::number(foreground.pixel(), 16)+"checkListIndicator"+state))) { pix = new QPixmap(r.x()+lv->itemMargin()+r.width()+4, item->height()); pix->fill(background); QPainter painter(pix); painter.setPen(alphaBlendColors(foreground, background, 127)); painter.drawLine(r.x()+1, r.y()+1, r.x()+12, r.y()+1); // t painter.drawLine(r.x()+1, r.y()+14, r.x()+12, r.y()+14); // b painter.drawLine(r.x(), r.y()+2, r.x(), r.y()+13); // l painter.drawLine(r.x()+13, r.y()+2, r.x()+13, r.y()+13); // r painter.setPen(alphaBlendColors(foreground, background, 80)); painter.drawPoint(r.x(), r.y()+1); painter.drawPoint(r.x()+13, r.y()+1); painter.drawPoint(r.x(), r.y()+14); painter.drawPoint(r.x()+13, r.y()+14); if(flags& Style_NoChange) { painter.fillRect(r.x()+1, r.y()+2, 12, 12, dGetColor(background, 30)); painter.drawPixmap(r.x()-1, r.y(), tintImage(qembed_findImage("checkmark"), foreground)); } if(flags& Style_On) painter.drawPixmap(r.x()-1, r.y(), tintImage(qembed_findImage("checkmark"), foreground)); QPixmapCache::insert(QString::number(background.pixel(), 16)+QString::number(foreground.pixel(), 16)+"checkListIndicator"+state, pix); } p->drawPixmap(0, 0, *pix); break; } case PE_CheckListExclusiveIndicator: { QColor background = flags& Style_Selected ? cg.highlight() : cg.base(); p->drawPixmap(r.left()+3, r.top()+1, tintImage(qembed_findImage("checkListExclusiveIndicator"), alphaBlendColors(cg.text(), background, 127))); if(flags&Style_On) p->drawPixmap(r.x()+7, r.y()+5, tintImage(qembed_findImage("rb-dot"),cg.text())); break; } case PE_SizeGrip: { bool parentBgPix = cg.brush(QColorGroup::Background).pixmap(); QString trans = parentBgPix ? "1" : "0"; QPixmap* grip; if(!(grip = QPixmapCache::find(QString::number(cg.background().pixel(), 16)+"sizeGrip"+trans))) { if(parentBgPix) grip = new QPixmap(qembed_findImage("sizeGrip")); else { grip = new QPixmap(4, 4); grip->fill(cg.background()); QPixmap tmpPix = qembed_findImage("sizeGrip"); bitBlt(grip, 0, 0, &tmpPix, 0, 0, -1, -1, Qt::CopyROP); } QPixmapCache::insert(QString::number(cg.background().pixel(), 16)+"sizeGrip"+trans, grip); } bitBlt(p->device(), r.width()-(QApplication::reverseLayout() ? 12 : 6), r.height()-12, grip, 0, 0, -1, -1, Qt::CopyROP); bitBlt(p->device(), r.width()-6, r.height()-6, grip, 0, 0, -1, -1, Qt::CopyROP); bitBlt(p->device(), r.width()-12, r.height()-6, grip, 0, 0, -1, -1, Qt::CopyROP); break; } case PE_RubberBand: { #if KDE_VERSION >= 0x30506 if(rubberBandType != ArgbRubber || !compositeManagerRunning) { #else if(rubberBandType != ArgbRubber) { #endif if(rubberBandType == LineRubber) { p->save(); p->setPen(QPen(black, 1, Qt::SolidLine)); p->drawRect(r); p->restore(); } else { KStyle::drawPrimitive(pe, p, r, cg, flags, opt); } break; } bool normalized = r.width() < 0 || r.height() < 0; QRect re = normalized? r.normalize(): r; if(re.y() < 0) re.setY(-3); if(re.x() < 0) re.setX(-3); if(!viewPortPressed || re == oldRubberRect || re.width() == 0 || re.height() == 0) { break; } QColor fg = alphaBlendColors(_argbRubberBandColor, black, 127); const QWidget* w = dynamic_cast(p->device()); if(!w) w = rubberViewPort; QPoint po = w->mapToGlobal(QPoint(0,0)); QRect gr = QRect(po.x(), po.y(), w->width(), w->height()); QRegion mask(re.x()+1, re.y(), re.width()-2, re.height()); mask += QRegion(re.x(), re.y()+1, re.width(), re.height()-2); rubber->create(gr, mask); GC gc2 = XCreateGC(qt_xdisplay(), rubber->window, 0, 0); /////// erasing XRectangle xrect; XRectangle outline[4]; int num = 0; if(re.y() < oldRubberRect.y()) {// ^ top outline[num].x = oldRubberRect.x(); outline[num].y = oldRubberRect.y(); outline[num].width = oldRubberRect.width(); outline[num].height = 1; num += 1; } if(oldRubberRect.y()+oldRubberRect.height() < re.y()+re.height()) {// v bottom outline[num].x = oldRubberRect.x(); outline[num].y = oldRubberRect.y()+oldRubberRect.height()-1; outline[num].width = oldRubberRect.width(); outline[num].height = 1; num += 1; } if(re.x() < oldRubberRect.x()) {// < left outline[num].x = oldRubberRect.x(); outline[num].y = oldRubberRect.y(); outline[num].width = 1; outline[num].height = oldRubberRect.height()-1; num += 1; } if(oldRubberRect.x()+oldRubberRect.width() < re.x()+re.width()) {// > right outline[num].x = oldRubberRect.x()+oldRubberRect.width()-1; outline[num].y = oldRubberRect.y(); outline[num].width = 1; outline[num].height = oldRubberRect.height()-1; num += 1; } for(int i = 0; iwindow, outline[i].x, outline[i].y, outline[i].width, outline[i].height, false); xrect.x = oldRubberRect.x()+1; xrect.y = oldRubberRect.y()+1; xrect.width = 2; xrect.height = 2; XClearArea(qt_xdisplay(), rubber->window, xrect.x, xrect.y, xrect.width, xrect.height, false); xrect.x = oldRubberRect.x()+1; xrect.y = oldRubberRect.y()+oldRubberRect.height()-3; xrect.width = 2; xrect.height = 2; XClearArea(qt_xdisplay(), rubber->window, xrect.x, xrect.y, xrect.width, xrect.height, false); xrect.x = oldRubberRect.x()+oldRubberRect.width()-3; xrect.y = oldRubberRect.y()+1; xrect.width = 2; xrect.height = 2; XClearArea(qt_xdisplay(), rubber->window, xrect.x, xrect.y, xrect.width, xrect.height, false); xrect.x = oldRubberRect.x()+oldRubberRect.width()-3; xrect.y = oldRubberRect.y()+oldRubberRect.height()-3; xrect.width = 2; xrect.height = 2; XClearArea(qt_xdisplay(), rubber->window, xrect.x, xrect.y, xrect.width, xrect.height, false); rubber->updateMask(mask); ///////////// painting XSetForeground(qt_xdisplay(), gc2, preMultiplyColor(qRgba(fg.red(), fg.green(), fg.blue(),153))); XDrawRectangle(qt_xdisplay(), rubber->window, gc2, re.x(), re.y(), re.width()-1, re.height()-1); // inside XRectangle xrects[8]; // top left xrects[0].x = re.x()+2; xrects[0].y = re.y()+1; xrects[0].width = 1; xrects[0].height = 1; xrects[1].x = re.x()+1; xrects[1].y = re.y()+2; xrects[1].width = 1; xrects[1].height = 1; // top right xrects[2].x = re.x()+re.width()-3; xrects[2].y = re.y()+1; xrects[2].width = 1; xrects[2].height = 1; xrects[3].x = re.x()+re.width()-2; xrects[3].y = re.y()+2; xrects[3].width = 1; xrects[3].height = 1; // bottom left xrects[4].x = re.x()+1; xrects[4].y = re.y()+re.height()-3; xrects[4].width = 1; xrects[4].height = 1; xrects[5].x = re.x()+2; xrects[5].y = re.y()+re.height()-2; xrects[5].width = 1; xrects[5].height = 1; // bottom right xrects[6].x = re.x()+re.width()-2; xrects[6].y = re.y()+re.height()-3; xrects[6].width = 1; xrects[6].height = 1; xrects[7].x = re.x()+re.width()-3; xrects[7].y = re.y()+re.height()-2; xrects[7].width = 1; xrects[7].height = 1; QColor blendc = qRgba(fg.red(), fg.green(), fg.blue(), 36); XSetForeground(qt_xdisplay(), gc2, preMultiplyColor(blendColors(_argbRubberBandColor, blendc).rgb())); XSetClipRectangles(qt_xdisplay(), gc2, 0, 0, xrects, 8, Unsorted); XDrawRectangle(qt_xdisplay(), rubber->window, gc2, re.x()+1, re.y()+1, re.width()-3, re.height()-3); XRectangle xrects2[8]; // top left xrects2[0].x = re.x()+2; xrects2[0].y = re.y(); xrects2[0].width = 1; xrects2[0].height = 1; xrects2[1].x = re.x()+1; xrects2[1].y = re.y()+1; xrects2[1].width = 1; xrects2[1].height = 1; xrects2[2].x = re.x(); xrects2[2].y = re.y()+2; xrects2[2].width = 1; xrects2[2].height = 1; // top right xrects2[3].x = re.x()+re.width()-3; xrects2[3].y = re.y(); xrects2[3].width = 1; xrects2[3].height = 1; xrects2[4].x = re.x()+re.width()-2; xrects2[4].y = re.y()+1; xrects2[4].width = 1; xrects2[4].height = 1; xrects2[5].x = re.x()+re.width()-1; xrects2[5].y = re.y()+2; xrects2[5].width = 1; xrects2[5].height = 1; // bottom left xrects2[6].x = re.x()+2; xrects2[6].y = re.y()+re.height()-1; xrects2[6].width = 1; xrects2[6].height = 1; xrects2[7].x = re.x()+1; xrects2[7].y = re.y()+re.height()-2; xrects2[7].width = 1; xrects2[7].height = 1; xrects2[8].x = re.x(); xrects2[8].y = re.y()+re.height()-3; xrects2[8].width = 1; xrects2[8].height = 1; // bottom right xrects2[9].x = re.x()+re.width()-3; xrects2[9].y = re.y()+re.height()-1; xrects2[9].width = 1; xrects2[9].height = 1; xrects2[10].x = re.x()+re.width()-2; xrects2[10].y = re.y()+re.height()-2; xrects2[10].width = 1; xrects2[10].height = 1; xrects2[11].x = re.x()+re.width()-1; xrects2[11].y = re.y()+re.height()-3; xrects2[11].width = 1; xrects2[11].height = 1; XSetForeground(qt_xdisplay(), gc2, preMultiplyColor(qRgba(fg.red(), fg.green(), fg.blue(), 121))); XSetClipRectangles(qt_xdisplay(), gc2, 0, 0, xrects2, 12, Unsorted); XDrawRectangle(qt_xdisplay(), rubber->window, gc2, re.x()+1, re.y()+1, re.width()-3, re.height()-3); XDrawRectangle(qt_xdisplay(), rubber->window, gc2, re.x(), re.y(), re.width()-1, re.height()-1); // outermost pixels XRectangle xrects3[8]; // top left xrects3[0].x = re.x()+1; xrects3[0].y = re.y(); xrects3[0].width = 1; xrects3[0].height = 1; xrects3[1].x = re.x(); xrects3[1].y = re.y()+1; xrects3[1].width = 1; xrects3[1].height = 1; // top right xrects3[2].x = re.x()+re.width()-2; xrects3[2].y = re.y(); xrects3[2].width = 1; xrects3[2].height = 1; xrects3[3].x = re.x()+re.width()-1; xrects3[3].y = re.y()+1; xrects3[3].width = 1; xrects3[3].height = 1; // bottom left xrects3[4].x = re.x()+1; xrects3[4].y = re.y()+re.height()-1; xrects3[4].width = 1; xrects3[4].height = 1; xrects3[5].x = re.x(); xrects3[5].y = re.y()+re.height()-2; xrects3[5].width = 1; xrects3[5].height = 1; // bottom right xrects3[6].x = re.x()+re.width()-2; xrects3[6].y = re.y()+re.height()-1; xrects3[6].width = 1; xrects3[6].height = 1; xrects3[7].x = re.x()+re.width()-1; xrects3[7].y = re.y()+re.height()-2; xrects3[7].width = 1; xrects3[7].height = 1; XSetForeground(qt_xdisplay(), gc2, preMultiplyColor(qRgba(fg.red(), fg.green(), fg.blue(), 37))); XSetClipRectangles(qt_xdisplay(), gc2, 0, 0, xrects3, 8, Unsorted); XDrawRectangle(qt_xdisplay(), rubber->window, gc2, re.x(), re.y(), re.width()-1, re.height()-1); XFlush(qt_xdisplay()); XFreeGC(qt_xdisplay(),gc2); oldRubberRect = re; break; } default: { return KStyle::drawPrimitive(pe, p, r, cg, flags, opt); } } } void DominoStyle::drawControl(ControlElement element, QPainter *p, const QWidget *widget, const QRect &r, const QColorGroup &cg, SFlags flags, const QStyleOption& opt) const { const bool enabled = (flags & Style_Enabled); //return KStyle::drawControl(element, p, widget, r, cg, flags, opt); switch (element) { case CE_ToolButtonLabel: { if(widget->isA("KToolBarButton")) { DominoKToolBarButton* tb= (DominoKToolBarButton *) widget; QStyle::SFlags flags = QStyle::Style_Default; QStyle::SCFlags active = QStyle::SC_None; if (tb->isDown()) { flags |= QStyle::Style_Down; active |= QStyle::SC_ToolButton; } if (tb->isEnabled()) flags |= QStyle::Style_Enabled; if (tb->isOn()) flags |= QStyle::Style_On; if (tb->isEnabled() && tb->hasMouse()) flags |= QStyle::Style_Raised; if (tb->hasFocus()) flags |= QStyle::Style_HasFocus; int dx, dy; QFont tmp_font(KGlobalSettings::toolBarFont()); QFontMetrics fm(tmp_font); QRect textRect; int textFlags = 0; QPixmap pixmap; if (tb->iconTextMode() != KToolBar::TextOnly) { pixmap =tb->iconSet().pixmap( QIconSet::Automatic, tb->isEnabled() ? (tb->isActive() ? QIconSet::Active : QIconSet::Normal) : QIconSet::Disabled, tb->isOn() ? QIconSet::On : QIconSet::Off ); QImage img = pixmap.convertToImage(); if((_toolBtnAsBtn || tb->isToggleButton()) && (tb->isDown() || tb->isOn())) pixmap = KImageEffect::fade(img, 0.10, black); else if(tb->isDown() || tb->isOn()) pixmap = KImageEffect::fade(img, 0.15, black); else if(_highlightToolBtnIcon && tb->hasMouse() && tb->isEnabled()) pixmap = KImageEffect::fade(img, 0.25, white); } QPixmap outlinePixmap = 0; bool drawOutlinePixmap = false; if(flags &QStyle::Style_HasFocus && focusIndicatorSettings.indicateFocus && !pixmap.isNull()) { outlinePixmap = renderOutlineIcon(&pixmap); drawOutlinePixmap = true; } if (tb->iconTextMode() == KToolBar::IconOnly) // icon only { if( !pixmap.isNull()) { dx = ( tb->width() - pixmap.width() ) / 2; dy = ( tb->height()-1 - pixmap.height() ) / 2; if(drawOutlinePixmap) { p->drawPixmap( dx-1, dy-1, outlinePixmap ); } p->drawPixmap( dx, dy, pixmap ); } } else if (tb->iconTextMode() == KToolBar::IconTextRight) // icon and text (if any) { if( !pixmap.isNull()) { dx = 4; dy = ( tb->height()-1 - pixmap.height() ) / 2; if(drawOutlinePixmap) { p->drawPixmap( dx-1, dy-1, outlinePixmap ); } p->drawPixmap( dx, dy, pixmap ); } if (!tb->textLabel().isNull()) { textFlags = AlignVCenter|AlignLeft; if (!pixmap.isNull()) dx = 4 + pixmap.width() + 2; else dx = 4; dy = 0; textRect = QRect(dx, dy, tb->width()-dx, tb->height()-1); } } else if (tb->iconTextMode() == KToolBar::TextOnly) { if (!tb->textLabel().isNull()) { textFlags = AlignVCenter|AlignLeft; dx = (tb->width() - fm.width(tb->textLabel())) / 2; dy = (tb->height()-1 - fm.lineSpacing()) / 2; textRect = QRect( dx, dy, fm.width(tb->textLabel()), fm.lineSpacing() ); } } else if (tb->iconTextMode() == KToolBar::IconTextBottom) { if( !pixmap.isNull()) { dx = (tb->width() - pixmap.width()) / 2; dy = (tb->height()-1 - fm.lineSpacing() - pixmap.height()) / 2; if(drawOutlinePixmap) { p->drawPixmap( dx-1, dy-1, outlinePixmap ); } p->drawPixmap( dx, dy, pixmap ); } if (!tb->textLabel().isNull()) { textFlags = AlignBottom|AlignHCenter; dx = (tb->width() - fm.width(tb->textLabel())) / 2; dy = tb->height()-1 - fm.lineSpacing() - 4; textRect = QRect( dx, dy, fm.width(tb->textLabel()), fm.lineSpacing() ); } } if (!tb->textLabel().isNull() && !textRect.isNull()) { p->setFont(KGlobalSettings::toolBarFont()); QColor pencolor; if (!tb->isEnabled()) pencolor = tb->palette().disabled().dark(); // replaced through icon highlights // else if(tb->isRaised()) // pencolor = KGlobalSettings::toolBarHighlightColor(); else pencolor = tb->colorGroup().buttonText(); dominoDrawItem( p, textRect, textFlags, cg, enabled, 0, tb->textLabel(), -1, &pencolor, textEffectSettings.mode > 0 ? 1 : 0); } } else { // QToolButton - bye bye win95 iconset mode :) const QToolButton *toolbutton = (const QToolButton *) widget; QRect rect = r; Qt::ArrowType arrowType = opt.isDefault() ? Qt::DownArrow : opt.arrowType(); if (!opt.isDefault()) { PrimitiveElement pe; switch (arrowType) { case Qt::LeftArrow: pe = PE_ArrowLeft; break; case Qt::RightArrow: pe = PE_ArrowRight; break; case Qt::UpArrow: pe = PE_ArrowUp; break; default: case Qt::DownArrow: pe = PE_ArrowDown; break; } drawPrimitive(pe, p, rect, cg, flags, opt); } else { QColor btext = toolbutton->paletteForegroundColor(); if (toolbutton->iconSet().isNull() && ! toolbutton->text().isNull() && ! toolbutton->usesTextLabel()) { int alignment = AlignCenter | ShowPrefix; if (!styleHint(SH_UnderlineAccelerator, widget, QStyleOption::Default, 0)) alignment |= NoAccel; dominoDrawItem( p, rect, alignment, cg, enabled, 0, toolbutton->text(), toolbutton->text().length(), &btext, textEffectSettings.mode > 0 ? 1 : 0); } else { QPixmap pm; QIconSet::Size size = toolbutton->usesBigPixmap() ? QIconSet::Large : QIconSet::Small; QIconSet::State state = toolbutton->isOn() ? QIconSet::On : QIconSet::Off; QIconSet::Mode mode; /* if (!toolbutton->isEnabled()) mode = QIconSet::Disabled; else*/ if (flags & (Style_Down | Style_On) || (flags & Style_Raised) && (flags & Style_AutoRaise)) mode = QIconSet::Active; else mode = QIconSet::Normal; pm = toolbutton->iconSet().pixmap( size, mode, state ); if(!toolbutton->isEnabled()) pm = disableIcon(&pm); QImage img = pm.convertToImage(); if((_toolBtnAsBtn || toolbutton->isToggleButton()) && (toolbutton->isDown() || toolbutton->isOn())) pm = KImageEffect::fade(img, 0.10, black); else if(toolbutton->isDown() || toolbutton->isOn()) pm = KImageEffect::fade(img, 0.15, black); else if(_highlightToolBtnIcon && toolbutton->hasMouse() && toolbutton->isEnabled()) pm = KImageEffect::fade(img, 0.25, white); QPixmap outlinePixmap = 0; bool drawOutlinePixmap = false; if(flags &QStyle::Style_HasFocus && focusIndicatorSettings.indicateFocus) { outlinePixmap = renderOutlineIcon(&pm); drawOutlinePixmap = true; } if ( toolbutton->usesTextLabel() ) { p->setFont( toolbutton->font() ); QRect pr = rect, tr = rect; int alignment = ShowPrefix; if (!styleHint(SH_UnderlineAccelerator, widget, QStyleOption::Default, 0)) alignment |= NoAccel; if ( toolbutton->textPosition() == QToolButton::Under ) { int fh = p->fontMetrics().height(); pr.addCoords( 0, 1, 0, -fh-3 ); tr.addCoords( 0, pr.bottom(), 0, -3 ); if(drawOutlinePixmap) drawItem( p, pr, AlignCenter, cg, TRUE, &outlinePixmap, QString::null ); drawItem( p, pr, AlignCenter, cg, TRUE, &pm, QString::null ); alignment |= AlignCenter; } else { pr.setWidth( pm.width() + 8 ); tr.addCoords( pr.right(), 0, 0, 0 ); if(drawOutlinePixmap) drawItem( p, pr, AlignCenter, cg, TRUE, &outlinePixmap, QString::null ); drawItem( p, pr, AlignCenter, cg, TRUE, &pm, QString::null ); alignment |= AlignLeft | AlignVCenter; } dominoDrawItem( p, tr, alignment, cg, enabled, 0, toolbutton->textLabel(), toolbutton->textLabel().length(), &btext, textEffectSettings.mode > 0 ? 1 : 0); } else { if(drawOutlinePixmap) drawItem( p, rect, AlignCenter, cg, TRUE, &outlinePixmap, QString::null ); drawItem( p, rect, AlignCenter, cg, TRUE, &pm, QString::null ); } } } } break; } // PROGRESSBAR // ----------- case CE_ProgressBarGroove: { drawPrimitive(PE_Panel, p, r, cg, flags, opt); break; } case CE_ProgressBarContents: { const QProgressBar *pb = dynamic_cast(widget); int steps = pb->totalSteps(); const QColor bg = enabled? cg.base(): cg.background(); // background const QColor fg = cg.background(); bool reverseLayout = QApplication::reverseLayout(); QPixmap* prBgShadow; int h, s, v, bv; bg.getHsv(&h, &s, &v); cg.background().getHsv(&h, &s, &bv); int diff = KMAX(v-bv, 0); // if we don't adjust the shadow to the background, it will look strange QColor tintColor = alphaBlendColors(Qt::black, bg, diff+30); if(!(prBgShadow = QPixmapCache::find(QString::number(bg.pixel(), 16)+QString::number(cg.background().pixel(), 16)+"prBgShadow"))) { prBgShadow = new QPixmap(4,4); prBgShadow->fill(bg); QPainter painter(prBgShadow); painter.drawPixmap(0, 0, tintImage(qembed_findImage("progressShadow2"), tintColor)); QPixmapCache::insert(QString::number(bg.pixel(), 16)+QString::number(cg.background().pixel(), 16)+"prBgShadow", prBgShadow); } QRect surface; QRect rightBg; QRect leftBg; p->setClipRegion(r); if( steps == 0 ) { // Busy indicator static const int barWidth = 10; int progress = pb->progress() % (2*(r.width()-barWidth)); if( progress < 0) progress = 0; if( progress > r.width()-barWidth ) progress = (r.width()-barWidth)-(progress-(r.width()-barWidth)); surface = QRect(reverseLayout? r.right()-progress+1: r.x()+progress+1, r.top(), barWidth-2, r.height()); rightBg = reverseLayout ? QRect(r.x(), r.y(), r.width()-(progress-1), r.height()) : QRect(r.x()+progress+barWidth-1, r.y(), r.width()-(progress+barWidth-1), r.height()); if(rightBg.width()+surface.width() < r.width()) { leftBg = reverseLayout ? QRect(rightBg.width()+surface.width(), r.y(), r.width()-(rightBg.width()+surface.width()-2), r.height()) : QRect(r.x(), r.y(), r.x()+progress+1, r.height()); } } else { double percent = static_cast(pb->progress()) / static_cast(steps); int w = static_cast(r.width() * percent); if(w < 0) w = 0; int w2 = r.width()-(r.width()-w); rightBg = QRect(reverseLayout? r.left(): r.left()+w, r.top(), r.width()-w, r.height()); surface = QRect(reverseLayout? r.right()-w2+1: r.left(), r.top(), w2, r.height()); } QPixmap* surfaceTile; if(!(surfaceTile = QPixmapCache::find("prTile"+QString::number(surface.height())+QString::number(bg.pixel(), 16)))) { surfaceTile = new QPixmap(20, surface.height()); QPainter tilePainter(surfaceTile); flatMode=true; renderSurface(&tilePainter, QRect(0, 0, 20, surface.height()), fg, cg.background(), fg , Is_Button|Is_Horizontal); flatMode=false; QPixmap pix = qembed_findImage("progressTile"); tilePainter.drawTiledPixmap(0,0, 20, surface.height(), pix); QPixmapCache::insert("prTile"+QString::number(surface.height())+QString::number(bg.pixel(), 16), surfaceTile); } int staticShift = 0; int animShift = 0; // find the animation Offset for the current Widget QWidget* nonConstWidget = const_cast(widget); QMapConstIterator iter = progAnimWidgets.find(nonConstWidget); if (iter != progAnimWidgets.end()) animShift = iter.data(); int counter = 0; while(counter < (surface.width()+20)) { counter += 20; if (reverseLayout) { p->drawPixmap(surface.right()-counter+animShift+staticShift+1, r.top(), *surfaceTile); } else { p->drawPixmap(surface.left()+counter-20-animShift+staticShift, r.top(), *surfaceTile); } } // empty area QColor color_d = alphaBlendColors(tintColor, bg, 170); QColor color_m = alphaBlendColors(tintColor, bg, 85); QColor color_l = alphaBlendColors(tintColor, bg, 25); if(leftBg.isValid()) { p->setClipRegion(leftBg); p->fillRect(leftBg, bg); p->setPen(color_d); p->drawLine(leftBg.x()+2, leftBg.y(), leftBg.right()-2, leftBg.y()); p->setPen(color_m); p->drawLine(leftBg.x()+2, leftBg.y()+1, leftBg.right()-2, leftBg.y()+1); p->setPen(color_l); p->drawLine(leftBg.x()+2, leftBg.y()+2, leftBg.right()-2, leftBg.y()+2); p->drawLine(leftBg.x()+2, leftBg.bottom(), leftBg.right()-2, leftBg.bottom()); //p->setPen(color_l); p->drawLine(leftBg.x()+1, leftBg.y()+3, leftBg.x()+1, leftBg.bottom()-1); // l p->drawLine(leftBg.right()-1, leftBg.y()+3, leftBg.right()-1, leftBg.bottom()-1); // r p->setPen(color_m); p->drawLine(leftBg.x(), leftBg.y()+3, leftBg.x(), leftBg.bottom()-1); // l p->drawLine(leftBg.right(), leftBg.y()+3, leftBg.right(), leftBg.bottom()-1); // r p->drawPixmap(leftBg.right()-1, leftBg.y(), *prBgShadow, 2, 0, 2, 3); // tr p->drawPixmap(leftBg.x(), leftBg.y(), *prBgShadow, 0, 0, 2, 3); p->drawPixmap(leftBg.right()-1, leftBg.bottom(), *prBgShadow, 2, 3, 2, 1); // br p->drawPixmap(leftBg.x(), leftBg.bottom(), *prBgShadow, 0, 3, 2, 1); } p->setClipRegion(rightBg); p->fillRect(rightBg, bg); p->setPen(color_d); p->drawLine(rightBg.x()+2, rightBg.y(), rightBg.right()-2, rightBg.y()); p->setPen(color_m); p->drawLine(rightBg.x()+2, rightBg.y()+1, rightBg.right()-2, rightBg.y()+1); p->setPen(color_l); p->drawLine(rightBg.x()+2, rightBg.y()+2, rightBg.right()-2, rightBg.y()+2); p->drawLine(rightBg.x()+2, rightBg.bottom(), rightBg.right()-2, rightBg.bottom()); //p->setPen(color_l); p->drawLine(rightBg.x()+1, rightBg.y()+3, rightBg.x()+1, rightBg.bottom()-1); // l p->drawLine(rightBg.right()-1, rightBg.y()+3, rightBg.right()-1, rightBg.bottom()-1); // r p->setPen(color_m); p->drawLine(rightBg.x(), rightBg.y()+3, rightBg.x(), rightBg.bottom()-1); // l p->drawLine(rightBg.right(), rightBg.y()+3, rightBg.right(), rightBg.bottom()-1); // r p->drawPixmap(rightBg.right()-1, rightBg.y(), *prBgShadow, 2, 0, 2, 3); // tr p->drawPixmap(rightBg.x(), rightBg.y(), *prBgShadow, 0, 0, 2, 3); p->drawPixmap(rightBg.right()-1, rightBg.bottom(), *prBgShadow, 2, 3, 2, 1); // br p->drawPixmap(rightBg.x(), rightBg.bottom(), *prBgShadow, 0, 3, 2, 1); if(rightBg.width() == 2) { // must overpaint two lighter pixel p->drawPixmap(rightBg.right(), rightBg.y()+2, *prBgShadow, 0, 3, 1, 1); // br p->drawPixmap(rightBg.right(), rightBg.bottom(), *prBgShadow, 0, 3, 1, 1); // br } p->setClipping(false); break; } case CE_ProgressBarLabel: { const QProgressBar *progressbar = (const QProgressBar *) widget; QFont font = p->font(); font.setBold(false); p->setFont(font); p->setPen(cg.buttonText()); //p->drawText(r, AlignCenter | SingleLine, progressbar->progressString()); dominoDrawItem( p, r, AlignCenter | SingleLine, cg, false, 0, progressbar->progressString(), -1,&cg.buttonText(), false); break; } case CE_CheckBox: { QColorGroup g = cg; if(!khtmlWidgets.contains(widget)) g.setColor(QColorGroup::Button, qApp->palette().active().background()); QPixmap insidePix = qembed_findImage("checkbox2inside"); QPainter painter(&insidePix); renderSurface(&painter, QRect(3, 0, 14, 19), g.background(), g.button(), g.button(), Is_CheckItem); painter.end(); QImage inside = insidePix.convertToImage(); QImage checkbox; QImage shadow = qembed_findImage("checkbox2shadow"); QImage circle = tintImage(qembed_findImage("checkbox2rect"), buttonContour->contourColor(Contour_Default)); blend(shadow, inside, checkbox); blend(circle, checkbox, checkbox); if(flags&Style_Down) { QImage pressed = tintImage(qembed_findImage("checkbox2pressed"), buttonContour->contourColor(Contour_Pressed)); blend(pressed, checkbox, checkbox); } QPixmap pix = QPixmap(checkbox); if(flags&Style_On || flags&Style_NoChange) { painter.begin(&pix); drawPrimitive(PE_CheckMark, &painter, r, cg, flags); painter.end(); } p->drawPixmap(r.left(), r.top(), pix); break; } case CE_CheckBoxLabel: { const QCheckBox *cb = (const QCheckBox *) widget; int alignment = QApplication::reverseLayout() ? AlignRight : AlignLeft; if (!styleHint(SH_UnderlineAccelerator, widget, QStyleOption::Default, 0)) alignment |= NoAccel; QRect re = focusIndicatorSettings.drawUnderline ? subRect(SR_CheckBoxFocusRect, cb) : r; if (flags& Style_HasFocus && focusIndicatorSettings.indicateFocus) drawFocusIndicator(p, re, alignment | AlignVCenter |ShowPrefix, cg, flags & Style_Enabled, cb->pixmap(), cb->text(), -1, focusIndicatorSettings.color, focusIndicatorSettings.drawUnderline); drawItem(p, r, alignment | AlignVCenter | ShowPrefix, cg, flags & Style_Enabled, cb->pixmap(), cb->text()); break; } // RADIOBUTTONS // ------------ case CE_RadioButton: { QColorGroup g = cg; if(!khtmlWidgets.contains(widget)) g.setColor(QColorGroup::Button, qApp->palette().active().background()); QString down = flags& Style_Down ? "1" : "0"; QPixmap* radio; if((flags & Domino_noCache) || !(radio = QPixmapCache::find("tabEdges"+down))) { QImage radioImg; QPixmap insidePix = qembed_findImage("radio3inside"); QPainter painter(&insidePix); renderSurface(&painter, QRect(r.left(), r.top(), r.width(), r.height()+1), g.background(), g.button(), g.background(), Is_CheckItem); QImage inside = insidePix.convertToImage(); QImage shadow = qembed_findImage("radio3shadow"); QImage circle = tintImage(qembed_findImage("radio3circle"), buttonContour->contourColor(Contour_Default)); blend(shadow, inside, inside); blend(circle, inside, radioImg); if(flags&Style_Down) { QImage pressed = tintImage(qembed_findImage("radio3pressed"), buttonContour->contourColor(Contour_Default)); blend(pressed, radioImg, radioImg); } radio = new QPixmap(radioImg); if(!(flags & Domino_noCache)) QPixmapCache::insert("radio"+down, radio); } if(flags & Style_On) { if(flags & Style_Enabled) bitBlt(radio, 6, 6, radioIndicator, 0, 0, 5, 5); else bitBlt(radio, 6, 6, radioIndicator, 5, 0, 5, 5); } bitBlt(p->device(), r.x(), r.y(), radio); break; } case CE_RadioButtonLabel: { const QRadioButton *radiobutton = (const QRadioButton *) widget; int alignment = QApplication::reverseLayout() ? AlignRight : AlignLeft; if (!styleHint(SH_UnderlineAccelerator, widget, QStyleOption::Default, 0)) alignment |= NoAccel; QRect re = focusIndicatorSettings.drawUnderline ? subRect(SR_RadioButtonFocusRect, radiobutton) : r; if (flags& Style_HasFocus && focusIndicatorSettings.indicateFocus) drawFocusIndicator(p, re, alignment | AlignVCenter |ShowPrefix, cg, flags & Style_Enabled, radiobutton->pixmap(), radiobutton->text(), -1, focusIndicatorSettings.color, focusIndicatorSettings.drawUnderline); drawItem(p, r, alignment | AlignVCenter | ShowPrefix, cg, flags & Style_Enabled, radiobutton->pixmap(), radiobutton->text()); break; } // TABS // ---- case CE_TabBarTab: { QTabBar * tb = (QTabBar *) widget; bool konqTab = false; bool kickoffTab = false; if(tb->parentWidget()) { const QWidget* w = tb->parentWidget(); if(w->isA("KonqFrameTabs")) konqTab = true; else if(!strcmp(w->name(), "SUSE::Kickoff::KMenu")) kickoffTab = true; } QTabBar::Shape tbs = tb->shape(); bool selected = false; bool reverseLayout = QApplication::reverseLayout(); if (flags & Style_Selected) selected = true; TabPosition pos; if (tb->count() == 1) { pos = Single; } else if ((tb->indexOf(opt.tab()->identifier()) == 0)) { pos = reverseLayout?Last:First; } else if (tb->indexOf(opt.tab()->identifier()) == tb->count() - 1) { pos = reverseLayout?First:Last; } else { pos = Middle; } switch (tbs) { case QTabBar::TriangularAbove: renderTab(p, r, cg, (flags & Style_MouseOver), selected, false, pos, true, false, konqTab); break; case QTabBar::RoundedAbove: renderTab(p, r, cg, (flags & Style_MouseOver), selected, false, pos, false, false, konqTab); break; case QTabBar::TriangularBelow: renderTab(p, r, cg, (flags & Style_MouseOver), selected, true, pos, true, false, konqTab); break; case QTabBar::RoundedBelow: renderTab(p, r, cg, (flags & Style_MouseOver), selected, true, pos, false, false, konqTab); break; default: KStyle::drawControl(element, p, widget, r, cg, flags, opt); } // Qt3 uses this painter to draw the iconSet between CE_TabBarTab and CE_TabBarLabel. If we clip the painter here // we will have a clean area to draw the icon at the right position in CE_TabBarLabel. if(!kickoffTab) p->setClipRect(QRect()); break; } case CE_PushButton: { QPushButton *button = (QPushButton *)widget; bool khtmlMode = khtmlWidgets.contains(button); bool isDefault = enabled && button->isDefault(); bool isHoverWidget = enabled && button == hoverWidget; bool isSunken = flags & Style_On || flags & Style_Down; uint contourFlags = Draw_Left|Draw_Right|Draw_Top|Draw_Bottom; uint surfaceFlags = Is_Button|Is_Horizontal; flatMode = button->isFlat(); QColor bg; if(!khtmlMode && !button->paletteBackgroundPixmap()) { if(dynamic_cast(button->parentWidget())) { bg = button->parentWidget()->paletteBackgroundColor(); } else { bg = cg.background(); } p->fillRect(QRect(r.x(), r.y(), 6, 6), bg); p->fillRect(QRect(r.width()-6, r.y(), 6, 6), bg); p->fillRect(QRect(r.width()-6, r.height()-7, 6,7), bg); p->fillRect(QRect(r.x(), r.height()-7, 6, 7), bg); } else { buttonContour->setAlphaMode(); contourFlags|=Draw_AlphaBlend; } if(khtmlMode) contourFlags|=Draw_AlphaBlend; if(!enabled) { contourFlags|=Is_Disabled; surfaceFlags|=Is_Disabled; } if(isSunken) { surfaceFlags|=Is_Down; contourFlags|=Is_Down; } if(button->isDown()) buttonContour->setState(Contour_Pressed); else if(isHoverWidget) buttonContour->setState(Contour_MouseOver); else if(isDefault) buttonContour->setState(Contour_DefaultButton); if(!flatMode) { renderSurface(p, QRect(r.x()+2, r.y()+2, r.width()-4, r.height()-5), cg.background(), cg.button(), cg.button(), surfaceFlags); contourFlags |= Round_UpperLeft|Round_UpperRight|Round_BottomLeft|Round_BottomRight|Is_Button|Is_Horizontal; renderContour(p, r, bg, cg.button(), contourFlags); if(isSunken) { renderButtonShadow(p, QRect(r.x()+2, r.y()+2, r.width()-2, r.height()-3), contourFlags); } } else { renderSurface(p, QRect(r.x()-3, r.y()-1, r.width()+6, r.height()+2), cg.background(), cg.button(), cg.button(), surfaceFlags); QColor contourColor = alphaBlendColors(buttonContour->contourColor(buttonContour->state), cg.background(), 179); p->setPen(contourColor); if(dynamic_cast(button)) { const QWidget* parent = button->parentWidget(); bool horizontal = parent->width() >= parent->height(); KMultiTabBar* tabBar = static_cast(widget->parentWidget()->parentWidget()->parentWidget()->parentWidget()); KMultiTabBarTab* tab; QPtrList* list = tabBar->tabs(); for(tab = list->first(); tab; tab = list->next()) { if(horizontal && tab->x()+tab->width() == widget->x()) break; else if(tab->y()+tab->height() == widget->y()) break; } if(tab) { QPainter painter(tab); painter.setPen(contourColor); QRect re = tab->rect(); if(horizontal) painter.drawLine(re.right(), re.y(), re.right(), re.bottom()); // right lines else painter.drawLine(re.x(), re.bottom(), re.right(), re.bottom()); } if(horizontal) { if(button->x() == parent->x()) p->drawLine(r.x(), r.y(), r.x(), r.bottom()); // first left line p->drawLine(r.right(), r.y(), r.right(), r.bottom()); // right lines } else { if(button->y() == parent->y()) p->drawLine(r.right(), r.y(), r.right(), r.bottom()); p->drawLine(r.x(), r.y(), r.x(), r.bottom()); } // middle lines p->drawLine(r.x(), r.y(), r.right(), r.y()); p->drawLine(r.x(), r.bottom(), r.right(), r.bottom()); // if(isSunken) { // contourFlags = Draw_Top|Draw_Left|Draw_Right|Draw_Bottom|Rectangular_UpperLeft|Rectangular_UpperRight|Rectangular_BottomLeft|Rectangular_BottomRight; // renderButtonShadow(p, QRect(r.x()-1, r.y()-1, r.width()+5, r.height()+2), contourFlags); // renderButtonShadow(p, re), contourFlags); // } } else { p->drawRect(r); } flatMode = false; } buttonContour->reset(); break; } case CE_PushButtonLabel: { int x, y, w, h; r.rect( &x, &y, &w, &h ); const QPushButton* button = static_cast( widget ); bool cornArrow = false; bool hasFocus = button->hasFocus(); p->setPen(button->colorGroup().buttonText()); // Does the button have a popup menu? if ( button->popup() ) { int dx = pixelMetric( PM_MenuButtonIndicator, widget ); if ( button->iconSet() && !button->iconSet()->isNull() && (dx + button->iconSet()->pixmap (QIconSet::Small, QIconSet::Normal, QIconSet::Off ).width()) >= w ) { cornArrow = true; //To little room. Draw the arrow in the corner, don't adjust the widget } else { drawPrimitive( PE_ArrowDown, p, visualRect( QRect(x + w - dx - 8, y + 3, dx, h - 3), r ), cg, flags, opt ); w -= dx; } } // Draw the icon if there is one if ( button->iconSet() && !button->iconSet()->isNull() ) { QIconSet::Mode mode = QIconSet::Disabled; QIconSet::State state = QIconSet::Off; if (button->isEnabled()) mode = button->hasFocus() ? QIconSet::Active : QIconSet::Normal; if (button->isToggleButton() && button->isOn()) state = QIconSet::On; QPixmap pixmap = button->iconSet()->pixmap( QIconSet::Small, mode, state ); bool focusIcon = hasFocus && focusIndicatorSettings.indicateFocus && !focusIndicatorSettings.drawUnderline; int pw = pixmap.width(); if(button->text().isEmpty()) { int bpw = button->pixmap() ? button->pixmap()->width() : 0; if(focusIcon) { QPixmap outlinePixmap = renderOutlineIcon(&pixmap); p->drawPixmap( x + (w - bpw -outlinePixmap.width())/2, y + (h - outlinePixmap.height())/ 2, outlinePixmap ); } p->drawPixmap( x + (w - bpw - pw)/2, y + (h- pixmap.height()) / 2, pixmap ); } else { int cw = p->fontMetrics().size(Qt::ShowPrefix, button->text()).width()+pw; if(focusIcon) { QPixmap outlinePixmap = renderOutlineIcon(&pixmap); p->drawPixmap( x + (w - cw)/2 - 1 , y + (h - outlinePixmap.height())/ 2, outlinePixmap ); } p->drawPixmap( x + (w - cw)/2 , y + (h - pixmap.height())/ 2, pixmap ); } if (cornArrow) //Draw over the icon drawPrimitive( PE_ArrowDown, p, visualRect( QRect(x + w - 6, x + h - 6, 7, 7), r ), cg, flags, opt ); x += pw + 4; w -= pw + 4; } QRect re = focusIndicatorSettings.drawUnderline ? subRect(SR_PushButtonFocusRect, button) : QRect(x, y, w, h); if(hasFocus && focusIndicatorSettings.indicateFocus && !button->text().isNull()) drawFocusIndicator(p, re, AlignCenter|ShowPrefix, cg, button->isEnabled(), 0, button->text(), -1, focusIndicatorSettings.buttonColor, focusIndicatorSettings.drawUnderline, true); QPixmap buttonPixmap; if(button->pixmap()) { if(!enabled) buttonPixmap = disableIcon(button->pixmap()); else buttonPixmap = *button->pixmap(); } dominoDrawItem( p, QRect(x, y, w, h), AlignCenter|ShowPrefix, button->colorGroup(), enabled, button->pixmap() ? &buttonPixmap : 0, button->text(), -1, &button->colorGroup().buttonText(), textEffectSettings.mode > 0 ? 1 : 0 ); break; } case CE_TabBarLabel: { p->setClipping(false); // was set in CE_TabBarTab to clip the icon drawing if ( opt.isDefault() ) break; const QTabBar * tb = (const QTabBar *) widget; QTab * t = opt.tab(); bool konqTab = false; bool kickoffTab = false; int shift, cshift; switch (tb->shape()) { case QTabBar::RoundedAbove: shift = 4; cshift = 3; break; case QTabBar::RoundedBelow: if((konqTab = tb->parentWidget() && tb->parentWidget()->isA("KonqFrameTabs")) || (kickoffTab = tb->parentWidget() && !strcmp(tb->parentWidget()->name(), "SUSE::Kickoff::KMenu"))) { shift = 0; cshift = 0; } else { shift = -3; cshift = -1; } break; case QTabBar::TriangularAbove: shift = 4; cshift = 3; break; case QTabBar::TriangularBelow: shift = -5; cshift = -3; break; default: shift = 0; cshift = 0; } QRect tr = r; bool currentTab = t->identifier() == tb->currentTab(); if (!currentTab) tr.setTop( tr.top() +shift ); else tr.setTop( tr.top() +cshift ); int alignment = AlignCenter | ShowPrefix; if (flags& Style_HasFocus && focusIndicatorSettings.indicateFocus && !t->text().isEmpty()) drawFocusIndicator(p, QRect(tr.x(), tr.y(), tr.width(), tr.height()), alignment, cg, flags & Style_Enabled, 0, t->text(), -1, focusIndicatorSettings.buttonColor, focusIndicatorSettings.drawUnderline, true); if(t->iconSet() && !tb->isA("KickoffTabBar")) { bool enabled = t->isEnabled() && tb->isEnabled(); QPixmap pixmap; if(!KApplicationMode) { QIconSet::Mode mode = (t->identifier() && tb->keyboardFocusTab()) ? QIconSet::Active : QIconSet::Normal; pixmap = t->iconSet()->pixmap( QIconSet::Small, mode ); if(!enabled) pixmap = disableIcon(&pixmap); } else { QIconSet::Mode mode = enabled ? QIconSet::Normal : QIconSet::Disabled; if ( mode == QIconSet::Normal && (t->identifier() && tb->keyboardFocusTab()) ) mode = QIconSet::Active; pixmap = t->iconSet()->pixmap( QIconSet::Small, mode ); } int pixw = pixmap.width(); int pixh = pixmap.height(); QRect ir = r; ir.setLeft( tr.left() - pixw - 4 ); ir.setRight( tr.right() - 2 ); int yoff = 0; if(!currentTab) { yoff = pixelMetric(QStyle::PM_TabBarTabShiftVertical, tb); } switch(tb->shape()) { case QTabBar::RoundedAbove: case QTabBar::TriangularAbove: ir.setHeight(ir.height()+4); break; default: if(!konqTab) ir.setHeight(ir.height()-2); } p->drawPixmap( ir.left() + 2, ir.center().y()-pixh/2+ yoff, pixmap ); } QColor textColor = cg.foreground(); if(konqTab) textColor = cg.foreground() != tb->palette().active().foreground() ? cg.foreground() : tb->palette().active().foreground(); else if(konsoleMode) textColor = tb->palette().active().foreground(); dominoDrawItem( p, tr, alignment, cg, flags & Style_Enabled, 0, t->text(), -1, &textColor/*&cg.foreground()*/, textEffectSettings.mode > 0 ? 1 : 0); break; } case CE_MenuBarItem: { bool active = flags & Style_Active; bool focused = flags & Style_HasFocus; bool down = flags & Style_Down; if (active && focused) { if(!macStyleBar) p->fillRect(r, cg.background()); // gtk-qt engine fix QColor c = down ? dGetColor(cg.background(), 15) : dGetColor(cg.background(), 25); p->fillRect(QRect(r.left()+3,r.y()+1, r.width()-7, r.height()), c); p->fillRect(QRect(r.left(),r.top()+4, 3, r.height()-7), c); p->fillRect(QRect(r.right()-3, r.y()+4, 3, r.height()-7), c); QPixmap pix = tintImage(qembed_findImage("menuItem"), c); p->drawPixmap(r.left(),r.y()+1, pix, 0, 0, 3, 3); p->drawPixmap(r.left(),r.bottom()-2, pix, 0, 3, 3, 3); p->drawPixmap(r.right()-3,r.y()+1, pix, 3, 0, 3, 3); p->drawPixmap(r.right()-3,r.bottom()-2, pix, 3, 3, 3, 3); } p->setPen(cg.foreground() ); drawItem(p, r, AlignVCenter | AlignHCenter | ShowPrefix | DontClip | SingleLine, cg, true, 0, opt.menuItem()->text(), -1, &cg.foreground() ); break; } // POPUPMENU ITEM (highlighted on mouseover) // ------------------------------------------ case CE_PopupMenuItem: { const QPopupMenu *popupmenu = static_cast< const QPopupMenu * >( widget ); QMenuItem *mi = opt.menuItem(); if ( !mi ) break; bool checked = popupmenu->isCheckable() && mi->isChecked(); int tab = opt.tabWidth(); int maxpmw = mi->iconSet() || _indentPopupMenuItems ? opt.maxIconWidth() : 0; int cmwidth = _indentPopupMenuItems ? maxpmw ? 0 : 12 : 16; // checkmark, visible 10 if(!_indentPopupMenuItems && checked) maxpmw += cmwidth-1; bool enabled = mi->isEnabled(); bool active = flags & Style_Active; bool reverse = QApplication::reverseLayout(); bool separator = mi->isSeparator(); QColor color; if(separator || (active && enabled)) { color = separator ? dGetColor(_popupMenuColor, 20) : _selMenuItemColor; float val = 0; int ph = popupmenu->rect().height()/2; int part = separator ? QMAX(1, ph/r.y()+r.height()) : QMAX(1, ph/r.height()); if(_drawPopupMenuGradient) { if(r.y()+r.height()/2 < ph) { for( int i=r.y(); i < ph; i += part) { val += 0.5; } color = lightenColor(color, (int)val); } else { for( int i=0; i < r.y()-ph; i += part) { val += 0.5; } color = darkenColor(color, (int)val); } } } // Draw the menu item background if (active) { if (enabled) { QColor c = color; p->fillRect(QRect(r.x()+3, r.y(), r.width()-6, r.height()), c); p->fillRect(QRect(r.x(), r.y()+3, 3, r.height()-6), c); p->fillRect(QRect(r.x()+r.width()-3, r.y()+3, 3, r.height()-6), c); QPixmap pix = tintImage(qembed_findImage("menuItem"), c); bitBlt(p->device(), r.x(), r.y(), &pix, 0, 0, 3, 3, Qt::CopyROP); bitBlt(p->device(), r.x(), r.bottom()-2, &pix, 0, 3, 3, 3, Qt::CopyROP); bitBlt(p->device(), r.x()+r.width()-3, r.y(), &pix, 3, 0, 3, 3, Qt::CopyROP); bitBlt(p->device(), r.x()+r.width()-3, r.bottom()-2, &pix, 3, 3, 3, 3, Qt::CopyROP); } } // Are we a menu item separator? if(separator) { p->setPen(color); p->drawLine(r.x(), r.y()+2, r.right(), r.y()+2); break; } if(checked) { // We only have to draw the background if the menu item is inactive - // if it's active the "pressed" background is already drawn QRect cmr = visualRect( QRect( r.x()+itemFrame , r.y() + 1, QMIN(QMAX(maxpmw, cmwidth), r.height() - 2), r.height() - 2 ), r ); // Draw the checkmark SFlags cflags = Style_On; if (enabled) cflags |= Style_Enabled; if(reverse && _indentPopupMenuItems) drawPrimitive( PE_CheckMark, p, QRect(cmr.x() + (maxpmw ? (maxpmw-16)/2-4 : -1), cmr.y(), cmr.width(), cmr.height()), cg, cflags ); else if(_indentPopupMenuItems) drawPrimitive( PE_CheckMark, p, QRect(cmr.x() + (maxpmw ? (maxpmw-16)/2-3 : -6), cmr.y(), cmr.width(), cmr.height()), cg, cflags ); else drawPrimitive( PE_CheckMark, p, QRect(reverse ? cmr.x()+cmr.width()-15 : cmr.x()-3, cmr.y(), cmr.width(), cmr.height()), cg, cflags ); } if(!(_indentPopupMenuItems && checked) && mi->iconSet()) { QRect cr = visualRect( QRect( (reverse ? r.x()-2 : r.x()) + itemFrame, r.y() + 1, maxpmw -1 , r.height() - 2 ), r ); QIconSet::Mode mode; // Select the correct icon from the iconset QPixmap pixmap; if(KApplicationMode) { if (active) mode = enabled ? QIconSet::Active : QIconSet::Disabled; else mode = enabled ? QIconSet::Normal : QIconSet::Disabled; pixmap = mi->iconSet()->pixmap(QIconSet::Small, mode); } else { pixmap = mi->iconSet()->pixmap(QIconSet::Small, active ? QIconSet::Active : QIconSet::Normal); if(!enabled) pixmap = disableIcon(&pixmap); } if(checked && !reverse) cr.setX(cr.x()+cmwidth); p->drawPixmap( cr.x(), cr.y(), pixmap ); } // Time to draw the menu item label... int xm = itemFrame + maxpmw; // X position margin if(_indentPopupMenuItems) xm += cmwidth; int xp = reverse ? // X position r.x() + tab+ itemFrame*2 + itemHMargin + maxpmw +cmwidth + (_indentPopupMenuItems ? 16 : 0) - xm: r.x() + xm; // Label width (minus the width of the accelerator portion) int tw = r.width() - xm - tab - arrowHMargin - itemHMargin * 3 - itemFrame + 1; // Set the color for enabled and disabled text // (used for both active and inactive menu items) p->setPen( enabled ? cg.buttonText() : cg.mid() ); // This color will be used instead of the above if the menu item // is active and disabled at the same time. (etched text) QColor discol = cg.mid(); // Does the menu item draw it's own label? if(mi->custom()) { int m = 2; // Save the painter state in case the custom // paint method changes it in some way mi->custom()->paint( p, cg, active, enabled, xp, r.y()+m, tw, r.height()-2*m ); } else { // The menu item doesn't draw it's own label QString s = mi->text(); // Does the menu item have a text label? if ( !s.isNull() ) { int t = s.find( '\t' ); int m = 2; int text_flags = AlignVCenter | ShowPrefix | DontClip | SingleLine; text_flags |= reverse ? AlignRight : AlignLeft; QColor draw = (active && enabled) ? cg.highlightedText() : cg.foreground(); p->setPen(draw); // Does the menu item have a tabstop? (for the accelerator text) if ( t >= 0 ) { int arrowMargin = (mi->popup() || _indentPopupMenuItems ) ? itemHMargin + arrowHMargin : 0; int tabx = reverse ? r.x() + arrowMargin + itemFrame : r.x() + r.width() - tab - arrowMargin- itemFrame; // Draw the right part of the label (accelerator text) //p->drawText( tabx, r.y()+m, tab, r.height()-2*m, text_flags, s.mid( t+1 ) ); dominoDrawItem( p, QRect(tabx, r.y()+m, tab, r.height()-2*m), text_flags, cg, flags & Style_Enabled, 0, s.mid( t+1 ), -1, &draw); s = s.left( t ); } // Draw the left part of the label (or the whole label // if there's no accelerator) //p->drawText( xp, r.y()+m, tw, r.height()-2*m, text_flags, s, t ); dominoDrawItem( p, QRect(xp, r.y()+m, tw, r.height()-2*m), text_flags, cg, flags & Style_Enabled, 0, s, t, &draw); p->setPen(cg.text()); } // The menu item doesn't have a text label // Check if it has a pixmap instead else if ( mi->pixmap() ) { QPixmap *pixmap = mi->pixmap(); // Draw the pixmap if ( pixmap->depth() == 1 ) p->setBackgroundMode( OpaqueMode ); int diffw = ( ( r.width() - pixmap->width() ) / 2 ) + ( ( r.width() - pixmap->width() ) % 2 ); p->drawPixmap( r.x()+diffw, r.y()+1, *pixmap ); if ( pixmap->depth() == 1 ) p->setBackgroundMode( TransparentMode ); } } // Does the menu item have a submenu? if ( mi->popup() ) { PrimitiveElement arrow = reverse ? PE_ArrowLeft : PE_ArrowRight; int dim = pixelMetric(PM_MenuButtonIndicator) - 1; QRect vr = visualRect( QRect( r.x() + r.width() - 5 - 1 - dim, r.y() + r.height() / 2 - dim / 2, dim, dim), r ); TextEffect textEffectMode_save = textEffectSettings.mode; if(textEffectSettings.mode == TextEffect_OnlyButton) textEffectSettings.mode = TextEffect_None; if(enabled) { p->setPen(active? cg.highlightedText(): cg.foreground()); drawPrimitive( arrow, p, vr, cg, Style_Enabled); } else { p->setPen(cg.mid()); drawPrimitive( arrow, p, vr, cg, Style_Default); } textEffectSettings.mode = textEffectMode_save; } break; } case CE_ToolBoxTab: { bool selected= (flags & Style_Selected && ((QToolBox*)widget)->currentItem()); QPixmap pix(widget->size()); QPainter painter(&pix); QColor background = (flags&Style_Down && !selected) ? darkenColor(cg.background(), 15) : cg.background(); painter.fillRect(QRect(5, 0, r.width()-10, r.height()), background); renderGradient(&painter, QRect(r.x(), r.y(), 5, r.height()), background.light(120), background, false); renderGradient(&painter, QRect(r.width()-5, r.y(), 5, r.height()), background, background.light(115), false); painter.setPen(cg.background().dark(120)); painter.drawLine(r.x(), r.bottom(), r.width(), r.bottom()); painter.setPen((hoveredToolBoxTab && !selected) ? dGetColor(cg.background(), 95) : dGetColor(cg.background(), 45)); PrimitiveElement arrow; QRect re = QRect(r.x()+6,r.y(),r.x()+10,r.height()); if(selected) { arrow = PE_ArrowDown; re.setY(re.y()+1); } else { arrow = PE_ArrowRight; } drawPrimitive(arrow, &painter, re, cg, Style_Enabled); p->drawPixmap(r.x(), r.y(), pix); break; } case CE_HeaderLabel: { QRect rect = r; const QHeader* header = (const QHeader *) widget; int section = opt.headerSection(); QIconSet* icon = header->iconSet( section ); if ( icon ) { QPixmap pixmap = icon->pixmap( QIconSet::Small, flags & Style_Enabled ? QIconSet::Normal : QIconSet::Disabled ); int pixw = pixmap.width(); int pixh = pixmap.height(); // "pixh - 1" because of tricky integer division QRect pixRect = rect; pixRect.setY( rect.center().y() - (pixh - 1) / 2 ); drawItem ( p, pixRect, AlignVCenter, cg, flags & Style_Enabled, &pixmap, QString::null ); if (QApplication::reverseLayout()) rect.setRight(rect.right() - pixw - 2); else rect.setLeft(rect.left() + pixw + 2); } if (rect.isValid()) dominoDrawItem ( p, rect, AlignVCenter, cg, flags & Style_Enabled, 0, header->label( section ), -1, &(cg.buttonText()), textEffectSettings.mode > 0 ? 1 : 0 ); break; } default: KStyle::drawControl(element, p, widget, r, cg, flags, opt); } } void DominoStyle::drawControlMask(ControlElement element, QPainter *p, const QWidget *w, const QRect &r, const QStyleOption &opt) const { switch (element) { case CE_PushButton: { break; } case CE_CheckBox: { drawPrimitive(PE_IndicatorMask, p, r, w->colorGroup(), Style_Default, opt); break; } case CE_RadioButton : { drawPrimitive(PE_ExclusiveIndicatorMask, p, r, w->colorGroup(), Style_Default, opt); break; } default: { break; //KStyle::drawControlMask (element, p, w, r, opt); } } } void DominoStyle::drawComplexControl(ComplexControl control, QPainter *p, const QWidget *widget, const QRect &r, const QColorGroup &cg, SFlags flags, SCFlags controls, SCFlags active, const QStyleOption& opt) const { const bool reverseLayout = QApplication::reverseLayout(); const bool enabled = (flags & Style_Enabled); //return KStyle::drawComplexControl(control, p, widget, r, cg, flags, controls, active, opt); switch(control) { // COMBOBOX // -------- case CC_ComboBox: { static const unsigned int handleWidth = 15; const QComboBox *cb = dynamic_cast(widget); bool editable = cb && cb->editable(); bool isDown = cb && cb->listBox() && cb->listBox()->isVisible(); bool hasFocus =(flags&Style_HasFocus); const QColor inputColor = enabled ? (editable ? cg.base() : cg.button()) : cg.background(); const QColor bg = (cb && cb->parentWidget()) ? cb->parentWidget()->paletteBackgroundColor() : cg.background(); bool hasPixmap = cb && cb->count() > 0 && cb->pixmap(cb->currentItem()); uint contourFlags = 0; bool isKhtmlWidget = khtmlWidgets.contains(cb); if(isKhtmlWidget || (cb && cb->parentWidget() && cb->parentWidget()->paletteBackgroundPixmap())) { contourFlags |= Draw_AlphaBlend; buttonContour->setAlphaMode(); } else { p->fillRect(QRect(r.x(), r.y(), 6, r.height()), bg); p->fillRect(QRect(r.width()-6, r.y(), 6, r.height()), bg); } if(hasPixmap && editable && r.width() > 40) { int x = reverseLayout ? handleWidth+3 : 6; QRegion mask(x, 0, 17, r.height()); if(!reverseLayout) mask += QRegion(x-2, 4, 2, r.height()-9); p->setClipRegion(mask); } contourFlags |= Round_UpperLeft|Round_BottomLeft|Round_UpperRight|Round_BottomRight|Draw_Right|Draw_Top| Draw_Bottom|Draw_Left|Is_Button|Is_Horizontal; uint surfaceFlags = Is_Button|Is_Horizontal; if(isDown) { surfaceFlags |= Is_Down; contourFlags |= Is_Down; } renderSurface(p, QRect(r.left()+2, r.top()+2, r.width()-4, r.height()-5), cg.background(), cg.button(), cg.background(), surfaceFlags); if(isDown) buttonContour->setState(Contour_Pressed); else if(enabled && cb == hoverWidget) buttonContour->setState(Contour_MouseOver); renderContour(p, r, bg, cg.button(), contourFlags); if(editable) { QColor lineEditColor = enabled ? cg.base() : cg.background(); QString isEnabled = enabled ? "1" : "0"; QPixmap* lineEditBtnEdges; // shared with spinwidget if(!(lineEditBtnEdges = QPixmapCache::find(QString::number(cg.button().pixel(), 16)+QString::number(lineEditColor.pixel(), 16)+"lineEditBtnEdges"+isEnabled))) { // + buttoncolor // To not make the button contour appear thicker with dark button gradiens, we need a tad smaller rounding for the lineEdit edges. QPixmap pixmap(1, r.height()); QPainter painter(&pixmap); flatMode = true; renderSurface(&painter, QRect(0, 0, 1, r.height()), cg.background(), cg.button(), cg.background(), surfaceFlags); flatMode = false; QImage img = pixmap.convertToImage(); // Test, if we have a dark button. Not accurate, but... QColor c1 = QColor(img.pixel(0, r.y()+4)); QColor c2 = QColor(img.pixel(0, r.height()-6)); int v, v1, v2; c1.getHsv(&v, &v ,&v1); c2.getHsv(&v, &v ,&v2); QImage edges = tintImage(qembed_findImage( (v1+v2)/2 < 200 ? "lineEditBtnEdges-d" : "lineEditBtnEdges"), lineEditColor); if(enabled) { QImage shadow = qembed_findImage("lineEditBtnShadow"); blend(shadow, edges, edges); } lineEditBtnEdges = new QPixmap(edges); QPixmapCache::insert(QString::number(cg.button().pixel(), 16)+QString::number(lineEditColor.pixel(), 16)+"lineEditBtnEdges"+isEnabled, lineEditBtnEdges); } if(reverseLayout) { bitBlt(p->device(), r.width()-6, r.y()+3, lineEditBtnEdges, 3, 0, 3, 3); bitBlt(p->device(), r.width()-6, r.height()-7, lineEditBtnEdges, 3, 3, 3, 3); } else { bitBlt(p->device(), r.x()+3, r.y()+3, lineEditBtnEdges, 0, 0, 3, 3); bitBlt(p->device(), r.x()+3, r.height()-7, lineEditBtnEdges, 0, 3, 3, 3); } } QRect ar(reverseLayout ? r.left()+3 : r.width()-handleWidth-1, r.height()/2-2, handleWidth, 6); if(hasFocus && focusIndicatorSettings.indicateFocus && enabled && cb) { QRect editField = querySubControlMetrics(control, widget, SC_ComboBoxEditField); int pw = hasPixmap ? (cb->pixmap(cb->currentItem()))->width()+2 : 0; if(!editable) { int fmheight = p->fontMetrics().height(); if(reverseLayout) editField.addCoords(pw+17, editField.height()/2-fmheight/2-1,0 , 0); else editField.addCoords(2+pw, editField.height()/2-fmheight/2-1,0 , 0); QRect re = focusIndicatorSettings.drawUnderline ? subRect(SR_ComboBoxFocusRect, cb) : editField; drawFocusIndicator(p, re, AlignLeft, cg, true, 0, cb->currentText(), -1, focusIndicatorSettings.buttonColor, focusIndicatorSettings.drawUnderline, true); } } if(isDown) { uint shadowFlags = Draw_Top|Draw_Right|Draw_Bottom|Draw_Left; QRect sr; if(editable) { shadowFlags |= reverseLayout? Round_UpperLeft|Round_BottomLeft|Rectangular_UpperRight|Rectangular_BottomRight : Rectangular_UpperLeft|Rectangular_BottomLeft|Round_UpperRight|Round_BottomRight; sr = QRect(reverseLayout ? r.left()+2 : r.width()-handleWidth-3, r.y()+2, handleWidth+3, r.height()-3); } else { shadowFlags |= Round_UpperLeft|Round_BottomLeft|Round_UpperRight|Round_BottomRight; sr = QRect(r.x()+2, r.y()+2, r.width()-2, r.height()-3); } renderButtonShadow(p, sr, shadowFlags); } buttonContour->reset(); p->setPen(cb ? cb->palette().active().buttonText() : qApp->palette().active().buttonText()); uint aflags = Style_Default|Style_Raised; if(enabled) aflags |= Style_Enabled; drawPrimitive(PE_ArrowDown, p, ar, cg, aflags); p->setPen(cg.foreground()); break; } // TOOLBUTTON // ---------- case CC_ToolButton: { QToolButton *tb = (QToolButton *) widget; if(_toolBtnAsBtn && ::qt_cast(tb)) { const bool reverse = QApplication::reverseLayout(); KToolBar *bar = dynamic_cast(tb->parentWidget()); if(!bar) break; KToolBarButton* btn = ::qt_cast(tb); KToolBarButton* prevBtn = 0; KToolBarButton* nextBtn = 0; bool prevBtnIsOn = false; bool nextBtnIsOn = false; bool isOn = flags &Style_On || flags &Style_Down; bool isDown = flags &Style_Down; const bool horizontal = bar->orientation() == Qt::Horizontal; QRect cr = r , sr = r, bsr = r; int index = bar->itemIndex(btn->id()); if(bar->getButton(bar->idAt(index-1))) { prevBtn = bar->getButton(bar->idAt(index-1)); if((!reverse) ? (horizontal) ? prevBtn->x() + prevBtn->width() != btn->x() : prevBtn->y() + prevBtn->height() != btn->y() : (horizontal) ? prevBtn->x() != btn->x()+btn->width() : prevBtn->y() + prevBtn->height() != btn->y() ) prevBtn = 0; else prevBtnIsOn = prevBtn->isOn(); } if(bar->getButton(bar->idAt(index+1))) { nextBtn= bar->getButton(bar->idAt(index+1)); if((!reverse) ? (horizontal) ? nextBtn->x() != btn->x() + btn->width() : nextBtn->y() != btn->y() + btn->height() : (horizontal) ? nextBtn->x() + nextBtn->width() != btn->x() : nextBtn->y() != btn->y() + btn->height() ) nextBtn = 0; else nextBtnIsOn = nextBtn->isOn(); } bool drawSeparator = false; uint contourFlags = Is_Button; uint surfaceFlags = Is_Button; if(horizontal) { surfaceFlags |=Is_Horizontal; contourFlags |=Is_Horizontal; } if(isOn) { surfaceFlags |= Is_Down; contourFlags |= Is_Down; } QPixmap buffer(btn->size()); QPainter painter(&buffer); if(tb->parentWidget() && tb->parentWidget()->paletteBackgroundPixmap()) { painter.drawTiledPixmap(0, 0, tb->width(), tb->height(), *tb->parentWidget()->paletteBackgroundPixmap(), tb->geometry().x(), tb->geometry().y()); contourFlags |= Draw_AlphaBlend; } else painter.fillRect(buffer.rect(), cg.brush(QColorGroup::Background)); if(prevBtn) { if(nextBtn) { // middle if(horizontal) { contourFlags |= Draw_Top|Draw_Bottom; cr.setLeft(r.left()-6); cr.setWidth(r.width()+12); bsr.setLeft(r.left()-2); bsr.setWidth(r.width()+3); sr.addCoords(-1, 2, 0, -3); drawSeparator = true; } else { contourFlags |= Draw_Left|Draw_Right; cr.setY(r.y()-6); cr.setHeight(r.height()+13); bsr.addCoords(2, 0, 0, 1); sr.addCoords(2, -1, -2, 0); drawSeparator = true; } } else { // right / bottom if(!horizontal) { contourFlags |= Draw_Bottom|Draw_Right|Draw_Left|Round_BottomRight|Round_BottomLeft; cr.setY(r.y()-6); cr.setHeight(r.height()+6); bsr.addCoords(2, 0, 0, -1); sr.addCoords(2, -1, -2, -3); } else if(!reverse) { contourFlags |= Draw_Top|Draw_Bottom|Draw_Right|Round_UpperRight|Round_BottomRight; cr.setLeft(r.left()-6); cr.setWidth(r.width()+5); bsr.setLeft(r.left()-2); bsr.setWidth(r.width()+1); sr.addCoords(-1, 2, -3, -3); } else { // reverse contourFlags |= Draw_Top|Draw_Bottom|Draw_Left|Round_UpperLeft|Round_BottomLeft; cr.setWidth(r.width()+6); bsr.setWidth(r.width()+1); sr.addCoords(2, 2, 0, -3); drawSeparator = true; } } } else { if(nextBtn) { // left / top if(!horizontal) { contourFlags |= Draw_Top|Draw_Left|Draw_Right|Round_UpperLeft|Round_UpperRight; cr.setHeight(r.height()+7); bsr.addCoords(2, 2, 0, +1); sr.addCoords(2, 2, -2, 0); drawSeparator = true; } else if(!reverse) { contourFlags |= Draw_Top|Draw_Bottom|Draw_Left|Round_UpperLeft|Round_BottomLeft; cr.setWidth(r.width()+6); bsr.setWidth(r.width()+1); sr.addCoords(2, 2, 0, -3); drawSeparator = true; } else { //reverse contourFlags |= Draw_Top|Draw_Bottom|Draw_Right|Round_UpperRight|Round_BottomRight; cr.setLeft(r.left()-6); cr.setWidth(r.width()+5); bsr.setLeft(r.left()-2); bsr.setWidth(r.width()+1); sr.addCoords(-1, 2, -3, -3); } } else { // full if(horizontal) { cr.setWidth(r.width()-1); bsr.setWidth(r.width()-1); sr.addCoords(2, 2, -3, -3); } else { bsr.addCoords(2, 2, 0, -1); sr.addCoords(2, 2, -2, -3); } contourFlags |= Draw_Top|Draw_Bottom|Draw_Left|Draw_Right|Round_UpperLeft|Round_BottomLeft| Round_UpperRight|Round_BottomRight; } } renderSurface(&painter, sr, cg.background(), cg.background(), cg.background(), surfaceFlags); drawControl(CE_ToolButtonLabel, &painter, widget, r, cg, flags,opt); renderContour(&painter, cr, cg.background(), cg.background(), contourFlags); /////////////////////////////////////////// drop down indicator if(tb->popup()) { QString isEnabled = enabled ? "1" : "0"; QPixmap* arrow; QColor color = btn->palette().active().buttonText(); if(!(arrow = QPixmapCache::find(QString::number(color.pixel(), 16)+"arrow_down"+isEnabled))) { QImage ar = tintImage(qembed_findImage("arrow_down"), color); if(!isEnabled) { ar = setImageOpacity(ar, 25); } arrow = new QPixmap(ar); QPixmapCache::insert(QString::number(color.pixel(), 16)+"arrow_down"+isEnabled, arrow); } QPoint point; if(prevBtn) if(nextBtn) if(horizontal) point = QPoint(cr.width()-19, cr.bottom()-8); else point = QPoint(cr.width()-8, cr.bottom()-12); else if(!horizontal) point = QPoint(cr.width()-8, cr.bottom()-8); else if(!reverse) point = QPoint(cr.width()-15, cr.bottom()-8); else // reverse point = QPoint(cr.width()-13, cr.bottom()-8); else if(nextBtn) if(!horizontal) point = QPoint(cr.width()-8, cr.bottom()-12); else if(!reverse) point = QPoint(cr.width()-13, cr.bottom()-8); else //reverse point = QPoint(cr.width()-15, cr.bottom()-8); else if(horizontal) point = QPoint(cr.width()-9, cr.bottom()-8); else point = QPoint(cr.width()-8, cr.bottom()-8); bitBlt(&buffer, point.x(), point.y(), arrow); } /////////////////////////////////////////// separator if(drawSeparator) { // on the right side of the button ContourState cState; if(reverse && horizontal) { if( ((enabled && !isDown) || (prevBtn && prevBtn == hoverWidget)) && (hoverWidget && (tb == hoverWidget || (prevBtn == hoverWidget && prevBtn->isEnabled() && !prevBtn->isDown()))) ) cState = Contour_MouseOver; else if(isDown || (prevBtn && prevBtn->isDown())) cState = Contour_Pressed; else cState = Contour_Default; } else { if( ((enabled && !isDown) || (nextBtn &&nextBtn == hoverWidget)) && (hoverWidget && (tb == hoverWidget || (nextBtn == hoverWidget && nextBtn->isEnabled() && !nextBtn->isDown()))) ) cState = Contour_MouseOver; else if(isDown || (nextBtn && nextBtn->isDown())) cState = Contour_Pressed; else cState = Contour_Default; } painter.setPen(alphaBlendColors(buttonContour->contourColor(cState), cg.background(), 218)); if(horizontal) painter.drawLine(r.width()-1, r.top()+1, r.width()-1, r.bottom()-2); else painter.drawLine(r.x()+1, r.bottom(), r.width()-2, r.bottom()); } /////////////////////////////////////////// button shadow if(isOn && buttonContour->drawButtonSunkenShadow) { uint shadowFlags; if(prevBtnIsOn) { // or above is on if(nextBtnIsOn) { // or below is on if(horizontal) { shadowFlags = Draw_Top|Draw_Bottom; bsr.addCoords(-3, 2, +5, -1); } else { shadowFlags = Draw_Left|Draw_Right; bsr.addCoords(0, -5, 0, +4); } } else { if(horizontal) { if(!reverse) { shadowFlags = Draw_Top|Draw_Bottom|Draw_Right; shadowFlags |= contourFlags& Round_UpperRight ? Round_UpperRight : Rectangular_UpperRight; shadowFlags |= contourFlags& Round_BottomRight ? Round_BottomRight : Rectangular_BottomRight; bsr.addCoords(-3, 2, 0, -1); } else { shadowFlags = Draw_Top|Draw_Bottom|Draw_Left; shadowFlags |= contourFlags& Round_UpperLeft ? Round_UpperLeft : Rectangular_UpperLeft; shadowFlags |= contourFlags& Round_BottomLeft ? Round_BottomLeft : Rectangular_BottomLeft; bsr.addCoords(2, 2, 5, -1); } } else { shadowFlags = Draw_Bottom|Draw_Left|Draw_Right; shadowFlags |= contourFlags& Round_BottomLeft ? Round_BottomLeft : Rectangular_BottomLeft; shadowFlags |= contourFlags& Round_BottomRight ? Round_BottomRight : Rectangular_BottomRight; bsr.setY(bsr.y()-5); } } } else if(nextBtnIsOn) { if(horizontal) { if(!reverse) { shadowFlags = Draw_Top|Draw_Bottom|Draw_Left; shadowFlags |= (contourFlags& Round_UpperLeft) ? Round_UpperLeft : Rectangular_UpperLeft; shadowFlags |= (contourFlags& Round_BottomLeft) ? Round_BottomLeft : Rectangular_BottomLeft; bsr.addCoords(2, 2, 5, -1); } else { shadowFlags = Draw_Top|Draw_Bottom|Draw_Right; shadowFlags |= contourFlags& Round_UpperRight ? Round_UpperRight : Rectangular_UpperRight; shadowFlags |= contourFlags& Round_BottomRight ? Round_BottomRight : Rectangular_BottomRight; bsr.addCoords(-3, 2, 0, -1); } } else { shadowFlags = Draw_Top|Draw_Left|Draw_Right; shadowFlags |= contourFlags& Round_UpperLeft ? Round_UpperLeft : Rectangular_UpperLeft; shadowFlags |= contourFlags& Round_UpperRight ? Round_UpperRight : Rectangular_UpperRight; bsr.setHeight(bsr.height()+4); } } else { if(horizontal) { shadowFlags = Draw_Top|Draw_Bottom|Draw_Left|Draw_Right; shadowFlags |= contourFlags& Round_UpperLeft ? Round_UpperLeft : Rectangular_UpperLeft; shadowFlags |= contourFlags& Round_UpperRight ? Round_UpperRight : Rectangular_UpperRight; shadowFlags |= contourFlags& Round_BottomRight ? Round_BottomRight : Rectangular_BottomRight; shadowFlags |= contourFlags& Round_BottomLeft ? Round_BottomLeft : Rectangular_BottomLeft; bsr.addCoords(2, 2, 0, -1); } else { shadowFlags = Draw_Top|Draw_Bottom|Draw_Left|Draw_Right; shadowFlags |= contourFlags& Round_UpperLeft ? Round_UpperLeft : Rectangular_UpperLeft; shadowFlags |= contourFlags& Round_UpperRight ? Round_UpperRight : Rectangular_UpperRight; shadowFlags |= contourFlags& Round_BottomRight ? Round_BottomRight : Rectangular_BottomRight; shadowFlags |= contourFlags& Round_BottomLeft ? Round_BottomLeft : Rectangular_BottomLeft; } } renderButtonShadow(&painter, bsr, shadowFlags); } btn->setUpdatesEnabled(false); btn->setErasePixmap(buffer); btn->setUpdatesEnabled(true); btn->erase(); } else if(_toolBtnAsBtn) { // not a KToolBarButton if(kickerMode && !(flags&(Style_Raised))) break; const QRect br = querySubControlMetrics(control, widget, SC_ToolButton, opt); if(br.width() < 16 || br.height()< 16) break; QColorGroup g = widget->colorGroup(); QColor bg; if(widget->parentWidget() && widget->paletteBackgroundColor() != widget->parentWidget()->paletteBackgroundColor()) { bg = widget->parentWidget()->paletteBackgroundColor(); g.setColor(QColorGroup::Background, bg); } else bg = widget->paletteBackgroundColor(); if(!widget->paletteBackgroundPixmap()) { p->fillRect(QRect(br.x(), br.y(), 6, 6), bg); p->fillRect(QRect(br.width()-6, br.y(), 6, 6), bg); p->fillRect(QRect(br.width()-6, br.height()-7, 6, 7), bg); p->fillRect(QRect(br.x(), br.height()-7, 6, 7), bg); } else { buttonContour->setAlphaMode(); } if(/*flags &Style_On || */flags &Style_Down) buttonContour->setState(Contour_Pressed); if(enabled && tb == hoverWidget) buttonContour->setState(Contour_MouseOver); else if(flags & Style_Default) buttonContour->setState(Contour_DefaultButton); renderButton(p, br, g, (flags & Style_On || flags & Style_Down), flags & Style_MouseOver, true, enabled, khtmlWidgets.contains(opt.widget()) ); buttonContour->reset(); if(tb->popup()) { QString isEnabled = enabled ? "1" : "0"; QPixmap* arrow; QColor color = tb->palette().active().buttonText(); if(!(arrow = QPixmapCache::find(QString::number(color.pixel(), 16)+"arrow_down"+isEnabled))) { QImage ar = tintImage(qembed_findImage("arrow_down"), color); if(!isEnabled) { ar = setImageOpacity(ar, 25); } arrow = new QPixmap(ar); QPixmapCache::insert(QString::number(color.pixel(), 16)+"arrow_down"+isEnabled, arrow); } bitBlt(p->device(), r.width()-8, r.bottom()-8, arrow); } } else { bool isKbtn = ::qt_cast(tb); QPixmap buffer(tb->size()); QPainter painter(&buffer); QColor bg = cg.background(); if(tb->parentWidget() && tb->parentWidget()->paletteBackgroundPixmap()) { painter.drawTiledPixmap(0, 0, tb->width(), tb->height(), *tb->parentWidget()->paletteBackgroundPixmap(), tb->geometry().x(), tb->geometry().y()); } else if(tb->parentWidget() && widget->paletteBackgroundColor() != widget->parentWidget()->paletteBackgroundColor()) { bg = widget->parentWidget()->paletteBackgroundColor(); painter.fillRect(buffer.rect(), bg); } else painter.fillRect(buffer.rect(), cg.brush(QColorGroup::Background)); QRect fr = QRect(1, 1, r.width()-2, r.height()-2); bool isOn = flags &Style_On; if(isOn) { QRegion reg(fr.x()+2, fr.y()+1, fr.width()-4, fr.height()-2); reg += QRegion(fr.x()+1, fr.y()+2, fr.width()-2, fr.height()-4); painter.setClipRegion(reg); painter.fillRect(r, alphaBlendColors(black, bg, 15)); painter.setClipping(false); } if(isKbtn) drawControl(CE_ToolButtonLabel, &painter, widget, r, cg, flags,opt); if(isOn) { QColor color = buttonContour->contourColor(Contour_Default); QPixmap* frame; if(!(frame = QPixmapCache::find(QString::number(color.pixel(), 16)+"toolBtnFrameThin"))) { frame = new QPixmap(tintImage(qembed_findImage("toolBtnFrameThin"), color)); QPixmapCache::insert(QString::number(color.pixel(), 16)+"toolBtnFrameThin", frame); } bitBlt(&buffer, fr.x(), fr.y(), frame, 0, 0, 4, 4); bitBlt(&buffer, fr.width()-3, fr.y(), frame, 4, 0, 4, 4); bitBlt(&buffer, fr.x(), fr.height()-3, frame, 0, 4, 4, 4); bitBlt(&buffer, fr.width()-3, fr.height()-3, frame, 4, 4, 4, 4); painter.setPen(alphaBlendColors(color, bg, 195)); painter.drawLine(fr.x()+4, fr.y(), fr.width()-4, fr.y()); painter.drawLine(fr.x(), fr.y()+4, fr.x(), fr.height()-4); painter.drawLine(fr.width(), fr.y()+4, fr.width(), fr.height()-4); painter.drawLine(fr.x()+4, fr.height(), fr.width()-4, fr.height()); } if(tb->popup() && (!tb->iconSet().isNull() || tb->text() || tb->pixmap())) { QString isEnabled = enabled ? "1" : "0"; QPixmap* arrow; QColor color = tb->palette().active().buttonText(); if(!(arrow = QPixmapCache::find(QString::number(color.pixel(), 16)+"arrow_down"+isEnabled))) { QImage ar = tintImage(qembed_findImage("arrow_down"), color); if(!isEnabled) { ar = setImageOpacity(ar, 25); } arrow = new QPixmap(ar); QPixmapCache::insert(QString::number(color.pixel(), 16)+"arrow_down"+isEnabled, arrow); } bitBlt(&buffer, r.width()-8, r.bottom()-4, arrow); } if(isKbtn) { tb->setUpdatesEnabled(false); tb->setErasePixmap(buffer); tb->erase(); tb->setUpdatesEnabled(true); } else p->drawPixmap(0, 0, buffer); } p->setPen(cg.buttonText() ); break; } // SPINWIDGETS // ----------- case CC_SpinWidget: { if(active == SC_SpinWidgetUp || active == SC_SpinWidgetDown) break; static const unsigned int handleWidth = 15; const QSpinWidget *sw = dynamic_cast(widget); const QColor bg = cg.background(); SFlags sflags = flags; PrimitiveElement pe; bool enabled = sw && sw->isEnabled(); const QColor buttonColor = enabled ? cg.button() : cg.background(); uint contourFlags = Round_UpperLeft|Round_BottomLeft|Round_UpperRight|Round_BottomRight|Draw_Right|Draw_Top| Draw_Bottom|Draw_Left|Is_Button|Is_Horizontal; // fill edges if(sw && !sw->paletteBackgroundPixmap()) { p->fillRect(QRect(r.x(), r.y(), 6, r.height()), bg); p->fillRect(QRect(r.width()-6, r.y(), 6, r.height()), bg); } else { contourFlags |= Draw_AlphaBlend; buttonContour->setAlphaMode(); } uint surfaceFlags = Is_Button|Is_Horizontal; if(flags& Style_Down) { surfaceFlags |= Is_Down; contourFlags |= Is_Down; } renderSurface(p, QRect(r.x()+2, r.y()+2, r.width()-4, r.height()-5), cg.background(), cg.button(), cg.button(), surfaceFlags); if(flags & Style_Down) buttonContour->setState(Contour_Pressed); else if(enabled && sw == hoverWidget) buttonContour->setState(Contour_MouseOver); renderContour(p, r, cg.background(), cg.button(), contourFlags); if(flags & Style_Down) renderButtonShadow(p, QRect(r.x()+2, r.y()+2, r.width()-2, r.height()-3), contourFlags); buttonContour->reset(); // QColor lineEditColor = enabled ? cg.base() : cg.background(); QColor lineEditColor = enabled ? cg.base() : dynamic_cast(sw->parentWidget()) ? ((DominoQSpinBox*)sw->parentWidget())->editor()->palette().active().background(): qApp->palette().active().background(); QString isEnabled = enabled ? "1" : "0"; QPixmap* lineEditBtnEdges; if(!(lineEditBtnEdges = QPixmapCache::find(QString::number(cg.button().pixel(), 16)+QString::number(lineEditColor.pixel(), 16)+"lineEditBtnEdges"+isEnabled))) { // To not make the button contour appear thicker with dark button gradiens, we need a tad smaller rounding for the lineEdit edges. QPixmap pixmap(1, r.height()); QPainter painter(&pixmap); flatMode = true; renderSurface(&painter, QRect(0, 0, 1, r.height()), cg.background(), cg.button(), cg.button(), surfaceFlags); flatMode = false; QImage img = pixmap.convertToImage(); // Test, if we have a dark button. Not accurate, but... QColor c1 = QColor(img.pixel(0, r.y()+4)); QColor c2 = QColor(img.pixel(0, r.height()-6)); int v, v1, v2; c1.getHsv(&v, &v ,&v1); c2.getHsv(&v, &v ,&v2); QImage edges = tintImage(qembed_findImage( (v1+v2)/2 < 127 ? "lineEditBtnEdges-d" : "lineEditBtnEdges"), lineEditColor); if(enabled) { QImage shadow = qembed_findImage("lineEditBtnShadow"); blend(shadow, edges, edges); } lineEditBtnEdges = new QPixmap(edges); QPixmapCache::insert(QString::number(cg.button().pixel(), 16)+QString::number(lineEditColor.pixel(), 16)+"lineEditBtnEdges"+isEnabled, lineEditBtnEdges); } if(reverseLayout) { bitBlt(p->device(), r.width()-6, r.y()+3, lineEditBtnEdges, 3, 0, 3, 3); bitBlt(p->device(), r.width()-6, r.height()-7, lineEditBtnEdges, 3, 3, 3, 3); } else { bitBlt(p->device(), r.x()+3, r.y()+3, lineEditBtnEdges, 0, 0, 3, 3); bitBlt(p->device(), r.x()+3, r.height()-7, lineEditBtnEdges, 0, 3, 3, 3); } QRect upRect = QRect(reverseLayout ? r.left()+2 : r.right()-handleWidth-1, r.height()/2-7, handleWidth, 6); QRect downRect = QRect(reverseLayout ? r.left()+2 : r.right()-handleWidth-1, r.height()/2+1, handleWidth, 6); // icons... //p->setPen(cg.foreground()); p->setPen(sw ? sw->palette().active().buttonText() : qApp->palette().active().buttonText()); sflags = Style_Default; if(enabled) sflags |= Style_Enabled; if (active == SC_SpinWidgetUp) { sflags |= Style_On; sflags |= Style_Sunken; } else sflags |= Style_Raised; if (sw->buttonSymbols() == QSpinWidget::PlusMinus) { pe = PE_SpinWidgetPlus; upRect.moveTop(upRect.y()+1); } else pe = PE_SpinWidgetUp; drawPrimitive(pe, p, upRect, cg, sflags); sflags = Style_Default; if(enabled) sflags |= Style_Enabled; if (active == SC_SpinWidgetDown) { sflags |= Style_On; sflags |= Style_Sunken; } else sflags |= Style_Raised; if (sw->buttonSymbols() == QSpinWidget::PlusMinus) pe = PE_SpinWidgetMinus; else pe = PE_SpinWidgetDown; drawPrimitive(pe, p, downRect, cg, sflags); break; } case CC_ScrollBar: { // TODO: find a way to draw pressed buttons const QScrollBar *sb = (const QScrollBar*)widget; bool maxedOut = (sb->minValue() == sb->maxValue()); bool horizontal = (sb->orientation() == Qt::Horizontal); SFlags sflags = ((horizontal ? Style_Horizontal : Style_Default) | (maxedOut ? Style_Default : Style_Enabled)); QRect addline, subline, subline2, addpage, subpage, slider, first, last; subline = querySubControlMetrics(control, widget, SC_ScrollBarSubLine, opt); addline = querySubControlMetrics(control, widget, SC_ScrollBarAddLine, opt); subpage = querySubControlMetrics(control, widget, SC_ScrollBarSubPage, opt); addpage = querySubControlMetrics(control, widget, SC_ScrollBarAddPage, opt); slider = querySubControlMetrics(control, widget, SC_ScrollBarSlider, opt); // first = querySubControlMetrics(control, widget, SC_ScrollBarFirst, opt); // last = querySubControlMetrics(control, widget, SC_ScrollBarLast, opt); // subline2 = addline; // if (horizontal) // subline2.moveBy(-addline.width(), 0); // else // subline2.moveBy(0, -addline.height()); // Draw the up/left button set if ((controls & SC_ScrollBarSubLine) && subline.isValid()) { drawPrimitive(PE_ScrollBarSubLine, p, subline, cg, sflags | (active == SC_ScrollBarSubLine ? Style_Down : Style_Default)); subline2 = addline; if (horizontal) subline2.moveBy(-addline.width(), 0); else subline2.moveBy(0, -addline.height()); if (subline2.isValid()) drawPrimitive((QStyle::PrimitiveElement)PE_ScrollBarSubLine2, p, subline2, cg, sflags | (active == SC_ScrollBarSubLine ? Style_Down : Style_Default)); } if ((controls & SC_ScrollBarAddLine) && addline.isValid()) drawPrimitive(PE_ScrollBarAddLine, p, addline, cg, sflags | ((active == SC_ScrollBarAddLine) ? Style_Down : Style_Default)); if ((controls & SC_ScrollBarSubPage) && subpage.isValid()) drawPrimitive(PE_ScrollBarSubPage, p, subpage, cg, sflags | ((active == SC_ScrollBarSubPage) ? Style_Down : Style_Default)); if ((controls & SC_ScrollBarAddPage) && addpage.isValid()) drawPrimitive(PE_ScrollBarAddPage, p, addpage, cg, sflags | ((active == SC_ScrollBarAddPage) ? Style_Down : Style_Default)); // if ((controls & SC_ScrollBarFirst) && first.isValid()) // drawPrimitive(PE_ScrollBarFirst, p, first, cg, // sflags | ((active == SC_ScrollBarFirst) ? // Style_Down : Style_Default)); // // if ((controls & SC_ScrollBarLast) && last.isValid()) // drawPrimitive(PE_ScrollBarLast, p, last, cg, // sflags | ((active == SC_ScrollBarLast) ? // Style_Down : Style_Default)); if ((controls & SC_ScrollBarSlider) && slider.isValid()) { drawPrimitive(PE_ScrollBarSlider, p, slider, cg, sflags | ((active == SC_ScrollBarSlider) ? Style_Down : Style_Default)); } break; } case CC_TitleBar: { QRect ir; bool down; QColorGroup g = widget->colorGroup(); if ( controls & SC_TitleBarLabel ) { QPixmap pix(10, r.height()); pix.fill(g.background()); QPainter painter(&pix); renderGradient(&painter, QRect(0, 0, 10, r.height()/2), g.background().light(120), g.background(), true); painter.setPen(g.background().dark(105)); painter.drawLine(0, r.bottom(), 10, r.bottom()); p->drawTiledPixmap(0,0, r.width(), r.height(), pix); ir = visualRect( querySubControlMetrics( CC_TitleBar, widget, SC_TitleBarLabel ), widget ); p->setPen( g.foreground() ); p->drawText(ir.x()+2, ir.y(), ir.width()-2, ir.height(), AlignCenter | AlignVCenter | SingleLine, widget->caption() ); } if ( controls & SC_TitleBarCloseButton ) { ir = visualRect( querySubControlMetrics( CC_TitleBar, widget, SC_TitleBarCloseButton ), widget ); down = active & SC_TitleBarCloseButton; p->drawPixmap(ir.x(), ir.y(), qembed_findImage("DockCloseButton"), 0, down ? 12 : 0, 12, 12); } if ( controls & SC_TitleBarMaxButton ) { ir = visualRect( querySubControlMetrics( CC_TitleBar, widget, SC_TitleBarMaxButton ), widget ); down = active & SC_TitleBarMaxButton; p->drawPixmap(ir.x(), ir.y(), qembed_findImage("OverlapButton"), 0, down ? 12 : 0, 12, 12); } if ( controls & SC_TitleBarNormalButton) { ir = visualRect( querySubControlMetrics( CC_TitleBar, widget, SC_TitleBarNormalButton ), widget ); down = active & SC_TitleBarNormalButton; p->drawPixmap(ir.x(), ir.y(), qembed_findImage("ToDesktopButton"), 0, down ? 12 : 0, 12, 12); } if ( controls & SC_TitleBarMinButton) { ir = visualRect( querySubControlMetrics( CC_TitleBar, widget, SC_TitleBarMinButton ), widget ); down = active & SC_TitleBarMinButton; p->drawPixmap(ir.x(), ir.y(), qembed_findImage("DockbackButton"), 0, down ? 12 : 0, 12, 12); } if ( controls & SC_TitleBarSysMenu ) { if ( widget->icon() ) { ir = visualRect( querySubControlMetrics( CC_TitleBar, widget, SC_TitleBarSysMenu ), widget ); drawItem( p, ir, AlignCenter, widget->colorGroup(), TRUE, widget->icon(), QString::null ); } } break; } default: KStyle::drawComplexControl(control, p, widget, r, cg, flags, controls, active, opt); break; } } QRect DominoStyle::subRect(SubRect r, const QWidget *widget) const { switch (r) { case SR_PushButtonContents: { const QPushButton* btn = static_cast(widget); QRect rw = widget->rect(); if(btn->text().isEmpty()) return QRect(rw.left()+2, rw.top()+2, rw.width()-4, rw.height()-4); return QRect(rw.left()+2, rw.top()+3, rw.width()-4, rw.height()-7); } case SR_PushButtonFocusRect: { QRect rect, wrect(widget->rect()); const QPushButton *button = (const QPushButton *) widget; int dbw1 = 0, dbw2 = 0; if (button->isDefault() || button->autoDefault()) { dbw1 = pixelMetric(PM_ButtonDefaultIndicator, widget); dbw2 = dbw1 * 2; } int dfw1 = pixelMetric(PM_DefaultFrameWidth, widget) * 2, dfw2 = dfw1 * 2; rect.setRect(wrect.x() + dfw1 + dbw1, wrect.y() + dfw1 + dbw1, wrect.width() - dfw2 - dbw2, wrect.height() - dfw2 - dbw2); return rect; } case SR_ComboBoxFocusRect: { return QRect(4, 3, widget->width()-8, widget->height()-7); // return querySubControlMetrics( CC_ComboBox, widget, SC_ComboBoxEditField ); } case SR_CheckBoxFocusRect: { QRect cr = subRect(SR_CheckBoxContents, widget); QRect fr = KStyle::subRect(r, widget); if(cr.width() <= 0) // no text fr.setHeight(fr.height()+2); else fr.addCoords(+2, 0, -2, 0); return fr; } case SR_RadioButtonFocusRect: { QRect cr = subRect(SR_CheckBoxContents, widget); QRect fr = KStyle::subRect(r, widget); if(cr.width() <= 0) // no text fr.setHeight(fr.height()+2); else fr.addCoords(+2, 0, -2, 0); return fr; } case SR_ProgressBarGroove: { return QRect(widget->rect()); } case SR_ProgressBarContents: case SR_ProgressBarLabel: { QRect rw = widget->rect(); return QRect(rw.left()+2, rw.top()+2, rw.width()-4, rw.height()-4 ); } case SR_ToolBoxTabContents: { QRect rw = widget->rect(); return QRect(rw.left()+18, rw.top(), rw.width()-18, rw.height()); } default: { return KStyle::subRect(r, widget); } } } QRect DominoStyle::querySubControlMetrics(ComplexControl control, const QWidget *widget, SubControl subcontrol, const QStyleOption &opt) const { if (!widget) { return QRect(); } QRect r(widget->rect()); switch (control) { case CC_ComboBox: { switch (subcontrol) { case SC_ComboBoxEditField: { const QComboBox* cb = dynamic_cast(widget); if(!cb) // maybe kdevelop's KComboView return QRect(r.left()+4, r.top()+3, r.width()-4-15-3, r.height()-7); if(!cb->editable()) return QRect(r.left()+3, r.top()+3, r.width()-4-15-2, r.height()-6); return QRect(r.left()+3, r.top()+3, r.width()-4-15-2, r.height()-7); } default: { return KStyle::querySubControlMetrics(control, widget, subcontrol, opt); } } break; } case CC_SpinWidget: { const int fw = 2; // Frame width... const int buttonsWidth = 15; const bool heightDividable = ((r.height()%2) == 0); const int buttonsLeft = r.right()-buttonsWidth+1-fw; switch (subcontrol) { case SC_SpinWidgetUp: { // rect without 2px frame return QRect(buttonsLeft, r.top()+3, buttonsWidth+1, r.height()/2-3 ); } case SC_SpinWidgetDown: { if(heightDividable) { return QRect(buttonsLeft, r.top()+r.height()/2+1, buttonsWidth+1, r.height()/2-3); } else { return QRect(buttonsLeft, r.top()+r.height()/2+1, buttonsWidth+1, r.height()/2-2); } } case SC_SpinWidgetFrame: { return QRect(r.left(), r.top(), r.width(), r.height() ); } case SC_SpinWidgetEditField: { return QRect(r.left()+1+fw, r.top()+1+fw, r.width()-(buttonsWidth+2+fw*2), r.height()-3-fw*2); } case SC_SpinWidgetButtonField: { return QRect(buttonsLeft, r.top()+2, buttonsWidth, r.height()-5); } default: { return KStyle::querySubControlMetrics(control, widget, subcontrol, opt); } } break; } case CC_ScrollBar: { const QScrollBar *scrollbar = (const QScrollBar *) widget; int sliderstart = scrollbar->sliderStart(); const int buttonw = 15 /*- (fw * 2)*/; const int buttonh = 15 /*- (fw * 2)*/; int maxlen = ((scrollbar->orientation() == Qt::Horizontal) ? scrollbar->width() : scrollbar->height()) - buttonh * 3; // calculate slider length if (scrollbar->maxValue() != scrollbar->minValue()) { uint range = scrollbar->maxValue() - scrollbar->minValue(); sliderlen = (scrollbar->pageStep() * maxlen) / (range + scrollbar->pageStep()); if ( sliderlen < 32 || range > INT_MAX/2 ) sliderlen = 32; if ( sliderlen > maxlen ) sliderlen = maxlen; } else sliderlen = maxlen; switch(subcontrol) { case SC_ScrollBarAddLine: { // bottom/right button if (scrollbar->orientation() == Qt::Horizontal) { return QRect(scrollbar->width() - buttonw , 0, buttonw, buttonh); } else { return QRect(0, scrollbar->height() - buttonh, buttonw, buttonh); } } case SC_ScrollBarSubLine: { // top/left button return QRect(0, 0, buttonw, buttonh); } case SC_ScrollBarSubPage: // top/left if (scrollbar->orientation() == Qt::Horizontal) return QRect(buttonw, 0, sliderstart-buttonw+1, buttonw); return QRect(0, buttonh, buttonw, sliderstart-buttonw+1); case SC_ScrollBarAddPage: // bottom/left if (scrollbar->orientation() == Qt::Horizontal) return QRect(sliderstart + sliderlen-1, 0, maxlen - sliderstart - sliderlen + buttonw+1, buttonw); return QRect(0, sliderstart + sliderlen-1, buttonw, maxlen - sliderstart - sliderlen + buttonw+1); case SC_ScrollBarGroove: if (scrollbar->orientation() == Qt::Horizontal) return QRect(buttonw , 0, maxlen, buttonw); return QRect(0, buttonw, buttonw, maxlen); case SC_ScrollBarSlider: if (scrollbar->orientation() == Qt::Horizontal) return QRect(sliderstart, 0, sliderlen, buttonw); return QRect(0, sliderstart, buttonw, sliderlen); default: break; } } default: { return KStyle::querySubControlMetrics(control, widget, subcontrol, opt); } } } int DominoStyle::pixelMetric(PixelMetric m, const QWidget *widget) const { //return KStyle::pixelMetric(m, widget); switch(m) { // FRAMES // ------ case PM_DefaultFrameWidth: { if(widget) { if(dynamic_cast(widget)) return 3; // stolen from baghira if (dynamic_cast(widget->parentWidget()) && widget->parentWidget()->parentWidget() && (widget->parentWidget()->parentWidget()->isA("KonqMainWindow") || widget->parentWidget()->parentWidget()->isA("KonqFrameContainer"))) return 0; } return 2; } case PM_MenuBarFrameWidth: return 1; case PM_SpinBoxFrameWidth: return 2; // CHECKBOXES / RADIO BUTTONS // -------------------------- case PM_IndicatorWidth: // Checkbox 18x19 return 18; case PM_IndicatorHeight: return 19; case PM_ExclusiveIndicatorWidth: // Radiobutton 17x17 case PM_ExclusiveIndicatorHeight: return 17; // TABS // ---- case PM_TabBarTabVSpace: { const QTabBar * tb = (const QTabBar *) widget; switch(tb->shape()) { case QTabBar::RoundedAbove: case QTabBar::RoundedBelow: return 12; default: return 4; } } case PM_TabBarTabShiftVertical: { const QTabBar * tb = (const QTabBar *) widget; switch (tb->shape()) { case QTabBar::RoundedAbove: return 1; case QTabBar::RoundedBelow: return (tb->parentWidget() && tb->parentWidget()->isA("KonqFrameTabs"))? 0 : -1; default: return 0; } } case PM_TabBarTabShiftHorizontal: { return 0; } case PM_TabBarTabOverlap: { return 1; } case PM_TabBarBaseOverlap: { const QTabWidget * tw = (const QTabWidget *) widget; if(((DominoQTabWidget*)tw)->tabBar()->isHidden() || tw->isA("KonqFrameTabs")) return 0; return (tw->tabPosition() == QTabWidget::Top) ? -3 : -4; } #if (QT_VERSION >= 0x030300) // requires Qt 3.3 // extra space between menubar items case PM_MenuBarItemSpacing: { return 6; } #endif // #if (QT_VERSION >= 0x030300) // requires Qt 3.3 // // extra space between toolbar items // case PM_ToolBarItemSpacing: { // return 4; // } // #endif // SCROLL BAR // case PM_ScrollBarSliderMin: { // return 21; // } case PM_ScrollBarExtent: { return 15; } case PM_DockWindowSeparatorExtent: return 6; // SPLITTERS // --------- case PM_SplitterWidth: { return 6; } // PROGRESSBARS // ------------ case PM_ProgressBarChunkWidth: return 10; // SLIDER // ------ case PM_SliderLength: case PM_SliderThickness: return 15; // MENU INDICATOR // -------------- case PM_MenuButtonIndicator: return 8; case PM_ButtonDefaultIndicator: { return 0; } case PM_ButtonMargin: { //return 2; return 4; } case PM_HeaderMargin: return 2; case PM_ButtonShiftVertical: case PM_ButtonShiftHorizontal: { return 0; } case PM_CheckListControllerSize: // radio controller case PM_CheckListButtonSize: { // box controller return 16; } // case PM_PopupMenuFrameVerticalExtra: // return 1; // case PM_PopupMenuFrameHorizontalExtra: // return 1; default: return KStyle::pixelMetric(m, widget); } } QSize DominoStyle::sizeFromContents(ContentsType t, const QWidget *widget, const QSize &s, const QStyleOption &opt) const { //return KStyle::sizeFromContents (t, widget, s, opt); switch (t) { case CT_PushButton: { const QPushButton* btn = static_cast(widget); int w = s.width(); int h = s.height(); if ( btn->text().isEmpty() && s.width() < 32 ) { w += pixelMetric(PM_ButtonMargin, widget)*2; h += pixelMetric(PM_ButtonMargin, widget)*2; return QSize(w, h); } int bm = pixelMetric(PM_ButtonMargin, widget); int fw = pixelMetric(PM_DefaultFrameWidth, widget) * 2; w += bm + fw + 22; h += bm + fw; return QSize(w, h < 26 ? 26+_buttonHeightAdjustment : h+4 ); } case CT_ComboBox: { int bm = pixelMetric(PM_ButtonMargin, widget); int fw = pixelMetric(PM_DefaultFrameWidth, widget) * 2; int w = s.width(); int h = s.height(); w += bm + fw + 22; h += bm + fw-3; return QSize(w, h < 26 ? 26+_buttonHeightAdjustment : h+4 ); } case CT_TabBarTab: { // konqi = tabbar // other = tab control // this is total crap but it helps to reduce the flicker in konqi. ///////////////////// QTabBar* tb = 0; if(::qt_cast(widget)) tb = ::qt_cast(widget); else return QSize(s.width(), s.height()); if(!strcmp(widget->name(), "tabbar") && widget->parentWidget()->isA("KonqFrameTabs")) { QTab* tab = opt.tab(); int count = tb->count(); int fm = tb->fontMetrics().width("about:blank"); if(tb->parentWidget()->width() <= opt.tab()->rect().x()+44+fm) return QSize(s.width(), s.height()); int dots = tb->fontMetrics().width("."); if((dots*minTabLength+44)*count >= tb->width()) // 44 = frame+iconwidth return QSize(s.width(), s.height()); QSize sz = KStyle::sizeFromContents( t, widget, s, opt ); QString str; str.fill(' ', minTabLength); if( tab->text().isEmpty() || tab->text() == str) { tab->setText("about:blank"); //return QSize( fm+44, 26 ); return QSize( fm+44, s.height()); } return QSize(s.width(), s.height()); } else { switch (tb->shape()) { case QTabBar::RoundedAbove: case QTabBar::RoundedBelow: return QSize( s.width(), s.height()-2 ); default: return QSize( s.width(), s.height() ); // triangular } } } case CT_ToolButton: { if(dynamic_cast(widget)) { if(dynamic_cast(widget->parentWidget())) // smaller cornerWidget return QSize( s.width()+9, s.height()+7 ); return QSize( s.width()+11, s.height()+7 ); } return KStyle::sizeFromContents (t, widget, s, opt); // KMultiTabBar buttons } case CT_SpinBox: { QSize sz = KStyle::sizeFromContents( t, widget, s, opt ); int h = sz.height()%2 != 0 ? sz.height()+1 : sz.height(); return ( QSize( sz.width(), h < 24 ? 24 : h) ); } case CT_Header: { QSize sz = KStyle::sizeFromContents( t, widget, s, opt ); return QSize(sz.width(), sz.height()-2); } case CT_PopupMenuItem: { if (!widget || opt.isDefault()) return s; // static const int itemHMargin = 6; // static const int itemFrame = 7; // static const int arrowHMargin = 6; const QPopupMenu *popup = dynamic_cast(widget); QMenuItem *mi = opt.menuItem(); int maxpmw = opt.maxIconWidth(); int w = s.width(), h = s.height(); // includes pixmap width int cmwidth = 16; if (mi->custom()) { w = mi->custom()->sizeHint().width(); h = mi->custom()->sizeHint().height(); if (!mi->custom()->fullSpan() ) h += 4; } else if (mi->widget()) { // don't change the size in this case. } else if (mi->isSeparator()) { w = 20; h = 5; } else { if (mi->pixmap()) { h = QMAX(h, mi->pixmap()->height() + 2); } else { h = QMAX(h, 16 + 2 ); h = QMAX(h, popup->fontMetrics().height() + 4 ); } if (mi->iconSet()) { h = QMAX(h, mi->iconSet()->pixmap(QIconSet::Small, QIconSet::Normal).height() + 2); } } if(_indentPopupMenuItems) { w += itemHMargin + arrowHMargin + itemFrame*2; } else { w += itemFrame*2; if (mi->popup()) { w += itemHMargin + arrowHMargin; } if (maxpmw) { w += itemHMargin; } } int t; if (!mi->text().isNull() && (t = mi->text().find('\t')) && t >= 0 && mi->text().at(t+1) != 0) { // space between text and accel + checkmark width (in guiStyle "Windows" isCheckable() returns always true...) w += 18+cmwidth; } else w += cmwidth; return QSize(w, h); } default: return KStyle::sizeFromContents (t, widget, s, opt); } return KStyle::sizeFromContents (t, widget, s, opt); } int DominoStyle::styleHint( StyleHint stylehint, const QWidget *widget, const QStyleOption &option, QStyleHintReturn* returnData ) const { switch (stylehint) { case SH_PopupMenu_SubMenuPopupDelay: //return 96; // Motif-like delay... return 250; case SH_GroupBox_TextLabelVerticalAlignment: { return Qt::AlignTop; } case SH_ScrollBar_BackgroundMode: { return Qt::PaletteBackground; } case SH_ScrollBar_ScrollWhenPointerLeavesControl: // if set to false (the default) it will also scroll when the subPage button is pressed, so no choice here (Qt 3.6) return true; case SH_TabBar_Alignment: { return _centerTabs ? AlignHCenter : AlignLeft; } case SH_ToolBox_SelectedPageTitleBold: { return false; } case SH_LineEdit_PasswordCharacter: { if (widget) { const QFontMetrics &fm = widget->fontMetrics(); if (fm.inFont(QChar(0x25CF))) { return 0x25CF; } else if (fm.inFont(QChar(0x2022))) { return 0x2022; } } return '*'; } default: return KStyle::styleHint(stylehint, widget, option, returnData); } } QPixmap DominoStyle::stylePixmap(StylePixmap stylepixmap, const QWidget* widget, const QStyleOption& opt) const { switch (stylepixmap) { case SP_DockWindowCloseButton: case SP_TitleBarCloseButton: return QPixmap(qembed_findImage("DockCloseButton").copy(0,0,12,12)); case SP_TitleBarMinButton: return QPixmap(qembed_findImage("DockbackButton").copy(0,0,12,12)); case SP_TitleBarMaxButton: return QPixmap(qembed_findImage("OverlapButton").copy(0,0,12,12)); case SP_TitleBarNormalButton: return QPixmap(qembed_findImage("ToDesktopButton").copy(0,0,12,12)); default: return KStyle::stylePixmap(stylepixmap, widget, opt); } } QColor DominoStyle::lightenColor(const QColor &color, const int value) const { if(value < 0) return darkenColor(color, QABS(value)); int r, g, b; color.getRgb(&r, &g, &b); r += value; if(r > 255) r =255; g += value; if(g > 255) g =255; b += value; if(b > 255) b =255; return QColor(r, g, b); } QColor DominoStyle::darkenColor(const QColor &color, const int value) const { if(value < 0) return lightenColor(color, QABS(value)); int r, g, b; color.getRgb(&r, &g, &b); r -= value; if(r < 0) r = 0; g -= value; if(g < 0) g = 0; b -= value; if(b < 0) b = 0; return QColor(r, g, b); } QColor DominoStyle::dGetColor(const QColor &color, const int value) const { int h, s, v; color.getHsv(&h, &s, &v); return (v<127)? lightenColor(color, value): darkenColor(color, value); } QPixmap* DominoStyle::renderLineEditShadow(QWidget* widget, QRect r, QColor bg, uint flags, bool /*reverse*/) { bool drawLeft = flags& Draw_Left; bool drawRight = flags& Draw_Right; int x, y, w, h; r.rect(&x, &y, &w, &h); if(!drawLeft) { x = -3; w += 3; } else if(!drawRight) w += 3; QRect rect(x, y, w, h); QColor tintColor; QString enabled = widget->isEnabled() ? "1" : "0"; if(!widget->isEnabled()) tintColor =bg; else tintColor = alphaBlendColors(Qt::black, bg, 30+35); QPixmap* prBgShadow; if(!(prBgShadow = QPixmapCache::find(QString::number(bg.pixel(), 16)+QString::number(qApp->palette().active().background().pixel(), 16)+"leBgShadow"+enabled))) { prBgShadow = new QPixmap(4,4); prBgShadow->fill(bg); QPixmap pix = tintImage(qembed_findImage("progressShadow2"), tintColor); bitBlt(prBgShadow, 0, 0, &pix); QPixmapCache::insert(QString::number(bg.pixel(), 16)+QString::number(qApp->palette().active().background().pixel(), 16)+"leBgShadow"+enabled, prBgShadow); } QPixmap* pix = new QPixmap(rect.size()); pix->fill(bg); if(widget->isEnabled()) { QPainter p(pix); QColor color_d = alphaBlendColors(tintColor, bg, 170); QColor color_m = alphaBlendColors(tintColor, bg, 85); QColor color_l = alphaBlendColors(tintColor, bg, 25); p.setPen(color_d); p.drawLine(rect.x()+2, rect.y(), rect.right()-2, rect.y()); p.setPen(color_m); p.drawLine(rect.x()+2, rect.y()+1, rect.right()-2, rect.y()+1); p.setPen(color_l); p.drawLine(rect.x()+2, rect.y()+2, rect.right()-2, rect.y()+2); p.drawLine(rect.x()+2, rect.bottom(), rect.right()-2, rect.bottom()); //p.setPen(color_l); p.drawLine(rect.x()+1, rect.y()+3, rect.x()+1, rect.bottom()-1); // l p.drawLine(rect.right()-1, rect.y()+3, rect.right()-1, rect.bottom()-1); // r p.setPen(color_m); p.drawLine(rect.x(), rect.y()+3, rect.x(), rect.bottom()-1); // l p.drawLine(rect.right(), rect.y()+3, rect.right(), rect.bottom()-1); // r bitBlt(pix, rect.right()-1, rect.y(), prBgShadow, 2, 0, 2, 3, Qt::CopyROP); bitBlt(pix, rect.x(), rect.y(), prBgShadow, 0, 0, 2, 3, Qt::CopyROP); bitBlt(pix, rect.right()-1, rect.bottom(), prBgShadow, 2, 3, 2, 1, Qt::CopyROP); bitBlt(pix, rect.x(), rect.bottom(), prBgShadow, 0, 3, 2, 1, Qt::CopyROP); p.end(); } return pix; } QColor DominoStyle::getGroupBoxColor(const QWidget* w) const { QWidget* parent = w->parentWidget(); int tint = groupBoxSettings.customColor ? 0 : groupBoxSettings.brightness; while(dynamic_cast(parent)) { parent = parent->parentWidget(); tint += groupBoxSettings.brightness; } return QColor(darkenColor(groupBoxSettings.customColor ? groupBoxSettings.color : qApp->palette().active().background(), tint)); } QPixmap* DominoStyle::createCheckMark(const QColor color) const { QImage checkMark_enabled = qembed_findImage("checkmark"); QImage checkMark_disabled = setImageOpacity(checkMark_enabled, 25); QImage img(32, 17, 32); // left enabled, right disabled img.setAlphaBuffer(true); for(int x=0; x < checkMark_enabled.width(); ++x) { for(int y=0; y < checkMark_enabled.height(); ++y) { img.setPixel(x, y, checkMark_enabled.pixel(x, y)); } } for(int x=0; x < checkMark_disabled.width(); ++x) { for(int y=0; y < checkMark_disabled.height(); ++y) { img.setPixel(x+16, y, checkMark_disabled.pixel(x, y)); } } return new QPixmap(tintImage(img, color)); } QPixmap* DominoStyle::createRadioIndicator(const QColor color) const { QImage dot_enabled = tintImage(qembed_findImage("rb-dot"),color); blend(qembed_findImage("rb-dot-shadow"), dot_enabled, dot_enabled); QImage dot_disabled = setImageOpacity(dot_enabled, 25); QImage img(10, 5, 32); img.setAlphaBuffer(true); for(int x=0; x < dot_enabled.width(); ++x) { for(int y=0; y < dot_enabled.height(); ++y) { img.setPixel(x, y, dot_enabled.pixel(x, y)); } } for(int x=0; x < dot_disabled.width(); ++x) { for(int y=0; y < dot_disabled.height(); ++y) { img.setPixel(x+5, y, dot_disabled.pixel(x, y)); } } return new QPixmap(img); } void DominoStyle::drawFocusIndicator(QPainter *p, const QRect &r, int flags, const QColorGroup cg, bool /*enabled*/, const QPixmap* /*pixmap*/, const QString & text, int /*len = -1*/, const QColor& highlight, bool drawLine, bool isButton) const { if(drawLine) { // p->setPen(cg.foreground()); // QPixmap edges = tintImage(qembed_findImage("indicatorEdges"), cg.foreground()); // bitBlt(p->device(), r.x(), r.bottom()-1, &edges, 0, 0, 2, 1, Qt::CopyROP); // bitBlt(p->device(), r.right()-2, r.bottom()-1, &edges, 2, 0, 2, 1, Qt::CopyROP); // p->drawLine(r.x()+2, r.bottom()-1, r.right()-3, r.bottom()-1); QFont font = p->font(); font.setUnderline(true); p->setFont(font); } else { QRect br = p->fontMetrics().boundingRect(r.x(), r.y(), r.width(), r.height(), flags, text); QPainter pixPainter; QPixmap textPixmap(br.width()+2, br.height()+2); textPixmap.fill(QColor(0,0,0)); pixPainter.begin(&textPixmap); pixPainter.setPen(white); pixPainter.setFont(p->font()); pixPainter.drawText( QRect(1, 1, br.width()-1, br.height()-1), flags, text ); pixPainter.end(); DominoQPixmap* pixm = (DominoQPixmap*)&textPixmap; uint height = pixm->height(); uint width = pixm->width(); pixm->data->alphapm = new QPixmap; DominoQPixmap* alphapm = (DominoQPixmap*)pixm->data->alphapm; alphapm->data->w = width; alphapm->data->h = height; alphapm->data->d = 8; alphapm->hd = XCreatePixmap(alphapm->x11Display(), RootWindow(alphapm->x11Display(), alphapm->x11Screen()), width, height, 8); alphapm->rendhd = (HANDLE) XftDrawCreateAlpha( alphapm->x11Display(), alphapm->hd, 8 ); XImage *axi = XCreateImage(alphapm->x11Display(), (Visual *) alphapm->x11Visual(), 8, ZPixmap, 0, 0, width, height, 8, 0); axi->data = (char *) malloc((unsigned) axi->bytes_per_line * height); XImage* xi = XGetImage( qt_xdisplay(), pixm->handle(), 0, 0, width, height, AllPlanes, ZPixmap ); register int alpha; register float AXIS_FACTOR = 2.0; register float DIAGONAL_FACTOR = 1.0; register double alphaShadow; register int customalpha = isButton ? focusIndicatorSettings.buttonOpacity : focusIndicatorSettings.opacity; for(register uint x = 1; x < width-1; ++x) { for(register uint y = 1; y < height-1; ++y) { alphaShadow = (qBlue(XGetPixel(xi,x-1,y-1)) * DIAGONAL_FACTOR + qBlue(XGetPixel(xi,x-1,y )) * AXIS_FACTOR + qBlue(XGetPixel(xi,x-1,y+1)) * DIAGONAL_FACTOR + qBlue(XGetPixel(xi,x ,y-1)) * AXIS_FACTOR + 0 + qBlue(XGetPixel(xi,x ,y+1)) * AXIS_FACTOR + qBlue(XGetPixel(xi,x+1,y-1)) * DIAGONAL_FACTOR + qBlue(XGetPixel(xi,x+1,y )) * AXIS_FACTOR + qBlue(XGetPixel(xi,x+1,y+1)) * DIAGONAL_FACTOR) / 2.0; // / multiplicationFactor alpha = (int)alphaShadow; XPutPixel(axi, x, y, QMIN(255, alpha) *customalpha >> 8); } } GC gc = XCreateGC(alphapm->x11Display(), alphapm->hd, 0, 0); XPutImage(alphapm->x11Display(), alphapm->hd, gc, axi, 0, 0, 0, 0, width, height); textPixmap.fill(highlight); QRect fr = QRect(br.x(), br.y(), QMIN((int)width-2, r.width()) , QMIN((int)height-2, r.height())); if(fr.x() < r.x()) { p->setClipRegion(r); fr.setWidth(fr.width()+abs(fr.x())+2); } if(fr.isValid()) p->drawPixmap(fr.x(), fr.y(), textPixmap, 1, 1, fr.width() , fr.height()); if(fr.x() < r.x()) p->setClipping(false); if(axi) XDestroyImage(axi); if(xi) XDestroyImage(xi); XFreeGC(alphapm->x11Display(), gc); p->setPen(cg.foreground()); } } QPixmap DominoStyle::renderOutlineIcon(const QPixmap* icon) const { QImage img = icon->convertToImage(); QImage outlineIcon(img.width()+2, img.height()+2, 32); outlineIcon.setAlphaBuffer(true); register unsigned int *outlineIconData = (unsigned int*) outlineIcon.bits(); register uint total = outlineIcon.width()*outlineIcon.height(); for (register uint current = 0 ; current < total ; ++current ) { outlineIconData[ current ] = 0x00000000; } bitBlt(&outlineIcon, 0, 0, &img); bitBlt(&outlineIcon, 1, 0, &img); bitBlt(&outlineIcon, 2, 0, &img); bitBlt(&outlineIcon, 0, 1, &img); bitBlt(&outlineIcon, 2, 1, &img); bitBlt(&outlineIcon, 0, 2, &img); bitBlt(&outlineIcon, 1, 2, &img); bitBlt(&outlineIcon, 2, 2, &img); register uint customalpha = focusIndicatorSettings.buttonOpacity; for (register uint current = 0 ; current < total ; ++current ) { outlineIconData[ current ] = qRgba( focusIndicatorSettings.buttonColor.red(), focusIndicatorSettings.buttonColor.green(), focusIndicatorSettings.buttonColor.blue(), qAlpha(outlineIconData[ current ]) * customalpha >> 8); } return QPixmap(outlineIcon); } void DominoStyle::drawItem( QPainter *p, const QRect &r, int flags, const QColorGroup &g, bool enabled, const QPixmap *pixmap, const QString& text, int len, const QColor* penColor ) const { dominoDrawItem(p, r, flags, g, enabled, pixmap, text, len, penColor, false); } void DominoStyle::dominoDrawItem( QPainter *p, const QRect &r, int flags, const QColorGroup &g, bool enabled, const QPixmap *pixmap, const QString& text, int len, const QColor* penColor, bool buttonTextEffect ) const { int x = r.x(); int y = r.y(); int w = r.width(); int h = r.height(); p->setPen( penColor?*penColor:g.foreground() ); if ( pixmap ) { QPixmap pm( *pixmap ); bool clip = (flags & Qt::DontClip) == 0; if ( clip ) { if ( pm.width() < w && pm.height() < h ) { clip = FALSE; } else { p->save(); QRegion cr = QRect(x, y, w, h); if (p->hasClipping()) cr &= p->clipRegion(QPainter::CoordPainter); p->setClipRegion(cr); } } if ( (flags & Qt::AlignVCenter) == Qt::AlignVCenter ) y += h/2 - pm.height()/2; else if ( (flags & Qt::AlignBottom) == Qt::AlignBottom) y += h - pm.height(); if ( (flags & Qt::AlignRight) == Qt::AlignRight ) x += w - pm.width(); else if ( (flags & Qt::AlignHCenter) == Qt::AlignHCenter ) x += w/2 - pm.width()/2; else if ( ((flags & Qt::AlignLeft) != Qt::AlignLeft) && QApplication::reverseLayout() ) // AlignAuto && rightToLeft x += w - pm.width(); p->drawPixmap( x, y, pm ); if ( clip ) p->restore(); } else if ( !text.isNull() ) { if(textEffectSettings.mode > 1 || buttonTextEffect) { // 0=none, 1=only buttons, 2=everywhere QRect br = p->fontMetrics().boundingRect(x, y, w, h, flags, text); QPainter pixPainter; QPixmap textPixmap(br.width(), br.height()); textPixmap.fill(QColor(0,0,0)); pixPainter.begin(&textPixmap); pixPainter.setPen(white); pixPainter.setFont(p->font()); pixPainter.drawText( QRect(0,0,br.width(), br.height()), flags, text ); pixPainter.end(); DominoQPixmap* pixm = (DominoQPixmap*)&textPixmap; uint height = pixm->height(); uint width = pixm->width(); pixm->data->alphapm = new QPixmap; DominoQPixmap* alphapm = (DominoQPixmap*)pixm->data->alphapm; alphapm->data->w = width; alphapm->data->h = height; alphapm->data->d = 8; alphapm->hd = XCreatePixmap(alphapm->x11Display(), RootWindow(alphapm->x11Display(), alphapm->x11Screen()), width, height, 8); alphapm->rendhd = (HANDLE) XftDrawCreateAlpha( alphapm->x11Display(), alphapm->hd, 8 ); XImage *axi = XCreateImage(alphapm->x11Display(), (Visual *) alphapm->x11Visual(), 8, ZPixmap, 0, 0, width, height, 8, 0); axi->data = (char *) malloc((unsigned) axi->bytes_per_line * height); XImage* xi = XGetImage( qt_xdisplay(), pixm->handle(), 0, 0, width, height, AllPlanes, ZPixmap ); register int alpha; register int customalpha = buttonTextEffect ? textEffectSettings.buttonOpacity : textEffectSettings.opacity; for(register uint y = 0; y < height; ++y) { for(register uint x = 0; x < width; ++x) { alpha = (XGetPixel(xi, x, y)& 0xff ) * customalpha >> 8; // blue as alpha XPutPixel(axi, x, y, alpha); } } GC gc = XCreateGC(alphapm->x11Display(), alphapm->hd, 0, 0); XPutImage(alphapm->x11Display(), alphapm->hd, gc, axi, 0, 0, 0, 0, width, height); if(buttonTextEffect) { textPixmap.fill(textEffectSettings.buttonColor); QRect tr = QRect(br.x()+textEffectSettings.buttonPos.x(), br.y()+textEffectSettings.buttonPos.y(), r.width(), r.height()); if(tr.x() < r.x()) { p->setClipRegion(r); tr.setWidth(tr.width()+r.x()+abs(tr.x())); } p->drawPixmap(tr.x(), tr.y(), textPixmap, 0, 0, tr.width(), tr.height()); if(tr.x() < r.x()) p->setClipping(false); } else { textPixmap.fill(textEffectSettings.color); QRect tr = QRect(br.x()+textEffectSettings.pos.x(), br.y()+textEffectSettings.pos.y(), r.width(), r.height()); if(tr.x() < r.x()) { p->setClipRegion(r); tr.setWidth(tr.width()+r.x()+abs(tr.x())); } p->drawPixmap(tr.x(), tr.y(), textPixmap, 0, 0, tr.width(), tr.height()); if(tr.x() < r.x()) p->setClipping(false); } if(axi); XDestroyImage(axi); if(xi) XDestroyImage(xi); XFreeGC(alphapm->x11Display(), gc); } if(!enabled) p->setPen(g.text()); p->drawText( r.x(), r.y(), r.width(), r.height(), flags, text, len ); } } QWidget::BackgroundOrigin DominoStyle::setPixmapOrigin(QWidget::BackgroundOrigin origin) { switch(origin) { case QWidget::WidgetOrigin: return QWidget::ParentOrigin; case QWidget::ParentOrigin: return QWidget::AncestorOrigin; default: return origin; break; } } void DominoStyle::setDominoButtonPalette(QWidget* widget, PaletteTyp type) { QPalette pal; switch(type) { case Palette_Application: pal = qApp->palette(); break; case Palette_Parent: pal = widget->parentWidget()->palette(); break; case Palette_Widget: pal = widget->palette(); default: break; } int h, s, v; pal.active().buttonText().hsv(&h, &s, &v); QColor disabledColor = alphaBlendColors(pal.active().buttonText(), v < 127 ? white : black, 150); pal.setColor(QPalette::Disabled, QColorGroup::Text, disabledColor); widget->setPalette(pal); } void DominoStyle::updateTabWidgetFrame() { QTabWidget* tw = dynamic_cast(sender()->parent()); QWidget* w = tw ? tw->currentPage() : 0; if(!w) return; QFrame* f = dynamic_cast(w->parentWidget()); if(f) { QRect r = f->rect(); if(tw->tabPosition() == QTabWidget::Top) r= QRect(r.x(), r.y(), r.width(), 3); else r= QRect(r.x(), r.y()+r.height()-4, r.width(), 2); f->repaint(r, false); } } QPixmap DominoStyle::disableIcon(const QPixmap* icon) const { QImage img = icon->convertToImage(); register uint pixels = img.depth() > 8 ? img.width()*img.height() : img.numColors(); register uint *data = img.depth() > 8 ? (unsigned int *)img.bits() : (unsigned int *)img.colorTable(); register uint val, i; for(i=0; i < pixels; ++i){ val = qGray(data[i]); data[i] = qRgba(val, val, val, qAlpha(data[i])); } img = setImageOpacity(img, 50); return QPixmap(img); } // same as in renderSurface() but with darker colors void DominoStyle::renderTabSeparator(QPainter *p, const QRect &r, const QColor buttonColor, bool tabAbove) const { const DSurface* ds = tabAbove ? &tabTopSurface : &tabBottomSurface; int top = r.y()+r.height()*ds->g1Top/100; int bottom = r.height()*ds->g1Bottom/100; int top2 = r.y()+r.height()*ds->g2Top/100; int bottom2 = r.height()*ds->g2Bottom/100-top2; QColor c1; QColor c2; QColor c3; QColor c4; QColor bg; if(buttonColor != qApp->palette().active().button()) { c1 = alphaBlendColors(buttonColor, ds->g1Color1, 127); c2 = alphaBlendColors(buttonColor, ds->g1Color2, 127); c3 = alphaBlendColors(buttonColor, ds->g2Color1, 127); c4 = alphaBlendColors(buttonColor, ds->g2Color2, 127); bg = alphaBlendColors(buttonColor, ds->background, 127); } else { c1 = ds->g1Color1; c2 = ds->g1Color2; c3 = ds->g2Color1; c4 = ds->g2Color2; bg = ds->background; } const int alpha = 35; // 55, 25 p->fillRect(r, alphaBlendColors(QColor(0,0,0),bg , alpha)); switch(ds->numGradients) { case 1: { c1 = alphaBlendColors(QColor(0,0,0), c1, alpha); c2 = alphaBlendColors(QColor(0,0,0), c2, alpha); renderGradient(p, QRect(r.x(), top, r.width(), bottom), c1, c2, true); break; } case 2: { c1 = alphaBlendColors(QColor(0,0,0), c1, alpha); c2 = alphaBlendColors(QColor(0,0,0), c2, alpha); c3 = alphaBlendColors(QColor(0,0,0), c3, alpha); c4 = alphaBlendColors(QColor(0,0,0), c4, alpha); renderGradient(p, QRect(r.x(), top, r.width(), bottom), c1, c2, true); renderGradient(p, QRect(r.x(), top2, r.width(), bottom2), c3, c4, true); } default: break; } } void DominoStyle::renderGroupBox(QObject *obj, QEvent *ev) { QGroupBox* gb = dynamic_cast(obj); bool paintEvent = ev->type() == QEvent::Paint; QRect r = gb->rect(); if(gb->isFlat()) { QString title = gb->title(); int titleHeight = gb->fontMetrics().height(); int titleWidth = gb->fontMetrics().width(title); if(title.contains("&")) titleWidth -= gb->fontMetrics().width("&"); QPainter p(gb); // p.setPen(qApp->palette().active().background().dark(120)); p.setPen(alphaBlendColors(gb->paletteForegroundColor(), gb->paletteBackgroundColor(), 40)); p.drawLine(0, titleHeight/2-2, r.width()/2-titleWidth/2-4, titleHeight/2-2); p.drawLine(r.width()/2+titleWidth/2+4, titleHeight/2-2, r.width(), titleHeight/2-2); QColorGroup cg = gb->parentWidget()->colorGroup(); dominoDrawItem(&p, QRect(r.width()/2-titleWidth/2, -1, r.width(), titleHeight), ShowPrefix, cg, Style_Enabled, 0, title, -1, &cg.foreground(), false); p.setPen(cg.foreground()); ((DominoQGroupBox*)gb)->drawContents(&p); } else { QString title = gb->title(); int titleHeight = gb->fontMetrics().height(); QColor outsideColor = gb->parentWidget() ? gb->parentWidget()->paletteBackgroundColor() : gb->paletteBackgroundColor(); QColor insideColor = groupBoxSettings.tintBackground ? getGroupBoxColor(gb) : gb->paletteBackgroundColor(); bool pixmapExists = groupBoxPixmaps.contains(gb); if(paintEvent && pixmapExists) { QPainter p; if(!title.isEmpty()) { int titleWidth = gb->fontMetrics().width(title); if(title.contains("&")) titleWidth -= gb->fontMetrics().width("&"); QPainter p(groupBoxPixmaps[gb]); QRect titleRect = QRect((r.width()-titleWidth)/2, -1, r.width(), titleHeight); p.fillRect(titleRect, outsideColor); dominoDrawItem(&p, titleRect, ShowPrefix, gb->colorGroup(), true, 0, title, -1, &gb->foregroundColor(), false); p.end(); } // only needed for the case if a disabled groupbox gets disabled for a second time. // Qt3 just changes the palette to disabled without checking if it already is (and removes here the "hidden" background pixmap) bitBlt(gb, 0, 0, groupBoxPixmaps[gb]); p.begin(gb); ((DominoQGroupBox*)gb)->drawContents(&p); return; } bool isCheckable = gb->isCheckable(); int x = r.x(); int y = isCheckable ? r.y()+titleHeight+5 : (title.isNull() || title.isEmpty()) ? QMAX(r.y()-1, 0) : r.y()+titleHeight-1; int w = r.width(); int h = r.height(); // if(y+16 > h || 16 > w) // don't overlap the pixmaps // return; QPixmap buffer(r.width(), r.height()); QPainter p(&buffer); p.fillRect(QRect(0, 0, w, y), outsideColor); p.fillRect(QRect(x+3, y+3, w-6, h-6-y), insideColor); QPixmap* gbPix = 0; if(!(gbPix = QPixmapCache::find(QString::number(outsideColor.pixel(), 16)+QString::number(insideColor.pixel(), 16)+"groupbox"))) { gbPix = new QPixmap(16, 16); gbPix->fill(outsideColor); QPixmap groupBoxPixMask = qembed_findImage("groupBoxMask"); groupBoxPixMask.fill(insideColor); bitBlt(gbPix, 0, 0, &groupBoxPixMask); QPixmap groupBoxPix = qembed_findImage("groupBox"); bitBlt(gbPix, 0, 0, &groupBoxPix); QPixmapCache::insert(QString::number(outsideColor.pixel(), 16)+QString::number(insideColor.pixel(), 16)+"groupbox", gbPix); } bitBlt(&buffer, 0, y, gbPix, 0, 0, 8, 8); bitBlt(&buffer, w-8, y, gbPix, 8, 0, 8, 8); bitBlt(&buffer, 0, h-8, gbPix, 0, 8, 8, 8); bitBlt(&buffer, w-8, h-8, gbPix, 8, 8, 8, 8 ); // top QColor c1 = alphaBlendColors(QColor(255,255,255), outsideColor, 25); QColor c2 = alphaBlendColors(QColor(0,0,0), insideColor, 70); QColor c3 = alphaBlendColors(QColor(0,0,0), insideColor, 30); // left + right QColor c4 = alphaBlendColors(QColor(255,255,255), outsideColor, 40); QColor c5 = c3; //alphaBlendColors(QColor(0,0,0), insideColor, 30); QColor c6 = alphaBlendColors(QColor(0,0,0), insideColor, 4); // bottom QColor c7 = alphaBlendColors(QColor(6,6,6), insideColor, 25); QColor c8 = alphaBlendColors(QColor(255,255,255), outsideColor, 79); QColor c9 = alphaBlendColors(QColor(255,255,255), outsideColor, 30); // top p.setPen(c1); p.drawLine(r.left()+8, y, r.right()-8, y); p.setPen(c2); p.drawLine(r.left()+8, y+1, r.right()-8, y+1); p.setPen(c3); p.drawLine(r.left()+8, y+2, r.right()-8, y+2); // bottom p.setPen(c7); p.drawLine(r.left()+8, r.bottom()-2, r.right()-8, r.bottom()-2); p.setPen(c8); p.drawLine(r.left()+8, r.bottom()-1, r.right()-8, r.bottom()-1); p.setPen(c9); p.drawLine(r.left()+8, r.bottom(), r.right()-8, r.bottom()); // left / right p.setPen(c4); p.drawLine(r.left(), y+8, r.left(), r.bottom()-8); p.drawLine(r.right(), y+8, r.right(), r.bottom()-8); p.setPen(c5); p.drawLine(r.left()+1, y+8, r.left()+1, r.bottom()-8); p.drawLine(r.right()-1, y+8, r.right()-1, r.bottom()-8); p.setPen(c6); p.drawLine(r.left()+2, y+8, r.left()+2, r.bottom()-8); p.drawLine(r.right()-2, y+8, r.right()-2, r.bottom()-8); p.end(); if(ev->type() == QEvent::Resize) XSetWindowBackgroundPixmap( gb->x11Display(), gb->winId(), buffer.handle()); else if(paintEvent) { if(!title.isEmpty()) { int titleWidth = gb->fontMetrics().width(title); if(title.contains("&")) titleWidth -= gb->fontMetrics().width("&"); p.begin(&buffer); QRect titleRect = QRect((r.width()-titleWidth)/2, -1, r.width(), titleHeight); p.fillRect(titleRect, outsideColor); dominoDrawItem(&p, titleRect, ShowPrefix, gb->colorGroup(), true, 0, title, -1, &gb->foregroundColor(), false); p.end(); } bitBlt(gb, 0, 0, &buffer); p.begin(gb); ((DominoQGroupBox*)gb)->drawContents(&p); } if(pixmapExists) delete groupBoxPixmaps[gb]; groupBoxPixmaps[gb] = new QPixmap(buffer); } } void DominoStyle::spinBoxValueChanged(int value) { QSpinBox* sb = (QSpinBox*)sender(); if(spinWidgetDown) { spinWidgetDown = !(value == sb->maxValue() || value == sb->minValue()); if(!spinWidgetDown) { // if we repaint directly, the last mousePressEvent wouldn't be down QTimer::singleShot( 200, ((DominoQSpinBox*)sb)->editor()->parentWidget(), SLOT(repaint()) ); } } } uint DominoStyle::preMultiplyColor(const uint &c) const { XRenderColor clr; uint color = c << 8 | qAlpha(c); uint red = (color >> 24) & 0xff; uint green = (color >> 16) & 0xff; uint blue = (color >> 8) & 0xff; uint alpha = (color >> 0) & 0xff; red = red * alpha / 255; green = green * alpha / 255; blue = blue * alpha / 255; clr.red = (red << 8) + red; clr.green = (green << 8) + green; clr.blue = (blue << 8) + blue; clr.alpha = (alpha << 8) + alpha; return qRgba(clr.red, clr.green, clr.blue, clr.alpha); } void DominoStyle::toolPopupPressed() { QToolButton* tb = (QToolButton*)sender(); if(!tb ) return; if(tb->popup() && tb->isEnabled() && tb->isDown()) { popupButton = tb; connect(popupTimer, SIGNAL(timeout()), this, SLOT(popupToolMenu())); popupTimer->start(600, true); } } void DominoStyle::popupToolMenu() { if(!popupButton ) return; if(popupButton->popup() && !popupButton->popup()->isVisible() && popupButton->isEnabled() && popupButton->isDown()) { popupButton->openPopup(); } popupButton = 0; } void DominoStyle::toolPopupReleased() { if(!popupButton) return; if(popupTimer->isActive()) { popupTimer->stop(); popupButton = 0; } } #include "eventfilter.cpp" #include "domino.moc"