X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Factioncollection.cpp;h=6715388b5fab8e4efd736a206d22bd4d8e28ed2c;hp=c553554bcffd769c26c4bb7de78aa648fe58a001;hb=b06a827aea68b050bf23c37e0162189a94595ee9;hpb=7f3d50af3f94bd5fc423c83ac21c460da2edf88b diff --git a/src/uisupport/actioncollection.cpp b/src/uisupport/actioncollection.cpp index c553554b..6715388b 100644 --- a/src/uisupport/actioncollection.cpp +++ b/src/uisupport/actioncollection.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-2016 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * *************************************************************************** * Parts of this implementation are based on KDE's KActionCollection. * ***************************************************************************/ @@ -24,228 +24,286 @@ #include #include +#include #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; } -ActionCollection::~ActionCollection() { +ActionCollection::~ActionCollection() +{ } -void ActionCollection::clear() { - _actionByName.clear(); - qDeleteAll(_actions); - _actions.clear(); -} -QAction *ActionCollection::action(const QString &name) const { - return _actionByName.value(name, 0); +void ActionCollection::clear() +{ + _actionByName.clear(); + qDeleteAll(_actions); + _actions.clear(); } -QList ActionCollection::actions() const { - return _actions; -} -Action *ActionCollection::addAction(const QString &name, Action *action) { - QAction *act = addAction(name, static_cast(action)); - Q_UNUSED(act); - Q_ASSERT(act == action); - return action; +QAction *ActionCollection::action(const QString &name) const +{ + return _actionByName.value(name, 0); } -Action *ActionCollection::addAction(const QString &name, const QObject *receiver, const char *member) { - Action *a = new Action(this); - if(receiver && member) - connect(a, SIGNAL(triggered(bool)), receiver, member); - return addAction(name, a); + +QList ActionCollection::actions() const +{ + return _actions; } -QAction *ActionCollection::addAction(const QString &name, QAction *action) { - if(!action) + +Action *ActionCollection::addAction(const QString &name, Action *action) +{ + QAction *act = addAction(name, static_cast(action)); + Q_UNUSED(act); + Q_ASSERT(act == action); return action; +} - const QString origName = action->objectName(); - QString indexName = name; - if(indexName.isEmpty()) - indexName = action->objectName(); - else - action->setObjectName(indexName); - if(indexName.isEmpty()) - indexName = indexName.sprintf("unnamed-%p", (void *)action); +Action *ActionCollection::addAction(const QString &name, const QObject *receiver, const char *member) +{ + Action *a = new Action(this); + if (receiver && member) + connect(a, SIGNAL(triggered(bool)), receiver, member); + return addAction(name, a); +} - // do we already have this action? - if(_actionByName.value(indexName, 0) == action) - return action; - // or maybe another action under this name? - if(QAction *oldAction = _actionByName.value(indexName)) - takeAction(oldAction); - // do we already have this action under a different name? - int oldIndex = _actions.indexOf(action); - if(oldIndex != -1) { - _actionByName.remove(origName); - _actions.removeAt(oldIndex); - } +QAction *ActionCollection::addAction(const QString &name, QAction *action) +{ + if (!action) + return action; + + const QString origName = action->objectName(); + QString indexName = name; + + if (indexName.isEmpty()) + indexName = action->objectName(); + else + action->setObjectName(indexName); + if (indexName.isEmpty()) + indexName = indexName.sprintf("unnamed-%p", (void *)action); + + // do we already have this action? + if (_actionByName.value(indexName, 0) == action) + return action; + // or maybe another action under this name? + if (QAction *oldAction = _actionByName.value(indexName)) + takeAction(oldAction); + + // do we already have this action under a different name? + int oldIndex = _actions.indexOf(action); + if (oldIndex != -1) { + _actionByName.remove(origName); + _actions.removeAt(oldIndex); + } - // add action - _actionByName.insert(indexName, action); - _actions.append(action); + // add action + _actionByName.insert(indexName, action); + _actions.append(action); - foreach(QWidget *widget, _associatedWidgets) { - widget->addAction(action); - } + foreach(QWidget *widget, _associatedWidgets) { + widget->addAction(action); + } - connect(action, SIGNAL(destroyed(QObject *)), SLOT(actionDestroyed(QObject *))); - if(_connectHovered) - connect(action, SIGNAL(hovered()), SLOT(slotActionHovered())); - if(_connectTriggered) - connect(action, SIGNAL(triggered(bool)), SLOT(slotActionTriggered())); + connect(action, SIGNAL(destroyed(QObject *)), SLOT(actionDestroyed(QObject *))); + if (_connectHovered) + connect(action, SIGNAL(hovered()), SLOT(slotActionHovered())); + if (_connectTriggered) + connect(action, SIGNAL(triggered(bool)), SLOT(slotActionTriggered())); - emit inserted(action); - return action; + emit inserted(action); + return action; } -void ActionCollection::removeAction(QAction *action) { - delete takeAction(action); + +void ActionCollection::removeAction(QAction *action) +{ + delete takeAction(action); } -QAction *ActionCollection::takeAction(QAction *action) { - if(!unlistAction(action)) - return 0; - foreach(QWidget *widget, _associatedWidgets) { - widget->removeAction(action); - } +QAction *ActionCollection::takeAction(QAction *action) +{ + if (!unlistAction(action)) + return 0; + + foreach(QWidget *widget, _associatedWidgets) { + widget->removeAction(action); + } - action->disconnect(this); - return action; + action->disconnect(this); + return 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::readSettings() +{ + ShortcutSettings s; + QStringList savedShortcuts = s.savedShortcuts(); -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)); - } + 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::slotActionTriggered() { - QAction *action = qobject_cast(sender()); - if(action) - emit actionTriggered(action); + +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::slotActionHovered() { - QAction *action = qobject_cast(sender()); - if(action) - emit actionHovered(action); + +void ActionCollection::slotActionTriggered() +{ + QAction *action = qobject_cast(sender()); + if (action) + emit actionTriggered(action); } -void ActionCollection::actionDestroyed(QObject *obj) { - // remember that this is not an QAction anymore at this point - QAction *action = static_cast(obj); - unlistAction(action); +void ActionCollection::slotActionHovered() +{ + QAction *action = qobject_cast(sender()); + if (action) + emit actionHovered(action); } -void ActionCollection::connectNotify(const char *signal) { - if(_connectHovered && _connectTriggered) - return; - if(QMetaObject::normalizedSignature(SIGNAL(actionHovered(QAction*))) == signal) { - if(!_connectHovered) { - _connectHovered = true; - foreach (QAction* action, actions()) - connect(action, SIGNAL(hovered()), SLOT(slotActionHovered())); +void ActionCollection::actionDestroyed(QObject *obj) +{ + // remember that this is not an QAction anymore at this point + QAction *action = static_cast(obj); + + unlistAction(action); +} + +#if QT_VERSION >= 0x050000 +void ActionCollection::connectNotify(const QMetaMethod &signal) +#else +void ActionCollection::connectNotify(const char *signal) +#endif +{ + if (_connectHovered && _connectTriggered) + return; + +#if QT_VERSION >= 0x050000 + if (QMetaMethod::fromSignal(&ActionCollection::actionHovered) == signal) { +#else + if (QMetaObject::normalizedSignature(SIGNAL(actionHovered(QAction *))) == signal) { +#endif + if (!_connectHovered) { + _connectHovered = true; + foreach(QAction* action, actions()) + connect(action, SIGNAL(hovered()), SLOT(slotActionHovered())); + } } - } else if(QMetaObject::normalizedSignature(SIGNAL(actionTriggered(QAction*))) == signal) { - if(!_connectTriggered) { - _connectTriggered = true; - foreach (QAction* action, actions()) - connect(action, SIGNAL(triggered(bool)), SLOT(slotActionTriggered())); +#if QT_VERSION >= 0x050000 + else if (QMetaMethod::fromSignal(&ActionCollection::actionTriggered) == signal) { +#else + else if (QMetaObject::normalizedSignature(SIGNAL(actionTriggered(QAction *))) == signal) { +#endif + if (!_connectTriggered) { + _connectTriggered = true; + foreach(QAction* action, actions()) + connect(action, SIGNAL(triggered(bool)), SLOT(slotActionTriggered())); + } } - } - QObject::connectNotify(signal); + QObject::connectNotify(signal); } -void ActionCollection::associateWidget(QWidget *widget) const { - foreach(QAction *action, actions()) { - if(!widget->actions().contains(action)) - widget->addAction(action); - } + +void ActionCollection::associateWidget(QWidget *widget) const +{ + foreach(QAction *action, actions()) { + if (!widget->actions().contains(action)) + widget->addAction(action); + } } -void ActionCollection::addAssociatedWidget(QWidget *widget) { - if(!_associatedWidgets.contains(widget)) { - widget->addActions(actions()); - _associatedWidgets.append(widget); - connect(widget, SIGNAL(destroyed(QObject *)), SLOT(associatedWidgetDestroyed(QObject *))); - } + +void ActionCollection::addAssociatedWidget(QWidget *widget) +{ + if (!_associatedWidgets.contains(widget)) { + widget->addActions(actions()); + _associatedWidgets.append(widget); + connect(widget, SIGNAL(destroyed(QObject *)), SLOT(associatedWidgetDestroyed(QObject *))); + } } -void ActionCollection::removeAssociatedWidget(QWidget *widget) { - foreach(QAction *action, actions()) + +void ActionCollection::removeAssociatedWidget(QWidget *widget) +{ + foreach(QAction *action, actions()) widget->removeAction(action); - _associatedWidgets.removeAll(widget); - disconnect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(associatedWidgetDestroyed(QObject *))); + _associatedWidgets.removeAll(widget); + disconnect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(associatedWidgetDestroyed(QObject *))); } -QList ActionCollection::associatedWidgets() const { - return _associatedWidgets; + +QList ActionCollection::associatedWidgets() const +{ + return _associatedWidgets; } -void ActionCollection::clearAssociatedWidgets() { - foreach(QWidget *widget, _associatedWidgets) + +void ActionCollection::clearAssociatedWidgets() +{ + foreach(QWidget *widget, _associatedWidgets) foreach(QAction *action, actions()) - widget->removeAction(action); + widget->removeAction(action); - _associatedWidgets.clear(); + _associatedWidgets.clear(); } -void ActionCollection::associatedWidgetDestroyed(QObject *obj) { - _associatedWidgets.removeAll(static_cast(obj)); + +void ActionCollection::associatedWidgetDestroyed(QObject *obj) +{ + _associatedWidgets.removeAll(static_cast(obj)); } -bool ActionCollection::unlistAction(QAction *action) { - // This might be called with a partly destroyed QAction! - int index = _actions.indexOf(action); - if(index == -1) return false; +bool ActionCollection::unlistAction(QAction *action) +{ + // This might be called with a partly destroyed QAction! - QString name = action->objectName(); - _actionByName.remove(name); - _actions.removeAt(index); + int index = _actions.indexOf(action); + if (index == -1) return false; - // TODO: remove from ActionCategory if we ever get that + QString name = action->objectName(); + _actionByName.remove(name); + _actions.removeAt(index); - return true; + // TODO: remove from ActionCategory if we ever get that + + return true; } + #endif /* HAVE_KDE */