Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/tselectionhandle.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/selection.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// TSelectionHandle
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TSelectionHandle::TSelectionHandle() { m_selectionStack.push_back(0); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TSelectionHandle::~TSelectionHandle() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TSelection *TSelectionHandle::getSelection() const {
Shinya Kitaoka 120a6e
  return m_selectionStack.back();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TSelectionHandle::setSelection(TSelection *selection) {
Shinya Kitaoka 120a6e
  if (getSelection() == selection) return;
shun-iwasawa afe084
  TSelection *oldSelection       = getSelection();
shun-iwasawa afe084
  CommandManager *commandManager = CommandManager::instance();
Shinya Kitaoka 120a6e
  if (oldSelection) {
Shinya Kitaoka 120a6e
    oldSelection->selectNone();
Shinya Kitaoka 120a6e
    // disable selection related commands
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < (int)m_enabledCommandIds.size(); i++)
Shinya Kitaoka 120a6e
      commandManager->setHandler(m_enabledCommandIds[i].c_str(), 0);
Shinya Kitaoka 120a6e
    m_enabledCommandIds.clear();
shun-iwasawa afe084
shun-iwasawa afe084
    // revert alternative command names to original ones kept in the icon texts
shun-iwasawa afe084
    for (auto commandId : oldSelection->alternativeCommandNames().keys()) {
shun-iwasawa afe084
      QAction *action = commandManager->getAction(commandId);
shun-iwasawa afe084
      action->setText(action->iconText());
shun-iwasawa afe084
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_selectionStack.back() = selection;
shun-iwasawa afe084
  if (selection) {
shun-iwasawa afe084
    selection->enableCommands();
shun-iwasawa afe084
shun-iwasawa afe084
    // set alternative command names
shun-iwasawa afe084
    QMap<commandid, qstring="">::const_iterator i =</commandid,>
shun-iwasawa afe084
        selection->alternativeCommandNames().constBegin();
shun-iwasawa afe084
    while (i != selection->alternativeCommandNames().constEnd()) {
shun-iwasawa afe084
      QAction *action = commandManager->getAction(i.key());
shun-iwasawa afe084
      action->setText(i.value());
shun-iwasawa afe084
      ++i;
shun-iwasawa afe084
    }
shun-iwasawa afe084
  }
Shinya Kitaoka 120a6e
  emit selectionSwitched(oldSelection, selection);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TSelectionHandle::pushSelection() {
Shinya Kitaoka 120a6e
  // NOTE
Shinya Kitaoka 120a6e
  //  We push 0, and NOT a copy of the last item. I think this is done on
Shinya Kitaoka 120a6e
  //  purpose,
Shinya Kitaoka 120a6e
  //  as having it copied and then selecting a different one invokes
Shinya Kitaoka 120a6e
  //  selectNone()
Shinya Kitaoka 120a6e
  //  on the former.
Shinya Kitaoka 120a6e
  m_selectionStack.push_back(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TSelectionHandle::popSelection() {
Shinya Kitaoka 120a6e
  if (m_selectionStack.size() > 1) m_selectionStack.pop_back();
Shinya Kitaoka 120a6e
  TSelection *selection = getSelection();
Shinya Kitaoka 120a6e
  if (selection) selection->enableCommands();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TSelectionHandle::enableCommand(std::string cmdId,
Shinya Kitaoka 120a6e
                                     CommandHandlerInterface *handler) {
Shinya Kitaoka 120a6e
  CommandManager::instance()->setHandler(cmdId.c_str(), handler);
Shinya Kitaoka 120a6e
  m_enabledCommandIds.push_back(cmdId);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TSelectionHandle::notifySelectionChanged() {
Shinya Kitaoka 120a6e
  emit selectionChanged(m_selectionStack.back());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TSelectionHandle *TSelectionHandle::getCurrent() {
Shinya Kitaoka 120a6e
  static TSelectionHandle _currentSelection;
Shinya Kitaoka 120a6e
  return &_currentSelection;
Toshihiro Shimizu 890ddd
}