Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/menubarcommand.h"
Toshihiro Shimizu 890ddd
//#include "menubarcommandids.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvdialog.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzfolders.h"
Toshihiro Shimizu 890ddd
#include <assert.h></assert.h>
Toshihiro Shimizu 890ddd
#include <qobject></qobject>
Toshihiro Shimizu 890ddd
#include <qaction></qaction>
Toshihiro Shimizu 890ddd
#include <qsettings></qsettings>
Toshihiro Shimizu 890ddd
#include <qkeysequence></qkeysequence>
Toshihiro Shimizu 890ddd
#include <qapplication></qapplication>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <sys types.h=""></sys>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace DVGui;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void updateToolTip(QAction *action) {
Shinya Kitaoka 120a6e
  QString tooltip  = action->text();
Shinya Kitaoka 120a6e
  QString shortcut = action->shortcut().toString();
Shinya Kitaoka 120a6e
  if (shortcut != "") tooltip += " (" + shortcut + ")";
Shinya Kitaoka 120a6e
  action->setToolTip(tooltip);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
AuxActionsCreator::AuxActionsCreator() {
Shinya Kitaoka 120a6e
  AuxActionsCreatorManager::instance()->addAuxActionsCreator(this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
AuxActionsCreatorManager::AuxActionsCreatorManager()
Shinya Kitaoka 120a6e
    : m_auxActionsCreated(false) {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
AuxActionsCreatorManager *AuxActionsCreatorManager::instance() {
Shinya Kitaoka 120a6e
  static AuxActionsCreatorManager _instance;
Shinya Kitaoka 120a6e
  return &_instance;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void AuxActionsCreatorManager::addAuxActionsCreator(
Shinya Kitaoka 120a6e
    AuxActionsCreator *auxActionsCreator) {
Shinya Kitaoka 120a6e
  m_auxActionsCreators.push_back(auxActionsCreator);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void AuxActionsCreatorManager::createAuxActions(QObject *parent) {
Shinya Kitaoka 120a6e
  if (m_auxActionsCreated) return;
Shinya Kitaoka 120a6e
  m_auxActionsCreated = true;
Shinya Kitaoka 120a6e
  for (int i = 0; i < (int)m_auxActionsCreators.size(); i++)
Shinya Kitaoka 120a6e
    m_auxActionsCreators[i]->createActions(parent);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
CommandManager::CommandManager() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
CommandManager::~CommandManager() {
Shinya Kitaoka 120a6e
  std::map<std::string, *="" node="">::iterator it;</std::string,>
Shinya Kitaoka 120a6e
  for (it = m_idTable.begin(); it != m_idTable.end(); ++it) delete it->second;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
CommandManager *CommandManager::instance() {
Shinya Kitaoka 120a6e
  static CommandManager _instance;
Shinya Kitaoka 120a6e
  return &_instance;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// command id => command
Toshihiro Shimizu 890ddd
//
Shinya Kitaoka 120a6e
CommandManager::Node *CommandManager::getNode(CommandId id,
Shinya Kitaoka 120a6e
                                              bool createIfNeeded) {
Shinya Kitaoka 120a6e
  AuxActionsCreatorManager::instance()->createAuxActions(qApp);
Shinya Kitaoka 120a6e
  std::map<std::string, *="" node="">::iterator it = m_idTable.find(id);</std::string,>
Shinya Kitaoka 120a6e
  if (it != m_idTable.end()) return it->second;
Shinya Kitaoka 120a6e
  if (createIfNeeded) {
Shinya Kitaoka 120a6e
    Node *node    = new Node(id);
Shinya Kitaoka 120a6e
    m_idTable[id] = node;
Shinya Kitaoka 120a6e
    return node;
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CommandManager::setShortcut(CommandId id, QAction *action,
Shinya Kitaoka 120a6e
                                 std::string shortcutString) {
Shinya Kitaoka 120a6e
  if (shortcutString != "")
Shinya Kitaoka 120a6e
    action->setShortcut(QKeySequence(QString::fromStdString(shortcutString)));
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    action->setShortcut(QKeySequence());
Shinya Kitaoka 120a6e
  TFilePath fp = ToonzFolder::getMyModuleDir() + TFilePath("shortcuts.ini");
Shinya Kitaoka 120a6e
  QSettings settings(toQString(fp), QSettings::IniFormat);
Shinya Kitaoka 120a6e
  settings.beginGroup("shortcuts");
Shinya Kitaoka 120a6e
  settings.setValue(QString(id), QString::fromStdString(shortcutString));
Shinya Kitaoka 120a6e
  settings.endGroup();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CommandManager::define(CommandId id, CommandType type,
Shinya Kitaoka 120a6e
                            std::string defaultShortcutString,
Shinya Kitaoka 120a6e
                            QAction *qaction) {
Shinya Kitaoka 120a6e
  assert(type != UndefinedCommandType);
Shinya Kitaoka 120a6e
  assert(qaction != 0);
Shinya Kitaoka 120a6e
  assert(m_qactionTable.count(qaction) == 0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  Node *node = getNode(id);
Shinya Kitaoka 120a6e
  if (node->m_type != UndefinedCommandType) {
Shinya Kitaoka 120a6e
    assert(!"Duplicate command id");
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  node->m_type    = type;
Shinya Kitaoka 120a6e
  node->m_qaction = qaction;
Shinya Kitaoka 120a6e
  node->m_qaction->setEnabled(
Shinya Kitaoka 120a6e
      node->m_enabled &&
Shinya Kitaoka 120a6e
          (!!node->m_handler || node->m_qaction->actionGroup() != 0) ||
Shinya Kitaoka 120a6e
      node->m_type == MiscCommandType ||
Shinya Kitaoka 120a6e
      node->m_type == ToolModifierCommandType);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_qactionTable[qaction] = node;
Shinya Kitaoka 120a6e
  qaction->setShortcutContext(Qt::ApplicationShortcut);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFilePath fp = ToonzFolder::getModuleFile("shortcuts.ini");
Shinya Kitaoka 120a6e
  QSettings settings(toQString(fp), QSettings::IniFormat);
Shinya Kitaoka 120a6e
  settings.beginGroup("shortcuts");
Shinya Kitaoka 120a6e
  QString defaultShortcutQString =
Shinya Kitaoka 120a6e
      QString::fromStdString(defaultShortcutString);
Shinya Kitaoka 120a6e
  /*-
Shinya Kitaoka 120a6e
          Some shortcuts may just removed from the default settings.
Shinya Kitaoka 120a6e
          So you need to distinguish between "shortcut is not defined by user"
Shinya Kitaoka 120a6e
  and "shortcut is removed (i.e. defined as "") by user".
Shinya Kitaoka 120a6e
  -*/
Shinya Kitaoka 120a6e
  QString shortcutString = settings.value(id, "undefined").toString();
Shinya Kitaoka 120a6e
  settings.endGroup();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (shortcutString != "" && shortcutString != "undefined") {
Shinya Kitaoka 120a6e
    // User-defined shortcuts. It may have been assigned as a shortcut by
Shinya Kitaoka 120a6e
    // default to some other command
Shinya Kitaoka 120a6e
    QAction *other = getActionFromShortcut(shortcutString.toStdString());
Shinya Kitaoka 120a6e
    if (other) other->setShortcut(QKeySequence());
Shinya Kitaoka 120a6e
  } else if (defaultShortcutQString != "" && shortcutString == "undefined") {
Shinya Kitaoka 120a6e
    // Shortcut key set by default. Check if the key already been assigned to
Shinya Kitaoka 120a6e
    // another action
Shinya Kitaoka 120a6e
    QAction *other =
Shinya Kitaoka 120a6e
        getActionFromShortcut(defaultShortcutQString.toStdString());
Shinya Kitaoka 120a6e
    if (!other) shortcutString = defaultShortcutQString;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (shortcutString != "" && shortcutString != "undefined") {
Shinya Kitaoka 120a6e
    qaction->setShortcut(QKeySequence(shortcutString));
Shinya Kitaoka 120a6e
    m_shortcutTable[shortcutString.toStdString()] = node;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (type == ToolCommandType) updateToolTip(qaction);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// set handler (id, handler)
Toshihiro Shimizu 890ddd
//   possibly changes enable/disable qaction state
Toshihiro Shimizu 890ddd
//
Shinya Kitaoka 120a6e
void CommandManager::setHandler(CommandId id,
Shinya Kitaoka 120a6e
                                CommandHandlerInterface *handler) {
Shinya Kitaoka 120a6e
  Node *node = getNode(id);
Shinya Kitaoka 120a6e
  if (node->m_handler != handler) {
Shinya Kitaoka 120a6e
    delete node->m_handler;
Shinya Kitaoka 120a6e
    node->m_handler = handler;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (node->m_qaction) {
Shinya Kitaoka 120a6e
    node->m_qaction->setEnabled(
Shinya Kitaoka 120a6e
        node->m_enabled &&
Shinya Kitaoka 120a6e
        (!!node->m_handler || node->m_qaction->actionGroup() != 0));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// qaction -> command; execute
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CommandManager::execute(QAction *qaction) {
Shinya Kitaoka 120a6e
  assert(qaction);
Shinya Kitaoka 120a6e
  std::map<qaction *="" *,="" node="">::iterator it = m_qactionTable.find(qaction);</qaction>
Shinya Kitaoka 120a6e
  assert(it != m_qactionTable.end());
Shinya Kitaoka 120a6e
  if (it != m_qactionTable.end() && it->second->m_handler) {
Shinya Kitaoka 120a6e
    it->second->m_handler->execute();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CommandManager::execute(QAction *action, QAction *menuAction) {
Shinya Kitaoka 120a6e
  std::map<qaction *="" *,="" node="">::iterator it = m_qactionTable.find(action);</qaction>
Shinya Kitaoka 120a6e
  if (it != m_qactionTable.end())
Shinya Kitaoka 120a6e
    execute(action);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    execute(menuAction);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CommandManager::execute(CommandId id) {
Shinya Kitaoka 120a6e
  Node *node = getNode(id, false);
Shinya Kitaoka 120a6e
  if (node && node->m_handler) {
Shinya Kitaoka 120a6e
    QAction *action = node->m_qaction;
Shinya Kitaoka 120a6e
    if (action && action->isCheckable()) {
Shinya Kitaoka 120a6e
      // principalmente per i tool
Shinya Kitaoka 120a6e
      action->setChecked(true);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    node->m_handler->execute();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CommandManager::getActions(CommandType type,
Shinya Kitaoka 120a6e
                                std::vector<qaction *=""> &actions) {</qaction>
Shinya Kitaoka 120a6e
  AuxActionsCreatorManager::instance()->createAuxActions(qApp);
Shinya Kitaoka 120a6e
  std::map<qaction *="" *,="" node="">::iterator it;</qaction>
Shinya Kitaoka 120a6e
  for (it = m_qactionTable.begin(); it != m_qactionTable.end(); ++it)
Shinya Kitaoka 120a6e
    if (it->second->m_type == type) actions.push_back(it->first);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QAction *CommandManager::getActionFromShortcut(std::string shortcutString) {
Shinya Kitaoka 120a6e
  std::map<std::string, *="" node="">::iterator it =</std::string,>
Shinya Kitaoka 120a6e
      m_shortcutTable.find(shortcutString);
Shinya Kitaoka 120a6e
  return it != m_shortcutTable.end() ? it->second->m_qaction : 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
std::string CommandManager::getShortcutFromAction(QAction *action) {
Shinya Kitaoka 120a6e
  std::map<std::string, *="" node="">::iterator it = m_shortcutTable.begin();</std::string,>
Shinya Kitaoka 120a6e
  for (; it != m_shortcutTable.end(); ++it) {
Shinya Kitaoka 120a6e
    if (it->second->m_qaction == action) return it->first;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return "";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
std::string CommandManager::getShortcutFromId(const char *id) {
Shinya Kitaoka 120a6e
  QAction *action = getAction(id);
Shinya Kitaoka 120a6e
  assert(action);
Shinya Kitaoka 120a6e
  if (!action) return "";
Shinya Kitaoka 120a6e
  return getShortcutFromAction(action);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int CommandManager::getKeyFromShortcut(const std::string &shortcut) {
Shinya Kitaoka 120a6e
  QString qShortcut = QString::fromStdString(shortcut);
Shinya Kitaoka 120a6e
  if (qShortcut == "") return 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QKeySequence ks(qShortcut);
Shinya Kitaoka 120a6e
  assert(ks.count() == 1);
Shinya Kitaoka 120a6e
  return ks[0];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int CommandManager::getKeyFromId(const char *id) {
Shinya Kitaoka 120a6e
  return getKeyFromShortcut(getShortcutFromId(id));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Jeremy Bullock e8903b
void CommandManager::setShortcut(QAction *action, std::string shortcutString,
Jeremy Bullock e8903b
                                 bool keepDefault) {
Shinya Kitaoka 120a6e
  QString shortcut = QString::fromStdString(shortcutString);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::string oldShortcutString = action->shortcut().toString().toStdString();
Shinya Kitaoka 120a6e
  if (oldShortcutString == shortcutString) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Cerco il nodo corrispondente ad action. Deve esistere
Shinya Kitaoka 120a6e
  std::map<qaction *="" *,="" node="">::iterator it = m_qactionTable.find(action);</qaction>
Shinya Kitaoka 120a6e
  Node *node = it != m_qactionTable.end() ? it->second : 0;
Shinya Kitaoka 120a6e
  assert(node);
Shinya Kitaoka 120a6e
  assert(node->m_qaction == action);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QKeySequence ks(shortcut);
Shinya Kitaoka 120a6e
  assert(ks.count() == 1 || ks.count() == 0 && shortcut == "");
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (node->m_type == ZoomCommandType && ks.count() > 1) {
Shinya Kitaoka 120a6e
    DVGui::warning(
Jeremy Bullock e8903b
        QObject::tr("It is not possible to assign a shortcut with modifiers to "
Shinya Kitaoka 120a6e
                    "the visualization commands."));
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // lo shortcut e' gia' assegnato?
Shinya Kitaoka 120a6e
  QString oldActionId;
Shinya Kitaoka 120a6e
  std::map<std::string, *="" node="">::iterator sit =</std::string,>
Shinya Kitaoka 120a6e
      m_shortcutTable.find(shortcutString);
Shinya Kitaoka 120a6e
  if (sit != m_shortcutTable.end()) {
Shinya Kitaoka 120a6e
    // la vecchia azione non ha piu' shortcut
Shinya Kitaoka 120a6e
    oldActionId = QString::fromStdString(sit->second->m_id);
Shinya Kitaoka 120a6e
    sit->second->m_qaction->setShortcut(QKeySequence());
Shinya Kitaoka 120a6e
    if (sit->second->m_type == ToolCommandType)
Shinya Kitaoka 120a6e
      updateToolTip(sit->second->m_qaction);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // assegno lo shortcut all'azione
Shinya Kitaoka 120a6e
  action->setShortcut(
Shinya Kitaoka 120a6e
      QKeySequence::fromString(QString::fromStdString(shortcutString)));
Shinya Kitaoka 120a6e
  if (node->m_type == ToolCommandType) updateToolTip(action);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Aggiorno la tabella shortcut -> azioni
Shinya Kitaoka 120a6e
  // Cancello il riferimento all'eventuale vecchio shortcut di action
Shinya Kitaoka 120a6e
  if (oldShortcutString != "") m_shortcutTable.erase(oldShortcutString);
Shinya Kitaoka 120a6e
  // e aggiungo il nuovo legame
Shinya Kitaoka 120a6e
  m_shortcutTable[shortcutString] = node;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // registro il tutto
Shinya Kitaoka 120a6e
  TFilePath fp = ToonzFolder::getMyModuleDir() + TFilePath("shortcuts.ini");
Shinya Kitaoka 120a6e
  QSettings settings(toQString(fp), QSettings::IniFormat);
Shinya Kitaoka 120a6e
  settings.beginGroup("shortcuts");
Shinya Kitaoka 120a6e
  settings.setValue(QString::fromStdString(node->m_id),
Shinya Kitaoka 120a6e
                    QString::fromStdString(shortcutString));
Jeremy Bullock e8903b
  if (keepDefault) {
Jeremy Bullock e8903b
    if (oldActionId != "") settings.remove(oldActionId);
Jeremy Bullock e8903b
  }
Shinya Kitaoka 120a6e
  settings.endGroup();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CommandManager::enable(CommandId id, bool enabled) {
Shinya Kitaoka 120a6e
  Node *node = getNode(id, false);
Shinya Kitaoka 120a6e
  if (!node) return;
Shinya Kitaoka 120a6e
  if (node->m_enabled == enabled) return;
Shinya Kitaoka 120a6e
  node->m_enabled = enabled;
Shinya Kitaoka 120a6e
  if (node->m_qaction)
Shinya Kitaoka 120a6e
    node->m_qaction->setEnabled(
Shinya Kitaoka 120a6e
        node->m_enabled &&
Shinya Kitaoka 120a6e
        (!!node->m_handler || node->m_qaction->actionGroup() != 0));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CommandManager::setChecked(CommandId id, bool checked) {
Shinya Kitaoka 120a6e
  Node *node = getNode(id, false);
Shinya Kitaoka 120a6e
  if (!node) return;
Shinya Kitaoka 120a6e
  if (node->m_qaction) {
Shinya Kitaoka 120a6e
    node->m_qaction->setChecked(checked);
Shinya Kitaoka 120a6e
    if (node->m_handler) node->m_handler->execute();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QAction *CommandManager::getAction(CommandId id, bool createIfNeeded) {
Shinya Kitaoka 120a6e
  Node *node = getNode(id, createIfNeeded);
Shinya Kitaoka 120a6e
  if (node) {
Shinya Kitaoka 120a6e
    return node->m_qaction;
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    return 0;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QAction *CommandManager::createAction(CommandId id, QObject *parent,
Shinya Kitaoka 120a6e
                                      bool state) {
Shinya Kitaoka 120a6e
  Node *node = getNode(id, false);
Shinya Kitaoka 120a6e
  if (!node) return 0;
Shinya Kitaoka 120a6e
  QAction *refAction = node->m_qaction;
Shinya Kitaoka 120a6e
  if (!refAction) return 0;
Shinya Kitaoka 120a6e
  QString text = refAction->text();
Shinya Kitaoka 120a6e
  if (node->m_onText != "" && node->m_offText != "")
Shinya Kitaoka 120a6e
    text          = state ? node->m_onText : node->m_offText;
Shinya Kitaoka 120a6e
  QAction *action = new QAction(text, parent);
Shinya Kitaoka 120a6e
  action->setShortcut(refAction->shortcut());
Shinya Kitaoka 120a6e
  return action;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CommandManager::setToggleTexts(CommandId id, const QString &onText,
Shinya Kitaoka 120a6e
                                    const QString &offText) {
Shinya Kitaoka 120a6e
  Node *node = getNode(id, false);
Shinya Kitaoka 120a6e
  if (node) {
Shinya Kitaoka 120a6e
    node->m_onText  = onText;
Shinya Kitaoka 120a6e
    node->m_offText = offText;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
shun_iwasawa dde155
//---------------------------------------------------------
shun_iwasawa dde155
Shinya Kitaoka 120a6e
std::string CommandManager::getIdFromAction(QAction *action) {
Shinya Kitaoka 120a6e
  std::map<qaction *="" *,="" node="">::iterator it = m_qactionTable.find(action);</qaction>
Shinya Kitaoka 120a6e
  if (it != m_qactionTable.end())
Shinya Kitaoka 120a6e
    return it->second->m_id;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    return "";
shun_iwasawa dde155
}
shun_iwasawa dde155
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString CommandManager::getFullText(CommandId id, bool state)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  std::map<std::string, node*="">::iterator it;</std::string,>
Toshihiro Shimizu 890ddd
  it = m_idTable.find(id);
Toshihiro Shimizu 890ddd
  if(it == m_idTable.end()) return "";
Toshihiro Shimizu 890ddd
  Node *node = it->second;
Toshihiro Shimizu 890ddd
  QAction *action = it->second->m_qaction;
Toshihiro Shimizu 890ddd
  QString text = action->text();
Toshihiro Shimizu 890ddd
  if(node->m_onText != "" && node->m_offText != "")
Toshihiro Shimizu 890ddd
    text = state ? node->m_onText : node->m_offText;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  QString shortcut = QString::fromStdString(getShortcutFromAction(action));
Toshihiro Shimizu 890ddd
  if(shortcut != "") text += " " + shortcut;
Toshihiro Shimizu 890ddd
  return text;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
MenuItemHandler::MenuItemHandler(const char *cmdId) {
Shinya Kitaoka 120a6e
  CommandManager::instance()->setHandler(
Shinya Kitaoka 120a6e
      cmdId, new CommandHandlerHelper<menuitemhandler>(</menuitemhandler>
Shinya Kitaoka 120a6e
                 this, &MenuItemHandler::execute));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// DVAction
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAction::DVAction(const QString &text, QObject *parent)
Shinya Kitaoka 120a6e
    : QAction(text, parent) {
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(triggered()), this, SLOT(onTriggered()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAction::DVAction(const QIcon &icon, const QString &text, QObject *parent)
Shinya Kitaoka 120a6e
    : QAction(icon, text, parent) {
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(triggered()), this, SLOT(onTriggered()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DVAction::onTriggered() { CommandManager::instance()->execute(this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// DVMenuAction
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! It is a menu' with action defined in \b actions.
Shinya Kitaoka 120a6e
                Actions can contain CommandId or simple action name.
Shinya Kitaoka 120a6e
                In first case action triggered is connected with action command
Shinya Kitaoka 120a6e
   execute directly.
Shinya Kitaoka 120a6e
                In second case action triggered is connected with menu action
Shinya Kitaoka 120a6e
   command execute;
Shinya Kitaoka 120a6e
                is helpful to use \b m_triggeredActionIndex to distingue action.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
DVMenuAction::DVMenuAction(const QString &text, QWidget *parent,
Shinya Kitaoka 120a6e
                           QList<qstring> actions)</qstring>
Shinya Kitaoka 120a6e
    : QMenu(text, parent), m_triggeredActionIndex(-1) {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < actions.size(); i++) addAction(actions.at(i));
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(triggered(QAction *)), this,
Shinya Kitaoka 120a6e
          SLOT(onTriggered(QAction *)));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set a new list of action to menu'.
Shinya Kitaoka 120a6e
                NB. If action list is composed by action menaged and action to
Shinya Kitaoka 120a6e
   create pay
Shinya Kitaoka 120a6e
                attention to inserted order.*/
Shinya Kitaoka 120a6e
void DVMenuAction::setActions(QList<qstring> actions) {</qstring>
Shinya Kitaoka 120a6e
  if (m_triggeredActionIndex != -1)  // Sta facendo l'onTriggered
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  clear();
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < actions.size(); i++) {
Shinya Kitaoka 120a6e
    QString actionId = actions.at(i);
Shinya Kitaoka 120a6e
    // Se l'azione e' definita da un CommandId la aggiungo.
Shinya Kitaoka 120a6e
    QAction *action =
Shinya Kitaoka 120a6e
        CommandManager::instance()->getAction(actionId.toStdString().c_str());
Shinya Kitaoka 120a6e
    if (action) {
Shinya Kitaoka 120a6e
      addAction(action);
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // Altrimenti creo una nuova azione e la aggiungo.
Shinya Kitaoka 120a6e
    action = addAction(actionId);
Shinya Kitaoka 120a6e
    action->setData(QVariant(i));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Shinya Kitaoka 120a6e
QString changeStringNumber(QString str, int index) {
Shinya Kitaoka 120a6e
  QString newStr     = str;
Shinya Kitaoka 120a6e
  int n              = 3;
Shinya Kitaoka 120a6e
  if (index >= 10) n = 4;
Shinya Kitaoka 120a6e
  QString number;
Shinya Kitaoka 120a6e
  newStr.replace(0, n, number.number(index + 1) + QString(". "));
Shinya Kitaoka 120a6e
  return newStr;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DVMenuAction::onTriggered(QAction *action) {
Shinya Kitaoka 120a6e
  QVariant data                              = action->data();
Shinya Kitaoka 120a6e
  if (data.isValid()) m_triggeredActionIndex = data.toInt();
Shinya Kitaoka 120a6e
  CommandManager::instance()->execute(action, menuAction());
Shinya Kitaoka 120a6e
  int oldIndex = m_triggeredActionIndex;
Shinya Kitaoka 120a6e
  if (m_triggeredActionIndex != -1) m_triggeredActionIndex = -1;
Shinya Kitaoka 120a6e
  QString str                                              = data.toString();
Shinya Kitaoka 120a6e
  QAction *tableAction =
Shinya Kitaoka 120a6e
      CommandManager::instance()->getAction(str.toStdString().c_str());
Shinya Kitaoka 120a6e
  if (tableAction || oldIndex == 0) return;
Shinya Kitaoka 120a6e
  QList<qaction *=""> acts = actions();</qaction>
Shinya Kitaoka 120a6e
  removeAction(action);
Shinya Kitaoka 120a6e
  insertAction(acts[0], action);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  acts = actions();
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i <= oldIndex; i++) {
Shinya Kitaoka 120a6e
    QAction *a     = acts.at(i);
Shinya Kitaoka 120a6e
    QString newTxt = changeStringNumber(a->text(), i);
Shinya Kitaoka 120a6e
    a->setText(newTxt);
Shinya Kitaoka 120a6e
    a->setData(QVariant(i));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_triggeredActionIndex = -1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------