4
* Copyright (c) 2000 Matthias Elter <elter@kde.org>
5
* Copyright (c) 2000 Aaron J. Seigo <aseigo@olympusproject.org>
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
21
#include <qcheckbox.h>
23
#include <qradiobutton.h>
26
#include <kcolorbutton.h>
27
#include <kstandarddirs.h>
30
#include <kiconeffect.h>
31
#include <kfiledialog.h>
32
#include <kmessagebox.h>
33
#include <klineedit.h>
36
#include "advancedDialog.h"
37
#include "lookandfeeltab_impl.h"
38
#include "lookandfeeltab_impl.moc"
43
LookAndFeelTab::LookAndFeelTab( QWidget *parent, const char* name )
44
: LookAndFeelTabBase (parent, name)
46
connect(m_zoom_cb, SIGNAL(clicked()), SIGNAL(changed()));
47
connect(m_showToolTips, SIGNAL(clicked()), SIGNAL(changed()));
49
connect(m_kmenuTile, SIGNAL(activated(int)), SIGNAL(changed()));
50
connect(m_desktopTile, SIGNAL(activated(int)), SIGNAL(changed()));
51
connect(m_browserTile, SIGNAL(activated(int)), SIGNAL(changed()));
52
connect(m_urlTile, SIGNAL(activated(int)), SIGNAL(changed()));
53
connect(m_exeTile, SIGNAL(activated(int)), SIGNAL(changed()));
54
connect(m_wlTile, SIGNAL(activated(int)), SIGNAL(changed()));
56
connect(m_kmenuTile, SIGNAL(activated(int)), SLOT(kmenuTileChanged(int)));
57
connect(m_desktopTile, SIGNAL(activated(int)), SLOT(desktopTileChanged(int)));
58
connect(m_browserTile, SIGNAL(activated(int)), SLOT(browserTileChanged(int)));
59
connect(m_urlTile, SIGNAL(activated(int)), SLOT(urlTileChanged(int)));
60
connect(m_exeTile, SIGNAL(activated(int)), SLOT(exeTileChanged(int)));
61
connect(m_wlTile, SIGNAL(activated(int)), SLOT(wlTileChanged(int)));
63
connect(m_kmenuColor, SIGNAL(changed(const QColor&)), SIGNAL(changed()));
64
connect(m_desktopColor, SIGNAL(changed(const QColor&)), SIGNAL(changed()));
65
connect(m_browserColor, SIGNAL(changed(const QColor&)), SIGNAL(changed()));
66
connect(m_urlColor, SIGNAL(changed(const QColor&)), SIGNAL(changed()));
67
connect(m_exeColor, SIGNAL(changed(const QColor&)), SIGNAL(changed()));
68
connect(m_wlColor, SIGNAL(changed(const QColor&)), SIGNAL(changed()));
70
connect(m_transparent, SIGNAL(toggled(bool)), SIGNAL(changed()));
71
connect(m_backgroundImage, SIGNAL(toggled(bool)), SIGNAL(changed()));
72
connect(m_colorizeImage, SIGNAL(toggled(bool)), SIGNAL(changed()));
73
connect(m_colorizeImage, SIGNAL(toggled(bool)), SLOT(browseTheme()));
75
connect(m_backgroundInput->lineEdit(), SIGNAL(lostFocus()), SLOT(browseTheme()));
76
m_backgroundInput->setFilter(KImageIO::pattern(KImageIO::Reading));
77
m_backgroundInput->setCaption(i18n("Select Image File"));
79
connect(m_showToolTips, SIGNAL(clicked()), SIGNAL(changed()));
84
void LookAndFeelTab::browseTheme()
86
browseTheme(m_backgroundInput->url());
89
void LookAndFeelTab::browseTheme(const QString& newtheme)
91
if (newtheme.isEmpty())
93
m_backgroundInput->clear();
94
m_backgroundLabel->setPixmap(QPixmap());
99
previewBackground(newtheme, true);
102
void LookAndFeelTab::launchAdvancedDialog()
104
advancedDialog* dialog = new advancedDialog(this, "advancedDialog");
109
void LookAndFeelTab::enableTransparency( bool enable )
111
bool b = m_backgroundImage->isChecked();
113
m_backgroundImage->setDisabled( enable );
114
m_backgroundInput->setDisabled( enable || !b );
115
m_backgroundLabel->setDisabled( enable || !b );
116
m_colorizeImage->setDisabled( enable || !b );
119
void LookAndFeelTab::previewBackground(const QString& themepath, bool isNew)
121
QString theme = themepath;
123
theme = locate("data", "kicker/" + theme);
125
QImage tmpImg(theme);
128
tmpImg = tmpImg.smoothScale(m_backgroundLabel->contentsRect().width(),
129
m_backgroundLabel->contentsRect().height());
130
if (m_colorizeImage->isChecked())
132
theme_preview.convertFromImage(tmpImg);
133
if(!theme_preview.isNull()) {
134
m_backgroundInput->lineEdit()->setText(theme);
135
m_backgroundLabel->setPixmap(theme_preview);
142
KMessageBox::error(this,
143
i18n("Error loading theme image file.\n\n%1\n%2")
144
.arg(theme, themepath));
145
m_backgroundInput->clear();
146
m_backgroundLabel->setPixmap(QPixmap());
149
void LookAndFeelTab::colorize(QImage& image)
151
// mercilessly ripped from the k menu side image colorizing
152
KConfig *config = KGlobal::config();
153
config->setGroup("WM");
154
QColor color = palette().active().highlight();
155
QColor activeTitle = config->readColorEntry("activeBackground", &color);
156
QColor inactiveTitle = config->readColorEntry("inactiveBackground", &color);
158
// figure out which color is most suitable for recoloring to
159
int h1, s1, v1, h2, s2, v2, h3, s3, v3;
160
activeTitle.hsv(&h1, &s1, &v1);
161
inactiveTitle.hsv(&h2, &s2, &v2);
162
palette().active().background().hsv(&h3, &s3, &v3);
164
if ( (kAbs(h1-h3)+kAbs(s1-s3)+kAbs(v1-v3) < kAbs(h2-h3)+kAbs(s2-s3)+kAbs(v2-v3)) &&
165
((kAbs(h1-h3)+kAbs(s1-s3)+kAbs(v1-v3) < 32) || (s1 < 32)) && (s2 > s1))
166
color = inactiveTitle;
170
// limit max/min brightness
172
color.rgb(&r, &g, &b);
173
int gray = qGray(r, g, b);
175
r = (r - (gray - 180) < 0 ? 0 : r - (gray - 180));
176
g = (g - (gray - 180) < 0 ? 0 : g - (gray - 180));
177
b = (b - (gray - 180) < 0 ? 0 : b - (gray - 180));
178
} else if (gray < 76) {
179
r = (r + (76 - gray) > 255 ? 255 : r + (76 - gray));
180
g = (g + (76 - gray) > 255 ? 255 : g + (76 - gray));
181
b = (b + (76 - gray) > 255 ? 255 : b + (76 - gray));
183
color.setRgb(r, g, b);
184
KIconEffect::colorize(image, color, 1.0);
187
void LookAndFeelTab::load()
189
KConfig c(KickerConfig::configName(), false, false);
191
c.setGroup("General");
193
bool use_theme = c.readBoolEntry("UseBackgroundTheme", true);
194
QString theme = c.readPathEntry("BackgroundTheme", "wallpapers/default.png").stripWhiteSpace();
196
bool transparent = c.readBoolEntry( "Transparent", false );
198
m_backgroundImage->setChecked(use_theme);
199
m_backgroundInput->setEnabled(use_theme);
200
m_backgroundLabel->setEnabled(use_theme);
201
m_colorizeImage->setChecked(c.readBoolEntry("ColorizeBackground", false));
202
m_colorizeImage->setEnabled(use_theme);
203
m_backgroundInput->lineEdit()->setText( QString::null );
204
m_transparent->setChecked( transparent );
205
m_backgroundLabel->clear();
206
if (theme.length() > 0)
208
previewBackground(theme, false);
211
m_showToolTips->setChecked( c.readBoolEntry( "ShowToolTips", true ) );
213
c.setGroup("buttons");
215
bool zoom = c.readBoolEntry("EnableIconZoom", false);
216
m_zoom_cb->setChecked(zoom);
219
c.setGroup("buttons");
221
m_kmenuTile->setCurrentItem(0);
222
m_desktopTile->setCurrentItem(0);
223
m_urlTile->setCurrentItem(0);
224
m_browserTile->setCurrentItem(0);
225
m_exeTile->setCurrentItem(0);
226
m_wlTile->setCurrentItem(0);
227
m_kmenuColor->setEnabled(false);
228
m_desktopColor->setEnabled(false);
229
m_urlColor->setEnabled(false);
230
m_browserColor->setEnabled(false);
231
m_exeColor->setEnabled(false);
232
m_wlColor->setEnabled(false);
233
if (c.readBoolEntry("EnableTileBackground", false))
235
c.setGroup("button_tiles");
237
if (c.readBoolEntry("EnableKMenuTiles", false))
239
tile = c.readEntry("KMenuTile", "solid_blue");
240
m_kmenuTile->setCurrentItem(m_tilename.findIndex(tile));
241
m_kmenuColor->setColor(c.readColorEntry("KMenuTileColor"));
242
m_kmenuColor->setEnabled(tile == "Colorize");
245
if (c.readBoolEntry("EnableDesktopButtonTiles", false))
247
tile = c.readEntry("DesktopButtonTile", "solid_orange");
248
m_desktopTile->setCurrentItem(m_tilename.findIndex(tile));
249
m_desktopColor->setColor(c.readColorEntry("KMenuTileColor"));
250
m_desktopColor->setEnabled(tile == "Colorize");
253
if (c.readBoolEntry("EnableURLTiles", false))
255
tile = c.readEntry("URLTile", "solid_gray");
256
m_urlTile->setCurrentItem(m_tilename.findIndex(tile));
257
m_urlColor->setColor(c.readColorEntry("KMenuTileColor"));
258
m_urlColor->setEnabled(tile == "Colorize");
261
if (c.readBoolEntry("EnableBrowserTiles", false))
263
tile = c.readEntry("BrowserTile", "solid_green");
264
m_browserTile->setCurrentItem(m_tilename.findIndex(tile));
265
m_browserColor->setColor(c.readColorEntry("KMenuTileColor"));
266
m_browserColor->setEnabled(tile == "Colorize");
269
if (c.readBoolEntry("EnableExeTiles", false))
271
tile = c.readEntry("ExeTile", "solid_red");
272
m_exeTile->setCurrentItem(m_tilename.findIndex(tile));
273
m_exeColor->setColor(c.readColorEntry("KMenuTileColor"));
274
m_exeColor->setEnabled(tile == "Colorize");
277
if (c.readBoolEntry("EnableWindowListTiles", false))
279
tile = c.readEntry("WindowListTile", "solid_green");
280
m_wlTile->setCurrentItem(m_tilename.findIndex(tile));
281
m_wlColor->setColor(c.readColorEntry("KMenuTileColor"));
282
m_wlColor->setEnabled(tile == "Colorize");
285
enableTransparency( transparent );
288
void LookAndFeelTab::save()
290
KConfig c(KickerConfig::configName(), false, false);
292
c.setGroup("General");
293
c.writeEntry("UseBackgroundTheme", m_backgroundImage->isChecked());
294
c.writeEntry("ColorizeBackground", m_colorizeImage->isChecked());
295
c.writeEntry("Transparent", m_transparent->isChecked());
296
c.writePathEntry("BackgroundTheme", m_backgroundInput->url());
297
c.writeEntry( "ShowToolTips", m_showToolTips->isChecked() );
299
c.setGroup("button_tiles");
300
bool enableTiles = false;
301
int tile = m_kmenuTile->currentItem();
305
c.writeEntry("EnableKMenuTiles", true);
306
c.writeEntry("KMenuTile", m_tilename[m_kmenuTile->currentItem()]);
307
c.writeEntry("KMenuTileColor", m_kmenuColor->color());
311
c.writeEntry("EnableKMenuTiles", false);
314
tile = m_desktopTile->currentItem();
318
c.writeEntry("EnableDesktopButtonTiles", true);
319
c.writeEntry("DesktopButtonTile", m_tilename[m_desktopTile->currentItem()]);
320
c.writeEntry("DesktopButtonTileColor", m_desktopColor->color());
324
c.writeEntry("EnableDesktopButtonTiles", false);
327
tile = m_urlTile->currentItem();
331
c.writeEntry("EnableURLTiles", tile > 0);
332
c.writeEntry("URLTile", m_tilename[m_urlTile->currentItem()]);
333
c.writeEntry("URLTileColor", m_urlColor->color());
337
c.writeEntry("EnableURLTiles", false);
340
tile = m_browserTile->currentItem();
344
c.writeEntry("EnableBrowserTiles", tile > 0);
345
c.writeEntry("BrowserTile", m_tilename[m_browserTile->currentItem()]);
346
c.writeEntry("BrowserTileColor", m_browserColor->color());
350
c.writeEntry("EnableBrowserTiles", false);
353
tile = m_exeTile->currentItem();
357
c.writeEntry("EnableExeTiles", tile > 0);
358
c.writeEntry("ExeTile", m_tilename[m_exeTile->currentItem()]);
359
c.writeEntry("ExeTileColor", m_exeColor->color());
363
c.writeEntry("EnableExeTiles", false);
366
tile = m_wlTile->currentItem();
370
c.writeEntry("EnableWindowListTiles", tile > 0);
371
c.writeEntry("WindowListTile", m_tilename[m_wlTile->currentItem()]);
372
c.writeEntry("WindowListTileColor", m_wlColor->color());
376
c.writeEntry("EnableWindowListTiles", false);
379
c.setGroup("buttons");
380
c.writeEntry("EnableTileBackground", enableTiles);
381
c.writeEntry("EnableIconZoom", m_zoom_cb->isChecked());
386
void LookAndFeelTab::defaults()
388
m_zoom_cb->setChecked(false);
389
m_showToolTips->setChecked(true);
391
m_kmenuTile->setCurrentItem(0);
392
m_urlTile->setCurrentItem(0);
393
m_browserTile->setCurrentItem(0);
394
m_exeTile->setCurrentItem(0);
395
m_wlTile->setCurrentItem(0);
396
m_desktopTile->setCurrentItem(0);
398
m_kmenuColor->setColor(QColor());
399
m_kmenuColor->setEnabled(false);
400
m_urlColor->setColor(QColor());
401
m_urlColor->setEnabled(false);
402
m_desktopColor->setColor(QColor());
403
m_desktopColor->setEnabled(false);
404
m_browserColor->setColor(QColor());
405
m_browserColor->setEnabled(false);
406
m_wlColor->setColor(QColor());
407
m_wlColor->setEnabled(false);
408
m_exeColor->setColor(QColor());
409
m_exeColor->setEnabled(false);
411
QString theme = "wallpapers/default.png";
413
m_backgroundImage->setChecked(true);
414
m_transparent->setChecked(false);
415
m_backgroundInput->lineEdit()->setText(theme);
416
m_backgroundLabel->clear();
417
m_colorizeImage->setChecked(true);
419
m_backgroundInput->setEnabled(true);
420
m_backgroundLabel->setEnabled(true);
421
m_colorizeImage->setEnabled(true);
422
previewBackground(theme, false);
425
void LookAndFeelTab::fillTileCombos()
427
/* m_kmenuTile->clear();
428
m_kmenuTile->insertItem(i18n("Default"));
429
m_desktopTile->clear();
430
m_desktopTile->insertItem(i18n("Default"));
432
m_urlTile->insertItem(i18n("Default"));
433
m_browserTile->clear();
434
m_browserTile->insertItem(i18n("Default"));
436
m_exeTile->insertItem(i18n("Default"));
438
m_wlTile->insertItem(i18n("Default"));*/
440
m_tilename << "" << "Colorize";
442
QStringList list = KGlobal::dirs()->findAllResources("tiles","*_tiny_up.png");
445
for (QStringList::Iterator it = list.begin(); it != list.end(); ++it)
447
QString tile = (*it);
450
tile = fi.fileName();
451
tile.truncate(tile.find("_tiny_up.png"));
454
// Transform tile to words with title case
455
// The same is done when generating messages for translation
456
QStringList words = QStringList::split(QRegExp("[_ ]"), tile);
457
for (QStringList::iterator w = words.begin(); w != words.end(); w++)
458
(*w)[0] = (*w)[0].upper();
459
tile = i18n(words.join(" ").utf8());
461
m_kmenuTile->insertItem(pix, tile);
462
m_desktopTile->insertItem(pix, tile);
463
m_urlTile->insertItem(pix, tile);
464
m_browserTile->insertItem(pix, tile);
465
m_exeTile->insertItem(pix, tile);
466
m_wlTile->insertItem(pix, tile);
468
if (pix.height() > minHeight)
470
minHeight = pix.height();
475
m_kmenuTile->setMinimumHeight(minHeight);
476
m_desktopTile->setMinimumHeight(minHeight);
477
m_urlTile->setMinimumHeight(minHeight);
478
m_browserTile->setMinimumHeight(minHeight);
479
m_exeTile->setMinimumHeight(minHeight);
480
m_wlTile->setMinimumHeight(minHeight);
483
void LookAndFeelTab::kmenuTileChanged(int i)
485
m_kmenuColor->setEnabled(i == 1);
488
void LookAndFeelTab::desktopTileChanged(int i)
490
m_desktopColor->setEnabled(i == 1);
493
void LookAndFeelTab::browserTileChanged(int i)
495
m_browserColor->setEnabled(i == 1);
498
void LookAndFeelTab::urlTileChanged(int i)
500
m_urlColor->setEnabled(i == 1);
503
void LookAndFeelTab::exeTileChanged(int i)
505
m_exeColor->setEnabled(i == 1);
508
void LookAndFeelTab::wlTileChanged(int i)
510
m_wlColor->setEnabled(i == 1);