Make ActionCollection load and save custom shortcuts
authorManuel Nickschas <sputnick@quassel-irc.org>
Mon, 31 May 2010 15:45:40 +0000 (17:45 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Mon, 31 May 2010 17:30:17 +0000 (19:30 +0200)
This implements {read|write}Settings() for ActionCollection. It also fixes the
bug that custom shortcuts wouldn't be loaded again when using KDE.

src/qtui/mainwin.cpp
src/uisupport/actioncollection.cpp
src/uisupport/graphicalui.cpp
src/uisupport/graphicalui.h
src/uisupport/uisettings.cpp
src/uisupport/uisettings.h

index 9c58f75..598befd 100644 (file)
@@ -206,6 +206,9 @@ void MainWin::init() {
   QtUi::registerNotificationBackend(new IndicatorNotificationBackend(this));
 #endif
 
   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
   connect(bufferWidget(), SIGNAL(currentChanged(BufferId)), SLOT(currentBufferChanged(BufferId)));
 
   setDisconnectedState();  // Disable menus and stuff
index b752cfb..c553554 100644 (file)
@@ -28,6 +28,7 @@
 #include "actioncollection.h"
 
 #include "action.h"
 #include "actioncollection.h"
 
 #include "action.h"
+#include "uisettings.h"
 
 ActionCollection::ActionCollection(QObject *parent) : QObject(parent) {
   _connectTriggered = _connectHovered = false;
 
 ActionCollection::ActionCollection(QObject *parent) : QObject(parent) {
   _connectTriggered = _connectHovered = false;
@@ -128,12 +129,30 @@ QAction *ActionCollection::takeAction(QAction *action) {
 }
 
 void ActionCollection::readSettings() {
 }
 
 void ActionCollection::readSettings() {
-
+  ShortcutSettings s;
+  QStringList savedShortcuts = s.savedShortcuts();
+
+  foreach(const QString &name, _actionByName.keys()) {
+    if(!savedShortcuts.contains(name))
+      continue;
+    Action *action = qobject_cast<Action *>(_actionByName.value(name));
+    if(action)
+      action->setShortcut(s.loadShortcut(name), Action::ActiveShortcut);
+  }
 }
 
 void ActionCollection::writeSettings() const {
 }
 
 void ActionCollection::writeSettings() const {
-
-
+  ShortcutSettings s;
+  foreach(const QString &name, _actionByName.keys()) {
+    Action *action = qobject_cast<Action *>(_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() {
 }
 
 void ActionCollection::slotActionTriggered() {
index c2422b3..59ea321 100644 (file)
@@ -24,6 +24,7 @@
 #include "graphicalui.h"
 
 #include "actioncollection.h"
 #include "graphicalui.h"
 
 #include "actioncollection.h"
+#include "uisettings.h"
 #include "contextmenuactionprovider.h"
 #include "toolbaractionprovider.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);
   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;
 }
 
   if(_mainWidget)
     coll->addAssociatedWidget(_mainWidget);
   _actionCollections.insert(category, coll);
   return coll;
 }
 
+QHash<QString, ActionCollection *> 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;
 }
 void GraphicalUi::setMainWidget(QWidget *widget) {
   _mainWidget = widget;
 }
index 5435d4e..42a0a01 100644 (file)
@@ -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  *
  *   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");
   *  @param category The category (default: "General")
   */
   static ActionCollection *actionCollection(const QString &category = "General");
+  static QHash<QString, ActionCollection *> 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();
 
   inline static ContextMenuActionProvider *contextMenuActionProvider();
   inline static ToolBarActionProvider *toolBarActionProvider();
index ca68c49..eff891a 100644 (file)
@@ -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  *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -20,6 +20,9 @@
 
 #include "uisettings.h"
 
 
 #include "uisettings.h"
 
+#include "action.h"
+#include "actioncollection.h"
+
 UiSettings::UiSettings(const QString &group)
   : ClientSettings(group)
 {
 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<QKeySequence>();
+}
+
+void ShortcutSettings::saveShortcut(const QString &name, const QKeySequence &seq) {
+  setLocalValue(name, seq);
+}
index a4905d0..cf0e54f 100644 (file)
@@ -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  *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -69,4 +69,17 @@ private:
   QString _sessionId;
 };
 
   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
 #endif