diff --git a/toonz/sources/tnztools/editassistantstool.cpp b/toonz/sources/tnztools/editassistantstool.cpp index 4c0040d..0f17d54 100644 --- a/toonz/sources/tnztools/editassistantstool.cpp +++ b/toonz/sources/tnztools/editassistantstool.cpp @@ -29,7 +29,8 @@ class EditAssistantsUndo final : public ToolUtils::TToolUndo { private: - bool m_isAssistantCreated; + bool m_isCreated; + bool m_isRemoved; TMetaObjectP m_metaObject; TVariant m_oldData; TVariant m_newData; @@ -39,12 +40,14 @@ public: EditAssistantsUndo( TXshSimpleLevel *level, const TFrameId &frameId, - bool isAssistantCreated, + bool isCreated, + bool isRemoved, TMetaObjectR metaObject, TVariant oldData ): ToolUtils::TToolUndo(level, frameId), - m_isAssistantCreated(isAssistantCreated), + m_isCreated(isCreated), + m_isRemoved(isRemoved), m_metaObject(metaObject.getPointer()), m_oldData(oldData), m_newData(m_metaObject->data()), @@ -56,32 +59,35 @@ public: QString getToolName() override { return QString("Edit Assistants Tool"); } - void undo() const override { - if (TMetaImage *metaImage = dynamic_cast<TMetaImage*>(m_level->getFrame(m_frameId, true).getPointer())) { - TMetaImage::Writer writer(*metaImage); - if (m_isAssistantCreated) { + void process(bool remove, const TVariant &data) const { + if (TMetaImage *metaImage = dynamic_cast<TMetaImage*>(m_level->getFrame(m_frameId, true).getPointer())) + { + { // wrap writer + TMetaImage::Writer writer(*metaImage); + bool found = false; for(TMetaObjectRefList::iterator i = writer->begin(); i != writer->end(); ++i) - if (*i == m_metaObject) { writer->erase(i); break; } - } else { - m_metaObject->data() = m_oldData; - if (TMetaObjectHandler *handler = m_metaObject->getHandler<TMetaObjectHandler>()) - handler->fixData(); + if (*i == m_metaObject) { + if (remove) writer->erase(i); + found = true; + break; + } + if (!remove) { + if (!found) + writer->push_back(TMetaObjectR(m_metaObject.getPointer())); + m_metaObject->data() = data; + if (TMetaObjectHandler *handler = m_metaObject->getHandler<TMetaObjectHandler>()) + handler->fixData(); + } } notifyImageChanged(); } } - void redo() const override { - if (TMetaImage *metaImage = dynamic_cast<TMetaImage*>(m_level->getFrame(m_frameId, true).getPointer())) { - TMetaImage::Writer writer(*metaImage); - m_metaObject->data() = m_newData; - if (TMetaObjectHandler *handler = m_metaObject->getHandler<TMetaObjectHandler>()) - handler->fixData(); - if (m_isAssistantCreated) - writer->push_back(TMetaObjectR(m_metaObject.getPointer())); - notifyImageChanged(); - } - } + void undo() const override + { process(m_isCreated, m_oldData); } + + void redo() const override + { process(m_isRemoved, m_newData); } }; @@ -265,18 +271,57 @@ public: getApplication()->getCurrentLevel()->getLevel()->getSimpleLevel(), getCurrentFid(), m_currentAssistantCreated, + false, obj, m_currentAssistantBackup )); + m_currentAssistantCreated = false; } } - m_assistantType.setIndex(0); notifyImageChanged(); + m_assistantType.setIndex(0); getApplication()->getCurrentTool()->notifyToolChanged(); m_currentPosition = position; getViewer()->GLInvalidateAll(); m_dragging = false; } + bool keyEvent( + bool press, + TInputState::Key key, + QKeyEvent *event, + const TInputManager &manager ) + { + if (key == TKey(Qt::Key_Delete)) { + if (!m_dragging) + if (m_currentAssistantIndex >= 0) + if (TMetaImage *mi = dynamic_cast<TMetaImage*>(getImage(true))) + { + { // wrap writer + TMetaImage::Writer writer(*mi); + if (m_currentAssistantIndex < (int)writer->size()) + if (TMetaObjectR obj = (*writer)[m_currentAssistantIndex]) + if (TAssistant *assistant = obj->getHandler<TAssistant>()) + { + writer->erase(writer->begin() + m_currentAssistantIndex); + TUndoManager::manager()->add(new EditAssistantsUndo( + getApplication()->getCurrentLevel()->getLevel()->getSimpleLevel(), + getCurrentFid(), + false, + true, + obj, + obj->data() )); + } + } + resetCurrentPoint(); + notifyImageChanged(); + getApplication()->getCurrentTool()->notifyToolChanged(); + getViewer()->GLInvalidateAll(); + } + return true; + } + return false; + } + void draw() override { m_currentGuidelines.clear();