• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kdeui

kconfigdialog.cpp

Go to the documentation of this file.
00001 /*
00002  *  This file is part of the KDE libraries
00003  *  Copyright (C) 2003 Benjamin C Meyer (ben+kdelibs at meyerhome dot net)
00004  *  Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
00005  *  Copyright (C) 2004 Michael Brade <brade@kde.org>
00006  *
00007  *  This library is free software; you can redistribute it and/or
00008  *  modify it under the terms of the GNU Library General Public
00009  *  License as published by the Free Software Foundation; either
00010  *  version 2 of the License, or (at your option) any later version.
00011  *
00012  *  This library is distributed in the hope that it will be useful,
00013  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  *  Library General Public License for more details.
00016  *
00017  *  You should have received a copy of the GNU Library General Public License
00018  *  along with this library; see the file COPYING.LIB.  If not, write to
00019  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00020  *  Boston, MA 02110-1301, USA.
00021  */
00022 #include "kconfigdialog.h"
00023 
00024 #include <kconfigskeleton.h>
00025 #include <kconfigdialogmanager.h>
00026 #include <klocale.h>
00027 #include <kiconloader.h>
00028 #include <kdebug.h>
00029 
00030 #include <qlayout.h>
00031 #include <qvbox.h>
00032 #include <qmap.h>
00033 
00034 QAsciiDict<KConfigDialog> KConfigDialog::openDialogs;
00035 
00036 // This class is here purly so we don't break binary compatibility down the road.
00037 class KConfigDialog::KConfigDialogPrivate
00038 {
00039 public:
00040   KConfigDialogPrivate(KDialogBase::DialogType t)
00041   : shown(false), type(t), manager(0) { }
00042 
00043   bool shown;
00044   KDialogBase::DialogType type;
00045   KConfigDialogManager *manager;
00046   QMap<QWidget *, KConfigDialogManager *> managerForPage;
00047 };
00048 
00049 KConfigDialog::KConfigDialog( QWidget *parent, const char *name,
00050           KConfigSkeleton *config,
00051           DialogType dialogType,
00052           int dialogButtons,
00053           ButtonCode defaultButton,
00054           bool modal ) :
00055     KDialogBase( dialogType, Qt::WStyle_DialogBorder,
00056           parent, name, modal, i18n("Configure"), dialogButtons, defaultButton ),
00057     d(new KConfigDialogPrivate(dialogType))
00058 {
00059   if ( name ) {
00060     openDialogs.insert(name, this);
00061   } else {
00062     QCString genericName;
00063     genericName.sprintf("SettingsDialog-%p", this);
00064     openDialogs.insert(genericName, this);
00065     setName(genericName);
00066   }
00067 
00068   connect(this, SIGNAL(okClicked()), this, SLOT(updateSettings()));
00069   connect(this, SIGNAL(applyClicked()), this, SLOT(updateSettings()));
00070   connect(this, SIGNAL(applyClicked()), this, SLOT(updateButtons()));
00071   connect(this, SIGNAL(defaultClicked()), this, SLOT(updateWidgetsDefault()));
00072   connect(this, SIGNAL(defaultClicked()), this, SLOT(updateButtons()));
00073 
00074   d->manager = new KConfigDialogManager(this, config);
00075   setupManagerConnections(d->manager);
00076 
00077   enableButton(Apply, false);
00078 }
00079 
00080 KConfigDialog::~KConfigDialog()
00081 {
00082   openDialogs.remove(name());
00083   delete d;
00084 }
00085 
00086 void KConfigDialog::addPage(QWidget *page,
00087                                 const QString &itemName,
00088                                 const QString &pixmapName,
00089                                 const QString &header,
00090                                 bool manage)
00091 {
00092   addPageInternal(page, itemName, pixmapName, header);
00093   if(manage)
00094     d->manager->addWidget(page);
00095 }
00096 
00097 void KConfigDialog::addPage(QWidget *page,
00098                                 KConfigSkeleton *config,
00099                                 const QString &itemName,
00100                                 const QString &pixmapName,
00101                                 const QString &header)
00102 {
00103   addPageInternal(page, itemName, pixmapName, header);
00104   d->managerForPage[page] = new KConfigDialogManager(page, config);
00105   setupManagerConnections(d->managerForPage[page]);
00106 }
00107 
00108 void KConfigDialog::addPageInternal(QWidget *page,
00109                                         const QString &itemName,
00110                                         const QString &pixmapName,
00111                                         const QString &header)
00112 {
00113   if(d->shown)
00114   {
00115     kdDebug(240) << "KConfigDialog::addPage: can not add a page after the dialog has been shown.";
00116     return;
00117   }
00118   switch(d->type)
00119   {
00120     case TreeList:
00121     case IconList:
00122     case Tabbed: {
00123       QVBox *frame = addVBoxPage(itemName, header, SmallIcon(pixmapName, 32));
00124       frame->setSpacing( 0 );
00125       frame->setMargin( 0 );
00126       page->reparent(((QWidget*)frame), 0, QPoint());
00127     }
00128     break;
00129 
00130     case Swallow:
00131     {
00132       page->reparent(this, 0, QPoint());
00133       setMainWidget(page);
00134     }
00135     break;
00136 
00137     case Plain:
00138     {
00139       QFrame *main = plainPage();
00140       QVBoxLayout *topLayout = new QVBoxLayout( main, 0, 0 );
00141       page->reparent(((QWidget*)main), 0, QPoint());
00142       topLayout->addWidget( page );
00143     }
00144     break;
00145 
00146     default:
00147       kdDebug(240) << "KConfigDialog::addpage: unknown type.";
00148   }
00149 }
00150 
00151 void KConfigDialog::setupManagerConnections(KConfigDialogManager *manager)
00152 {
00153   connect(manager, SIGNAL(settingsChanged()), this, SLOT(settingsChangedSlot()));
00154   connect(manager, SIGNAL(widgetModified()), this, SLOT(updateButtons()));
00155 
00156   connect(this, SIGNAL(okClicked()), manager, SLOT(updateSettings()));
00157   connect(this, SIGNAL(applyClicked()), manager, SLOT(updateSettings()));
00158   connect(this, SIGNAL(defaultClicked()), manager, SLOT(updateWidgetsDefault()));
00159 }
00160 
00161 KConfigDialog* KConfigDialog::exists(const char* name)
00162 {
00163   return openDialogs.find(name);
00164 }
00165 
00166 bool KConfigDialog::showDialog(const char* name)
00167 {
00168   KConfigDialog *dialog = exists(name);
00169   if(dialog)
00170     dialog->show();
00171   return (dialog != NULL);
00172 }
00173 
00174 void KConfigDialog::updateButtons()
00175 {
00176   static bool only_once = false;
00177   if (only_once) return;
00178   only_once = true;
00179 
00180   QMap<QWidget *, KConfigDialogManager *>::iterator it;
00181 
00182   bool has_changed = d->manager->hasChanged() || hasChanged();
00183   for (it = d->managerForPage.begin();
00184           it != d->managerForPage.end() && !has_changed;
00185           ++it)
00186   {
00187     has_changed |= (*it)->hasChanged();
00188   }
00189 
00190   enableButton(Apply, has_changed);
00191 
00192   bool is_default = d->manager->isDefault() && isDefault();
00193   for (it = d->managerForPage.begin();
00194           it != d->managerForPage.end() && is_default;
00195           ++it)
00196   {
00197     is_default &= (*it)->isDefault();
00198   }
00199 
00200   enableButton(Default, !is_default);
00201 
00202   emit widgetModified();
00203   only_once = false;
00204 }
00205 
00206 void KConfigDialog::settingsChangedSlot()
00207 {
00208   // Update the buttons
00209   updateButtons();
00210   emit settingsChanged();
00211   emit settingsChanged(name());
00212 }
00213 
00214 void KConfigDialog::show()
00215 {
00216   QMap<QWidget *, KConfigDialogManager *>::iterator it;
00217 
00218   updateWidgets();
00219   d->manager->updateWidgets();
00220   for (it = d->managerForPage.begin(); it != d->managerForPage.end(); ++it)
00221     (*it)->updateWidgets();
00222 
00223   bool has_changed = d->manager->hasChanged() || hasChanged();
00224   for (it = d->managerForPage.begin();
00225           it != d->managerForPage.end() && !has_changed;
00226           ++it)
00227   {
00228     has_changed |= (*it)->hasChanged();
00229   }
00230 
00231   enableButton(Apply, has_changed);
00232 
00233   bool is_default = d->manager->isDefault() && isDefault();
00234   for (it = d->managerForPage.begin();
00235           it != d->managerForPage.end() && is_default;
00236           ++it)
00237   {
00238     is_default &= (*it)->isDefault();
00239   }
00240 
00241   enableButton(Default, !is_default);
00242   d->shown = true;
00243   KDialogBase::show();
00244 }
00245 
00246 void KConfigDialog::updateSettings()
00247 {
00248 }
00249 
00250 void KConfigDialog::updateWidgets()
00251 {
00252 }
00253 
00254 void KConfigDialog::updateWidgetsDefault()
00255 {
00256 }
00257 
00258 
00259 #include "kconfigdialog.moc"

kdeui

Skip menu "kdeui"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal