[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-core-devel
Subject: Re: Extending KCModuleProxy
From: Frans Englich <frans.englich () telia ! com>
Date: 2004-03-15 1:13:08
Message-ID: 200403150213.08091.frans.englich () telia ! com
[Download RAW message or body]
Attached patch tries to port the KCMultiDialog to the new KCModuleProxy. The
dialog should work out of the box with the KCModuleProxy, unfortunately that
is not the case, the problem discussed below. (of course, root support needs
patching)
I get a crash on this:
void KCMultiDialog::slotAboutToShow(QWidget *page)
{
kdDebug( 710 ) << k_funcinfo << endl;
// honor KCModule::buttons
QObject * obj = page->child( 0, "KCModuleProxy" );
if( ! obj )
return;
d->currentModule =
( KCModuleProxy* )obj->qt_cast( "KCModuleProxy" ); //<--crash
And with my crippled c++/qt knowledge I can't tell why that does not work nor
what possible changes have broken it.
Why doesn't the code read "d->currentModule = (KCModuleProxy *) page;"? (but
that crashes just as fine)
Further, I have some miscellaneous questions:
* My patch contains the following section:
@ -63,16 +75,17 @@ KCMultiDialog::KCMultiDialog( int dialog
const KGuiItem &user3, int buttonMask, const QString &caption,
QWidget *parent, const char *name, bool modal )
: KDialogBase( dialogFace, caption, buttonMask | Help | Default | Cancel
|
- Apply | Ok | User1, Ok, parent, name, modal, true,
- KGuiItem( i18n( "&Reset" ), "undo" ), user2, user3 )
- , dialogface( dialogFace )
+ Apply | Ok | User1 | User2 | User3, Ok, parent, name, modal,
true,
+ KStdGuiItem::reset(), KStdGuiItem::adminMode(), user3 )
+ , dialogface( dialogFace ), d( new KCMultiDialogPrivate() )
I've ran out of custom buttons in kdialogbase :) Three is allowed. reset() and
adminMode() is needed for internal purposes and the user is allowed to pass
two - that's four in total. Any ideas what to do in this situation?
* What does the @internal doxygen tag mean in KDE context?
* $KDEDIRS is preferred in front of $KDEDIR, AFAICT. Will KDEDIR be deprecated
for KDE4?
* Is $KDETMP fully supported and an "official" feature?
Cheers,
Frans
["kcmultidialog.diff" (text/x-diff)]
Index: kutils/kcmultidialog.cpp
===================================================================
RCS file: /home/kde/kdelibs/kutils/kcmultidialog.cpp,v
retrieving revision 1.51
diff -u -3 -p -r1.51 kcmultidialog.cpp
--- kutils/kcmultidialog.cpp 24 Jan 2004 20:28:02 -0000 1.51
+++ kutils/kcmultidialog.cpp 14 Mar 2004 23:43:24 -0000
@@ -2,6 +2,7 @@
Copyright (c) 2000 Matthias Elter <elter@kde.org>
Copyright (c) 2003 Daniel Molkentin <molkentin@kde.org>
Copyright (c) 2003 Matthias Kretz <kretz@kde.org>
+ Copyright (c) 2004 Frans Englich <frans.erglich.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -24,6 +25,7 @@
#include <qcursor.h>
#include <klocale.h>
+#include <kstdguiitem.h>
#include <kdebug.h>
#include <kiconloader.h>
#include <kmessagebox.h>
@@ -39,23 +41,33 @@
#include <assert.h>
#include <qlayout.h>
+class KCMultiDialog::KCMultiDialogPrivate
+{
+ public:
+ KCMultiDialogPrivate()
+ : hasRootKCM( false ), currentModule( 0 )
+
+ {}
+ bool hasRootKCM;
+ KCModuleProxy* currentModule;
+};
+
+
KCMultiDialog::KCMultiDialog(QWidget *parent, const char *name, bool modal)
: KDialogBase(IconList, i18n("Configure"), Help | Default |Cancel | Apply |
- Ok | User1, Ok, parent, name, modal, true,
- KGuiItem( i18n( "&Reset" ), "undo" ) )
- , dialogface( IconList )
+ Ok | User1 | User2, Ok, parent, name, modal, true,
+ KStdGuiItem::reset(), KStdGuiItem::adminMode())
+ , dialogface( IconList ), d( new KCMultiDialogPrivate() )
{
- showButton( User1, false );;
init();
}
KCMultiDialog::KCMultiDialog( int dialogFace, const QString & caption, QWidget * \
parent, const char * name, bool modal )
: KDialogBase( dialogFace, caption, Help | Default | Cancel | Apply | Ok |
- User1, Ok, parent, name, modal, true,
- KGuiItem( i18n( "&Reset" ), "undo" ) )
- , dialogface( dialogFace )
+ User1 | User2, Ok, parent, name, modal, true,
+ KStdGuiItem::reset(), KStdGuiItem::adminMode())
+ , dialogface( dialogFace ), d( new KCMultiDialogPrivate() )
{
- showButton( User1, false );;
init();
}
@@ -63,16 +75,17 @@ KCMultiDialog::KCMultiDialog( int dialog
const KGuiItem &user3, int buttonMask, const QString &caption,
QWidget *parent, const char *name, bool modal )
: KDialogBase( dialogFace, caption, buttonMask | Help | Default | Cancel |
- Apply | Ok | User1, Ok, parent, name, modal, true,
- KGuiItem( i18n( "&Reset" ), "undo" ), user2, user3 )
- , dialogface( dialogFace )
+ Apply | Ok | User1 | User2 | User3, Ok, parent, name, modal, true,
+ KStdGuiItem::reset(), KStdGuiItem::adminMode(), user3 )
+ , dialogface( dialogFace ), d( new KCMultiDialogPrivate() )
{
- showButton( User1, false );;
init();
}
inline void KCMultiDialog::init()
{
+ showButton( User1, false );
+ showButton( User2, false );
d = 0L;
enableButton(Apply, false);
connect(this, SIGNAL(aboutToShowPage(QWidget *)), this, \
SLOT(slotAboutToShow(QWidget *))); @@ -197,7 +210,6 @@ void \
KCMultiDialog::clientChanged(bool s
void KCMultiDialog::addModule(const QString& path, bool withfallback)
{
- kdDebug(710) << "KCMultiDialog::addModule " << path << endl;
KService::Ptr s = KService::serviceByStorageId(path);
if (!s) {
@@ -212,6 +224,7 @@ void KCMultiDialog::addModule(const QStr
void KCMultiDialog::addModule(const KCModuleInfo& moduleinfo,
QStringList parentmodulenames, bool withfallback)
{
+
kdDebug(710) << "KCMultiDialog::addModule " << moduleinfo.moduleName() <<
endl;
@@ -274,12 +287,19 @@ void KCMultiDialog::addModule(const KCMo
connect(module, SIGNAL(changed(bool)), this, SLOT(clientChanged(bool)));
if( m_modules.count() == 0 )
- aboutToShowPage( page );
+ {
+ emit aboutToShowPage( page );
+ }
}
CreatedModule cm;
cm.kcm = module;
cm.service = moduleinfo.service();
m_modules.append( cm );
+ if ( moduleinfo.needsRootPrivileges() && !d->hasRootKCM )
+ {
+ d->hasRootKCM = true;
+ showButton( User2, true );
+ }
}
void KCMultiDialog::removeAllModules()
@@ -326,16 +346,38 @@ void KCMultiDialog::slotAboutToShow(QWid
QObject * obj = page->child( 0, "KCModuleProxy" );
if( ! obj )
return;
- KCModuleProxy * module = ( KCModuleProxy* )obj->qt_cast(
- "KCModuleProxy" );
- if( ! module )
+ d->currentModule = ( KCModuleProxy* )obj->qt_cast( "KCModuleProxy" );
+ if( ! d->currentModule )
return;
// TODO: if the dialogface is Plain we should hide the buttons instead of
// disabling
enableButton( KDialogBase::Help,
- module->buttons() & KCModule::Help );
+ d->currentModule->buttons() & KCModule::Help );
enableButton( KDialogBase::Default,
- module->buttons() & KCModule::Default );
+ d->currentModule->buttons() & KCModule::Default );
+
+ /* Enable the Admin Mode button */
+ disconnect( 0, SIGNAL(user2Clicked()), 0, 0);
+ if (d->currentModule->moduleInfo().needsRootPrivileges())
+ {
+ enableButton( User2, true );
+ connect( this, SIGNAL(user2Clicked()), d->currentModule, SLOT( runAsRoot() \
)); + }
}
+void KCMultiDialog::slotUser2Clicked() /* Admin Mode */
+{
+ if ( !d->currentModule )
+ return;
+
+ enableButton( User2, false );
+ connect ( d->currentModule, SIGNAL( childClosed() ), SLOT( rootExit() ));
+}
+
+void KCMultiDialog::rootExit()
+{
+ enableButton( User2, true);
+}
+
+
// vim: sw=4 et sts=4
Index: kutils/kcmultidialog.h
===================================================================
RCS file: /home/kde/kdelibs/kutils/kcmultidialog.h,v
retrieving revision 1.31
diff -u -3 -p -r1.31 kcmultidialog.h
--- kutils/kcmultidialog.h 15 Jan 2004 15:56:00 -0000 1.31
+++ kutils/kcmultidialog.h 14 Mar 2004 23:43:24 -0000
@@ -209,12 +209,20 @@ protected slots:
**/
virtual void slotHelp();
+ /**
+ * This slot is called when the user pressed the "Administrator Mode"
+ * button
+ */
+ virtual void slotUser2Clicked();
+
private slots:
void slotAboutToShow(QWidget *);
void clientChanged(bool state);
+ void rootExit();
+
private:
void init();
void apply();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic