summaryrefslogtreecommitdiffstats
path: root/tdestyles/keramik/keramik.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdestyles/keramik/keramik.cpp')
-rw-r--r--tdestyles/keramik/keramik.cpp3004
1 files changed, 3004 insertions, 0 deletions
diff --git a/tdestyles/keramik/keramik.cpp b/tdestyles/keramik/keramik.cpp
new file mode 100644
index 000000000..fa1848203
--- /dev/null
+++ b/tdestyles/keramik/keramik.cpp
@@ -0,0 +1,3004 @@
+/* Keramik Style for KDE3
+ 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>,
+ Improvements to progressbar animation from Plastik, Copyright (C) 2003 Sandro Giessl <sandro@giessl.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+// $Id$
+
+#include <tqapplication.h>
+#include <tqbitmap.h>
+#include <tqcheckbox.h>
+#include <tqcombobox.h>
+#include <tqdrawutil.h>
+#include <tqframe.h>
+#include <tqheader.h>
+#include <tqintdict.h>
+#include <tqlineedit.h>
+#include <tqlistbox.h>
+#include <tqmenubar.h>
+#include <tqpainter.h>
+#include <tqpointarray.h>
+#include <tqprogressbar.h>
+#include <tqpushbutton.h>
+#include <tqsettings.h>
+#include <tqslider.h>
+#include <tqstyleplugin.h>
+#include <tqtabbar.h>
+#include <tqtimer.h>
+#include <tqtoolbar.h>
+#include <tqtoolbutton.h>
+
+#include <kpixmap.h>
+#include <kpixmapeffect.h>
+
+#include "keramik.moc"
+
+#include "gradients.h"
+#include "colorutil.h"
+#include "keramikrc.h"
+#include "keramikimage.h"
+
+#include "bitmaps.h"
+#include "pixmaploader.h"
+
+#define loader Keramik::PixmapLoader::the()
+
+// -- Style Plugin Interface -------------------------
+class KeramikStylePlugin : public TQStylePlugin
+{
+public:
+ KeramikStylePlugin() {}
+ ~KeramikStylePlugin() {}
+
+ TQStringList keys() const
+ {
+ if (TQPixmap::defaultDepth() > 8)
+ return TQStringList() << "Keramik";
+ else
+ return TQStringList();
+ }
+
+ TQStyle* create( const TQString& key )
+ {
+ if ( key == "keramik" ) return new KeramikStyle();
+ return 0;
+ }
+};
+
+KDE_Q_EXPORT_PLUGIN( KeramikStylePlugin )
+// ---------------------------------------------------
+
+
+// ### Remove globals
+/*
+TQBitmap lightBmp;
+TQBitmap grayBmp;
+TQBitmap dgrayBmp;
+TQBitmap centerBmp;
+TQBitmap maskBmp;
+TQBitmap xBmp;
+*/
+namespace
+{
+ const int itemFrame = 2;
+ const int itemHMargin = 6;
+ const int itemVMargin = 0;
+ const int arrowHMargin = 6;
+ const int rightBorder = 12;
+ const char* kdeToolbarWidget = "kde toolbar widget";
+
+ const int smallButMaxW = 27;
+ const int smallButMaxH = 20;
+ const int titleBarH = 22;
+}
+// ---------------------------------------------------------------------------
+
+namespace
+{
+ void drawKeramikArrow(TQPainter* p, TQColorGroup cg, TQRect r, TQStyle::TQ_PrimitiveElement pe, bool down, bool enabled)
+ {
+ TQPointArray a;
+
+ switch(pe)
+ {
+ case TQStyle::PE_ArrowUp:
+ a.setPoints(TQCOORDARRLEN(keramik_up_arrow), keramik_up_arrow);
+ break;
+
+ case TQStyle::PE_ArrowDown:
+ a.setPoints(TQCOORDARRLEN(keramik_down_arrow), keramik_down_arrow);
+ break;
+
+ case TQStyle::PE_ArrowLeft:
+ a.setPoints(TQCOORDARRLEN(keramik_left_arrow), keramik_left_arrow);
+ break;
+
+ default:
+ a.setPoints(TQCOORDARRLEN(keramik_right_arrow), keramik_right_arrow);
+ }
+
+ p->save();
+ /*if ( down )
+ p->translate( pixelMetric( PM_ButtonShiftHorizontal, ceData, elementFlags ),
+ pixelMetric( PM_ButtonShiftVertical, ceData, elementFlags ) );
+ */
+
+ if ( enabled ) {
+ //CHECKME: Why is the -1 needed?
+ a.translate( r.x() + r.width() / 2 - 1, r.y() + r.height() / 2 );
+
+ if (!down)
+ p->setPen( cg.buttonText() );
+ else
+ p->setPen ( cg.button() );
+ p->drawLineSegments( a );
+ } else {
+ a.translate( r.x() + r.width() / 2, r.y() + r.height() / 2 + 1 );
+ p->setPen( cg.light() );
+ p->drawLineSegments( a );
+ a.translate( -1, -1 );
+ p->setPen( cg.mid() );
+ p->drawLineSegments( a );
+ }
+ p->restore();
+ }
+}
+
+// XXX
+/* reimp. */
+void KeramikStyle::renderMenuBlendPixmap( KPixmap& pix, const TQColorGroup &cg,
+ const TQPopupMenu* /* popup */ ) const
+{
+ TQColor col = cg.button();
+
+#ifdef Q_WS_X11 // Only draw menu gradients on TrueColor, X11 visuals
+ if ( TQPaintDevice::x11AppDepth() >= 24 )
+ KPixmapEffect::gradient( pix, col.light(120), col.dark(115),
+ KPixmapEffect::HorizontalGradient );
+ else
+#endif
+ pix.fill( col );
+}
+
+// XXX
+TQRect KeramikStyle::subRect(SubRect r, const TQStyleControlElementData &ceData, const ControlElementFlags elementFlags, const TQWidget *widget) const
+{
+ // We want the focus rect for buttons to be adjusted from
+ // the Qt3 defaults to be similar to Qt 2's defaults.
+ // -------------------------------------------------------------------
+ switch ( r )
+ {
+ case SR_PushButtonFocusRect:
+ {
+ TQRect wrect(ceData.rect);
+
+ if ((elementFlags & CEF_IsDefault) || (elementFlags & CEF_AutoDefault))
+ {
+ return TQRect(wrect.x() + 6, wrect.y() + 5, wrect.width() - 12, wrect.height() - 10);
+ }
+ else
+ {
+ return TQRect(wrect.x() + 3, wrect.y() + 5, wrect.width() - 8, wrect.height() - 10);
+ }
+
+ break;
+ }
+
+ case SR_ComboBoxFocusRect:
+ {
+ return querySubControlMetrics( CC_ComboBox, ceData, elementFlags, SC_ComboBoxEditField, TQStyleOption::Default, widget );
+ }
+
+ case SR_CheckBoxFocusRect:
+ {
+ //Only checkbox, no label
+ if (ceData.text.isEmpty() && (ceData.fgPixmap.isNull()) )
+ {
+ TQRect bounding = ceData.rect;
+ TQSize checkDim = loader.size( keramik_checkbox_on);
+ int cw = checkDim.width();
+ int ch = checkDim.height();
+
+ TQRect checkbox(bounding.x() + 1, bounding.y() + 1 + (bounding.height() - ch)/2,
+ cw - 3, ch - 4);
+
+ return checkbox;
+ }
+
+ //Fallthrough intentional
+ }
+
+ default:
+ return TDEStyle::subRect( r, ceData, elementFlags, widget );
+ }
+}
+
+
+TQPixmap KeramikStyle::stylePixmap(StylePixmap stylepixmap,
+ const TQStyleControlElementData &ceData,
+ ControlElementFlags elementFlags,
+ const TQStyleOption& opt,
+ const TQWidget* widget) const
+{
+ switch (stylepixmap) {
+ case SP_TitleBarMinButton:
+ return Keramik::PixmapLoader::the().pixmap(keramik_title_iconify,
+ Qt::black, Qt::black, false, false);
+ //return qpixmap_from_bits( iconify_bits, "title-iconify.png" );
+ case SP_TitleBarMaxButton:
+ return Keramik::PixmapLoader::the().pixmap(keramik_title_maximize,
+ Qt::black, Qt::black, false, false);
+ case SP_TitleBarCloseButton:
+ if (widget && widget->inherits("KDockWidgetHeader"))
+ return Keramik::PixmapLoader::the().pixmap(keramik_title_close_tiny,
+ Qt::black, Qt::black, false, false);
+ else return Keramik::PixmapLoader::the().pixmap(keramik_title_close,
+ Qt::black, Qt::black, false, false);
+ case SP_TitleBarNormalButton:
+ return Keramik::PixmapLoader::the().pixmap(keramik_title_restore,
+ Qt::black, Qt::black, false, false);
+ default:
+ break;
+ }
+
+ return TDEStyle::stylePixmap(stylepixmap, ceData, elementFlags, opt, widget);
+}
+
+
+
+
+KeramikStyle::KeramikStyle()
+ :TDEStyle( AllowMenuTransparency | FilledFrameWorkaround, ThreeButtonScrollBar ),
+ maskMode(false), formMode(false),
+ toolbarBlendWidget(0), titleBarMode(None), flatMode(false), customScrollMode(false), kickerMode(false)
+{
+ forceSmallMode = false;
+
+ TQSettings settings;
+
+ highlightScrollBar = settings.readBoolEntry("/keramik/Settings/highlightScrollBar", true);
+ animateProgressBar = settings.readBoolEntry("/keramik/Settings/animateProgressBar", false);
+
+ if (animateProgressBar)
+ {
+ animationTimer = new TQTimer( this );
+ connect( animationTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(updateProgressPos()) );
+ }
+
+ firstComboPopupRelease = false;
+}
+
+void KeramikStyle::updateProgressPos()
+{
+ //Update the registered progressbars.
+ TQMap<TQProgressBar*, int>::iterator iter;
+ bool visible = false;
+ for (iter = progAnimWidgets.begin(); iter != progAnimWidgets.end(); ++iter)
+ {
+ TQProgressBar* pbar = iter.key();
+ if (pbar->isVisible() && pbar->isEnabled() &&
+ pbar->progress() != pbar->totalSteps())
+ {
+ ++iter.data();
+ if (iter.data() == 28)
+ iter.data() = 0;
+ iter.key()->update();
+ }
+ if (iter.key()->isVisible())
+ visible = true;
+
+ }
+ if (!visible)
+ animationTimer->stop();
+}
+
+KeramikStyle::~KeramikStyle()
+{
+ Keramik::PixmapLoader::release();
+ Keramik::GradientPainter::releaseCache();
+ KeramikDbCleanup();
+}
+
+void KeramikStyle::applicationPolish(const TQStyleControlElementData &ceData, ControlElementFlags, void *ptr)
+{
+ if (ceData.widgetObjectTypes.contains(TQAPPLICATION_OBJECT_NAME_STRING)) {
+ TQApplication *app = reinterpret_cast<TQApplication*>(ptr);
+ if (!qstrcmp(app->argv()[0], "kicker")) {
+ kickerMode = true;
+ }
+ }
+}
+
+void KeramikStyle::polish(const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void *ptr)
+{
+ if (ceData.widgetObjectTypes.contains(TQWIDGET_OBJECT_NAME_STRING)) {
+ TQWidget *widget = reinterpret_cast<TQWidget*>(ptr);
+
+ // Put in order of highest occurrence to maximise hit rate
+ if ( widget->inherits( TQPUSHBUTTON_OBJECT_NAME_STRING ) || widget->inherits( TQCOMBOBOX_OBJECT_NAME_STRING ) || widget->inherits(TQTOOLBUTTON_OBJECT_NAME_STRING) )
+ {
+ installObjectEventHandler(ceData, elementFlags, ptr, this);
+ if ( widget->inherits( TQCOMBOBOX_OBJECT_NAME_STRING ) )
+ widget->setBackgroundMode( NoBackground );
+ }
+ else if ( widget->inherits( TQMENUBAR_OBJECT_NAME_STRING ) || widget->inherits( TQPOPUPMENU_OBJECT_NAME_STRING ) )
+ widget->setBackgroundMode( NoBackground );
+
+ else if ( widget->parentWidget() &&
+ ( ( widget->inherits( TQLISTBOX_OBJECT_NAME_STRING ) && widget->parentWidget()->inherits( TQCOMBOBOX_OBJECT_NAME_STRING ) ) ||
+ widget->inherits( "TDECompletionBox" ) ) ) {
+ TQListBox* listbox = (TQListBox*) widget;
+ listbox->setLineWidth( 4 );
+ listbox->setBackgroundMode( NoBackground );
+ installObjectEventHandler(ceData, elementFlags, ptr, this);
+
+ } else if (widget->inherits("QToolBarExtensionWidget")) {
+ installObjectEventHandler(ceData, elementFlags, ptr, this);
+ //widget->setBackgroundMode( NoBackground );
+ }
+ else if ( !qstrcmp( widget->name(), kdeToolbarWidget ) ) {
+ widget->setBackgroundMode( NoBackground );
+ installObjectEventHandler(ceData, elementFlags, ptr, this);
+ }
+
+ if (animateProgressBar && ::tqqt_cast<TQProgressBar*>(widget))
+ {
+ installObjectEventHandler(ceData, elementFlags, ptr, this);
+ progAnimWidgets[static_cast<TQProgressBar*>(widget)] = 0;
+ connect(widget, TQT_SIGNAL(destroyed(TQObject*)), this, TQT_SLOT(progressBarDestroyed(TQObject*)));
+ if (!animationTimer->isActive())
+ animationTimer->start( 50, false );
+ }
+ }
+
+ TDEStyle::polish(ceData, elementFlags, ptr);
+}
+
+void KeramikStyle::unPolish(const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void *ptr)
+{
+ if (ceData.widgetObjectTypes.contains(TQWIDGET_OBJECT_NAME_STRING)) {
+ TQWidget *widget = reinterpret_cast<TQWidget*>(ptr);
+
+ //### TODO: This needs major cleanup (and so does polish() )
+ if ( widget->inherits( TQPUSHBUTTON_OBJECT_NAME_STRING ) || widget->inherits( TQCOMBOBOX_OBJECT_NAME_STRING ) )
+ {
+ if ( widget->inherits( TQCOMBOBOX_OBJECT_NAME_STRING ) )
+ widget->setBackgroundMode( PaletteButton );
+ removeObjectEventHandler(ceData, elementFlags, ptr, this);
+ }
+ else if ( widget->inherits( TQMENUBAR_OBJECT_NAME_STRING ) || widget->inherits( TQPOPUPMENU_OBJECT_NAME_STRING ) )
+ widget->setBackgroundMode( PaletteBackground );
+
+ else if ( widget->parentWidget() &&
+ ( ( widget->inherits( TQLISTBOX_OBJECT_NAME_STRING ) && widget->parentWidget()->inherits( TQCOMBOBOX_OBJECT_NAME_STRING ) ) ||
+ widget->inherits( "TDECompletionBox" ) ) ) {
+ TQListBox* listbox = (TQListBox*) widget;
+ listbox->setLineWidth( 1 );
+ listbox->setBackgroundMode( PaletteBackground );
+ removeObjectEventHandler(ceData, elementFlags, ptr, this);
+ widget->clearMask();
+ } else if (widget->inherits("QToolBarExtensionWidget")) {
+ removeObjectEventHandler(ceData, elementFlags, ptr, this);
+ }
+ else if ( !qstrcmp( widget->name(), kdeToolbarWidget ) ) {
+ widget->setBackgroundMode( PaletteBackground );
+ removeObjectEventHandler(ceData, elementFlags, ptr, this);
+ }
+ else if ( ::tqqt_cast<TQProgressBar*>(widget) )
+ {
+ progAnimWidgets.remove(static_cast<TQProgressBar*>(widget));
+ }
+ }
+
+ TDEStyle::unPolish(ceData, elementFlags, ptr);
+}
+
+void KeramikStyle::progressBarDestroyed(TQObject* obj)
+{
+ progAnimWidgets.remove(static_cast<TQProgressBar*>(TQT_TQWIDGET(obj)));
+}
+
+
+void KeramikStyle::polish( TQPalette& )
+{
+ loader.clear();
+}
+
+/**
+ Draws gradient background for toolbar buttons, handles and spacers
+*/
+static void renderToolbarEntryBackground(TQPainter* paint,
+ const TQToolBar* parent, TQRect r, const TQColorGroup& cg, bool horiz)
+{
+ int toolWidth, toolHeight;
+
+ //Do we have a parent toolbar to use?
+ if (parent)
+ {
+ //Calculate the toolbar geometry.
+ //The initial guess is the size of the parent widget
+ toolWidth = parent->width();
+ toolHeight = parent->height();
+
+ //If we're floating, however, wee need to fiddle
+ //with height to skip the titlebar
+ if (parent->place() == TQDockWindow::OutsideDock)
+ {
+ toolHeight = toolHeight - titleBarH - 2*parent->frameWidth() + 2;
+ //2 at the end = the 2 pixels of border of a "regular"
+ //toolbar we normally paint over.
+ }
+ }
+ else
+ {
+ //No info, make a guess.
+ //We take the advantage of the fact that the non-major
+ //sizing direction parameter is ignored
+ toolWidth = r.width () + 2;
+ toolHeight = r.height() + 2;
+ }
+
+ //Calculate where inside the toolbar we're
+ int xoff = 0, yoff = 0;
+ if (horiz)
+ yoff = (toolHeight - r.height())/2;
+ else
+ xoff = (toolWidth - r.width())/2;
+
+ Keramik::GradientPainter::renderGradient( paint, r, cg.button(),
+ horiz, false /*Not a menubar*/,
+ xoff, yoff,
+ toolWidth, toolHeight);
+}
+
+static void renderToolbarWidgetBackground(TQPainter* painter, const TQStyleControlElementData &ceData, const TQStyle::ControlElementFlags elementFlags, const TQWidget* widget)
+{
+ // Draw a gradient background for custom widgets in the toolbar
+ // that have specified a "kde toolbar widget" name, or
+ // are caught as toolbar widgets otherwise
+
+ // Find the top-level toolbar of this widget, since it may be nested in other
+ // widgets that are on the toolbar.
+ TQWidget *parent = (widget)?TQT_TQWIDGET(widget->parentWidget()):(TQWidget*)NULL;
+ int x_offset = ceData.rect.x(), y_offset = ceData.rect.y();
+ while (parent && parent->parent() && !qstrcmp( parent->name(), kdeToolbarWidget ) )
+ {
+ x_offset += parent->x();
+ y_offset += parent->y();
+ parent = TQT_TQWIDGET(parent->parent());
+ }
+
+ TQRect pr = ceData.parentWidgetData.rect;
+ bool horiz_grad = pr.width() > pr.height();
+
+ int toolHeight = ceData.parentWidgetData.rect.height();
+ int toolWidth = ceData.parentWidgetData.rect.width ();
+
+ // Check if the parent is a QToolbar, and use its orientation, else guess.
+ //Also, get the height to use in the gradient from it.
+ TQToolBar* tb = dynamic_cast<TQToolBar*>(parent);
+ if (tb)
+ {
+ horiz_grad = ceData.orientation == TQt::Horizontal;
+
+ //If floating, we need to skip the titlebar.
+ if (tb->place() == TQDockWindow::OutsideDock)
+ {
+ toolHeight = tb->height() - titleBarH - 2*tb->frameWidth() + 2;
+ //Calculate offset here by looking at the bottom edge difference, and height.
+ //First, calculate by how much the widget needs to be extended to touch
+ //the bottom edge, minus the frame (except we use the current y_offset
+ // to map to parent coordinates)
+ int needToTouchBottom = tb->height() - tb->frameWidth() -
+ (ceData.rect.bottom() + y_offset);
+
+ //Now, with that, we can see which portion to skip in the full-height
+ //gradient -- which is the stuff other than the extended
+ //widget
+ y_offset = toolHeight - (ceData.rect.height() + needToTouchBottom) - 1;
+ }
+ }
+
+ if (painter)
+ {
+ Keramik::GradientPainter::renderGradient( painter, ceData.rect,
+ ceData.colorGroup.button(), horiz_grad, false,
+ x_offset, y_offset, toolWidth, toolHeight);
+ }
+ else
+ {
+ TQPainter p( widget );
+ Keramik::GradientPainter::renderGradient( &p, ceData.rect,
+ ceData.colorGroup.button(), horiz_grad, false,
+ x_offset, y_offset, toolWidth, toolHeight);
+ }
+}
+
+// This function draws primitive elements as well as their masks.
+void KeramikStyle::drawPrimitive( TQ_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 active = flags & Style_Active;
+ bool disabled = ( flags & Style_Enabled ) == 0;
+ int x, y, w, h;
+ r.rect(&x, &y, &w, &h);
+
+ int x2 = x+w-1;
+ int y2 = y+h-1;
+
+ switch(pe)
+ {
+ // BUTTONS
+ // -------------------------------------------------------------------
+ case PE_ButtonDefault:
+ {
+ bool sunken = on || down;
+
+ int id;
+ if ( sunken ) id = keramik_pushbutton_default_pressed;
+ else id = keramik_pushbutton_default;
+
+ if (flags & Style_MouseOver && id == keramik_pushbutton_default )
+ id = keramik_pushbutton_default_hov;
+
+
+ //p->fillRect( r, cg.background() );
+ Keramik::RectTilePainter( id, false ).draw(p, r, cg.button(), cg.background(), disabled, pmode() );
+ break;
+ }
+
+ case PE_ButtonDropDown:
+ case PE_ButtonTool:
+ {
+ if (titleBarMode)
+ {
+ TQRect nr;
+ if (titleBarMode == Maximized)
+ {
+ //### What should we draw at sides?
+ nr = TQRect(r.x(), r.y(), r.width()-1, r.height() );
+ }
+ else
+ {
+ int offX = (r.width() - 15)/2;
+ int offY = (r.height() - 15)/2;
+
+ if (flags & Style_Down)
+ offY += 1;
+
+ nr = TQRect(r.x()+offX, r.y()+offY, 15, 15);
+ }
+
+ Keramik::ScaledPainter(flags & Style_Down ? keramik_titlebutton_pressed : keramik_titlebutton,
+ Keramik::ScaledPainter::Both).draw( p, nr, cg.button(), cg.background());
+ return;
+ }
+
+ if (on)
+ {
+ Keramik::RectTilePainter(keramik_toolbar_clk).draw(p, r, cg.button(), cg.background());
+ p->setPen(cg.dark());
+ p->drawLine(x, y, x2, y);
+ p->drawLine(x, y, x, y2);
+ }
+ else if (down)
+ {
+ Keramik::RectTilePainter(keramik_toolbar_clk).draw(p, r, cg.button(), cg.background());
+ }
+ else {
+ if (flags & Style_MouseOver)
+ {
+ Keramik::GradientPainter::renderGradient( p,
+ TQRect(r.x(), 0, r.width(), r.height()),
+ Keramik::ColorUtil::lighten(cg.button(), 115), flags & Style_Horizontal, false );
+ }
+ else
+ Keramik::GradientPainter::renderGradient( p,
+ TQRect(r.x(), 0, r.width(), r.height()),
+ cg.button(), flags & Style_Horizontal, false );
+
+ p->setPen(cg.button().light(70));
+ p->drawLine(x, y, x2-1, y);
+ p->drawLine(x, y, x, y2-1);
+ p->drawLine(x+2, y2-1, x2-1, y2-1);
+ p->drawLine(x2-1, y+2, x2-1, y2-2);
+
+ p->setPen(Keramik::ColorUtil::lighten(cg.button(), 115) );
+ p->drawLine(x+1, y+1, x2-1, y+1);
+ p->drawLine(x+1, y+1, x+1, y2);
+ p->drawLine(x, y2, x2, y2);
+ p->drawLine(x2, y, x2, y2);
+ }
+
+ break;
+ }
+
+ // PUSH BUTTON
+ // -------------------------------------------------------------------
+ case PE_ButtonCommand:
+ {
+ bool sunken = on || down;
+
+ int name;
+
+ if ( w <= smallButMaxW || h <= smallButMaxH || forceSmallMode)
+ {
+ if (sunken)
+ name = keramik_pushbutton_small_pressed;
+ else
+ name = keramik_pushbutton_small;
+ forceSmallMode = false;
+ }
+ else
+ {
+ if (sunken)
+ name = keramik_pushbutton_pressed;
+ else
+ name = keramik_pushbutton;
+ }
+
+ if (flags & Style_MouseOver && name == keramik_pushbutton )
+ name = keramik_pushbutton_hov;
+
+ if (toolbarBlendWidget && !flatMode )
+ {
+ //Render the toolbar gradient.
+ renderToolbarWidgetBackground(p, ceData, elementFlags, toolbarBlendWidget);
+
+ //Draw and blend the actual bevel..
+ Keramik::RectTilePainter( name, false ).draw(p, r, cg.button(), cg.background(),
+ disabled, Keramik::TilePainter::PaintFullBlend );
+ }
+ else if (!flatMode)
+ Keramik::RectTilePainter( name, false ).draw(p, r, cg.button(), cg.background(), disabled, pmode() );
+ else {
+ Keramik::ScaledPainter( name + KeramikTileCC, Keramik::ScaledPainter::Vertical).draw(
+ p, r, cg.button(), cg.background(), disabled, pmode() );
+
+ p->setPen(cg.button().light(75));
+
+ p->drawLine(x, y, x2, y);
+ p->drawLine(x, y, x, y2);
+ p->drawLine(x, y2, x2, y2);
+ p->drawLine(x2, y, x2, y2);
+ flatMode = false;
+ }
+
+ break;
+
+ }
+
+ // BEVELS
+ // -------------------------------------------------------------------
+ case PE_ButtonBevel:
+ {
+ int x,y,w,h;
+ r.rect(&x, &y, &w, &h);
+ bool sunken = on || down;
+ int x2 = x+w-1;
+ int y2 = y+h-1;
+
+ // Outer frame
+ p->setPen(cg.shadow());
+ p->drawRect(r);
+
+ // Bevel
+ p->setPen(sunken ? cg.mid() : cg.light());
+ p->drawLine(x+1, y+1, x2-1, y+1);
+ p->drawLine(x+1, y+1, x+1, y2-1);
+ p->setPen(sunken ? cg.light() : cg.mid());
+ p->drawLine(x+2, y2-1, x2-1, y2-1);
+ p->drawLine(x2-1, y+2, x2-1, y2-1);
+
+ if (w > 4 && h > 4)
+ {
+ if (sunken)
+ p->fillRect(x+2, y+2, w-4, h-4, cg.button());
+ else
+ Keramik::GradientPainter::renderGradient( p, TQRect(x+2, y+2, w-4, h-4),
+ cg.button(), flags & Style_Horizontal );
+ }
+ break;
+ }
+
+
+ // FOCUS RECT
+ // -------------------------------------------------------------------
+ case PE_FocusRect:
+ //Qt may pass the background color to use for the focus indicator
+ //here. This particularly happens within the iconview.
+ //If that happens, pass it on to drawWinFocusRect() so it can
+ //honor it
+ if ( opt.isDefault() )
+ p->drawWinFocusRect( r );
+ else
+ p->drawWinFocusRect( r, opt.color() );
+ break;
+
+ // HEADER SECTION
+ // -------------------------------------------------------------------
+ case PE_HeaderSectionMenu:
+ case PE_HeaderSection:
+ if ( flags & Style_Down )
+ Keramik::RectTilePainter( keramik_listview_pressed, false ).draw( p, r, cg.button(), cg.background() );
+ else
+ Keramik::RectTilePainter( keramik_listview, false ).draw( p, r, cg.button(), cg.background() );
+ break;
+
+ case PE_HeaderArrow:
+ if ( flags & Style_Up )
+ drawPrimitive( PE_ArrowUp, p, ceData, elementFlags, r, cg, Style_Enabled );
+ else drawPrimitive( PE_ArrowDown, p, ceData, elementFlags, r, cg, Style_Enabled );
+ break;
+
+
+ // // SCROLLBAR
+ // -------------------------------------------------------------------
+
+ case PE_ScrollBarSlider:
+ {
+ bool horizontal = flags & Style_Horizontal;
+ bool active = ( flags & Style_Active ) || ( flags & Style_Down );
+ int name = KeramikSlider1;
+ unsigned int count = 3;
+
+
+
+ if ( horizontal )
+ {
+ if ( w > ( loader.size( keramik_scrollbar_hbar+KeramikSlider1 ).width() +
+ loader.size( keramik_scrollbar_hbar+KeramikSlider4 ).width() +
+ loader.size( keramik_scrollbar_hbar+KeramikSlider3 ).width() + 2 ) )
+ count = 5;
+ }
+ else if ( h > ( loader.size( keramik_scrollbar_vbar+KeramikSlider1 ).height() +
+ loader.size( keramik_scrollbar_vbar+KeramikSlider4 ).height() +
+ loader.size( keramik_scrollbar_vbar+KeramikSlider3 ).height() + 2 ) )
+ count = 5;
+
+ TQColor col = cg.highlight();
+
+ if (customScrollMode || !highlightScrollBar)
+ col = cg.button();
+
+ if (!active)
+ Keramik::ScrollBarPainter( name, count, horizontal ).draw( p, r, col, cg.background(), false, pmode() );
+ else
+ Keramik::ScrollBarPainter( name, count, horizontal ).draw( p, r, Keramik::ColorUtil::lighten(col ,110),
+ cg.background(), false, pmode() );
+ break;
+ }
+
+ case PE_ScrollBarAddLine:
+ {
+ bool down = flags & Style_Down;
+
+ if ( flags & Style_Horizontal )
+ {
+ Keramik::CenteredPainter painter( keramik_scrollbar_hbar_arrow2 );
+ painter.draw( p, r, down? cg.buttonText() : cg.button(), cg.background(), disabled, pmode() );
+
+ p->setPen( cg.buttonText() );
+ p->drawLine(r.x()+r.width()/2 - 1, r.y() + r.height()/2 - 3,
+ r.x()+r.width()/2 - 1, r.y() + r.height()/2 + 3);
+
+
+ drawKeramikArrow(p, cg, TQRect(r.x(), r.y(), r.width()/2, r.height()), PE_ArrowLeft, down, !disabled);
+
+ drawKeramikArrow(p, cg, TQRect(r.x()+r.width()/2, r.y(), r.width() - r.width()/2, r.height()),
+ PE_ArrowRight, down, !disabled);
+ }
+ else
+ {
+ Keramik::CenteredPainter painter( keramik_scrollbar_vbar_arrow2 );
+ painter.draw( p, r, down? cg.buttonText() : cg.button(), cg.background(), disabled, pmode() );
+
+ p->setPen( cg.buttonText() );
+ p->drawLine(r.x()+r.width()/2 - 4, r.y()+r.height()/2,
+ r.x()+r.width()/2 + 2, r.y()+r.height()/2);
+
+
+ drawKeramikArrow(p, cg, TQRect(r.x(), r.y(), r.width(), r.height()/2), PE_ArrowUp, down, !disabled);
+
+ drawKeramikArrow(p, cg, TQRect(r.x(), r.y()+r.height()/2, r.width(), r.height() - r.height()/2),
+ PE_ArrowDown, down, !disabled);
+ //drawKeramikArrow(p, cg, r, PE_ArrowUp, down, !disabled);
+ }
+
+
+ break;
+ }
+
+ case PE_ScrollBarSubLine:
+ {
+ bool down = flags & Style_Down;
+
+ if ( flags & Style_Horizontal )
+ {
+ Keramik::CenteredPainter painter(keramik_scrollbar_hbar_arrow1 );
+ painter.draw( p, r, down? cg.buttonText() : cg.button(), cg.background(), disabled, pmode() );
+ drawKeramikArrow(p, cg, r, PE_ArrowLeft, down, !disabled);
+
+ }
+ else
+ {
+ Keramik::CenteredPainter painter( keramik_scrollbar_vbar_arrow1 );
+ painter.draw( p, r, down? cg.buttonText() : cg.button(), cg.background(), disabled, pmode() );
+ drawKeramikArrow(p, cg, r, PE_ArrowUp, down, !disabled);
+ }
+ break;
+ }
+
+ // CHECKBOX (indicator)
+ // -------------------------------------------------------------------
+ case PE_Indicator:
+ case PE_IndicatorMask:
+
+ if (flags & Style_On)
+ Keramik::ScaledPainter( keramik_checkbox_on ).draw( p, r, cg.button(), cg.background(), disabled, pmode() );
+ else if (flags & Style_Off)
+ Keramik::ScaledPainter( keramik_checkbox_off ).draw( p, r, cg.button(), cg.background(), disabled, pmode() );
+ else
+ Keramik::ScaledPainter( keramik_checkbox_tri ).draw( p, r, cg.button(), cg.background(), disabled, pmode() );
+
+ break;
+
+ // RADIOBUTTON (exclusive indicator)
+ // -------------------------------------------------------------------
+ case PE_ExclusiveIndicator:
+ case PE_ExclusiveIndicatorMask:
+ {
+
+ Keramik::ScaledPainter( on ? keramik_radiobutton_on : keramik_radiobutton_off ).draw( p, r, cg.button(), cg.background(), disabled, pmode() );
+ break;
+ }
+
+ // line edit frame
+ case PE_PanelLineEdit:
+ {
+ if ( opt.isDefault() || opt.lineWidth() == 1 )
+ {
+ //1-pixel frames can not be simply clipped wider frames, as that would produce too little contrast on the lower border
+ p->setPen( cg.dark() );
+ p->drawLine( x, y, x + w - 1, y );
+ p->drawLine( x, y, x, y + h - 1 );
+
+ p->setPen( cg.light().dark( 110 ) );
+ p->drawLine( x + w - 1, y, x + w - 1, y + h - 1 );
+ p->drawLine( x, y + h - 1, x + w - 1, y + h - 1);
+ }
+ else
+ {
+ p->setPen( cg.dark() );
+ p->drawLine( x, y, x + w - 1, y );
+ p->drawLine( x, y, x, y + h - 1 );
+ p->setPen( cg.mid() );
+ p->drawLine( x + 1, y + 1, x + w - 1, y + 1 );
+ p->drawLine( x + 1, y + 1, x + 1, y + h - 1 );
+ p->setPen( cg.light() );
+ p->drawLine( x + w - 1, y, x + w - 1, y + h - 1 );
+ p->drawLine( x, y + h - 1, x + w - 1, y + h - 1);
+ p->setPen( cg.light().dark( 110 ) );
+ p->drawLine( x + w - 2, y + 1, x + w - 2, y + h - 2 );
+ p->drawLine( x + 1, y + h - 2, x + w - 2, y + h - 2);
+ }
+ break;
+ }
+
+ // SPLITTER/DOCKWINDOW HANDLES
+ // -------------------------------------------------------------------
+ case PE_DockWindowResizeHandle:
+ case PE_Splitter:
+ {
+ int x,y,w,h;
+ r.rect(&x, &y, &w, &h);
+ int x2 = x+w-1;
+ int y2 = y+h-1;
+
+ p->setPen(cg.dark());
+ p->drawRect( r );
+ p->setPen(cg.background());
+ p->drawPoint(x, y);
+ p->drawPoint(x2, y);
+ p->drawPoint(x, y2);
+ p->drawPoint(x2, y2);
+ p->setPen(cg.light());
+ p->drawLine(x+1, y+1, x+1, y2-1);
+ p->drawLine(x+1, y+1, x2-1, y+1);
+ p->setPen(cg.midlight());
+ p->drawLine(x+2, y+2, x+2, y2-2);
+ p->drawLine(x+2, y+2, x2-2, y+2);
+ p->setPen(cg.mid());
+ p->drawLine(x2-1, y+1, x2-1, y2-1);
+ p->drawLine(x+1, y2-1, x2-1, y2-1);
+ p->fillRect(x+3, y+3, w-5, h-5, cg.brush(TQColorGroup::Background));
+ break;
+ }
+
+
+ //case PE_PanelPopup:
+ //p->setPen (cg.light() );
+ //p->setBrush( cg.background().light( 110 ) );
+ //p->drawRect( r );
+
+ //p->setPen( cg.shadow() );
+ //p->drawRect( r.x()+1, r.y()+1, r.width()-2, r.height()-2);
+ //p->fillRect( visualRect( TQRect( x + 1, y + 1, 23, h - 2 ), r ), cg.background().dark( 105 ) );
+ //break;
+
+ // GENERAL PANELS
+ // -------------------------------------------------------------------
+ case PE_Panel:
+ {
+ if (kickerMode)
+ {
+ if (p->device() && p->device()->devType() == TQInternal::Widget &&
+ TQCString(TQT_TQWIDGET(static_cast<TQPaintDevice*>(p->device()))->className()) == "FittsLawFrame" )
+ {
+ int x2 = x + r.width() - 1;
+ int y2 = y + r.height() - 1;
+ p->setPen(cg.dark());
+ p->drawLine(x+1,y2,x2-1,y2);
+ p->drawLine(x2,y+1,x2,y2);
+
+ p->setPen( cg.light() );
+ p->drawLine(x, y, x2, y);
+ p->drawLine(x, y, x, y2);
+
+
+ return;
+ }
+ }
+ TDEStyle::drawPrimitive(pe, p, ceData, elementFlags, r, cg, flags, opt);
+ break;
+ }
+ case PE_WindowFrame:
+ {
+ bool sunken = flags & Style_Sunken;
+ int lw = opt.isDefault() ? pixelMetric(PM_DefaultFrameWidth, ceData, elementFlags)
+ : opt.lineWidth();
+ if (lw == 2)
+ {
+ TQPen oldPen = p->pen();
+ int x,y,w,h;
+ r.rect(&x, &y, &w, &h);
+ int x2 = x+w-1;
+ int y2 = y+h-1;
+ p->setPen(sunken ? cg.light() : cg.dark());
+ p->drawLine(x, y2, x2, y2);
+ p->drawLine(x2, y, x2, y2);
+ p->setPen(sunken ? cg.mid() : cg.light());
+ p->drawLine(x, y, x2, y);
+ p->drawLine(x, y, x, y2);
+ p->setPen(sunken ? cg.midlight() : cg.mid());
+ p->drawLine(x+1, y2-1, x2-1, y2-1);
+ p->drawLine(x2-1, y+1, x2-1, y2-1);
+ p->setPen(sunken ? cg.dark() : cg.midlight());
+ p->drawLine(x+1, y+1, x2-1, y+1);
+ p->drawLine(x+1, y+1, x+1, y2-1);
+ p->setPen(oldPen);
+ } else
+ TDEStyle::drawPrimitive(pe, p, ceData, elementFlags, r, cg, flags, opt);
+
+ break;
+ }
+
+
+ // MENU / TOOLBAR PANEL
+ // -------------------------------------------------------------------
+ case PE_PanelMenuBar: // Menu
+ {
+ Keramik::GradientPainter::renderGradient( p, r, cg.button(), true, true);
+ //Keramik::ScaledPainter( keramik_menubar , Keramik::ScaledPainter::Vertical).draw( p, r, cg.button(), cg.background() );
+
+ int x2 = r.x()+r.width()-1;
+ int y2 = r.y()+r.height()-1;
+ int lw = opt.isDefault() ? pixelMetric(PM_DefaultFrameWidth, ceData, elementFlags)
+ : opt.lineWidth();
+ if (lw)
+ {
+ p->setPen(cg.mid());
+ p->drawLine(x2, y, x2, y2);
+ }
+
+ break;
+ }
+
+ case PE_PanelDockWindow: // Toolbar
+ {
+ bool horiz = r.width() > r.height();
+
+ //Here, we just draw the border.
+ int x = r.x();
+ int y = r.y();
+ int x2 = r.x() + r.width() - 1;
+ int y2 = r.y() + r.height() - 1;
+ int lw = opt.isDefault() ? pixelMetric(PM_DefaultFrameWidth, ceData, elementFlags)
+ : opt.lineWidth();
+
+ if (lw)
+ {
+ //Gradient border colors.
+ //(Same as in gradients.cpp)
+ TQColor gradTop = Keramik::ColorUtil::lighten(cg.button(),110);
+ TQColor gradBot = Keramik::ColorUtil::lighten(cg.button(),109);
+ if (horiz)
+ {
+ //Top line
+ p->setPen(gradTop);
+ p->drawLine(x, y, x2, y);
+
+ //Bottom line
+ p->setPen(gradBot);
+ p->drawLine(x, y2, x2, y2);
+
+ //Left line
+ Keramik::GradientPainter::renderGradient(
+ p, TQRect(r.x(), r.y(), 1, r.height()),
+ cg.button(), true);
+
+ //Right end-line
+ p->setPen(cg.mid());
+ p->drawLine(x2, y, x2, y2);
+ }
+ else
+ {
+ //Left line
+ p->setPen(gradTop);
+ p->drawLine(x, y, x, y2);
+
+ //Right line
+ p->setPen(gradBot);
+ p->drawLine(x2, y, x2, y2);
+
+ //Top line
+ Keramik::GradientPainter::renderGradient(
+ p, TQRect(r.x(), r.y(), r.width(), 1),
+ cg.button(), false);
+
+ //Bottom end-line
+ p->setPen(cg.mid());
+ p->drawLine(x, y2, x2, y2);
+ }
+ }
+ break;
+ }
+
+ // TOOLBAR SEPARATOR
+ // -------------------------------------------------------------------
+ case PE_DockWindowSeparator:
+ {
+ TQWidget* paintWidget = dynamic_cast<TQWidget*>(p->device());
+ TQToolBar* parent = 0;
+ if (paintWidget)
+ parent = ::tqqt_cast<TQToolBar*>(paintWidget->parentWidget());
+
+ renderToolbarEntryBackground(p, parent, r, cg, (flags & Style_Horizontal) );
+ if ( !(flags & Style_Horizontal) )
+ {
+ p->setPen(cg.mid());
+ p->drawLine(4, r.height()/2-1, r.width()-5, r.height()/2-1);
+ p->setPen(cg.light());
+ p->drawLine(4, r.height()/2, r.width()-5, r.height()/2);
+ }
+ else
+ {
+ p->setPen(cg.mid());
+ p->drawLine(r.width()/2-1, 4, r.width()/2-1, r.height()-5);
+ p->setPen(cg.light());
+ p->drawLine(r.width()/2, 4, r.width()/2, r.height()-5);
+ }
+ break;
+ }
+
+ case PE_PanelScrollBar:
+ {
+ Keramik::ScrollBarPainter( KeramikGroove1, 2, (ceData.orientation == TQt::Horizontal)?true:false ).draw( p, r, cg.button(), cg.background(), (( flags & Style_Enabled ) == 0)?true:false );
+ break;
+ }
+
+ case PE_MenuItemIndicatorFrame:
+ {
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+ int checkcol = styleHint(SH_MenuIndicatorColumnWidth, ceData, elementFlags, opt, NULL, NULL);
+ TQRect cr = visualRect( TQRect( x + 2, y + 2, checkcol - 1, h - 4 ), r );
+ qDrawShadePanel( p, cr.x(), cr.y(), cr.width(), cr.height(), cg, true, 1, &cg.brush(TQColorGroup::Midlight) );
+ }
+ break;
+ case PE_MenuItemIndicatorIconFrame:
+ {
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+ int checkcol = styleHint(SH_MenuIndicatorColumnWidth, ceData, elementFlags, opt, NULL, NULL);
+ TQRect cr = visualRect( TQRect( x + 2, y + 2, checkcol - 1, h - 4 ), r );
+ qDrawShadePanel( p, cr.x(), cr.y(), cr.width(), cr.height(), cg, true, 1, &cg.brush(TQColorGroup::Midlight) );
+ }
+ break;
+ case PE_MenuItemIndicatorCheck:
+ {
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+ int checkcol = styleHint(SH_MenuIndicatorColumnWidth, ceData, elementFlags, opt, NULL, NULL);
+ TQRect cr = visualRect( TQRect( x + 2, y + 2, checkcol - 1, h - 4 ), r );
+
+ SFlags cflags = Style_Default;
+ cflags |= active ? Style_Enabled : Style_On;
+
+ drawPrimitive( PE_CheckMark, p, ceData, elementFlags, cr, cg, cflags );
+ }
+ break;
+
+ default:
+ {
+ // ARROWS
+ // -------------------------------------------------------------------
+ if (pe >= PE_ArrowUp && pe <= PE_ArrowLeft)
+ {
+ TQPointArray a;
+
+ switch(pe)
+ {
+ case PE_ArrowUp:
+ a.setPoints(TQCOORDARRLEN(u_arrow), u_arrow);
+ break;
+
+ case PE_ArrowDown:
+ a.setPoints(TQCOORDARRLEN(d_arrow), d_arrow);
+ break;
+
+ case PE_ArrowLeft:
+ a.setPoints(TQCOORDARRLEN(l_arrow), l_arrow);
+ break;
+
+ default:
+ a.setPoints(TQCOORDARRLEN(r_arrow), r_arrow);
+ }
+
+ p->save();
+ if ( flags & Style_Down )
+ p->translate( pixelMetric( PM_ButtonShiftHorizontal, ceData, elementFlags ),
+ pixelMetric( PM_ButtonShiftVertical, ceData, elementFlags ) );
+
+ if ( flags & Style_Enabled )
+ {
+ a.translate( r.x() + r.width() / 2, r.y() + r.height() / 2 );
+ p->setPen( cg.buttonText() );
+ p->drawLineSegments( a );
+ }
+ else
+ {
+ a.translate( r.x() + r.width() / 2 + 1, r.y() + r.height() / 2 + 1 );
+ p->setPen( cg.light() );
+ p->drawLineSegments( a );
+ a.translate( -1, -1 );
+ p->setPen( cg.mid() );
+ p->drawLineSegments( a );
+ }
+ p->restore();
+
+ }
+ else
+ TDEStyle::drawPrimitive( pe, p, ceData, elementFlags, r, cg, flags, opt );
+ }
+ }
+}
+
+void KeramikStyle::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
+{
+ bool disabled = ( flags & Style_Enabled ) == 0;
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+
+ switch ( kpe )
+ {
+ // SLIDER GROOVE
+ // -------------------------------------------------------------------
+ case KPE_SliderGroove:
+ {
+ bool horizontal = ceData.orientation == TQt::Horizontal;
+
+ Keramik::TilePainter::PaintMode pmod = Keramik::TilePainter::PaintNormal;
+
+ if (!ceData.bgPixmap.isNull())
+ pmod = Keramik::TilePainter::PaintFullBlend;
+
+ if ( horizontal )
+ Keramik::RectTilePainter( keramik_slider_hgroove, false ).draw(p, r, cg.button(), cg.background(), disabled, pmod);
+ else
+ Keramik::RectTilePainter( keramik_slider_vgroove, true, false ).draw( p, r, cg.button(), cg.background(), disabled, pmod);
+
+ break;
+ }
+
+ // SLIDER HANDLE
+ // -------------------------------------------------------------------
+ case KPE_SliderHandle:
+ {
+ bool horizontal = ceData.orientation == TQt::Horizontal;
+
+ TQColor hl = cg.highlight();
+ if (!disabled && flags & Style_Active)
+ hl = Keramik::ColorUtil::lighten(cg.highlight(),110);
+
+ if (horizontal)
+ Keramik::ScaledPainter( keramik_slider ).draw( p, r, disabled ? cg.button() : hl,
+ Qt::black, disabled, Keramik::TilePainter::PaintFullBlend );
+ else
+ Keramik::ScaledPainter( keramik_vslider ).draw( p, r, disabled ? cg.button() : hl,
+ Qt::black, disabled, Keramik::TilePainter::PaintFullBlend );
+ break;
+ }
+
+ // TOOLBAR HANDLE
+ // -------------------------------------------------------------------
+ case KPE_ToolBarHandle: {
+ int x = r.x(); int y = r.y();
+ int x2 = r.x() + r.width()-1;
+ int y2 = r.y() + r.height()-1;
+
+ TQToolBar* parent = 0;
+
+ if (widget && widget->parent() && widget->parent()->inherits(TQTOOLBAR_OBJECT_NAME_STRING))
+ parent = static_cast<TQToolBar*>(TQT_TQWIDGET(widget->parent()));
+
+ renderToolbarEntryBackground(p, parent, r, cg, (flags & Style_Horizontal));
+ if (flags & Style_Horizontal) {
+ p->setPen(cg.light());
+ p->drawLine(x+1, y+4, x+1, y2-4);
+ p->drawLine(x+3, y+4, x+3, y2-4);
+ p->drawLine(x+5, y+4, x+5, y2-4);
+
+ p->setPen(cg.mid());
+ p->drawLine(x+2, y+4, x+2, y2-4);
+ p->drawLine(x+4, y+4, x+4, y2-4);
+ p->drawLine(x+6, y+4, x+6, y2-4);
+ } else {
+ p->setPen(cg.light());
+ p->drawLine(x+4, y+1, x2-4, y+1);
+ p->drawLine(x+4, y+3, x2-4, y+3);
+ p->drawLine(x+4, y+5, x2-4, y+5);
+
+ p->setPen(cg.mid());
+ p->drawLine(x+4, y+2, x2-4, y+2);
+ p->drawLine(x+4, y+4, x2-4, y+4);
+ p->drawLine(x+4, y+6, x2-4, y+6);
+
+ }
+ break;
+ }
+
+
+ // GENERAL/KICKER HANDLE
+ // -------------------------------------------------------------------
+ case KPE_GeneralHandle: {
+ int x = r.x(); int y = r.y();
+ int x2 = r.x() + r.width()-1;
+ int y2 = r.y() + r.height()-1;
+
+ if (flags & Style_Horizontal) {
+
+ p->setPen(cg.light());
+ p->drawLine(x+1, y, x+1, y2);
+ p->drawLine(x+3, y, x+3, y2);
+ p->drawLine(x+5, y, x+5, y2);
+
+ p->setPen(cg.mid());
+ p->drawLine(x+2, y, x+2, y2);
+ p->drawLine(x+4, y, x+4, y2);
+ p->drawLine(x+6, y, x+6, y2);
+
+ } else {
+
+ p->setPen(cg.light());
+ p->drawLine(x, y+1, x2, y+1);
+ p->drawLine(x, y+3, x2, y+3);
+ p->drawLine(x, y+5, x2, y+5);
+
+ p->setPen(cg.mid());
+ p->drawLine(x, y+2, x2, y+2);
+ p->drawLine(x, y+4, x2, y+4);
+ p->drawLine(x, y+6, x2, y+6);
+
+ }
+ break;
+ }
+
+
+ default:
+ TDEStyle::drawTDEStylePrimitive( kpe, p, ceData, elementFlags, r, cg, flags, opt, widget);
+ }
+}
+
+bool KeramikStyle::isFormWidget(const TQStyleControlElementData &ceData, const ControlElementFlags elementFlags, const TQWidget* widget) const
+{
+ if (widget) {
+ //Form widgets are in the TDEHTMLView, but that has 2 further inner levels
+ //of widgets - QClipperWidget, and outside of that, QViewportWidget
+ TQWidget* potentialClipPort = widget->parentWidget();
+ if ((ceData.parentWidgetData.widgetObjectTypes.isEmpty()) && (ceData.parentWidgetFlags & CEF_IsTopLevel)) {
+ return false;
+ }
+
+ TQWidget* potentialViewPort = potentialClipPort->parentWidget();
+ if (!potentialViewPort || potentialViewPort->isTopLevel() ||
+ qstrcmp(potentialViewPort->name(), "qt_viewport") )
+ return false;
+
+ TQWidget* potentialTDEHTML = potentialViewPort->parentWidget();
+ if (!potentialTDEHTML || potentialTDEHTML->isTopLevel() ||
+ qstrcmp(potentialTDEHTML->className(), "TDEHTMLView") )
+ return false;
+
+
+ return true;
+ }
+}
+
+void KeramikStyle::drawControl( TQ_ControlElement element,
+ TQPainter *p,
+ const TQStyleControlElementData &ceData,
+ ControlElementFlags elementFlags,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags flags,
+ const TQStyleOption& opt,
+ const TQWidget *widget ) const
+{
+ bool disabled = ( flags & Style_Enabled ) == 0;
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+
+ switch (element)
+ {
+ // PUSHBUTTON
+ // -------------------------------------------------------------------
+ case CE_PushButton:
+ {
+ const TQPushButton* btn = dynamic_cast< const TQPushButton* >( widget );
+
+ if (isFormWidget(ceData, elementFlags, btn))
+ formMode = true;
+
+ if ( elementFlags & CEF_IsFlat )
+ flatMode = true;
+
+ if ( (elementFlags & CEF_IsDefault) && !flatMode )
+ {
+ drawPrimitive( PE_ButtonDefault, p, ceData, elementFlags, r, cg, flags );
+ }
+ else
+ {
+ if (ceData.parentWidgetData.widgetObjectTypes.contains(TQTOOLBAR_OBJECT_NAME_STRING))
+ toolbarBlendWidget = widget;
+
+ drawPrimitive( PE_ButtonCommand, p, ceData, elementFlags, r, cg, flags );
+ toolbarBlendWidget = 0;
+ }
+
+ formMode = false;
+ break;
+ }
+
+
+ // PUSHBUTTON LABEL
+ // -------------------------------------------------------------------
+ case CE_PushButtonLabel:
+ {
+ const TQPushButton* button = dynamic_cast<const TQPushButton *>( widget );
+ bool active = ((elementFlags & CEF_IsOn) || (elementFlags & CEF_IsDown));
+ bool cornArrow = false;
+
+ // Shift button contents if pushed.
+ if ( active )
+ {
+ x += pixelMetric(PM_ButtonShiftHorizontal, ceData, elementFlags, widget);
+ y += pixelMetric(PM_ButtonShiftVertical, ceData, elementFlags, widget);
+ flags |= Style_Sunken;
+ }
+
+ // Does the button have a popup menu?
+ if (elementFlags & CEF_IsMenuWidget)
+ {
+ int dx = pixelMetric( PM_MenuButtonIndicator, ceData, elementFlags, widget );
+ if ( !ceData.iconSet.isNull() &&
+ (dx + ceData.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 + 2, dx, h - 4), r ),
+ cg, flags, opt );
+ w -= dx;
+ }
+ }
+
+ // Draw the icon if there is one
+ if ( !ceData.iconSet.isNull() )
+ {
+ TQIconSet::Mode mode = TQIconSet::Disabled;
+ TQIconSet::State state = TQIconSet::Off;
+
+ if (elementFlags & CEF_IsEnabled)
+ mode = (elementFlags & CEF_HasFocus) ? TQIconSet::Active : TQIconSet::Normal;
+ if ((elementFlags & CEF_BiState) && (elementFlags & CEF_IsOn))
+ state = TQIconSet::On;
+
+ TQPixmap icon = ceData.iconSet.pixmap( TQIconSet::Small, mode, state );
+
+ if (!ceData.text.isEmpty())
+ {
+ const int TextToIconMargin = 6;
+ //Center text + icon w/margin in between..
+
+ //Calculate length of both.
+ int length = icon.width() + TextToIconMargin
+ + p->fontMetrics().size(ShowPrefix, ceData.text).width();
+
+ //Calculate offset.
+ int offset = (w - length)/2;
+
+ //draw icon
+ p->drawPixmap( x + offset, y + h / 2 - icon.height() / 2, icon );
+
+ //new bounding rect for the text
+ x += offset + icon.width() + TextToIconMargin;
+ w = length - icon.width() - TextToIconMargin;
+ }
+ else
+ {
+ //Icon only. Center it.
+ if (ceData.fgPixmap.isNull())
+ p->drawPixmap( x + w/2 - icon.width()/2, y + h / 2 - icon.height() / 2,
+ icon );
+ else //icon + pixmap. Ugh.
+ p->drawPixmap( x + (elementFlags & CEF_IsDefault) ? 8 : 4 , y + h / 2 - icon.height() / 2, icon );
+ }
+
+ 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 );
+ }
+
+ // Make the label indicate if the button is a default button or not
+ drawItem( p, TQRect(x, y, w, h), AlignCenter | ShowPrefix, ceData.colorGroup,
+ (elementFlags & CEF_IsEnabled), (ceData.fgPixmap.isNull())?NULL:&ceData.fgPixmap, ceData.text, -1,
+ &ceData.colorGroup.buttonText() );
+
+ if ( flags & Style_HasFocus )
+ drawPrimitive( PE_FocusRect, p, ceData, elementFlags,
+ visualRect( subRect( SR_PushButtonFocusRect, ceData, elementFlags, widget ), ceData, elementFlags ),
+ cg, flags );
+ break;
+ }
+
+ case CE_ToolButtonLabel:
+ {
+ bool onToolbar = ceData.parentWidgetData.widgetObjectTypes.contains( TQTOOLBAR_OBJECT_NAME_STRING );
+ TQRect nr = r;
+
+ if (!onToolbar)
+ {
+ if (!qstrcmp(ceData.parentWidgetData.name.ascii(),"qt_maxcontrols" ) )
+ {
+ //Make sure we don't cut into the endline
+ if (!qstrcmp(ceData.name.ascii(), "close"))
+ {
+ nr.addCoords(0,0,-1,0);
+ p->setPen(cg.dark());
+ p->drawLine(r.x() + r.width() - 1, r.y(),
+ r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ }
+ }
+ //else if ( w > smallButMaxW && h > smallButMaxH )
+ // nr.setWidth(r.width()-2); //Account for shadow
+ }
+
+ TDEStyle::drawControl(element, p, ceData, elementFlags, nr, cg, flags, opt, widget);
+ break;
+ }
+
+ case CE_TabBarTab:
+ {
+ bool bottom = ceData.tabBarData.shape == TQTabBar::RoundedBelow ||
+ ceData.tabBarData.shape == TQTabBar::TriangularBelow;
+
+ if ( flags & Style_Selected )
+ {
+ TQRect tabRect = r;
+ //If not the right-most tab, readjust the painting to be one pixel wider
+ //to avoid a doubled line
+ int rightMost = TQApplication::reverseLayout() ? 0 : ceData.tabBarData.tabCount - 1;
+
+ if (ceData.tabBarData.identIndexMap[opt.tab()->identifier()] != rightMost)
+ tabRect.setWidth( tabRect.width() + 1);
+ Keramik::ActiveTabPainter( bottom ).draw( p, tabRect, cg.button().light(110), cg.background(), !(elementFlags & CEF_IsEnabled), pmode());
+ }
+ else
+ {
+ Keramik::InactiveTabPainter::Mode mode;
+ int index = ceData.tabBarData.identIndexMap[opt.tab()->identifier()];
+ if ( index == 0 ) mode = Keramik::InactiveTabPainter::First;
+ else if ( index == ceData.tabBarData.tabCount - 1 ) mode = Keramik::InactiveTabPainter::Last;
+ else mode = Keramik::InactiveTabPainter::Middle;
+
+ if ( bottom )
+ {
+ Keramik::InactiveTabPainter( mode, bottom ).draw( p, x, y, w, h - 3, cg.button(), cg.background(), disabled, pmode() );
+ p->setPen( cg.dark() );
+ p->drawLine( x, y, x + w, y );
+ }
+ else
+ {
+ Keramik::InactiveTabPainter( mode, bottom ).draw( p, x, y + 3, w, h - 3, cg.button(), cg.background(), disabled, pmode() );
+ p->setPen( cg.light() );
+ p->drawLine( x, y + h - 1, x + w, y + h - 1 );
+ }
+ }
+
+ break;
+ }
+
+ case CE_DockWindowEmptyArea:
+ {
+ TQRect pr = r;
+ if (ceData.widgetObjectTypes.contains(TQTOOLBAR_OBJECT_NAME_STRING))
+ {
+ const TQToolBar* tb = static_cast<const TQToolBar*>(widget);
+ if (tb->place() == TQDockWindow::OutsideDock)
+ {
+ //Readjust the paint rectangle to skip the titlebar
+ pr = TQRect(r.x(), titleBarH + tb->frameWidth(),
+ r.width(), tb->height() - titleBarH - 2 * tb->frameWidth() + 2);
+ //2 at the end = the 2 pixels of border of a "regular"
+ //toolbar we normally paint over.
+ }
+ Keramik::GradientPainter::renderGradient( p, pr, cg.button(),
+ tb->orientation() == Qt::Horizontal);
+ }
+ else
+ TDEStyle::drawControl( (TQ_ControlElement)CE_DockWindowEmptyArea, p, ceData, elementFlags,
+ r, cg, flags, opt, widget );
+ break;
+ }
+ case CE_MenuBarEmptyArea:
+ {
+ Keramik::GradientPainter::renderGradient( p, r, cg.button(), true, true);
+ break;
+ }
+ // MENUBAR ITEM (sunken panel on mouse over)
+ // -------------------------------------------------------------------
+ case CE_MenuBarItem:
+ {
+ TQMenuBar *mb = (TQMenuBar*)widget;
+ TQMenuItem *mi = opt.menuItem();
+ TQRect pr = mb->rect();
+
+ bool active = flags & Style_Active;
+ bool focused = flags & Style_HasFocus;
+
+ if ( active && focused )
+ qDrawShadePanel(p, r.x(), r.y(), r.width(), r.height(),
+ cg, true, 1, &cg.brush(TQColorGroup::Midlight));
+ else
+ Keramik::GradientPainter::renderGradient( p, pr, cg.button(), true, true);
+
+ drawItem( p, r, AlignCenter | AlignVCenter | ShowPrefix
+ | DontClip | SingleLine, cg, flags & Style_Enabled,
+ mi->pixmap(), mi->text() );
+
+ break;
+ }
+
+
+ // POPUPMENU ITEM
+ // -------------------------------------------------------------------
+ case CE_PopupMenuItem: {
+ TQRect main = r;
+
+ TQMenuItem *mi = opt.menuItem();
+
+ if ( !mi )
+ {
+ // Don't leave blank holes if we set NoBackground for the TQPopupMenu.
+ // This only happens when the popupMenu spans more than one column.
+ if (! ( !ceData.bgPixmap.isNull() ) )
+ p->fillRect( r, cg.background().light( 105 ) );
+
+ break;
+ }
+ int tab = opt.tabWidth();
+ int checkcol = opt.maxIconWidth();
+ bool enabled = mi->isEnabled();
+ bool checkable = (elementFlags & CEF_IsCheckable);
+ bool active = flags & Style_Active;
+ bool etchtext = styleHint( SH_EtchDisabledText, ceData, elementFlags );
+ bool reverse = TQApplication::reverseLayout();
+ if ( checkable )
+ checkcol = QMAX( checkcol, 20 );
+
+ // Draw the menu item background
+ if ( active )
+ {
+ if ( enabled )
+ Keramik::RowPainter( keramik_menuitem ).draw( p, main, cg.highlight(), cg.background() );
+ else {
+ if ( !ceData.bgPixmap.isNull() )
+ p->drawPixmap( main.topLeft(), ceData.bgPixmap, main );
+ else p->fillRect( main, cg.background().light( 105 ) );
+ p->drawWinFocusRect( r );
+ }
+ }
+ // Draw the transparency pixmap
+ else if ( !ceData.bgPixmap.isNull() )
+ p->drawPixmap( main.topLeft(), ceData.bgPixmap, main );
+ // Draw a solid background
+ else
+ p->fillRect( main, cg.background().light( 105 ) );
+ // Are we a menu item separator?
+
+ if ( mi->isSeparator() )
+ {
+ p->setPen( cg.mid() );
+ p->drawLine( main.x()+5, main.y() + 1, main.right()-5, main.y() + 1 );
+ p->setPen( cg.light() );
+ p->drawLine( main.x()+5, main.y() + 2, main.right()-5, main.y() + 2 );
+ break;
+ }
+
+ TQRect cr = visualRect( TQRect( x + 2, y + 2, checkcol - 1, h - 4 ), r );
+ // Do we have an icon?
+ if ( mi->iconSet() )
+ {
+ TQIconSet::Mode mode;
+
+
+
+ // Select the correct icon from the iconset
+ if ( active )
+ mode = enabled ? TQIconSet::Active : TQIconSet::Disabled;
+ else
+ mode = enabled ? TQIconSet::Normal : TQIconSet::Disabled;
+
+ // Do we have an icon and are checked at the same time?
+ // Then draw a "pressed" background behind the icon
+ if ( checkable && /*!active &&*/ mi->isChecked() )
+ drawPrimitive(PE_MenuItemIndicatorIconFrame, p, ceData, elementFlags, r, cg, flags, opt);
+ // Draw the icon
+ TQPixmap pixmap = mi->iconSet()->pixmap( TQIconSet::Small, mode );
+ TQRect pmr( 0, 0, pixmap.width(), pixmap.height() );
+ pmr.moveCenter( cr.center() );
+ p->drawPixmap( pmr.topLeft(), pixmap );
+ }
+
+ // Are we checked? (This time without an icon)
+ else if ( checkable && mi->isChecked() )
+ {
+ // We only have to draw the background if the menu item is inactive -
+ // if it's active the "pressed" background is already drawn
+ // if ( ! active )
+ drawPrimitive(PE_MenuItemIndicatorFrame, p, ceData, elementFlags, r, cg, flags, opt);
+ // Draw the checkmark
+ drawPrimitive(PE_MenuItemIndicatorCheck, p, ceData, elementFlags, r, cg, flags, opt);
+ }
+
+ // Time to draw the menu item label...
+ int xm = itemFrame + checkcol + itemHMargin; // X position margin
+
+ int xp = reverse ? // X position
+ x + tab + rightBorder + itemHMargin + itemFrame - 1 :
+ x + xm;
+
+ int offset = reverse ? -1 : 1; // Shadow offset for etched text
+
+ // Label width (minus the width of the accelerator portion)
+ int tw = w - 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 = itemVMargin;
+ // Save the painter state in case the custom
+ // paint method changes it in some way
+ p->save();
+
+ // Draw etched text if we're inactive and the menu item is disabled
+ if ( etchtext && !enabled && !active ) {
+ p->setPen( cg.light() );
+ mi->custom()->paint( p, cg, active, enabled, xp+offset, y+m+1, tw, h-2*m );
+ p->setPen( discol );
+ }
+ mi->custom()->paint( p, cg, active, enabled, xp, y+m, tw, h-2*m );
+ p->restore();
+ }
+ 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 = itemVMargin;
+ int text_flags = AlignVCenter | ShowPrefix | DontClip | SingleLine;
+ text_flags |= reverse ? AlignRight : AlignLeft;
+
+ //TQColor draw = cg.text();
+ TQColor draw = (active && enabled) ? cg.highlightedText () : cg.text();
+ p->setPen(draw);
+
+
+ // Does the menu item have a tabstop? (for the accelerator text)
+ if ( t >= 0 ) {
+ int tabx = reverse ? x + rightBorder + itemHMargin + itemFrame :
+ x + w - tab - rightBorder - itemHMargin - itemFrame;
+
+ // Draw the right part of the label (accelerator text)
+ if ( etchtext && !enabled ) {
+ // Draw etched text if we're inactive and the menu item is disabled
+ p->setPen( cg.light() );
+ p->drawText( tabx+offset, y+m+1, tab, h-2*m, text_flags, s.mid( t+1 ) );
+ p->setPen( discol );
+ }
+ p->drawText( tabx, y+m, tab, h-2*m, text_flags, s.mid( t+1 ) );
+ s = s.left( t );
+ }
+
+ // Draw the left part of the label (or the whole label
+ // if there's no accelerator)
+ if ( etchtext && !enabled ) {
+ // Etched text again for inactive disabled menu items...
+ p->setPen( cg.light() );
+ p->drawText( xp+offset, y+m+1, tw, h-2*m, text_flags, s, t );
+ p->setPen( discol );
+ }
+
+
+ p->drawText( xp, y+m, tw, h-2*m, text_flags, s, t );
+
+ 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( Qt::OpaqueMode );
+
+ int diffw = ( ( w - pixmap->width() ) / 2 )
+ + ( ( w - pixmap->width() ) % 2 );
+ p->drawPixmap( x+diffw, y+itemFrame, *pixmap );
+
+ if ( pixmap->depth() == 1 )
+ p->setBackgroundMode( Qt::TransparentMode );
+ }
+ }
+
+ // Does the menu item have a submenu?
+ if ( mi->popup() ) {
+ TQ_PrimitiveElement arrow = reverse ? PE_ArrowLeft : PE_ArrowRight;
+ int dim = pixelMetric(PM_MenuButtonIndicator, ceData, elementFlags) - itemFrame;
+ TQRect vr = visualRect( TQRect( x + w - arrowHMargin - itemFrame - dim,
+ y + h / 2 - dim / 2, dim, dim), r );
+
+ // Draw an arrow at the far end of the menu item
+ if ( active ) {
+ if ( enabled )
+ discol = cg.buttonText();
+
+ TQColorGroup g2( discol, cg.highlight(), white, white,
+ enabled ? white : discol, discol, white );
+
+ drawPrimitive( arrow, p, ceData, elementFlags, vr, g2, Style_Enabled );
+ } else
+ drawPrimitive( arrow, p, ceData, elementFlags, vr, cg,
+ enabled ? Style_Enabled : Style_Default );
+ }
+ break;
+ }
+ case CE_ProgressBarContents: {
+ TQRect cr = subRect(SR_ProgressBarContents, ceData, elementFlags, widget);
+ double progress = ceData.currentStep;
+ bool reverse = TQApplication::reverseLayout();
+ int steps = ceData.totalSteps;
+
+ if (!cr.isValid())
+ return;
+
+ // Draw progress bar
+ if (progress > 0 || steps == 0) {
+ double pg = (steps == 0) ? 0.1 : progress / steps;
+ int width = QMIN(cr.width(), (int)(pg * cr.width()));
+ if (steps == 0)
+ width = QMIN(width,20); //Don't cross squares
+
+ if (steps == 0) { //Busy indicator
+
+ if (width < 1) width = 1; //A busy indicator with width 0 is kind of useless
+
+ int remWidth = cr.width() - width; //Never disappear completely
+ if (remWidth <= 0) remWidth = 1; //Do something non-crashy when too small...
+
+ int pstep = int(progress) % ( 2 * remWidth );
+
+ if ( pstep > remWidth ) {
+ //Bounce about.. We're remWidth + some delta, we want to be remWidth - delta...
+ // - ( (remWidth + some delta) - 2* remWidth ) = - (some deleta - remWidth) = remWidth - some delta..
+ pstep = - (pstep - 2 * remWidth );
+ }
+
+ //Store the progress rect.
+ TQRect progressRect;
+ if (reverse)
+ progressRect = TQRect(cr.x() + cr.width() - width - pstep, cr.y(),
+ width, cr.height());
+ else
+ progressRect = TQRect(cr.x() + pstep, cr.y(), width, cr.height());
+
+ Keramik::RowPainter(keramik_progressbar).draw(p, progressRect,
+ cg.highlight(), cg.background() );
+ return;
+ }
+
+ TQRect progressRect;
+
+ if (reverse)
+ progressRect = TQRect(cr.x()+(cr.width()-width), cr.y(), width, cr.height());
+ else
+ progressRect = TQRect(cr.x(), cr.y(), width, cr.height());
+
+ //Apply the animation rectangle.
+ //////////////////////////////////////
+ if (animateProgressBar)
+ {
+ const TQProgressBar* pb = (const TQProgressBar*)widget;
+ int progAnimShift = progAnimWidgets[const_cast<TQProgressBar*>(pb)];
+ if (reverse)
+ {
+ //Here, we can't simply shift, as the painter code calculates everything based
+ //on the left corner, so we need to draw the 2 portions ourselves.
+
+ //Start off by checking the geometry of the end pixmap - it introduces a bit of an offset
+ TQSize endDim = loader.size(keramik_progressbar + 3); //3 = 3*1 + 0 = (1,0) = cl
+
+ //We might not have anything to animate at all, though, if the ender is the only thing to paint
+ if (endDim.width() < progressRect.width())
+ {
+ //OK, so we do have some stripes.
+ // Render the endline now - the clip region below will protect it from getting overwriten
+ TQPixmap endline = loader.scale(keramik_progressbar + 3, endDim.width(), progressRect.height(),
+ cg.highlight(), cg.background());
+ p->drawPixmap(progressRect.x(), progressRect.y(), endline);
+
+ //Now, calculate where the stripes should be, and set a clip region to that
+ progressRect.setLeft(progressRect.x() + endline.width());
+ p->setClipRect(progressRect, TQPainter::CoordPainter);
+
+ //Expand the paint region slightly to get the animation offset.
+ progressRect.setLeft(progressRect.x() - progAnimShift);
+
+ //Paint the stripes.
+ TQPixmap stripe = loader.scale(keramik_progressbar + 4, 28, progressRect.height(),
+ cg.highlight(), cg.background());
+ //4 = 3*1 + 1 = (1,1) = cc
+
+ p->drawTiledPixmap(progressRect, stripe);
+ //Exit out here to skip the regular paint path
+ return;
+ }
+ }
+ else
+ {
+ //Clip to the old rectangle
+ p->setClipRect(progressRect, TQPainter::CoordPainter);
+ //Expand the paint region
+ progressRect.setLeft(progressRect.x() - 28 + progAnimShift);
+ }
+ }
+
+ Keramik::ProgressBarPainter(keramik_progressbar, reverse).draw( p,
+ progressRect , cg.highlight(), cg.background());
+ }
+ break;
+ }
+
+
+ default:
+ TDEStyle::drawControl(element, p, ceData, elementFlags, r, cg, flags, opt, widget);
+ }
+}
+
+void KeramikStyle::drawControlMask( TQ_ControlElement element,
+ TQPainter *p,
+ const TQStyleControlElementData &ceData,
+ ControlElementFlags elementFlags,
+ const TQRect &r,
+ const TQStyleOption& opt,
+ const TQWidget *widget ) const
+{
+ p->fillRect(r, color1);
+ maskMode = true;
+ drawControl( element, p, ceData, elementFlags, r, TQApplication::palette().active(), TQStyle::Style_Default, opt, widget);
+ maskMode = false;
+}
+
+bool KeramikStyle::isSizeConstrainedCombo(const TQStyleControlElementData &ceData, const ControlElementFlags elementFlags, const TQComboBox* combo) const
+{
+ if (ceData.rect.width() >= 80)
+ return false;
+
+ if (combo) {
+ int suggestedWidth = combo->sizeHint().width();
+
+ if (ceData.rect.width() - suggestedWidth < -5)
+ return true;
+
+ return false;
+ }
+ else {
+ return true;
+ }
+}
+
+void KeramikStyle::drawComplexControl( TQ_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
+{
+ bool disabled = ( flags & Style_Enabled ) == 0;
+ switch(control)
+ {
+ // COMBOBOX
+ // -------------------------------------------------------------------
+ case CC_ComboBox:
+ {
+ bool toolbarMode = false;
+ const TQComboBox* cb = dynamic_cast< const TQComboBox* >( widget );
+ bool compact = isSizeConstrainedCombo(ceData, elementFlags, cb);
+
+ if (isFormWidget(ceData, elementFlags, cb))
+ formMode = true;
+
+ TQPixmap * buf = 0;
+ TQPainter* p2 = p;
+
+ TQRect br = r;
+
+ if (controls == SC_All)
+ {
+ //Double-buffer only when we are in the slower full-blend mode
+ if ( ceData.parentWidgetData.widgetObjectTypes.contains(TQTOOLBAR_OBJECT_NAME_STRING) || !qstrcmp(ceData.parentWidgetData.name.ascii(), kdeToolbarWidget) )
+ {
+ buf = new TQPixmap( r.width(), r.height() );
+ br.setX(0);
+ br.setY(0);
+ p2 = new TQPainter(buf);
+
+ //Ensure that we have clipping on, and have a sane base.
+ //If need be, Qt will shrink us to the paint region.
+ p->setClipRect(r);
+ toolbarMode = true;
+ }
+ }
+
+
+ if ( br.width() >= 28 && br.height() > 20 && !compact )
+ br.addCoords( 0, -2, 0, 0 );
+
+ //When in compact mode, we force the shadow-less bevel mode,
+ //but that also alters height and not just width.
+ //readjust height to fake the other metrics (plus clear
+ //the other areas, as appropriate). The automasker
+ //will take care of the overall shape.
+ if ( compact )
+ {
+ forceSmallMode = true;
+ br.setHeight( br.height() - 2);
+ p->fillRect ( r.x(), r.y() + br.height(), r.width(), 2, cg.background());
+ }
+
+
+ if ( controls & SC_ComboBoxFrame )
+ {
+ if (toolbarMode)
+ toolbarBlendWidget = widget;
+
+ drawPrimitive( PE_ButtonCommand, p2, ceData, elementFlags, br, cg, flags );
+
+ toolbarBlendWidget = 0;
+ }
+
+ // don't draw the focus rect etc. on the mask
+ if ( cg.button() == color1 && cg.background() == color0 )
+ break;
+
+ if ( controls & SC_ComboBoxArrow )
+ {
+ if ( active )
+ flags |= Style_On;
+
+ TQRect ar = querySubControlMetrics( CC_ComboBox, ceData, elementFlags,
+ SC_ComboBoxArrow, TQStyleOption::Default, widget );
+ if (!compact)
+ {
+ ar.setWidth(ar.width()-13);
+ TQRect rr = visualRect( TQRect( ar.x(), ar.y() + 4,
+ loader.size(keramik_ripple ).width(), ar.height() - 8 ),
+ ceData, elementFlags );
+
+ ar = visualRect( TQRect( ar.x() + loader.size( keramik_ripple ).width() + 4, ar.y(),
+ 11, ar.height() ),
+ ceData, elementFlags );
+
+ TQPointArray a;
+
+ a.setPoints(TQCOORDARRLEN(keramik_combo_arrow), keramik_combo_arrow);
+
+ a.translate( ar.x() + ar.width() / 2, ar.y() + ar.height() / 2 );
+ p2->setPen( cg.buttonText() );
+ p2->drawLineSegments( a );
+
+ Keramik::ScaledPainter( keramik_ripple ).draw( p2, rr, cg.button(), Qt::black, disabled, Keramik::TilePainter::PaintFullBlend );
+ }
+ else //Size-constrained combo -- loose the ripple.
+ {
+ ar.setWidth(ar.width() - 7);
+ ar = visualRect( TQRect( ar.x(), ar.y(), 11, ar.height() ), ceData, elementFlags);
+ TQPointArray a;
+
+ a.setPoints(TQCOORDARRLEN(keramik_combo_arrow), keramik_combo_arrow);
+
+ a.translate( ar.x() + ar.width() / 2, ar.y() + ar.height() / 2 );
+ p2->setPen( cg.buttonText() );
+ p2->drawLineSegments( a );
+ }
+ }
+
+ if ( controls & SC_ComboBoxEditField )
+ {
+ if ( elementFlags & CEF_IsEditable )
+ {
+ TQRect er = visualRect( querySubControlMetrics( CC_ComboBox, ceData, elementFlags, SC_ComboBoxEditField, TQStyleOption::Default, widget ), ceData, elementFlags );
+ er.addCoords( -2, -2, 2, 2 );
+ p2->fillRect( er, cg.base() );
+ drawPrimitive( PE_PanelLineEdit, p2, ceData, elementFlags, er, cg );
+ Keramik::RectTilePainter( keramik_frame_shadow, false, false, 2, 2 ).draw( p2, er, cg.button(),
+ Qt::black, false, pmodeFullBlend() );
+ }
+ else if ( elementFlags & CEF_HasFocus )
+ {
+ TQRect re = TQStyle::visualRect(subRect(SR_ComboBoxFocusRect, ceData, elementFlags, cb), ceData, elementFlags);
+ if ( compact )
+ re.addCoords( 3, 3, 0, -3 );
+ p2->fillRect( re, cg.brush( TQColorGroup::Highlight ) );
+ drawPrimitive( PE_FocusRect, p2, ceData, elementFlags, re, cg,
+ Style_FocusAtBorder, TQStyleOption( cg.highlight() ) );
+ }
+ // TQComboBox draws the text on its own and uses the painter's current colors
+ if ( elementFlags & CEF_HasFocus )
+ {
+ p->setPen( cg.highlightedText() );
+ p->setBackgroundColor( cg.highlight() );
+ }
+ else
+ {
+ p->setPen( cg.text() );
+ p->setBackgroundColor( cg.button() );
+ }
+ }
+
+ if (p2 != p)
+ {
+ p2->end();
+ delete p2;
+ p->drawPixmap(r.x(), r.y(), *buf);
+ delete buf;
+ }
+
+ formMode = false;
+ break;
+ }
+
+ case CC_SpinWidget:
+ {
+ const TQSpinWidget* sw = static_cast< const TQSpinWidget* >( widget );
+ TQRect br = visualRect( querySubControlMetrics( (TQ_ComplexControl)CC_SpinWidget, ceData, elementFlags, SC_SpinWidgetButtonField, TQStyleOption::Default, widget ), ceData, elementFlags );
+ if ( controls & SC_SpinWidgetButtonField )
+ {
+ Keramik::SpinBoxPainter().draw( p, br, cg.button(), cg.background(), !sw->isEnabled() );
+ if ( active & SC_SpinWidgetUp )
+ Keramik::CenteredPainter( keramik_spinbox_pressed_arrow_up ).draw( p, br.x(), br.y() + 3, br.width(), br.height() / 2, cg.button(), cg.background() );
+ else
+ Keramik::CenteredPainter( keramik_spinbox_arrow_up ).draw( p, br.x(), br.y() + 3, br.width(), br.height() / 2, cg.button(), cg.background(), !sw->isUpEnabled() );
+ if ( active & SC_SpinWidgetDown )
+ Keramik::CenteredPainter( keramik_spinbox_pressed_arrow_down ).draw( p, br.x(), br.y() + br.height() / 2 , br.width(), br.height() / 2 - 8, cg.button(), cg.background() );
+ else
+ Keramik::CenteredPainter( keramik_spinbox_arrow_down ).draw( p, br.x(), br.y() + br.height() / 2, br.width(), br.height() / 2 - 8, cg.background(), cg.button(), !sw->isDownEnabled() );
+ }
+
+ if ( controls & SC_SpinWidgetFrame )
+ drawPrimitive( PE_PanelLineEdit, p, ceData, elementFlags, r, cg );
+
+ break;
+ }
+ case CC_ScrollBar:
+ {
+ if (highlightScrollBar && (elementFlags & CEF_HasParentWidget)) //Don't do the check if not highlighting anyway
+ {
+ if (ceData.parentWidgetData.colorGroup.button() != ceData.colorGroup.button())
+ customScrollMode = true;
+ }
+ bool horizontal = ceData.orientation == TQt::Horizontal;
+ TQRect slider, subpage, addpage, subline, addline;
+ if ( ceData.minSteps == ceData.maxSteps ) flags &= ~Style_Enabled;
+
+ slider = querySubControlMetrics( control, ceData, elementFlags, SC_ScrollBarSlider, opt, widget );
+ subpage = querySubControlMetrics( control, ceData, elementFlags, SC_ScrollBarSubPage, opt, widget );
+ addpage = querySubControlMetrics( control, ceData, elementFlags, SC_ScrollBarAddPage, opt, widget );
+ subline = querySubControlMetrics( control, ceData, elementFlags, SC_ScrollBarSubLine, opt, widget );
+ addline = querySubControlMetrics( control, ceData, elementFlags, SC_ScrollBarAddLine, opt, widget );
+
+ if ( controls & SC_ScrollBarSubLine )
+ drawPrimitive( PE_ScrollBarSubLine, p, ceData, elementFlags, subline, cg,
+ flags | ( ( active & SC_ScrollBarSubLine ) ? Style_Down : 0 ) );
+
+ TQRegion clip;
+ if ( controls & SC_ScrollBarSubPage ) clip |= subpage;
+ if ( controls & SC_ScrollBarAddPage ) clip |= addpage;
+ if ( horizontal )
+ clip |= TQRect( slider.x(), 0, slider.width(), ceData.rect.height() );
+ else
+ clip |= TQRect( 0, slider.y(), ceData.rect.width(), slider.height() );
+ clip ^= slider;
+
+ p->setClipRegion( clip );
+ Keramik::ScrollBarPainter( KeramikGroove1, 2, horizontal ).draw( p, slider | subpage | addpage, cg.button(), cg.background(), disabled );
+
+ if ( controls & SC_ScrollBarSlider )
+ {
+ if ( horizontal )
+ p->setClipRect( slider.x(), slider.y(), addpage.right() - slider.x() + 1, slider.height() );
+ else
+ p->setClipRect( slider.x(), slider.y(), slider.width(), addpage.bottom() - slider.y() + 1 );
+ drawPrimitive( PE_ScrollBarSlider, p, ceData, elementFlags, slider, cg,
+ flags | ( ( active == SC_ScrollBarSlider ) ? Style_Down : 0 ) );
+ }
+ p->setClipping( false );
+
+ if ( controls & ( SC_ScrollBarSubLine | SC_ScrollBarAddLine ) )
+ {
+ drawPrimitive( PE_ScrollBarAddLine, p, ceData, elementFlags, addline, cg, flags );
+ if ( active & SC_ScrollBarSubLine )
+ {
+ if ( horizontal )
+ p->setClipRect( TQRect( addline.x(), addline.y(), addline.width() / 2, addline.height() ) );
+ else
+ p->setClipRect( TQRect( addline.x(), addline.y(), addline.width(), addline.height() / 2 ) );
+ drawPrimitive( PE_ScrollBarAddLine, p, ceData, elementFlags, addline, cg, flags | Style_Down );
+ }
+ else if ( active & SC_ScrollBarAddLine )
+ {
+ if ( horizontal )
+ p->setClipRect( TQRect( addline.x() + addline.width() / 2, addline.y(), addline.width() / 2, addline.height() ) );
+ else
+ p->setClipRect( TQRect( addline.x(), addline.y() + addline.height() / 2, addline.width(), addline.height() / 2 ) );
+ drawPrimitive( PE_ScrollBarAddLine, p, ceData, elementFlags, addline, cg, flags | Style_Down );
+ }
+ }
+
+ customScrollMode = false;
+
+
+ break;
+ }
+
+ // TOOLBUTTON
+ // -------------------------------------------------------------------
+ case CC_ToolButton: {
+ bool onToolbar = ceData.parentWidgetData.widgetObjectTypes.contains(TQTOOLBAR_OBJECT_NAME_STRING);
+ bool onExtender = !onToolbar &&
+ ceData.parentWidgetData.widgetObjectTypes.contains( "QToolBarExtensionWidget") &&
+ widget && widget->parentWidget()->parentWidget()->inherits( TQTOOLBAR_OBJECT_NAME_STRING );
+
+ bool onControlButtons = false;
+ if (!onToolbar && !onExtender && !ceData.parentWidgetData.widgetObjectTypes.isEmpty() &&
+ !qstrcmp(ceData.parentWidgetData.name.ascii(),"qt_maxcontrols" ) )
+ {
+ onControlButtons = true;
+ titleBarMode = Maximized;
+ }
+
+ TQRect button, menuarea;
+ button = querySubControlMetrics(control, ceData, elementFlags, SC_ToolButton, opt, widget);
+ menuarea = querySubControlMetrics(control, ceData, elementFlags, SC_ToolButtonMenu, opt, widget);
+
+ SFlags bflags = flags,
+ mflags = flags;
+
+ if (active & SC_ToolButton)
+ bflags |= Style_Down;
+ if (active & SC_ToolButtonMenu)
+ mflags |= Style_Down;
+
+ if (onToolbar && ceData.toolBarData.orientation == TQt::Horizontal)
+ bflags |= Style_Horizontal;
+
+ if (controls & SC_ToolButton)
+ {
+ // If we're pressed, on, or raised...
+ if (bflags & (Style_Down | Style_On | Style_Raised) || onControlButtons)
+ {
+ //Make sure the standalone toolbuttons have a gradient in the right direction
+ if (!onToolbar && !onControlButtons)
+ bflags |= Style_Horizontal;
+
+ drawPrimitive( PE_ButtonTool, p, ceData, elementFlags, button, cg,
+ bflags, opt);
+ }
+
+ // Check whether to draw a background pixmap
+ else if ( !ceData.parentWidgetData.bgPixmap.isNull() )
+ {
+ TQPixmap pixmap = ceData.parentWidgetData.bgPixmap;
+ p->drawTiledPixmap( r, pixmap, ceData.pos );
+ }
+ else if (onToolbar)
+ {
+ renderToolbarWidgetBackground(p, ceData, elementFlags, widget);
+ }
+ else if (onExtender)
+ {
+ // This assumes floating toolbars can't have extenders,
+ //(so if we're on an extender, we're not floating)
+ TQWidget* parent = static_cast<TQWidget*> (TQT_TQWIDGET(widget->parent()));
+ TQToolBar* toolbar = static_cast<TQToolBar*>(TQT_TQWIDGET(parent->parent()));
+ TQRect tr = ceData.parentWidgetData.rect;
+ bool horiz = ceData.toolBarData.orientation == TQt::Horizontal;
+
+ //Calculate offset. We do this by translating our coordinates,
+ //which are relative to the parent, to be relative to the toolbar.
+ int xoff = 0, yoff = 0;
+ if (horiz)
+ yoff = parent->mapToParent(ceData.pos).y();
+ else
+ xoff = parent->mapToParent(ceData.pos).x();
+
+ Keramik::GradientPainter::renderGradient( p, r, cg.button(),
+ horiz, false, /*Not a menubar*/
+ xoff, yoff,
+ tr.width(), tr.height());
+ }
+ }
+
+ // Draw a toolbutton menu indicator if required
+ if (controls & SC_ToolButtonMenu)
+ {
+ if (mflags & (Style_Down | Style_On | Style_Raised))
+ drawPrimitive(PE_ButtonDropDown, p, ceData, elementFlags, menuarea, cg, mflags, opt);
+ drawPrimitive(PE_ArrowDown, p, ceData, elementFlags, menuarea, cg, mflags, opt);
+ }
+
+ if ((elementFlags & CEF_HasFocus) && !(elementFlags & CEF_HasFocusProxy)) {
+ TQRect fr = ceData.rect;
+ fr.addCoords(3, 3, -3, -3);
+ drawPrimitive(PE_FocusRect, p, ceData, elementFlags, fr, cg);
+ }
+
+ titleBarMode = None;
+
+ break;
+ }
+
+ case CC_TitleBar:
+ titleBarMode = Regular; //Handle buttons on titlebar different from toolbuttons
+ default:
+ TDEStyle::drawComplexControl( control, p, ceData, elementFlags,
+ r, cg, flags, controls, active, opt, widget );
+
+ titleBarMode = None;
+ }
+}
+
+void KeramikStyle::drawComplexControlMask( TQ_ComplexControl control,
+ TQPainter *p,
+ const TQStyleControlElementData &ceData,
+ const ControlElementFlags elementFlags,
+ const TQRect &r,
+ const TQStyleOption& opt,
+ const TQWidget *widget ) const
+{
+ if (control == CC_ComboBox)
+ {
+ maskMode = true;
+ drawComplexControl(CC_ComboBox, p, ceData, elementFlags, r,
+ TQApplication::palette().active(), Style_Default,
+ SC_ComboBoxFrame,SC_None, opt, widget);
+ maskMode = false;
+
+ }
+ else
+ p->fillRect(r, color1);
+
+}
+
+int KeramikStyle::pixelMetric(PixelMetric m, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQWidget *widget) const
+{
+ switch(m)
+ {
+ // BUTTONS
+ // -------------------------------------------------------------------
+ case PM_ButtonMargin: // Space btw. frame and label
+ return 4;
+
+ case PM_SliderLength:
+ return 12;
+ case PM_SliderControlThickness:
+ return loader.size( keramik_slider ).height() - 4;
+ case PM_SliderThickness:
+ return loader.size( keramik_slider ).height();
+
+ case PM_ButtonShiftHorizontal:
+ return 0;
+ case PM_ButtonShiftVertical: // Offset by 1
+ return 1;
+
+
+ // CHECKBOXES / RADIO BUTTONS
+ // -------------------------------------------------------------------
+ case PM_ExclusiveIndicatorWidth: // Radiobutton size
+ return loader.size( keramik_radiobutton_on ).width();
+ case PM_ExclusiveIndicatorHeight:
+ return loader.size( keramik_radiobutton_on ).height();
+ case PM_IndicatorWidth: // Checkbox size
+ return loader.size( keramik_checkbox_on ).width();
+ case PM_IndicatorHeight:
+ return loader.size( keramik_checkbox_on) .height();
+
+ case PM_ScrollBarExtent:
+ return loader.size( keramik_scrollbar_vbar + KeramikGroove1).width();
+ case PM_ScrollBarSliderMin:
+ return loader.size( keramik_scrollbar_vbar + KeramikSlider1 ).height() +
+ loader.size( keramik_scrollbar_vbar + KeramikSlider3 ).height();
+
+ case PM_SpinBoxFrameWidth:
+ case PM_DefaultFrameWidth:
+ return 1;
+
+ case PM_MenuButtonIndicator:
+ return 13;
+
+ case PM_TabBarTabVSpace:
+ return 12;
+
+ case PM_TabBarTabOverlap:
+ return 0;
+
+ case PM_TabBarTabShiftVertical:
+ {
+ if (ceData.widgetObjectTypes.contains(TQTABBAR_OBJECT_NAME_STRING))
+ {
+ if (ceData.tabBarData.shape == TQTabBar::RoundedBelow ||
+ ceData.tabBarData.shape == TQTabBar::TriangularBelow)
+ return 0;
+ }
+
+ return 2; //For top, or if not sure
+ }
+
+
+ case PM_TitleBarHeight:
+ return titleBarH;
+
+ case PM_MenuIndicatorFrameHBorder:
+ case PM_MenuIndicatorFrameVBorder:
+ case PM_MenuIconIndicatorFrameHBorder:
+ case PM_MenuIconIndicatorFrameVBorder:
+ return 2;
+
+ default:
+ return TDEStyle::pixelMetric(m, ceData, elementFlags, widget);
+ }
+}
+
+
+TQSize KeramikStyle::sizeFromContents( ContentsType contents,
+ const TQStyleControlElementData &ceData,
+ ControlElementFlags elementFlags,
+ const TQSize &contentSize,
+ const TQStyleOption& opt,
+ const TQWidget* widget ) const
+{
+ switch (contents)
+ {
+ // PUSHBUTTON SIZE
+ // ------------------------------------------------------------------
+ case CT_PushButton:
+ {
+ const TQPushButton* btn = dynamic_cast< const TQPushButton* >( widget );
+
+ int w = contentSize.width() + 2 * pixelMetric( PM_ButtonMargin, ceData, elementFlags, widget );
+ int h = contentSize.height() + 2 * pixelMetric( PM_ButtonMargin, ceData, elementFlags, widget );
+ if ( ceData.text.isEmpty() && contentSize.width() < 32 ) return TQSize( w, h );
+
+
+ //For some reason kcontrol no longer does this...
+ //if ( (elementFlags & CEF_IsDefault) || (elementFlags & CEF_AutoDefault) )
+ // w = QMAX( w, 40 );
+
+ return TQSize( w + 30, h + 5 ); //MX: No longer blank space -- can make a bit smaller
+ }
+
+ case CT_ToolButton:
+ {
+ bool onToolbar = widget->parentWidget() && widget->parentWidget()->inherits( TQTOOLBAR_OBJECT_NAME_STRING );
+ if (!onToolbar) //Behaves like a button, so scale appropriately to the border
+ {
+ int w = contentSize.width();
+ int h = contentSize.height();
+ return TQSize( w + 12, h + 10 );
+ }
+ else
+ {
+ return TDEStyle::sizeFromContents( contents, ceData, elementFlags, contentSize, opt, widget );
+ }
+ }
+
+ case CT_ComboBox: {
+ int arrow = 11 + loader.size( keramik_ripple ).width();
+ return TQSize( contentSize.width() + arrow + ((elementFlags & CEF_IsEditable) ? 26 : 22),
+ contentSize.height() + 10 );
+ }
+
+ // POPUPMENU ITEM SIZE
+ // -----------------------------------------------------------------
+ case CT_PopupMenuItem: {
+ if ( ! widget || opt.isDefault() )
+ return contentSize;
+
+ const TQPopupMenu *popup = (const TQPopupMenu *) widget;
+ bool checkable = popup->isCheckable();
+ TQMenuItem *mi = opt.menuItem();
+ int maxpmw = opt.maxIconWidth();
+ int w = contentSize.width(), h = contentSize.height();
+
+ if ( mi->custom() ) {
+ w = mi->custom()->sizeHint().width();
+ h = mi->custom()->sizeHint().height();
+ if ( ! mi->custom()->fullSpan() )
+ h += 2*itemVMargin + 2*itemFrame;
+ }
+ else if ( mi->widget() ) {
+ } else if ( mi->isSeparator() ) {
+ w = 30; // Arbitrary
+ h = 3;
+ }
+ else {
+ if ( mi->pixmap() )
+ h = QMAX( h, mi->pixmap()->height() + 2*itemFrame );
+ else {
+ // Ensure that the minimum height for text-only menu items
+ // is the same as the icon size used by KDE.
+ h = QMAX( h, 16 + 2*itemFrame );
+ h = QMAX( h, popup->fontMetrics().height()
+ + 2*itemVMargin + 2*itemFrame );
+ }
+
+ if ( mi->iconSet() )
+ h = QMAX( h, mi->iconSet()->pixmap(
+ TQIconSet::Small, TQIconSet::Normal).height() +
+ 2 * itemFrame );
+ }
+
+ if ( ! mi->text().isNull() && mi->text().find('\t') >= 0 )
+ w += itemHMargin + itemFrame*2 + 7;
+ else if ( mi->popup() )
+ w += 2 * arrowHMargin;
+
+ if ( maxpmw )
+ w += maxpmw + 6;
+ if ( checkable && maxpmw < 20 )
+ w += 20 - maxpmw;
+ if ( checkable || maxpmw > 0 )
+ w += 12;
+
+ w += rightBorder;
+
+ return TQSize( w, h );
+ }
+
+ default:
+ return TDEStyle::sizeFromContents( contents, ceData, elementFlags, contentSize, opt, widget );
+ }
+}
+
+
+TQStyle::SubControl KeramikStyle::querySubControl( TQ_ComplexControl control,
+ const TQStyleControlElementData &ceData,
+ ControlElementFlags elementFlags,
+ const TQPoint& point,
+ const TQStyleOption& opt,
+ const TQWidget* widget ) const
+{
+ SubControl result = TDEStyle::querySubControl( control, ceData, elementFlags, point, opt, widget );
+ if ( control == CC_ScrollBar && result == SC_ScrollBarAddLine )
+ {
+ TQRect addline = querySubControlMetrics( control, ceData, elementFlags, result, opt, widget );
+ if ( static_cast< const TQScrollBar* >( widget )->orientation() == Qt::Horizontal )
+ {
+ if ( point.x() < addline.center().x() ) result = SC_ScrollBarSubLine;
+ }
+ else if ( point.y() < addline.center().y() ) result = SC_ScrollBarSubLine;
+ }
+ return result;
+}
+
+TQRect KeramikStyle::querySubControlMetrics( TQ_ComplexControl control,
+ const TQStyleControlElementData &ceData,
+ ControlElementFlags elementFlags,
+ SubControl subcontrol,
+ const TQStyleOption& opt,
+ const TQWidget* widget ) const
+{
+ switch ( control )
+ {
+ case CC_ComboBox:
+ {
+ int arrow;
+ bool compact = false;
+ if ( isSizeConstrainedCombo(ceData, elementFlags, dynamic_cast<const TQComboBox*>(widget)) ) //### constant
+ compact = true;
+
+ if ( compact )
+ arrow = 11;
+ else
+ arrow = 11 + loader.size( keramik_ripple ).width();
+
+ switch ( subcontrol )
+ {
+ case SC_ComboBoxArrow:
+ if ( compact )
+ return TQRect( ceData.rect.width() - arrow - 7, 0, arrow + 6, ceData.rect.height() );
+ else
+ return TQRect( ceData.rect.width() - arrow - 14, 0, arrow + 13, ceData.rect.height() );
+
+ case SC_ComboBoxEditField:
+ {
+ if ( compact )
+ return TQRect( 2, 4, ceData.rect.width() - arrow - 2 - 7, ceData.rect.height() - 8 );
+ else if ( ceData.rect.width() < 36 || ceData.rect.height() < 22 )
+ return TQRect( 4, 3, ceData.rect.width() - arrow - 20, ceData.rect.height() - 6 );
+ else if ( elementFlags & CEF_IsEditable )
+ return TQRect( 8, 4, ceData.rect.width() - arrow - 26, ceData.rect.height() - 11 );
+ else
+ return TQRect( 6, 4, ceData.rect.width() - arrow - 22, ceData.rect.height() - 9 );
+ }
+
+ case SC_ComboBoxListBoxPopup:
+ {
+ //Note that the widget here == the combo, not the completion
+ //box, so we don't get any recursion
+ int suggestedWidth = widget->sizeHint().width();
+ TQRect def = opt.rect();
+ def.addCoords( 4, -4, -6, 4 );
+
+ if ((def.width() - suggestedWidth < -12) && (def.width() < 80))
+ def.setWidth(QMIN(80, suggestedWidth - 10));
+
+ return def;
+ }
+
+ default: break;
+ }
+ break;
+ }
+
+ case CC_ScrollBar:
+ {
+ bool horizontal = ceData.orientation == TQt::Horizontal;
+ int addline, subline, sliderpos, sliderlen, maxlen, slidermin;
+ if ( horizontal )
+ {
+ subline = loader.size( keramik_scrollbar_hbar_arrow1 ).width();
+ addline = loader.size( keramik_scrollbar_hbar_arrow2 ).width();
+ maxlen = ceData.rect.width() - subline - addline + 2;
+ }
+ else
+ {
+ subline = loader.size( keramik_scrollbar_vbar_arrow1 ).height();
+ addline = loader.size( keramik_scrollbar_vbar_arrow2 ).height();
+ maxlen = ceData.rect.height() - subline - addline + 2;
+ }
+ sliderpos = ceData.startStep;
+ if ( ceData.minSteps != ceData.maxSteps )
+ {
+ int range = ceData.maxSteps - ceData.minSteps;
+ sliderlen = ( ceData.pageStep * maxlen ) / ( range + ceData.pageStep );
+ slidermin = pixelMetric( PM_ScrollBarSliderMin, ceData, elementFlags, widget );
+ if ( sliderlen < slidermin ) sliderlen = slidermin;
+ if ( sliderlen > maxlen ) sliderlen = maxlen;
+ }
+ else sliderlen = maxlen;
+
+ switch ( subcontrol )
+ {
+ case SC_ScrollBarGroove:
+ if ( horizontal ) return TQRect( subline, 0, maxlen, ceData.rect.height() );
+ else return TQRect( 0, subline, ceData.rect.width(), maxlen );
+
+ case SC_ScrollBarSlider:
+ if (horizontal) return TQRect( sliderpos, 0, sliderlen, ceData.rect.height() );
+ else return TQRect( 0, sliderpos, ceData.rect.width(), sliderlen );
+
+ case SC_ScrollBarSubLine:
+ if ( horizontal ) return TQRect( 0, 0, subline, ceData.rect.height() );
+ else return TQRect( 0, 0, ceData.rect.width(), subline );
+
+ case SC_ScrollBarAddLine:
+ if ( horizontal ) return TQRect( ceData.rect.width() - addline, 0, addline, ceData.rect.height() );
+ else return TQRect( 0, ceData.rect.height() - addline, ceData.rect.width(), addline );
+
+ case SC_ScrollBarSubPage:
+ if ( horizontal ) return TQRect( subline, 0, sliderpos - subline, ceData.rect.height() );
+ else return TQRect( 0, subline, ceData.rect.width(), sliderpos - subline );
+
+ case SC_ScrollBarAddPage:
+ if ( horizontal ) return TQRect( sliderpos + sliderlen, 0, ceData.rect.width() - addline - (sliderpos + sliderlen) , ceData.rect.height() );
+ else return TQRect( 0, sliderpos + sliderlen, ceData.rect.width(), ceData.rect.height() - addline - (sliderpos + sliderlen)
+ /*maxlen - sliderpos - sliderlen + subline - 5*/ );
+
+ default: break;
+ };
+ break;
+ }
+ case CC_Slider:
+ {
+ bool horizontal = ceData.orientation == TQt::Horizontal;
+ TQSlider::TickSetting ticks = (TQSlider::TickSetting)ceData.tickMarkSetting;
+ int pos = ceData.startStep;
+ int size = pixelMetric( PM_SliderControlThickness, ceData, elementFlags, widget );
+ int handleSize = pixelMetric( PM_SliderThickness, ceData, elementFlags, widget );
+ int len = pixelMetric( PM_SliderLength, ceData, elementFlags, widget );
+
+ //Shrink the metrics if the widget is too small
+ //to fit our normal values for them.
+ if (horizontal)
+ handleSize = QMIN(handleSize, ceData.rect.height());
+ else
+ handleSize = QMIN(handleSize, ceData.rect.width());
+
+ size = QMIN(size, handleSize);
+
+ switch ( subcontrol )
+ {
+ case SC_SliderGroove:
+ if ( horizontal )
+ {
+ if ( ticks == TQSlider::Both )
+ return TQRect( 0, ( ceData.rect.height() - size ) / 2, ceData.rect.width(), size );
+ else if ( ticks == TQSlider::Above )
+ return TQRect( 0, ceData.rect.height() - size - ( handleSize - size ) / 2, ceData.rect.width(), size );
+ return TQRect( 0, ( handleSize - size ) / 2, ceData.rect.width(), size );
+ }
+ else
+ {
+ if ( ticks == TQSlider::Both )
+ return TQRect( ( ceData.rect.width() - size ) / 2, 0, size, ceData.rect.height() );
+ else if ( ticks == TQSlider::Above )
+ return TQRect( ceData.rect.width() - size - ( handleSize - size ) / 2, 0, size, ceData.rect.height() );
+ return TQRect( ( handleSize - size ) / 2, 0, size, ceData.rect.height() );
+ }
+ case SC_SliderHandle:
+ if ( horizontal )
+ {
+ if ( ticks == TQSlider::Both )
+ return TQRect( pos, ( ceData.rect.height() - handleSize ) / 2, len, handleSize );
+ else if ( ticks == TQSlider::Above )
+ return TQRect( pos, ceData.rect.height() - handleSize, len, handleSize );
+ return TQRect( pos, 0, len, handleSize );
+ }
+ else
+ {
+ if ( ticks == TQSlider::Both )
+ return TQRect( ( ceData.rect.width() - handleSize ) / 2, pos, handleSize, len );
+ else if ( ticks == TQSlider::Above )
+ return TQRect( ceData.rect.width() - handleSize, pos, handleSize, len );
+ return TQRect( 0, pos, handleSize, len );
+ }
+ default: break;
+ }
+ break;
+ }
+ default: break;
+ }
+ return TDEStyle::querySubControlMetrics( control, ceData, elementFlags, subcontrol, opt, widget );
+}
+
+
+#include <config.h>
+
+#if !defined Q_WS_X11 || defined K_WS_QTONLY
+#undef HAVE_X11_EXTENSIONS_SHAPE_H
+#endif
+
+#ifdef HAVE_X11_EXTENSIONS_SHAPE_H
+//Xlib headers are a mess -> include them down here (any way to ensure that we go second in enable-final order?)
+#include <X11/Xlib.h>
+#include <X11/extensions/shape.h>
+#undef KeyPress
+#undef KeyRelease
+#endif
+
+bool KeramikStyle::objectEventHandler( const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void* source, TQEvent *event )
+{
+ if (TDEStyle::objectEventHandler( ceData, elementFlags, source, event ))
+ return true;
+
+ if (ceData.widgetObjectTypes.contains(TQOBJECT_OBJECT_NAME_STRING)) {
+ TQObject* object = reinterpret_cast<TQObject*>(source);
+
+ if ( !object->isWidgetType() ) return false;
+
+ //Combo line edits get special frames
+ if ( event->type() == TQEvent::Paint && ::tqqt_cast<TQLineEdit*>(object) )
+ {
+ static bool recursion = false;
+ if (recursion )
+ return false;
+
+ recursion = true;
+ object->event( TQT_TQPAINTEVENT( event ) );
+ TQWidget* widget = TQT_TQWIDGET( object );
+ TQPainter p( widget );
+ Keramik::RectTilePainter( keramik_frame_shadow, false, false, 2, 2 ).draw( &p, ceData.rect,
+ widget->palette().color( TQPalette::Normal, TQColorGroup::Button ),
+ Qt::black, false, Keramik::TilePainter::PaintFullBlend);
+ recursion = false;
+ return true;
+ }
+ else if ( ::tqqt_cast<TQListBox*>(object) )
+ {
+ //Handle combobox drop downs
+ switch (event->type())
+ {
+#ifdef HAVE_X11_EXTENSIONS_SHAPE_H
+ //Combo dropdowns are shaped
+ case TQEvent::Resize:
+ {
+ TQListBox* listbox = static_cast<TQListBox*>(TQT_TQWIDGET(object));
+ TQResizeEvent* resize = TQT_TQRESIZEEVENT(event);
+ if (resize->size().height() < 6)
+ return false;
+
+ //CHECKME: Not sure the rects are perfect..
+ XRectangle rects[5] = {
+ {0, 0, resize->size().width()-2, resize->size().height()-6},
+ {0, resize->size().height()-6, resize->size().width()-2, 1},
+ {1, resize->size().height()-5, resize->size().width()-3, 1},
+ {2, resize->size().height()-4, resize->size().width()-5, 1},
+ {3, resize->size().height()-3, resize->size().width()-7, 1}
+ };
+
+ XShapeCombineRectangles(tqt_xdisplay(), listbox->handle(), ShapeBounding, 0, 0,
+ rects, 5, ShapeSet, YXSorted);
+ }
+ break;
+#endif
+ //Combo dropdowns get fancy borders
+ case TQEvent::Paint:
+ {
+ static bool recursion = false;
+ if (recursion )
+ return false;
+ TQListBox* listbox = (TQListBox*) object;
+ TQPaintEvent* paint = (TQPaintEvent*) event;
+
+
+ if ( !listbox->contentsRect().contains( paint->rect() ) )
+ {
+ TQPainter p( listbox );
+ Keramik::RectTilePainter( keramik_combobox_list, false, false ).draw( &p, 0, 0, listbox->width(), listbox->height(),
+ listbox->palette().color( TQPalette::Normal, TQColorGroup::Button ),
+ listbox->palette().color( TQPalette::Normal, TQColorGroup::Background ) );
+
+ TQPaintEvent newpaint( paint->region().intersect( listbox->contentsRect() ), paint->erased() );
+ recursion = true;
+ object->event( &newpaint );
+ recursion = false;
+ return true;
+ }
+ }
+ break;
+
+ /**
+ Since our popup is shown a bit overlapping the combo body, a mouse click at the bottom of the
+ widget will result in the release going to the popup, which will cause it to close (#56435).
+ We solve it by filtering out the first release, if it's in the right area. To do this, we notices shows,
+ move ourselves to front of event filter list, and then capture the first release event, and if it's
+ in the overlap area, filter it out.
+ */
+ case TQEvent::Show:
+ //Prioritize ourselves to see the mouse events first
+ removeObjectEventHandler(ceData, elementFlags, source, this);
+ installObjectEventHandler(ceData, elementFlags, source, this);
+ firstComboPopupRelease = true;
+ break;
+
+ //We need to filter some clicks out.
+ case TQEvent::MouseButtonRelease:
+ if (firstComboPopupRelease)
+ {
+ firstComboPopupRelease = false;
+
+ TQMouseEvent* mev = TQT_TQMOUSEEVENT(event);
+ TQListBox* box = static_cast<TQListBox*>(TQT_TQWIDGET(object));
+
+ TQWidget* parent = box->parentWidget();
+ if (!parent)
+ return false;
+
+ TQPoint inParCoords = parent->mapFromGlobal(mev->globalPos());
+ if (parent->rect().contains(inParCoords))
+ return true;
+ }
+ break;
+ case TQEvent::MouseButtonPress:
+ case TQEvent::MouseButtonDblClick:
+ case TQEvent::Wheel:
+ case TQEvent::KeyPress:
+ case TQEvent::KeyRelease:
+ firstComboPopupRelease = false;
+ default:
+ return false;
+ }
+ }
+ //Toolbar background gradient handling
+ else if (event->type() == TQEvent::Paint &&
+ object->parent() && !qstrcmp(object->name(), kdeToolbarWidget) )
+ {
+ // Draw a gradient background for custom widgets in the toolbar
+ // that have specified a "kde toolbar widget" name.
+ renderToolbarWidgetBackground(0, ceData, elementFlags, TQT_TQWIDGET(object));
+
+ return false; // Now draw the contents
+ }
+#if 0 // FIXME
+ // This does not work on modern systems
+ // Rather than resorting to hacks like this, which can stop working at any time, the required functionality should simply be added to TQt3!
+ else if (event->type() == TQEvent::Paint && object->parent() && ::tqqt_cast<TQToolBar*>(object->parent())
+ && !::tqqt_cast<TQPopupMenu*>(object) )
+ {
+ // We need to override the paint event to draw a
+ // gradient on a QToolBarExtensionWidget.
+ TQToolBar* toolbar = static_cast<TQToolBar*>(TQT_TQWIDGET(object->parent()));
+ TQWidget* widget = TQT_TQWIDGET(object);
+ TQRect wr = widget->rect (), tr = toolbar->rect();
+ TQPainter p( widget );
+
+ if ( toolbar->orientation() == Qt::Horizontal )
+ {
+ Keramik::GradientPainter::renderGradient( &p, wr, widget->colorGroup().button(),
+ true /*horizontal*/, false /*not a menu*/,
+ 0, widget->y(), wr.width(), tr.height());
+ }
+ else
+ {
+ Keramik::GradientPainter::renderGradient( &p, wr, widget->colorGroup().button(),
+ false /*vertical*/, false /*not a menu*/,
+ widget->x(), 0, tr.width(), wr.height());
+ }
+
+
+ //Draw terminator line, too
+ p.setPen( toolbar->colorGroup().mid() );
+ if ( toolbar->orientation() == Qt::Horizontal )
+ p.drawLine( wr.width()-1, 0, wr.width()-1, wr.height()-1 );
+ else
+ p.drawLine( 0, wr.height()-1, wr.width()-1, wr.height()-1 );
+ return true;
+
+ }
+#endif
+ // Track show events for progress bars
+ if ( animateProgressBar && ::tqqt_cast<TQProgressBar*>(object) )
+ {
+ if ((event->type() == TQEvent::Show) && !animationTimer->isActive())
+ {
+ animationTimer->start( 50, false );
+ }
+ }
+ }
+
+ return false;
+}
+
+/*! \reimp */
+int KeramikStyle::styleHint(StyleHint sh, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQStyleOption &opt, TQStyleHintReturn *returnData, const TQWidget *w) const
+{
+ int ret;
+
+ switch (sh) {
+ case SH_MenuIndicatorColumnWidth:
+ {
+ int checkcol = opt.maxIconWidth();
+ bool checkable = (elementFlags & CEF_IsCheckable);
+
+ if ( checkable )
+ checkcol = QMAX( checkcol, 20 );
+
+ ret = checkcol;
+ }
+ break;
+ case SH_ScrollBar_CombineAddLineRegionDrawingAreas:
+ ret = 1;
+ break;
+ default:
+ ret = TDEStyle::styleHint(sh, ceData, elementFlags, opt, returnData, w);
+ break;
+ }
+
+ return ret;
+}
+
+// vim: ts=4 sw=4 noet
+// kate: indent-width 4; replace-tabs off; tab-width 4; space-indent off;