/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ #pragma once #include "paintelements/jucer_PaintElement.h" class JucerDocument; class PathPoint; //============================================================================== /** Contains a set of PaintElements that constitute some kind of paint() method. */ class PaintRoutine { public: //============================================================================== PaintRoutine(); ~PaintRoutine(); //============================================================================== void changed(); bool perform (UndoableAction* action, const String& actionName); //============================================================================== int getNumElements() const noexcept { return elements.size(); } PaintElement* getElement (const int index) const noexcept { return elements [index]; } int indexOfElement (PaintElement* e) const noexcept { return elements.indexOf (e); } bool containsElement (PaintElement* e) const noexcept { return elements.contains (e); } //============================================================================== void clear(); PaintElement* addElementFromXml (const XmlElement& xml, const int index, const bool undoable); PaintElement* addNewElement (PaintElement* elementToCopy, const int index, const bool undoable); void removeElement (PaintElement* element, const bool undoable); void elementToFront (PaintElement* element, const bool undoable); void elementToBack (PaintElement* element, const bool undoable); const Colour getBackgroundColour() const noexcept { return backgroundColour; } void setBackgroundColour (Colour newColour) noexcept; void fillWithBackground (Graphics& g, const bool drawOpaqueBackground); void drawElements (Graphics& g, const Rectangle& relativeTo); void dropImageAt (const File& f, int x, int y); //============================================================================== SelectedItemSet & getSelectedElements() noexcept { return selectedElements; } SelectedItemSet & getSelectedPoints() noexcept { return selectedPoints; } static const char* const clipboardXmlTag; void copySelectedToClipboard(); void paste(); void deleteSelected(); void selectAll(); void selectedToFront(); void selectedToBack(); void groupSelected(); void ungroupSelected(); void startDragging (const Rectangle& parentArea); void dragSelectedComps (int dxFromDragStart, int dyFromDragStart, const Rectangle& parentArea); void endDragging(); void bringLostItemsBackOnScreen (const Rectangle& parentArea); //============================================================================== void setDocument (JucerDocument* const doc) { document = doc; } JucerDocument* getDocument() const noexcept { return document; } //============================================================================== static const char* xmlTagName; XmlElement* createXml() const; bool loadFromXml (const XmlElement& xml); void fillInGeneratedCode (GeneratedCode& code, String& paintMethodCode) const; //============================================================================== private: OwnedArray elements; SelectedItemSet selectedElements; SelectedItemSet selectedPoints; JucerDocument* document; Colour backgroundColour; friend class DeleteElementAction; friend class FrontOrBackElementAction; void moveElementZOrder (int oldIndex, int newIndex); };