diff options
author | Nicolas Arnaud-Cormos <[email protected]> | 2010-12-20 10:35:30 +0100 |
---|---|---|
committer | Tobias Hunger <[email protected]> | 2010-12-20 11:16:15 +0100 |
commit | f5fbbbfd4f247ac405a50b45bb8cfc0ad97bb305 (patch) | |
tree | 60a7419d777e9f879712bf470a6481b41200ba55 /src/plugins/macros/actionmacrohandler.cpp | |
parent | 11e21e16c17964f7734ef9c8b97e3225553b891a (diff) |
New plugin: plugin macro
This plugin let the user record and replay some macros:
* 3 handlers: action, find and texteditor
* almost all texteditor and cpp actions recorded
* options page to set the directories where the macros are stored
* optional dialog to give a name and comment at the end of a macro
* locator integration to play a macro
* shortcuts assignment to macro
The most important change outside the plugin macros is the isScriptable method
for command: All scriptable commands can be stored in a macro.
Merge-request: 2176
Reviewed-by: Tobias Hunger <[email protected]>
Diffstat (limited to 'src/plugins/macros/actionmacrohandler.cpp')
-rw-r--r-- | src/plugins/macros/actionmacrohandler.cpp | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/plugins/macros/actionmacrohandler.cpp b/src/plugins/macros/actionmacrohandler.cpp new file mode 100644 index 00000000000..985f284d51f --- /dev/null +++ b/src/plugins/macros/actionmacrohandler.cpp @@ -0,0 +1,139 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nicolas Arnaud-Cormos. +** +** Contact: Nokia Corporation ([email protected]) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "actionmacrohandler.h" +#include "macroevent.h" +#include "macro.h" + +#include <texteditor/texteditorconstants.h> + +#include <coreplugin/icore.h> +#include <coreplugin/actionmanager/actionmanager.h> +#include <coreplugin/actionmanager/command.h> +#include <coreplugin/coreconstants.h> +#include <coreplugin/uniqueidmanager.h> +#include <coreplugin/icontext.h> + +#include <QObject> +#include <QEvent> +#include <QAction> +#include <QSignalMapper> +#include <QShortcut> +#include <QtAlgorithms> +#include <QStringList> + +using namespace Macros; +using namespace Macros::Internal; + + +static const char EVENTNAME[] = "Action"; +static quint8 ACTIONNAME = 0; + +ActionMacroHandler::ActionMacroHandler(): + m_mapper(new QSignalMapper(this)) +{ + connect(m_mapper, SIGNAL(mapped(const QString &)), + this, SLOT(addActionEvent(const QString &))); + + const Core::ICore *core = Core::ICore::instance(); + const Core::ActionManager *am = core->actionManager(); + connect(am, SIGNAL(commandAdded(QString)), + this, SLOT(addCommand(QString))); + + // Register all existing scriptable actions + QList<Core::Command *> commands = am->commands(); + foreach (Core::Command *command, commands) { + if (command->isScriptable()) { + QString id = Core::UniqueIDManager::instance()->stringForUniqueIdentifier(command->id()); + registerCommand(id); + } + } +} + +bool ActionMacroHandler::canExecuteEvent(const MacroEvent ¯oEvent) +{ + return (macroEvent.id() == EVENTNAME); +} + +bool ActionMacroHandler::executeEvent(const MacroEvent ¯oEvent) +{ + const Core::ICore *core = Core::ICore::instance(); + const Core::ActionManager *am = core->actionManager(); + + QAction *action = am->command(macroEvent.value(ACTIONNAME).toString())->action(); + if (!action) + return false; + + action->trigger(); + return true; +} + +void ActionMacroHandler::addActionEvent(const QString &id) +{ + if (!isRecording()) + return; + + const Core::ICore *core = Core::ICore::instance(); + const Core::ActionManager *am = core->actionManager(); + const Core::Command *cmd = am->command(id); + if (cmd->isScriptable(cmd->context())) { + MacroEvent e; + e.setId(EVENTNAME); + e.setValue(ACTIONNAME, id); + addMacroEvent(e); + } +} + +void ActionMacroHandler::registerCommand(const QString &id) +{ + if (!m_commandIds.contains(id)) { + m_commandIds.insert(id); + const Core::ICore *core = Core::ICore::instance(); + const Core::ActionManager *am = core->actionManager(); + QAction* action = am->command(id)->action(); + if (action) { + connect(action, SIGNAL(triggered()), m_mapper, SLOT(map())); + m_mapper->setMapping(action, id); + return; + } + QShortcut* shortcut = am->command(id)->shortcut(); + if (shortcut) { + connect(shortcut, SIGNAL(activated()), m_mapper, SLOT(map())); + m_mapper->setMapping(shortcut, id); + } + } +} + +void ActionMacroHandler::addCommand(const QString &id) +{ + const Core::ICore *core = Core::ICore::instance(); + const Core::ActionManager *am = core->actionManager(); + if (am->command(id)->isScriptable()) + registerCommand(id); +} |