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"
shun_iwasawa cf18d8
#include "tsystem.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,
shun-iwasawa 9b2afe
                            std::string defaultShortcutString, QAction *qaction,
shun-iwasawa 9b2afe
                            const char *iconSVGName) {
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(
Rozhuk Ivan 823a31
      (node->m_enabled &&
shun-iwasawa f84c65
       (node->m_handler || node->m_qaction->actionGroup() != 0)) ||
Shinya Kitaoka 120a6e
      node->m_type == MiscCommandType ||
shun-iwasawa f84c65
      node->m_type == ToolModifierCommandType ||
shun-iwasawa f84c65
      node->m_type == CellMarkCommandType);
shun-iwasawa 9b2afe
  node->m_iconSVGName = iconSVGName;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_qactionTable[qaction] = node;
Shinya Kitaoka 120a6e
  qaction->setShortcutContext(Qt::ApplicationShortcut);
shun_iwasawa cf18d8
  // user defined shortcuts will be loaded afterwards in loadShortcuts()
Shinya Kitaoka 120a6e
  QString defaultShortcutQString =
Shinya Kitaoka 120a6e
      QString::fromStdString(defaultShortcutString);
shun_iwasawa cf18d8
  if (!defaultShortcutQString.isEmpty()) {
shun_iwasawa cf18d8
    qaction->setShortcut(QKeySequence(defaultShortcutQString));
shun_iwasawa cf18d8
    m_shortcutTable[defaultShortcutString] = 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 != "")
shun-iwasawa f84c65
    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
shun_iwasawa cf18d8
//---------------------------------------------------------
shun-iwasawa 9b2afe
shun-iwasawa 9b2afe
const char *CommandManager::getIconSVGName(CommandId id) {
shun-iwasawa 9b2afe
  Node *node = getNode(id, false);
shun-iwasawa 9b2afe
  if (node) return node->m_iconSVGName;
shun-iwasawa 9b2afe
  return "";
shun-iwasawa 9b2afe
}
shun-iwasawa 9b2afe
shun-iwasawa 9b2afe
void CommandManager::enlargeIcon(CommandId id, const QSize dstSize) {
shun-iwasawa 9b2afe
  QAction *action = getAction(id, false);
shun-iwasawa 9b2afe
  if (!action) return;
shun-iwasawa 9b2afe
shun-iwasawa 9b2afe
  const char *iconSVGName = getIconSVGName(id);
shun-iwasawa 9b2afe
  if (iconSVGName == "") return;
shun-iwasawa 9b2afe
shun-iwasawa 9b2afe
  QIcon icon = action->icon();
shun-iwasawa 9b2afe
shun-iwasawa 9b2afe
  for (QList<qsize> sizes = icon.availableSizes(); !sizes.isEmpty();</qsize>
shun-iwasawa 9b2afe
       sizes.removeFirst()) {
shun-iwasawa 9b2afe
    if (sizes.first().width() > dstSize.width() &&
shun-iwasawa 9b2afe
        sizes.first().height() > dstSize.height())
shun-iwasawa 9b2afe
      return;
shun-iwasawa 9b2afe
  }
shun-iwasawa 9b2afe
konero 7bed16
  icon = createQIcon(iconSVGName, false, false, dstSize);
konero 7bed16
  
shun-iwasawa 9b2afe
  action->setIcon(icon);
shun-iwasawa 9b2afe
}
shun-iwasawa 9b2afe
shun-iwasawa 9b2afe
//---------------------------------------------------------
shun_iwasawa cf18d8
// load user defined shortcuts
shun_iwasawa cf18d8
shun_iwasawa cf18d8
void CommandManager::loadShortcuts() {
shun_iwasawa cf18d8
  TFilePath fp = ToonzFolder::getMyModuleDir() + TFilePath("shortcuts.ini");
shun_iwasawa cf18d8
  if (!TFileStatus(fp).doesExist()) {
shun_iwasawa cf18d8
    // if user shortcut file does not exist, then try to load from template
shun_iwasawa cf18d8
    TFilePath tmplFp =
shun_iwasawa cf18d8
        ToonzFolder::getTemplateModuleDir() + TFilePath("shortcuts.ini");
shun_iwasawa cf18d8
    if (TFileStatus(tmplFp).doesExist()) TSystem::copyFile(fp, tmplFp);
shun_iwasawa cf18d8
    // if neither settings exist, do nothing and return
shun_iwasawa cf18d8
    else
shun_iwasawa cf18d8
      return;
shun_iwasawa cf18d8
  }
shun_iwasawa cf18d8
shun_iwasawa cf18d8
  QSettings settings(toQString(fp), QSettings::IniFormat);
shun_iwasawa cf18d8
  settings.beginGroup("shortcuts");
shun_iwasawa cf18d8
  QStringList ids = settings.allKeys();
shun_iwasawa cf18d8
  for (int i = 0; i < ids.size(); i++) {
shun_iwasawa cf18d8
    std::string id   = ids.at(i).toStdString();
shun_iwasawa cf18d8
    QString shortcut = settings.value(ids.at(i), "").toString();
shun_iwasawa cf18d8
    QAction *action  = getAction(&id[0], false);
shun_iwasawa cf18d8
    if (action) {
shun_iwasawa cf18d8
      QString oldShortcut = action->shortcut().toString();
shun_iwasawa cf18d8
      if (oldShortcut == shortcut) continue;
shun_iwasawa cf18d8
      if (!oldShortcut.isEmpty())
shun_iwasawa cf18d8
        m_shortcutTable.erase(oldShortcut.toStdString());
shun_iwasawa cf18d8
      if (!shortcut.isEmpty()) {
shun_iwasawa cf18d8
        QAction *other = getActionFromShortcut(shortcut.toStdString());
shun_iwasawa cf18d8
        if (other) other->setShortcut(QKeySequence());
shun_iwasawa cf18d8
        m_shortcutTable[shortcut.toStdString()] = getNode(&id[0]);
shun_iwasawa cf18d8
      }
shun_iwasawa cf18d8
      action->setShortcut(QKeySequence(shortcut));
shun_iwasawa cf18d8
    }
shun_iwasawa cf18d8
  }
shun_iwasawa cf18d8
  settings.endGroup();
shun_iwasawa cf18d8
}
shun_iwasawa cf18d8
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,
shun-iwasawa 9b2afe
                           QList<qstring> actions, bool isForRecentFiles)</qstring>
