diff options
Diffstat (limited to 'domino/domino.cpp')
-rw-r--r-- | domino/domino.cpp | 8139 |
1 files changed, 8139 insertions, 0 deletions
diff --git a/domino/domino.cpp b/domino/domino.cpp new file mode 100644 index 0000000..837d0af --- /dev/null +++ b/domino/domino.cpp @@ -0,0 +1,8139 @@ +/* Domino widget style for KDE 3 + Copyright (C) 2006 Michael Lentner <michaell@gmx.net> + + based on the KDE style "Plastik": + Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net> + + based on the KDE style "dotNET": + Copyright (C) 2001-2002, Chris Lee <clee@kde.org> + Carsten Pfeiffer <pfeiffer@kde.org> + Karol Szwed <gallium@kde.org> + 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 <malte@kde.org> + (c) 2002,2003 Maksim Orlovich <mo002j@mail.rochester.edu> + based on the KDE3 HighColor Style + Copyright (C) 2001-2002 Karol Szwed <gallium@kde.org> + (C) 2001-2002 Fredrik Höglund <fredrik@kde.org> + Drawing routines adapted from the KDE2 HCStyle, + Copyright (C) 2000 Daniel M. Duley <mosfet@kde.org> + (C) 2000 Dirk Mueller <mueller@kde.org> + (C) 2001 Martijn Klingens <klingens@kde.org> + Progressbar code based on KStyle, + Copyright (C) 2001-2002 Karol Szwed <gallium@kde.org> + + 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 <kglobalsettings.h> +#include <qpainter.h> +#include <qtabbar.h> +#include <qprogressbar.h> +#include <qcheckbox.h> +#include <qlineedit.h> +#include <qlistbox.h> +#include <qstyleplugin.h> +#include <qpushbutton.h> +#include <qtoolbutton.h> +#include <kpopupmenu.h> +#include <qradiobutton.h> +#include <qslider.h> +#include <qsettings.h> +#include <kpixmap.h> +#include <qgroupbox.h> +#include <qmenudata.h> +#include <qdockarea.h> +#include <qobjectlist.h> +#include <qheader.h> +#include <klistview.h> +#include <qstatusbar.h> +#include <qcombobox.h> +#include <qtabwidget.h> +#include <ktoolbar.h> +#include <qlabel.h> +#include <qsimplerichtext.h> +#include <qiconview.h> +#include <kconfig.h> +#include <qapplication.h> +#include <qtoolbox.h> +#include <qstylesheet.h> +// #include <qsplitter.h> +#include <qwidgetstack.h> +#include <qtimer.h> +#include <kmultitabbar.h> +#include <qspinbox.h> +#include <qcursor.h> +#include <qtextedit.h> +#include <kdeversion.h> +#include <kimageeffect.h> + +#include <X11/Xlib.h> +#include <ft2build.h> +#include FT_FREETYPE_H + +#include "domino.h" + +#include <X11/Xft/Xft.h> +// #include <X11/extensions/Xrender.h> +#include <X11/extensions/shape.h> + + + +// 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<CacheEntry>(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<QWidget*, int>::iterator iter; + bool visible = false; + for (iter = progAnimWidgets.begin(); iter != progAnimWidgets.end(); iter++) + { + if ( !dynamic_cast<QProgressBar*>(iter.key()) ) + continue; + + pb = dynamic_cast<QProgressBar*>(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<QScrollView*>(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<QPushButton*>(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<QCheckBox*>(widget)) { + ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); + widget->installEventFilter(this); + } + else if(dynamic_cast<KToolBarButton*>(widget)) { + KToolBarButton* tb = static_cast<KToolBarButton*>(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<QToolButton*>(widget)) { + QToolButton* tb = static_cast<QToolButton*>(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<QRadioButton*>(widget)) { + ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); + widget->installEventFilter(this); + } + else if(dynamic_cast<QComboBox*>(widget)) { + QComboBox* cb = static_cast<QComboBox*>(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<QGroupBox*>(widget)) { + QGroupBox* gb = dynamic_cast<QGroupBox*>(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<QSpinWidget*>(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<QSpinBox*>(widget)) { + connect(dynamic_cast<QSpinBox*>(widget), SIGNAL(valueChanged(int)), this, SLOT(spinBoxValueChanged(int))); + } + else if(dynamic_cast<QLineEdit*>(widget)) { + QLineEdit* le = dynamic_cast<QLineEdit*>(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<QScrollBar*>(widget)) { + widget->installEventFilter(this); + } + else if(dynamic_cast<QStatusBar*>(widget)) { + widget->installEventFilter(this); + } + else if(dynamic_cast<QHeader*>(widget)) { + setDominoButtonPalette(widget, Palette_Widget); + widget->installEventFilter(this); + } + else if(dynamic_cast<QPopupMenu*>(widget)) { + + if(widget->isA("PanelKMenu")) + widget->setPaletteForegroundColor(alphaBlendColors(_popupMenuColor, qApp->palette().active().foreground(), 150)); + + widget->setBackgroundMode( NoBackground ); + widget->installEventFilter(this); + } + else if(dynamic_cast<QTabWidget*>(widget)) { + widget->installEventFilter(this); + } + else if(dynamic_cast<QTabBar*>(widget)) { + QTabBar* tb = dynamic_cast<QTabBar*>(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<QIconView*>(widget)) { + ((DominoQWidget*)dynamic_cast<QIconView*>(widget)->viewport())->setWFlags(Qt::WNoAutoErase); + ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); + dynamic_cast<QIconView*>(widget)->viewport()->installEventFilter(this); // rubberband + if(strcmp(widget->className(), "KDIconView")) + widget->installEventFilter(this); + } + else if(dynamic_cast<QListView*>(widget)) { + dynamic_cast<QListView*>(widget)->viewport()->installEventFilter(this); // rubberband + if(widget->isA("KonqTreeViewWidget")) { // konqi frames + QFrame* f = dynamic_cast<QFrame*>(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<QGroupBox*>(widget->parentWidget())) + widget->setPaletteBackgroundColor(widget->parentWidget()->paletteBackgroundColor()); + } + else if(dynamic_cast<QTextEdit*>(widget)) { + dynamic_cast<QTextEdit*>(widget)->viewport()->installEventFilter(this); + widget->installEventFilter(this); + } + else if(dynamic_cast<QScrollView*>(widget)) { + QFrame* f = dynamic_cast<QFrame*>(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<QSlider*>(widget)) { + ((DominoQWidget*)widget)->setWFlags(Qt::WNoAutoErase); + } + else if(dynamic_cast<QListBox*>(widget)) { + widget->installEventFilter(this); + } + else if(dynamic_cast<KToolBarSeparator*>(widget) || dynamic_cast<QToolBar*>(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<QButton*>(widget) && widget->parentWidget() && widget->parentWidget()->isA("QToolBox")) { + widget->installEventFilter(this); + } + else if( dynamic_cast<QProgressBar*>(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<KPopupTitle*>(widget)) { + widget->installEventFilter(this); + } + else if(dynamic_cast<QFrame*>(widget)) { + QFrame* f = dynamic_cast<QFrame*>(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<QWidgetStack*>(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<QGroupBox*>(w)) { + widget->setPaletteBackgroundColor(qApp->palette().active().background()); + break; + } + w = w->parentWidget(); + } + + if(dynamic_cast<QWidgetStack*>(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<QDockWindow*>(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<KDockSplitter*>(widget)) { +// widget->installEventFilter(this); +// } else if (dynamic_cast<KDockWidgetAbstractHeaderDrag*>(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<QPushButton*>(widget) || + dynamic_cast<QSpinWidget*>(widget) || dynamic_cast<QSlider*>(widget) || + dynamic_cast<QRadioButton*>(widget) || + dynamic_cast<QListBox*>(widget) || dynamic_cast<QListView*>(widget) || + dynamic_cast<QStatusBar*>(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<QTabWidget*>(widget) || dynamic_cast<QTabBar*>(widget)) { + widget->removeEventFilter(this); + widget->setBackgroundMode(Qt::PaletteBackground); + } + else if(dynamic_cast<QCheckBox*>(widget)) { + ((DominoQWidget*)widget)->clearWFlags(Qt::WNoAutoErase); + widget->removeEventFilter(this); + } + else if(dynamic_cast<QComboBox*>(widget)) { // after KonqCheckBox + ((DominoQWidget*)widget)->clearWFlags(Qt::WNoAutoErase); + widget->removeEventFilter(this); + } + else if(dynamic_cast<QHeader*>(widget)) { + widget->removeEventFilter(this); + widget->setBackgroundMode(Qt::PaletteButton); + } + else if(dynamic_cast<QPopupMenu*>(widget)) { + widget->removeEventFilter(this); + widget->setBackgroundMode(Qt::PaletteBackground); + static_cast<QFrame*>(widget)->setLineWidth(2); + widget->clearMask(); + } + else if(dynamic_cast<KToolBarButton*>(widget)) { + widget->removeEventFilter(this); + widget->setBackgroundMode(Qt::PaletteBackground); + } + else if(dynamic_cast<QGroupBox*>(widget)) { + widget->removeEventFilter(this); + ((DominoQWidget*)widget)->clearWFlags(Qt::WNoAutoErase); + QGroupBox* gb = dynamic_cast<QGroupBox*>(widget); + gb->setBackgroundMode(Qt::PaletteBackground); + gb->setPalette(qApp->palette()); + gb->setAlignment(Qt::AlignLeft|Qt::AlignBottom); + } + else if(dynamic_cast<QLineEdit*>(widget)) { + widget->removeEventFilter(this); + widget->setBackgroundMode(Qt::PaletteBase); + QLineEdit* le = dynamic_cast<QLineEdit*>(widget); + QRect r = le->rect(); + le->setFrameRect(QRect(r.x()-1, r.y(), r.width()+1, r.height())); + widget->clearMask(); + } + else if(dynamic_cast<QProgressBar*>(widget) ) { + progAnimWidgets.remove(widget); + } + else if(dynamic_cast<KToolBarSeparator*>(widget) || dynamic_cast<QToolBar*>(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<QFrame*>(widget); + f->setMargin(1); + f->setFrameStyle(QFrame::Plain|QFrame::Box); + + QObjectList *list = const_cast<QObjectList *>(widget->children()); + QObjectListIt it( *list ); + QObject * o; + while ( (o = it.current()) != 0 ) { + ++it; + if(dynamic_cast<QLabel*>(o)) { + QLabel* l = dynamic_cast<QLabel*>(o); + l->setBackgroundOrigin(QWidget::WidgetOrigin); + l->setBackgroundMode(Qt::PaletteBackground); + l->setPaletteBackgroundColor(l->palette().active().background()); + } + } + } + else if(dynamic_cast<QScrollView*>(widget)) { + QFrame* f = dynamic_cast<QFrame*>(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<KPopupTitle*>(widget)) { + widget->removeEventFilter(this); + } + else if(dynamic_cast<QFrame*>(widget)) { + widget->removeEventFilter(this); + QFrame* f = dynamic_cast<QFrame*>(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<QWidget*>(obj)); +} + +void DominoStyle::groupBoxDestroyed(QObject* obj) +{ + groupBoxPixmaps.remove(static_cast<QGroupBox*>(obj)); +} + +void DominoStyle::progressBarDestroyed(QObject* obj) +{ + progAnimWidgets.remove(static_cast<QWidget*>(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<QHeader*>(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<QHeader*>(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<QWidget*>(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<QWidget*>(p->device()); + if(rubberBandType == ArgbRubber && compositeManagerRunning && viewPortPressed && dynamic_cast<QListView*>(w->parentWidget())) { + QListView* lv = dynamic_cast<QListView*>(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<QCheckListItem*>(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<QScrollView*>(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<QWidget*>(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<QWidget*>(p->device()) && dynamic_cast<QWidget*>(p->device())->isA("PanelKMenu")) { + QWidget* w = dynamic_cast<QWidget*>(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<QPixmap*>(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<QWidget*>(p->device()) ? dynamic_cast<QWidget*>(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<QWidget*>(p->device()) ? dynamic_cast<QWidget*>(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<QWidget*>(p->device()) ? dynamic_cast<QWidget*>(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<QWidget*>(p->device()); + QTabWidget* tw = w ? dynamic_cast<QTabWidget*>(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<QPopupMenu*>(p->device()); + QColor background = dynamic_cast<QListBox*>(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<QWidget*>(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<QWidget*>(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<QWidget*>(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<QWidget*>(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; i<num; i++) + XClearArea(qt_xdisplay(), rubber->window, 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<const QProgressBar*>(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<double>(pb->progress()) / static_cast<double>(steps); + int w = static_cast<int>(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<QWidget*>(widget); + QMapConstIterator<QWidget*, int> 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<QGroupBox*>(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<KMultiTabBarTab*>(button)) { + + const QWidget* parent = button->parentWidget(); + bool horizontal = parent->width() >= parent->height(); + + KMultiTabBar* tabBar = static_cast<KMultiTabBar*>(widget->parentWidget()->parentWidget()->parentWidget()->parentWidget()); + + KMultiTabBarTab* tab; + QPtrList<KMultiTabBarTab>* 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<const QPushButton *>( 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<const QComboBox*>(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<KToolBarButton*>(tb)) { + + const bool reverse = QApplication::reverseLayout(); + KToolBar *bar = dynamic_cast<KToolBar*>(tb->parentWidget()); + if(!bar) break; + KToolBarButton* btn = ::qt_cast<KToolBarButton*>(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<KToolBarButton*>(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<const QSpinWidget *>(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<QSpinBox*>(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<const QPushButton*>(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<const QComboBox *>(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<const QPopupMenu*>(widget)) + return 3; + + // stolen from baghira + if (dynamic_cast<QTabWidget*>(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<const QPushButton*>(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<QTabBar*>(widget)) + tb = ::qt_cast<QTabBar*>(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<const QToolButton*>(widget)) { + if(dynamic_cast<QTabWidget*>(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<const QPopupMenu *>(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<QGroupBox*>(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<QTabWidget*>(sender()->parent()); + QWidget* w = tw ? tw->currentPage() : 0; + if(!w) + return; + QFrame* f = dynamic_cast<QFrame*>(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<QGroupBox*>(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" |