|
|
|
/*
|
|
|
|
* This file is part of the KDE libraries
|
|
|
|
* Copyright (C) 2003 Benjamin C Meyer (ben+tdelibs at meyerhome dot net)
|
|
|
|
* Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
|
|
|
|
* Copyright (C) 2004 Michael Brade <brade@kde.org>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public License
|
|
|
|
* along with this library; see the file COPYING.LIB. If not, write to
|
|
|
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
|
|
* Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* KConfigDialog derivative allowing for a multi-level hierarchical TreeList.
|
|
|
|
* Differences from KConfigDialog:
|
|
|
|
* - Use TQStringList instead of TQString for the item name(s) in addPage and
|
|
|
|
* addPageInternal, thus calling the respective KDialogBase methods which
|
|
|
|
* allow specifying a path from which the TreeList hierarchy is constructed.
|
|
|
|
* - Use 16x16 icons in the TreeList.
|
|
|
|
* - Fill a new int m_lastAddedIndex with the pageIndex() of a new page added
|
|
|
|
* with addPageInternal, and offer a public interface int lastAddedIndex().
|
|
|
|
* See the KConfigDialog reference for detailed documentation.
|
|
|
|
*
|
|
|
|
* begin: Nov 22 2005
|
|
|
|
* copyright: (C) 2005-2006 by Eike Hein, KConfigDialog developers
|
|
|
|
* email: hein@kde.org
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "konviconfigdialog.h"
|
|
|
|
|
|
|
|
#include <kconfigskeleton.h>
|
|
|
|
#include <kconfigdialogmanager.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kiconloader.h>
|
|
|
|
#include <kdebug.h>
|
|
|
|
|
|
|
|
#include <tqlayout.h>
|
|
|
|
#include <tqvbox.h>
|
|
|
|
#include <tqmap.h>
|
|
|
|
|
|
|
|
|
|
|
|
TQAsciiDict<KonviConfigDialog> KonviConfigDialog::openDialogs;
|
|
|
|
|
|
|
|
// This class is here purly so we don't break binary compatibility down the road.
|
|
|
|
class KonviConfigDialog::KConfigDialogPrivate
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
KConfigDialogPrivate(KDialogBase::DialogType t) : shown(false), type(t), manager(0) { }
|
|
|
|
|
|
|
|
bool shown;
|
|
|
|
KDialogBase::DialogType type;
|
|
|
|
KConfigDialogManager *manager;
|
|
|
|
TQMap<TQWidget *, KConfigDialogManager *> managerForPage;
|
|
|
|
};
|
|
|
|
|
|
|
|
KonviConfigDialog::KonviConfigDialog( TQWidget *parent, const char *name,
|
|
|
|
KConfigSkeleton *config,
|
|
|
|
DialogType dialogType,
|
|
|
|
int dialogButtons,
|
|
|
|
ButtonCode defaultButton,
|
|
|
|
bool modal ) :
|
|
|
|
KDialogBase( dialogType, TQt::WStyle_DialogBorder,
|
|
|
|
parent, name, modal, i18n("Configure"), dialogButtons, defaultButton ),
|
|
|
|
d(new KConfigDialogPrivate(dialogType))
|
|
|
|
{
|
|
|
|
if ( name )
|
|
|
|
{
|
|
|
|
openDialogs.insert(name, this);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
TQCString genericName;
|
|
|
|
genericName.sprintf("SettingsDialog-%p", this);
|
|
|
|
openDialogs.insert(genericName, this);
|
|
|
|
setName(genericName);
|
|
|
|
}
|
|
|
|
|
|
|
|
connect(this, TQT_SIGNAL(okClicked()), this, TQT_SLOT(updateSettings()));
|
|
|
|
connect(this, TQT_SIGNAL(applyClicked()), this, TQT_SLOT(updateSettings()));
|
|
|
|
connect(this, TQT_SIGNAL(applyClicked()), this, TQT_SLOT(updateButtons()));
|
|
|
|
connect(this, TQT_SIGNAL(defaultClicked()), this, TQT_SLOT(updateWidgetsDefault()));
|
|
|
|
connect(this, TQT_SIGNAL(defaultClicked()), this, TQT_SLOT(updateButtons()));
|
|
|
|
|
|
|
|
d->manager = new KConfigDialogManager(this, config);
|
|
|
|
setupManagerConnections(d->manager);
|
|
|
|
|
|
|
|
enableButton(Apply, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
KonviConfigDialog::~KonviConfigDialog()
|
|
|
|
{
|
|
|
|
openDialogs.remove(name());
|
|
|
|
delete d;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::addPage(TQWidget *page,
|
|
|
|
const TQStringList &items,
|
|
|
|
const TQString &pixmapName,
|
|
|
|
const TQString &header,
|
|
|
|
bool manage)
|
|
|
|
{
|
|
|
|
addPageInternal(page, items, pixmapName, header);
|
|
|
|
if(manage)
|
|
|
|
d->manager->addWidget(page);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::addPage(TQWidget *page,
|
|
|
|
KConfigSkeleton *config,
|
|
|
|
const TQStringList &items,
|
|
|
|
const TQString &pixmapName,
|
|
|
|
const TQString &header)
|
|
|
|
{
|
|
|
|
addPageInternal(page, items, pixmapName, header);
|
|
|
|
d->managerForPage[page] = new KConfigDialogManager(page, config);
|
|
|
|
setupManagerConnections(d->managerForPage[page]);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::addPageInternal(TQWidget *page,
|
|
|
|
const TQStringList &items,
|
|
|
|
const TQString &pixmapName,
|
|
|
|
const TQString &header)
|
|
|
|
{
|
|
|
|
if(d->shown)
|
|
|
|
{
|
|
|
|
kdDebug(240) << "KonviConfigDialog::addPage: can not add a page after the dialog has been shown.";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
switch(d->type)
|
|
|
|
{
|
|
|
|
case TreeList:
|
|
|
|
case IconList:
|
|
|
|
case Tabbed:
|
|
|
|
{
|
|
|
|
TQVBox *frame = addVBoxPage(items, header, SmallIcon(pixmapName, 16));
|
|
|
|
frame->setSpacing( 0 );
|
|
|
|
frame->setMargin( 0 );
|
|
|
|
page->reparent(((TQWidget*)frame), 0, TQPoint());
|
|
|
|
m_lastAddedIndex = pageIndex(frame);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Swallow:
|
|
|
|
{
|
|
|
|
page->reparent(this, 0, TQPoint());
|
|
|
|
setMainWidget(page);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Plain:
|
|
|
|
{
|
|
|
|
TQFrame *main = plainPage();
|
|
|
|
TQVBoxLayout *topLayout = new TQVBoxLayout( main, 0, 0 );
|
|
|
|
page->reparent(((TQWidget*)main), 0, TQPoint());
|
|
|
|
topLayout->addWidget( page );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
kdDebug(240) << "KonviConfigDialog::addpage: unknown type.";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::setupManagerConnections(KConfigDialogManager *manager)
|
|
|
|
{
|
|
|
|
connect(manager, TQT_SIGNAL(settingsChanged()), this, TQT_SLOT(settingsChangedSlot()));
|
|
|
|
connect(manager, TQT_SIGNAL(widgetModified()), this, TQT_SLOT(updateButtons()));
|
|
|
|
|
|
|
|
connect(this, TQT_SIGNAL(okClicked()), manager, TQT_SLOT(updateSettings()));
|
|
|
|
connect(this, TQT_SIGNAL(applyClicked()), manager, TQT_SLOT(updateSettings()));
|
|
|
|
connect(this, TQT_SIGNAL(defaultClicked()), manager, TQT_SLOT(updateWidgetsDefault()));
|
|
|
|
}
|
|
|
|
|
|
|
|
KonviConfigDialog* KonviConfigDialog::exists(const char* name)
|
|
|
|
{
|
|
|
|
return openDialogs.find(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool KonviConfigDialog::showDialog(const char* name)
|
|
|
|
{
|
|
|
|
KonviConfigDialog *dialog = exists(name);
|
|
|
|
if(dialog)
|
|
|
|
dialog->show();
|
|
|
|
return (dialog != NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::updateButtons()
|
|
|
|
{
|
|
|
|
static bool only_once = false;
|
|
|
|
if (only_once) return;
|
|
|
|
only_once = true;
|
|
|
|
|
|
|
|
TQMap<TQWidget *, KConfigDialogManager *>::iterator it;
|
|
|
|
|
|
|
|
bool has_changed = d->manager->hasChanged() || hasChanged();
|
|
|
|
for (it = d->managerForPage.begin();
|
|
|
|
it != d->managerForPage.end() && !has_changed;
|
|
|
|
++it)
|
|
|
|
{
|
|
|
|
has_changed |= (*it)->hasChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
enableButton(Apply, has_changed);
|
|
|
|
|
|
|
|
bool is_default = d->manager->isDefault() && isDefault();
|
|
|
|
for (it = d->managerForPage.begin();
|
|
|
|
it != d->managerForPage.end() && is_default;
|
|
|
|
++it)
|
|
|
|
{
|
|
|
|
is_default &= (*it)->isDefault();
|
|
|
|
}
|
|
|
|
|
|
|
|
enableButton(Default, !is_default);
|
|
|
|
|
|
|
|
emit widgetModified();
|
|
|
|
only_once = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::settingsChangedSlot()
|
|
|
|
{
|
|
|
|
// Update the buttons
|
|
|
|
updateButtons();
|
|
|
|
emit settingsChanged();
|
|
|
|
emit settingsChanged(name());
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::show()
|
|
|
|
{
|
|
|
|
TQMap<TQWidget *, KConfigDialogManager *>::iterator it;
|
|
|
|
|
|
|
|
updateWidgets();
|
|
|
|
d->manager->updateWidgets();
|
|
|
|
for (it = d->managerForPage.begin(); it != d->managerForPage.end(); ++it)
|
|
|
|
(*it)->updateWidgets();
|
|
|
|
|
|
|
|
bool has_changed = d->manager->hasChanged() || hasChanged();
|
|
|
|
for (it = d->managerForPage.begin();
|
|
|
|
it != d->managerForPage.end() && !has_changed;
|
|
|
|
++it)
|
|
|
|
{
|
|
|
|
has_changed |= (*it)->hasChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
enableButton(Apply, has_changed);
|
|
|
|
|
|
|
|
bool is_default = d->manager->isDefault() && isDefault();
|
|
|
|
for (it = d->managerForPage.begin();
|
|
|
|
it != d->managerForPage.end() && is_default;
|
|
|
|
++it)
|
|
|
|
{
|
|
|
|
is_default &= (*it)->isDefault();
|
|
|
|
}
|
|
|
|
|
|
|
|
enableButton(Default, !is_default);
|
|
|
|
d->shown = true;
|
|
|
|
KDialogBase::show();
|
|
|
|
}
|
|
|
|
|
|
|
|
int KonviConfigDialog::lastAddedIndex()
|
|
|
|
{
|
|
|
|
return m_lastAddedIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::updateSettings()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::updateWidgets()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void KonviConfigDialog::updateWidgetsDefault()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|