00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
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
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"