shun-iwasawa 9b2afe
    : QMenu(text, parent)
shun-iwasawa 9b2afe
    , m_triggeredActionIndex(-1)
shun-iwasawa 9b2afe
    , m_isForRecentFiles(isForRecentFiles) {
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) {
shun-iwasawa f84c65
  QString newStr = str;
shun-iwasawa f84c65
  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
}
shun-iwasawa f84c65
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DVMenuAction::onTriggered(QAction *action) {
shun-iwasawa f84c65
  QVariant data = action->data();
Shinya Kitaoka 120a6e
  if (data.isValid()) m_triggeredActionIndex = data.toInt();
Shinya Kitaoka 120a6e
  CommandManager::instance()->execute(action, menuAction());
shun-iwasawa 9b2afe
shun-iwasawa 9b2afe
  // simply execute the menu item and return
shun-iwasawa 1e3d47
  if (!m_isForRecentFiles) {
shun-iwasawa 1e3d47
    m_triggeredActionIndex = -1;
shun-iwasawa 1e3d47
    return;
shun-iwasawa 1e3d47
  }
shun-iwasawa 9b2afe
Shinya Kitaoka 120a6e
  int oldIndex = m_triggeredActionIndex;
Shinya Kitaoka 120a6e
  if (m_triggeredActionIndex != -1) m_triggeredActionIndex = -1;
shun-iwasawa f84c65
  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
//-----------------------------------------------------------------------------