diff options
Diffstat (limited to 'kpersonalizer/kstylepage.cpp')
-rw-r--r-- | kpersonalizer/kstylepage.cpp | 584 |
1 files changed, 584 insertions, 0 deletions
diff --git a/kpersonalizer/kstylepage.cpp b/kpersonalizer/kstylepage.cpp new file mode 100644 index 000000000..b634acaff --- /dev/null +++ b/kpersonalizer/kstylepage.cpp @@ -0,0 +1,584 @@ +/*************************************************************************** + kstylepage.cpp - description + ------------------- + begin : Tue May 22 2001 + copyright : (C) 2001 by Ralf Nolden + email : nolden@kde.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#include <stdlib.h> + +#include <qdir.h> +#include <qlabel.h> +#include <qlistview.h> +#include <qcolor.h> +#include <qstylefactory.h> +#include <qpixmapcache.h> +#include <qstyle.h> +#include <qobjectlist.h> + +#include <kconfig.h> +#include <kstandarddirs.h> +#include <kapplication.h> +#include <kglobal.h> +#include <kdebug.h> +#include <kdesktopfile.h> +#include <klocale.h> +#include <klistview.h> +#include <kipc.h> +#include <ksimpleconfig.h> +#include <dcopclient.h> +#include <kstyle.h> +#include <kicontheme.h> +#include <kiconloader.h> + +#include "stylepreview.h" +#include "kstylepage.h" + +KStylePage::KStylePage(QWidget *parent, const char *name ) : KStylePageDlg(parent,name) { + + px_stylesSidebar->setPixmap(UserIcon("step4.png")); + + klv_styles->addColumn(i18n("Style")); + klv_styles->addColumn( i18n( "Description" ) ); + klv_styles->setAllColumnsShowFocus(true); + + kde = new QListViewItem( klv_styles); + kde->setText( 0, QPixmap::defaultDepth() > 8 ? i18n( "Plastik" ) : i18n( "Light" ) ); + kde->setText( 1, i18n( "KDE default style" ) ); + + classic = new QListViewItem( klv_styles); + classic->setText( 0, i18n( "KDE Classic" ) ); + classic->setText( 1, i18n( "Classic KDE style" ) ); + + keramik = new QListViewItem( klv_styles ); + keramik->setText( 0, i18n( "Keramik" ) ); + keramik->setText( 1, i18n( "The previous default style" ) ); + + cde = new QListViewItem( klv_styles); + cde->setText( 0, i18n( "Sunshine" ) ); + cde->setText( 1, i18n( "A very common desktop" ) ); + + win = new QListViewItem( klv_styles ); + win->setText( 0, i18n( "Redmond" ) ); + win->setText( 1, i18n( "A style from the northwest of the USA" ) ); + + platinum = new QListViewItem( klv_styles ); + platinum->setText( 0, i18n( "Platinum" ) ); + platinum->setText( 1, i18n( "The platinum style" ) ); + + connect(klv_styles, SIGNAL(selectionChanged()), + this, SLOT(slotCurrentChanged())); + + // Note: if the default is changed here it needs to be changed in kdebase/kwin/plugins.cpp + // and kdebase/kwin/kcmkwin/kwindecoration/kwindecoration.cpp as well. + defaultKWinStyle = QPixmap::defaultDepth() > 8 ? "kwin_plastik" : "kwin_quartz"; + appliedStyle = NULL; + + getAvailability(); + getUserDefaults(); + initColors(); +} + +KStylePage::~KStylePage(){ + delete ckwin; + delete appliedStyle; +} + +void KStylePage::save(bool curSettings){ + kdDebug() << "KStylePage::save()" << endl; + // First, the style, then the colors as styles overwrite color settings + saveStyle(curSettings); + saveColors(curSettings); + saveKWin(curSettings); + saveIcons(curSettings); + liveUpdate(); +} + +/** save the widget-style */ +void KStylePage::saveStyle(bool curSettings){ + QString style = curSettings ? currentStyle : origStyle; + KConfig cfg( "kdeglobals" ); + cfg.setGroup("General"); + cfg.writeEntry( "widgetStyle", style, true, true ); + cfg.sync(); + kdDebug() << "KStylePage::saveStyle(): " << style << endl; +} + +/** save the KWin-style*/ +void KStylePage::saveKWin(bool curSettings){ + QString kwin = origKWinStyle; + if(curSettings) { + KDesktopFile* kdf = 0L; + KStandardDirs* kstd = KGlobal::dirs(); + if (cde->isSelected() && kwin_cde_exist) + kdf = new KDesktopFile(kstd->findResource("data", "kwin/cde.desktop")); + else if (win->isSelected() && kwin_win_exist) + kdf = new KDesktopFile(kstd->findResource("data", "kwin/redmond.desktop")); + else if (platinum->isSelected() && kwin_system_exist) + kdf = new KDesktopFile(kstd->findResource("data", "kwin/system.desktop")); + else if (keramik->isSelected() && kwin_keramik_exist) + kdf = new KDesktopFile(kstd->findResource("data", "kwin/keramik.desktop")); + else if (kde->isSelected()) { + if (kwin_plastik_exist && (QColor::numBitPlanes() > 8)) + kdf = new KDesktopFile(kstd->findResource("data", "kwin/plastik.desktop")); + else if (kwin_quartz_exist) + kdf = new KDesktopFile(kstd->findResource("data", "kwin/quartz.desktop")); + } + + if (kdf) { + kdf->setGroup("Desktop Entry"); + kwin = kdf->readEntry("X-KDE-Library", defaultKWinStyle); + delete kdf; + } + else { + // if we get here classic is selected (there's no .desktop file for the + // kde2 kwin style), or none of the other kwin styles were found. + kwin = "kwin_default"; + } + } + ckwin->writeEntry("PluginLib", kwin); + ckwin->sync(); + kdDebug() << "KStylePage::saveKWin(): " << kwin << endl; +} + +/** Save the color-scheme */ +void KStylePage::saveColors(bool curSettings){ + struct colorSet* toSave; + if(curSettings) + toSave=¤tColors; // set the color struct to save as the style colors + else + toSave=&usrColors; + + // the GLOBAL config entries must be taken from the kcsrc file and written to it. Use the default values + // equals that the file is <default> which is no file. TODO: use the default values in that case (kde selected) + KConfig *config = KGlobal::config(); + config->setGroup( "General" ); + config->writeEntry("foreground", toSave->foreground, true, true); + config->writeEntry("background", toSave->background, true, true); + config->writeEntry("windowForeground", toSave->windowForeground, true, true); + config->writeEntry("windowBackground", toSave->windowBackground, true, true); + config->writeEntry("selectForeground", toSave->selectForeground, true, true); + config->writeEntry("selectBackground", toSave->selectBackground, true, true); + config->writeEntry("buttonForeground", toSave->buttonForeground, true, true); + config->writeEntry("buttonBackground", toSave->buttonBackground, true, true); + config->writeEntry("linkColor", toSave->linkColor, true, true); + config->writeEntry("visitedLinkColor", toSave->visitedLinkColor, true, true); + + // set to the WM group, *only* the KGlobal one, a kcsrc file only has the group "Color Scheme" hmpf... + config->setGroup( "WM" ); + config->writeEntry("activeForeground", toSave->activeForeground, true, true); + config->writeEntry("inactiveForeground", toSave->inactiveForeground, true, true); + config->writeEntry("activeBackground", toSave->activeBackground, true, true); + config->writeEntry("inactiveBackground", toSave->inactiveBackground, true, true); + config->writeEntry("activeBlend", toSave->activeBlend, true, true); + config->writeEntry("inactiveBlend", toSave->inactiveBlend, true, true); + config->writeEntry("activeTitleBtnBg", toSave->activeTitleBtnBg, true, true); + config->writeEntry("inactiveTitleBtnBg", toSave->inactiveTitleBtnBg, true, true); + config->writeEntry("alternateBackground", toSave->alternateBackground, true, true); + + //////////////////////////////////////////////////// + // KDE-1.x support + KSimpleConfig *kconfig = + new KSimpleConfig( QDir::homeDirPath() + "/.kderc" ); + kconfig->setGroup( "General" ); + kconfig->writeEntry("background", toSave->background ); + kconfig->writeEntry("selectBackground", toSave->selectBackground ); + kconfig->writeEntry("foreground", toSave->foreground ); + kconfig->writeEntry("windowForeground", toSave->windowForeground ); + kconfig->writeEntry("windowBackground", toSave->windowBackground ); + kconfig->writeEntry("selectForeground", toSave->selectForeground ); + kconfig->sync(); + delete kconfig; + + config->setGroup("KDE"); + // write the color scheme filename and the contrast, default 7, otherwise from file + config->writeEntry("colorScheme", toSave->colorFile,true, true); + config->writeEntry("contrast", toSave->contrast, true, true); + config->sync(); + + // background color changes + KConfig kdesktop("kdesktoprc"); + kdesktop.setGroup("Desktop0"); // we only need to set one desktop + + kdesktop.writeEntry("BackgroundMode", toSave->bgMode); + kdesktop.writeEntry("Color1", toSave->usrCol1); + kdesktop.writeEntry("Color2", toSave->usrCol2); + kdesktop.sync(); + kdDebug() << "KStylePage::saveColors(): colorFile: " << toSave->colorFile << endl; +} + +/** save the icon-theme*/ +void KStylePage::saveIcons(bool curSettings) { + QString theme = origIcons; + if (curSettings) { + if ( (kde->isSelected() || platinum->isSelected() || keramik->isSelected()) + && icon_crystalsvg_exist) + theme = "crystalsvg"; + else if ( (classic->isSelected() || cde->isSelected() || win->isSelected()) + && (QColor::numBitPlanes() > 8) && icon_kdeclassic_exist) + theme = "kdeclassic"; + else if ( (classic->isSelected() || cde->isSelected() || win->isSelected()) + && (QColor::numBitPlanes() <= 8) && icon_Locolor_exist) + theme = "Locolor"; + } + // save, what we got + KGlobal::config()->setGroup("Icons"); + KGlobal::config()->writeEntry("Theme", theme, true, true); + KIconTheme icontheme(theme); + const char * const groups[] = { "Desktop", "Toolbar", "MainToolbar", "Small", 0L }; + for (KIcon::Group i=KIcon::FirstGroup; i<KIcon::LastGroup; i++) { + if (groups[i] == 0L) + break; + KGlobal::config()->setGroup(QString::fromLatin1(groups[i]) + "Icons"); + KGlobal::config()->writeEntry("Size", icontheme.defaultSize(i)); + } + KGlobal::config()->sync(); + kdDebug() << "KStylePage::saveIcons(): " << theme << endl; +} + +/** called whenever the selection in the listview changes */ +void KStylePage::slotCurrentChanged() { + // fill the currentColors-struct with the selected color-scheme + getColors(¤tColors, true); + // fill the currentStyle-string with the selected style-name + changeCurrentStyle(); + switchPrevStyle(); +} + +void KStylePage::changeCurrentStyle() { + // set the style + if (cde->isSelected() && cde_exist) { + currentStyle="Motif"; + } + else if (win->isSelected() && win_exist) { + currentStyle="Windows"; + } + else if (platinum->isSelected() && platinum_exist) { + currentStyle="Platinum"; + } + else if (keramik->isSelected() && kde_plastik_exist) { + currentStyle="Keramik"; + } + else if (classic->isSelected()) { + // Use the highcolor style if the display supports it + if ( (QColor::numBitPlanes() > 8) && kde_hc_exist ) { + currentStyle="HighColor"; + } + else if (kde_def_exist) { + currentStyle="Default"; + } + } + else if (kde->isSelected()) { + // Use the plastik style if the display supports it + if ( (QColor::numBitPlanes() > 8) && kde_plastik_exist ) { + currentStyle="Plastik"; + } + else if (kde_light_exist) { + currentStyle="Light, 3rd revision"; + } + // We should never get here + else if (kde_def_exist) { + currentStyle="Default"; + } + } + // update the preview-widget + kdDebug() << "KStylePage::changeCurrentStyle(): "<< currentStyle << endl; +} + +/** to be connected to the OS page. Catches + * either KDE, CDE, win or mac and pre-sets the style. + */ +void KStylePage::presetStyle(const QString& style){ + kdDebug() << "KStylePage::presetStyle(): "<< style << endl; + if(style=="KDE") { + if (kde_plastik_exist) + klv_styles->setSelected(kde,true); + else if (kde_hc_exist || kde_def_exist) + klv_styles->setSelected(classic,true); + } + else if(style=="CDE" && cde_exist) + klv_styles->setSelected(cde,true); + else if(style=="win" && win_exist) + klv_styles->setSelected(win,true); + else if(style=="mac") { + klv_styles->setSelected(platinum,true); + } +} + +/** set the defaults for this page */ +void KStylePage::setDefaults(){ +} + +/** Fill a colorSet with a colorfile, or the default. */ +void KStylePage::getColors(colorSet *set, bool colorfile ){ + KConfig* config; + bool deleteConfig = false; + // get the color scheme file and go to the color scheme group + if(colorfile){ + KGlobal::dirs()->addResourceType("colors", KStandardDirs::kde_default("data")+"kdisplay/color-schemes"); + // set the style + if (kde->isSelected()) { + set->bgMode="Flat"; + set->usrCol1.setNamedColor("#003082"); + set->usrCol2.setNamedColor("#6C8BB9"); + set->colorFile="<default>"; + } + else if(classic->isSelected()){ + set->bgMode="VerticalGradient"; + set->usrCol1.setNamedColor ("#1E72A0"); + set->usrCol2.setNamedColor ("#C0C0C0"); + set->colorFile=locate("colors", "KDETwo.kcsrc"); + } + else if(keramik->isSelected()){ + set->bgMode="VerticalGradient"; + set->usrCol1.setNamedColor ("#1E72A0"); + set->usrCol2.setNamedColor ("#C0C0C0"); + set->colorFile=locate("colors","Keramik.kcsrc"); + } + else if(cde->isSelected()){ + set->bgMode="Flat"; + set->usrCol1.setNamedColor("#718BA5"); + set->usrCol2.setNamedColor ("#C0C0C0"); + set->colorFile=locate("colors","SolarisCDE.kcsrc"); + } + else if(win->isSelected()){ + set->bgMode="Flat"; + set->usrCol1.setNamedColor("#008183"); + set->usrCol2.setNamedColor ("#C0C0C0"); + set->colorFile=locate("colors","Windows2000.kcsrc"); + } + else if(platinum->isSelected()){ + set->bgMode="VerticalGradient"; + set->usrCol1.setNamedColor("#2A569D"); + set->usrCol2.setNamedColor("#6C8BB9"); + set->colorFile=locate("colors","EveX.kcsrc"); + } + set->contrast=7; + config = new KSimpleConfig(set->colorFile, true); + config->setGroup("Color Scheme"); + kdDebug() << "KStylePage::getColors(): schemefile: " << set->colorFile << endl; + deleteConfig = true; + } + else { + KConfig kdesktop("kdesktoprc"); + kdesktop.setGroup("Desktop0"); + // set Background (userSettings if available, else default) + set->bgMode=kdesktop.readEntry("BackgroundMode", "Flat"); + QColor tmp1("#003082"); + QColor tmp2("#C0C0C0"); + set->usrCol1=kdesktop.readColorEntry("Color1", &tmp1); + set->usrCol2=kdesktop.readColorEntry("Color2", &tmp2); + // write the color scheme filename and the contrast, default 7, otherwise from file + config=KGlobal::config(); + config->setGroup("KDE"); + set->colorFile=config->readEntry("colorScheme", "<default>"); + set->contrast=config->readNumEntry("contrast", 7); + config->setGroup( "General" ); + kdDebug() << "KStylePage::getColors(): schemefile: "<< set->colorFile << endl; + } + set->foreground=config->readColorEntry( "foreground", &black ); + set->background=config->readColorEntry( "background", &widget ); + set->windowForeground=config->readColorEntry( "windowForeground", &black ); + set->windowBackground=config->readColorEntry( "windowBackground", &white ); + set->selectForeground=config->readColorEntry( "selectForeground", &white ); + set->selectBackground=config->readColorEntry( "selectBackground", &kde34Blue ); + set->buttonForeground=config->readColorEntry( "buttonForeground", &black ); + set->buttonBackground=config->readColorEntry( "buttonBackground", &button ); + set->linkColor=config->readColorEntry( "linkColor", &link ); + set->visitedLinkColor=config->readColorEntry( "visitedLinkColor", &visitedLink ); + // it's necessary to set the group, when reading from globalrc + if(!colorfile) + config->setGroup( "WM" ); + set->activeForeground=config->readColorEntry("activeForeground", &white); + set->inactiveForeground=config->readColorEntry("inactiveForeground", &inactiveForeground); + set->activeBackground=config->readColorEntry("activeBackground", &activeBackground); + set->inactiveBackground=config->readColorEntry("inactiveBackground", &inactiveBackground); + set->activeBlend=config->readColorEntry("activeBlend", &activeBlend); + set->inactiveBlend=config->readColorEntry("inactiveBlend", &inactiveBackground); + set->activeTitleBtnBg=config->readColorEntry("activeTitleBtnBg", &activeTitleBtnBg); + set->inactiveTitleBtnBg=config->readColorEntry("inactiveTitleBtnBg", &inactiveTitleBtnBg); + set->alternateBackground=config->readColorEntry("alternateBackground", &alternateBackground); + if ( deleteConfig) + delete config; +} + +/** Test widget- and kwin- styles for availability */ +void KStylePage::getAvailability() { + // test, wich styles are available + kde_keramik_exist = kde_hc_exist = kde_def_exist = cde_exist + = kde_plastik_exist = win_exist = platinum_exist = false; + QStringList styles = QStyleFactory::keys(); + for (QStringList::iterator it = styles.begin(); it != styles.end(); it++) { + if (*it == "Keramik") kde_keramik_exist = true; + else if (*it == "HighColor") kde_hc_exist = true; + else if (*it == "Default") kde_def_exist = true; + else if (*it == "Plastik") kde_plastik_exist = true; + else if (*it == "Motif") cde_exist = true; + else if (*it == "Windows") win_exist = true; + else if (*it == "Platinum") platinum_exist = true; + else if (*it == "Light, 3rd revision") kde_light_exist = true; + } + // and disable the ListItems, if they are not. + if ( !(kde_plastik_exist || kde_light_exist) ) kde->setVisible(false); + if ( !(kde_hc_exist || kde_def_exist) ) classic->setVisible(false); + if (!kde_keramik_exist || QPixmap::defaultDepth() <= 8) keramik->setVisible(false); + if (!cde_exist) cde->setVisible(false); + if (!win_exist) win->setVisible(false); + if (!platinum_exist) platinum->setVisible(false); + + // test, wich KWin-styles are available + kwin_keramik_exist = kwin_system_exist = kwin_plastik_exist + = kwin_default_exist = kwin_win_exist + = kwin_cde_exist = kwin_quartz_exist = false; + KStandardDirs* kstd = KGlobal::dirs(); + if (!kstd->findResource("data", "kwin/keramik.desktop").isNull()) + kwin_keramik_exist = true; + if (!kstd->findResource("data", "kwin/plastik.desktop").isNull()) + kwin_plastik_exist = true; + if (!kstd->findResource("data", "kwin/system.desktop").isNull()) + kwin_system_exist = true; + if (!kstd->findResource("data", "kwin/redmond.desktop").isNull()) + kwin_win_exist = true; + if (!kstd->findResource("data", "kwin/cde.desktop").isNull()) + kwin_cde_exist = true; + if (!kstd->findResource("data", "kwin/quartz.desktop").isNull()) + kwin_quartz_exist = true; + kwin_default_exist = true; // we can't check for a .desktop-file for the old default because there is none + + // check, wich Icon-themes are available + icon_crystalsvg_exist = icon_kdeclassic_exist = icon_Locolor_exist = false; + QStringList icons(KIconTheme::list()); + for (QStringList::iterator it=icons.begin(); it != icons.end(); it++) { + KIconTheme icontheme(*it); + if (icontheme.isHidden() || !icontheme.isValid()) continue; + if (*it == "crystalsvg") icon_crystalsvg_exist = true; + else if (*it == "kdeclassic") icon_kdeclassic_exist = true; + else if (*it == "Locolor") icon_Locolor_exist = true; + } +} + +/** get the user's former settings */ +void KStylePage::getUserDefaults() { + // Get the user's current widget-style + KGlobal::config()->setGroup("General"); + origStyle = KGlobal::config()->readEntry( "widgetStyle", KStyle::defaultStyle() ); + + // get the user's current KWin-style + ckwin = new KConfig("kwinrc"); + ckwin->setGroup("Style"); + origKWinStyle = ckwin->readEntry("PluginLib", defaultKWinStyle); + + // get the users current colors + getColors(&usrColors, false); + + // Get the user's current iconset + KGlobal::config()->setGroup("Icons"); + origIcons = KGlobal::config()->readEntry("Theme"); + + kdDebug() << "KStylePage::getUserDefaults(): style: " << origStyle << endl; + kdDebug() << "KStylePage::getUserDefaults(): KWinStyle: " << origKWinStyle << endl; + kdDebug() << "KStylePage::getUserDefaults(): Colors: " << usrColors.colorFile << endl; + kdDebug() << "KStylePage::getUserDefaults(): Icons: " << origIcons << endl; +} + +/** initialize KDE default color values */ +void KStylePage::initColors() { + widget.setRgb(239, 239, 239); + kde34Blue.setRgb(103,141,178); + inactiveBackground.setRgb(157,170,186); + activeBackground.setRgb(65,142,220); + inactiveForeground.setRgb(221,221,221); + activeBlend.setRgb(107,145,184); + activeTitleBtnBg.setRgb(127,158,200); + inactiveTitleBtnBg.setRgb(167,181,199); + alternateBackground.setRgb(237,244,249); + + if (QPixmap::defaultDepth() > 8) + button.setRgb(221, 223, 228); + else + button.setRgb(220, 220, 220); + + link.setRgb(0, 0, 238); + visitedLink.setRgb(82, 24, 139); +} + +/** live-update the system */ +void KStylePage::liveUpdate() { + // tell all apps about the changed icons + for (int i=0; i<KIcon::LastGroup; i++) { + KIPC::sendMessageAll(KIPC::IconChanged, i); + } + // tell all apps about the changed style + KIPC::sendMessageAll(KIPC::StyleChanged); + // color palette changes + KIPC::sendMessageAll(KIPC::PaletteChanged); + // kwin-style + kapp->dcopClient()->send("kwin*", "", "reconfigure()", ""); + // kdesktop-background + kapp->dcopClient()->send("kdesktop", "KBackgroundIface", "configure()", ""); +} + +/** show the previewWidget styled with the selected one */ +void KStylePage::switchPrevStyle() { + QStyle* style = QStyleFactory::create(currentStyle); + if (!style) return; + + stylePreview->unsetPalette(); + QPalette palette = createPalette(); + style->polish(palette); + stylePreview->setPalette(palette); + + // Prevent Qt from wrongly caching radio button images + QPixmapCache::clear(); + // go ahead + setStyleRecursive( stylePreview, palette, style ); + // this flickers, but reliably draws the widgets corretly. + stylePreview->resize( stylePreview->sizeHint() ); + + delete appliedStyle; + appliedStyle = style; +} + +void KStylePage::setStyleRecursive(QWidget* w, QPalette &palette, QStyle* s) { + // Apply the new style. + w->setStyle(s); + // Recursively update all children. + const QObjectList *children = w->children(); + if (!children) + return; + // Apply the style to each child widget. + QPtrListIterator<QObject> childit(*children); + QObject *child; + while ((child = childit.current()) != 0) { + ++childit; + if (child->isWidgetType()) + setStyleRecursive((QWidget *) child, palette, s); + } +} + +/** create a QPalette of our current colorset */ +QPalette KStylePage::createPalette() { + colorSet *cc = ¤tColors; + QColorGroup disabledgrp(cc->windowForeground, cc->background, cc->background.light(150), + cc->background.dark(), cc->background.dark(120), cc->background.dark(120), + cc->windowBackground); + QColorGroup colgrp(cc->windowForeground, cc->background, cc->background.light(150), + cc->background.dark(), cc->background.dark(120), cc->foreground, + cc->windowBackground); + colgrp.setColor(QColorGroup::Highlight, cc->selectBackground); + colgrp.setColor(QColorGroup::HighlightedText, cc->selectForeground); + colgrp.setColor(QColorGroup::Button, cc->buttonBackground); + colgrp.setColor(QColorGroup::ButtonText, cc->buttonForeground); + return QPalette( colgrp, disabledgrp, colgrp); +} + +#include "kstylepage.moc" |