247 lines
8.6 KiB
C
247 lines
8.6 KiB
C
|
/*
|
||
|
==============================================================================
|
||
|
|
||
|
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<LookAndFeel> 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;
|
||
|
};
|