You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-style-domino/domino/domino.cpp

8179 lines
283 KiB

/* 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 TDEStyle,
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 <tdeglobalsettings.h>
#include <tqpainter.h>
#include <tqtabbar.h>
#include <tqprogressbar.h>
#include <tqcheckbox.h>
#include <tqlineedit.h>
#include <tqlistbox.h>
#include <tqstyleplugin.h>
#include <tqpushbutton.h>
#include <tqtoolbutton.h>
#include <tdepopupmenu.h>
#include <tqradiobutton.h>
#include <tqslider.h>
#include <tqsettings.h>
#include <kpixmap.h>
#include <tqgroupbox.h>
#include <tqmenudata.h>
#include <tqdockarea.h>
#include <tqobjectlist.h>
#include <tqheader.h>
#include <tdelistview.h>
#include <tqstatusbar.h>
#include <tqcombobox.h>
#include <tqtabwidget.h>
#include <tdetoolbar.h>
#include <tqlabel.h>
#include <tqsimplerichtext.h>
#include <tqiconview.h>
#include <tdeconfig.h>
#include <tqapplication.h>
#include <tqtoolbox.h>
#include <tqstylesheet.h>
// #include <tqsplitter.h>
#include <tqwidgetstack.h>
#include <tqtimer.h>
#include <tdemultitabbar.h>
#include <tqspinbox.h>
#include <tqcursor.h>
#include <tqtextedit.h>
#include <tdeversion.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] = tqRgba(31, 31, 31, 32); // top first shadow line
c4[ty][s] = tqRgba(255, 255, 255, 78); // bottom first shadow line
c5[ty][s] = tqRgba(255, 255, 255, 30); // bottom second shadow line
c6[ty][s] = tqRgba(217, 217, 217, 34); // first left shadow line
}
ty = Contour_Raised;
for(int s = 0; s < num_states; s++) {
c1[ty][s] = tqRgba(0, 0, 0, 14); // top first shadow line
c4[ty][s] = tqRgba(0, 0, 0, 26); // bottom first shadow line
c5[ty][s] = tqRgba(0, 0, 0, 10); // bottom second shadow line
c6[ty][s] = tqRgba(0, 0, 0, 12); // first left shadow line
}
ty = Contour_Simple;
for(int s = 0; s < num_states; s++) {
c1[ty][s] = tqRgba(0, 0, 0, 0); // top first shadow line
c4[ty][s] = tqRgba(0, 0, 0, 0); // bottom first shadow line
c5[ty][s] = tqRgba(0, 0, 0, 0); // bottom second shadow line
c6[ty][s] = tqRgba(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 )
: TQWidget()
{
setWState(WState_Disabled|WState_Polished);
TQWidget::create( window, true, true);
}
RubberWidget::~RubberWidget()
{
}
Rubber::Rubber(uint col)
{
rubber = 0;
parent = 0;
window = 0;
mask = TQRegion();
Display *dpy = tqt_xdisplay();
int screen = tqt_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(TQRect& r, TQRegion& m) {
if(parent)
return;
mask = m;
wsa.background_pixel = 0x00000000;
Window parentwin = XCreateWindow(tqt_xdisplay(), tqApp->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(tqt_xdisplay(), parentwin, 0, 0, r.width(), r.height(), 0, 32, InputOutput, visual, CWBackPixel|CWColormap|CWBorderPixel|CWOverrideRedirect, &wsa);
rubber = new RubberWidget(window);
#ifdef ShapeInput
TQBitmap bm(r.width(), r.height(), true);
XShapeCombineMask(tqt_xdisplay(), rubber->winId(), ShapeInput, 0, 0, bm.handle(), ShapeSet);
#endif
XShapeCombineRegion( tqt_xdisplay(), rubber->winId(), ShapeBounding, 0, 0, mask.handle(), ShapeSet );
rubber->show();
parent->show();
XFlush(tqt_xdisplay());
}
Rubber::~Rubber()
{
}
void Rubber::updateMask(TQRegion& m) {
if(mask != m)
XShapeCombineRegion( tqt_xdisplay(), rubber->winId(), ShapeBounding, 0, 0, m.handle(), ShapeSet );
}
// -- Style Plugin Interface -------------------------
class DominoStylePlugin : public TQStylePlugin
{
public:
DominoStylePlugin() {}
~DominoStylePlugin() {}
TQStringList keys() const {
return TQStringList() << "Domino";
}
TQStyle* create( const TQString& key ) {
if (key.lower() == "domino")
return new DominoStyle;
return 0;
}
};
KDE_Q_EXPORT_PLUGIN( DominoStylePlugin )
// -- end --
DominoStyle::DominoStyle() : TDEStyle( TDEStyle::Default /*AllowMenuTransparency*/, ThreeButtonScrollBar )
{
konsoleMode = false;
kickerMode = false;
konquerorMode = false;
flatMode = false;
viewPortPressed = false;
oldRubberRect = TQRect();
rubber = 0;
ignoreNextFocusRect = false;
#if TDE_VERSION < 0x30506
compositeManagerRunning = true;
#endif
configMode = "0"; // temporaly to avoid cache problems between the configs previewStyle and this style
spinWidgetDown = false;
popupTimer = new TQTimer(this);
TQColor background = tqApp->palette().active().background();
TQColor buttonColor = tqApp->palette().active().button();
TQColor highlight = tqApp->palette().active().highlight();
TQSettings settings;
// _contrast = settings.readNumEntry("/TQt/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", TQColor(218,218,179).name()) : TQColor(218,218,179);
//_toolTipColor = TQColor(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(tqt_xdisplay(), "Composite", &dummy, &dummy, &dummy)) {
TQColor c = settings.readEntry("/rubberBandColor", highlight.name());
int a = settings.readNumEntry("/rubberBandOpacity", 30)*255/100;
_argbRubberBandColor = tqRgba(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", TQt::white.name());
textEffectSettings.opacity = settings.readNumEntry("/textEffectOpacity", 60)*255/100;
textEffectSettings.buttonColor = settings.readEntry("/textEffectButtonColor", TQt::white.name());
textEffectSettings.buttonOpacity = settings.readNumEntry("/textEffectButtonOpacity", 60)*255/100;
int textEffectPos = settings.readNumEntry("/textEffectPos", 5);
switch(textEffectPos) {
case 0:
textEffectSettings.pos = TQPoint(-1,-1);
break;
case 1:
textEffectSettings.pos = TQPoint(0,-1);
break;
case 2:
textEffectSettings.pos = TQPoint(1,-1);
break;
case 3:
textEffectSettings.pos = TQPoint(1,0);
break;
case 4:
textEffectSettings.pos = TQPoint(1,1);
break;
case 5:
textEffectSettings.pos = TQPoint(0,1);
break;
case 6:
textEffectSettings.pos = TQPoint(-1,1);
break;
case 7:
textEffectSettings.pos = TQPoint(-1,0);
break;
default:
textEffectSettings.pos = TQPoint(0,1);
}
int textEffectButtonPos = settings.readNumEntry("/textEffectButtonPos", 5);
switch(textEffectButtonPos) {
case 0:
textEffectSettings.buttonPos = TQPoint(-1,-1);
break;
case 1:
textEffectSettings.buttonPos = TQPoint(0,-1);
break;
case 2:
textEffectSettings.buttonPos = TQPoint(1,-1);
break;
case 3:
textEffectSettings.buttonPos = TQPoint(1,0);
break;
case 4:
textEffectSettings.buttonPos = TQPoint(1,1);
break;
case 5:
textEffectSettings.buttonPos = TQPoint(0,1);
break;
case 6:
textEffectSettings.buttonPos = TQPoint(-1,1);
break;
case 7:
textEffectSettings.buttonPos = TQPoint(-1,0);
break;
default:
textEffectSettings.buttonPos = TQPoint(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(tqApp->argv()[0], "konqueror")) {
TDEGlobal::config()->setGroup("General");
minTabLength = TDEGlobal::config()->readNumEntry("MinimumTabLength", 3);
}
else
minTabLength = 0;
if(!strcmp(tqApp->className(), "TDEApplication")) {
TQString oldgroup = TDEGlobal::config()->group();
TDEGlobal::config()->setGroup("KDE");
macStyleBar = TDEGlobal::config()->readBoolEntry("macStyle", false);
TDEGlobal::config()->setGroup(oldgroup); // reset the group, do not interfere with the application
TDEApplicationMode = true;
}
else {
macStyleBar = false;
TDEApplicationMode = false;
}
hoverWidget = 0;
horizontalLine = 0;
verticalLine = 0;
sideRepaint = 0;
hoveredToolBoxTab = 0;
checkMark = createCheckMark(_customCheckMarkColor? _checkMarkColor : tqApp->palette().active().foreground());
radioIndicator = createRadioIndicator(_customCheckMarkColor? _checkMarkColor : tqApp->palette().active().foreground());
popupFrame = new TQPixmap(tintImage(qembed_findImage("popup5"), _popupMenuColor.dark(150) ));
// setup pixmap cache...
pixmapCache = new TQIntCache<CacheEntry>(150000, 499);
pixmapCache->setAutoDelete(true);
if ( _animateProgressBar )
{
animationTimer = new TQTimer( this );
connect( animationTimer, SIGNAL(timeout()), this, SLOT(updateProgressPos()) );
}
scrollDistance = 0;
scrollWidget = 0;
scrollTimer = new TQTimer(this);
connect( scrollTimer, SIGNAL(timeout()), this, SLOT(updateScrollPos()) );
TQColor tabContour2 = tqApp->palette().active().background().dark(150);
border1= new TQPixmap(tintImage(qembed_findImage("border1"), tabContour2));
}
void DominoStyle::updateProgressPos()
{
TQProgressBar* pb;
//Update the registered progressbars.
TQMap<TQWidget*, int>::iterator iter;
bool visible = false;
for (iter = progAnimWidgets.begin(); iter != progAnimWidgets.end(); iter++)
{
if ( !dynamic_cast<TQProgressBar*>(iter.key()) )
continue;
pb = dynamic_cast<TQProgressBar*>(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<TQScrollView*>(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 = TQMIN(scrollDistance, 0);
}
else {
if(scrollDistance > 200)
scroll = -45;
else if(scrollDistance > 100)
scroll = -30;
else
scroll = -15;
scrollDistance += scroll;
scrollDistance = TQMAX(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::applicationPolish( const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void *ptr )
{
if (!ceData.widgetObjectTypes.contains(TQAPPLICATION_OBJECT_NAME_STRING)) {
return;
}
TQApplication *app = reinterpret_cast<TQApplication*>(ptr);
if(!qstrcmp(app->name(), "konsole"))
konsoleMode = true;
else if(!qstrcmp(app->name(), "konqueror"))
konquerorMode = true;
else if(!qstrcmp(app->name(), "kicker"))
kickerMode = true;
TQPixmapCache::clear();
}
void DominoStyle::polish(TQPalette &p) {
p.setBrush(TQColorGroup::Button, p.active().background());
if(!_customPopupMenuColor)
_popupMenuColor = tqApp->palette().active().background();
if(!_customSelMenuItemColor)
_selMenuItemColor = tqApp->palette().active().highlight();
TQColor tabContour2 = tqApp->palette().active().background().dark(150);
delete border1;
border1= new TQPixmap(tintImage(qembed_findImage("border1"), tabContour2));
delete popupFrame;
popupFrame = new TQPixmap(tintImage(qembed_findImage("popup5"), _popupMenuColor.dark(150)));
if(!_customCheckMarkColor) {
delete checkMark;
checkMark = createCheckMark(tqApp->palette().active().foreground());
delete radioIndicator;
radioIndicator = createRadioIndicator(tqApp->palette().active().foreground());
}
}
void DominoStyle::polish( const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void *ptr )
{
if (!ceData.widgetObjectTypes.contains(TQWIDGET_OBJECT_NAME_STRING)) {
return;
}
TQWidget *widget = reinterpret_cast<TQWidget*>(ptr);
if(!strcmp(widget->name(), "__tdehtml")) { // is it a tdehtml widget...?
tdehtmlWidgets[widget] = true;
connect(widget, SIGNAL(destroyed(TQObject*)), this, SLOT(tdehtmlWidgetDestroyed(TQObject*)));
}
else if((!strcmp(widget->name(), "tdefile button") || (widget->isA("KLineEdit") && widget->parentWidget())) && !strcmp(widget->parentWidget()->name(), "__tdehtml")) {
widget->setBackgroundMode(TQt::NoBackground);
widget->parentWidget()->setBackgroundMode(TQt::NoBackground);
tdehtmlWidgets[widget] = true;
connect(widget, SIGNAL(destroyed(TQObject*)), this, SLOT(tdehtmlWidgetDestroyed(TQObject*)));
}
if(dynamic_cast<TQPushButton*>(widget)) {
setDominoButtonPalette(widget, Palette_Widget);
if (widget->isA("KDockButton_Private"))
widget->setFixedSize(13, 13); // 12x12 pixmap + 1px top and right spacing
else {
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
if(widget->parentWidget() && widget->parentWidget()->paletteBackgroundPixmap() && !tdehtmlWidgets.contains(widget)) {
widget->setBackgroundMode(TQt::PaletteButton);
widget->setBackgroundPixmap(*widget->parentWidget()->paletteBackgroundPixmap());
widget->setBackgroundOrigin(setPixmapOrigin(widget->parentWidget()->backgroundOrigin()));
}
}
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQCheckBox*>(widget)) {
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TDEToolBarButton*>(widget)) {
TDEToolBarButton* tb = static_cast<TDEToolBarButton*>(widget);
//setDominoButtonPalette(widget); // ### changing the palette breaks them!
if(tb->popupDelay() < 1)
tb->setPopupDelay(5); // now we have time to draw a pressed button
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQToolButton*>(widget)) {
TQToolButton* tb = static_cast<TQToolButton*>(widget);
tb->setBackgroundMode(TQt::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"))
// ((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
// else
installObjectEventHandler(ceData, elementFlags, ptr, this);
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
}
else if(dynamic_cast<TQRadioButton*>(widget)) {
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQComboBox*>(widget)) {
TQComboBox* cb = static_cast<TQComboBox*>(widget);
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
if(widget->parentWidget() && widget->parentWidget()->paletteBackgroundPixmap() && !tdehtmlWidgets.contains(widget)) {
widget->setBackgroundMode(TQt::PaletteButton);
widget->setBackgroundOrigin(setPixmapOrigin(widget->parentWidget()->backgroundOrigin()));
}
setDominoButtonPalette(widget, Palette_Widget);
if(cb->listBox())
cb->listBox()->setFrameStyle(TQFrame::Panel|TQFrame::Sunken);
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQGroupBox*>(widget)) {
TQGroupBox* gb = dynamic_cast<TQGroupBox*>(widget);
gb->setAlignment(TQt::AlignHCenter);
if(!gb->isFlat() && !gb->lineWidth() <= 0) {
if(gb->layout() && gb->layout()->margin() < 7)
gb->layout()->setMargin(7);
bool groupBoxFrame = gb->frameShape() == TQFrame::GroupBoxPanel;
if(groupBoxFrame)
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
if(groupBoxSettings.tintBackground && groupBoxFrame) {
TQColor color = getGroupBoxColor(gb);
TQPalette pal(widget->palette());
int h, s, v;
pal.active().foreground().hsv(&h, &s, &v);
pal.setColor(TQPalette::Active, TQColorGroup::Background, color);
pal.setColor(TQPalette::Inactive, TQColorGroup::Background, color);
pal.setColor(TQPalette::Disabled, TQColorGroup::Background, color);
pal.setColor(TQPalette::Disabled, TQColorGroup::Text, alphaBlendColors(pal.active().foreground(), color, 40));
gb->setPalette(pal);
if(gb->isCheckable()) {
((TQCheckBox*)gb->child("qt_groupbox_checkbox", 0, false))->setPaletteBackgroundColor(gb->parentWidget()->paletteBackgroundColor());
}
}
connect(widget, SIGNAL(destroyed(TQObject*)), this, SLOT(groupBoxDestroyed(TQObject*)));
}
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQSpinWidget*>(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()) {
TQWidget::BackgroundOrigin origin = widget->parentWidget()->backgroundOrigin();
if(origin == TQWidget::WidgetOrigin) {
widget->parentWidget()->setBackgroundOrigin(TQWidget::ParentOrigin);
widget->setBackgroundOrigin(TQWidget::AncestorOrigin);
}
else
widget->setBackgroundOrigin(setPixmapOrigin(origin));
}
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
setDominoButtonPalette(widget, Palette_Widget);
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQSpinBox*>(widget)) {
connect(dynamic_cast<TQSpinBox*>(widget), SIGNAL(valueChanged(int)), this, SLOT(spinBoxValueChanged(int)));
}
else if(dynamic_cast<TQLineEdit*>(widget)) {
TQLineEdit* le = dynamic_cast<TQLineEdit*>(widget);
TQRect r = le->rect();
le->setFrameRect(TQRect(r.x()+1, r.y(), r.width()-1, r.height()));
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQScrollBar*>(widget)) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQStatusBar*>(widget)) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQHeader*>(widget)) {
setDominoButtonPalette(widget, Palette_Widget);
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQPopupMenu*>(widget)) {
if(widget->isA("PanelKMenu"))
widget->setPaletteForegroundColor(alphaBlendColors(_popupMenuColor, tqApp->palette().active().foreground(), 150));
widget->setBackgroundMode( NoBackground );
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQTabWidget*>(widget)) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQTabBar*>(widget)) {
TQTabBar* tb = dynamic_cast<TQTabBar*>(widget);
if(widget->parentWidget() && widget->parentWidget()->isA("KonqFrameTabs")) {
tb->setShape(TQTabBar::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);
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQIconView*>(widget)) {
((DominoTQWidget*)dynamic_cast<TQIconView*>(widget)->viewport())->setWFlags(TQt::WNoAutoErase);
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
installObjectEventHandler(ceData, elementFlags, dynamic_cast<TQIconView*>(widget)->viewport(), this); // rubberband
if(strcmp(widget->className(), "KDIconView"))
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQListView*>(widget)) {
installObjectEventHandler(ceData, elementFlags, dynamic_cast<TQListView*>(widget)->viewport(), this); // rubberband
if(widget->isA("KonqTreeViewWidget")) { // konqi frames
TQFrame* f = dynamic_cast<TQFrame*>(widget);
f->setFrameStyle(TQFrame::Box|TQFrame::Plain);
f->setLineWidth(1);
}
if(!widget->isA("KopeteContactListView") && !widget->isA("ViewTree")) // they have their own mousewheel handling
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(widget->isA("KActiveLabel")) { // before TQScrollView
if(dynamic_cast<TQGroupBox*>(widget->parentWidget()))
widget->setPaletteBackgroundColor(widget->parentWidget()->paletteBackgroundColor());
}
else if(dynamic_cast<TQTextEdit*>(widget)) {
installObjectEventHandler(ceData, elementFlags, dynamic_cast<TQTextEdit*>(widget)->viewport(), this);
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQScrollView*>(widget)) {
TQFrame* f = dynamic_cast<TQFrame*>(widget);
if((konquerorMode && widget->isA("TDEHTMLView")) || f->parentWidget() && !strcmp(f->parentWidget()->name(), "KonqFrame")) { // konqi frames
f->setFrameStyle(TQFrame::Box|TQFrame::Plain);
f->setLineWidth(1);
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(_smoothScrolling && !widget->isA("TaskBar") && !widget->isA("Gwenview::ImageView"))
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQSlider*>(widget)) {
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
}
else if(dynamic_cast<TQListBox*>(widget)) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TDEToolBarSeparator*>(widget) || dynamic_cast<TQToolBar*>(widget)) {
widget->setBackgroundMode(TQt::PaletteBackground);
}
else if(widget->isA("KonqCheckBox")) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(widget->isA("TQTipLabel")) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(widget->isA("TQWhatsThat")) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(widget->isA("KonqFileTip")) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQButton*>(widget) && widget->parentWidget() && widget->parentWidget()->isA("TQToolBox")) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if( dynamic_cast<TQProgressBar*>(widget) && _animateProgressBar)
{
setDominoButtonPalette(widget, Palette_Widget);
progAnimWidgets[widget] = 0;
connect(widget, SIGNAL(destroyed(TQObject*)), this, SLOT(progressBarDestroyed(TQObject*)));
// if (!animationTimer->isActive())
// animationTimer->start( 50, false );
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TDEPopupTitle*>(widget)) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(dynamic_cast<TQFrame*>(widget)) {
TQFrame* f = dynamic_cast<TQFrame*>(widget);
switch (f->frameShape()) {
case TQFrame::Box:
f->setFrameStyle(TQFrame::StyledPanel|TQFrame::Sunken);
f->setLineWidth(2);
break;
case TQFrame::Panel:
if(kickerMode && f->parentWidget() && f->parentWidget()->isA("ClockApplet")) {
f->setLineWidth(0);
break;
}
case TQFrame::WinPanel:
f->setLineWidth(1);
installObjectEventHandler(ceData, elementFlags, ptr, this);
break;
case TQFrame::LineEditPanel: {
installObjectEventHandler(ceData, elementFlags, ptr, this);
break;
}
case TQFrame::TabWidgetPanel:
if(dynamic_cast<TQWidgetStack*>(widget)) {
if(f->parentWidget() && f->parentWidget()->isA("KonqFrameTabs"))
break;
f->setLineWidth(4);
f->setFrameRect(TQRect(0, 0, f->width(), f->height()-1));
f->setMargin(0);
TQWidget* w = widget->parentWidget();
for(int i=0; i<3; i++) { // the third parentcheck is for the tabWidget on kcm tdehtml_plugins
if(!w) break;
if(dynamic_cast<TQGroupBox*>(w)) {
widget->setPaletteBackgroundColor(tqApp->palette().active().background());
break;
}
w = w->parentWidget();
}
if(dynamic_cast<TQWidgetStack*>(widget)->widget(0)) // only if it has contents
((DominoTQWidget*)widget)->setWFlags(TQt::WNoAutoErase);
}
case TQFrame::HLine:
case TQFrame::VLine: {
installObjectEventHandler(ceData, elementFlags, ptr, this);
break;
}
case TQFrame::StyledPanel:
if(dynamic_cast<TQDockWindow*>(widget)) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(widget->isA("TQWorkspaceChild")) {
f->setFrameStyle(TQFrame::Panel|TQFrame::Sunken);
f->setLineWidth(1);
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(widget->isA("KAnimWidget"))
f->setLineWidth(0);
default:
break;
}
}
// else if (dynamic_cast<KDockSplitter*>(widget)) {
// installObjectEventHandler(ceData, elementFlags, ptr, this);
// } else if (dynamic_cast<KDockWidgetAbstractHeaderDrag*>(widget)) {
// installObjectEventHandler(ceData, elementFlags, ptr, this);
else if(widget->isA("TQDateTimeEditor")) {
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(widget->inherits("TQDockWindowHandle") || widget->isA("TQDockWindowResizeHandle") ||
widget->isA("AppletHandleDrag")) { // !qstrcmp(widget->name(), "qt_dockwidget_internal")
installObjectEventHandler(ceData, elementFlags, ptr, this);
}
else if(widget->isA("KDockWidget") && widget->parentWidget() && widget->parentWidget()->parentWidget()
&& widget->parentWidget()->parentWidget()->isA("Sidebar_Widget")) {
widget->setEraseColor(widget->palette().active().base());
}
// installObjectEventHandler(ceData, elementFlags, ptr, this);
//tqDebug("className %s, name: %s", widget->className(), widget->name());
}
void DominoStyle::unPolish( const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void *ptr )
{
if (!ceData.widgetObjectTypes.contains(TQWIDGET_OBJECT_NAME_STRING)) {
return;
}
TQWidget *widget = reinterpret_cast<TQWidget*>(ptr);
if( !strcmp(widget->name(), "__tdehtml") || (!strcmp(widget->name(), "tdefile button") && !strcmp(widget->parentWidget()->name(), "__tdehtml"))) { // is it a tdehtml widget...?
tdehtmlWidgets.remove(widget);
}
if (dynamic_cast<TQPushButton*>(widget) ||
dynamic_cast<TQSpinWidget*>(widget) || dynamic_cast<TQSlider*>(widget) ||
dynamic_cast<TQRadioButton*>(widget) ||
dynamic_cast<TQListBox*>(widget) || dynamic_cast<TQListView*>(widget) ||
dynamic_cast<TQStatusBar*>(widget) || widget->isA("AppletHandleDrag") ||
widget->isA("TQDockWindowHandle"))
{
((DominoTQWidget*)widget)->clearWFlags(TQt::WNoAutoErase);
widget->removeEventFilter(this);
}
else if(widget->isA("KonqCheckBox") || widget->isA("TQWhatsThat") || widget->isA("TQTipLabel")) {
widget->removeEventFilter(this);
widget->setPaletteBackgroundColor(tqApp->palette().active().background());
widget->setBackgroundMode(TQt::PaletteBackground);
}
else if(dynamic_cast<TQTabWidget*>(widget) || dynamic_cast<TQTabBar*>(widget)) {
widget->removeEventFilter(this);
widget->setBackgroundMode(TQt::PaletteBackground);
}
else if(dynamic_cast<TQCheckBox*>(widget)) {
((DominoTQWidget*)widget)->clearWFlags(TQt::WNoAutoErase);
widget->removeEventFilter(this);
}
else if(dynamic_cast<TQComboBox*>(widget)) { // after KonqCheckBox
((DominoTQWidget*)widget)->clearWFlags(TQt::WNoAutoErase);
widget->removeEventFilter(this);
}
else if(dynamic_cast<TQHeader*>(widget)) {
widget->removeEventFilter(this);
widget->setBackgroundMode(TQt::PaletteButton);
}
else if(dynamic_cast<TQPopupMenu*>(widget)) {
widget->removeEventFilter(this);
widget->setBackgroundMode(TQt::PaletteBackground);
static_cast<TQFrame*>(widget)->setLineWidth(2);
widget->clearMask();
}
else if(dynamic_cast<TDEToolBarButton*>(widget)) {
widget->removeEventFilter(this);
widget->setBackgroundMode(TQt::PaletteBackground);
}
else if(dynamic_cast<TQGroupBox*>(widget)) {
widget->removeEventFilter(this);
((DominoTQWidget*)widget)->clearWFlags(TQt::WNoAutoErase);
TQGroupBox* gb = dynamic_cast<TQGroupBox*>(widget);
gb->setBackgroundMode(TQt::PaletteBackground);
gb->setPalette(tqApp->palette());
gb->setAlignment(TQt::AlignLeft|TQt::AlignBottom);
}
else if(dynamic_cast<TQLineEdit*>(widget)) {
widget->removeEventFilter(this);
widget->setBackgroundMode(TQt::PaletteBase);
TQLineEdit* le = dynamic_cast<TQLineEdit*>(widget);
TQRect r = le->rect();
le->setFrameRect(TQRect(r.x()-1, r.y(), r.width()+1, r.height()));
widget->clearMask();
}
else if(dynamic_cast<TQProgressBar*>(widget) ) {
progAnimWidgets.remove(widget);
}
else if(dynamic_cast<TDEToolBarSeparator*>(widget) || dynamic_cast<TQToolBar*>(widget) ) {
widget->removeEventFilter(this);
widget->setBackgroundMode(TQt::PaletteButton);
}
if(widget->isA("KonqFileTip")) {
widget->removeEventFilter(this);
widget->setPaletteBackgroundColor(widget->palette().active().background());
TQFrame* f = dynamic_cast<TQFrame*>(widget);
f->setMargin(1);
f->setFrameStyle(TQFrame::Plain|TQFrame::Box);
TQObjectList *list = const_cast<TQObjectList *>(widget->children());
TQObjectListIt it( *list );
TQObject * o;
while ( (o = it.current()) != 0 ) {
++it;
if(dynamic_cast<TQLabel*>(o)) {
TQLabel* l = dynamic_cast<TQLabel*>(o);
l->setBackgroundOrigin(TQWidget::WidgetOrigin);
l->setBackgroundMode(TQt::PaletteBackground);
l->setPaletteBackgroundColor(l->palette().active().background());
}
}
}
else if(dynamic_cast<TQScrollView*>(widget)) {
TQFrame* f = dynamic_cast<TQFrame*>(widget);
if((konquerorMode && widget->isA("TDEHTMLView")) || f->parentWidget() && !strcmp(f->parentWidget()->name(), "KonqFrame")) { // konqi frames
widget->removeEventFilter(this);
f->setFrameStyle(TQFrame::NoFrame|TQFrame::Plain);
f->setLineWidth(0);
}
}
else if(dynamic_cast<TDEPopupTitle*>(widget)) {
widget->removeEventFilter(this);
}
else if(dynamic_cast<TQFrame*>(widget)) {
widget->removeEventFilter(this);
TQFrame* f = dynamic_cast<TQFrame*>(widget);
switch(f->frameShape()) {
case TQFrame::Panel:
if(widget->isA("TQWorkspaceChild")) {
f->setFrameStyle(TQFrame::StyledPanel|TQFrame::Sunken);
f->setLineWidth(2);
}
break;
case TQFrame::WinPanel:
f->setLineWidth(2);
break;
case TQFrame::TabWidgetPanel:
f->setLineWidth(2);
f->setMargin(2);
f->setFrameRect(TQRect(0, 0, 0, 0));
break;
case TQFrame::StyledPanel:
if(widget->isA("KAnimWidget"))
f->setLineWidth(2);
break;
default:
break;
}
}
TDEStyle::unPolish( ceData, elementFlags, ptr );
}
void DominoStyle::tdehtmlWidgetDestroyed(TQObject* obj)
{
tdehtmlWidgets.remove(static_cast<TQWidget*>(obj));
}
void DominoStyle::groupBoxDestroyed(TQObject* obj)
{
groupBoxPixmaps.remove(static_cast<TQGroupBox*>(obj));
}
void DominoStyle::progressBarDestroyed(TQObject* obj)
{
progAnimWidgets.remove(static_cast<TQWidget*>(obj));
}
void DominoStyle::renderContour(TQPainter *p, const TQRect &r, const TQColor &backgroundColor, const TQColor &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;
TQColor appButtonColor = tqApp->palette().active().button();
if(isButton) {
TQRect sr = TQRect(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
TQColor insideBackground;
TQColor gr1TopColor;
TQColor gr1BottomColor;
TQColor gr2TopColor;
TQColor gr2BottomColor;
const int alphaInside = tqAlpha(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);
}
TQRegion clip;
if(drawTop)
clip += TQRegion(r.left()+6, r.top()+2, r.width()-12, 1);
if(drawBottom)
clip += TQRegion(r.left()+6, r.bottom()-3, r.width()-12, 1);
if(drawLeft)
clip += TQRegion(r.left()+2, r.top()+6, 1, r.height()-13);
if(drawRight)
clip += TQRegion(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, TQRect(sr.x(), top, sr.width(), bottom), gr1TopColor, gr1BottomColor, true);
else
renderGradient(p, TQRect(left, sr.y(), width, sr.height()), gr1TopColor, gr1BottomColor, false);
break;
case 2:
if(isHorizontal) {
renderGradient(p, TQRect(r.x(), top, r.width(), bottom), gr1TopColor, gr1BottomColor, true);
renderGradient(p, TQRect(r.x(), top2, r.width(), bottom2), gr2TopColor, gr2BottomColor, true);
}
else {
renderGradient(p, TQRect(left, sr.y(), width, sr.height()), gr1TopColor,gr1BottomColor, false);
renderGradient(p, TQRect(left2, sr.y(), width2, sr.height()), gr2TopColor,gr2BottomColor, false);
}
default:
break;
}
p->setClipping(false);
const TQColor color1 = alphaBlendColors(buttonContour->color1(), backgroundColor, tqAlpha(buttonContour->color1())); // 1.top
const TQColor color4 = alphaBlendColors(buttonContour->color4(), backgroundColor, tqAlpha(buttonContour->color4())); // 3.bottom
const TQColor color5 = alphaBlendColors(buttonContour->color5(), backgroundColor, tqAlpha(buttonContour->color5())); // 4.bottom
const TQColor color2 = alphaBlendColors(buttonContour->color2(), backgroundColor, tqAlpha(buttonContour->color2())); // 2.top 2.left 2.bottom
const TQColor color6 = alphaBlendColors(buttonContour->color6(), backgroundColor, tqAlpha(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) {
TQColor background;
TQColor gr1TopColor;
TQColor gr1BottomColor;
TQColor gr2TopColor;
TQColor 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;
}
TQColor btnContour = buttonContour->contourColor(Contour_Default);
TQColor whiteColor( tqRgba(TQt::white.red(), TQt::white.green(), TQt::white.blue(), 23)); // first white layer
TQColor blackColor( tqRgba(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);
TQRegion clip;
if(drawTop)
clip += TQRegion(r.left(), r.top()+1, r.width(), 1);
if(drawBottom)
clip += TQRegion(r.left(), r.bottom()-1, r.width(), 1);
if(drawLeft)
clip += TQRegion(r.left()+1, r.top(), 1, r.height());
if(drawRight)
clip += TQRegion(r.right()-1, r.top(), 1, r.height());
p->setClipRegion(clip);
TQRect 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, TQRect(sr.x(), top, sr.width(), bottom), gr1TopColor, gr1BottomColor, true);
else
renderGradient(p, TQRect(left, sr.y(), width, sr.height()), gr1TopColor, gr1BottomColor, false);
break;
case 2:
if(isHorizontal) {
renderGradient(p, TQRect(r.x(), top, r.width(), bottom), gr1TopColor, gr1BottomColor, true);
renderGradient(p, TQRect(r.x(), top2, r.width(), bottom2), gr2TopColor, gr2BottomColor, true);
}
else {
renderGradient(p, TQRect(left, sr.y(), width, sr.height()), gr1TopColor,gr1BottomColor, false);
renderGradient(p, TQRect(left2, sr.y(), width2, sr.height()), gr2TopColor,gr2BottomColor, false);
}
default:
break;
}
p->setClipping(false);
TQColor color1 = alphaBlendColors(buttonContour->contourColor(Contour_Default), backgroundColor, 203); // like btn contour
TQColor color2 = alphaBlendColors(TQColor(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, TQPoint(r.x()+1, r.y()+1), 127, color1, color1, true);
p->drawPoint(r.x(), r.y());
}
if(roundUpperRight) {
renderPixel(p, TQPoint(r.right()-1, r.top()+1), 127, color1, color1, true);
p->drawPoint(r.right(), r.y());
}
if(roundBottomLeft) {
renderPixel(p, TQPoint(r.x()+1, r.bottom()-1), 127, color1, color1, true);
p->drawPoint(r.x(), r.bottom());
}
if(roundBottomRight) {
renderPixel(p, TQPoint(r.right()-1, r.bottom()-1), 127, color1, color1, true);
p->drawPoint(r.right(), r.bottom());
}
}
return;
}
void DominoStyle::renderSurface(TQPainter *p,
const TQRect &r,
const TQColor &backgroundColor,
const TQColor &buttonColor,
const TQColor &/*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;
TQColor g1Color1;
TQColor g1Color2;
TQColor g2Color1;
TQColor g2Color2;
TQColor background;
if(buttonColor != tqApp->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) {
TQRegion mask(r.x()+2, r.y(), r.width()-4, r.height());
mask += TQRegion(r.x()+1, r.y()+1, r.width()-2, r.height()-2);
mask += TQRegion(r.x(), r.y()+2, r.width(), r.height()-4);
p->setClipRegion(mask, TQPainter::CoordPainter);
}
TQRect re = r;
if(re.x() < 0 ) {
re.setWidth(re.width()+TQABS(re.x()));
re.setX(0);
}
else if(re.y() < 0 ) {
re.setHeight(re.height()+TQABS(re.y()));
re.setY(0);
}
TQPixmap pix(re.width(), re.height());
pix.fill(background);
TQPainter 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, TQRect(0, top, re.width(), bottom), g1Color1, g1Color2, true);
}
else {
renderGradient(&painter, TQRect(left, 0, width, re.height()), g1Color1, g1Color2, false);
}
break;
}
case 2: {
if(horizontal) {
renderGradient(&painter, TQRect(0, top, re.width(), bottom), g1Color1, g1Color2, true);
renderGradient(&painter, TQRect(0, top2, re.width(), bottom2), g2Color1, g2Color2, true);
}
else {
renderGradient(&painter, TQRect(left, 0, width, re.height()), g1Color1, g1Color2, false);
renderGradient(&painter, TQRect(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, TQRect(r.x(), top, r.width(), bottom), g1Color1, g1Color2, true);
break;
}
case 2: {
renderGradient(p, TQRect(r.x(), top, r.width(), bottom), g1Color1, g1Color2, true);
renderGradient(p, TQRect(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, TQRect(r.left(), top, r.width(), bottom), g1Color1, g1Color2, true);
}
else {
renderGradient(p, TQRect(left, r.top(), width, r.height()), g1Color1, g1Color2, false);
}
break;
}
case 2: {
if(horizontal) {
renderGradient(p, TQRect(r.left(), top, r.width(), bottom), g1Color1, g1Color2, true);
renderGradient(p, TQRect(r.left(), top2, r.width(), bottom2), g2Color1, g2Color2, true);
}
else {
renderGradient(p, TQRect(left, r.top(), width, r.height()), g1Color1, g1Color2, false);
renderGradient(p, TQRect(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, TQRect(r.left(), top, r.width(), bottom), g1Color1, g1Color2, true);
}
else {
renderGradient(p, TQRect(left, r.top(), width, r.height()), g1Color1, g1Color2, false);
}
break;
}
case 2: {
if(horizontal) {
renderGradient(p, TQRect(r.left(), top, r.width(), bottom), g1Color1, g1Color2, true);
renderGradient(p, TQRect(r.left(), top2, r.width(), bottom2), g2Color1, g2Color2, true);
}
else {
renderGradient(p, TQRect(left, r.top(), width, r.height()), g1Color1, g1Color2, false);
renderGradient(p, TQRect(left2, r.top(), width2, r.height()), g2Color1, g2Color2, false);
}
}
default:
break;
}
}
else if(isCheckItem) {
TQPixmap pix(r.width(), r.height());
pix.fill(background);
TQPainter 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, TQRect(0, top, r.width(), bottom), g1Color1, g1Color2, true);
break;
}
case 2: {
renderGradient(&painter, TQRect(0, top, r.width(), bottom), g1Color1, g1Color2, true);
renderGradient(&painter, TQRect(0, top2, r.width(), bottom2), g2Color1, g2Color2, true);
break;
}
default: break;
}
painter.end();
p->drawPixmap(TQRect(r.x(), r.y()+3, r.width(), r.height()-7), pix);
}
else if(isHeader) {
TQHeader* hdr = dynamic_cast<TQHeader*>(p->device());
bool needErasePixmap = false;
TQRect re = r;
bool horizontal = false;
bool drawTop = false;
if(hdr) {
if(hdr->orientation() == TQt::Horizontal) {
horizontal = true;
bool hasErasePixmap = hdr->erasePixmap();
if(hasErasePixmap && !isDown) {
hdr->erase(r);
return;
}
else if(!hasErasePixmap && !isDown) {
needErasePixmap = true;
re = TQRect(0, 0, 10, r.height());
}
}
else if(hdr->sectionAt(r.top()+hdr->offset()) == 0 && r.y() == 0)
drawTop = true;
}
TQPixmap pix(re.width(), re.height());
pix.fill(background);
TQPainter 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, TQRect(0, top, re.width(), bottom), g1Color1, g1Color2, true);
break;
}
case 2: {
renderGradient(&painter, TQRect(0, top, re.width(), bottom), g1Color1, g1Color2, true);
renderGradient(&painter, TQRect(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(TQPainter *p,
const TQPoint &pos,
const int alpha,
const TQColor &color,
const TQColor &background,
bool fullAlphaBlend) const
{
if(fullAlphaBlend)
// full alpha blend: paint into an image with alpha buffer and convert to a pixmap ...
{
TQRgb 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 );
}
}
TQImage aImg(1,1,32); // 1x1
aImg.setAlphaBuffer(true);
aImg.setPixel(0,0,tqRgba(tqRed(rgb),tqGreen(rgb),tqBlue(rgb),alpha));
TQPixmap *result = new TQPixmap(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.
{
TQRgb rgb_a = color.rgb();
TQRgb rgb_b = background.rgb();
int a = alpha;
if(a>255) a = 255;
if(a<0) a = 0;
int a_inv = 255 - a;
TQColor res = TQColor( tqRgb(tqRed(rgb_b)*a_inv/255 + tqRed(rgb_a)*a/255,
tqGreen(rgb_b)*a_inv/255 + tqGreen(rgb_a)*a/255,
tqBlue(rgb_b)*a_inv/255 + tqBlue(rgb_a)*a/255) );
p->setPen(res);
p->drawPoint(pos);
}
}
void DominoStyle::renderButtonShadow(TQPainter *p, const TQRect &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, TQt::CopyROP);
}
else if(flags&Rectangular_UpperLeft){
bitBlt(p->device(), r.left(), r.top(), buttonContour->shadowRectangular(), 0, 0, 5, 5, TQt::CopyROP);
}
if(flags&Round_UpperRight) {
bitBlt(p->device(), r.right()-6, r.top(), buttonContour->shadowRound(), 5, 0, 5, 5, TQt::CopyROP);
}
else if(flags&Rectangular_UpperRight){
bitBlt(p->device(), r.right()-6, r.top(), buttonContour->shadowRectangular(), 5, 0, 5, 5, TQt::CopyROP);
}
if(flags&Round_BottomLeft) {
bitBlt(p->device(), r.left(), r.bottom()-5, buttonContour->shadowRound(), 0, 5, 4, 4, TQt::CopyROP);
}
else if(flags&Rectangular_BottomLeft)
bitBlt(p->device(), r.left(), r.bottom()-5, buttonContour->shadowRectangular(), 0, 5, 4, 4, TQt::CopyROP);
if(flags&Round_BottomRight) {
bitBlt(p->device(), r.right()-5, r.bottom()-5, buttonContour->shadowRound(), 4, 5, 4, 4, TQt::CopyROP);
}
else if(flags&Rectangular_BottomRight)
bitBlt(p->device(), r.right()-5, r.bottom()-5, buttonContour->shadowRectangular(), 4, 5, 4, 4, TQt::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(TQPainter *p,
const TQRect &r,
const TQColorGroup &g,
bool sunken,
bool /*mouseOver*/,
bool horizontal,
bool enabled,
bool tdehtmlMode) const
{
uint contourFlags = Draw_Left|Draw_Right|Draw_Top|Draw_Bottom;
if(!enabled) contourFlags|=Is_Disabled;
if(tdehtmlMode || 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;
}
}
// TQColor buttonColor = tdehtmlMode ? g.button() : tqApp->palette().active().background();
if (!flatMode) {
contourFlags |= Round_UpperLeft|Round_UpperRight|Round_BottomLeft|Round_BottomRight|Is_Button;
renderSurface(p, TQRect(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, TQRect(r.x()+2, r.y()+2, r.width()-2, r.height()-3), contourFlags);
}
}
else {
renderSurface(p, TQRect(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, TQRect(r.x()-2, r.y()-2, r.width()+4, r.height()+4), contourFlags);
}
}
}
void DominoStyle::renderHeader(TQPainter *p,
const TQRect &r,
const TQColorGroup &g,
bool sunken,
bool /*mouseOver*/,
bool /*horizontal*/,
bool /*enabled*/) const
{
p->save();
bool drawLeft = true;
TQHeader* hd = dynamic_cast<TQHeader*>(p->device());
if(hd && hd->orientation() == TQt::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, TQRect(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(TQPainter *painter,
const TQRect &rect,
const TQColor &c1,
const TQColor &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...
TQPixmap *result = new TQPixmap(horizontal ? 10 : rect.width(),
horizontal ? rect.height() : 10);
TQPainter 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(TQColor(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(TQColor(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(TQPainter *p,
const TQRect &r,
const TQColorGroup &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);
TQPixmap buffer(r.width(), r.height());
TQPainter painter(&buffer);
TQColor tabContour2 = g.background().dark(150);
TQPixmap* tabEdges;
if(!(tabEdges = TQPixmapCache::find(TQString::number(tabContour2.pixel(), 16)+"tabEdges"))) {
TQImage img1 = tintImage(qembed_findImage("border1"), tabContour2);
TQImage img2 = qembed_findImage("tabInsideWhite");
blend(img1, img2, img2);
tabEdges = new TQPixmap(img2);
TQPixmapCache::insert(TQString::number(tabContour2.pixel(), 16)+"tabEdges", tabEdges);
}
TQPixmap* tabHLines;
if(!(tabHLines = TQPixmapCache::find("tabHLines"))) {
tabHLines = new TQPixmap(qembed_findImage("tabHLines"));
TQPixmapCache::insert("tabHLines", tabHLines);
}
TQPixmap* tabVLines;
if(!(tabVLines = TQPixmapCache::find("tabVLines"))) {
tabVLines = new TQPixmap(qembed_findImage("tabVLines"));
TQPixmapCache::insert("tabVLines", tabVLines);
}
if(konqTab) {
const TQColor 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, TQRect(1, 0, r.width()-2, r.height()-3), g.background(), g.button(), g.button(), Is_ActiveTabBottom);
painter.translate(0, -2);
TQPixmap* tabEdges2;
TQString position = isFirst ? "first" : isLast ? "last" : isSingle ? "single" : "middle";
if(!(tabEdges2 = TQPixmapCache::find(position+"tabEdges2-k-sel"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height())))) {
tabEdges2 = new TQPixmap(16, 8);
tabEdges2->fill(background);
TQPainter painter2(tabEdges2);
// parts of the unselected tabs under the rounded edges
if(!isSingle) {
if(!isFirst) {
painter2.translate(0, -r.height()+12);
renderSurface(&painter2, TQRect(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(TQColor(0,0,0), background, 79)); // bottomShadow1
painter2.drawLine(0, 4, 1, 4);
painter2.setPen(alphaBlendColors(TQColor(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, TQRect(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(TQColor(0,0,0), background, 79)); // bottomShadow1
painter2.drawLine(14, 4, 15, 4);
painter2.setPen(alphaBlendColors(TQColor(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(TQRect(0, 6, 16, 2), background);
painter2.end();
TQPixmap 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, TQRect(0, 0, 16, r.height()-3), g.background(), g.button(), g.button(), Is_ActiveTabBottom);
painter2.end();
bitBlt(tabEdges2, 0, 0, &tabEdgesMask, 0, 8);
TQPixmap circle = qembed_findImage("tabWidget");
bitBlt(tabEdges2, 0, 0, &circle, 0, 8);
TQPixmapCache::insert(position+"tabEdges2-k-sel"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height()), tabEdges2);
}
painter.setPen(alphaBlendColors(TQColor(0,0,0), background, 79)); // bottomShadow1
painter.drawLine(8, r.height()-3, r.width()-9, r.height()-3);
painter.setPen(alphaBlendColors(TQColor(0,0,0), background, 30)); // bottomShadow2
painter.drawLine(8, r.height()-2, r.width()-9, r.height()-2);
painter.setPen(alphaBlendColors(TQColor(0,0,0), background, 35));
painter.translate(0,3);
if(isFirst || isSingle)
painter.drawLine(0, -1, 0, r.height()-13); // left
else
renderTabSeparator(&painter, TQRect(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, TQRect(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(TQColor(0,0,0), g.background(), 20));
painter.drawPoint(0,1);
painter.drawPoint(r.width()-1,1);
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 50));
painter.drawPoint(0,2);
painter.drawPoint(r.width()-1,2);
//TQColor tmp = alphaBlendColors(TQColor(255,255,255), g.background(), 14);
TQColor 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));//TQColor(110,110,110) // 1. tabbarline
painter.drawLine(0, 1, r.width(), 1);
painter.setPen(g.background().dark(konqTabBarContrast+20)); //TQColor(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, TQRect(1, 0, r.width()-2, r.height()-5-3), g.background(), g.button(), g.button(), Is_TabBottom);
painter.translate(0, -3);
TQPixmap* tabEdges2;
if(!(tabEdges2 = TQPixmapCache::find("tabEdges2-k"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height())))) {
tabEdges2 = new TQPixmap(16, 8);
tabEdges2->fill(background);
TQPixmap tabEdgesMask = qembed_findImage("groupBoxMask");
TQPainter painter2(&tabEdgesMask);
painter2.translate(0, -r.height()+19+3);
renderSurface(&painter2, TQRect(1, 0, 14, r.height()-5-3), g.background(), g.button(), g.button(), Is_TabBottom);
painter2.end();
bitBlt(tabEdges2, 0, 0, &tabEdgesMask, 0, 8);
TQPixmap circle = qembed_findImage("tabWidget");
bitBlt(tabEdges2, 0, 0, &circle, 0, 8);
TQPixmapCache::insert("tabEdges2-k"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height()), tabEdges2);
}
if(isFirst) {
painter.translate(0,3);
renderTabSeparator(&painter, TQRect(r.width()-1, 0, 1, r.height()-5-3), g.button(), false);// right
painter.translate(0,-3);
painter.setPen(alphaBlendColors(TQColor(0,0,0), background, 79)); // bottomShadow1
painter.drawLine(8, r.height()-5, r.width()-1, r.height()-5);
painter.setPen(alphaBlendColors(TQColor(0,0,0), background, 30)); // bottomShadow2
painter.drawLine(8, r.height()-4, r.width()-1, r.height()-4);
painter.setPen(alphaBlendColors(TQColor(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, TQRect(0, 0, 1, r.height()-5-3), g.button(), false); // left
painter.translate(0,-3);
painter.setPen(alphaBlendColors(TQColor(0,0,0), background, 79)); // bottomShadow1
painter.drawLine(0, r.height()-5, r.width()-8, r.height()-5);
painter.setPen(alphaBlendColors(TQColor(0,0,0), background, 30)); // bottomShadow2
painter.drawLine(0, r.height()-4, r.width()-8, r.height()-4);
painter.setPen(alphaBlendColors(TQColor(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, TQRect(0, 0, 1, r.height()-5-3), g.button(), false); // left
renderTabSeparator(&painter, TQRect(r.width()-1, 0, 1, r.height()-5-3), g.button(), false);// right
painter.translate(0,-3);
painter.translate(0, 3);
renderSurface(&painter, TQRect(1, 0, r.width()-2, r.height()-5-3), g.background(), g.button(), g.button(), Is_TabBottom);
painter.translate(0, -3);
painter.setPen(alphaBlendColors(TQColor(0,0,0), background, 79)); // bottomShadow1
painter.drawLine(0, r.height()-5, r.width()-1, r.height()-5);
painter.setPen(alphaBlendColors(TQColor(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(TQRect(0, r.height()-3, r.width(), 3), background);
}
p->drawPixmap(r.left(), r.top(), buffer);
}
else { // standard tabs
if(bottom) {
if (selected) {
renderSurface(&painter, TQRect(1, 0, r.width()-2, r.height()-2), g.background(), g.button(), g.button(), Is_ActiveTabBottom);
TQPixmap* tabEdges2;
TQString position = isFirst ? "first" : isLast ? "last" : isSingle ? "single" : "middle";
if(!(tabEdges2 = TQPixmapCache::find(position+"tabEdges2-bottom-sel"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height())))) {
tabEdges2 = new TQPixmap(16, 8);
tabEdges2->fill(g.background());
TQPainter painter2(tabEdges2);
if(!isSingle) {
if(!isFirst) {
painter2.translate(0, -r.height()+8);
renderSurface(&painter2, TQRect(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(TQColor(0,0,0), g.background(), 79));
painter2.drawLine(0, 3, 1,3);
painter2.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 30));
painter2.drawLine(0, 4, 3, 4);
}
if(!isLast) {
painter2.translate(0, -r.height()+8);
renderSurface(&painter2, TQRect(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(TQColor(0,0,0), g.background(), 79));
painter2.drawLine(14, 3, 15, 3);
painter2.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 30));
painter2.drawLine(12, 4, 15, 4);
}
}
painter2.fillRect(TQRect(0, 5, 16, 3), g.background());
painter2.end();
TQPixmap tabEdgesMask = qembed_findImage("groupBoxMask");
painter2.begin(&tabEdgesMask);
painter2.translate(0, -r.height()+16);
renderSurface(&painter2, TQRect(1, 0, 14, r.height()-2), g.background(), g.button(), g.button(), Is_ActiveTabBottom);
painter2.end();
bitBlt(tabEdges2, 0, 0, &tabEdgesMask, 0, 8);
TQPixmap circle = qembed_findImage("tabWidget");
bitBlt(tabEdges2, 0, 0, &circle, 0, 8);
TQPixmapCache::insert(position+"tabEdges2-bottom-sel"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height()), tabEdges2);
}
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 79)); // bottomShadow1
painter.drawLine(8, r.height()-2, r.width()-9, r.height()-2);
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 30)); // bottomShadow2
painter.drawLine(8, r.height()-1, r.width()-9, r.height()-1);
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 35));
if(isFirst || isSingle)
painter.drawLine(0, 0, 0, r.height()-8); // left
else
renderTabSeparator(&painter, TQRect(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, TQRect(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(TQColor(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, TQRect(1, 0, r.width()-2, r.height()-5), g.background(), g.button(), g.button(), Is_TabBottom);
if(isFirst || isLast) {
TQPixmap* tabEdges2;
if(!(tabEdges2 = TQPixmapCache::find("tabEdges2-bottom"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height())))) {
tabEdges2 = new TQPixmap(16, 8);
tabEdges2->fill(g.background());
TQPixmap tabEdgesMask = qembed_findImage("groupBoxMask");
TQPainter painter2(&tabEdgesMask);
painter2.translate(0, -r.height()+19);
renderSurface(&painter2, TQRect(1, 0, 14, r.height()-5), g.background(), g.button(), g.button(), Is_TabBottom);
painter2.end();
bitBlt(tabEdges2, 0, 0, &tabEdgesMask, 0, 8);
TQPixmap circle = qembed_findImage("tabWidget");
bitBlt(tabEdges2, 0, 0, &circle, 0, 8);
TQPixmapCache::insert("tabEdges2-bottom"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height()), tabEdges2);
}
if(isFirst) {
renderTabSeparator(&painter, TQRect(r.width()-1, 0, 1, r.height()-5), g.button(), false);// right
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 79)); // bottomShadow1
painter.drawLine(8, r.height()-5, r.width()-1, r.height()-5);
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 30)); // bottomShadow2
painter.drawLine(8, r.height()-4, r.width()-1, r.height()-4);
painter.setPen(alphaBlendColors(TQColor(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(TQColor(0,0,0), g.background(), 55));
painter.drawLine(0, 0, r.width()-1, 0); // top
}
else {
renderTabSeparator(&painter, TQRect(0, 0, 1, r.height()-5), g.button(), false); // left
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 79)); // bottomShadow1
painter.drawLine(0, r.height()-5, r.width()-8, r.height()-5);
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 30)); // bottomShadow2
painter.drawLine(0, r.height()-4, r.width()-8, r.height()-4);
painter.setPen(alphaBlendColors(TQColor(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(TQColor(0,0,0), g.background(), 55));
painter.drawLine(0, 0, r.width()-1, 0); // top
}
}
else { // middle
renderTabSeparator(&painter, TQRect(0, 0, 1, r.height()-5), g.button(), false); // left
renderTabSeparator(&painter, TQRect(r.width()-1, 0, 1, r.height()-5), g.button(), false);// right
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 79)); // bottomShadow1
painter.drawLine(0, r.height()-5, r.width()-1, r.height()-5);
painter.setPen(alphaBlendColors(TQColor(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(TQColor(0,0,0), g.background(), 55));
painter.drawLine(0, 0, r.width()-1, 0); // top
}
painter.fillRect(TQRect(0, r.height()-3, r.width(), 3), g.background()); // rect under the tab, clips also the tabSeperator
}
}
else { // above
if (selected) {
renderSurface(&painter, TQRect(1, 1, r.width()-2, r.height()), g.background(), g.button(), g.button(), Is_ActiveTabTop);
TQPixmap* tabEdges2;
TQString position = isFirst ? "first" : isLast ? "last" : isSingle ? "single" : "middle";
if(!(tabEdges2 = TQPixmapCache::find(position+"tabEdges2-top-sel"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height())))) {
tabEdges2 = new TQPixmap(16,8);
tabEdges2->fill(g.background());
TQPainter painter2(tabEdges2);
if(!isSingle) {
painter2.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 25));
if(!isFirst) {
renderSurface(&painter2, TQRect(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, TQRect(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();
TQPixmap tabEdgesMask = qembed_findImage("groupBoxMask");
painter2.begin(&tabEdgesMask);
renderSurface(&painter2, TQRect(1, 1, 14, r.height()), g.background(), g.button(), g.button(), Is_ActiveTabTop);
painter2.end();
bitBlt(tabEdges2, 0, 0, &tabEdgesMask);
TQPixmap circle = qembed_findImage("tabWidget");
bitBlt(tabEdges2, 0, 0, &circle);
TQPixmapCache::insert(position+"tabEdges2-top-sel"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height()), tabEdges2);
}
///////////////////////////////////////////////
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 35));
///painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 40));
if(isFirst || isSingle)
painter.drawLine(0, 8, 0, r.height()-1); // left
else
renderTabSeparator(&painter, TQRect(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, TQRect(r.width()-1, 4, 1, r.height()), g.button(), true);
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 25));
painter.drawLine(8, 0, r.width()-9, 0); // top
bitBlt(&buffer, 0, 0, tabEdges2, 0, 0, 8, 8, TQt::CopyROP);
bitBlt(&buffer, r.width()-8, 0, tabEdges2, 8, 0, 8, 8, TQt::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(TQColor(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, TQRect(1, 4, r.width()-2, r.height()), g.background(), g.button(), g.button(), Is_TabTop);
if(isFirst || isLast) {
TQPixmap* tabEdges2;
if(!(tabEdges2 = TQPixmapCache::find("tabEdges2-top"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height())))) {
tabEdges2 = new TQPixmap(16, 8);
tabEdges2->fill(g.background());
TQPixmap tabEdgesMask = qembed_findImage("groupBoxMask");
TQPainter painter2(&tabEdgesMask);
renderSurface(&painter2, TQRect(1, 1, r.width()-2, r.height()), g.background(), g.button(), g.button(), Is_TabTop);
painter2.end();
bitBlt(tabEdges2, 0, 0, &tabEdgesMask);
TQPixmap circle = qembed_findImage("tabWidget");
bitBlt(tabEdges2, 0, 0, &circle);
TQPixmapCache::insert("tabEdges2-top"+TQString::number(g.background().pixel(), 16)+TQString::number(r.height()), tabEdges2);
}
if(isFirst) {
// darker separator
renderTabSeparator(&painter, TQRect(r.width()-1, 4, 1, r.height()), g.button(), true); // left
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 25));
painter.drawLine(8, 3, r.width()-1, 3); // topLine
painter.setPen(alphaBlendColors(TQColor(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, TQRect(0, 4, 1, r.height()), g.button(), true); // right
painter.setPen(alphaBlendColors(TQColor(0,0,0), g.background(), 25));
painter.drawLine(0, 3, r.width()-9, 3); // topLine
painter.setPen(alphaBlendColors(TQColor(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, TQRect(r.width()-1, 4, 1, r.height()), g.button(), true); // left
renderTabSeparator(&painter, TQRect(0, 4, 1, r.height()), g.button(), true); // right
painter.setPen(alphaBlendColors(TQColor(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(TQColor(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::drawTDEStylePrimitive(TDEStylePrimitive kpe,
TQPainter *p,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQRect &r,
const TQColorGroup &cg,
SFlags flags,
const TQStyleOption& opt,
const TQWidget* widget) const
{
//return TDEStyle::drawTDEStylePrimitive(kpe, p, ceData, elementFlags, r, cg, flags, opt, widget);
// SLIDER
// ------
switch( kpe ) {
case KPE_SliderGroove: {
bool horizontal = ((const TQSlider*)widget)->orientation() == Horizontal;
TQRect 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;
TQString hori = horizontal ? "1" : "0";
TQString trans = parentBgPix ? "1" : "0";
TQPixmap* sliderGroove;
if(!(sliderGroove = TQPixmapCache::find(TQString::number(cg.background().pixel(), 16)+"sliderGroove"+hori+trans))) {
if(parentBgPix) { // ### the pix are transparent!
if(!horizontal) {
TQWMatrix m;
m.rotate(-90);
sliderGroove = new TQPixmap(qembed_findImage("slGHBody").xForm(m));
}
else
sliderGroove = new TQPixmap(qembed_findImage("slGHBody"));
}
else {
const TQColor c1 = alphaBlendColors(TQColor(0,0,0), cg.background(), 11);
const TQColor c2 = alphaBlendColors(TQColor(53,53,53), cg.background(), 155);
const TQColor c3 = alphaBlendColors(TQColor(67,67,67), cg.background(), 146);
const TQColor c4 = alphaBlendColors(TQColor(83,83,83), cg.background(), 140);
const TQColor c5 = alphaBlendColors(TQColor(101,101,101), cg.background(), 134);
const TQColor c6 = alphaBlendColors(TQColor(254,254,254), cg.background(), 43);
const TQColor c7 = alphaBlendColors(TQColor(255,255,255), cg.background(), 9);
sliderGroove = new TQPixmap(7, 7);
TQPainter painter(sliderGroove);
TQRect 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);
}
}
TQPixmapCache::insert(TQString::number(cg.background().pixel(), 16)+"sliderGroove"+hori+trans, sliderGroove);
}
if (horizontal) {
TQPixmap* slGh;
if(parentBgPix || !(slGh = TQPixmapCache::find(TQString::number(cg.background().pixel(), 16)+"slGh"))) { // rounded edges
if(parentBgPix)
slGh = new TQPixmap(qembed_findImage("slGh"));
else {
slGh = new TQPixmap(6, 7);
slGh->fill(cg.background());
TQPixmap pix = qembed_findImage("slGh");
bitBlt(slGh, 0, 0, &pix, 0, 0, -1, -1, TQt::CopyROP);
}
TQPixmapCache::insert(TQString::number(cg.background().pixel(), 16)+"slGh",slGh );
}
bitBlt(p->device(), re.x(), re.y(), slGh, 0, 0, 3, 7, TQt::CopyROP);
bitBlt(p->device(), r.width()-3, re.y(), slGh, 3, 0, 3, 7, TQt::CopyROP);
p->drawTiledPixmap(re.x()+3, re.y(), r.width()-6, 7, *sliderGroove);
}
else {
TQPixmap* slGv;
if(parentBgPix || !(slGv = TQPixmapCache::find(TQString::number(cg.background().pixel(), 16)+"slGv"))) {
if(parentBgPix)
slGv = new TQPixmap(qembed_findImage("slGv"));
else {
slGv = new TQPixmap(7, 6);
slGv->fill(cg.background());
TQPixmap pix = qembed_findImage("slGv");
bitBlt(slGv, 0, 0, &pix, 0, 0, -1, -1, TQt::CopyROP);
}
TQPixmapCache::insert(TQString::number(cg.background().pixel(), 16)+"slGv",slGv );
}
bitBlt(p->device(), re.x(), re.y(), slGv, 0, 0, 7, 3, TQt::CopyROP);
bitBlt(p->device(), re.x(), re.height()-3, slGv, 0, 3, 7, 3, TQt::CopyROP);
p->drawTiledPixmap(re.x(), re.y()+3, 7, r.height()-6, *sliderGroove);
}
break;
}
case KPE_SliderHandle: {
const TQSlider* slider = (const TQSlider*)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;
}
TQPixmap* handle;
if(!(handle = TQPixmapCache::find("sliderHandle"+TQString::number(cg.button().pixel(), 16)))) {
TQPixmap insidePix = qembed_findImage("sliderHandle2inside"); // a filled antialiased circle to draw the gradients on
TQPainter painter(&insidePix);
flatMode=true;
renderSurface(&painter, TQRect(1, 0, 13, 15), cg.background(), cg.button(), cg.button(), Is_Button|Is_Horizontal);
flatMode=false;
TQImage inside = insidePix.convertToImage();
TQImage circle = tintImage(qembed_findImage("sliderHandle2circle"),
_customSliderHandleContourColor ? buttonContour->contourColor(Contour_Default) : alphaBlendColors(black, cg.button(), 110));
TQImage shadow = qembed_findImage("sliderHandle2shadow");
blend(shadow, inside, inside);
blend(circle, inside, inside);
handle = new TQPixmap(inside);
TQPixmapCache::insert("sliderHandle"+TQString::number(cg.button().pixel(), 16), handle );
}
bitBlt(p->device(), x, y, handle, 0, 0, -1, -1, TQt::CopyROP);
break;
}
case KPE_ListViewExpander: {
TQWidget* w = dynamic_cast<TQWidget*>(p->device());
p->setPen( cg.text() );
TQColor bg = w ? w->paletteBackgroundColor() : cg.background();
TQString hasBgPix = w && w->paletteBackgroundPixmap() ? "1" : "0";
TQString expanded = flags & Style_Off ? "1" : "0";
TQPixmap* lve;
if(_drawTriangularExpander) {
if(!(lve = TQPixmapCache::find(TQString::number(bg.pixel(), 16)+TQString::number(cg.text().pixel(), 16)+"lveT"+hasBgPix+expanded))) {
TQWMatrix m;
m.rotate(90);
if(w && !w->paletteBackgroundPixmap()) {
TQImage img = tintImage(qembed_findImage("lveTriangular"), cg.text());
int w=7, h=9;
if(flags & Style_Off) {
w=9, h=7;
img = img.xForm(m);
}
TQImage imgBG(w,h,32);
imgBG.fill(bg.rgb());
bitBlt(&imgBG, 0, 0, &img);
lve = new TQPixmap(imgBG);
}
else {
if(flags & Style_Off)
lve = new TQPixmap(tintImage(qembed_findImage("lveTriangular").xForm(m), cg.text()));
else
lve = new TQPixmap(tintImage(qembed_findImage("lveTriangular"), cg.text()));
}
TQPixmapCache::insert(TQString::number(bg.pixel(), 16)+TQString::number(cg.text().pixel(), 16)+"lveT"+hasBgPix+expanded, lve);
}
p->drawPixmap(r.x(), r.y(), *lve);
}
else {
if(!(lve = TQPixmapCache::find(TQString::number(bg.pixel(), 16)+TQString::number(cg.text().pixel(), 16)+"lveC"+hasBgPix+expanded))) {
if(w && !w->paletteBackgroundPixmap()) {
lve = new TQPixmap(11,11);
lve->fill(bg);
TQPainter 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 );
TQPixmapCache::insert(TQString::number(bg.pixel(), 16)+TQString::number(cg.text().pixel(), 16)+"lveC"+hasBgPix+expanded, lve);
}
else {
TQImage img = TQImage(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, tqRgba(0, 0, 0, 0));
}
}
TQImage 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, tqRgba(r, b, g, a));
img.setPixel(4, 5, tqRgba(r, b, g, a));
img.setPixel(5, 5, tqRgba(r, b, g, a));
img.setPixel(6, 5, tqRgba(r, b, g, a));
img.setPixel(7, 5, tqRgba(r, b, g, a));
if ( flags & Style_Off )
lve = new TQPixmap(img);
TQPixmapCache::insert(TQString::number(bg.pixel(), 16)+TQString::number(cg.text().pixel(), 16)+"lveC"+hasBgPix+"1", new TQPixmap(img));
// plus
img.setPixel(5, 3, tqRgba(r, b, g, a));
img.setPixel(5, 4, tqRgba(r, b, g, a));
img.setPixel(5, 6, tqRgba(r, b, g, a));
img.setPixel(5, 7, tqRgba(r, b, g, a));
if ( flags & Style_On )
lve = new TQPixmap(img);
TQPixmapCache::insert(TQString::number(bg.pixel(), 16)+TQString::number(cg.text().pixel(), 16)+"lveC"+hasBgPix+"0", new TQPixmap(img));
}
}
p->drawPixmap(r.x()-1,r.y()-1, *lve);
}
break;
}
// copied and slightly modified from TDEStyle.
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 TQBitmap( 1, 129, true );
horizontalLine = new TQBitmap( 128, 1, true );
TQPointArray a( 64 );
TQPainter 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();
TQApplication::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();
TQApplication::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:
TDEStyle::drawTDEStylePrimitive( kpe, p, ceData, elementFlags, r, cg, flags, opt, widget );
}
}
void DominoStyle::drawPrimitive(PrimitiveElement pe,
TQPainter *p,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQRect &r,
const TQColorGroup &cg,
SFlags flags,
const TQStyleOption &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 TDEStyle::drawPrimitive(pe, p, ceData, elementFlags, r, cg, flags, opt);
switch(pe) {
case PE_FocusRect: {
if(rubberBandType == DistRubber || (rubberBandType == ArgbRubber && !compositeManagerRunning)) {
p->drawWinFocusRect( r );
break;
}
TQWidget* w = dynamic_cast<TQWidget*>(p->device());
if(rubberBandType == ArgbRubber && compositeManagerRunning && viewPortPressed && dynamic_cast<TQListView*>(w->parentWidget())) {
TQListView* lv = dynamic_cast<TQListView*>(w->parentWidget());
if(!lv->currentItem())
break;
TQRect sr = lv->itemRect(lv->currentItem());
TQRect rr = r.normalize();
int step = lv->rootIsDecorated() ? (lv->currentItem()->depth()+1)*lv->treeStepSize() : lv->currentItem()->depth()*lv->treeStepSize();
if(dynamic_cast<TQCheckListItem*>(lv->currentItem()))
step += 16+lv->itemMargin()+4;
// why is the focusrect misused as a rubberband!?
if((lv->selectionMode() == TQListView::Multi || lv->selectionMode() == TQListView::Extended) &&
!((sr.y() == rr.y()) && (sr.height() == rr.height()) && (sr.x()+step == rr.x()))) {
TQScrollView* sv = static_cast<TQScrollView*>(w);
TQPoint po = w->mapFrom(sv, r.topLeft());
TQRect re = TQRect(po.x(), po.y(), r.width(), r.height());
drawPrimitive(PE_RubberBand, p, ceData, elementFlags, r, cg, flags, opt);
break;
}
}
if(ignoreNextFocusRect) {
ignoreNextFocusRect= false;
break;
}
TQColor color = alphaBlendColors(cg.highlight(), cg.foreground(), 160);
if(w && (w->isA("TQViewportWidget") || dynamic_cast<TQWidget*>(p->device())->isA("RegionGrabber"))) { // TQListView, TQListBox, KSnapshot...
// we can't be sure if the pixamp edges will be erased, so only a simple rect.
p->setPen(TQPen(color, 1, TQt::SolidLine));
p->drawRect(r);
break;
}
TQPixmap* edges;
if(!(edges = TQPixmapCache::find("fre"+TQString::number(color.pixel(), 16)))) {
edges = new TQPixmap(tintImage(qembed_findImage("focusRectEdges"), color));
TQPixmapCache::insert("fre"+TQString::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<TQWidget*>(p->device()) && dynamic_cast<TQWidget*>(p->device())->isA("PanelKMenu")) {
TQWidget* w = dynamic_cast<TQWidget*>(p->device());
if(w->parentWidget() && w->parentWidget()->paletteBackgroundPixmap()) {
TQPixmap pix(w->width(), w->height());
TQPainter painter(&pix);
TQPoint point = TQPoint(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<TQPixmap*>(p->device())) // more likely a backgroundPixmap than a doublebuffer
buttonContour->setAlphaMode();
renderButton(p, r, cg, (on||down), mouseOver, true, enabled, tdehtmlWidgets.contains(opt.widget()) );
buttonContour->reset();
break;
}
case PE_ButtonDefault: {
break;
}
case PE_SpinWidgetPlus:
case PE_SpinWidgetMinus: {
p->setPen( cg.buttonText() );
int l = TQMIN( w-2, h-2 );
// make the length even so that we get a nice symmetric plus...
if(l%2 != 0)
--l;
TQPoint 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: {
TQColor buttonColor = cg.button();
TQPixmap buffer;
if(horiz)
buffer.resize(r.width()-14, r.height());
else
buffer.resize(r.width(), r.height()-14);
if(buffer.isNull()) break;
TQRect br = buffer.rect();
TQPainter 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, TQRect(-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, TQRect(0, -2, br.width(), br.height()+4), cg.button(), buttonColor, contourFlags);
bitBlt(p->device(), r.x(), r.y()+7, &buffer, 0, 0, -1, -1, TQt::CopyROP);
}
break;
}
case PE_ScrollBarAddPage: { // bottom / right
TQColor buttonColor = cg.button();
TQColor contourColor = alphaBlendColors(buttonContour->contourColor(Contour_Default), buttonColor, 203);
TQPixmap* addPageBtn;
TQPixmap 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 = TQPixmapCache::find(TQString::number(buttonColor.pixel(), 16)+"ah"+configMode ))) {
TQPixmap gradientPix = qembed_findImage("scrollBtnHMask");
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), buttonColor, buttonColor, buttonColor, surfaceFlags);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollBtnHShadow");
TQImage img3 = tintImage(qembed_findImage("scrollBtnHContour"), contourColor);
blend(img2, img1, img1);
blend(img3, img1, img1);
addPageBtn = new TQPixmap(img1);
TQPixmapCache::insert(TQString::number(buttonColor.pixel(), 16)+"ah"+configMode, addPageBtn);
}
}
else {
buffer.resize(r.width(), r.height()+sl);
if(buffer.isNull()) break;
if(!(addPageBtn = TQPixmapCache::find(TQString::number(buttonColor.pixel(), 16)+"av"+configMode ))) {
TQPixmap gradientPix = qembed_findImage("scrollBtnVMask");
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), buttonColor, buttonColor, buttonColor, surfaceFlags);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollBtnVShadow");
TQImage img3 = tintImage(qembed_findImage("scrollBtnVContour"), contourColor);
blend(img2, img1, img1);
blend(img3, img1, img1);
addPageBtn = new TQPixmap(img1);
TQPixmapCache::insert(TQString::number(buttonColor.pixel(), 16)+"av"+configMode, addPageBtn);
}
}
TQRect br(buffer.rect() );
TQPainter bp(&buffer);
//// groove
if(sliderlen >= 10) {
surfaceFlags = Is_ScrollBarGroove;
if(horiz)
surfaceFlags |= Is_Horizontal;
TQColor grooveLine = alphaBlendColors(black, buttonColor, 80);
renderSurface(&bp, TQRect(0, 0, br.width(), br.height()), grooveLine, grooveLine, grooveLine, surfaceFlags);
bp.setClipRegion(horiz ? TQRect(0, 1, br.width(), br.height()-2) : TQRect(1, 0, br.width()-2, br.height()));
renderSurface(&bp, TQRect(0, 0, br.width(), br.height()), buttonColor, buttonColor, buttonColor, surfaceFlags);
bp.setClipping(false);
}
else {
renderSurface(&bp, TQRect(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?TQRect(-2, 0, br.width()+4, br.height()):TQRect(0, -2, br.width(), br.height()+4), buttonColor, buttonColor, contourFlags);
}
TQString docked = (!horiz && r.height() == 1) || (horiz && r.width() == 1) ? "1" : "0";
TQPixmap* sliderCap;
if(horiz) {
if(!(sliderCap = TQPixmapCache::find("sHCap"+TQString::number(buttonColor.pixel(), 16)+docked+configMode))) {
if(r.width() == 1) {
TQPixmap gradientPix(16, 15);
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn|Is_Horizontal);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollSliderHDockedShadow");
TQImage img3 = tintImage(qembed_findImage("scrollSliderHDockedContour"), contourColor);
bitBlt(&img1, 0, 0, &img2);
bitBlt(&img1, 0, 0, &img3);
sliderCap = new TQPixmap(img1);
}
else {
TQPixmap gradientPix = qembed_findImage("scrollSliderHMask");
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn|Is_Horizontal);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollSliderHShadow");
TQImage img3 = tintImage(qembed_findImage("scrollSliderHContour"), contourColor);
blend(img2, img1, img1);
blend(img3, img1, img1);
sliderCap = new TQPixmap(img1);
}
TQPixmapCache::insert("sHCap"+TQString::number(buttonColor.pixel(), 16)+docked+configMode, sliderCap);
}
}
else {
if(!(sliderCap = TQPixmapCache::find("sVCap"+TQString::number(buttonColor.pixel(), 16)+docked+configMode))) {
if(r.height() == 1) {
TQPixmap gradientPix(15, 16);
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollSliderVDockedShadow");
TQImage img3 = tintImage(qembed_findImage("scrollSliderVDockedContour"), contourColor);
bitBlt(&img1, 0, 0, &img2);
bitBlt(&img1, 0, 0, &img3);
sliderCap = new TQPixmap(img1);
}
else {
TQPixmap gradientPix = qembed_findImage("scrollSliderVMask");
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollSliderVShadow");
TQImage img3 = tintImage(qembed_findImage("scrollSliderVContour"), contourColor);
blend(img2, img1, img1);
blend(img3, img1, img1);
sliderCap = new TQPixmap(img1);
}
TQPixmapCache::insert("sVCap"+TQString::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(), TQt::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(), TQt::CopyROP);
}
break;
}
case PE_ScrollBarSubPage: { // top / left
TQColor buttonColor = cg.button();
TQColor contourColor = alphaBlendColors(buttonContour->contourColor(Contour_Default), buttonColor, 203);
TQPixmap* subPageBtn;
TQPixmap 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 = TQPixmapCache::find(TQString::number(buttonColor.pixel(), 16)+"sh"+configMode ))) {
TQPixmap gradientPix = qembed_findImage("scrollBtnHMask");
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), buttonColor, buttonColor, buttonColor, surfaceFlags);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollBtnHShadow");
TQImage img3 = tintImage(qembed_findImage("scrollBtnHContour"), contourColor);
blend(img2, img1, img1);
blend(img3, img1, img1);
subPageBtn = new TQPixmap(img1);
TQPixmapCache::insert(TQString::number(buttonColor.pixel(), 16)+"sh"+configMode, subPageBtn);
}
}
else {
buffer.resize(r.width(), r.height()+sl);
if(buffer.isNull()) break;
if(!(subPageBtn = TQPixmapCache::find(TQString::number(buttonColor.pixel(), 16)+"sv"+configMode ))) {
TQPixmap gradientPix = qembed_findImage("scrollBtnVMask");
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), buttonColor, buttonColor, buttonColor, surfaceFlags);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollBtnVShadow");
TQImage img3 = tintImage(qembed_findImage("scrollBtnVContour"), contourColor);
blend(img2, img1, img1);
blend(img3, img1, img1);
subPageBtn = new TQPixmap(img1);
TQPixmapCache::insert(TQString::number(buttonColor.pixel(), 16)+"sv"+configMode, subPageBtn);
}
}
TQRect br(buffer.rect());
TQPainter bp(&buffer);
//// groove
if(sliderlen >= 10) {
surfaceFlags = Is_ScrollBarGroove;
if(horiz)
surfaceFlags |= Is_Horizontal;
TQColor grooveLine = alphaBlendColors(black, buttonColor, 80);
renderSurface(&bp, TQRect(0, 0, br.width(), br.height()), grooveLine, grooveLine, grooveLine, surfaceFlags);
bp.setClipRegion(horiz ? TQRect(0, 1, br.width(), br.height()-2) : TQRect(1, 0, br.width()-2, br.height()));
renderSurface(&bp, TQRect(0, 0, br.width(), br.height()), buttonColor, buttonColor, buttonColor, surfaceFlags);
bp.setClipping(false);
}
else {
renderSurface(&bp, TQRect(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?TQRect(-2, 0, br.width()+4, br.height()):TQRect(0, -2, br.width(), br.height()+4), buttonColor, buttonColor, contourFlags);
}
TQString docked = (!horiz && r.bottom() == 15) || (horiz && r.right() == 15) ? "1" : "0";
TQPixmap* sliderCap;
if(horiz) {
if(!(sliderCap = TQPixmapCache::find("sHCap"+TQString::number(buttonColor.pixel(), 16)+docked+configMode))) {
if(r.right() == 15) {
TQPixmap gradientPix(16, 15);
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn|Is_Horizontal);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollSliderHDockedShadow");
TQImage img3 = tintImage(qembed_findImage("scrollSliderHDockedContour"), contourColor);
bitBlt(&img1, 0, 0, &img2);
bitBlt(&img1, 0, 0, &img3);
sliderCap = new TQPixmap(img1);
}
else {
TQPixmap gradientPix = qembed_findImage("scrollSliderHMask");
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn|Is_Horizontal);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollSliderHShadow");
TQImage img3 = tintImage(qembed_findImage("scrollSliderHContour"), contourColor);
blend(img2, img1, img1);
blend(img3, img1, img1);
sliderCap = new TQPixmap(img1);
}
TQPixmapCache::insert("sHCap"+TQString::number(buttonColor.pixel(), 16)+docked+configMode, sliderCap);
}
}
else {
if(!(sliderCap = TQPixmapCache::find("sVCap"+TQString::number(buttonColor.pixel(), 16)+docked+configMode))) {
if(r.bottom() == 15) {
TQPixmap gradientPix(15, 16);
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollSliderVDockedShadow");
TQImage img3 = tintImage(qembed_findImage("scrollSliderVDockedContour"), contourColor);
bitBlt(&img1, 0, 0, &img2);
bitBlt(&img1, 0, 0, &img3);
sliderCap = new TQPixmap(img1);
}
else {
TQPixmap gradientPix = qembed_findImage("scrollSliderVMask");
TQPainter painter(&gradientPix);
renderSurface(&painter, TQRect(0, 0, gradientPix.width(), gradientPix.height()), cg.button(), cg.button(), buttonColor, Is_ScrollBarBtn);
TQImage img1 = gradientPix.convertToImage();
TQImage img2 = qembed_findImage("scrollSliderVShadow");
TQImage img3 = tintImage(qembed_findImage("scrollSliderVContour"), contourColor);
blend(img2, img1, img1);
blend(img3, img1, img1);
sliderCap = new TQPixmap(img1);
}
TQPixmapCache::insert("sVCap"+TQString::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(), TQt::CopyROP);
break;
}
// SCROLLBAR BUTTONS
// -----------------
case PE_ScrollBarSubLine: { // top / left button
uint contourFlags = Is_ScrollBarBtn;
TQRect cr = r;
TQRect ar = r;
TQRect 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, TQRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn|Is_Horizontal);
renderContour(p, TQRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags);
}
else {
p->setClipRegion(TQRect(sr.x()+2, sr.y(), sr.width()-4, sr.height()));
renderSurface(p, TQRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn);
p->setClipping(false);
renderContour(p, TQRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags);
}
TQColor color = dynamic_cast<TQWidget*>(p->device()) ? dynamic_cast<TQWidget*>(p->device())->palette().active().buttonText() : cg.buttonText();
p->setPen(color);
drawPrimitive((horiz ? PE_ArrowLeft : PE_ArrowUp), p, ceData, elementFlags, ar, cg, flags);
break;
}
case PE_ScrollBarAddLine: { // bottom / right button
TQRect cr = r;
TQRect ar = r;
TQRect 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, TQRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn|Is_Horizontal);
renderContour(p, TQRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags);
}
else {
p->setClipRegion(TQRect(sr.x()+2, sr.y(), sr.width()-4, sr.height()));
renderSurface(p, TQRect(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, TQRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags);
}
TQColor color = dynamic_cast<TQWidget*>(p->device()) ? dynamic_cast<TQWidget*>(p->device())->palette().active().buttonText() : cg.buttonText();
p->setPen(color);
drawPrimitive((horiz ? PE_ArrowRight : PE_ArrowDown), p, ceData, elementFlags, ar, cg, flags);
break;
}
case PE_ScrollBarSubLine2: { // second top / left button // ### remove
uint contourFlags = Is_ScrollBarBtn;
TQRect cr = r;
TQRect ar = r;
TQRect sr = r;
if(horiz) {
contourFlags |= Is_Horizontal|Draw_Top|Draw_Bottom;
}
else {
ar.setX(1);
contourFlags |= Draw_Left|Draw_Right;
}
if(horiz) {
renderSurface(p, TQRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn|Is_Horizontal);
renderContour(p, TQRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags);
}
else {
p->setClipRegion(TQRect(sr.x()+2, sr.y(), sr.width()-4, sr.height()));
renderSurface(p, TQRect(sr.x(), sr.y(), sr.width(), sr.height()), cg.button(), cg.button(), cg.button(), Is_ScrollBarBtn);
p->setClipping(false);
renderContour(p, TQRect(cr.x(), cr.y(), cr.width(), cr.height()), cg.button(), cg.button(), contourFlags);
}
TQColor color = dynamic_cast<TQWidget*>(p->device()) ? dynamic_cast<TQWidget*>(p->device())->palette().active().buttonText() : cg.buttonText();
p->setPen(color);
drawPrimitive((horiz ? PE_ArrowLeft : PE_ArrowUp), p, ceData, elementFlags, 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: {
TQPointArray 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: { // TQFrame::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(TQRect(r.x()+1, r.y()+1, r.width()-2, r.height()-2));
break;
}
case PE_Panel: { // TQFrame::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: { // TQFrame::LineEditPanel
break;
}
case PE_PanelTabWidget: { // TQFrame::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(TQRect(r.x()-10, r.y()-10, r.width()+20, r.height()+20), yellow);
TQRect tr;
TQWidget* w = dynamic_cast<TQWidget*>(p->device());
TQTabWidget* tw = w ? dynamic_cast<TQTabWidget*>(w->parentWidget()) : 0;
bool tabBarHidden = tw && !((DominoTQTabWidget*)tw)->tabBar()->isVisible();
if(tw && !tabBarHidden) {
tabsAbove = tw->tabPosition() == TQTabWidget::Top;
if(tw->count() != 0) {
TQTabBar* tb = ((DominoTQTabWidget*)tw)->tabBar();
TQRect 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(TQt::TopLeft) && gr.x() < 7) {
if(tabsAbove)
roundTopLeft = false;
else
roundBottomLeft = false;
}
if(!tw->cornerWidget(TQt::TopRight) && gr.x()+gr.width() > tw->width()-7) {
if(tabsAbove)
roundTopRight = false;
else
roundBottomRight = false;
}
}
}
TQBrush background = tw ? tw->colorGroup().brush(TQColorGroup::Background) : cg.brush(TQColorGroup::Background);
TQColor bottomGradient = alphaBlendColors(TQColor(0,0,0), cg.background(), 11);
TQColor topGradient = alphaBlendColors(TQColor(255,255,255), cg.background(), 15);
TQColor tabContour2 = cg.background().dark(150);
TQString tabPos = tabsAbove ? "1" : "0";
TQPixmap* tabWEdges;
if(!(tabWEdges = TQPixmapCache::find("tabWEdges"+tabPos+TQString::number(background.color().pixel(), 16)+TQString::number(cg.background().pixel(), 16)))) {
tabWEdges = new TQPixmap(16,16);
TQPainter painter(tabWEdges);
painter.fillRect(tabWEdges->rect(), background);
painter.end();
TQPixmap tabWEdgesMask = qembed_findImage("groupBoxMask");
painter.begin(&tabWEdgesMask);
painter.fillRect(tabWEdgesMask.rect(), cg.brush(TQColorGroup::Background));
painter.end();
bitBlt(tabWEdges, 0, 0, &tabWEdgesMask);
TQPixmap circle = qembed_findImage("tabWidget");
bitBlt(tabWEdges, 0, 0, &circle);
TQPixmapCache::insert("tabWEdges"+tabPos+TQString::number(background.color().pixel(), 16)+TQString::number(cg.background().pixel(), 16), tabWEdges);
}
TQRect re = TQRect(r.x(), r.y(), r.width(), r.height()+1);
TQColor bg = cg.background();
TQColor bg2 = background.color(); // parent color
// top
TQColor c1 = alphaBlendColors(TQColor(0,0,0), bg2, 25);
TQColor c2 = alphaBlendColors(TQColor(255,255,255), bg, 70);
TQColor c3 = alphaBlendColors(TQColor(255,255,255), bg, 30);
// left + right
TQColor c4 = alphaBlendColors(TQColor(0,0,0), bg2, 40);
// TQColor c5 = alphaBlendColors(TQColor(255,255,255), bg, 30);
TQColor c6 = alphaBlendColors(TQColor(255,255,255), bg, 4);
// bottom
TQColor c7 = alphaBlendColors(TQColor(249,249,249), bg, 25);
TQColor c8 = alphaBlendColors(TQColor(0,0,0), bg2, 79);
TQColor c9 = alphaBlendColors(TQColor(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, TQt::CopyROP);
}
if(roundTopRight) {
bitBlt(p->device(), re.width()-8, re.y(), tabWEdges, 8, 0, 8, 8, TQt::CopyROP);
}
if(roundBottomLeft) {
bitBlt(p->device(), re.x(), re.height()-8, tabWEdges, 0, 8, 8, 8, TQt::CopyROP);
}
if(roundBottomRight) {
bitBlt(p->device(), re.width()-8, re.height()-8, tabWEdges, 8, 8, 8, 8, TQt::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) {
TQColor p1 = alphaBlendColors(TQColor(255,255,255), bg, 50);
TQColor p2 = alphaBlendColors(TQColor(255,255,255), bg, 25);
TQColor p3 = alphaBlendColors(TQColor(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 {
TQColor p1 = alphaBlendColors(TQColor(255,255,255), bg, 17);
TQColor p2 = alphaBlendColors(TQColor(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: { // TQFrame::PopupPanel
TQPopupMenu* pm = dynamic_cast<TQPopupMenu*>(p->device());
TQColor background = dynamic_cast<TQListBox*>(p->device()) ? cg.base() : _customPopupMenuColor ? _popupMenuColor : cg.background();
TQRegion mask(x, y+5, w, h-10);
mask += TQRegion(x+5, y, w-10, h);
mask += TQRegion(x+1, y+2, w-2, h-4);
mask += TQRegion(x+2, y+1, w-4, h-2);
if(_drawPopupMenuGradient) {
TQPixmap buffer(r.width(), r.height());
TQPainter 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
TQRect cr = pm->contentsRect();
if(TQApplication::reverseLayout())
pm->erase(mask-TQRegion(cr.width()+3, cr.y(), r.width()-cr.width()-6, cr.height()-1));
else
pm->erase(mask-TQRegion(r.x()+3, cr.y(), r.width()-cr.width()-6, cr.height()-1));
((DominoTQFrame*)pm)->drawContents(p );
}
else
pm->erase(mask);
}
bitBlt(p->device(), r.x(), r.y(), popupFrame, 0, 0, 5, 5, TQt::CopyROP);
bitBlt(p->device(), r.width()-5, r.y(), popupFrame, 5, 0, 5, 5, TQt::CopyROP);
bitBlt(p->device(), r.x(), r.bottom()-4, popupFrame, 0, 5, 5, 5, TQt::CopyROP);
bitBlt(p->device(), r.width()-5, r.bottom()-4, popupFrame, 5, 5, 5, 5, TQt::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: // TQFrame::MenuBarPanel
case PE_PanelDockWindow: { // TQFrame::ToolBarPanel
p->setPen(cg.background());
// overpainting the menus leads to flicker so we draw only the frame here.
if(dynamic_cast<TQWidget*>(p->device()))
p->drawRect(r);
else
p->fillRect(r, cg.brush(TQColorGroup::Background)); // colorpreview in kcontrol
break;
}
case PE_StatusBarSection: {
break;
}
case PE_TabBarBase: {
break;
}
// TOOLBAR/DOCK WINDOW HANDLE
// --------------------------
case PE_DockWindowResizeHandle: {
TQWidget* w = dynamic_cast<TQWidget*>(p->device()); // TQDockWindowResizeHandle
if(w && !w->erasePixmap()) {
TQPixmap pix(r.size());
TQPainter painter(&pix);
renderGradient(&painter, r, lightenColor(cg.background(), 40), darkenColor(cg.background(), 30), horiz);
w->setErasePixmap(pix);
}
break;
}
case PE_DockWindowHandle: {
TQWidget* widget = dynamic_cast<TQWidget*>(p->device()); // qt_dockwidget_internal - TQDockWindowHandle
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 : tqApp->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: {
TQPixmap* arrow;
bool isEnabled = (flags & Style_Enabled);
TQString enabled = isEnabled ? "1" : "0";
TQColor color = p->pen().color();
if(!(arrow = TQPixmapCache::find(TQString::number(color.pixel(), 16)+"spinArrows"+enabled))) {
TQImage ar = tintImage(qembed_findImage("spinBoxArrows"), color);
if(!isEnabled) { // make it transparent
ar = setImageOpacity(ar, 25);
}
arrow = new TQPixmap(ar);
TQPixmapCache::insert(TQString::number(color.pixel(), 16)+"spinArrows"+enabled, arrow);
}
if(textEffectSettings.mode) {
TQPixmap* effectArrow;
if(!(effectArrow = TQPixmapCache::find(TQString::number(textEffectSettings.buttonColor.pixel(), 16)+"spinEArrows"+enabled))) {
TQImage img = tintImage(qembed_findImage("spinBoxArrows"), textEffectSettings.buttonColor);
int opacity = textEffectSettings.buttonOpacity*100/255;
effectArrow = new TQPixmap(setImageOpacity(img, !isEnabled ? opacity*25/100 : opacity));
TQPixmapCache::insert(TQString::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: {
TQRect 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;
}
}
TQPixmap* arrow;
bool isEnabled = (flags & Style_Enabled);
TQString enabled = isEnabled ? "1" : "0";
TQColor color = p->pen().color();
if(!(arrow = TQPixmapCache::find(TQString::number(color.pixel(), 16)+"scrollBarArrows"+enabled))) {
TQImage ar = tintImage(qembed_findImage("scrollBarArrows"), color);
if(!isEnabled) {
ar = setImageOpacity(ar, 25);
}
arrow = new TQPixmap(ar);
TQPixmapCache::insert(TQString::number(color.pixel(), 16)+"scrollBarArrows"+enabled, arrow);
}
if(/*pe == PE_HeaderArrow &&*/ textEffectSettings.mode) {
TQPixmap* effectArrow;
if(!(effectArrow = TQPixmapCache::find(TQString::number(textEffectSettings.buttonColor.pixel(), 16)+"scrollBarEArrows"+enabled))) {
TQImage img = tintImage(qembed_findImage("scrollBarArrows"), textEffectSettings.buttonColor);
int opacity = textEffectSettings.buttonOpacity*100/255;
effectArrow = new TQPixmap(setImageOpacity(img, !isEnabled ? opacity*25/100 : opacity));
TQPixmapCache::insert(TQString::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 TQt, so the controller rect is 2px above the drawn rect.
TQCheckListItem *item = opt.checkListItem();
TQListView *lv = item->listView();
if(!item)
return;
TQString state = flags& Style_On ? "1" : "0";
state += flags& Style_Selected ? "1" : "0";
state += flags& Style_NoChange ? "1" : "0";
TQColor background = flags& Style_Selected ? cg.highlight() : cg.base();
TQColor foreground = cg.text();
TQPixmap* pix;
if(!(pix = TQPixmapCache::find(TQString::number(background.pixel(), 16)+TQString::number(foreground.pixel(), 16)+"checkListIndicator"+state))) {
pix = new TQPixmap(r.x()+lv->itemMargin()+r.width()+4, item->height());
pix->fill(background);
TQPainter 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));
TQPixmapCache::insert(TQString::number(background.pixel(), 16)+TQString::number(foreground.pixel(), 16)+"checkListIndicator"+state, pix);
}
p->drawPixmap(0, 0, *pix);
break;
}
case PE_CheckListExclusiveIndicator: {
TQColor 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(TQColorGroup::Background).pixmap();
TQString trans = parentBgPix ? "1" : "0";
TQPixmap* grip;
if(!(grip = TQPixmapCache::find(TQString::number(cg.background().pixel(), 16)+"sizeGrip"+trans))) {
if(parentBgPix)
grip = new TQPixmap(qembed_findImage("sizeGrip"));
else {
grip = new TQPixmap(4, 4);
grip->fill(cg.background());
TQPixmap tmpPix = qembed_findImage("sizeGrip");
bitBlt(grip, 0, 0, &tmpPix, 0, 0, -1, -1, TQt::CopyROP);
}
TQPixmapCache::insert(TQString::number(cg.background().pixel(), 16)+"sizeGrip"+trans, grip);
}
bitBlt(p->device(), r.width()-(TQApplication::reverseLayout() ? 12 : 6), r.height()-12, grip, 0, 0, -1, -1, TQt::CopyROP);
bitBlt(p->device(), r.width()-6, r.height()-6, grip, 0, 0, -1, -1, TQt::CopyROP);
bitBlt(p->device(), r.width()-12, r.height()-6, grip, 0, 0, -1, -1, TQt::CopyROP);
break;
}
case PE_RubberBand: {
#if TDE_VERSION >= 0x30506
if(rubberBandType != ArgbRubber || !compositeManagerRunning) {
#else
if(rubberBandType != ArgbRubber) {
#endif
if(rubberBandType == LineRubber) {
p->save();
p->setPen(TQPen(black, 1, TQt::SolidLine));
p->drawRect(r);
p->restore();
}
else {
TDEStyle::drawPrimitive(pe, p, ceData, elementFlags, r, cg, flags, opt);
}
break;
}
bool normalized = r.width() < 0 || r.height() < 0;
TQRect 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;
}
TQColor fg = alphaBlendColors(_argbRubberBandColor, black, 127);
const TQWidget* w = dynamic_cast<TQWidget*>(p->device());
if(!w)
w = rubberViewPort;
TQPoint po = w->mapToGlobal(TQPoint(0,0));
TQRect gr = TQRect(po.x(), po.y(), w->width(), w->height());
TQRegion mask(re.x()+1, re.y(), re.width()-2, re.height());
mask += TQRegion(re.x(), re.y()+1, re.width(), re.height()-2);
rubber->create(gr, mask);
GC gc2 = XCreateGC(tqt_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(tqt_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(tqt_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(tqt_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(tqt_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(tqt_xdisplay(), rubber->window, xrect.x, xrect.y, xrect.width, xrect.height, false);
rubber->updateMask(mask);
///////////// painting
XSetForeground(tqt_xdisplay(), gc2, preMultiplyColor(tqRgba(fg.red(), fg.green(), fg.blue(),153)));
XDrawRectangle(tqt_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;
TQColor blendc = tqRgba(fg.red(), fg.green(), fg.blue(), 36);
XSetForeground(tqt_xdisplay(), gc2, preMultiplyColor(blendColors(_argbRubberBandColor, blendc).rgb()));
XSetClipRectangles(tqt_xdisplay(), gc2, 0, 0, xrects, 8, Unsorted);
XDrawRectangle(tqt_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(tqt_xdisplay(), gc2, preMultiplyColor(tqRgba(fg.red(), fg.green(), fg.blue(), 121)));
XSetClipRectangles(tqt_xdisplay(), gc2, 0, 0, xrects2, 12, Unsorted);
XDrawRectangle(tqt_xdisplay(), rubber->window, gc2, re.x()+1, re.y()+1, re.width()-3, re.height()-3);
XDrawRectangle(tqt_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(tqt_xdisplay(), gc2, preMultiplyColor(tqRgba(fg.red(), fg.green(), fg.blue(), 37)));
XSetClipRectangles(tqt_xdisplay(), gc2, 0, 0, xrects3, 8, Unsorted);
XDrawRectangle(tqt_xdisplay(), rubber->window, gc2, re.x(), re.y(), re.width()-1, re.height()-1);
XFlush(tqt_xdisplay());
XFreeGC(tqt_xdisplay(),gc2);
oldRubberRect = re;
break;
}
default: {
return TDEStyle::drawPrimitive(pe, p, ceData, elementFlags, r, cg, flags, opt);
}
}
}
void DominoStyle::drawControl(ControlElement element,
TQPainter *p,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQRect &r,
const TQColorGroup &cg,
SFlags flags,
const TQStyleOption& opt,
const TQWidget *widget) const
{
const bool enabled = (flags & Style_Enabled);
//return TDEStyle::drawControl(element, p, ceData, elementFlags, r, cg, flags, opt, widget);
switch (element) {
case CE_ToolButtonLabel: {
if(widget->isA("TDEToolBarButton")) {
DominoKToolBarButton* tb= (DominoKToolBarButton *) widget;
TQStyle::SFlags flags = TQStyle::Style_Default;
TQStyle::SCFlags active = TQStyle::SC_None;
if (tb->isDown()) {
flags |= TQStyle::Style_Down;
active |= TQStyle::SC_ToolButton;
}
if (tb->isEnabled()) flags |= TQStyle::Style_Enabled;
if (tb->isOn()) flags |= TQStyle::Style_On;
if (tb->isEnabled() && tb->hasMouse()) flags |= TQStyle::Style_Raised;
if (tb->hasFocus()) flags |= TQStyle::Style_HasFocus;
int dx, dy;
TQFont tmp_font(TDEGlobalSettings::toolBarFont());
TQFontMetrics fm(tmp_font);
TQRect textRect;
int textFlags = 0;
TQPixmap pixmap;
if (tb->iconTextMode() != TDEToolBar::TextOnly) {
pixmap =tb->iconSet().pixmap( TQIconSet::Automatic,
tb->isEnabled() ? (tb->isActive() ? TQIconSet::Active : TQIconSet::Normal) :
TQIconSet::Disabled,
tb->isOn() ? TQIconSet::On : TQIconSet::Off );
TQImage 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);
}
TQPixmap outlinePixmap = 0;
bool drawOutlinePixmap = false;
if(flags &TQStyle::Style_HasFocus && focusIndicatorSettings.indicateFocus && !pixmap.isNull()) {
outlinePixmap = renderOutlineIcon(&pixmap);
drawOutlinePixmap = true;
}
if (tb->iconTextMode() == TDEToolBar::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() == TDEToolBar::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 = TQRect(dx, dy, tb->width()-dx, tb->height()-1);
}
}
else if (tb->iconTextMode() == TDEToolBar::TextOnly)
{
if (!tb->textLabel().isNull())
{
textFlags = AlignVCenter|AlignLeft;
dx = (tb->width() - fm.width(tb->textLabel())) / 2;
dy = (tb->height()-1 - fm.lineSpacing()) / 2;
textRect = TQRect( dx, dy, fm.width(tb->textLabel()), fm.lineSpacing() );
}
}
else if (tb->iconTextMode() == TDEToolBar::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 = TQRect( dx, dy, fm.width(tb->textLabel()), fm.lineSpacing() );
}
}
if (!tb->textLabel().isNull() && !textRect.isNull())
{
p->setFont(TDEGlobalSettings::toolBarFont());
TQColor pencolor;
if (!tb->isEnabled())
pencolor = tb->palette().disabled().dark();
// replaced through icon highlights
// else if(tb->isRaised())
// pencolor = TDEGlobalSettings::toolBarHighlightColor();
else
pencolor = tb->colorGroup().buttonText();
dominoDrawItem( p, textRect, textFlags, cg, enabled, 0, tb->textLabel(), -1, &pencolor, textEffectSettings.mode > 0 ? 1 : 0);
}
}
else { // TQToolButton - bye bye win95 iconset mode :)
const TQToolButton *toolbutton = (const TQToolButton *) widget;
TQRect rect = r;
TQt::ArrowType arrowType = opt.isDefault() ? TQt::DownArrow : opt.arrowType();
if (!opt.isDefault()) {
PrimitiveElement pe;
switch (arrowType) {
case TQt::LeftArrow: pe = PE_ArrowLeft; break;
case TQt::RightArrow: pe = PE_ArrowRight; break;
case TQt::UpArrow: pe = PE_ArrowUp; break;
default:
case TQt::DownArrow: pe = PE_ArrowDown; break;
}
drawPrimitive(pe, p, ceData, elementFlags, rect, cg, flags, opt);
}
else {
TQColor btext = toolbutton->paletteForegroundColor();
if (toolbutton->iconSet().isNull() && ! toolbutton->text().isNull() && ! toolbutton->usesTextLabel()) {
int alignment = AlignCenter | ShowPrefix;
if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, TQStyleOption::Default, 0, widget))
alignment |= NoAccel;
dominoDrawItem( p, rect, alignment, cg, enabled, 0, toolbutton->text(), toolbutton->text().length(), &btext, textEffectSettings.mode > 0 ? 1 : 0);
}
else {
TQPixmap pm;
TQIconSet::Size size = toolbutton->usesBigPixmap() ? TQIconSet::Large : TQIconSet::Small;
TQIconSet::State state = toolbutton->isOn() ? TQIconSet::On : TQIconSet::Off;
TQIconSet::Mode mode;
/* if (!toolbutton->isEnabled())
mode = TQIconSet::Disabled;
else*/ if (flags & (Style_Down | Style_On) || (flags & Style_Raised) && (flags & Style_AutoRaise))
mode = TQIconSet::Active;
else
mode = TQIconSet::Normal;
pm = toolbutton->iconSet().pixmap( size, mode, state );
if(!toolbutton->isEnabled())
pm = disableIcon(&pm);
TQImage 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);
TQPixmap outlinePixmap = 0;
bool drawOutlinePixmap = false;
if(flags &TQStyle::Style_HasFocus && focusIndicatorSettings.indicateFocus) {
outlinePixmap = renderOutlineIcon(&pm);
drawOutlinePixmap = true;
}
if ( toolbutton->usesTextLabel() ) {
p->setFont( toolbutton->font() );
TQRect pr = rect, tr = rect;
int alignment = ShowPrefix;
if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, TQStyleOption::Default, 0, widget))
alignment |= NoAccel;
if ( toolbutton->textPosition() == TQToolButton::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, TQString::null );
drawItem( p, pr, AlignCenter, cg, TRUE, &pm, TQString::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, TQString::null );
drawItem( p, pr, AlignCenter, cg, TRUE, &pm, TQString::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, TQString::null );
drawItem( p, rect, AlignCenter, cg, TRUE, &pm, TQString::null );
}
}
}
}
break;
}
// PROGRESSBAR
// -----------
case CE_ProgressBarGroove: {
drawPrimitive(PE_Panel, p, ceData, elementFlags, r, cg, flags, opt);
break;
}
case CE_ProgressBarContents: {
const TQProgressBar *pb = dynamic_cast<const TQProgressBar*>(widget);
int steps = pb->totalSteps();
const TQColor bg = enabled? cg.base(): cg.background(); // background
const TQColor fg = cg.background();
bool reverseLayout = TQApplication::reverseLayout();
TQPixmap* 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
TQColor tintColor = alphaBlendColors(TQt::black, bg, diff+30);
if(!(prBgShadow = TQPixmapCache::find(TQString::number(bg.pixel(), 16)+TQString::number(cg.background().pixel(), 16)+"prBgShadow"))) {
prBgShadow = new TQPixmap(4,4);
prBgShadow->fill(bg);
TQPainter painter(prBgShadow);
painter.drawPixmap(0, 0, tintImage(qembed_findImage("progressShadow2"), tintColor));
TQPixmapCache::insert(TQString::number(bg.pixel(), 16)+TQString::number(cg.background().pixel(), 16)+"prBgShadow", prBgShadow);
}
TQRect surface;
TQRect rightBg;
TQRect 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 = TQRect(reverseLayout? r.right()-progress+1: r.x()+progress+1, r.top(), barWidth-2, r.height());
rightBg = reverseLayout ? TQRect(r.x(), r.y(), r.width()-(progress-1), r.height()) :
TQRect(r.x()+progress+barWidth-1, r.y(), r.width()-(progress+barWidth-1), r.height());
if(rightBg.width()+surface.width() < r.width()) {
leftBg = reverseLayout ? TQRect(rightBg.width()+surface.width(), r.y(), r.width()-(rightBg.width()+surface.width()-2), r.height()) :
TQRect(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 = TQRect(reverseLayout? r.left(): r.left()+w, r.top(), r.width()-w, r.height());
surface = TQRect(reverseLayout? r.right()-w2+1: r.left(), r.top(), w2, r.height());
}
TQPixmap* surfaceTile;
if(!(surfaceTile = TQPixmapCache::find("prTile"+TQString::number(surface.height())+TQString::number(bg.pixel(), 16)))) {
surfaceTile = new TQPixmap(20, surface.height());
TQPainter tilePainter(surfaceTile);
flatMode=true;
renderSurface(&tilePainter, TQRect(0, 0, 20, surface.height()), fg, cg.background(), fg , Is_Button|Is_Horizontal);
flatMode=false;
TQPixmap pix = qembed_findImage("progressTile");
tilePainter.drawTiledPixmap(0,0, 20, surface.height(), pix);
TQPixmapCache::insert("prTile"+TQString::number(surface.height())+TQString::number(bg.pixel(), 16), surfaceTile);
}
int staticShift = 0;
int animShift = 0;
// find the animation Offset for the current Widget
TQWidget* nonConstWidget = const_cast<TQWidget*>(widget);
TQMapConstIterator<TQWidget*, 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
TQColor color_d = alphaBlendColors(tintColor, bg, 170);
TQColor color_m = alphaBlendColors(tintColor, bg, 85);
TQColor 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 TQProgressBar *progressbar = (const TQProgressBar *) widget;
TQFont 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: {
TQColorGroup g = cg;
if(!tdehtmlWidgets.contains(widget))
g.setColor(TQColorGroup::Button, tqApp->palette().active().background());
TQPixmap insidePix = qembed_findImage("checkbox2inside");
TQPainter painter(&insidePix);
renderSurface(&painter, TQRect(3, 0, 14, 19), g.background(), g.button(), g.button(), Is_CheckItem);
painter.end();
TQImage inside = insidePix.convertToImage();
TQImage checkbox;
TQImage shadow = qembed_findImage("checkbox2shadow");
TQImage circle = tintImage(qembed_findImage("checkbox2rect"), buttonContour->contourColor(Contour_Default));
blend(shadow, inside, checkbox);
blend(circle, checkbox, checkbox);
if(flags&Style_Down) {
TQImage pressed = tintImage(qembed_findImage("checkbox2pressed"), buttonContour->contourColor(Contour_Pressed));
blend(pressed, checkbox, checkbox);
}
TQPixmap pix = TQPixmap(checkbox);
if(flags&Style_On || flags&Style_NoChange) {
painter.begin(&pix);
drawPrimitive(PE_CheckMark, &painter, ceData, elementFlags, r, cg, flags);
painter.end();
}
p->drawPixmap(r.left(), r.top(), pix);
break;
}
case CE_CheckBoxLabel: {
const TQCheckBox *cb = (const TQCheckBox *) widget;
int alignment = TQApplication::reverseLayout() ? AlignRight : AlignLeft;
if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, TQStyleOption::Default, 0, widget))
alignment |= NoAccel;
TQRect re = focusIndicatorSettings.drawUnderline ? subRect(SR_CheckBoxFocusRect, ceData, elementFlags, 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: {
TQColorGroup g = cg;
if(!tdehtmlWidgets.contains(widget))
g.setColor(TQColorGroup::Button, tqApp->palette().active().background());
TQString down = flags& Style_Down ? "1" : "0";
TQPixmap* radio;
if((flags & Domino_noCache) || !(radio = TQPixmapCache::find("tabEdges"+down))) {
TQImage radioImg;
TQPixmap insidePix = qembed_findImage("radio3inside");
TQPainter painter(&insidePix);
renderSurface(&painter, TQRect(r.left(), r.top(), r.width(), r.height()+1), g.background(), g.button(), g.background(), Is_CheckItem);
TQImage inside = insidePix.convertToImage();
TQImage shadow = qembed_findImage("radio3shadow");
TQImage circle = tintImage(qembed_findImage("radio3circle"), buttonContour->contourColor(Contour_Default));
blend(shadow, inside, inside);
blend(circle, inside, radioImg);
if(flags&Style_Down) {
TQImage pressed = tintImage(qembed_findImage("radio3pressed"), buttonContour->contourColor(Contour_Default));
blend(pressed, radioImg, radioImg);
}
radio = new TQPixmap(radioImg);
if(!(flags & Domino_noCache))
TQPixmapCache::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 TQRadioButton *radiobutton = (const TQRadioButton *) widget;
int alignment = TQApplication::reverseLayout() ? AlignRight : AlignLeft;
if (!styleHint(SH_UnderlineAccelerator, ceData, elementFlags, TQStyleOption::Default, 0, widget))
alignment |= NoAccel;
TQRect re = focusIndicatorSettings.drawUnderline ? subRect(SR_RadioButtonFocusRect, ceData, elementFlags, 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: {
TQTabBar * tb = (TQTabBar *) widget;
bool konqTab = false;
bool kickoffTab = false;
if(tb->parentWidget()) {
const TQWidget* w = tb->parentWidget();
if(w->isA("KonqFrameTabs"))
konqTab = true;
else if(!strcmp(w->name(), "SUSE::Kickoff::KMenu"))
kickoffTab = true;
}
TQTabBar::Shape tbs = tb->shape();
bool selected = false;
bool reverseLayout = TQApplication::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 TQTabBar::TriangularAbove:
renderTab(p, r, cg, (flags & Style_MouseOver), selected, false, pos, true, false, konqTab);
break;
case TQTabBar::RoundedAbove:
renderTab(p, r, cg, (flags & Style_MouseOver), selected, false, pos, false, false, konqTab);
break;
case TQTabBar::TriangularBelow:
renderTab(p, r, cg, (flags & Style_MouseOver), selected, true, pos, true, false, konqTab);
break;
case TQTabBar::RoundedBelow:
renderTab(p, r, cg, (flags & Style_MouseOver), selected, true, pos, false, false, konqTab);
break;
default:
TDEStyle::drawControl(element, p, ceData, elementFlags, r, cg, flags, opt, widget);
}
// TQt3 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(TQRect());
break;
}
case CE_PushButton: {
TQPushButton *button = (TQPushButton *)widget;
bool tdehtmlMode = tdehtmlWidgets.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();
TQColor bg;
if(!tdehtmlMode && !button->paletteBackgroundPixmap()) {
if(dynamic_cast<TQGroupBox*>(button->parentWidget())) {
bg = button->parentWidget()->paletteBackgroundColor();
}
else {
bg = cg.background();
}
p->fillRect(TQRect(r.x(), r.y(), 6, 6), bg);
p->fillRect(TQRect(r.width()-6, r.y(), 6, 6), bg);
p->fillRect(TQRect(r.width()-6, r.height()-7, 6,7), bg);
p->fillRect(TQRect(r.x(), r.height()-7, 6, 7), bg);
}
else {
buttonContour->setAlphaMode();
contourFlags|=Draw_AlphaBlend;
}
if(tdehtmlMode) 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, TQRect(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, TQRect(r.x()+2, r.y()+2, r.width()-2, r.height()-3), contourFlags);
}
}
else {
renderSurface(p, TQRect(r.x()-3, r.y()-1, r.width()+6, r.height()+2), cg.background(), cg.button(), cg.button(), surfaceFlags);
TQColor contourColor = alphaBlendColors(buttonContour->contourColor(buttonContour->state), cg.background(), 179);
p->setPen(contourColor);
if(dynamic_cast<KMultiTabBarTab*>(button)) {
const TQWidget* parent = button->parentWidget();
bool horizontal = parent->width() >= parent->height();
KMultiTabBar* tabBar = static_cast<KMultiTabBar*>(widget->parentWidget()->parentWidget()->parentWidget()->parentWidget());
KMultiTabBarTab* tab;
TQPtrList<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) {
TQPainter painter(tab);
painter.setPen(contourColor);
TQRect 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, TQRect(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 TQPushButton* button = static_cast<const TQPushButton *>( 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, ceData, elementFlags, widget );
if ( button->iconSet() && !button->iconSet()->isNull() &&
(dx + button->iconSet()->pixmap (TQIconSet::Small, TQIconSet::Normal, TQIconSet::Off ).width()) >= w )
{
cornArrow = true; //To little room. Draw the arrow in the corner, don't adjust the widget
}
else
{
drawPrimitive( PE_ArrowDown, p, ceData, elementFlags, visualRect( TQRect(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() )
{
TQIconSet::Mode mode = TQIconSet::Disabled;
TQIconSet::State state = TQIconSet::Off;
if (button->isEnabled())
mode = button->hasFocus() ? TQIconSet::Active : TQIconSet::Normal;
if (button->isToggleButton() && button->isOn())
state = TQIconSet::On;
TQPixmap pixmap = button->iconSet()->pixmap( TQIconSet::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) {
TQPixmap 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(TQt::ShowPrefix, button->text()).width()+pw;
if(focusIcon) {
TQPixmap 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, ceData, elementFlags, visualRect( TQRect(x + w - 6, x + h - 6, 7, 7), r ), cg, flags, opt );
x += pw + 4;
w -= pw + 4;
}
TQRect re = focusIndicatorSettings.drawUnderline ? subRect(SR_PushButtonFocusRect, ceData, elementFlags, button) : TQRect(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);
TQPixmap buttonPixmap;
if(button->pixmap()) {
if(!enabled)
buttonPixmap = disableIcon(button->pixmap());
else
buttonPixmap = *button->pixmap();
}
dominoDrawItem( p, TQRect(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 TQTabBar * tb = (const TQTabBar *) widget;
TQTab * t = opt.tab();
bool konqTab = false;
bool kickoffTab = false;
int shift, cshift;
switch (tb->shape()) {
case TQTabBar::RoundedAbove:
shift = 4;
cshift = 3;
break;
case TQTabBar::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 TQTabBar::TriangularAbove:
shift = 4;
cshift = 3;
break;
case TQTabBar::TriangularBelow:
shift = -5;
cshift = -3;
break;
default:
shift = 0;
cshift = 0;
}
TQRect 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, TQRect(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();
TQPixmap pixmap;
if(!TDEApplicationMode) {
TQIconSet::Mode mode = (t->identifier() && tb->keyboardFocusTab()) ? TQIconSet::Active : TQIconSet::Normal;
pixmap = t->iconSet()->pixmap( TQIconSet::Small, mode );
if(!enabled)
pixmap = disableIcon(&pixmap);
}
else {
TQIconSet::Mode mode = enabled ? TQIconSet::Normal : TQIconSet::Disabled;
if ( mode == TQIconSet::Normal && (t->identifier() && tb->keyboardFocusTab()) )
mode = TQIconSet::Active;
pixmap = t->iconSet()->pixmap( TQIconSet::Small, mode );
}
int pixw = pixmap.width();
int pixh = pixmap.height();
TQRect ir = r;
ir.setLeft( tr.left() - pixw - 4 );
ir.setRight( tr.right() - 2 );
int yoff = 0;
if(!currentTab) {
yoff = pixelMetric(TQStyle::PM_TabBarTabShiftVertical, ceData, elementFlags, tb);
}
switch(tb->shape()) {
case TQTabBar::RoundedAbove:
case TQTabBar::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 );
}
TQColor 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
TQColor c = down ? dGetColor(cg.background(), 15) : dGetColor(cg.background(), 25);
p->fillRect(TQRect(r.left()+3,r.y()+1, r.width()-7, r.height()), c);
p->fillRect(TQRect(r.left(),r.top()+4, 3, r.height()-7), c);
p->fillRect(TQRect(r.right()-3, r.y()+4, 3, r.height()-7), c);
TQPixmap 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 TQPopupMenu *popupmenu = static_cast< const TQPopupMenu * >( widget );
TQMenuItem *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 = TQApplication::reverseLayout();
bool separator = mi->isSeparator();
TQColor color;
if(separator || (active && enabled)) {
color = separator ? dGetColor(_popupMenuColor, 20) : _selMenuItemColor;
float val = 0;
int ph = popupmenu->rect().height()/2;
int part = separator ? TQMAX(1, ph/r.y()+r.height()) : TQMAX(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) {
TQColor c = color;
p->fillRect(TQRect(r.x()+3, r.y(), r.width()-6, r.height()), c);
p->fillRect(TQRect(r.x(), r.y()+3, 3, r.height()-6), c);
p->fillRect(TQRect(r.x()+r.width()-3, r.y()+3, 3, r.height()-6), c);
TQPixmap pix = tintImage(qembed_findImage("menuItem"), c);
bitBlt(p->device(), r.x(), r.y(), &pix, 0, 0, 3, 3, TQt::CopyROP);
bitBlt(p->device(), r.x(), r.bottom()-2, &pix, 0, 3, 3, 3, TQt::CopyROP);
bitBlt(p->device(), r.x()+r.width()-3, r.y(), &pix, 3, 0, 3, 3, TQt::CopyROP);
bitBlt(p->device(), r.x()+r.width()-3, r.bottom()-2, &pix, 3, 3, 3, 3, TQt::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
TQRect cmr = visualRect( TQRect( r.x()+itemFrame , r.y() + 1, TQMIN(TQMAX(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, ceData, elementFlags, TQRect(cmr.x() + (maxpmw ? (maxpmw-16)/2-4 : -1), cmr.y(), cmr.width(), cmr.height()), cg, cflags );
else if(_indentPopupMenuItems)
drawPrimitive( PE_CheckMark, p, ceData, elementFlags, TQRect(cmr.x() + (maxpmw ? (maxpmw-16)/2-3 : -6), cmr.y(), cmr.width(), cmr.height()), cg, cflags );
else
drawPrimitive( PE_CheckMark, p, ceData, elementFlags, TQRect(reverse ? cmr.x()+cmr.width()-15 : cmr.x()-3, cmr.y(), cmr.width(), cmr.height()), cg, cflags );
}
if(!(_indentPopupMenuItems && checked) && mi->iconSet()) {
TQRect cr = visualRect( TQRect( (reverse ? r.x()-2 : r.x()) + itemFrame, r.y() + 1, maxpmw -1 , r.height() - 2 ), r );
TQIconSet::Mode mode;
// Select the correct icon from the iconset
TQPixmap pixmap;
if(TDEApplicationMode) {
if (active)
mode = enabled ? TQIconSet::Active : TQIconSet::Disabled;
else
mode = enabled ? TQIconSet::Normal : TQIconSet::Disabled;
pixmap = mi->iconSet()->pixmap(TQIconSet::Small, mode);
}
else {
pixmap = mi->iconSet()->pixmap(TQIconSet::Small, active ? TQIconSet::Active : TQIconSet::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)
TQColor 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
TQString 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;
TQColor 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, TQRect(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, TQRect(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() ) {
TQPixmap *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, ceData, elementFlags) - 1;
TQRect vr = visualRect( TQRect( 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, ceData, elementFlags, vr, cg, Style_Enabled);
}
else {
p->setPen(cg.mid());
drawPrimitive( arrow, p, ceData, elementFlags, vr, cg, Style_Default);
}
textEffectSettings.mode = textEffectMode_save;
}
break;
}
case CE_ToolBoxTab: {
bool selected= (flags & Style_Selected && ((TQToolBox*)widget)->currentItem());
TQPixmap pix(widget->size());
TQPainter painter(&pix);
TQColor background = (flags&Style_Down && !selected) ? darkenColor(cg.background(), 15) : cg.background();
painter.fillRect(TQRect(5, 0, r.width()-10, r.height()), background);
renderGradient(&painter, TQRect(r.x(), r.y(), 5, r.height()), background.light(120), background, false);
renderGradient(&painter, TQRect(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;
TQRect re = TQRect(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, ceData, elementFlags, re, cg, Style_Enabled);
p->drawPixmap(r.x(), r.y(), pix);
break;
}
case CE_HeaderLabel:
{
TQRect rect = r;
const TQHeader* header = (const TQHeader *) widget;
int section = opt.headerSection();
TQIconSet* icon = header->iconSet( section );
if ( icon ) {
TQPixmap pixmap = icon->pixmap( TQIconSet::Small,
flags & Style_Enabled ?
TQIconSet::Normal : TQIconSet::Disabled );
int pixw = pixmap.width();
int pixh = pixmap.height();
// "pixh - 1" because of tricky integer division
TQRect pixRect = rect;
pixRect.setY( rect.center().y() - (pixh - 1) / 2 );
drawItem ( p, pixRect, AlignVCenter, cg, flags & Style_Enabled,
&pixmap, TQString::null );
if (TQApplication::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:
TDEStyle::drawControl(element, p, ceData, elementFlags, r, cg, flags, opt, widget);
}
}
void DominoStyle::drawControlMask(ControlElement element,
TQPainter *p,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQRect &r,
const TQStyleOption &opt,
const TQWidget *w) const
{
switch (element) {
case CE_PushButton: {
break;
}
case CE_CheckBox: {
drawPrimitive(PE_IndicatorMask, p, ceData, elementFlags, r, w->colorGroup(), Style_Default, opt);
break;
}
case CE_RadioButton : {
drawPrimitive(PE_ExclusiveIndicatorMask, p, ceData, elementFlags, r, w->colorGroup(), Style_Default, opt);
break;
}
default: {
break;
//TDEStyle::drawControlMask (element, p, ceData, elementFlags, r, opt, w);
}
}
}
void DominoStyle::drawComplexControl(ComplexControl control,
TQPainter *p,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQRect &r,
const TQColorGroup &cg,
SFlags flags,
SCFlags controls,
SCFlags active,
const TQStyleOption& opt,
const TQWidget *widget) const
{
const bool reverseLayout = TQApplication::reverseLayout();
const bool enabled = (flags & Style_Enabled);
//return TDEStyle::drawComplexControl(control, p, ceData, elementFlags, r, cg, flags, controls, active, opt, widget);
switch(control) {
// COMBOBOX
// --------
case CC_ComboBox: {
static const unsigned int handleWidth = 15;
const TQComboBox *cb = dynamic_cast<const TQComboBox*>(widget);
bool editable = cb && cb->editable();
bool isDown = cb && cb->listBox() && cb->listBox()->isVisible();
bool hasFocus =(flags&Style_HasFocus);
const TQColor inputColor = enabled ? (editable ? cg.base() : cg.button()) : cg.background();
const TQColor bg = (cb && cb->parentWidget()) ? cb->parentWidget()->paletteBackgroundColor() : cg.background();
bool hasPixmap = cb && cb->count() > 0 && cb->pixmap(cb->currentItem());
uint contourFlags = 0;
bool isKhtmlWidget = tdehtmlWidgets.contains(cb);
if(isKhtmlWidget || (cb && cb->parentWidget() && cb->parentWidget()->paletteBackgroundPixmap())) {
contourFlags |= Draw_AlphaBlend;
buttonContour->setAlphaMode();
}
else {
p->fillRect(TQRect(r.x(), r.y(), 6, r.height()), bg);
p->fillRect(TQRect(r.width()-6, r.y(), 6, r.height()), bg);
}
if(hasPixmap && editable && r.width() > 40) {
int x = reverseLayout ? handleWidth+3 : 6;
TQRegion mask(x, 0, 17, r.height());
if(!reverseLayout)
mask += TQRegion(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, TQRect(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) {
TQColor lineEditColor = enabled ? cg.base() : cg.background();
TQString isEnabled = enabled ? "1" : "0";
TQPixmap* lineEditBtnEdges; // shared with spinwidget
if(!(lineEditBtnEdges = TQPixmapCache::find(TQString::number(cg.button().pixel(), 16)+TQString::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.
TQPixmap pixmap(1, r.height());
TQPainter painter(&pixmap);
flatMode = true;
renderSurface(&painter, TQRect(0, 0, 1, r.height()), cg.background(), cg.button(), cg.background(), surfaceFlags);
flatMode = false;
TQImage img = pixmap.convertToImage();
// Test, if we have a dark button. Not accurate, but...
TQColor c1 = TQColor(img.pixel(0, r.y()+4));
TQColor c2 = TQColor(img.pixel(0, r.height()-6));
int v, v1, v2;
c1.getHsv(&v, &v ,&v1);
c2.getHsv(&v, &v ,&v2);
TQImage edges = tintImage(qembed_findImage( (v1+v2)/2 < 200 ? "lineEditBtnEdges-d" : "lineEditBtnEdges"), lineEditColor);
if(enabled) {
TQImage shadow = qembed_findImage("lineEditBtnShadow");
blend(shadow, edges, edges);
}
lineEditBtnEdges = new TQPixmap(edges);
TQPixmapCache::insert(TQString::number(cg.button().pixel(), 16)+TQString::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);
}
}
TQRect ar(reverseLayout ? r.left()+3 : r.width()-handleWidth-1, r.height()/2-2, handleWidth, 6);
if(hasFocus && focusIndicatorSettings.indicateFocus && enabled && cb) {
TQRect editField = querySubControlMetrics(control, ceData, elementFlags, SC_ComboBoxEditField, TQStyleOption::Default, widget);
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);
TQRect re = focusIndicatorSettings.drawUnderline ? subRect(SR_ComboBoxFocusRect, ceData, elementFlags, 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;
TQRect sr;
if(editable) {
shadowFlags |= reverseLayout? Round_UpperLeft|Round_BottomLeft|Rectangular_UpperRight|Rectangular_BottomRight :
Rectangular_UpperLeft|Rectangular_BottomLeft|Round_UpperRight|Round_BottomRight;
sr = TQRect(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 = TQRect(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() : tqApp->palette().active().buttonText());
uint aflags = Style_Default|Style_Raised;
if(enabled)
aflags |= Style_Enabled;
drawPrimitive(PE_ArrowDown, p, ceData, elementFlags, ar, cg, aflags);
p->setPen(cg.foreground());
break;
}
// TOOLBUTTON
// ----------
case CC_ToolButton: {
TQToolButton *tb = (TQToolButton *) widget;
if(_toolBtnAsBtn && ::tqt_cast<TDEToolBarButton*>(tb)) {
const bool reverse = TQApplication::reverseLayout();
TDEToolBar *bar = dynamic_cast<TDEToolBar*>(tb->parentWidget());
if(!bar) break;
TDEToolBarButton* btn = ::tqt_cast<TDEToolBarButton*>(tb);
TDEToolBarButton* prevBtn = 0;
TDEToolBarButton* 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() == TQt::Horizontal;
TQRect 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;
}
TQPixmap buffer(btn->size());
TQPainter 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(TQColorGroup::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, ceData, elementFlags, r, cg, flags, opt, widget);
renderContour(&painter, cr, cg.background(), cg.background(), contourFlags);
/////////////////////////////////////////// drop down indicator
if(tb->popup()) {
TQString isEnabled = enabled ? "1" : "0";
TQPixmap* arrow;
TQColor color = btn->palette().active().buttonText();
if(!(arrow = TQPixmapCache::find(TQString::number(color.pixel(), 16)+"arrow_down"+isEnabled))) {
TQImage ar = tintImage(qembed_findImage("arrow_down"), color);
if(!isEnabled) {
ar = setImageOpacity(ar, 25);
}
arrow = new TQPixmap(ar);
TQPixmapCache::insert(TQString::number(color.pixel(), 16)+"arrow_down"+isEnabled, arrow);
}
TQPoint point;
if(prevBtn)
if(nextBtn)
if(horizontal)
point = TQPoint(cr.width()-19, cr.bottom()-8);
else
point = TQPoint(cr.width()-8, cr.bottom()-12);
else
if(!horizontal)
point = TQPoint(cr.width()-8, cr.bottom()-8);
else if(!reverse)
point = TQPoint(cr.width()-15, cr.bottom()-8);
else // reverse
point = TQPoint(cr.width()-13, cr.bottom()-8);
else
if(nextBtn)
if(!horizontal)
point = TQPoint(cr.width()-8, cr.bottom()-12);
else if(!reverse)
point = TQPoint(cr.width()-13, cr.bottom()-8);
else //reverse
point = TQPoint(cr.width()-15, cr.bottom()-8);
else
if(horizontal)
point = TQPoint(cr.width()-9, cr.bottom()-8);
else
point = TQPoint(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 TDEToolBarButton
if(kickerMode && !(flags&(Style_Raised)))
break;
const TQRect br = querySubControlMetrics(control, ceData, elementFlags, SC_ToolButton, opt, widget);
if(br.width() < 16 || br.height()< 16)
break;
TQColorGroup g = widget->colorGroup();
TQColor bg;
if(widget->parentWidget() && widget->paletteBackgroundColor() != widget->parentWidget()->paletteBackgroundColor()) {
bg = widget->parentWidget()->paletteBackgroundColor();
g.setColor(TQColorGroup::Background, bg);
}
else
bg = widget->paletteBackgroundColor();
if(!widget->paletteBackgroundPixmap()) {
p->fillRect(TQRect(br.x(), br.y(), 6, 6), bg);
p->fillRect(TQRect(br.width()-6, br.y(), 6, 6), bg);
p->fillRect(TQRect(br.width()-6, br.height()-7, 6, 7), bg);
p->fillRect(TQRect(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, tdehtmlWidgets.contains(opt.widget()) );
buttonContour->reset();
if(tb->popup()) {
TQString isEnabled = enabled ? "1" : "0";
TQPixmap* arrow;
TQColor color = tb->palette().active().buttonText();
if(!(arrow = TQPixmapCache::find(TQString::number(color.pixel(), 16)+"arrow_down"+isEnabled))) {
TQImage ar = tintImage(qembed_findImage("arrow_down"), color);
if(!isEnabled) {
ar = setImageOpacity(ar, 25);
}
arrow = new TQPixmap(ar);
TQPixmapCache::insert(TQString::number(color.pixel(), 16)+"arrow_down"+isEnabled, arrow);
}
bitBlt(p->device(), r.width()-8, r.bottom()-8, arrow);
}
}
else {
bool isKbtn = ::tqt_cast<TDEToolBarButton*>(tb);
TQPixmap buffer(tb->size());
TQPainter painter(&buffer);
TQColor 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(TQColorGroup::Background));
TQRect fr = TQRect(1, 1, r.width()-2, r.height()-2);
bool isOn = flags &Style_On;
if(isOn) {
TQRegion reg(fr.x()+2, fr.y()+1, fr.width()-4, fr.height()-2);
reg += TQRegion(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, ceData, elementFlags, r, cg, flags, opt, widget);
if(isOn) {
TQColor color = buttonContour->contourColor(Contour_Default);
TQPixmap* frame;
if(!(frame = TQPixmapCache::find(TQString::number(color.pixel(), 16)+"toolBtnFrameThin"))) {
frame = new TQPixmap(tintImage(qembed_findImage("toolBtnFrameThin"), color));
TQPixmapCache::insert(TQString::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())) {
TQString isEnabled = enabled ? "1" : "0";
TQPixmap* arrow;
TQColor color = tb->palette().active().buttonText();
if(!(arrow = TQPixmapCache::find(TQString::number(color.pixel(), 16)+"arrow_down"+isEnabled))) {
TQImage ar = tintImage(qembed_findImage("arrow_down"), color);
if(!isEnabled) {
ar = setImageOpacity(ar, 25);
}
arrow = new TQPixmap(ar);
TQPixmapCache::insert(TQString::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 TQSpinWidget *sw = dynamic_cast<const TQSpinWidget *>(widget);
const TQColor bg = cg.background();
SFlags sflags = flags;
PrimitiveElement pe;
bool enabled = sw && sw->isEnabled();
const TQColor 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(TQRect(r.x(), r.y(), 6, r.height()), bg);
p->fillRect(TQRect(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, TQRect(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, TQRect(r.x()+2, r.y()+2, r.width()-2, r.height()-3), contourFlags);
buttonContour->reset();
// TQColor lineEditColor = enabled ? cg.base() : cg.background();
TQColor lineEditColor = enabled ? cg.base() : dynamic_cast<TQSpinBox*>(sw->parentWidget()) ?
((DominoTQSpinBox*)sw->parentWidget())->editor()->palette().active().background(): tqApp->palette().active().background();
TQString isEnabled = enabled ? "1" : "0";
TQPixmap* lineEditBtnEdges;
if(!(lineEditBtnEdges = TQPixmapCache::find(TQString::number(cg.button().pixel(), 16)+TQString::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.
TQPixmap pixmap(1, r.height());
TQPainter painter(&pixmap);
flatMode = true;
renderSurface(&painter, TQRect(0, 0, 1, r.height()), cg.background(), cg.button(), cg.button(), surfaceFlags);
flatMode = false;
TQImage img = pixmap.convertToImage();
// Test, if we have a dark button. Not accurate, but...
TQColor c1 = TQColor(img.pixel(0, r.y()+4));
TQColor c2 = TQColor(img.pixel(0, r.height()-6));
int v, v1, v2;
c1.getHsv(&v, &v ,&v1);
c2.getHsv(&v, &v ,&v2);
TQImage edges = tintImage(qembed_findImage( (v1+v2)/2 < 127 ? "lineEditBtnEdges-d" : "lineEditBtnEdges"), lineEditColor);
if(enabled) {
TQImage shadow = qembed_findImage("lineEditBtnShadow");
blend(shadow, edges, edges);
}
lineEditBtnEdges = new TQPixmap(edges);
TQPixmapCache::insert(TQString::number(cg.button().pixel(), 16)+TQString::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);
}
TQRect upRect = TQRect(reverseLayout ? r.left()+2 : r.right()-handleWidth-1, r.height()/2-7, handleWidth, 6);
TQRect downRect = TQRect(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() : tqApp->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() == TQSpinWidget::PlusMinus) {
pe = PE_SpinWidgetPlus;
upRect.moveTop(upRect.y()+1);
}
else
pe = PE_SpinWidgetUp;
drawPrimitive(pe, p, ceData, elementFlags, 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() == TQSpinWidget::PlusMinus)
pe = PE_SpinWidgetMinus;
else
pe = PE_SpinWidgetDown;
drawPrimitive(pe, p, ceData, elementFlags, downRect, cg, sflags);
break;
}
case CC_ScrollBar: { // TODO: find a way to draw pressed buttons
const TQScrollBar *sb = (const TQScrollBar*)widget;
bool maxedOut = (sb->minValue() == sb->maxValue());
bool horizontal = (sb->orientation() == TQt::Horizontal);
SFlags sflags = ((horizontal ? Style_Horizontal : Style_Default) |
(maxedOut ? Style_Default : Style_Enabled));
TQRect addline, subline, subline2, addpage, subpage, slider, first, last;
subline = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarSubLine, opt, widget);
addline = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarAddLine, opt, widget);
subpage = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarSubPage, opt, widget);
addpage = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarAddPage, opt, widget);
slider = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarSlider, opt, widget);
// first = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarFirst, opt, widget);
// last = querySubControlMetrics(control, ceData, elementFlags, SC_ScrollBarLast, opt, widget);
// 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, ceData, elementFlags, 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((TQStyle::PrimitiveElement)PE_ScrollBarSubLine2, p,
ceData, elementFlags, subline2, cg,
sflags | (active == SC_ScrollBarSubLine ?
Style_Down : Style_Default));
}
if ((controls & SC_ScrollBarAddLine) && addline.isValid())
drawPrimitive(PE_ScrollBarAddLine, p, ceData, elementFlags, addline, cg,
sflags | ((active == SC_ScrollBarAddLine) ?
Style_Down : Style_Default));
if ((controls & SC_ScrollBarSubPage) && subpage.isValid())
drawPrimitive(PE_ScrollBarSubPage, p, ceData, elementFlags, subpage, cg,
sflags | ((active == SC_ScrollBarSubPage) ?
Style_Down : Style_Default));
if ((controls & SC_ScrollBarAddPage) && addpage.isValid())
drawPrimitive(PE_ScrollBarAddPage, p, ceData, elementFlags, addpage, cg,
sflags | ((active == SC_ScrollBarAddPage) ?
Style_Down : Style_Default));
// if ((controls & SC_ScrollBarFirst) && first.isValid())
// drawPrimitive(PE_ScrollBarFirst, p, ceData, elementFlags, first, cg,
// sflags | ((active == SC_ScrollBarFirst) ?
// Style_Down : Style_Default));
//
// if ((controls & SC_ScrollBarLast) && last.isValid())
// drawPrimitive(PE_ScrollBarLast, p, ceData, elementFlags, last, cg,
// sflags | ((active == SC_ScrollBarLast) ?
// Style_Down : Style_Default));
if ((controls & SC_ScrollBarSlider) && slider.isValid()) {
drawPrimitive(PE_ScrollBarSlider, p, ceData, elementFlags, slider, cg,
sflags | ((active == SC_ScrollBarSlider) ?
Style_Down : Style_Default));
}
break;
}
case CC_TitleBar: {
TQRect ir;
bool down;
TQColorGroup g = widget->colorGroup();
if ( controls & SC_TitleBarLabel ) {
TQPixmap pix(10, r.height());
pix.fill(g.background());
TQPainter painter(&pix);
renderGradient(&painter, TQRect(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, ceData, elementFlags, SC_TitleBarLabel, TQStyleOption::Default, widget ), 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, ceData, elementFlags, SC_TitleBarCloseButton, TQStyleOption::Default, widget ), 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, ceData, elementFlags, SC_TitleBarMaxButton, TQStyleOption::Default, widget ), 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, ceData, elementFlags, SC_TitleBarNormalButton, TQStyleOption::Default, widget ), 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, ceData, elementFlags, SC_TitleBarMinButton, TQStyleOption::Default, widget ), 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, ceData, elementFlags, SC_TitleBarSysMenu, TQStyleOption::Default, widget ), widget );
drawItem( p, ir, AlignCenter, widget->colorGroup(), TRUE, widget->icon(), TQString::null );
}
}
break;
}
default:
TDEStyle::drawComplexControl(control, p, ceData, elementFlags,
r, cg, flags, controls,
active, opt, widget);
break;
}
}
TQRect DominoStyle::subRect(SubRect r,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQWidget *widget) const
{
switch (r) {
case SR_PushButtonContents: {
const TQPushButton* btn = static_cast<const TQPushButton*>(widget);
TQRect rw = widget->rect();
if(btn->text().isEmpty())
return TQRect(rw.left()+2, rw.top()+2, rw.width()-4, rw.height()-4);
return TQRect(rw.left()+2, rw.top()+3, rw.width()-4, rw.height()-7);
}
case SR_PushButtonFocusRect:
{
TQRect rect, wrect(widget->rect());
const TQPushButton *button = (const TQPushButton *) widget;
int dbw1 = 0, dbw2 = 0;
if (button->isDefault() || button->autoDefault()) {
dbw1 = pixelMetric(PM_ButtonDefaultIndicator, ceData, elementFlags, widget);
dbw2 = dbw1 * 2;
}
int dfw1 = pixelMetric(PM_DefaultFrameWidth, ceData, elementFlags, 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 TQRect(4, 3, widget->width()-8, widget->height()-7);
// return querySubControlMetrics( CC_ComboBox, ceData, elementFlags, SC_ComboBoxEditField, TQStyleOption::Default, widget );
}
case SR_CheckBoxFocusRect:
{
TQRect cr = subRect(SR_CheckBoxContents, ceData, elementFlags, widget);
TQRect fr = TDEStyle::subRect(r, ceData, elementFlags, widget);
if(cr.width() <= 0) // no text
fr.setHeight(fr.height()+2);
else
fr.addCoords(+2, 0, -2, 0);
return fr;
}
case SR_RadioButtonFocusRect:
{
TQRect cr = subRect(SR_CheckBoxContents, ceData, elementFlags, widget);
TQRect fr = TDEStyle::subRect(r, ceData, elementFlags, 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 TQRect(widget->rect());
}
case SR_ProgressBarContents:
case SR_ProgressBarLabel: {
TQRect rw = widget->rect();
return TQRect(rw.left()+2, rw.top()+2, rw.width()-4, rw.height()-4 );
}
case SR_ToolBoxTabContents: {
TQRect rw = widget->rect();
return TQRect(rw.left()+18, rw.top(), rw.width()-18, rw.height());
}
default: {
return TDEStyle::subRect(r, ceData, elementFlags, widget);
}
}
}
TQRect DominoStyle::querySubControlMetrics(ComplexControl control,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
SubControl subcontrol,
const TQStyleOption &opt,
const TQWidget *widget) const
{
if (!widget) {
return TQRect();
}
TQRect r(widget->rect());
switch (control) {
case CC_ComboBox: {
switch (subcontrol) {
case SC_ComboBoxEditField: {
const TQComboBox* cb = dynamic_cast<const TQComboBox *>(widget);
if(!cb) // maybe tdevelop's KComboView
return TQRect(r.left()+4, r.top()+3, r.width()-4-15-3, r.height()-7);
if(!cb->editable())
return TQRect(r.left()+3, r.top()+3, r.width()-4-15-2, r.height()-6);
return TQRect(r.left()+3, r.top()+3, r.width()-4-15-2, r.height()-7);
}
default: {
return TDEStyle::querySubControlMetrics(control, ceData, elementFlags, subcontrol, opt, widget);
}
}
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 TQRect(buttonsLeft, r.top()+3, buttonsWidth+1, r.height()/2-3 );
}
case SC_SpinWidgetDown: {
if(heightDividable) {
return TQRect(buttonsLeft, r.top()+r.height()/2+1, buttonsWidth+1, r.height()/2-3);
} else {
return TQRect(buttonsLeft, r.top()+r.height()/2+1, buttonsWidth+1, r.height()/2-2);
}
}
case SC_SpinWidgetFrame: {
return TQRect(r.left(), r.top(), r.width(), r.height() );
}
case SC_SpinWidgetEditField: {
return TQRect(r.left()+1+fw, r.top()+1+fw, r.width()-(buttonsWidth+2+fw*2), r.height()-3-fw*2);
}
case SC_SpinWidgetButtonField: {
return TQRect(buttonsLeft, r.top()+2, buttonsWidth, r.height()-5);
}
default: {
return TDEStyle::querySubControlMetrics(control, ceData, elementFlags, subcontrol, opt, widget);
}
}
break;
}
case CC_ScrollBar: {
const TQScrollBar *scrollbar = (const TQScrollBar *) widget;
int sliderstart = scrollbar->sliderStart();
const int buttonw = 15 /*- (fw * 2)*/;
const int buttonh = 15 /*- (fw * 2)*/;
int maxlen = ((scrollbar->orientation() == TQt::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() == TQt::Horizontal) {
return TQRect(scrollbar->width() - buttonw , 0, buttonw, buttonh);
} else {
return TQRect(0, scrollbar->height() - buttonh, buttonw, buttonh);
}
}
case SC_ScrollBarSubLine: { // top/left button
return TQRect(0, 0, buttonw, buttonh);
}
case SC_ScrollBarSubPage: // top/left
if (scrollbar->orientation() == TQt::Horizontal)
return TQRect(buttonw, 0, sliderstart-buttonw+1, buttonw);
return TQRect(0, buttonh, buttonw, sliderstart-buttonw+1);
case SC_ScrollBarAddPage: // bottom/left
if (scrollbar->orientation() == TQt::Horizontal)
return TQRect(sliderstart + sliderlen-1, 0, maxlen - sliderstart - sliderlen + buttonw+1, buttonw);
return TQRect(0, sliderstart + sliderlen-1, buttonw, maxlen - sliderstart - sliderlen + buttonw+1);
case SC_ScrollBarGroove:
if (scrollbar->orientation() == TQt::Horizontal)
return TQRect(buttonw , 0, maxlen, buttonw);
return TQRect(0, buttonw, buttonw, maxlen);
case SC_ScrollBarSlider:
if (scrollbar->orientation() == TQt::Horizontal)
return TQRect(sliderstart, 0, sliderlen, buttonw);
return TQRect(0, sliderstart, buttonw, sliderlen);
default:
break;
}
}
default: {
return TDEStyle::querySubControlMetrics(control, ceData, elementFlags, subcontrol, opt, widget);
}
}
}
int DominoStyle::pixelMetric(PixelMetric m,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQWidget *widget) const
{
//return TDEStyle::pixelMetric(m, ceData, elementFlags, widget);
switch(m) {
// FRAMES
// ------
case PM_DefaultFrameWidth: {
if(widget) {
if(dynamic_cast<const TQPopupMenu*>(widget))
return 3;
// stolen from baghira
if (dynamic_cast<TQTabWidget*>(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 TQTabBar * tb = (const TQTabBar *) widget;
switch(tb->shape()) {
case TQTabBar::RoundedAbove:
case TQTabBar::RoundedBelow:
return 12;
default:
return 4;
}
}
case PM_TabBarTabShiftVertical: {
const TQTabBar * tb = (const TQTabBar *) widget;
switch (tb->shape()) {
case TQTabBar::RoundedAbove:
return 1;
case TQTabBar::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 TQTabWidget * tw = (const TQTabWidget *) widget;
if(((DominoTQTabWidget*)tw)->tabBar()->isHidden() || tw->isA("KonqFrameTabs"))
return 0;
return (tw->tabPosition() == TQTabWidget::Top) ? -3 : -4;
}
#if (TQT_VERSION >= 0x030300) // requires TQt 3.3
// extra space between menubar items
case PM_MenuBarItemSpacing: {
return 6;
}
#endif
// #if (TQT_VERSION >= 0x030300) // requires TQt 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 TDEStyle::pixelMetric(m, ceData, elementFlags, widget);
}
}
TQSize DominoStyle::sizeFromContents(ContentsType t,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQSize &s,
const TQStyleOption &opt,
const TQWidget *widget) const
{
//return TDEStyle::sizeFromContents (t, ceData, elementFlags, s, opt, widget);
switch (t) {
case CT_PushButton:
{
const TQPushButton* btn = static_cast<const TQPushButton*>(widget);
int w = s.width();
int h = s.height();
if ( btn->text().isEmpty() && s.width() < 32 ) {
w += pixelMetric(PM_ButtonMargin, ceData, elementFlags, widget)*2;
h += pixelMetric(PM_ButtonMargin, ceData, elementFlags, widget)*2;
return TQSize(w, h);
}
int bm = pixelMetric(PM_ButtonMargin, ceData, elementFlags, widget);
int fw = pixelMetric(PM_DefaultFrameWidth, ceData, elementFlags, widget) * 2;
w += bm + fw + 22;
h += bm + fw;
return TQSize(w, h < 26 ? 26+_buttonHeightAdjustment : h+4 );
}
case CT_ComboBox: {
int bm = pixelMetric(PM_ButtonMargin, ceData, elementFlags, widget);
int fw = pixelMetric(PM_DefaultFrameWidth, ceData, elementFlags, widget) * 2;
int w = s.width();
int h = s.height();
w += bm + fw + 22;
h += bm + fw-3;
return TQSize(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.
/////////////////////
TQTabBar* tb = 0;
if(::tqt_cast<TQTabBar*>(widget))
tb = ::tqt_cast<TQTabBar*>(widget);
else
return TQSize(s.width(), s.height());
if(!strcmp(widget->name(), "tabbar") && widget->parentWidget()->isA("KonqFrameTabs")) {
TQTab* 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 TQSize(s.width(), s.height());
int dots = tb->fontMetrics().width(".");
if((dots*minTabLength+44)*count >= tb->width()) // 44 = frame+iconwidth
return TQSize(s.width(), s.height());
TQSize sz = TDEStyle::sizeFromContents( t, ceData, elementFlags, s, opt, widget );
TQString str;
str.fill(' ', minTabLength);
if( tab->text().isEmpty() || tab->text() == str) {
tab->setText("about:blank");
//return TQSize( fm+44, 26 );
return TQSize( fm+44, s.height());
}
return TQSize(s.width(), s.height());
}
else {
switch (tb->shape()) {
case TQTabBar::RoundedAbove:
case TQTabBar::RoundedBelow:
return TQSize( s.width(), s.height()-2 );
default:
return TQSize( s.width(), s.height() ); // triangular
}
}
}
case CT_ToolButton: {
if(dynamic_cast<const TQToolButton*>(widget)) {
if(dynamic_cast<TQTabWidget*>(widget->parentWidget())) // smaller cornerWidget
return TQSize( s.width()+9, s.height()+7 );
return TQSize( s.width()+11, s.height()+7 );
}
return TDEStyle::sizeFromContents( t, ceData, elementFlags, s, opt, widget ); // KMultiTabBar buttons
}
case CT_SpinBox: {
TQSize sz = TDEStyle::sizeFromContents( t, ceData, elementFlags, s, opt, widget );
int h = sz.height()%2 != 0 ? sz.height()+1 : sz.height();
return ( TQSize( sz.width(), h < 24 ? 24 : h) );
}
case CT_Header: {
TQSize sz = TDEStyle::sizeFromContents( t, ceData, elementFlags, s, opt, widget );
return TQSize(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 TQPopupMenu *popup = dynamic_cast<const TQPopupMenu *>(widget);
TQMenuItem *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 = TQMAX(h, mi->pixmap()->height() + 2);
} else {
h = TQMAX(h, 16 + 2 );
h = TQMAX(h, popup->fontMetrics().height() + 4 );
}
if (mi->iconSet()) {
h = TQMAX(h, mi->iconSet()->pixmap(TQIconSet::Small, TQIconSet::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 TQSize(w, h);
}
default:
return TDEStyle::sizeFromContents( t, ceData, elementFlags, s, opt, widget );
}
return TDEStyle::sizeFromContents( t, ceData, elementFlags, s, opt, widget );
}
int DominoStyle::styleHint( StyleHint stylehint,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQStyleOption &option,
TQStyleHintReturn* returnData,
const TQWidget *widget ) const
{
switch (stylehint) {
case SH_PopupMenu_SubMenuPopupDelay:
//return 96; // Motif-like delay...
return 250;
case SH_GroupBox_TextLabelVerticalAlignment: {
return TQt::AlignTop;
}
case SH_ScrollBar_BackgroundMode: {
return TQt::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 (TQt 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 TQFontMetrics &fm = widget->fontMetrics();
if (fm.inFont(TQChar(0x25CF))) {
return 0x25CF;
} else if (fm.inFont(TQChar(0x2022))) {
return 0x2022;
}
}
return '*';
}
default:
return TDEStyle::styleHint(stylehint, ceData, elementFlags, option, returnData, widget);
}
}
TQPixmap DominoStyle::stylePixmap(StylePixmap stylepixmap,
const TQStyleControlElementData &ceData,
ControlElementFlags elementFlags,
const TQStyleOption& opt,
const TQWidget* widget ) const {
switch (stylepixmap) {
case SP_DockWindowCloseButton:
case SP_TitleBarCloseButton:
return TQPixmap(qembed_findImage("DockCloseButton").copy(0,0,12,12));
case SP_TitleBarMinButton:
return TQPixmap(qembed_findImage("DockbackButton").copy(0,0,12,12));
case SP_TitleBarMaxButton:
return TQPixmap(qembed_findImage("OverlapButton").copy(0,0,12,12));
case SP_TitleBarNormalButton:
return TQPixmap(qembed_findImage("ToDesktopButton").copy(0,0,12,12));
default:
return TDEStyle::stylePixmap(stylepixmap, ceData, elementFlags, opt, widget);
}
}
TQColor DominoStyle::lightenColor(const TQColor &color, const int value) const
{
if(value < 0)
return darkenColor(color, TQABS(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 TQColor(r, g, b);
}
TQColor DominoStyle::darkenColor(const TQColor &color, const int value) const
{
if(value < 0)
return lightenColor(color, TQABS(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 TQColor(r, g, b);
}
TQColor DominoStyle::dGetColor(const TQColor &color, const int value) const
{
int h, s, v;
color.getHsv(&h, &s, &v);
return (v<127)? lightenColor(color, value): darkenColor(color, value);
}
TQPixmap* DominoStyle::renderLineEditShadow(TQWidget* widget, TQRect r, TQColor 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;
TQRect rect(x, y, w, h);
TQColor tintColor;
TQString enabled = widget->isEnabled() ? "1" : "0";
if(!widget->isEnabled())
tintColor =bg;
else
tintColor = alphaBlendColors(TQt::black, bg, 30+35);
TQPixmap* prBgShadow;
if(!(prBgShadow = TQPixmapCache::find(TQString::number(bg.pixel(), 16)+TQString::number(tqApp->palette().active().background().pixel(), 16)+"leBgShadow"+enabled))) {
prBgShadow = new TQPixmap(4,4);
prBgShadow->fill(bg);
TQPixmap pix = tintImage(qembed_findImage("progressShadow2"), tintColor);
bitBlt(prBgShadow, 0, 0, &pix);
TQPixmapCache::insert(TQString::number(bg.pixel(), 16)+TQString::number(tqApp->palette().active().background().pixel(), 16)+"leBgShadow"+enabled, prBgShadow);
}
TQPixmap* pix = new TQPixmap(rect.size());
pix->fill(bg);
if(widget->isEnabled()) {
TQPainter p(pix);
TQColor color_d = alphaBlendColors(tintColor, bg, 170);
TQColor color_m = alphaBlendColors(tintColor, bg, 85);
TQColor 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, TQt::CopyROP);
bitBlt(pix, rect.x(), rect.y(), prBgShadow, 0, 0, 2, 3, TQt::CopyROP);
bitBlt(pix, rect.right()-1, rect.bottom(), prBgShadow, 2, 3, 2, 1, TQt::CopyROP);
bitBlt(pix, rect.x(), rect.bottom(), prBgShadow, 0, 3, 2, 1, TQt::CopyROP);
p.end();
}
return pix;
}
TQColor DominoStyle::getGroupBoxColor(const TQWidget* w) const {
TQWidget* parent = w->parentWidget();
int tint = groupBoxSettings.customColor ? 0 : groupBoxSettings.brightness;
while(dynamic_cast<TQGroupBox*>(parent)) {
parent = parent->parentWidget();
tint += groupBoxSettings.brightness;
}
return TQColor(darkenColor(groupBoxSettings.customColor ? groupBoxSettings.color :
tqApp->palette().active().background(), tint));
}
TQPixmap* DominoStyle::createCheckMark(const TQColor color) const {
TQImage checkMark_enabled = qembed_findImage("checkmark");
TQImage checkMark_disabled = setImageOpacity(checkMark_enabled, 25);
TQImage 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 TQPixmap(tintImage(img, color));
}
TQPixmap* DominoStyle::createRadioIndicator(const TQColor color) const {
TQImage dot_enabled = tintImage(qembed_findImage("rb-dot"),color);
blend(qembed_findImage("rb-dot-shadow"), dot_enabled, dot_enabled);
TQImage dot_disabled = setImageOpacity(dot_enabled, 25);
TQImage 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 TQPixmap(img);
}
void DominoStyle::drawFocusIndicator(TQPainter *p, const TQRect &r, int flags, const TQColorGroup cg, bool /*enabled*/,
const TQPixmap* /*pixmap*/, const TQString & text, int /*len = -1*/, const TQColor& highlight, bool drawLine, bool isButton) const
{
if(drawLine) {
// p->setPen(cg.foreground());
// TQPixmap edges = tintImage(qembed_findImage("indicatorEdges"), cg.foreground());
// bitBlt(p->device(), r.x(), r.bottom()-1, &edges, 0, 0, 2, 1, TQt::CopyROP);
// bitBlt(p->device(), r.right()-2, r.bottom()-1, &edges, 2, 0, 2, 1, TQt::CopyROP);
// p->drawLine(r.x()+2, r.bottom()-1, r.right()-3, r.bottom()-1);
TQFont font = p->font();
font.setUnderline(true);
p->setFont(font);
}
else {
TQRect br = p->fontMetrics().boundingRect(r.x(), r.y(), r.width(), r.height(), flags, text);
TQPainter pixPainter;
TQPixmap textPixmap(br.width()+2, br.height()+2);
textPixmap.fill(TQColor(0,0,0));
pixPainter.begin(&textPixmap);
pixPainter.setPen(white);
pixPainter.setFont(p->font());
pixPainter.drawText( TQRect(1, 1, br.width()-1, br.height()-1), flags, text );
pixPainter.end();
DominoTQPixmap* pixm = (DominoTQPixmap*)&textPixmap;
uint height = pixm->height();
uint width = pixm->width();
pixm->data->alphapm = new TQPixmap;
DominoTQPixmap* alphapm = (DominoTQPixmap*)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( tqt_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 = (tqBlue(XGetPixel(xi,x-1,y-1)) * DIAGONAL_FACTOR +
tqBlue(XGetPixel(xi,x-1,y )) * AXIS_FACTOR +
tqBlue(XGetPixel(xi,x-1,y+1)) * DIAGONAL_FACTOR +
tqBlue(XGetPixel(xi,x ,y-1)) * AXIS_FACTOR +
0 +
tqBlue(XGetPixel(xi,x ,y+1)) * AXIS_FACTOR +
tqBlue(XGetPixel(xi,x+1,y-1)) * DIAGONAL_FACTOR +
tqBlue(XGetPixel(xi,x+1,y )) * AXIS_FACTOR +
tqBlue(XGetPixel(xi,x+1,y+1)) * DIAGONAL_FACTOR) / 2.0; // / multiplicationFactor
alpha = (int)alphaShadow;
XPutPixel(axi, x, y, TQMIN(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);
TQRect fr = TQRect(br.x(), br.y(), TQMIN((int)width-2, r.width()) , TQMIN((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());
}
}
TQPixmap DominoStyle::renderOutlineIcon(const TQPixmap* icon) const
{
TQImage img = icon->convertToImage();
TQImage 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 ] = tqRgba( focusIndicatorSettings.buttonColor.red(), focusIndicatorSettings.buttonColor.green(), focusIndicatorSettings.buttonColor.blue(), tqAlpha(outlineIconData[ current ]) * customalpha >> 8);
}
return TQPixmap(outlineIcon);
}
void DominoStyle::drawItem( TQPainter *p, const TQRect &r,
int flags, const TQColorGroup &g, bool enabled,
const TQPixmap *pixmap, const TQString& text, int len,
const TQColor* penColor ) const
{
dominoDrawItem(p, r, flags, g, enabled, pixmap, text, len, penColor, false);
}
void DominoStyle::dominoDrawItem( TQPainter *p, const TQRect &r,
int flags, const TQColorGroup &g, bool enabled,
const TQPixmap *pixmap, const TQString& text, int len,
const TQColor* 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 ) {
TQPixmap pm( *pixmap );
bool clip = (flags & TQt::DontClip) == 0;
if ( clip ) {
if ( pm.width() < w && pm.height() < h ) {
clip = FALSE;
} else {
p->save();
TQRegion cr = TQRect(x, y, w, h);
if (p->hasClipping())
cr &= p->clipRegion(TQPainter::CoordPainter);
p->setClipRegion(cr);
}
}
if ( (flags & TQt::AlignVCenter) == TQt::AlignVCenter )
y += h/2 - pm.height()/2;
else if ( (flags & TQt::AlignBottom) == TQt::AlignBottom)
y += h - pm.height();
if ( (flags & TQt::AlignRight) == TQt::AlignRight )
x += w - pm.width();
else if ( (flags & TQt::AlignHCenter) == TQt::AlignHCenter )
x += w/2 - pm.width()/2;
else if ( ((flags & TQt::AlignLeft) != TQt::AlignLeft) && TQApplication::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
TQRect br = p->fontMetrics().boundingRect(x, y, w, h, flags, text);
TQPainter pixPainter;
TQPixmap textPixmap(br.width(), br.height());
textPixmap.fill(TQColor(0,0,0));
pixPainter.begin(&textPixmap);
pixPainter.setPen(white);
pixPainter.setFont(p->font());
pixPainter.drawText( TQRect(0,0,br.width(), br.height()), flags, text );
pixPainter.end();
DominoTQPixmap* pixm = (DominoTQPixmap*)&textPixmap;
uint height = pixm->height();
uint width = pixm->width();
pixm->data->alphapm = new TQPixmap;
DominoTQPixmap* alphapm = (DominoTQPixmap*)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( tqt_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);
TQRect tr = TQRect(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);
TQRect tr = TQRect(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 );
}
}
TQWidget::BackgroundOrigin DominoStyle::setPixmapOrigin(TQWidget::BackgroundOrigin origin)
{
switch(origin) {
case TQWidget::WidgetOrigin:
return TQWidget::ParentOrigin;
case TQWidget::ParentOrigin:
return TQWidget::AncestorOrigin;
default:
return origin;
break;
}
}
void DominoStyle::setDominoButtonPalette(TQWidget* widget, PaletteTyp type) {
TQPalette pal;
switch(type) {
case Palette_Application:
pal = tqApp->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);
TQColor disabledColor = alphaBlendColors(pal.active().buttonText(), v < 127 ? white : black, 150);
pal.setColor(TQPalette::Disabled, TQColorGroup::Text, disabledColor);
widget->setPalette(pal);
}
void DominoStyle::updateTabWidgetFrame() {
TQTabWidget* tw = dynamic_cast<TQTabWidget*>(sender()->parent());
TQWidget* w = tw ? tw->currentPage() : 0;
if(!w)
return;
TQFrame* f = dynamic_cast<TQFrame*>(w->parentWidget());
if(f) {
TQRect r = f->rect();
if(tw->tabPosition() == TQTabWidget::Top)
r= TQRect(r.x(), r.y(), r.width(), 3);
else
r= TQRect(r.x(), r.y()+r.height()-4, r.width(), 2);
f->repaint(r, false);
}
}
TQPixmap DominoStyle::disableIcon(const TQPixmap* icon) const {
TQImage 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 = tqGray(data[i]);
data[i] = tqRgba(val, val, val, tqAlpha(data[i]));
}
img = setImageOpacity(img, 50);
return TQPixmap(img);
}
// same as in renderSurface() but with darker colors
void DominoStyle::renderTabSeparator(TQPainter *p, const TQRect &r, const TQColor 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;
TQColor c1;
TQColor c2;
TQColor c3;
TQColor c4;
TQColor bg;
if(buttonColor != tqApp->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(TQColor(0,0,0),bg , alpha));
switch(ds->numGradients) {
case 1: {
c1 = alphaBlendColors(TQColor(0,0,0), c1, alpha);
c2 = alphaBlendColors(TQColor(0,0,0), c2, alpha);
renderGradient(p, TQRect(r.x(), top, r.width(), bottom), c1, c2, true);
break;
}
case 2: {
c1 = alphaBlendColors(TQColor(0,0,0), c1, alpha);
c2 = alphaBlendColors(TQColor(0,0,0), c2, alpha);
c3 = alphaBlendColors(TQColor(0,0,0), c3, alpha);
c4 = alphaBlendColors(TQColor(0,0,0), c4, alpha);
renderGradient(p, TQRect(r.x(), top, r.width(), bottom), c1, c2, true);
renderGradient(p, TQRect(r.x(), top2, r.width(), bottom2), c3, c4, true);
}
default:
break;
}
}
void DominoStyle::renderGroupBox(TQObject *obj, TQEvent *ev) {
TQGroupBox* gb = dynamic_cast<TQGroupBox*>(obj);
bool paintEvent = ev->type() == TQEvent::Paint;
TQRect r = gb->rect();
if(gb->isFlat()) {
TQString title = gb->title();
int titleHeight = gb->fontMetrics().height();
int titleWidth = gb->fontMetrics().width(title);
if(title.contains("&"))
titleWidth -= gb->fontMetrics().width("&");
TQPainter p(gb);
// p.setPen(tqApp->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);
TQColorGroup cg = gb->parentWidget()->colorGroup();
dominoDrawItem(&p, TQRect(r.width()/2-titleWidth/2, -1, r.width(), titleHeight), ShowPrefix, cg, Style_Enabled, 0, title, -1, &cg.foreground(), false);
p.setPen(cg.foreground());
((DominoTQGroupBox*)gb)->drawContents(&p);
}
else {
TQString title = gb->title();
int titleHeight = gb->fontMetrics().height();
TQColor outsideColor = gb->parentWidget() ? gb->parentWidget()->paletteBackgroundColor() : gb->paletteBackgroundColor();
TQColor insideColor = groupBoxSettings.tintBackground ? getGroupBoxColor(gb) : gb->paletteBackgroundColor();
bool pixmapExists = groupBoxPixmaps.contains(gb);
if(paintEvent && pixmapExists) {
TQPainter p;
if(!title.isEmpty()) {
int titleWidth = gb->fontMetrics().width(title);
if(title.contains("&"))
titleWidth -= gb->fontMetrics().width("&");
TQPainter p(groupBoxPixmaps[gb]);
TQRect titleRect = TQRect((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.
// TQt3 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);
((DominoTQGroupBox*)gb)->drawContents(&p);
return;
}
bool isCheckable = gb->isCheckable();
int x = r.x();
int y = isCheckable ? r.y()+titleHeight+5 : (title.isNull() || title.isEmpty()) ? TQMAX(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;
TQPixmap buffer(r.width(), r.height());
TQPainter p(&buffer);
p.fillRect(TQRect(0, 0, w, y), outsideColor);
p.fillRect(TQRect(x+3, y+3, w-6, h-6-y), insideColor);
TQPixmap* gbPix = 0;
if(!(gbPix = TQPixmapCache::find(TQString::number(outsideColor.pixel(), 16)+TQString::number(insideColor.pixel(), 16)+"groupbox"))) {
gbPix = new TQPixmap(16, 16);
gbPix->fill(outsideColor);
TQPixmap groupBoxPixMask = qembed_findImage("groupBoxMask");
groupBoxPixMask.fill(insideColor);
bitBlt(gbPix, 0, 0, &groupBoxPixMask);
TQPixmap groupBoxPix = qembed_findImage("groupBox");
bitBlt(gbPix, 0, 0, &groupBoxPix);
TQPixmapCache::insert(TQString::number(outsideColor.pixel(), 16)+TQString::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
TQColor c1 = alphaBlendColors(TQColor(255,255,255), outsideColor, 25);
TQColor c2 = alphaBlendColors(TQColor(0,0,0), insideColor, 70);
TQColor c3 = alphaBlendColors(TQColor(0,0,0), insideColor, 30);
// left + right
TQColor c4 = alphaBlendColors(TQColor(255,255,255), outsideColor, 40);
TQColor c5 = c3; //alphaBlendColors(TQColor(0,0,0), insideColor, 30);
TQColor c6 = alphaBlendColors(TQColor(0,0,0), insideColor, 4);
// bottom
TQColor c7 = alphaBlendColors(TQColor(6,6,6), insideColor, 25);
TQColor c8 = alphaBlendColors(TQColor(255,255,255), outsideColor, 79);
TQColor c9 = alphaBlendColors(TQColor(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() == TQEvent::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);
TQRect titleRect = TQRect((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);
((DominoTQGroupBox*)gb)->drawContents(&p);
}
if(pixmapExists)
delete groupBoxPixmaps[gb];
groupBoxPixmaps[gb] = new TQPixmap(buffer);
}
}
void DominoStyle::spinBoxValueChanged(int value) {
TQSpinBox* sb = (TQSpinBox*)sender();
if(spinWidgetDown) {
spinWidgetDown = !(value == sb->maxValue() || value == sb->minValue());
if(!spinWidgetDown) {
// if we repaint directly, the last mousePressEvent wouldn't be down
TQTimer::singleShot( 200, ((DominoTQSpinBox*)sb)->editor()->parentWidget(), SLOT(repaint()) );
}
}
}
uint DominoStyle::preMultiplyColor(const uint &c) const {
XRenderColor clr;
uint color = c << 8 | tqAlpha(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 tqRgba(clr.red, clr.green, clr.blue, clr.alpha);
}
void DominoStyle::toolPopupPressed() {
TQToolButton* tb = (TQToolButton*)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"