/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2020 - 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 6 End-User License Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). End User License Agreement: www.juce.com/juce-6-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 "MainComponent.h" //============================================================================== class SettingsContent : public Component { public: SettingsContent (MainComponent& topLevelComponent) : innerContent (topLevelComponent) { settingsViewport.setViewedComponent (&innerContent, false); addAndMakeVisible (settingsViewport); setFocusContainerType (FocusContainerType::focusContainer); setTitle ("DemoRunner Settings"); setOpaque (true); } void paint (Graphics& g) override { g.fillAll (findColour (ResizableWindow::backgroundColourId)); } void resized() override { constexpr int minimumWidth = 350; constexpr int minimumHeight = 550; auto r = getLocalBounds(); const auto scrollBarWidth = getLookAndFeel().getDefaultScrollbarWidth(); innerContent.setSize (jmax (r.getWidth() - scrollBarWidth, minimumWidth), jmax (r.getHeight(), minimumHeight)); settingsViewport.setBounds (r); } private: static constexpr float titleLabelFontHeight = 18.0f; static constexpr int itemHeight = 30; static constexpr int itemSpacing = 7; class GraphicsSettingsGroup : public Component, private ComponentMovementWatcher { public: GraphicsSettingsGroup (MainComponent& comp) : ComponentMovementWatcher (&comp), mainComponent (comp) { addAndMakeVisible (titleLabel); titleLabel.setFont (titleLabelFontHeight); addLookAndFeels(); addAndMakeVisible (lookAndFeelSelector); for (int i = 0; i < lookAndFeelNames.size(); ++i) lookAndFeelSelector.addItem (lookAndFeelNames.getReference (i), i + 1); lookAndFeelSelector.setSelectedItemIndex (lookAndFeelNames.indexOf ("LookAndFeel_V4 (Dark)")); lookAndFeelSelector.onChange = [this] { auto* lf = lookAndFeels.getUnchecked (lookAndFeelSelector.getSelectedItemIndex()); Desktop::getInstance().setDefaultLookAndFeel (lf); }; addAndMakeVisible (lookAndFeelLabel); lookAndFeelLabel.setJustificationType (Justification::centredRight); lookAndFeelLabel.attachToComponent (&lookAndFeelSelector, true); addAndMakeVisible (rendererSelector); rendererSelector.onChange = [this] { mainComponent.setRenderingEngine (rendererSelector.getSelectedItemIndex()); }; addAndMakeVisible (rendererLabel); rendererLabel.setJustificationType (Justification::centredRight); rendererLabel.attachToComponent (&rendererSelector, true); setFocusContainerType (FocusContainerType::focusContainer); setTitle ("Graphics Settings"); } void resized() override { auto bounds = getLocalBounds(); titleLabel.setBounds (bounds.removeFromTop (itemHeight)); bounds.removeFromTop (itemSpacing); const auto xPos = roundToInt ((float) bounds.getX() + ((float) bounds.getWidth() * 0.35f)); const auto width = roundToInt ((float) bounds.getWidth() * 0.6f); lookAndFeelSelector.setBounds (bounds.removeFromTop (itemHeight).withWidth (width).withX (xPos)); bounds.removeFromTop (itemSpacing); rendererSelector.setBounds (bounds.removeFromTop (itemHeight).withWidth (width).withX (xPos)); } private: void componentMovedOrResized (bool, bool) override {} using ComponentListener::componentMovedOrResized; void componentVisibilityChanged() override {} using ComponentListener::componentVisibilityChanged; void componentPeerChanged() override { auto* newPeer = mainComponent.getPeer(); if (peer != newPeer) { peer = newPeer; if (peer != nullptr) refreshRenderingEngineSelector(); } } void refreshRenderingEngineSelector() { rendererSelector.clear (NotificationType::dontSendNotification); rendererSelector.addItemList (mainComponent.getRenderingEngines(), 1); rendererSelector.setSelectedItemIndex (mainComponent.getCurrentRenderingEngine()); } void addLookAndFeels() { lookAndFeelNames.addArray ({ "LookAndFeel_V1", "LookAndFeel_V2", "LookAndFeel_V3", "LookAndFeel_V4 (Dark)", "LookAndFeel_V4 (Midnight)", "LookAndFeel_V4 (Grey)", "LookAndFeel_V4 (Light)" }); lookAndFeels.add (new LookAndFeel_V1()); lookAndFeels.add (new LookAndFeel_V2()); lookAndFeels.add (new LookAndFeel_V3()); lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getDarkColourScheme())); lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getMidnightColourScheme())); lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getGreyColourScheme())); lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getLightColourScheme())); } MainComponent& mainComponent; ComponentPeer* peer = nullptr; Label titleLabel { {}, "Graphics" }, lookAndFeelLabel { {}, "LookAndFeel:" }, rendererLabel { {}, "Renderer:" }; ComboBox lookAndFeelSelector, rendererSelector; StringArray lookAndFeelNames; OwnedArray lookAndFeels; }; class AudioSettingsGroup : public Component { public: AudioSettingsGroup() : deviceSelectorComp (getSharedAudioDeviceManager(), 0, 256, 0, 256, true, true, true, false) { addAndMakeVisible (titleLabel); titleLabel.setFont (titleLabelFontHeight); addAndMakeVisible (deviceSelectorComp); deviceSelectorComp.setItemHeight (itemHeight); setFocusContainerType (FocusContainerType::focusContainer); setTitle ("Audio Settings"); } void resized() override { auto bounds = getLocalBounds(); titleLabel.setBounds (bounds.removeFromTop (itemHeight)); bounds.removeFromTop (itemSpacing); deviceSelectorComp.setBounds (bounds); } private: Label titleLabel { {}, "Audio" }; AudioDeviceSelectorComponent deviceSelectorComp; }; //============================================================================== class InnerContent : public Component { public: InnerContent (MainComponent& mainComponent) : graphicsSettings (mainComponent) { addAndMakeVisible (graphicsSettings); addAndMakeVisible (audioSettings); setOpaque (true); } void paint (Graphics& g) override { g.fillAll (findColour (ResizableWindow::backgroundColourId).contrasting (0.2f)); } void resized() override { auto bounds = getLocalBounds(); graphicsSettings.setBounds (bounds.removeFromTop (150)); audioSettings.setBounds (bounds); } private: GraphicsSettingsGroup graphicsSettings; AudioSettingsGroup audioSettings; }; Viewport settingsViewport; InnerContent innerContent; };