kwin/kcmkwin/kwindecoration/configdialog.cpp
Martin Gräßlin c9df18ab98 New decoration kcm:
* Displays list with previews instead of a dropdown with just the name.
* Configuration is moved into an own dialog accessible via a configure button for each decoration
* Button configuration is moved into a dialog, by that the tabs are removed
* Aurorae themes are listed just like normal decorations
* GHNS support to download Aurorae themes
* Semi-live preview of changed: when configure dialog is closed the preview is updated
* About Dialog added for each decoration (needs updates in desktop files - the information is missing)

svn path=/trunk/KDE/kdebase/workspace/; revision=1077141
2010-01-19 13:44:22 +00:00

167 lines
5.7 KiB
C++

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2009 Martin Gräßlin <kde@martin-graesslin.com>
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. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "configdialog.h"
#include <QDBusConnection>
#include <QDBusMessage>
#include <KLibLoader>
#include <KVBox>
namespace KWin
{
static const char* const border_names[ KDecorationDefines::BordersCount ] =
{
I18N_NOOP( "Tiny" ),
I18N_NOOP( "Normal" ),
I18N_NOOP( "Large" ),
I18N_NOOP( "Very Large" ),
I18N_NOOP( "Huge" ),
I18N_NOOP( "Very Huge" ),
I18N_NOOP( "Oversized" )
};
KWinDecorationConfigForm::KWinDecorationConfigForm( QWidget* parent )
: QWidget( parent )
{
setupUi( this );
}
KWinDecorationConfigDialog::KWinDecorationConfigDialog( QString deco, const QList<QVariant>& borderSizes,
KDecorationDefines::BorderSize size,
QWidget* parent, Qt::WFlags flags )
: KDialog( parent, flags )
, m_borderSizes( borderSizes )
, m_kwinConfig( KSharedConfig::openConfig( "kwinrc" ) )
, m_pluginObject( 0 )
, m_pluginConfigWidget( 0 )
{
m_ui = new KWinDecorationConfigForm( this );
setWindowTitle( i18n("Decoration Options") );
setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Default | KDialog::Reset );
enableButton( KDialog::Reset, false );
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget( m_ui );
// Use klibloader for library manipulation
KLibLoader* loader = KLibLoader::self();
KLibrary* library = loader->library( styleToConfigLib( deco ) );
if (library != NULL)
{
KLibrary::void_function_ptr alloc_ptr = library->resolveFunction("allocate_config");
if (alloc_ptr != NULL)
{
allocatePlugin = (QObject* (*)(KConfigGroup& conf, QWidget* parent))alloc_ptr;
KConfigGroup config( m_kwinConfig, "Style" );
m_pluginConfigWidget = new KVBox( this );
m_pluginObject = (QObject*)(allocatePlugin( config, m_pluginConfigWidget ));
// connect required signals and slots together...
connect( this, SIGNAL(accepted()), this, SLOT(slotAccepted()) );
connect( m_pluginObject, SIGNAL(changed()), this, SLOT(slotSelectionChanged()) );
connect( this, SIGNAL(pluginSave(KConfigGroup&)), m_pluginObject, SLOT(save(KConfigGroup &)) );
connect( this, SIGNAL(defaultClicked()), m_pluginObject, SLOT(defaults()) );
connect( this, SIGNAL(defaultClicked()), SLOT(slotDefault()) );
}
}
if( m_pluginConfigWidget )
{
layout->addWidget( m_pluginConfigWidget );
}
if( borderSizes.count() >= 2 )
{
foreach( const QVariant& borderSize, borderSizes )
{
KDecorationDefines::BorderSize currentSize =
static_cast<KDecorationDefines::BorderSize>( borderSize.toInt() );
m_ui->bordersCombo->addItem(i18n(border_names[currentSize]), borderSizeToIndex(currentSize, borderSizes) );
}
m_ui->bordersCombo->setCurrentIndex( borderSizeToIndex( size, borderSizes ) );
}
else
{
m_ui->bordersCombo->hide();
m_ui->borderLabel->hide();
}
QWidget* main = new QWidget( this );
main->setLayout( layout );
setMainWidget( main );
}
KWinDecorationConfigDialog::~KWinDecorationConfigDialog()
{
delete m_pluginObject;
}
KDecorationDefines::BorderSize KWinDecorationConfigDialog::borderSize() const
{
if( m_borderSizes.count() >= 2 )
return (KDecorationDefines::BorderSize)m_borderSizes.at( m_ui->bordersCombo->currentIndex() ).toInt();
return KDecorationDefines::BorderNormal;
}
int KWinDecorationConfigDialog::borderSizeToIndex( KDecorationDefines::BorderSize size, const QList< QVariant >& sizes )
{
int pos = 0;
for( QList< QVariant >::ConstIterator it = sizes.constBegin();
it != sizes.constEnd();
++it, ++pos )
if( size <= (*it).toInt() )
break;
return pos;
}
void KWinDecorationConfigDialog::slotAccepted()
{
KConfigGroup config( m_kwinConfig, "Style" );
emit pluginSave( config );
config.sync();
// Send signal to all kwin instances
QDBusMessage message =
QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
QDBusConnection::sessionBus().send(message);
}
void KWinDecorationConfigDialog::slotSelectionChanged()
{
enableButton( KDialog::Reset, true );
}
QString KWinDecorationConfigDialog::styleToConfigLib( const QString& styleLib ) const
{
if( styleLib.startsWith( "kwin3_" ))
return "kwin_" + styleLib.mid( 6 ) + "_config";
else
return styleLib + "_config";
}
void KWinDecorationConfigDialog::slotDefault()
{
if( m_borderSizes.count() >= 2 )
m_ui->bordersCombo->setCurrentIndex( borderSizeToIndex( BorderNormal, m_borderSizes ) );
}
} // namespace KWin
#include "configdialog.moc"