SVN commit 780778 by mjansen: Add the possibility to save global shortcuts to a configuration. Normally the global shortcuts are handled completly from kdedglobalaccel. These function are needed to export import shortcut schemes. M +11 -0 kaction.cpp M +13 -0 kaction.h M +93 -19 kactioncollection.cpp M +17 -0 kactioncollection.h --- trunk/KDE/kdelibs/kdeui/actions/kaction.cpp #780777:780778 @@ -171,6 +171,17 @@ return d->globalShortcut; } +bool KAction::isLocalShortcutModified() const +{ + return property("defaultPrimaryShortcut").value() != shortcuts().value(0) + || property("defaultAlternateShortcut").value() != shortcuts().value(1); +} + +bool KAction::isGlobalShortcutModified() const +{ + return d->defaultGlobalShortcut != d->globalShortcut; +} + void KAction::setGlobalShortcut( const KShortcut & shortcut, ShortcutTypes type, GlobalShortcutLoading load ) { --- trunk/KDE/kdelibs/kdeui/actions/kaction.h #780777:780778 @@ -256,6 +256,19 @@ virtual ~KAction(); /** + * Differs the shortcut from the default setting? + * + * @return yes/no + */ + //@{ + inline bool isModified() const { + return isLocalShortcutModified() || isGlobalShortcutModified(); + } + bool isLocalShortcutModified() const; + bool isGlobalShortcutModified() const; + //@} + + /** * Get the shortcut for this action. * * This is preferred over QAction::shortcut(), as it allows for multiple shortcuts --- trunk/KDE/kdelibs/kdeui/actions/kactioncollection.cpp #780777:780778 @@ -30,9 +30,9 @@ #include "kxmlguiclient.h" #include "kxmlguifactory.h" -#include -#include -#include +#include "kdebug.h" +#include "kglobal.h" +#include "kaction.h" #include #include @@ -43,8 +43,8 @@ #include #include -#include -#include +#include "kcomponentdata.h" +#include "kconfiggroup.h" class KActionCollectionPrivate { @@ -322,15 +322,46 @@ d->configIsGlobal = global; } +void KActionCollection::readGlobalSettings( KConfigGroup* config ) +{ + Q_ASSERT(config); + if (!config) { + return; + } + + if( !config || !config->exists()) { + return; + } + + for (QMap::ConstIterator it = d->actionByName.constBegin(); + it != d->actionByName.constEnd(); ++it) { + KAction *kaction = qobject_cast(it.value()); + if (!kaction) + continue; + + QString actionName = it.key(); + + if( kaction->isShortcutConfigurable() ) { + QString entry = config->readEntry(actionName, QString()); + if( !entry.isEmpty() ) { + kaction->setGlobalShortcut( KShortcut(entry), KAction::ActiveShortcut, KAction::NoAutoloading ); + } else { + kaction->setGlobalShortcut( kaction->shortcut(KAction::DefaultShortcut), KAction::ActiveShortcut, KAction::NoAutoloading ); + } + } + } +} + + void KActionCollection::readSettings( KConfigGroup* config ) { KConfigGroup cg( KGlobal::config(), configGroup() ); if( !config ) config = &cg; - kDebug(125) << configGroup() << config->exists(); - if( !config->exists()) + if( !config->exists()) { return; + } for (QMap::ConstIterator it = d->actionByName.constBegin(); it != d->actionByName.constEnd(); ++it) { @@ -343,25 +374,66 @@ if( kaction->isShortcutConfigurable() ) { QString entry = config->readEntry(actionName, QString()); if( !entry.isEmpty() ) { - if( entry == "none" ) - kaction->setShortcut( KShortcut(), KAction::ActiveShortcut ); - else - kaction->setShortcut( KShortcut(entry), KAction::ActiveShortcut ); + kaction->setShortcut( KShortcut(entry), KAction::ActiveShortcut ); + } else { + kaction->setShortcut( kaction->shortcut(KAction::DefaultShortcut) ); } - else // default shortcut - kaction->setShortcut( kaction->shortcut(KAction::DefaultShortcut) ); - - kDebug(125) << actionName << "=" << entry; } } //kDebug(125) << " done"; } +void KActionCollection::writeGlobalSettings( KConfigGroup* config, bool writeAll, QAction* oneAction ) const +{ + Q_ASSERT(config); + if (!config) { + return; + } + + QList writeActions; + if (oneAction) + writeActions.append(oneAction); + else + writeActions = actions(); + + for (QMap::ConstIterator it = d->actionByName.constBegin(); + it != d->actionByName.constEnd(); ++it) { + + KAction *kaction = qobject_cast(it.value()); + if (!kaction) + continue; + QString actionName = it.key(); + + if( kaction->isShortcutConfigurable() && kaction->globalShortcutAllowed() ) { + bool bConfigHasAction = !config->readEntry( actionName, QString() ).isEmpty(); + bool bSameAsDefault = kaction->isGlobalShortcutModified(); + // If we're using a global config or this setting + // differs from the default, then we want to write. + KConfigGroup::WriteConfigFlags flags = KConfigGroup::Persistent; + if (configIsGlobal()) + flags |= KConfigGroup::Global; + if( writeAll || !bSameAsDefault ) { + QString s = kaction->globalShortcut().toString(); + if( s.isEmpty() ) + s = "none"; + kDebug(125) << "\twriting " << actionName << " = " << s; + config->writeEntry( actionName, s, flags ); + } + // Otherwise, this key is the same as default + // but exists in config file. Remove it. + else if( bConfigHasAction ) { + kDebug(125) << "\tremoving " << actionName << " because == default"; + config->deleteEntry( actionName, flags ); + } + } + } + + config->sync(); +} + void KActionCollection::writeSettings( KConfigGroup* config, bool writeAll, QAction* oneAction ) const { - kDebug(125) << configGroup() << ", " << config << ", " << writeAll << ", " << configIsGlobal(); - if (parentGUIClient() && !parentGUIClient()->xmlFile().isEmpty()) { kDebug(129) << "xmlFile=" << parentGUIClient()->xmlFile(); @@ -386,8 +458,10 @@ QString actionName = it.key(); - bool bSameAsDefault = (kaction->shortcut(KAction::ActiveShortcut) == kaction->shortcut(KAction::DefaultShortcut)); - kDebug(129) << "name = " << actionName << " shortcut = " << kaction->shortcut(KAction::ActiveShortcut).toString() << " def = " << kaction->shortcut(KAction::DefaultShortcut).toString(); + bool bSameAsDefault = !kaction->isModified(); + kDebug(129) << "name = " << actionName + << " shortcut = " << kaction->shortcut(KAction::ActiveShortcut).toString() + << " def = " << kaction->shortcut(KAction::DefaultShortcut).toString(); // now see if this element already exists // and create it if necessary (unless bSameAsDefault) --- trunk/KDE/kdelibs/kdeui/actions/kactioncollection.h #780777:780778 @@ -145,8 +145,25 @@ * in the group set by setConfigGroup(). */ void readSettings( KConfigGroup* config = 0 ); + + /** + * Read from @p config all configurable global key associations. + * + * \param config Config object to read from + */ + void readGlobalSettings( KConfigGroup* config ); /** + * Write the current configurable global key associations to @p config. + * + * \param config Config object to save to + * \param writeDefaults set to true to write settings which are already at defaults. + * \param oneAction pass an action here if you just want to save the values for one action, eg. + * if you know that action is the only one which has changed. + */ + void writeGlobalSettings( KConfigGroup* config = 0, bool writeDefaults = false, QAction* oneAction = 0 ) const; + + /** * Write the current configurable key associations to @p config, * or (if @p config is zero) to the application's * configuration file.