From: Manuel Nickschas Date: Mon, 31 May 2010 15:45:40 +0000 (+0200) Subject: Make ActionCollection load and save custom shortcuts X-Git-Tag: 0.7-beta1~62 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=7f3d50af3f94bd5fc423c83ac21c460da2edf88b Make ActionCollection load and save custom shortcuts This implements {read|write}Settings() for ActionCollection. It also fixes the bug that custom shortcuts wouldn't be loaded again when using KDE. --- diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 9c58f75f..598befd0 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -206,6 +206,9 @@ void MainWin::init() { QtUi::registerNotificationBackend(new IndicatorNotificationBackend(this)); #endif + // we assume that at this point, all configurable actions are defined! + QtUi::loadShortcuts(); + connect(bufferWidget(), SIGNAL(currentChanged(BufferId)), SLOT(currentBufferChanged(BufferId))); setDisconnectedState(); // Disable menus and stuff diff --git a/src/uisupport/actioncollection.cpp b/src/uisupport/actioncollection.cpp index b752cfb7..c553554b 100644 --- a/src/uisupport/actioncollection.cpp +++ b/src/uisupport/actioncollection.cpp @@ -28,6 +28,7 @@ #include "actioncollection.h" #include "action.h" +#include "uisettings.h" ActionCollection::ActionCollection(QObject *parent) : QObject(parent) { _connectTriggered = _connectHovered = false; @@ -128,12 +129,30 @@ QAction *ActionCollection::takeAction(QAction *action) { } void ActionCollection::readSettings() { - + ShortcutSettings s; + QStringList savedShortcuts = s.savedShortcuts(); + + foreach(const QString &name, _actionByName.keys()) { + if(!savedShortcuts.contains(name)) + continue; + Action *action = qobject_cast(_actionByName.value(name)); + if(action) + action->setShortcut(s.loadShortcut(name), Action::ActiveShortcut); + } } void ActionCollection::writeSettings() const { - - + ShortcutSettings s; + foreach(const QString &name, _actionByName.keys()) { + Action *action = qobject_cast(_actionByName.value(name)); + if(!action) + continue; + if(!action->isShortcutConfigurable()) + continue; + if(action->shortcut(Action::ActiveShortcut) == action->shortcut(Action::DefaultShortcut)) + continue; + s.saveShortcut(name, action->shortcut(Action::ActiveShortcut)); + } } void ActionCollection::slotActionTriggered() { diff --git a/src/uisupport/graphicalui.cpp b/src/uisupport/graphicalui.cpp index c2422b3e..59ea3210 100644 --- a/src/uisupport/graphicalui.cpp +++ b/src/uisupport/graphicalui.cpp @@ -24,6 +24,7 @@ #include "graphicalui.h" #include "actioncollection.h" +#include "uisettings.h" #include "contextmenuactionprovider.h" #include "toolbaractionprovider.h" @@ -62,12 +63,29 @@ ActionCollection *GraphicalUi::actionCollection(const QString &category) { if(_actionCollections.contains(category)) return _actionCollections.value(category); ActionCollection *coll = new ActionCollection(_mainWidget); + coll->setProperty("Category", category); if(_mainWidget) coll->addAssociatedWidget(_mainWidget); _actionCollections.insert(category, coll); return coll; } +QHash GraphicalUi::actionCollections() { + return _actionCollections; +} + +void GraphicalUi::loadShortcuts() { + foreach(ActionCollection *coll, actionCollections()) + coll->readSettings(); +} + +void GraphicalUi::saveShortcuts() { + ShortcutSettings s; + s.clear(); + foreach(ActionCollection *coll, actionCollections()) + coll->writeSettings(); +} + void GraphicalUi::setMainWidget(QWidget *widget) { _mainWidget = widget; } diff --git a/src/uisupport/graphicalui.h b/src/uisupport/graphicalui.h index 5435d4e8..42a0a01c 100644 --- a/src/uisupport/graphicalui.h +++ b/src/uisupport/graphicalui.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-2010 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -46,6 +46,15 @@ public: * @param category The category (default: "General") */ static ActionCollection *actionCollection(const QString &category = "General"); + static QHash actionCollections(); + + //! Load custom shortcuts from ShortcutSettings + /** @note This method assumes that all configurable actions are defined when being called + */ + static void loadShortcuts(); + + //! Save custom shortcuts to ShortcutSettings + static void saveShortcuts(); inline static ContextMenuActionProvider *contextMenuActionProvider(); inline static ToolBarActionProvider *toolBarActionProvider(); diff --git a/src/uisupport/uisettings.cpp b/src/uisupport/uisettings.cpp index ca68c49a..eff891a1 100644 --- a/src/uisupport/uisettings.cpp +++ b/src/uisupport/uisettings.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-2010 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -20,6 +20,9 @@ #include "uisettings.h" +#include "action.h" +#include "actioncollection.h" + UiSettings::UiSettings(const QString &group) : ClientSettings(group) { @@ -124,3 +127,27 @@ void SessionSettings::sessionAging() { } } +/************************************************************************** + * ShortcutSettings + **************************************************************************/ + +ShortcutSettings::ShortcutSettings() : UiSettings("Shortcuts") { + +} + +void ShortcutSettings::clear() { + foreach(const QString &key, allLocalKeys()) + removeLocalKey(key); +} + +QStringList ShortcutSettings::savedShortcuts() { + return localChildKeys(); +} + +QKeySequence ShortcutSettings::loadShortcut(const QString &name) { + return localValue(name, QKeySequence()).value(); +} + +void ShortcutSettings::saveShortcut(const QString &name, const QKeySequence &seq) { + setLocalValue(name, seq); +} diff --git a/src/uisupport/uisettings.h b/src/uisupport/uisettings.h index a4905d0d..cf0e54fd 100644 --- a/src/uisupport/uisettings.h +++ b/src/uisupport/uisettings.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-2010 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -69,4 +69,17 @@ private: QString _sessionId; }; +class ShortcutSettings : public UiSettings { +public: + ShortcutSettings(); + + //! Remove all stored shortcuts + void clear(); + + QStringList savedShortcuts(); + + void saveShortcut(const QString &name, const QKeySequence &shortcut); + QKeySequence loadShortcut(const QString &name); +}; + #endif