diff options
Diffstat (limited to 'kcontrol/display/display.cpp')
-rw-r--r-- | kcontrol/display/display.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/kcontrol/display/display.cpp b/kcontrol/display/display.cpp new file mode 100644 index 000000000..1c514810c --- /dev/null +++ b/kcontrol/display/display.cpp @@ -0,0 +1,110 @@ +/* This file is part of the KDE project + Copyright (C) 2003-2004 Nadeem Hasan <[email protected]> + + 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. + + This program 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <qapplication.h> +#include <qlayout.h> +#include <qtabwidget.h> + +#include <kcmoduleloader.h> +#include <kdialog.h> +#include <kgenericfactory.h> + +#include "display.h" + +typedef KGenericFactory<KCMDisplay, QWidget> DisplayFactory; +K_EXPORT_COMPONENT_FACTORY ( kcm_display, DisplayFactory( "display" ) ) + +KCMDisplay::KCMDisplay( QWidget *parent, const char *name, const QStringList& ) + : KCModule( parent, name ) + , m_changed(false) +{ + m_tabs = new QTabWidget( this ); + + addTab( "randr", i18n( "Size && Orientation" ) ); + addTab( "nvidiadisplay", i18n( "Graphics Adaptor" ) ); + addTab( "nvidia3d", i18n( "3D Options" ) ); + addTab( "kgamma", i18n( "Monitor Gamma" ) ); + if ( QApplication::desktop()->isVirtualDesktop() ) + addTab( "xinerama", i18n( "Multiple Monitors" ) ); + addTab( "energy", i18n( "Power Control" ) ); + + QVBoxLayout *top = new QVBoxLayout( this, 0, KDialog::spacingHint() ); + top->addWidget( m_tabs ); + + setButtons( Apply|Help ); + load(); +} + +void KCMDisplay::addTab( const QString &name, const QString &label ) +{ + QWidget *page = new QWidget( m_tabs, name.latin1() ); + QVBoxLayout *top = new QVBoxLayout( page, KDialog::marginHint() ); + + KCModule *kcm = KCModuleLoader::loadModule( name, page ); + + if ( kcm ) + { + top->addWidget( kcm ); + m_tabs->addTab( page, label ); + + connect( kcm, SIGNAL( changed(bool) ), SLOT( moduleChanged(bool) ) ); + m_modules.insert(kcm, false); + } + else + delete page; +} + +void KCMDisplay::load() +{ + for (QMap<KCModule*, bool>::ConstIterator it = m_modules.begin(); it != m_modules.end(); ++it) + it.key()->load(); +} + +void KCMDisplay::save() +{ + for (QMap<KCModule*, bool>::Iterator it = m_modules.begin(); it != m_modules.end(); ++it) + if (it.data()) + it.key()->save(); +} + +void KCMDisplay::moduleChanged( bool isChanged ) +{ + QMap<KCModule*, bool>::Iterator currentModule = m_modules.find(static_cast<KCModule*>(const_cast<QObject*>(sender()))); + Q_ASSERT(currentModule != m_modules.end()); + if (currentModule.data() == isChanged) + return; + + currentModule.data() = isChanged; + + bool c = false; + + for (QMap<KCModule*, bool>::ConstIterator it = m_modules.begin(); it != m_modules.end(); ++it) { + if (it.data()) { + c = true; + break; + } + } + + if (m_changed != c) { + m_changed = c; + emit changed(c); + } +} + +#include "display.moc" |