/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-11 by Raw Material Software Ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License (Version 2), as published by the Free Software Foundation. A copy of the license is included in the JUCE distribution, or can be found online 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.rawmaterialsoftware.com/juce for more information. ============================================================================== */ #ifndef __JUCER_APPEARANCESETTINGS_H_34D762C7__ #define __JUCER_APPEARANCESETTINGS_H_34D762C7__ class AppearanceSettings : private ValueTree::Listener { public: AppearanceSettings(); bool readFromFile (const File& file); bool readFromXML (const XmlElement&); bool writeToFile (const File& file) const; void applyToCodeEditor (CodeEditorComponent& editor) const; StringArray getColourNames() const; Value getColourValue (const String& colourName); bool getColour (const String& name, Colour& resultIfFound) const; Font getCodeFont() const; Value getCodeFontValue(); ValueTree settings; File getSchemesFolder(); StringArray getPresetSchemes(); void refreshPresetSchemeList(); void selectPresetScheme (int index); static Component* createEditorWindow(); private: static const char* getSchemeFileSuffix() { return ".editorscheme"; } Array presetSchemeFiles; void applyToLookAndFeel (LookAndFeel&) const; void updateColourScheme(); void valueTreePropertyChanged (ValueTree&, const Identifier&) { updateColourScheme(); } void valueTreeChildAdded (ValueTree&, ValueTree&) { updateColourScheme(); } void valueTreeChildRemoved (ValueTree&, ValueTree&) { updateColourScheme(); } void valueTreeChildOrderChanged (ValueTree&) { updateColourScheme(); } void valueTreeParentChanged (ValueTree&) { updateColourScheme(); } void valueTreeRedirected (ValueTree&) { updateColourScheme(); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AppearanceSettings); }; //============================================================================== class IntrojucerLookAndFeel : public LookAndFeel { public: IntrojucerLookAndFeel(); int getTabButtonOverlap (int tabDepth) { return -1; } int getTabButtonSpaceAroundImage() { return 1; } int getTabButtonBestWidth (TabBarButton& button, int tabDepth) { return 120; } void createTabTextLayout (const TabBarButton& button, const Rectangle& textArea, GlyphArrangement& textLayout) { Font font (textArea.getHeight() * 0.5f); font.setUnderline (button.hasKeyboardFocus (false)); textLayout.addFittedText (font, button.getButtonText().trim(), (float) textArea.getX(), (float) textArea.getY(), (float) textArea.getWidth(), (float) textArea.getHeight(), Justification::centred, 1); } static Colour getTabBackgroundColour (TabBarButton& button) { Colour normalBkg (button.getTabBackgroundColour()); Colour bkg (normalBkg.contrasting (0.15f)); if (button.isFrontTab()) bkg = bkg.overlaidWith (Colours::yellow.withAlpha (0.5f)); return bkg; } void drawTabButton (TabBarButton& button, Graphics& g, bool isMouseOver, bool isMouseDown) { const Rectangle activeArea (button.getActiveArea()); Colour bkg (getTabBackgroundColour (button)); g.setGradientFill (ColourGradient (bkg.brighter (0.1f), 0, (float) activeArea.getY(), bkg.darker (0.1f), 0, (float) activeArea.getBottom(), false)); g.fillRect (activeArea); g.setColour (button.getTabBackgroundColour().darker (0.3f)); g.drawRect (activeArea); GlyphArrangement textLayout; createTabTextLayout (button, button.getTextArea(), textLayout); const float alpha = button.isEnabled() ? ((isMouseOver || isMouseDown) ? 1.0f : 0.8f) : 0.3f; g.setColour (bkg.contrasting().withMultipliedAlpha (alpha)); textLayout.draw (g); } Rectangle getTabButtonExtraComponentBounds (const TabBarButton& button, Rectangle& textArea, Component& comp) { GlyphArrangement textLayout; createTabTextLayout (button, textArea, textLayout); const int textWidth = (int) textLayout.getBoundingBox (0, -1, false).getWidth(); const int extraSpace = jmax (0, textArea.getWidth() - (textWidth + comp.getWidth())) / 2; textArea.removeFromRight (extraSpace); textArea.removeFromLeft (extraSpace); return textArea.removeFromRight (comp.getWidth()); } void drawTabAreaBehindFrontButton (TabbedButtonBar&, Graphics&, int, int) {} void drawStretchableLayoutResizerBar (Graphics& g, int /*w*/, int /*h*/, bool /*isVerticalBar*/, bool isMouseOver, bool isMouseDragging) { if (isMouseOver || isMouseDragging) g.fillAll (Colours::yellow.withAlpha (0.4f)); } Rectangle getPropertyComponentContentPosition (PropertyComponent&); }; #endif