/* ============================================================================== 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. ============================================================================== */ #include "../../jucer_Headers.h" #include "jucer_PaintRoutinePanel.h" #include "../properties/jucer_ColourPropertyComponent.h" #include "../paintelements/jucer_PaintElementPath.h" //============================================================================== class ComponentBackgroundColourProperty : public JucerColourPropertyComponent, private ChangeListener { public: ComponentBackgroundColourProperty (JucerDocument& doc, PaintRoutine& routine_) : JucerColourPropertyComponent ("background", false), document (doc), routine (routine_) { document.addChangeListener (this); } ~ComponentBackgroundColourProperty() { document.removeChangeListener (this); } void changeListenerCallback (ChangeBroadcaster*) override { refresh(); } void setColour (Colour newColour) override { routine.setBackgroundColour (newColour); } Colour getColour() const override { return routine.getBackgroundColour(); } void resetToDefault() override { jassertfalse; // option shouldn't be visible } protected: JucerDocument& document; PaintRoutine& routine; }; //============================================================================== class GraphicsPropsPanel : public Component, public ChangeListener { public: GraphicsPropsPanel (PaintRoutine& paintRoutine_, JucerDocument* doc) : paintRoutine (paintRoutine_), document (doc) { paintRoutine.getSelectedElements().addChangeListener (this); paintRoutine.getSelectedPoints().addChangeListener (this); addAndMakeVisible (propsPanel = new PropertyPanel()); } ~GraphicsPropsPanel() { paintRoutine.getSelectedPoints().removeChangeListener (this); paintRoutine.getSelectedElements().removeChangeListener (this); clear(); deleteAllChildren(); } void resized() { propsPanel->setBounds (4, 4, getWidth() - 8, getHeight() - 8); } void changeListenerCallback (ChangeBroadcaster*) { updateList(); } void clear() { propsPanel->clear(); } void updateList() { ScopedPointer state (propsPanel->getOpennessState()); clear(); if (document != nullptr) { Array props; props.add (new ComponentBackgroundColourProperty (*document, paintRoutine)); propsPanel->addSection ("Class Properties", props); } if (state != nullptr) propsPanel->restoreOpennessState (*state); if (paintRoutine.getSelectedElements().getNumSelected() == 1) // xxx need to cope with multiple { if (PaintElement* const pe = paintRoutine.getSelectedElements().getSelectedItem (0)) { if (paintRoutine.containsElement (pe)) { Array props; pe->getEditableProperties (props); propsPanel->addSection (pe->getTypeName(), props); } } } if (paintRoutine.getSelectedPoints().getNumSelected() == 1) // xxx need to cope with multiple { if (PathPoint* const point = paintRoutine.getSelectedPoints().getSelectedItem (0)) { Array props; point->getEditableProperties (props); propsPanel->addSection ("Path segment", props); } } } private: PaintRoutine& paintRoutine; JucerDocument* document; PropertyPanel* propsPanel; }; //============================================================================== PaintRoutinePanel::PaintRoutinePanel (JucerDocument& doc, PaintRoutine& pr, JucerDocumentEditor* documentHolder) : EditingPanelBase (doc, new GraphicsPropsPanel (pr, &doc), new PaintRoutineEditor (pr, doc, documentHolder)), routine (pr) { } PaintRoutinePanel::~PaintRoutinePanel() { deleteAllChildren(); } void PaintRoutinePanel::updatePropertiesList() { ((GraphicsPropsPanel*) propsPanel)->updateList(); } Rectangle PaintRoutinePanel::getComponentArea() const { return ((PaintRoutineEditor*) editor)->getComponentArea(); }