/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 7 End-User License Agreement and JUCE Privacy Policy. End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #pragma once #include "../UI/jucer_JucerDocumentEditor.h" #include "jucer_PaintElementGroup.h" //============================================================================== template class PaintElementUndoableAction : public UndoableAction { public: JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6011) PaintElementUndoableAction (ElementType* const element) : routine (*element->getOwner()), elementIndex (element->getOwner()->indexOfElement (element)) { jassert (element != nullptr); if (element != nullptr && elementIndex < 0) findGroupIndices (element->getOwner(), element); jassert (elementIndex >= 0); } JUCE_END_IGNORE_WARNINGS_MSVC ElementType* getElement() const { if (containerGroups.size() > 0) { auto group = dynamic_cast (routine.getElement (containerGroups.getFirst())); if (group == nullptr) return nullptr; for (int i = 1; i < containerGroups.size(); ++i) { group = dynamic_cast (group->getElement (containerGroups.getUnchecked (i))); if (group == nullptr) return nullptr; } auto e = dynamic_cast (group->getElement (elementIndex)); jassert (e != nullptr); return e; } else { auto e = dynamic_cast (routine.getElement (elementIndex)); jassert (e != nullptr); return e; } } int getSizeInUnits() { return 2; } protected: PaintRoutine& routine; int elementIndex; Array containerGroups; void changed() const { jassert (routine.getDocument() != nullptr); routine.getDocument()->changed(); } void showCorrectTab() const { if (JucerDocumentEditor* const docHolder = JucerDocumentEditor::getActiveDocumentHolder()) docHolder->showGraphics (&routine); if (routine.getSelectedElements().getNumSelected() == 0) if (ElementType* const e = dynamic_cast (routine.getElement (elementIndex))) routine.getSelectedElements().selectOnly (e); } private: void findGroupIndices (PaintRoutine* const pr, PaintElement* const element) { for (int i = pr->getNumElements(); --i >= 0;) { if (auto pg = dynamic_cast (pr->getElement (i))) { if (pg->containsElement (element)) { containerGroups.add (i); findGroupIndices (pg, element); } } } } void findGroupIndices (PaintElementGroup* const group, PaintElement* const element) { elementIndex = group->indexOfElement (element); if (elementIndex < 0) { for (int i = group->getNumElements(); --i >= 0;) { if (auto pg = dynamic_cast (group->getElement (i))) { if (pg->containsElement (element)) { containerGroups.add (i); findGroupIndices (pg, element); } } } } } PaintElementUndoableAction (const PaintElementUndoableAction&); PaintElementUndoableAction& operator= (const PaintElementUndoableAction&); };