/* Plastik widget style for KDE 3 Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net> based on the KDE style "dotNET": Copyright (C) 2001-2002, Chris Lee <clee@kde.org> Carsten Pfeiffer <pfeiffer@kde.org> Karol Szwed <gallium@kde.org> Drawing routines completely reimplemented from KDE3 HighColor, which was originally based on some stuff from the KDE2 HighColor. based on drawing routines of the style "Keramik": Copyright (c) 2002 Malte Starostik <malte@kde.org> (c) 2002,2003 Maksim Orlovich <mo002j@mail.rochester.edu> based on the KDE3 HighColor Style Copyright (C) 2001-2002 Karol Szwed <gallium@kde.org> (C) 2001-2002 Fredrik H�glund <fredrik@kde.org> Drawing routines adapted from the KDE2 HCStyle, Copyright (C) 2000 Daniel M. Duley <mosfet@kde.org> (C) 2000 Dirk Mueller <mueller@kde.org> (C) 2001 Martijn Klingens <klingens@kde.org> Progressbar code based on TDEStyle, Copyright (C) 2001-2002 Karol Szwed <gallium@kde.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU 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. */ #ifndef __PLASTIK_H #define __PLASTIK_H #include <tdestyle.h> #include <tqbitmap.h> #include <tqintcache.h> #define u_arrow -4,1, 2,1, -3,0, 1,0, -2,-1, 0,-1, -1,-2 #define d_arrow -4,-2, 2,-2, -3,-1, 1,-1, -2,0, 0,0, -1,1 #define l_arrow 0,-3, 0,3,-1,-2,-1,2,-2,-1,-2,1,-3,0 #define r_arrow -2,-3,-2,3,-1,-2, -1,2,0,-1,0,1,1,0 #define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2) class TQSettings; class TQTab; class TQTimer; class PlastikStyle : public TDEStyle { TQ_OBJECT public: PlastikStyle(); virtual ~PlastikStyle(); void applicationPolish(const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void *); void polish(const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void *); void unPolish(const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void *); void drawTDEStylePrimitive(TDEStylePrimitive kpe, TQPainter* p, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQRect &r, const TQColorGroup &cg, SFlags flags = Style_Default, const TQStyleOption& = TQStyleOption::Default, const TQWidget* widget = 0 ) const; void drawPrimitive(PrimitiveElement pe, TQPainter *p, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQRect &r, const TQColorGroup &cg, SFlags flags = Style_Default, const TQStyleOption &opt = TQStyleOption::Default ) const; void drawControl(TQ_ControlElement element, TQPainter *p, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQRect &r, const TQColorGroup &cg, SFlags flags = Style_Default, const TQStyleOption& = TQStyleOption::Default, const TQWidget *widget = 0 ) const; void drawControlMask( TQ_ControlElement, TQPainter *, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQRect &, const TQStyleOption &, const TQWidget * = 0) const; void drawComplexControl(TQ_ComplexControl control, TQPainter *p, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQRect &r, const TQColorGroup &cg, SFlags flags = Style_Default, SCFlags controls = SC_All, SCFlags active = SC_None, const TQStyleOption& = TQStyleOption::Default, const TQWidget *widget = 0 ) const; int pixelMetric(PixelMetric m, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQWidget *widget = 0 ) const; TQRect subRect(SubRect r, const TQStyleControlElementData &ceData, const ControlElementFlags elementFlags, const TQWidget *widget ) const; TQRect querySubControlMetrics(TQ_ComplexControl control, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, SubControl subcontrol, const TQStyleOption &opt = TQStyleOption::Default, const TQWidget *widget = 0 ) const; void drawComplexControlMask(TQStyle::TQ_ComplexControl c, TQPainter *p, const TQStyleControlElementData &ceData, const ControlElementFlags elementFlags, const TQRect &r, const TQStyleOption &o=TQStyleOption::Default, const TQWidget *w = 0) const; TQSize sizeFromContents(TQStyle::ContentsType t, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQSize &s, const TQStyleOption &o, const TQWidget *w = 0) const; int styleHint(StyleHint, const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, const TQStyleOption & = TQStyleOption::Default, TQStyleHintReturn * = 0, const TQWidget * = 0 ) const; protected: enum TabPosition { First = 0, Middle, Last, Single // only one tab! }; enum ColorType { ButtonContour, DragButtonContour, DragButtonSurface, PanelContour, PanelLight, PanelLight2, PanelDark, PanelDark2, MouseOverHighlight, FocusHighlight, CheckMark }; enum WidgetState { IsEnabled, IsPressed, // implies IsEnabled IsHighlighted, // implies IsEnabled IsDisabled }; // the only way i see to provide all these options // to renderContour/renderSurface... enum SurfaceFlags { Draw_Left = 0x00000001, Draw_Right = 0x00000002, Draw_Top = 0x00000004, Draw_Bottom = 0x00000008, Highlight_Left = 0x00000010, // surface Highlight_Right = 0x00000020, // surface Highlight_Top = 0x00000040, // surface Highlight_Bottom = 0x00000080, // surface Is_Sunken = 0x00000100, // surface Is_Horizontal = 0x00000200, // surface Is_Highlight = 0x00000400, // surface Is_Default = 0x00000800, // surface Is_Disabled = 0x00001000, Round_UpperLeft = 0x00002000, Round_UpperRight = 0x00004000, Round_BottomLeft = 0x00008000, Round_BottomRight = 0x00010000, Draw_AlphaBlend = 0x00020000 }; void renderContour(TQPainter *p, const TQRect &r, const TQColor &backgroundColor, const TQColor &contourColor, const uint flags = Draw_Left|Draw_Right|Draw_Top|Draw_Bottom| Round_UpperLeft|Round_UpperRight|Round_BottomLeft|Round_BottomRight) const; void renderMask(TQPainter *p, const TQRect &r, const TQColor &color, const uint flags = Draw_Left|Draw_Right|Draw_Top|Draw_Bottom| Round_UpperLeft|Round_UpperRight|Round_BottomLeft|Round_BottomRight) const; void renderSurface(TQPainter *p, const TQRect &r, const TQColor &backgroundColor, const TQColor &buttonColor, const TQColor &highlightColor, int intensity = 5, const uint flags = Draw_Left|Draw_Right|Draw_Top|Draw_Bottom| Round_UpperLeft|Round_UpperRight|Round_BottomLeft|Round_BottomRight| Is_Horizontal) const; inline void renderPixel(TQPainter *p, const TQPoint &pos, const int alpha, const TQColor &color, const TQColor &background = TQColor(), bool fullAlphaBlend = true) const; void renderButton(TQPainter *p, const TQRect &r, const TQColorGroup &g, bool sunken = false, bool mouseOver = false, bool horizontal = true, bool enabled = true, bool tdehtmlMode = false) const; void renderPanel(TQPainter *p, const TQRect &r, const TQColorGroup &g, const bool pseudo3d = true, const bool sunken = true) const; void renderDot(TQPainter *p, const TQPoint &point, const TQColor &baseColor, const bool thick = false, const bool sunken = false) const; void renderGradient(TQPainter *p, const TQRect &r, const TQColor &c1, const TQColor &c2, bool horizontal = true) const; void renderTab(TQPainter *p, const TQRect &r, const TQColorGroup &g, bool mouseOver = false, const bool selected = false, const bool bottom = false, const TabPosition pos = Middle, const bool triangular = false, const bool cornerWidget = false) const; virtual void renderMenuBlendPixmap( KPixmap& pix, const TQColorGroup& cg, const TQPopupMenu* popup ) const; virtual bool objectEventHandler( const TQStyleControlElementData &ceData, ControlElementFlags elementFlags, void* source, TQEvent *e ); protected slots: void tdehtmlWidgetDestroyed(TQObject* w); //Animation slots. void updateProgressPos(); void progressBarDestroyed(TQObject* bar); inline TQColor getColor(const TQColorGroup &cg, const ColorType t, const bool enabled = true)const; inline TQColor getColor(const TQColorGroup &cg, const ColorType t, const WidgetState s)const; private: // Disable copy constructor and = operator PlastikStyle( const PlastikStyle & ); PlastikStyle& operator=( const PlastikStyle & ); bool kickerMode, kornMode; mutable bool flatMode; int _contrast; bool _scrollBarLines; bool _animateProgressBar; bool _drawToolBarSeparator; bool _drawToolBarItemSeparator; bool _drawFocusRect; bool _drawTriangularExpander; bool _inputFocusHighlight; bool _customOverHighlightColor; bool _customFocusHighlightColor; bool _customCheckMarkColor; TQColor _overHighlightColor; TQColor _focusHighlightColor; TQColor _checkMarkColor; // track tdehtml widgets. TQMap<const TQWidget*,bool> tdehtmlWidgets; //Animation support. TQMap<TQWidget*, int> progAnimWidgets; // pixmap cache. enum CacheEntryType { cSurface, cGradientTile, cAlphaDot }; struct CacheEntry { CacheEntryType type; int width; int height; QRgb c1Rgb; QRgb c2Rgb; bool horizontal; TQPixmap* pixmap; CacheEntry(CacheEntryType t, int w, int h, QRgb c1, QRgb c2 = 0, bool hor = false, TQPixmap* p = 0 ): type(t), width(w), height(h), c1Rgb(c1), c2Rgb(c2), horizontal(hor), pixmap(p) {} ~CacheEntry() { delete pixmap; } int key() { // create an int key from the properties which is used to refer to entries in the TQIntCache. // the result may not be 100% correct as we don't have so much space in one integer -- use // == operator after find to make sure we got the right one. :) return horizontal ^ (type<<1) ^ (width<<5) ^ (height<<10) ^ (c1Rgb<<19) ^ (c2Rgb<<22); } bool operator == (const CacheEntry& other) { bool match = (type == other.type) && (width == other.width) && (height == other.height) && (c1Rgb == other.c1Rgb) && (c1Rgb == other.c1Rgb) && (horizontal == other.horizontal); // if(!match) { // tqDebug("operator ==: CacheEntries don't match!"); // tqDebug("width: %d\t\tother width: %d", width, other.width); // tqDebug("height: %d\t\tother height: %d", height, other.height); // tqDebug("fgRgb: %d\t\tother fgRgb: %d", fgRgb, other.fgRgb); // tqDebug("bgRgb: %d\t\tother bgRgb: %d", bgRgb, other.bgRgb); // tqDebug("surfaceFlags: %d\t\tother surfaceFlags: %d", surfaceFlags, other.surfaceFlags); // } return match; } }; TQIntCache<CacheEntry> *pixmapCache; // For KPE_ListViewBranch mutable TQBitmap *verticalLine; mutable TQBitmap *horizontalLine; // For progress bar animation TQTimer *animationTimer; }; #endif // __PLASTIK_H