summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/styles/theme/othemebase.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/noncore/styles/theme/othemebase.cpp b/noncore/styles/theme/othemebase.cpp
index 00cea03..21d16f2 100644
--- a/noncore/styles/theme/othemebase.cpp
+++ b/noncore/styles/theme/othemebase.cpp
@@ -1,1212 +1,1216 @@
1/* This file is part of the KDE libraries 1/* This file is part of the KDE libraries
2 Copyright (C) 1999 Daniel M. Duley <mosfet@kde.org> 2 Copyright (C) 1999 Daniel M. Duley <mosfet@kde.org>
3 3
4 This library is free software; you can redistribute it and/or 4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public 5 modify it under the terms of the GNU Library General Public
6 License version 2 as published by the Free Software Foundation. 6 License version 2 as published by the Free Software Foundation.
7 7
8 This library is distributed in the hope that it will be useful, 8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of 9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Library General Public License for more details. 11 Library General Public License for more details.
12 12
13 You should have received a copy of the GNU Library General Public License 13 You should have received a copy of the GNU Library General Public License
14 along with this library; see the file COPYING.LIB. If not, write to 14 along with this library; see the file COPYING.LIB. If not, write to
15 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 15 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 Boston, MA 02111-1307, USA. 16 Boston, MA 02111-1307, USA.
17*/ 17*/
18#include "othemebase.h" 18#include "othemebase.h"
19#include "ogfxeffect.h" 19#include "ogfxeffect.h"
20#include <qpe/qpeapplication.h> 20#include <qpe/qpeapplication.h>
21//#include <kdebug.h> 21//#include <kdebug.h>
22//#include <klocale.h> 22//#include <klocale.h>
23#include <qpe/config.h> 23#include <qpe/config.h>
24//#include <kglobal.h> 24//#include <kglobal.h>
25//#include <kglobalsettings.h> 25//#include <kglobalsettings.h>
26//#include <kstddirs.h> 26//#include <kstddirs.h>
27#include <qfile.h> 27#include <qfile.h>
28#include <qtextstream.h> 28#include <qtextstream.h>
29#include <qdir.h> 29#include <qdir.h>
30#include <qpainter.h> 30#include <qpainter.h>
31#include <qbitmap.h> 31#include <qbitmap.h>
32#include <stdlib.h> 32#include <stdlib.h>
33#include <qstringlist.h> 33#include <qstringlist.h>
34 34
35#include <stdio.h> 35#include <stdio.h>
36 36
37template class QIntCache<OThemePixmap> 37template class QIntCache<OThemePixmap>
38; 38;
39 39
40static const char *widgetEntries[] = 40static const char *widgetEntries[] =
41 { // unsunken widgets (see header) 41 { // unsunken widgets (see header)
42 "PushButton", "ComboBox", "HSBarSlider", "VSBarSlider", "Bevel", "ToolButton", 42 "PushButton", "ComboBox", "HSBarSlider", "VSBarSlider", "Bevel", "ToolButton",
43 "ScrollButton", "HScrollDeco", "VScrollDeco", "ComboDeco", "MenuItem", "Tab", 43 "ScrollButton", "HScrollDeco", "VScrollDeco", "ComboDeco", "MenuItem", "Tab",
44 "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", 44 "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight",
45 // sunken widgets 45 // sunken widgets
46 "PushButtonDown", "ComboBoxDown", "HSBarSliderDown", "VSBarSliderDown", 46 "PushButtonDown", "ComboBoxDown", "HSBarSliderDown", "VSBarSliderDown",
47 "BevelDown", "ToolButtonDown", "ScrollButtonDown", "HScrollDecoDown", 47 "BevelDown", "ToolButtonDown", "ScrollButtonDown", "HScrollDecoDown",
48 "VScrollDecoDown", "ComboDecoDown", "MenuItemDown", "TabDown", "SunkenArrowUp", 48 "VScrollDecoDown", "ComboDecoDown", "MenuItemDown", "TabDown", "SunkenArrowUp",
49 "SunkenArrowDown", "SunkenArrowLeft", "SunkenArrowRight", 49 "SunkenArrowDown", "SunkenArrowLeft", "SunkenArrowRight",
50 // everything else 50 // everything else
51 "HScrollGroove", "VScrollGroove", "Slider", "SliderGroove", "CheckBoxDown", 51 "HScrollGroove", "VScrollGroove", "Slider", "SliderGroove", "CheckBoxDown",
52 "CheckBox", "RadioDown", "Radio", "HBarHandle", "VBarHandle", 52 "CheckBox", "RadioDown", "Radio", "HBarHandle", "VBarHandle",
53 "ToolBar", "Splitter", "CheckMark", "MenuBar", "DisableArrowUp", 53 "ToolBar", "Splitter", "CheckMark", "MenuBar", "DisableArrowUp",
54 "DisableArrowDown", "DisableArrowLeft", "DisableArrowRight", "ProgressBar", 54 "DisableArrowDown", "DisableArrowLeft", "DisableArrowRight", "ProgressBar",
55 "ProgressBackground", "MenuBarItem", "Background" 55 "ProgressBackground", "MenuBarItem", "Background"
56 }; 56 };
57 57
58#define INHERIT_ITEMS 16 58#define INHERIT_ITEMS 16
59 59
60 60
61// This is used to encode the keys. I used to use masks but I think this 61// This is used to encode the keys. I used to use masks but I think this
62// bitfield is nicer :) I don't know why C++ coders don't use these more.. 62// bitfield is nicer :) I don't know why C++ coders don't use these more..
63// (mosfet) 63// (mosfet)
64struct kthemeKeyData 64struct kthemeKeyData
65{ 65{
66unsigned int id : 66unsigned int id :
67 6; 67 6;
68unsigned int width : 68unsigned int width :
69 12; 69 12;
70unsigned int height : 70unsigned int height :
71 12; 71 12;
72unsigned int border : 72unsigned int border :
73 1; 73 1;
74unsigned int mask : 74unsigned int mask :
75 1; 75 1;
76}; 76};
77 77
78union kthemeKey{ 78union kthemeKey{
79 kthemeKeyData data; 79 kthemeKeyData data;
80 unsigned int cacheKey; 80 unsigned int cacheKey;
81}; 81};
82 82
83class MyConfig : public Config 83class MyConfig : public Config
84{ 84{
85public: 85public:
86 MyConfig ( const QString &f, Domain d ) : Config ( f, d ) 86 MyConfig ( const QString &f, Domain d ) : Config ( f, d )
87 { } 87 { }
88 88
89 bool hasGroup ( const QString &gname ) const 89 bool hasGroup ( const QString &gname ) const
90 { 90 {
91 QMap< QString, ConfigGroup>::ConstIterator it = groups. find ( gname ); 91 QMap< QString, ConfigGroup>::ConstIterator it = groups. find ( gname );
92 return ( it != groups.end() ); 92 return ( it != groups.end() );
93 } 93 }
94}; 94};
95 95
96void OThemeBase::generateBorderPix( int i ) 96void OThemeBase::generateBorderPix( int i )
97{ 97{
98 // separate pixmap into separate components 98 // separate pixmap into separate components
99 if ( pbPixmaps[ i ] ) { 99 if ( pbPixmaps[ i ] ) {
100 // evidently I have to do masks manually... 100 // evidently I have to do masks manually...
101 const QBitmap * srcMask = pbPixmaps[ i ] ->mask(); 101 const QBitmap * srcMask = pbPixmaps[ i ] ->mask();
102 QBitmap destMask( pbWidth[ i ], pbWidth[ i ] ); 102 QBitmap destMask( pbWidth[ i ], pbWidth[ i ] );
103 QPixmap tmp( pbWidth[ i ], pbWidth[ i ] ); 103 QPixmap tmp( pbWidth[ i ], pbWidth[ i ] );
104 104
105 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, 0, pbWidth[ i ], pbWidth[ i ], 105 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, 0, pbWidth[ i ], pbWidth[ i ],
106 Qt::CopyROP, false ); 106 Qt::CopyROP, false );
107 if ( srcMask ) { 107 if ( srcMask ) {
108 bitBlt( &destMask, 0, 0, srcMask, 0, 0, pbWidth[ i ], pbWidth[ i ], 108 bitBlt( &destMask, 0, 0, srcMask, 0, 0, pbWidth[ i ], pbWidth[ i ],
109 Qt::CopyROP, false ); 109 Qt::CopyROP, false );
110 tmp.setMask( destMask ); 110 tmp.setMask( destMask );
111 } 111 }
112 pbPixmaps[ i ] ->setBorder( OThemePixmap::TopLeft, tmp ); 112 pbPixmaps[ i ] ->setBorder( OThemePixmap::TopLeft, tmp );
113 113
114 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ], 0, 114 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ], 0,
115 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false ); 115 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
116 if ( srcMask ) { 116 if ( srcMask ) {
117 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ], 117 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ],
118 0, pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false ); 118 0, pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
119 tmp.setMask( destMask ); 119 tmp.setMask( destMask );
120 } 120 }
121 pbPixmaps[ i ] ->setBorder( OThemePixmap::TopRight, tmp ); 121 pbPixmaps[ i ] ->setBorder( OThemePixmap::TopRight, tmp );
122 122
123 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbPixmaps[ i ] ->height() - pbWidth[ i ], 123 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbPixmaps[ i ] ->height() - pbWidth[ i ],
124 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false ); 124 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
125 if ( srcMask ) { 125 if ( srcMask ) {
126 bitBlt( &destMask, 0, 0, srcMask, 0, pbPixmaps[ i ] ->height() - pbWidth[ i ], 126 bitBlt( &destMask, 0, 0, srcMask, 0, pbPixmaps[ i ] ->height() - pbWidth[ i ],
127 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false ); 127 pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
128 tmp.setMask( destMask ); 128 tmp.setMask( destMask );
129 } 129 }
130 pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomLeft, tmp ); 130 pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomLeft, tmp );
131 131
132 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ], 132 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ],
133 pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ], 133 pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ],
134 Qt::CopyROP, false ); 134 Qt::CopyROP, false );
135 if ( srcMask ) { 135 if ( srcMask ) {
136 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ], 136 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ],
137 pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ], 137 pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ],
138 Qt::CopyROP, false ); 138 Qt::CopyROP, false );
139 tmp.setMask( destMask ); 139 tmp.setMask( destMask );
140 } 140 }
141 pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomRight, tmp ); 141 pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomRight, tmp );
142 142
143 tmp.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] ); 143 tmp.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] );
144 destMask.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] ); 144 destMask.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] );
145 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ], 0, 145 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ], 0,
146 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false ); 146 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false );
147 if ( srcMask ) { 147 if ( srcMask ) {
148 bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ], 0, 148 bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ], 0,
149 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], 149 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ],
150 Qt::CopyROP, false ); 150 Qt::CopyROP, false );
151 tmp.setMask( destMask ); 151 tmp.setMask( destMask );
152 } 152 }
153 pbPixmaps[ i ] ->setBorder( OThemePixmap::Top, tmp ); 153 pbPixmaps[ i ] ->setBorder( OThemePixmap::Top, tmp );
154 154
155 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ], 155 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ],
156 pbPixmaps[ i ] ->height() - pbWidth[ i ], 156 pbPixmaps[ i ] ->height() - pbWidth[ i ],
157 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false ); 157 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false );
158 if ( srcMask ) { 158 if ( srcMask ) {
159 bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ], 159 bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ],
160 pbPixmaps[ i ] ->height() - pbWidth[ i ], 160 pbPixmaps[ i ] ->height() - pbWidth[ i ],
161 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false ); 161 pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false );
162 tmp.setMask( destMask ); 162 tmp.setMask( destMask );
163 } 163 }
164 pbPixmaps[ i ] ->setBorder( OThemePixmap::Bottom, tmp ); 164 pbPixmaps[ i ] ->setBorder( OThemePixmap::Bottom, tmp );
165 165
166 tmp.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 ); 166 tmp.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 );
167 destMask.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 ); 167 destMask.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 );
168 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbWidth[ i ], pbWidth[ i ], 168 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbWidth[ i ], pbWidth[ i ],
169 pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false ); 169 pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false );
170 if ( srcMask ) { 170 if ( srcMask ) {
171 bitBlt( &destMask, 0, 0, srcMask, 0, pbWidth[ i ], pbWidth[ i ], 171 bitBlt( &destMask, 0, 0, srcMask, 0, pbWidth[ i ], pbWidth[ i ],
172 pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false ); 172 pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false );
173 tmp.setMask( destMask ); 173 tmp.setMask( destMask );
174 } 174 }
175 175
176 pbPixmaps[ i ] ->setBorder( OThemePixmap::Left, tmp ); 176 pbPixmaps[ i ] ->setBorder( OThemePixmap::Left, tmp );
177 177
178 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ], 178 bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ],
179 pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, 179 pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2,
180 Qt::CopyROP, false ); 180 Qt::CopyROP, false );
181 if ( srcMask ) { 181 if ( srcMask ) {
182 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ], 182 bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ],
183 pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, 183 pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2,
184 Qt::CopyROP, false ); 184 Qt::CopyROP, false );
185 tmp.setMask( destMask ); 185 tmp.setMask( destMask );
186 } 186 }
187 pbPixmaps[ i ] ->setBorder( OThemePixmap::Right, tmp ); 187 pbPixmaps[ i ] ->setBorder( OThemePixmap::Right, tmp );
188 } 188 }
189 else 189 else
190 qDebug ( "OThemeBase: Tried making border from empty pixmap" ); 190 qDebug ( "OThemeBase: Tried making border from empty pixmap" );
191} 191}
192 192
193 193
194void OThemeBase::copyWidgetConfig( int sourceID, int destID, QString *pixnames, 194void OThemeBase::copyWidgetConfig( int sourceID, int destID, QString *pixnames,
195 QString *brdnames ) 195 QString *brdnames )
196{ 196{
197 scaleHints[ destID ] = scaleHints[ sourceID ]; 197 scaleHints[ destID ] = scaleHints[ sourceID ];
198 gradients[ destID ] = gradients[ sourceID ]; 198 gradients[ destID ] = gradients[ sourceID ];
199 blends[ destID ] = blends[ sourceID ]; 199 blends[ destID ] = blends[ sourceID ];
200 bContrasts[ destID ] = bContrasts[ sourceID ]; 200 bContrasts[ destID ] = bContrasts[ sourceID ];
201 borders[ destID ] = borders[ sourceID ]; 201 borders[ destID ] = borders[ sourceID ];
202 highlights[ destID ] = highlights[ sourceID ]; 202 highlights[ destID ] = highlights[ sourceID ];
203 203
204 if ( grLowColors[ sourceID ] ) 204 if ( grLowColors[ sourceID ] )
205 grLowColors[ destID ] = new QColor( *grLowColors[ sourceID ] ); 205 grLowColors[ destID ] = new QColor( *grLowColors[ sourceID ] );
206 else 206 else
207 grLowColors[ destID ] = NULL; 207 grLowColors[ destID ] = NULL;
208 208
209 if ( grHighColors[ sourceID ] ) 209 if ( grHighColors[ sourceID ] )
210 grHighColors[ destID ] = new QColor( *grHighColors[ sourceID ] ); 210 grHighColors[ destID ] = new QColor( *grHighColors[ sourceID ] );
211 else 211 else
212 grHighColors[ destID ] = NULL; 212 grHighColors[ destID ] = NULL;
213 213
214 if ( colors[ sourceID ] ) 214 if ( colors[ sourceID ] )
215 colors[ destID ] = new QColorGroup( *colors[ sourceID ] ); 215 colors[ destID ] = new QColorGroup( *colors[ sourceID ] );
216 else 216 else
217 colors[ destID ] = NULL; 217 colors[ destID ] = NULL;
218 218
219 // pixmap 219 // pixmap
220 pixnames[ destID ] = pixnames[ sourceID ]; 220 pixnames[ destID ] = pixnames[ sourceID ];
221 duplicate[ destID ] = false; 221 duplicate[ destID ] = false;
222 pixmaps[ destID ] = NULL; 222 pixmaps[ destID ] = NULL;
223 images[ destID ] = NULL; 223 images[ destID ] = NULL;
224 if ( !pixnames[ destID ].isEmpty() ) { 224 if ( !pixnames[ destID ].isEmpty() ) {
225 if ( scaleHints[ sourceID ] == TileScale && blends[ sourceID ] == 0.0 ) { 225 if ( scaleHints[ sourceID ] == TileScale && blends[ sourceID ] == 0.0 ) {
226 pixmaps[ destID ] = pixmaps[ sourceID ]; 226 pixmaps[ destID ] = pixmaps[ sourceID ];
227 duplicate[ destID ] = true; 227 duplicate[ destID ] = true;
228 } 228 }
229 if ( !duplicate[ destID ] ) { 229 if ( !duplicate[ destID ] ) {
230 pixmaps[ destID ] = loadPixmap( pixnames[ destID ] ); 230 pixmaps[ destID ] = loadPixmap( pixnames[ destID ] );
231 if ( scaleHints[ destID ] == TileScale && blends[ destID ] == 0.0 ) 231 if ( scaleHints[ destID ] == TileScale && blends[ destID ] == 0.0 )
232 images[ destID ] = NULL; 232 images[ destID ] = NULL;
233 else 233 else
234 images[ destID ] = loadImage( pixnames[ destID ] ); 234 images[ destID ] = loadImage( pixnames[ destID ] );
235 } 235 }
236 } 236 }
237 237
238 // border pixmap 238 // border pixmap
239 pbDuplicate[ destID ] = false; 239 pbDuplicate[ destID ] = false;
240 pbPixmaps[ destID ] = NULL; 240 pbPixmaps[ destID ] = NULL;
241 pbWidth[ destID ] = pbWidth[ sourceID ]; 241 pbWidth[ destID ] = pbWidth[ sourceID ];
242 brdnames[ destID ] = brdnames[ sourceID ]; 242 brdnames[ destID ] = brdnames[ sourceID ];
243 if ( !brdnames[ destID ].isEmpty() ) { 243 if ( !brdnames[ destID ].isEmpty() ) {
244 pbPixmaps[ destID ] = pbPixmaps[ sourceID ]; 244 pbPixmaps[ destID ] = pbPixmaps[ sourceID ];
245 pbDuplicate[ destID ] = true; 245 pbDuplicate[ destID ] = true;
246 } 246 }
247 247
248 if ( sourceID == ActiveTab && destID == InactiveTab ) 248 if ( sourceID == ActiveTab && destID == InactiveTab )
249 aTabLine = iTabLine; 249 aTabLine = iTabLine;
250 else if ( sourceID == InactiveTab && destID == ActiveTab ) 250 else if ( sourceID == InactiveTab && destID == ActiveTab )
251 iTabLine = aTabLine; 251 iTabLine = aTabLine;
252} 252}
253 253
254void OThemeBase::readConfig( Qt::GUIStyle /*style*/ ) 254void OThemeBase::readConfig( Qt::GUIStyle /*style*/ )
255{ 255{
256#define PREBLEND_ITEMS 12 256#define PREBLEND_ITEMS 12
257 static WidgetType preBlend[] = {Slider, IndicatorOn, IndicatorOff, 257 static WidgetType preBlend[] = {Slider, IndicatorOn, IndicatorOff,
258 ExIndicatorOn, ExIndicatorOff, HScrollDeco, VScrollDeco, HScrollDecoDown, 258 ExIndicatorOn, ExIndicatorOff, HScrollDeco, VScrollDeco, HScrollDecoDown,
259 VScrollDecoDown, ComboDeco, ComboDecoDown, CheckMark}; 259 VScrollDecoDown, ComboDeco, ComboDecoDown, CheckMark};
260 260
261 int i; 261 int i;
262 QString tmpStr; 262 QString tmpStr;
263 QString copyfrom[ WIDGETS ]; 263 QString copyfrom[ WIDGETS ];
264 QString pixnames[ WIDGETS ]; // used for duplicate check 264 QString pixnames[ WIDGETS ]; // used for duplicate check
265 QString brdnames[ WIDGETS ]; 265 QString brdnames[ WIDGETS ];
266 bool loaded[ WIDGETS ]; // used for preloading for CopyWidget 266 bool loaded[ WIDGETS ]; // used for preloading for CopyWidget
267 267
268 if ( configFileName.isEmpty() ) { 268 if ( configFileName.isEmpty() ) {
269 Config cfg ( "qpe" ); 269 Config cfg ( "qpe" );
270 cfg. setGroup ( "Appearance" ); 270 cfg. setGroup ( "Appearance" );
271 271
272 configFileName = cfg. readEntry ( "Theme", "default" ); 272 configFileName = cfg. readEntry ( "Theme", "default" );
273 } 273 }
274 MyConfig config( configFilePath + "/themes/" + configFileName + ".themerc" , Config::File ); 274 MyConfig config( configFilePath + "/themes/" + configFileName + ".themerc" , Config::File );
275 275
276 printf ( "Opened config file: %s\n", ( configFilePath + "/themes/" + configFileName + ".themerc" ). ascii()); 276 printf ( "Opened config file: %s\n", ( configFilePath + "/themes/" + configFileName + ".themerc" ). ascii());
277 277
278 // Are we initalized? 278 // Are we initalized?
279 for ( i = 0; i < INHERIT_ITEMS; ++i ) { 279 for ( i = 0; i < INHERIT_ITEMS; ++i ) {
280 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames ); 280 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames );
281 printf ( "%d [%s]: copy=%s, pix=%s, brd=%s\n", i, widgetEntries [i], copyfrom [i].latin1(), pixnames[i].latin1(),brdnames[i].latin1() ); 281 printf ( "%d [%s]: copy=%s, pix=%s, brd=%s\n", i, widgetEntries [i], copyfrom [i].latin1(), pixnames[i].latin1(),brdnames[i].latin1() );
282 } 282 }
283 for ( ; i < INHERIT_ITEMS*2; ++i ) { 283 for ( ; i < INHERIT_ITEMS*2; ++i ) {
284 if ( config.hasGroup( QString( widgetEntries[ i ] ) ) ) { 284 if ( config.hasGroup( QString( widgetEntries[ i ] ) ) ) {
285 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames ); 285 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames );
286 printf ( "%d [%s]: copy=%s, pix=%s, brd=%s\n", i, widgetEntries [i], copyfrom [i].latin1(), pixnames[i].latin1(),brdnames[i].latin1() ); 286 printf ( "%d [%s]: copy=%s, pix=%s, brd=%s\n", i, widgetEntries [i], copyfrom [i].latin1(), pixnames[i].latin1(),brdnames[i].latin1() );
287 } 287 }
288 else { 288 else {
289 copyfrom [ i ] = widgetEntries[ i - INHERIT_ITEMS ]; 289 copyfrom [ i ] = widgetEntries[ i - INHERIT_ITEMS ];
290 printf ( "%d [%s]: copy=%s\n", i, widgetEntries [i], copyfrom [i].latin1()); 290 printf ( "%d [%s]: copy=%s\n", i, widgetEntries [i], copyfrom [i].latin1());
291 } 291 }
292 } 292 }
293 for ( ; i < WIDGETS; ++i ) { 293 for ( ; i < WIDGETS; ++i ) {
294 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames ); 294 applyResourceGroup( &config, i, copyfrom, pixnames, brdnames );
295 printf ( "%d [%s]: copy=%s, pix=%s, brd=%s\n", i, widgetEntries [i], copyfrom [i].latin1(), pixnames[i].latin1(),brdnames[i].latin1() ); 295 printf ( "%d [%s]: copy=%s, pix=%s, brd=%s\n", i, widgetEntries [i], copyfrom [i].latin1(), pixnames[i].latin1(),brdnames[i].latin1() );
296 } 296 }
297 applyMiscResourceGroup( &config ); 297 applyMiscResourceGroup( &config );
298 298
299 // initalize defaults that may not be read 299 // initalize defaults that may not be read
300 for ( i = 0; i < WIDGETS; ++i ) 300 for ( i = 0; i < WIDGETS; ++i )
301 loaded[ i ] = false; 301 loaded[ i ] = false;
302 btnXShift = btnYShift = focus3DOffset = 0; 302 btnXShift = btnYShift = focus3DOffset = 0;
303 aTabLine = iTabLine = true; 303 aTabLine = iTabLine = true;
304 roundedButton = roundedCombo = roundedSlider = focus3D = false; 304 roundedButton = roundedCombo = roundedSlider = focus3D = false;
305 splitterWidth = 10; 305 splitterWidth = 10;
306 306
307 for ( i = 0; i < WIDGETS; ++i ) { 307 for ( i = 0; i < WIDGETS; ++i ) {
308 readResourceGroup( i, copyfrom, pixnames, brdnames, loaded ); 308 readResourceGroup( i, copyfrom, pixnames, brdnames, loaded );
309 printf ( "%d [%s]: copy=%s, pix=%s, brd=%s, colors=%s\n", i, widgetEntries [i], copyfrom [i].latin1(), pixnames[i].latin1(),brdnames[i].latin1(), (colors[i]?colors[i]->background().name().latin1():"<none)" )); 309 printf ( "%d [%s]: copy=%s, pix=%s, brd=%s, colors=%s\n", i, widgetEntries [i], copyfrom [i].latin1(), pixnames[i].latin1(),brdnames[i].latin1(), (colors[i]?colors[i]->background().name().latin1():"<none)" ));
310 } 310 }
311 311
312 // misc items 312 // misc items
313 readMiscResourceGroup(); 313 readMiscResourceGroup();
314 314
315 // Handle preblend items 315 // Handle preblend items
316 for ( i = 0; i < PREBLEND_ITEMS; ++i ) { 316 for ( i = 0; i < PREBLEND_ITEMS; ++i ) {
317 if ( pixmaps[ preBlend[ i ] ] != NULL && blends[ preBlend[ i ] ] != 0.0 ) 317 if ( pixmaps[ preBlend[ i ] ] != NULL && blends[ preBlend[ i ] ] != 0.0 )
318 blend( preBlend[ i ] ); 318 blend( preBlend[ i ] );
319 } 319 }
320} 320}
321 321
322OThemeBase::OThemeBase( const QString & configFile ) 322OThemeBase::OThemeBase( const QString & configFile )
323 : QWindowsStyle() 323 : QWindowsStyle()
324{ 324{
325 configFilePath = QPEApplication::qpeDir ( ) + "/plugins/styles/"; 325 configFilePath = QPEApplication::qpeDir ( ) + "/plugins/styles/";
326 configFileName = configFile; 326 configFileName = configFile;
327 327
328 readConfig( Qt::WindowsStyle ); 328 readConfig( Qt::WindowsStyle );
329 cache = new OThemeCache( cacheSize ); 329 cache = new OThemeCache( cacheSize );
330} 330}
331 331
332void OThemeBase::applyConfigFile( const QString &/*file*/ ) 332void OThemeBase::applyConfigFile( const QString &/*file*/ )
333{ 333{
334#if 0 334#if 0
335 // handle std color scheme 335 // handle std color scheme
336 Config inConfig( file, Config::File ); 336 Config inConfig( file, Config::File );
337 Config globalConfig ( "qpe" ); 337 Config globalConfig ( "qpe" );
338 338
339 globalConfig. setGroup ( "Apperance" ); 339 globalConfig. setGroup ( "Apperance" );
340 inConfig. setGroup( "General" ); 340 inConfig. setGroup( "General" );
341 341
342 if ( inConfig.hasKey( "foreground" ) ) 342 if ( inConfig.hasKey( "foreground" ) )
343 globalConfig.writeEntry( "Text", inConfig.readEntry( "foreground", " " ) ); 343 globalConfig.writeEntry( "Text", inConfig.readEntry( "foreground", " " ) );
344 if ( inConfig.hasKey( "background" ) ) 344 if ( inConfig.hasKey( "background" ) )
345 globalConfig.writeEntry( "Background", inConfig.readEntry( "background", " " ) ); 345 globalConfig.writeEntry( "Background", inConfig.readEntry( "background", " " ) );
346 if ( inConfig.hasKey( "selectForeground" ) ) 346 if ( inConfig.hasKey( "selectForeground" ) )
347 globalConfig.writeEntry( "HighlightedText", inConfig.readEntry( "selectForeground", " " ) ); 347 globalConfig.writeEntry( "HighlightedText", inConfig.readEntry( "selectForeground", " " ) );
348 if ( inConfig.hasKey( "selectBackground" ) ) 348 if ( inConfig.hasKey( "selectBackground" ) )
349 globalConfig.writeEntry( "Highlight", inConfig.readEntry( "selectBackground", " " ) ); 349 globalConfig.writeEntry( "Highlight", inConfig.readEntry( "selectBackground", " " ) );
350 if ( inConfig.hasKey( "windowForeground" ) ) 350 if ( inConfig.hasKey( "windowForeground" ) )
351 globalConfig.writeEntry( "Text", inConfig.readEntry( "windowForeground", " " ) ); 351 globalConfig.writeEntry( "Text", inConfig.readEntry( "windowForeground", " " ) );
352 if ( inConfig.hasKey( "windowBackground" ) ) 352 if ( inConfig.hasKey( "windowBackground" ) )
353 globalConfig.writeEntry( "Base", inConfig.readEntry( "windowBackground", " " ) ); 353 globalConfig.writeEntry( "Base", inConfig.readEntry( "windowBackground", " " ) );
354 354
355 // Keep track of the current theme so that we can select the right one 355 // Keep track of the current theme so that we can select the right one
356 // in the KControl module. 356 // in the KControl module.
357 globalConfig.writeEntry ( "CurrentTheme", file ); 357 globalConfig.writeEntry ( "CurrentTheme", file );
358 358
359 globalConfig.write(); 359 globalConfig.write();
360#endif 360#endif
361} 361}
362 362
363OThemeBase::~OThemeBase() 363OThemeBase::~OThemeBase()
364{ 364{
365 int i; 365 int i;
366 for ( i = 0; i < WIDGETS; ++i ) { 366 for ( i = 0; i < WIDGETS; ++i ) {
367 if ( !duplicate[ i ] ) { 367 if ( !duplicate[ i ] ) {
368 if ( images[ i ] ) 368 if ( images[ i ] )
369 delete images[ i ]; 369 delete images[ i ];
370 if ( pixmaps[ i ] ) 370 if ( pixmaps[ i ] )
371 delete pixmaps[ i ]; 371 delete pixmaps[ i ];
372 } 372 }
373 if ( !pbDuplicate[ i ] && pbPixmaps[ i ] ) 373 if ( !pbDuplicate[ i ] && pbPixmaps[ i ] )
374 delete pbPixmaps[ i ]; 374 delete pbPixmaps[ i ];
375 if ( colors[ i ] ) 375 if ( colors[ i ] )
376 delete( colors[ i ] ); 376 delete( colors[ i ] );
377 if ( grLowColors[ i ] ) 377 if ( grLowColors[ i ] )
378 delete( grLowColors[ i ] ); 378 delete( grLowColors[ i ] );
379 if ( grHighColors[ i ] ) 379 if ( grHighColors[ i ] )
380 delete( grHighColors[ i ] ); 380 delete( grHighColors[ i ] );
381 } 381 }
382 delete cache; 382 delete cache;
383} 383}
384 384
385QImage* OThemeBase::loadImage( QString &name ) 385QImage* OThemeBase::loadImage( QString &name )
386{ 386{
387 QImage * image = new QImage; 387 QImage * image = new QImage;
388 QString path = configFilePath + "/pixmaps/" + name; 388 QString path = configFilePath + "/pixmaps/" + name;
389 image->load( path ); 389 image->load( path );
390 if ( !image->isNull() ) 390 if ( !image->isNull() )
391 return ( image ); 391 return ( image );
392 qDebug ( "OThemeBase: Unable to load image %s\n", name.ascii ( ) ); 392 qDebug ( "OThemeBase: Unable to load image %s\n", name.ascii ( ) );
393 delete image; 393 delete image;
394 return ( NULL ); 394 return ( NULL );
395} 395}
396 396
397OThemePixmap* OThemeBase::loadPixmap( QString &name ) 397OThemePixmap* OThemeBase::loadPixmap( QString &name )
398{ 398{
399 OThemePixmap * pixmap = new OThemePixmap( false ); 399 OThemePixmap * pixmap = new OThemePixmap( false );
400 QString path = configFilePath + "/pixmaps/" + name; 400 QString path = configFilePath + "/pixmaps/" + name;
401 pixmap->load( path ); 401 pixmap->load( path );
402 if ( !pixmap->isNull() ) 402 if ( !pixmap->isNull() )
403 return pixmap; 403 return pixmap;
404 qDebug ( "OThemeBase: Unable to load pixmap %s\n", name.ascii() ); 404 qDebug ( "OThemeBase: Unable to load pixmap %s\n", name.ascii() );
405 delete pixmap; 405 delete pixmap;
406 return ( NULL ); 406 return ( NULL );
407} 407}
408 408
409OThemePixmap* OThemeBase::scale( int w, int h, WidgetType widget ) 409OThemePixmap* OThemeBase::scale( int w, int h, WidgetType widget )
410{ 410{
411 if ( scaleHints[ widget ] == FullScale ) { 411 if ( scaleHints[ widget ] == FullScale ) {
412 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w || 412 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
413 pixmaps[ widget ] ->height() != h ) { 413 pixmaps[ widget ] ->height() != h ) {
414 OThemePixmap * cachePix = cache->pixmap( w, h, widget ); 414 OThemePixmap * cachePix = cache->pixmap( w, h, widget );
415 if ( cachePix ) { 415 if ( cachePix ) {
416 cachePix = new OThemePixmap( *cachePix ); 416 cachePix = new OThemePixmap( *cachePix );
417 if ( pixmaps[ widget ] ) 417 if ( pixmaps[ widget ] )
418 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 418 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
419 widget ); 419 widget );
420 else 420 else
421 qDebug( "We would have inserted a null pixmap!\n" ); 421 qDebug( "We would have inserted a null pixmap!\n" );
422 pixmaps[ widget ] = cachePix; 422 pixmaps[ widget ] = cachePix;
423 } 423 }
424 else { 424 else {
425 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget ); 425 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget );
426 QImage tmpImg = images[ widget ] ->smoothScale( w, h ); 426 QImage tmpImg = images[ widget ] ->smoothScale( w, h );
427 pixmaps[ widget ] = new OThemePixmap; 427 pixmaps[ widget ] = new OThemePixmap;
428 pixmaps[ widget ] ->convertFromImage( tmpImg ); 428 pixmaps[ widget ] ->convertFromImage( tmpImg );
429 if ( blends[ widget ] != 0.0 ) 429 if ( blends[ widget ] != 0.0 )
430 blend( widget ); 430 blend( widget );
431 } 431 }
432 } 432 }
433 } 433 }
434 else if ( scaleHints[ widget ] == HorizontalScale ) { 434 else if ( scaleHints[ widget ] == HorizontalScale ) {
435 if ( pixmaps[ widget ] ->width() != w ) { 435 if ( pixmaps[ widget ] ->width() != w ) {
436 OThemePixmap * cachePix = cache->horizontalPixmap( w, widget ); 436 OThemePixmap * cachePix = cache->horizontalPixmap( w, widget );
437 if ( cachePix ) { 437 if ( cachePix ) {
438 cachePix = new OThemePixmap( *cachePix ); 438 cachePix = new OThemePixmap( *cachePix );
439 if ( pixmaps[ widget ] ) 439 if ( pixmaps[ widget ] )
440 cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget ); 440 cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget );
441 else 441 else
442 qDebug ( "We would have inserted a null pixmap!\n" ); 442 qDebug ( "We would have inserted a null pixmap!\n" );
443 pixmaps[ widget ] = cachePix; 443 pixmaps[ widget ] = cachePix;
444 } 444 }
445 else { 445 else {
446 cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget ); 446 cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget );
447 QImage tmpImg = images[ widget ] -> 447 QImage tmpImg = images[ widget ] ->
448 smoothScale( w, images[ widget ] ->height() ); 448 smoothScale( w, images[ widget ] ->height() );
449 pixmaps[ widget ] = new OThemePixmap; 449 pixmaps[ widget ] = new OThemePixmap;
450 pixmaps[ widget ] ->convertFromImage( tmpImg ); 450 pixmaps[ widget ] ->convertFromImage( tmpImg );
451 if ( blends[ widget ] != 0.0 ) 451 if ( blends[ widget ] != 0.0 )
452 blend( widget ); 452 blend( widget );
453 } 453 }
454 } 454 }
455 } 455 }
456 else if ( scaleHints[ widget ] == VerticalScale ) { 456 else if ( scaleHints[ widget ] == VerticalScale ) {
457 if ( pixmaps[ widget ] ->height() != h ) { 457 if ( pixmaps[ widget ] ->height() != h ) {
458 OThemePixmap * cachePix = cache->verticalPixmap( w, widget ); 458 OThemePixmap * cachePix = cache->verticalPixmap( w, widget );
459 if ( cachePix ) { 459 if ( cachePix ) {
460 cachePix = new OThemePixmap( *cachePix ); 460 cachePix = new OThemePixmap( *cachePix );
461 if ( pixmaps[ widget ] ) 461 if ( pixmaps[ widget ] )
462 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget ); 462 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget );
463 else 463 else
464 qDebug ( "We would have inserted a null pixmap!\n" ); 464 qDebug ( "We would have inserted a null pixmap!\n" );
465 pixmaps[ widget ] = cachePix; 465 pixmaps[ widget ] = cachePix;
466 } 466 }
467 else { 467 else {
468 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget ); 468 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget );
469 QImage tmpImg = 469 QImage tmpImg =
470 images[ widget ] ->smoothScale( images[ widget ] ->width(), h ); 470 images[ widget ] ->smoothScale( images[ widget ] ->width(), h );
471 pixmaps[ widget ] = new OThemePixmap; 471 pixmaps[ widget ] = new OThemePixmap;
472 pixmaps[ widget ] ->convertFromImage( tmpImg ); 472 pixmaps[ widget ] ->convertFromImage( tmpImg );
473 if ( blends[ widget ] != 0.0 ) 473 if ( blends[ widget ] != 0.0 )
474 blend( widget ); 474 blend( widget );
475 } 475 }
476 } 476 }
477 } 477 }
478 // If blended tile here so the blend is scaled properly 478 // If blended tile here so the blend is scaled properly
479 else if ( scaleHints[ widget ] == TileScale && blends[ widget ] != 0.0 ) { 479 else if ( scaleHints[ widget ] == TileScale && blends[ widget ] != 0.0 ) {
480 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w || 480 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
481 pixmaps[ widget ] ->height() != h ) { 481 pixmaps[ widget ] ->height() != h ) {
482 OThemePixmap * cachePix = cache->pixmap( w, h, widget ); 482 OThemePixmap * cachePix = cache->pixmap( w, h, widget );
483 if ( cachePix ) { 483 if ( cachePix ) {
484 cachePix = new OThemePixmap( *cachePix ); 484 cachePix = new OThemePixmap( *cachePix );
485 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget ); 485 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget );
486 pixmaps[ widget ] = cachePix; 486 pixmaps[ widget ] = cachePix;
487 } 487 }
488 else { 488 else {
489 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget ); 489 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget );
490 QPixmap tile; 490 QPixmap tile;
491 tile.convertFromImage( *images[ widget ] ); 491 tile.convertFromImage( *images[ widget ] );
492 pixmaps[ widget ] = new OThemePixmap; 492 pixmaps[ widget ] = new OThemePixmap;
493 pixmaps[ widget ] ->resize( w, h ); 493 pixmaps[ widget ] ->resize( w, h );
494 QPainter p( pixmaps[ widget ] ); 494 QPainter p( pixmaps[ widget ] );
495 p.drawTiledPixmap( 0, 0, w, h, tile ); 495 p.drawTiledPixmap( 0, 0, w, h, tile );
496 if ( blends[ widget ] != 0.0 ) 496 if ( blends[ widget ] != 0.0 )
497 blend( widget ); 497 blend( widget );
498 } 498 }
499 } 499 }
500 } 500 }
501 return ( pixmaps[ widget ] ); 501 return ( pixmaps[ widget ] );
502} 502}
503 503
504OThemePixmap* OThemeBase::scaleBorder( int w, int h, WidgetType widget ) 504OThemePixmap* OThemeBase::scaleBorder( int w, int h, WidgetType widget )
505{ 505{
506 OThemePixmap * pixmap = NULL; 506 OThemePixmap * pixmap = NULL;
507 if ( !pbPixmaps[ widget ] && !pbWidth[ widget ] ) 507 if ( !pbPixmaps[ widget ] && !pbWidth[ widget ] )
508 return ( NULL ); 508 return ( NULL );
509 pixmap = cache->pixmap( w, h, widget, true ); 509 pixmap = cache->pixmap( w, h, widget, true );
510 if ( pixmap ) { 510 if ( pixmap ) {
511 pixmap = new OThemePixmap( *pixmap ); 511 pixmap = new OThemePixmap( *pixmap );
512 } 512 }
513 else { 513 else {
514 pixmap = new OThemePixmap(); 514 pixmap = new OThemePixmap();
515 pixmap->resize( w, h ); 515 pixmap->resize( w, h );
516 QBitmap mask; 516 QBitmap mask;
517 mask.resize( w, h ); 517 mask.resize( w, h );
518 mask.fill( color0 ); 518 mask.fill( color0 );
519 QPainter mPainter; 519 QPainter mPainter;
520 mPainter.begin( &mask ); 520 mPainter.begin( &mask );
521 521
522 QPixmap *tmp = borderPixmap( widget ) ->border( OThemePixmap::TopLeft ); 522 QPixmap *tmp = borderPixmap( widget ) ->border( OThemePixmap::TopLeft );
523 const QBitmap *srcMask = tmp->mask(); 523 const QBitmap *srcMask = tmp->mask();
524 int bdWidth = tmp->width(); 524 int bdWidth = tmp->width();
525 525
526 bitBlt( pixmap, 0, 0, tmp, 0, 0, bdWidth, bdWidth, 526 bitBlt( pixmap, 0, 0, tmp, 0, 0, bdWidth, bdWidth,
527 Qt::CopyROP, false ); 527 Qt::CopyROP, false );
528 if ( srcMask ) 528 if ( srcMask )
529 bitBlt( &mask, 0, 0, srcMask, 0, 0, bdWidth, bdWidth, 529 bitBlt( &mask, 0, 0, srcMask, 0, 0, bdWidth, bdWidth,
530 Qt::CopyROP, false ); 530 Qt::CopyROP, false );
531 else 531 else
532 mPainter.fillRect( 0, 0, bdWidth, bdWidth, color1 ); 532 mPainter.fillRect( 0, 0, bdWidth, bdWidth, color1 );
533 533
534 534
535 tmp = borderPixmap( widget ) ->border( OThemePixmap::TopRight ); 535 tmp = borderPixmap( widget ) ->border( OThemePixmap::TopRight );
536 srcMask = tmp->mask(); 536 srcMask = tmp->mask();
537 bitBlt( pixmap, w - bdWidth, 0, tmp, 0, 0, bdWidth, 537 bitBlt( pixmap, w - bdWidth, 0, tmp, 0, 0, bdWidth,
538 bdWidth, Qt::CopyROP, false ); 538 bdWidth, Qt::CopyROP, false );
539 if ( srcMask ) 539 if ( srcMask )
540 bitBlt( &mask, w - bdWidth, 0, srcMask, 0, 0, bdWidth, 540 bitBlt( &mask, w - bdWidth, 0, srcMask, 0, 0, bdWidth,
541 bdWidth, Qt::CopyROP, false ); 541 bdWidth, Qt::CopyROP, false );
542 else 542 else
543 mPainter.fillRect( w - bdWidth, 0, bdWidth, bdWidth, color1 ); 543 mPainter.fillRect( w - bdWidth, 0, bdWidth, bdWidth, color1 );
544 544
545 tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomLeft ); 545 tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomLeft );
546 srcMask = tmp->mask(); 546 srcMask = tmp->mask();
547 bitBlt( pixmap, 0, h - bdWidth, tmp, 0, 0, bdWidth, 547 bitBlt( pixmap, 0, h - bdWidth, tmp, 0, 0, bdWidth,
548 bdWidth, Qt::CopyROP, false ); 548 bdWidth, Qt::CopyROP, false );
549 if ( srcMask ) 549 if ( srcMask )
550 bitBlt( &mask, 0, h - bdWidth, srcMask, 0, 0, bdWidth, 550 bitBlt( &mask, 0, h - bdWidth, srcMask, 0, 0, bdWidth,
551 bdWidth, Qt::CopyROP, false ); 551 bdWidth, Qt::CopyROP, false );
552 else 552 else
553 mPainter.fillRect( 0, h - bdWidth, bdWidth, bdWidth, color1 ); 553 mPainter.fillRect( 0, h - bdWidth, bdWidth, bdWidth, color1 );
554 554
555 tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomRight ); 555 tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomRight );
556 srcMask = tmp->mask(); 556 srcMask = tmp->mask();
557 bitBlt( pixmap, w - bdWidth, h - bdWidth, tmp, 0, 0, 557 bitBlt( pixmap, w - bdWidth, h - bdWidth, tmp, 0, 0,
558 bdWidth, bdWidth, Qt::CopyROP, false ); 558 bdWidth, bdWidth, Qt::CopyROP, false );
559 if ( srcMask ) 559 if ( srcMask )
560 bitBlt( &mask, w - bdWidth, h - bdWidth, srcMask, 0, 0, 560 bitBlt( &mask, w - bdWidth, h - bdWidth, srcMask, 0, 0,
561 bdWidth, bdWidth, Qt::CopyROP, false ); 561 bdWidth, bdWidth, Qt::CopyROP, false );
562 else 562 else
563 mPainter.fillRect( w - bdWidth, h - bdWidth, bdWidth, bdWidth, color1 ); 563 mPainter.fillRect( w - bdWidth, h - bdWidth, bdWidth, bdWidth, color1 );
564 564
565 QPainter p; 565 QPainter p;
566 p.begin( pixmap ); 566 p.begin( pixmap );
567 if ( w - bdWidth * 2 > 0 ) { 567 if ( w - bdWidth * 2 > 0 ) {
568 tmp = borderPixmap( widget ) ->border( OThemePixmap::Top ); 568 tmp = borderPixmap( widget ) ->border( OThemePixmap::Top );
569 srcMask = tmp->mask(); 569 srcMask = tmp->mask();
570 p.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *tmp ); 570 p.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *tmp );
571 if ( srcMask ) 571 if ( srcMask )
572 mPainter.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *srcMask ); 572 mPainter.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *srcMask );
573 else 573 else
574 mPainter.fillRect( bdWidth, 0, w - bdWidth * 2, bdWidth, color1 ); 574 mPainter.fillRect( bdWidth, 0, w - bdWidth * 2, bdWidth, color1 );
575 575
576 tmp = borderPixmap( widget ) ->border( OThemePixmap::Bottom ); 576 tmp = borderPixmap( widget ) ->border( OThemePixmap::Bottom );
577 srcMask = tmp->mask(); 577 srcMask = tmp->mask();
578 p.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth, 578 p.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth,
579 *tmp ); 579 *tmp );
580 if ( srcMask ) 580 if ( srcMask )
581 mPainter.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth, *srcMask ); 581 mPainter.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth, *srcMask );
582 else 582 else
583 mPainter.fillRect( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth, 583 mPainter.fillRect( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth,
584 color1 ); 584 color1 );
585 } 585 }
586 if ( h - bdWidth * 2 > 0 ) { 586 if ( h - bdWidth * 2 > 0 ) {
587 tmp = borderPixmap( widget ) ->border( OThemePixmap::Left ); 587 tmp = borderPixmap( widget ) ->border( OThemePixmap::Left );
588 srcMask = tmp->mask(); 588 srcMask = tmp->mask();
589 p.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *tmp ); 589 p.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *tmp );
590 if ( srcMask ) 590 if ( srcMask )
591 mPainter.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *srcMask ); 591 mPainter.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *srcMask );
592 else 592 else
593 mPainter.fillRect( 0, bdWidth, bdWidth, h - bdWidth * 2, color1 ); 593 mPainter.fillRect( 0, bdWidth, bdWidth, h - bdWidth * 2, color1 );
594 594
595 tmp = borderPixmap( widget ) ->border( OThemePixmap::Right ); 595 tmp = borderPixmap( widget ) ->border( OThemePixmap::Right );
596 srcMask = tmp->mask(); 596 srcMask = tmp->mask();
597 p.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, 597 p.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2,
598 *tmp ); 598 *tmp );
599 if ( srcMask ) 599 if ( srcMask )
600 mPainter.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, *srcMask ); 600 mPainter.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, *srcMask );
601 else 601 else
602 mPainter.fillRect( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, color1 ); 602 mPainter.fillRect( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, color1 );
603 } 603 }
604 p.end(); 604 p.end();
605 mPainter.end(); 605 mPainter.end();
606 pixmap->setMask( mask ); 606 pixmap->setMask( mask );
607 cache->insert( pixmap, OThemeCache::FullScale, widget, true ); 607 cache->insert( pixmap, OThemeCache::FullScale, widget, true );
608 if ( !pixmap->mask() ) 608 if ( !pixmap->mask() )
609 qDebug ( "No mask for border pixmap!\n" ); 609 qDebug ( "No mask for border pixmap!\n" );
610 } 610 }
611 return ( pixmap ); 611 return ( pixmap );
612} 612}
613 613
614 614
615OThemePixmap* OThemeBase::blend( WidgetType widget ) 615OThemePixmap* OThemeBase::blend( WidgetType widget )
616{ 616{
617 OGfxEffect::GradientType g; 617 OGfxEffect::GradientType g;
618 switch ( gradients[ widget ] ) { 618 switch ( gradients[ widget ] ) {
619 case GrHorizontal: 619 case GrHorizontal:
620 g = OGfxEffect::HorizontalGradient; 620 g = OGfxEffect::HorizontalGradient;
621 break; 621 break;
622 case GrVertical: 622 case GrVertical:
623 g = OGfxEffect::VerticalGradient; 623 g = OGfxEffect::VerticalGradient;
624 break; 624 break;
625 case GrPyramid: 625 case GrPyramid:
626 g = OGfxEffect::PyramidGradient; 626 g = OGfxEffect::PyramidGradient;
627 break; 627 break;
628 case GrRectangle: 628 case GrRectangle:
629 g = OGfxEffect::RectangleGradient; 629 g = OGfxEffect::RectangleGradient;
630 break; 630 break;
631 case GrElliptic: 631 case GrElliptic:
632 g = OGfxEffect::EllipticGradient; 632 g = OGfxEffect::EllipticGradient;
633 break; 633 break;
634 default: 634 default:
635 g = OGfxEffect::DiagonalGradient; 635 g = OGfxEffect::DiagonalGradient;
636 break; 636 break;
637 } 637 }
638 OGfxEffect::blend( *pixmaps[ widget ], blends[ widget ], *grLowColors[ widget ], 638 OGfxEffect::blend( *pixmaps[ widget ], blends[ widget ], *grLowColors[ widget ],
639 g, false ); 639 g, false );
640 return ( pixmaps[ widget ] ); 640 return ( pixmaps[ widget ] );
641} 641}
642 642
643OThemePixmap* OThemeBase::gradient( int w, int h, WidgetType widget ) 643OThemePixmap* OThemeBase::gradient( int w, int h, WidgetType widget )
644{ 644{
645 if ( gradients[ widget ] == GrVertical ) { 645 if ( gradients[ widget ] == GrVertical ) {
646 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->height() != h ) { 646 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->height() != h ) {
647 OThemePixmap * cachePix = cache->verticalPixmap( h, widget ); 647 OThemePixmap * cachePix = cache->verticalPixmap( h, widget );
648 if ( cachePix ) { 648 if ( cachePix ) {
649 cachePix = new OThemePixmap( *cachePix ); 649 cachePix = new OThemePixmap( *cachePix );
650 if ( pixmaps[ widget ] ) 650 if ( pixmaps[ widget ] )
651 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, 651 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale,
652 widget ); 652 widget );
653 pixmaps[ widget ] = cachePix; 653 pixmaps[ widget ] = cachePix;
654 } 654 }
655 else { 655 else {
656 if ( pixmaps[ widget ] ) 656 if ( pixmaps[ widget ] )
657 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, 657 cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale,
658 widget ); 658 widget );
659 pixmaps[ widget ] = new OThemePixmap; 659 pixmaps[ widget ] = new OThemePixmap;
660 pixmaps[ widget ] ->resize( w, h ); 660 pixmaps[ widget ] ->resize( w, h );
661 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ], 661 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ],
662 *grLowColors[ widget ], 662 *grLowColors[ widget ],
663 OGfxEffect::VerticalGradient ); 663 OGfxEffect::VerticalGradient );
664 } 664 }
665 } 665 }
666 } 666 }
667 else if ( gradients[ widget ] == GrHorizontal ) { 667 else if ( gradients[ widget ] == GrHorizontal ) {
668 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ) { 668 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ) {
669 OThemePixmap * cachePix = cache->horizontalPixmap( w, widget ); 669 OThemePixmap * cachePix = cache->horizontalPixmap( w, widget );
670 if ( cachePix ) { 670 if ( cachePix ) {
671 cachePix = new OThemePixmap( *cachePix ); 671 cachePix = new OThemePixmap( *cachePix );
672 if ( pixmaps[ widget ] ) 672 if ( pixmaps[ widget ] )
673 cache->insert( pixmaps[ widget ], 673 cache->insert( pixmaps[ widget ],
674 OThemeCache::HorizontalScale, widget ); 674 OThemeCache::HorizontalScale, widget );
675 pixmaps[ widget ] = cachePix; 675 pixmaps[ widget ] = cachePix;
676 } 676 }
677 else { 677 else {
678 if ( pixmaps[ widget ] ) 678 if ( pixmaps[ widget ] )
679 cache->insert( pixmaps[ widget ], 679 cache->insert( pixmaps[ widget ],
680 OThemeCache::HorizontalScale, widget ); 680 OThemeCache::HorizontalScale, widget );
681 pixmaps[ widget ] = new OThemePixmap; 681 pixmaps[ widget ] = new OThemePixmap;
682 pixmaps[ widget ] ->resize( w, h ); 682 pixmaps[ widget ] ->resize( w, h );
683 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ], 683 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ],
684 *grLowColors[ widget ], 684 *grLowColors[ widget ],
685 OGfxEffect::HorizontalGradient ); 685 OGfxEffect::HorizontalGradient );
686 } 686 }
687 } 687 }
688 } 688 }
689 else if ( gradients[ widget ] == GrReverseBevel ) { 689 else if ( gradients[ widget ] == GrReverseBevel ) {
690 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w || 690 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
691 pixmaps[ widget ] ->height() != h ) { 691 pixmaps[ widget ] ->height() != h ) {
692 OThemePixmap * cachePix = cache->pixmap( w, h, widget ); 692 OThemePixmap * cachePix = cache->pixmap( w, h, widget );
693 if ( cachePix ) { 693 if ( cachePix ) {
694 cachePix = new OThemePixmap( *cachePix ); 694 cachePix = new OThemePixmap( *cachePix );
695 if ( pixmaps[ widget ] ) 695 if ( pixmaps[ widget ] )
696 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 696 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
697 widget ); 697 widget );
698 pixmaps[ widget ] = cachePix; 698 pixmaps[ widget ] = cachePix;
699 } 699 }
700 else { 700 else {
701 if ( pixmaps[ widget ] ) 701 if ( pixmaps[ widget ] )
702 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 702 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
703 widget ); 703 widget );
704 pixmaps[ widget ] = new OThemePixmap; 704 pixmaps[ widget ] = new OThemePixmap;
705 pixmaps[ widget ] ->resize( w, h ); 705 pixmaps[ widget ] ->resize( w, h );
706 706
707 QPixmap s; 707 QPixmap s;
708 int offset = decoWidth( widget ); 708 int offset = decoWidth( widget );
709 s.resize( w - offset * 2, h - offset * 2 ); 709 s.resize( w - offset * 2, h - offset * 2 );
710 QColor lc( *grLowColors[ widget ] ); 710 QColor lc( *grLowColors[ widget ] );
711 QColor hc( *grHighColors[ widget ] ); 711 QColor hc( *grHighColors[ widget ] );
712 if ( bevelContrast( widget ) ) { 712 if ( bevelContrast( widget ) ) {
713 int bc = bevelContrast( widget ); 713 int bc = bevelContrast( widget );
714 // want single increments, not factors like light()/dark() 714 // want single increments, not factors like light()/dark()
715 lc.setRgb( lc.red() - bc, lc.green() - bc, lc.blue() - bc ); 715 lc.setRgb( lc.red() - bc, lc.green() - bc, lc.blue() - bc );
716 hc.setRgb( hc.red() + bc, hc.green() + bc, hc.blue() + bc ); 716 hc.setRgb( hc.red() + bc, hc.green() + bc, hc.blue() + bc );
717 } 717 }
718 OGfxEffect::gradient( *pixmaps[ widget ], 718 OGfxEffect::gradient( *pixmaps[ widget ],
719 lc, hc, 719 lc, hc,
720 OGfxEffect::DiagonalGradient ); 720 OGfxEffect::DiagonalGradient );
721 OGfxEffect::gradient( s, *grHighColors[ widget ], 721 OGfxEffect::gradient( s, *grHighColors[ widget ],
722 *grLowColors[ widget ], 722 *grLowColors[ widget ],
723 OGfxEffect::DiagonalGradient ); 723 OGfxEffect::DiagonalGradient );
724 bitBlt( pixmaps[ widget ], offset, offset, &s, 0, 0, w - offset * 2, 724 bitBlt( pixmaps[ widget ], offset, offset, &s, 0, 0, w - offset * 2,
725 h - offset * 2, Qt::CopyROP ); 725 h - offset * 2, Qt::CopyROP );
726 } 726 }
727 } 727 }
728 } 728 }
729 else { 729 else {
730 OGfxEffect::GradientType g; 730 OGfxEffect::GradientType g;
731 switch ( gradients[ widget ] ) { 731 switch ( gradients[ widget ] ) {
732 case GrPyramid: 732 case GrPyramid:
733 g = OGfxEffect::PyramidGradient; 733 g = OGfxEffect::PyramidGradient;
734 break; 734 break;
735 case GrRectangle: 735 case GrRectangle:
736 g = OGfxEffect::RectangleGradient; 736 g = OGfxEffect::RectangleGradient;
737 break; 737 break;
738 case GrElliptic: 738 case GrElliptic:
739 g = OGfxEffect::EllipticGradient; 739 g = OGfxEffect::EllipticGradient;
740 break; 740 break;
741 default: 741 default:
742 g = OGfxEffect::DiagonalGradient; 742 g = OGfxEffect::DiagonalGradient;
743 break; 743 break;
744 } 744 }
745 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w || 745 if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
746 pixmaps[ widget ] ->height() != h ) { 746 pixmaps[ widget ] ->height() != h ) {
747 OThemePixmap * cachePix = cache->pixmap( w, h, widget ); 747 OThemePixmap * cachePix = cache->pixmap( w, h, widget );
748 if ( cachePix ) { 748 if ( cachePix ) {
749 cachePix = new OThemePixmap( *cachePix ); 749 cachePix = new OThemePixmap( *cachePix );
750 if ( pixmaps[ widget ] ) 750 if ( pixmaps[ widget ] )
751 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 751 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
752 widget ); 752 widget );
753 pixmaps[ widget ] = cachePix; 753 pixmaps[ widget ] = cachePix;
754 } 754 }
755 else { 755 else {
756 if ( pixmaps[ widget ] ) 756 if ( pixmaps[ widget ] )
757 cache->insert( pixmaps[ widget ], OThemeCache::FullScale, 757 cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
758 widget ); 758 widget );
759 pixmaps[ widget ] = new OThemePixmap; 759 pixmaps[ widget ] = new OThemePixmap;
760 pixmaps[ widget ] ->resize( w, h ); 760 pixmaps[ widget ] ->resize( w, h );
761 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ], 761 OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ],
762 *grLowColors[ widget ], g ); 762 *grLowColors[ widget ], g );
763 } 763 }
764 } 764 }
765 } 765 }
766 return ( pixmaps[ widget ] ); 766 return ( pixmaps[ widget ] );
767} 767}
768 768
769OThemePixmap* OThemeBase::scalePixmap( int w, int h, WidgetType widget ) 769OThemePixmap* OThemeBase::scalePixmap( int w, int h, WidgetType widget )
770{ 770{
771 771
772 if ( gradients[ widget ] && blends[ widget ] == 0.0 ) 772 if ( gradients[ widget ] && blends[ widget ] == 0.0 )
773 return ( gradient( w, h, widget ) ); 773 return ( gradient( w, h, widget ) );
774 774
775 return ( scale( w, h, widget ) ); 775 return ( scale( w, h, widget ) );
776} 776}
777 777
778QColorGroup* OThemeBase::makeColorGroup( QColor &fg, QColor &bg, 778QColorGroup* OThemeBase::makeColorGroup( QColor &fg, QColor &bg,
779 Qt::GUIStyle ) 779 Qt::GUIStyle )
780{ 780{
781 if ( shading == Motif ) { 781 if ( shading == Motif ) {
782 int highlightVal, lowlightVal; 782 int highlightVal, lowlightVal;
783 highlightVal = 100 + ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 16 / 10; 783 highlightVal = 100 + ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 16 / 10;
784 lowlightVal = 100 + ( ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 10 ); 784 lowlightVal = 100 + ( ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 10 );
785 return ( new QColorGroup( fg, bg, bg.light( highlightVal ), 785 return ( new QColorGroup( fg, bg, bg.light( highlightVal ),
786 bg.dark( lowlightVal ), bg.dark( 120 ), 786 bg.dark( lowlightVal ), bg.dark( 120 ),
787 fg, qApp->palette().normal().base() ) ); 787 fg, qApp->palette().normal().base() ) );
788 } 788 }
789 else 789 else
790 return ( new QColorGroup( fg, bg, bg.light( 150 ), bg.dark(), 790 return ( new QColorGroup( fg, bg, bg.light( 150 ), bg.dark(),
791 bg.dark( 120 ), fg, 791 bg.dark( 120 ), fg,
792 qApp->palette().normal().base() ) ); 792 qApp->palette().normal().base() ) );
793} 793}
794 794
795static QColor strToColor ( const QString &str ) 795static QColor strToColor ( const QString &str )
796{ 796{
797 QString str2 = str. stripWhiteSpace ( ); 797 QString str2 = str. stripWhiteSpace ( );
798 798
799 if ( str2 [0] == '#' ) 799 if ( str2 [0] == '#' )
800 return QColor ( str2 ); 800 return QColor ( str2 );
801 else { 801 else {
802 QStringList sl = QStringList::split ( ',', str2 ); 802 QStringList sl = QStringList::split ( ',', str2 );
803 803
804 if ( sl. count ( ) >= 3 ) 804 if ( sl. count ( ) >= 3 )
805 return QColor ( sl [0]. toInt ( ), sl [1]. toInt ( ), sl [2]. toInt ( )); 805 return QColor ( sl [0]. toInt ( ), sl [1]. toInt ( ), sl [2]. toInt ( ));
806 } 806 }
807 return QColor ( 0, 0, 0 ); 807 return QColor ( 0, 0, 0 );
808} 808}
809 809
810 810
811 811
812void OThemeBase::applyMiscResourceGroup( Config *config ) 812void OThemeBase::applyMiscResourceGroup( Config *config )
813{ 813{
814 config-> setGroup ( "Misc" ); 814 config-> setGroup ( "Misc" );
815 QString tmpStr; 815 QString tmpStr;
816 816
817 tmpStr = config->readEntry( "SButtonPosition" ); 817 tmpStr = config->readEntry( "SButtonPosition" );
818 if ( tmpStr == "BottomLeft" ) 818 if ( tmpStr == "BottomLeft" )
819 sbPlacement = SBBottomLeft; 819 sbPlacement = SBBottomLeft;
820 else if ( tmpStr == "BottomRight" ) 820 else if ( tmpStr == "BottomRight" )
821 sbPlacement = SBBottomRight; 821 sbPlacement = SBBottomRight;
822 else { 822 else {
823 if ( tmpStr != "Opposite" && !tmpStr.isEmpty() ) 823 if ( tmpStr != "Opposite" && !tmpStr.isEmpty() )
824 qDebug ( "OThemeBase: Unrecognized sb button option %s, using Opposite.\n", tmpStr.ascii() ); 824 qDebug ( "OThemeBase: Unrecognized sb button option %s, using Opposite.\n", tmpStr.ascii() );
825 sbPlacement = SBOpposite; 825 sbPlacement = SBOpposite;
826 } 826 }
827 tmpStr = config->readEntry( "ArrowType" ); 827 tmpStr = config->readEntry( "ArrowType" );
828 if ( tmpStr == "Small" ) 828 if ( tmpStr == "Small" )
829 arrowStyle = SmallArrow; 829 arrowStyle = SmallArrow;
830 else if ( tmpStr == "3D" ) 830 else if ( tmpStr == "3D" )
831 arrowStyle = MotifArrow; 831 arrowStyle = MotifArrow;
832 else { 832 else {
833 if ( tmpStr != "Normal" && !tmpStr.isEmpty() ) 833 if ( tmpStr != "Normal" && !tmpStr.isEmpty() )
834 qDebug ( "OThemeBase: Unrecognized arrow option %s, using Normal.\n", tmpStr.ascii() ); 834 qDebug ( "OThemeBase: Unrecognized arrow option %s, using Normal.\n", tmpStr.ascii() );
835 arrowStyle = LargeArrow; 835 arrowStyle = LargeArrow;
836 } 836 }
837 tmpStr = config->readEntry( "ShadeStyle" ); 837 tmpStr = config->readEntry( "ShadeStyle" );
838 if ( tmpStr == "Motif" ) 838 if ( tmpStr == "Motif" )
839 shading = Motif; 839 shading = Motif;
840 else if ( tmpStr == "Next" ) 840 else if ( tmpStr == "Next" )
841 shading = Next; 841 shading = Next;
842 else if ( tmpStr == "KDE" ) 842 else if ( tmpStr == "KDE" )
843 shading = KDE; 843 shading = KDE;
844 else 844 else
845 shading = Windows; 845 shading = Windows;
846 846
847 defaultFrame = config->readNumEntry( "FrameWidth", 2 ); 847 defaultFrame = config->readNumEntry( "FrameWidth", 2 );
848 cacheSize = config->readNumEntry( "Cache", 1024 ); 848 cacheSize = config->readNumEntry( "Cache", 1024 );
849 sbExtent = config->readNumEntry( "ScrollBarExtent", 16 ); 849 sbExtent = config->readNumEntry( "ScrollBarExtent", 16 );
850 850
851 config-> setGroup ( "General" ); 851 config-> setGroup ( "General" );
852 852
853 if ( config-> hasKey ( "foreground" )) fgcolor = strToColor ( config-> readEntry ( "foreground" )); 853 if ( config-> hasKey ( "foreground" )) fgcolor = strToColor ( config-> readEntry ( "foreground" ));
854 if ( config-> hasKey ( "background" )) bgcolor = strToColor ( config-> readEntry ( "background" )); 854 if ( config-> hasKey ( "background" )) bgcolor = strToColor ( config-> readEntry ( "background" ));
855 if ( config-> hasKey ( "selectForeground" )) selfgcolor = strToColor ( config-> readEntry ( "selectForeground" )); 855 if ( config-> hasKey ( "selectForeground" )) selfgcolor = strToColor ( config-> readEntry ( "selectForeground" ));
856 if ( config-> hasKey ( "selectBackground" )) selbgcolor = strToColor ( config-> readEntry ( "selectBackground" )); 856 if ( config-> hasKey ( "selectBackground" )) selbgcolor = strToColor ( config-> readEntry ( "selectBackground" ));
857 if ( config-> hasKey ( "windowForeground" )) winfgcolor = strToColor ( config-> readEntry ( "windowForeground" )); 857 if ( config-> hasKey ( "windowForeground" )) winfgcolor = strToColor ( config-> readEntry ( "windowForeground" ));
858 if ( config-> hasKey ( "windowBackground" )) winbgcolor = strToColor ( config-> readEntry ( "windowBackground" )); 858 if ( config-> hasKey ( "windowBackground" )) winbgcolor = strToColor ( config-> readEntry ( "windowBackground" ));
859} 859}
860 860
861void OThemeBase::readMiscResourceGroup() 861void OThemeBase::readMiscResourceGroup()
862{} 862{}
863 863
864void OThemeBase::applyResourceGroup( Config *config, int i, QString *copyfrom, QString *pixnames, QString *brdnames ) 864void OThemeBase::applyResourceGroup( Config *config, int i, QString *copyfrom, QString *pixnames, QString *brdnames )
865{ 865{
866 QString tmpStr; 866 QString tmpStr;
867 867
868 config-> setGroup ( widgetEntries [ i ] ); 868 config-> setGroup ( widgetEntries [ i ] );
869 869
870 tmpStr = config->readEntry( "CopyWidget", "" ); 870 tmpStr = config->readEntry( "CopyWidget", "" );
871 copyfrom [ i ] = tmpStr; 871 copyfrom [ i ] = tmpStr;
872 if ( !tmpStr.isEmpty() ) 872 if ( !tmpStr.isEmpty() )
873 return ; 873 return ;
874 874
875 // Scale hint 875 // Scale hint
876 tmpStr = config->readEntry( "Scale" ); 876 tmpStr = config->readEntry( "Scale" );
877 if ( tmpStr == "Full" ) 877 if ( tmpStr == "Full" )
878 scaleHints [ i ] = FullScale; 878 scaleHints [ i ] = FullScale;
879 else if ( tmpStr == "Horizontal" ) 879 else if ( tmpStr == "Horizontal" )
880 scaleHints [ i ] = HorizontalScale; 880 scaleHints [ i ] = HorizontalScale;
881 else if ( tmpStr == "Vertical" ) 881 else if ( tmpStr == "Vertical" )
882 scaleHints [ i ] = VerticalScale; 882 scaleHints [ i ] = VerticalScale;
883 else { 883 else {
884 if ( tmpStr != "Tile" && !tmpStr.isEmpty() ) 884 if ( tmpStr != "Tile" && !tmpStr.isEmpty() )
885 qDebug ( "OThemeBase: Unrecognized scale option %s, using Tile.\n", tmpStr.ascii() ); 885 qDebug ( "OThemeBase: Unrecognized scale option %s, using Tile.\n", tmpStr.ascii() );
886 scaleHints [ i ] = TileScale; 886 scaleHints [ i ] = TileScale;
887 } 887 }
888 888
889 889
890 // Gradient type 890 // Gradient type
891 tmpStr = config->readEntry( "Gradient" ); 891 tmpStr = config->readEntry( "Gradient" );
892 if ( tmpStr == "Diagonal" ) 892 if ( tmpStr == "Diagonal" )
893 gradients [ i ] = GrDiagonal; 893 gradients [ i ] = GrDiagonal;
894 else if ( tmpStr == "Horizontal" ) 894 else if ( tmpStr == "Horizontal" )
895 gradients [ i ] = GrHorizontal; 895 gradients [ i ] = GrHorizontal;
896 else if ( tmpStr == "Vertical" ) 896 else if ( tmpStr == "Vertical" )
897 gradients [ i ] = GrVertical; 897 gradients [ i ] = GrVertical;
898 else if ( tmpStr == "Pyramid" ) 898 else if ( tmpStr == "Pyramid" )
899 gradients [ i ] = GrPyramid; 899 gradients [ i ] = GrPyramid;
900 else if ( tmpStr == "Rectangle" ) 900 else if ( tmpStr == "Rectangle" )
901 gradients [ i ] = GrRectangle; 901 gradients [ i ] = GrRectangle;
902 else if ( tmpStr == "Elliptic" ) 902 else if ( tmpStr == "Elliptic" )
903 gradients [ i ] = GrElliptic; 903 gradients [ i ] = GrElliptic;
904 else if ( tmpStr == "ReverseBevel" ) 904 else if ( tmpStr == "ReverseBevel" )
905 gradients [ i ] = GrReverseBevel; 905 gradients [ i ] = GrReverseBevel;
906 else { 906 else {
907 if ( tmpStr != "None" && !tmpStr.isEmpty() ) 907 if ( tmpStr != "None" && !tmpStr.isEmpty() )
908 qDebug ( "OThemeBase: Unrecognized gradient option %s, using None.\n", tmpStr.ascii() ); 908 qDebug ( "OThemeBase: Unrecognized gradient option %s, using None.\n", tmpStr.ascii() );
909 gradients [ i ] = GrNone; 909 gradients [ i ] = GrNone;
910 } 910 }
911 911
912 // Blend intensity 912 // Blend intensity
913 blends[ i ] = config->readEntry( "BlendIntensity", "0.0" ).toDouble(); 913 blends[ i ] = config->readEntry( "BlendIntensity", "0.0" ).toDouble();
914 914
915 // Bevel contrast 915 // Bevel contrast
916 bContrasts[ i ] = config->readNumEntry( "BevelContrast", 0 ); 916 bContrasts[ i ] = config->readNumEntry( "BevelContrast", 0 );
917 917
918 // Border width 918 // Border width
919 borders [ i ] = config->readNumEntry( "Border", 1 ); 919 borders [ i ] = config->readNumEntry( "Border", 1 );
920 920
921 // Highlight width 921 // Highlight width
922 highlights [ i ] = config->readNumEntry( "Highlight", 1 ); 922 highlights [ i ] = config->readNumEntry( "Highlight", 1 );
923 923
924 // Gradient low color or blend background 924 // Gradient low color or blend background
925 if ( config->hasKey( "GradientLow" ) && ( gradients[ i ] != GrNone || blends[ i ] != 0.0 )) 925 if ( config->hasKey( "GradientLow" ) && ( gradients[ i ] != GrNone || blends[ i ] != 0.0 ))
926 grLowColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientLow", qApp->palette().normal().background().name() ))); 926 grLowColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientLow", qApp->palette().normal().background().name() )));
927 else 927 else
928 grLowColors[ i ] = NULL; 928 grLowColors[ i ] = NULL;
929 929
930 930
931 // Gradient high color 931 // Gradient high color
932 if ( config->hasKey( "GradientHigh" ) && ( gradients[ i ] != GrNone )) 932 if ( config->hasKey( "GradientHigh" ) && ( gradients[ i ] != GrNone ))
933 grHighColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientHigh", qApp->palette().normal().background().name() ))); 933 grHighColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientHigh", qApp->palette().normal().background().name() )));
934 else 934 else
935 grHighColors[ i ] = NULL; 935 grHighColors[ i ] = NULL;
936 936
937 // Extended color attributes 937 // Extended color attributes
938 if ( config->hasKey( "Foreground" ) || config->hasKey( "Background" ) ) { 938 if ( config->hasKey( "Foreground" ) || config->hasKey( "Background" ) ) {
939 QColor bg = strToColor( config->readEntry( "Background", qApp->palette().normal().background().name() )); 939 QColor bg = strToColor( config->readEntry( "Background", qApp->palette().normal().background().name() ));
940 QColor fg = strToColor( config->readEntry( "Foreground", qApp->palette().normal().foreground().name() )); 940 QColor fg = strToColor( config->readEntry( "Foreground", qApp->palette().normal().foreground().name() ));
941 941
942 colors[ i ] = makeColorGroup( fg, bg, Qt::WindowsStyle ); 942 colors[ i ] = makeColorGroup( fg, bg, Qt::WindowsStyle );
943 } 943 }
944 else 944 else
945 colors[ i ] = NULL; 945 colors[ i ] = NULL;
946 946
947 // Pixmap 947 // Pixmap
948 tmpStr = config->readEntry( "Pixmap", "" ); 948 tmpStr = config->readEntry( "Pixmap", "" );
949 pixnames[ i ] = tmpStr; 949 pixnames[ i ] = tmpStr;
950 duplicate[ i ] = false; 950 duplicate[ i ] = false;
951 pixmaps[ i ] = NULL; 951 pixmaps[ i ] = NULL;
952 images[ i ] = NULL; 952 images[ i ] = NULL;
953 953
954 954
955 // Pixmap border 955 // Pixmap border
956 tmpStr = config->readEntry( "PixmapBorder", "" ); 956 tmpStr = config->readEntry( "PixmapBorder", "" );
957 brdnames[ i ] = tmpStr; 957 brdnames[ i ] = tmpStr;
958 pbDuplicate[ i ] = false; 958 pbDuplicate[ i ] = false;
959 pbPixmaps[ i ] = NULL; 959 pbPixmaps[ i ] = NULL;
960 pbWidth[ i ] = 0; 960 pbWidth[ i ] = 0;
961 if ( !tmpStr.isEmpty() ) { 961 if ( !tmpStr.isEmpty() ) {
962 pbWidth[ i ] = config->readNumEntry( "PixmapBWidth", 0 ); 962 pbWidth[ i ] = config->readNumEntry( "PixmapBWidth", 0 );
963 if ( pbWidth[ i ] == 0 ) { 963 if ( pbWidth[ i ] == 0 ) {
964 qDebug ( "OThemeBase: No border width specified for pixmapped border widget %s\n", widgetEntries[ i ] ); 964 qDebug ( "OThemeBase: No border width specified for pixmapped border widget %s\n", widgetEntries[ i ] );
965 qDebug ( "OThemeBase: Using default of 2.\n" ); 965 qDebug ( "OThemeBase: Using default of 2.\n" );
966 pbWidth[ i ] = 2; 966 pbWidth[ i ] = 2;
967 } 967 }
968 } 968 }
969 969
970 970
971 // Various widget specific settings. This was more efficent when bunched 971 // Various widget specific settings. This was more efficent when bunched
972 // together in the misc group, but this makes an easier to read config. 972 // together in the misc group, but this makes an easier to read config.
973 if ( i == SliderGroove ) 973 if ( i == SliderGroove )
974 roundedSlider = config->readBoolEntry( "SmallGroove", false ); 974 roundedSlider = config->readBoolEntry( "SmallGroove", false );
975 else if ( i == ActiveTab || i == InactiveTab ) 975 else if ( i == ActiveTab ) {
976 aTabLine = iTabLine = config->readBoolEntry( "BottomLine", true ); 976 aTabLine = config->readBoolEntry( "BottomLine", true );
977 }
978 else if ( i == InactiveTab ) {
979 iTabLine = config->readBoolEntry( "BottomLine", true );
980 }
977 else if ( i == Splitter ) 981 else if ( i == Splitter )
978 splitterWidth = config->readNumEntry( "Width", 10 ); 982 splitterWidth = config->readNumEntry( "Width", 10 );
979 else if ( i == ComboBox || i == ComboBoxDown ) { 983 else if ( i == ComboBox || i == ComboBoxDown ) {
980 roundedCombo = config->readBoolEntry( "Round", false ); 984 roundedCombo = config->readBoolEntry( "Round", false );
981 } 985 }
982 else if ( i == PushButton || i == PushButtonDown ) { 986 else if ( i == PushButton || i == PushButtonDown ) {
983 btnXShift = config->readNumEntry( "XShift", 0 ); 987 btnXShift = config->readNumEntry( "XShift", 0 );
984 btnYShift = config->readNumEntry( "YShift", 0 ); 988 btnYShift = config->readNumEntry( "YShift", 0 );
985 focus3D = config->readBoolEntry( "3DFocusRect", false ); 989 focus3D = config->readBoolEntry( "3DFocusRect", false );
986 focus3DOffset = config->readBoolEntry( "3DFocusOffset", 0 ); 990 focus3DOffset = config->readBoolEntry( "3DFocusOffset", 0 );
987 roundedButton = config->readBoolEntry( "Round", false ); 991 roundedButton = config->readBoolEntry( "Round", false );
988 } 992 }
989} 993}
990 994
991 995
992void OThemeBase::readResourceGroup( int i, QString *copyfrom, QString *pixnames, QString *brdnames, 996void OThemeBase::readResourceGroup( int i, QString *copyfrom, QString *pixnames, QString *brdnames,
993 bool *loadArray ) 997 bool *loadArray )
994{ 998{
995 if ( loadArray[ i ] == true ) { 999 if ( loadArray[ i ] == true ) {
996 return ; // already been preloaded. 1000 return ; // already been preloaded.
997 } 1001 }
998 1002
999 int tmpVal; 1003 int tmpVal;
1000 QString tmpStr; 1004 QString tmpStr;
1001 1005
1002 tmpStr = copyfrom [ i ]; 1006 tmpStr = copyfrom [ i ];
1003 if ( !tmpStr.isEmpty() ) { // Duplicate another widget's config 1007 if ( !tmpStr.isEmpty() ) { // Duplicate another widget's config
1004 int sIndex; 1008 int sIndex;
1005 loadArray[ i ] = true; 1009 loadArray[ i ] = true;
1006 for ( sIndex = 0; sIndex < WIDGETS; ++sIndex ) { 1010 for ( sIndex = 0; sIndex < WIDGETS; ++sIndex ) {
1007 if ( tmpStr == widgetEntries[ sIndex ] ) { 1011 if ( tmpStr == widgetEntries[ sIndex ] ) {
1008 if ( !loadArray[ sIndex ] ) // hasn't been loaded yet 1012 if ( !loadArray[ sIndex ] ) // hasn't been loaded yet
1009 readResourceGroup( sIndex, copyfrom, pixnames, brdnames, 1013 readResourceGroup( sIndex, copyfrom, pixnames, brdnames,
1010 loadArray ); 1014 loadArray );
1011 break; 1015 break;
1012 } 1016 }
1013 } 1017 }
1014 if ( loadArray[ sIndex ] ) { 1018 if ( loadArray[ sIndex ] ) {
1015 copyWidgetConfig( sIndex, i, pixnames, brdnames ); 1019 copyWidgetConfig( sIndex, i, pixnames, brdnames );
1016 } 1020 }
1017 else 1021 else
1018 qDebug ( "OThemeBase: Unable to identify source widget for %s\n", widgetEntries[ i ] ); 1022 qDebug ( "OThemeBase: Unable to identify source widget for %s\n", widgetEntries[ i ] );
1019 return ; 1023 return ;
1020 } 1024 }
1021 // special inheritance for disabled arrows (these are tri-state unlike 1025 // special inheritance for disabled arrows (these are tri-state unlike
1022 // the rest of what we handle). 1026 // the rest of what we handle).
1023 for ( tmpVal = DisArrowUp; tmpVal <= DisArrowRight; ++tmpVal ) { 1027 for ( tmpVal = DisArrowUp; tmpVal <= DisArrowRight; ++tmpVal ) {
1024 if ( tmpVal == i ) { 1028 if ( tmpVal == i ) {
1025 tmpStr = pixnames [ i ]; 1029 tmpStr = pixnames [ i ];
1026 if ( tmpStr.isEmpty() ) { 1030 if ( tmpStr.isEmpty() ) {
1027 copyWidgetConfig( ArrowUp + ( tmpVal - DisArrowUp ), i, pixnames, 1031 copyWidgetConfig( ArrowUp + ( tmpVal - DisArrowUp ), i, pixnames,
1028 brdnames ); 1032 brdnames );
1029 return ; 1033 return ;
1030 } 1034 }
1031 } 1035 }
1032 } 1036 }
1033 1037
1034 // Pixmap 1038 // Pixmap
1035 int existing; 1039 int existing;
1036 // Scan for duplicate pixmaps(two identical pixmaps, tile scale, no blend, 1040 // Scan for duplicate pixmaps(two identical pixmaps, tile scale, no blend,
1037 // no pixmapped border) 1041 // no pixmapped border)
1038 if ( !pixnames [ i ].isEmpty() ) { 1042 if ( !pixnames [ i ].isEmpty() ) {
1039 for ( existing = 0; existing < i; ++existing ) { 1043 for ( existing = 0; existing < i; ++existing ) {
1040 if ( pixnames[ i ] == pixnames[ existing ] && scaleHints[ i ] == TileScale && 1044 if ( pixnames[ i ] == pixnames[ existing ] && scaleHints[ i ] == TileScale &&
1041 scaleHints[ existing ] == TileScale && blends[ existing ] == 0.0 && 1045 scaleHints[ existing ] == TileScale && blends[ existing ] == 0.0 &&
1042 blends[ i ] == 0.0 ) { 1046 blends[ i ] == 0.0 ) {
1043 pixmaps[ i ] = pixmaps[ existing ]; 1047 pixmaps[ i ] = pixmaps[ existing ];
1044 duplicate[ i ] = true; 1048 duplicate[ i ] = true;
1045 break; 1049 break;
1046 } 1050 }
1047 } 1051 }
1048 } 1052 }
1049 // load 1053 // load
1050 if ( !duplicate[ i ] && !pixnames[ i ].isEmpty() ) { 1054 if ( !duplicate[ i ] && !pixnames[ i ].isEmpty() ) {
1051 pixmaps[ i ] = loadPixmap( pixnames[ i ] ); 1055 pixmaps[ i ] = loadPixmap( pixnames[ i ] );
1052 // load and save images for scaled/blended widgets for speed. 1056 // load and save images for scaled/blended widgets for speed.
1053 if ( scaleHints[ i ] == TileScale && blends[ i ] == 0.0 ) 1057 if ( scaleHints[ i ] == TileScale && blends[ i ] == 0.0 )
1054 images[ i ] = NULL; 1058 images[ i ] = NULL;
1055 else 1059 else
1056 images[ i ] = loadImage( pixnames[ i ] ); 1060 images[ i ] = loadImage( pixnames[ i ] );
1057 } 1061 }
1058 1062
1059 // Pixmap border 1063 // Pixmap border
1060 if ( !brdnames [ i ]. isEmpty () ) { 1064 if ( !brdnames [ i ]. isEmpty () ) {
1061 // duplicate check 1065 // duplicate check
1062 for ( existing = 0; existing < i; ++existing ) { 1066 for ( existing = 0; existing < i; ++existing ) {
1063 if ( brdnames [i] == brdnames[ existing ] ) { 1067 if ( brdnames [i] == brdnames[ existing ] ) {
1064 pbPixmaps[ i ] = pbPixmaps[ existing ]; 1068 pbPixmaps[ i ] = pbPixmaps[ existing ];
1065 pbDuplicate[ i ] = true; 1069 pbDuplicate[ i ] = true;
1066 break; 1070 break;
1067 } 1071 }
1068 } 1072 }
1069 } 1073 }
1070 // load 1074 // load
1071 if ( !pbDuplicate[ i ] && !brdnames[ i ].isEmpty() ) 1075 if ( !pbDuplicate[ i ] && !brdnames[ i ].isEmpty() )
1072 pbPixmaps[ i ] = loadPixmap( brdnames[ i ] ); 1076 pbPixmaps[ i ] = loadPixmap( brdnames[ i ] );
1073 1077
1074 if ( pbPixmaps[ i ] && !pbDuplicate[ i ] ) 1078 if ( pbPixmaps[ i ] && !pbDuplicate[ i ] )
1075 generateBorderPix( i ); 1079 generateBorderPix( i );
1076 1080
1077 loadArray[ i ] = true; 1081 loadArray[ i ] = true;
1078} 1082}
1079 1083
1080 1084
1081OThemePixmap::OThemePixmap( bool timer ) 1085OThemePixmap::OThemePixmap( bool timer )
1082 : QPixmap() 1086 : QPixmap()
1083{ 1087{
1084 if(timer){ 1088 if(timer){
1085 t = new QTime; 1089 t = new QTime;
1086 t->start(); 1090 t->start();
1087 } 1091 }
1088 else 1092 else
1089 t = NULL; 1093 t = NULL;
1090 int i; 1094 int i;
1091 for ( i = 0; i < 8; ++i ) 1095 for ( i = 0; i < 8; ++i )
1092 b[ i ] = NULL; 1096 b[ i ] = NULL;
1093} 1097}
1094 1098
1095OThemePixmap::OThemePixmap( const OThemePixmap &p ) 1099OThemePixmap::OThemePixmap( const OThemePixmap &p )
1096 : QPixmap( p ) 1100 : QPixmap( p )
1097{ 1101{
1098 if(p.t){ 1102 if(p.t){
1099 t = new QTime; 1103 t = new QTime;
1100 t->start(); 1104 t->start();
1101 } 1105 }
1102 else 1106 else
1103 t = NULL; 1107 t = NULL;
1104 int i; 1108 int i;
1105 for ( i = 0; i < 8; ++i ) 1109 for ( i = 0; i < 8; ++i )
1106 if ( p.b[ i ] ) 1110 if ( p.b[ i ] )
1107 b[ i ] = new QPixmap( *p.b[ i ] ); 1111 b[ i ] = new QPixmap( *p.b[ i ] );
1108 else 1112 else
1109 b[ i ] = NULL; 1113 b[ i ] = NULL;
1110} 1114}
1111 1115
1112 1116
1113 1117
1114OThemePixmap::~OThemePixmap() 1118OThemePixmap::~OThemePixmap()
1115{ 1119{
1116 if(t) 1120 if(t)
1117 delete t; 1121 delete t;
1118 int i; 1122 int i;
1119 for ( i = 0; i < 8; ++i ) 1123 for ( i = 0; i < 8; ++i )
1120 if ( b[ i ] ) 1124 if ( b[ i ] )
1121 delete b[ i ]; 1125 delete b[ i ];
1122} 1126}
1123 1127
1124OThemeCache::OThemeCache( int maxSize, QObject *parent, const char *name ) 1128OThemeCache::OThemeCache( int maxSize, QObject *parent, const char *name )
1125 : QObject( parent, name ) 1129 : QObject( parent, name )
1126{ 1130{
1127 cache.setMaxCost( maxSize * 1024 ); 1131 cache.setMaxCost( maxSize * 1024 );
1128 cache.setAutoDelete( true ); 1132 cache.setAutoDelete( true );
1129 flushTimer.start(300000); // 5 minutes 1133 flushTimer.start(300000); // 5 minutes
1130 connect(&flushTimer, SIGNAL(timeout()), SLOT(flushTimeout())); 1134 connect(&flushTimer, SIGNAL(timeout()), SLOT(flushTimeout()));
1131} 1135}
1132 1136
1133void OThemeCache::flushTimeout() 1137void OThemeCache::flushTimeout()
1134{ 1138{
1135 QIntCacheIterator<OThemePixmap> it( cache ); 1139 QIntCacheIterator<OThemePixmap> it( cache );
1136 while ( it.current() ) { 1140 while ( it.current() ) {
1137 if ( it.current() ->isOld() ) 1141 if ( it.current() ->isOld() )
1138 cache.remove( it.currentKey() ); 1142 cache.remove( it.currentKey() );
1139 else 1143 else
1140 ++it; 1144 ++it;
1141 } 1145 }
1142} 1146}
1143 1147
1144OThemePixmap* OThemeCache::pixmap( int w, int h, int widgetID, bool border, 1148OThemePixmap* OThemeCache::pixmap( int w, int h, int widgetID, bool border,
1145 bool mask ) 1149 bool mask )
1146{ 1150{
1147 1151
1148 kthemeKey key; 1152 kthemeKey key;
1149 key.cacheKey = 0; // shut up, gcc 1153 key.cacheKey = 0; // shut up, gcc
1150 key.data.id = widgetID; 1154 key.data.id = widgetID;
1151 key.data.width = w; 1155 key.data.width = w;
1152 key.data.height = h; 1156 key.data.height = h;
1153 key.data.border = border; 1157 key.data.border = border;
1154 key.data.mask = mask; 1158 key.data.mask = mask;
1155 1159
1156 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey ); 1160 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey );
1157 if ( pix ) 1161 if ( pix )
1158 pix->updateAccessed(); 1162 pix->updateAccessed();
1159 return ( pix ); 1163 return ( pix );
1160} 1164}
1161 1165
1162OThemePixmap* OThemeCache::horizontalPixmap( int w, int widgetID ) 1166OThemePixmap* OThemeCache::horizontalPixmap( int w, int widgetID )
1163{ 1167{
1164 kthemeKey key; 1168 kthemeKey key;
1165 key.cacheKey = 0; // shut up, gcc 1169 key.cacheKey = 0; // shut up, gcc
1166 key.data.id = widgetID; 1170 key.data.id = widgetID;
1167 key.data.width = w; 1171 key.data.width = w;
1168 key.data.height = 0; 1172 key.data.height = 0;
1169 key.data.border = false; 1173 key.data.border = false;
1170 key.data.mask = false; 1174 key.data.mask = false;
1171 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey ); 1175 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey );
1172 if ( pix ) 1176 if ( pix )
1173 pix->updateAccessed(); 1177 pix->updateAccessed();
1174 return ( pix ); 1178 return ( pix );
1175} 1179}
1176 1180
1177OThemePixmap* OThemeCache::verticalPixmap( int h, int widgetID ) 1181OThemePixmap* OThemeCache::verticalPixmap( int h, int widgetID )
1178{ 1182{
1179 kthemeKey key; 1183 kthemeKey key;
1180 key.cacheKey = 0; // shut up, gcc 1184 key.cacheKey = 0; // shut up, gcc
1181 key.data.id = widgetID; 1185 key.data.id = widgetID;
1182 key.data.width = 0; 1186 key.data.width = 0;
1183 key.data.height = h; 1187 key.data.height = h;
1184 key.data.border = false; 1188 key.data.border = false;
1185 key.data.mask = false; 1189 key.data.mask = false;
1186 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey ); 1190 OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey );
1187 if ( pix ) 1191 if ( pix )
1188 pix->updateAccessed(); 1192 pix->updateAccessed();
1189 return ( pix ); 1193 return ( pix );
1190} 1194}
1191 1195
1192bool OThemeCache::insert( OThemePixmap *pixmap, ScaleHint scale, int widgetID, 1196bool OThemeCache::insert( OThemePixmap *pixmap, ScaleHint scale, int widgetID,
1193 bool border, bool mask ) 1197 bool border, bool mask )
1194{ 1198{
1195 kthemeKey key; 1199 kthemeKey key;
1196 key.cacheKey = 0; // shut up, gcc 1200 key.cacheKey = 0; // shut up, gcc
1197 key.data.id = widgetID; 1201 key.data.id = widgetID;
1198 key.data.width = ( scale == FullScale || scale == HorizontalScale ) ? 1202 key.data.width = ( scale == FullScale || scale == HorizontalScale ) ?
1199 pixmap->width() : 0; 1203 pixmap->width() : 0;
1200 key.data.height = ( scale == FullScale || scale == VerticalScale ) ? 1204 key.data.height = ( scale == FullScale || scale == VerticalScale ) ?
1201 pixmap->height() : 0; 1205 pixmap->height() : 0;
1202 key.data.border = border; 1206 key.data.border = border;
1203 key.data.mask = mask; 1207 key.data.mask = mask;
1204 1208
1205 if ( cache.find( ( unsigned long ) key.cacheKey, true ) != NULL ) { 1209 if ( cache.find( ( unsigned long ) key.cacheKey, true ) != NULL ) {
1206 return ( true ); // a pixmap of this scale is already in there 1210 return ( true ); // a pixmap of this scale is already in there
1207 } 1211 }
1208 return ( cache.insert( ( unsigned long ) key.cacheKey, pixmap, 1212 return ( cache.insert( ( unsigned long ) key.cacheKey, pixmap,
1209 pixmap->width() * pixmap->height() * pixmap->depth() / 8 ) ); 1213 pixmap->width() * pixmap->height() * pixmap->depth() / 8 ) );
1210} 1214}
1211 1215
1212//#include "kthemebase.moc" 1216//#include "kthemebase.moc"