The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
8.5KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2022 - Raw Material Software Limited
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 7 End-User License
  8. Agreement and JUCE Privacy Policy.
  9. End User License Agreement: www.juce.com/juce-7-licence
  10. Privacy Policy: www.juce.com/juce-privacy-policy
  11. Or: You may also use this code under the terms of the GPL v3 (see
  12. www.gnu.org/licenses).
  13. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  14. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  15. DISCLAIMED.
  16. ==============================================================================
  17. */
  18. #pragma once
  19. #include "MainComponent.h"
  20. //==============================================================================
  21. class SettingsContent : public Component
  22. {
  23. public:
  24. SettingsContent (MainComponent& topLevelComponent)
  25. : innerContent (topLevelComponent)
  26. {
  27. settingsViewport.setViewedComponent (&innerContent, false);
  28. addAndMakeVisible (settingsViewport);
  29. setFocusContainerType (FocusContainerType::focusContainer);
  30. setTitle ("DemoRunner Settings");
  31. setOpaque (true);
  32. }
  33. void paint (Graphics& g) override
  34. {
  35. g.fillAll (findColour (ResizableWindow::backgroundColourId));
  36. }
  37. void resized() override
  38. {
  39. constexpr int minimumWidth = 350;
  40. constexpr int minimumHeight = 550;
  41. auto r = getLocalBounds();
  42. const auto scrollBarWidth = getLookAndFeel().getDefaultScrollbarWidth();
  43. innerContent.setSize (jmax (r.getWidth() - scrollBarWidth, minimumWidth),
  44. jmax (r.getHeight(), minimumHeight));
  45. settingsViewport.setBounds (r);
  46. }
  47. private:
  48. static constexpr float titleLabelFontHeight = 18.0f;
  49. static constexpr int itemHeight = 30;
  50. static constexpr int itemSpacing = 7;
  51. class GraphicsSettingsGroup : public Component,
  52. private ComponentMovementWatcher
  53. {
  54. public:
  55. GraphicsSettingsGroup (MainComponent& comp)
  56. : ComponentMovementWatcher (&comp),
  57. mainComponent (comp)
  58. {
  59. addAndMakeVisible (titleLabel);
  60. titleLabel.setFont (titleLabelFontHeight);
  61. addLookAndFeels();
  62. addAndMakeVisible (lookAndFeelSelector);
  63. for (int i = 0; i < lookAndFeelNames.size(); ++i)
  64. lookAndFeelSelector.addItem (lookAndFeelNames.getReference (i), i + 1);
  65. lookAndFeelSelector.setSelectedItemIndex (lookAndFeelNames.indexOf ("LookAndFeel_V4 (Dark)"));
  66. lookAndFeelSelector.onChange = [this]
  67. {
  68. auto* lf = lookAndFeels.getUnchecked (lookAndFeelSelector.getSelectedItemIndex());
  69. Desktop::getInstance().setDefaultLookAndFeel (lf);
  70. };
  71. addAndMakeVisible (lookAndFeelLabel);
  72. lookAndFeelLabel.setJustificationType (Justification::centredRight);
  73. lookAndFeelLabel.attachToComponent (&lookAndFeelSelector, true);
  74. addAndMakeVisible (rendererSelector);
  75. rendererSelector.onChange = [this] { mainComponent.setRenderingEngine (rendererSelector.getSelectedItemIndex()); };
  76. addAndMakeVisible (rendererLabel);
  77. rendererLabel.setJustificationType (Justification::centredRight);
  78. rendererLabel.attachToComponent (&rendererSelector, true);
  79. setFocusContainerType (FocusContainerType::focusContainer);
  80. setTitle ("Graphics Settings");
  81. }
  82. void resized() override
  83. {
  84. auto bounds = getLocalBounds();
  85. titleLabel.setBounds (bounds.removeFromTop (itemHeight));
  86. bounds.removeFromTop (itemSpacing);
  87. const auto xPos = roundToInt ((float) bounds.getX() + ((float) bounds.getWidth() * 0.35f));
  88. const auto width = roundToInt ((float) bounds.getWidth() * 0.6f);
  89. lookAndFeelSelector.setBounds (bounds.removeFromTop (itemHeight).withWidth (width).withX (xPos));
  90. bounds.removeFromTop (itemSpacing);
  91. rendererSelector.setBounds (bounds.removeFromTop (itemHeight).withWidth (width).withX (xPos));
  92. }
  93. private:
  94. void componentMovedOrResized (bool, bool) override {}
  95. using ComponentListener::componentMovedOrResized;
  96. void componentVisibilityChanged() override {}
  97. using ComponentListener::componentVisibilityChanged;
  98. void componentPeerChanged() override
  99. {
  100. auto* newPeer = mainComponent.getPeer();
  101. if (peer != newPeer)
  102. {
  103. peer = newPeer;
  104. if (peer != nullptr)
  105. refreshRenderingEngineSelector();
  106. }
  107. }
  108. void refreshRenderingEngineSelector()
  109. {
  110. rendererSelector.clear (NotificationType::dontSendNotification);
  111. rendererSelector.addItemList (mainComponent.getRenderingEngines(), 1);
  112. rendererSelector.setSelectedItemIndex (mainComponent.getCurrentRenderingEngine());
  113. }
  114. void addLookAndFeels()
  115. {
  116. lookAndFeelNames.addArray ({ "LookAndFeel_V1", "LookAndFeel_V2", "LookAndFeel_V3",
  117. "LookAndFeel_V4 (Dark)", "LookAndFeel_V4 (Midnight)",
  118. "LookAndFeel_V4 (Grey)", "LookAndFeel_V4 (Light)" });
  119. lookAndFeels.add (new LookAndFeel_V1());
  120. lookAndFeels.add (new LookAndFeel_V2());
  121. lookAndFeels.add (new LookAndFeel_V3());
  122. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getDarkColourScheme()));
  123. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getMidnightColourScheme()));
  124. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getGreyColourScheme()));
  125. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getLightColourScheme()));
  126. }
  127. MainComponent& mainComponent;
  128. ComponentPeer* peer = nullptr;
  129. Label titleLabel { {}, "Graphics" },
  130. lookAndFeelLabel { {}, "LookAndFeel:" },
  131. rendererLabel { {}, "Renderer:" };
  132. ComboBox lookAndFeelSelector, rendererSelector;
  133. StringArray lookAndFeelNames;
  134. OwnedArray<LookAndFeel> lookAndFeels;
  135. };
  136. class AudioSettingsGroup : public Component
  137. {
  138. public:
  139. AudioSettingsGroup()
  140. : deviceSelectorComp (getSharedAudioDeviceManager(), 0, 256, 0, 256, true, true, true, false)
  141. {
  142. addAndMakeVisible (titleLabel);
  143. titleLabel.setFont (titleLabelFontHeight);
  144. addAndMakeVisible (deviceSelectorComp);
  145. deviceSelectorComp.setItemHeight (itemHeight);
  146. setFocusContainerType (FocusContainerType::focusContainer);
  147. setTitle ("Audio Settings");
  148. }
  149. void resized() override
  150. {
  151. auto bounds = getLocalBounds();
  152. titleLabel.setBounds (bounds.removeFromTop (itemHeight));
  153. bounds.removeFromTop (itemSpacing);
  154. deviceSelectorComp.setBounds (bounds);
  155. }
  156. private:
  157. Label titleLabel { {}, "Audio" };
  158. AudioDeviceSelectorComponent deviceSelectorComp;
  159. };
  160. //==============================================================================
  161. class InnerContent : public Component
  162. {
  163. public:
  164. InnerContent (MainComponent& mainComponent)
  165. : graphicsSettings (mainComponent)
  166. {
  167. addAndMakeVisible (graphicsSettings);
  168. addAndMakeVisible (audioSettings);
  169. setOpaque (true);
  170. }
  171. void paint (Graphics& g) override
  172. {
  173. g.fillAll (findColour (ResizableWindow::backgroundColourId).contrasting (0.2f));
  174. }
  175. void resized() override
  176. {
  177. auto bounds = getLocalBounds();
  178. graphicsSettings.setBounds (bounds.removeFromTop (150));
  179. audioSettings.setBounds (bounds);
  180. }
  181. private:
  182. GraphicsSettingsGroup graphicsSettings;
  183. AudioSettingsGroup audioSettings;
  184. };
  185. Viewport settingsViewport;
  186. InnerContent innerContent;
  187. };