From: Manuel Nickschas Date: Fri, 19 Sep 2008 22:49:45 +0000 (+0200) Subject: Action enhances QAction with a subset of KDE's KAction capabilities X-Git-Tag: 0.3.1~271 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=952da9aeecc6c778a7c3cd62b1ecfdc13b24bc8b Action enhances QAction with a subset of KDE's KAction capabilities This mostly adds configurable default and custom shortcuts to QAction. The API we use has been taken from KAction, in order to make KDE integration easier later on. Note that we only define/implement a subset of KAction's API, since we don't have global shortcuts and don't support alternate shortcuts (yet?). --- diff --git a/src/uisupport/CMakeLists.txt b/src/uisupport/CMakeLists.txt index 7c235f85..8ce01907 100644 --- a/src/uisupport/CMakeLists.txt +++ b/src/uisupport/CMakeLists.txt @@ -7,6 +7,7 @@ include(${QT_USE_FILE}) set(SOURCES abstractbuffercontainer.cpp abstractitemview.cpp + action.cpp bufferview.cpp bufferviewfilter.cpp clearablelineedit.cpp @@ -23,6 +24,7 @@ set(SOURCES set(MOC_HDRS abstractbuffercontainer.h abstractitemview.h + action.h bufferview.h bufferviewfilter.h clearablelineedit.h diff --git a/src/uisupport/action.cpp b/src/uisupport/action.cpp index c98c321b..700cce5a 100644 --- a/src/uisupport/action.cpp +++ b/src/uisupport/action.cpp @@ -16,4 +16,66 @@ * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + *************************************************************************** + * Parts of this implementation are taken from KDE's kaction.cpp * ***************************************************************************/ + +#include + +#include "action.h" + +Action::Action(QObject *parent) : QWidgetAction(parent) { + init(); +} + +Action::Action(const QString &text, QObject *parent) : QWidgetAction(parent) { + init(); + setText(text); +} + +Action::Action(const QIcon &icon, const QString &text, QObject *parent) : QWidgetAction(parent) { + init(); + setIcon(icon); + setText(text); +} + +void Action::init() { + connect(this, SIGNAL(triggered(bool)), this, SLOT(slotTriggered())); + + setProperty("isShortcutConfigurable", true); +} + +void Action::slotTriggered() { + emit triggered(QApplication::mouseButtons(), QApplication::keyboardModifiers()); +} + +bool Action::isShortcutConfigurable() const { + return property("isShortcutConfigurable").toBool(); +} + +void Action::setShortcutConfigurable(bool b) { + setProperty("isShortcutConfigurable", b); +} + +QKeySequence Action::shortcut(ShortcutTypes type) const { + Q_ASSERT(type); + if(type == DefaultShortcut) + return property("defaultShortcut").value(); + + if(shortcuts().count()) return shortcuts().value(0); + return QKeySequence(); +} + +void Action::setShortcut(const QShortcut &shortcut, ShortcutTypes type) { + setShortcut(shortcut.key(), type); +} + +void Action::setShortcut(const QKeySequence &key, ShortcutTypes type) { + Q_ASSERT(type); + + if(type & DefaultShortcut) + setProperty("defaultShortcut", key); + + if(type & ActiveShortcut) + QAction::setShortcut(key); +} diff --git a/src/uisupport/action.h b/src/uisupport/action.h index 8748ae9a..378d45da 100644 --- a/src/uisupport/action.h +++ b/src/uisupport/action.h @@ -16,17 +16,24 @@ * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + *************************************************************************** + * Parts of this API have been shamelessly stolen from KDE's kaction.h * ***************************************************************************/ #ifndef ACTION_H_ #define ACTION_H_ +#include #include +/// A specialized QWidgetAction, enhanced by some KDE features +/** This declares/implements a subset of KAction's API (notably we've left out global shortcuts + * for now), which should make it easy to plug in KDE support later on. + */ class Action : public QWidgetAction { Q_OBJECT - Q_PROPERTY(QShortcut shortcut READ shortcut WRITE setShortcut) + Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut) Q_PROPERTY(bool shortcutConfigurable READ isShortcutConfigurable WRITE setShortcutConfigurable) Q_FLAGS(ShortcutType) @@ -41,10 +48,23 @@ class Action : public QWidgetAction { Action(const QString &text, QObject *parent); Action(const QIcon &icon, const QString &text, QObject *parent); - QShortcut shortcut(ShortcutTypes types = ActiveShortcut) const; - void setShortcut(const QShortcut &shortcut, ShortcutTypes type = ActiveShortcut); - void setShortcut(const QKeySequence &shortcut, ShortcutTypes type = ActiveShortcut); + QKeySequence shortcut(ShortcutTypes types = ActiveShortcut) const; + void setShortcut(const QShortcut &shortcut, ShortcutTypes type = ShortcutTypes(ActiveShortcut | DefaultShortcut)); + void setShortcut(const QKeySequence &shortcut, ShortcutTypes type = ShortcutTypes(ActiveShortcut | DefaultShortcut)); + bool isShortcutConfigurable() const; + void setShortcutConfigurable(bool configurable); + + signals: + void triggered(Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers); + + private: + void init(); + + private slots: + void slotTriggered(); }; -Q_DECLARE_OPERATORS_FOR_FLAGS(ShortcutTypes) +Q_DECLARE_OPERATORS_FOR_FLAGS(Action::ShortcutTypes) + +#endif