/* ============================================================================== 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 //============================================================================== class JucerColourPropertyComponent : public PropertyComponent { public: JucerColourPropertyComponent (const String& name, const bool canReset) : PropertyComponent (name) { colourPropEditor.reset (new ColourPropEditorComponent (this, canReset)); addAndMakeVisible (colourPropEditor.get()); } virtual void setColour (Colour newColour) = 0; virtual Colour getColour() const = 0; virtual void resetToDefault() = 0; void refresh() override { ((ColourPropEditorComponent*) getChildComponent (0))->refresh(); } class ColourEditorComponent : public Component, private ChangeListener { public: ColourEditorComponent (const bool canReset) : canResetToDefault (canReset) { } void paint (Graphics& g) override { g.fillAll (Colours::grey); g.fillCheckerBoard (getLocalBounds().reduced (2, 2).toFloat(), 10.0f, 10.0f, Colour (0xffdddddd).overlaidWith (colour), Colour (0xffffffff).overlaidWith (colour)); g.setColour (Colours::white.overlaidWith (colour).contrasting()); g.setFont (Font ((float) getHeight() * 0.6f, Font::bold)); g.drawFittedText (colour.toDisplayString (true), 2, 1, getWidth() - 4, getHeight() - 1, Justification::centred, 1); } virtual void setColour (Colour newColour) = 0; virtual void resetToDefault() = 0; virtual Colour getColour() const = 0; void refresh() { const Colour col (getColour()); if (col != colour) { colour = col; repaint(); } } void mouseDown (const MouseEvent&) override { CallOutBox::launchAsynchronously (std::make_unique (this, canResetToDefault), getScreenBounds(), nullptr); } class ColourSelectorComp : public Component { public: ColourSelectorComp (ColourEditorComponent* owner_, const bool canReset) : owner (owner_), defaultButton ("Reset to Default") { addAndMakeVisible (selector); selector.setName ("Colour"); selector.setCurrentColour (owner->getColour()); selector.addChangeListener (owner); if (canReset) { addAndMakeVisible (defaultButton); defaultButton.onClick = [this] { owner->resetToDefault(); owner->refresh(); selector.setCurrentColour (owner->getColour()); }; } setSize (300, 400); } void resized() override { if (defaultButton.isVisible()) { selector.setBounds (0, 0, getWidth(), getHeight() - 30); defaultButton.changeWidthToFitText (22); defaultButton.setTopLeftPosition (10, getHeight() - 26); } else { selector.setBounds (getLocalBounds()); } } private: class ColourSelectorWithSwatches : public ColourSelector { public: ColourSelectorWithSwatches() { } int getNumSwatches() const override { return getAppSettings().swatchColours.size(); } Colour getSwatchColour (int index) const override { return getAppSettings().swatchColours [index]; } void setSwatchColour (int index, const Colour& newColour) override { getAppSettings().swatchColours.set (index, newColour); } }; ColourEditorComponent* owner; ColourSelectorWithSwatches selector; TextButton defaultButton; }; private: void changeListenerCallback (ChangeBroadcaster* source) override { const ColourSelector* const cs = (const ColourSelector*) source; if (cs->getCurrentColour() != getColour()) setColour (cs->getCurrentColour()); } Colour colour; bool canResetToDefault; }; class ColourPropEditorComponent : public ColourEditorComponent { JucerColourPropertyComponent* const owner; public: ColourPropEditorComponent (JucerColourPropertyComponent* const owner_, const bool canReset) : ColourEditorComponent (canReset), owner (owner_) {} void setColour (Colour newColour) override { owner->setColour (newColour); } Colour getColour() const override { return owner->getColour(); } void resetToDefault() override { owner->resetToDefault(); } }; std::unique_ptr colourPropEditor; };