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.

209 lines
8.0KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2020 - 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 6 End-User License
  8. Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
  9. End User License Agreement: www.juce.com/juce-6-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. setOpaque (true);
  30. }
  31. void paint (Graphics& g) override
  32. {
  33. g.fillAll (findColour (ResizableWindow::backgroundColourId));
  34. }
  35. void resized() override
  36. {
  37. auto r = getLocalBounds();
  38. auto scrollBarWidth = getLookAndFeel().getDefaultScrollbarWidth();
  39. innerContent.setSize (jmax (r.getWidth() - scrollBarWidth, innerContent.getMinimumWidth()),
  40. jmax (r.getHeight(), innerContent.getMinimumHeight()));
  41. settingsViewport.setBounds (r);
  42. }
  43. private:
  44. Viewport settingsViewport;
  45. //==============================================================================
  46. class InnerContent : public Component,
  47. public ComponentMovementWatcher
  48. {
  49. public:
  50. InnerContent (MainComponent& topLevelComponent)
  51. : ComponentMovementWatcher (this), mainComponent (topLevelComponent)
  52. {
  53. addAndMakeVisible (graphicsTitleLabel);
  54. graphicsTitleLabel.setFont (18.0f);
  55. addAndMakeVisible (audioTitleLabel);
  56. audioTitleLabel.setFont (18.0f);
  57. addLookAndFeels();
  58. addAndMakeVisible (lookAndFeelSelector);
  59. for (int i = 0; i < lookAndFeelNames.size(); ++i)
  60. lookAndFeelSelector.addItem (lookAndFeelNames.getReference (i), i + 1);
  61. lookAndFeelSelector.setSelectedItemIndex (lookAndFeelNames.indexOf ("LookAndFeel_V4 (Dark)"));
  62. lookAndFeelSelector.onChange = [this]
  63. {
  64. auto* lf = lookAndFeels.getUnchecked (lookAndFeelSelector.getSelectedItemIndex());
  65. Desktop::getInstance().setDefaultLookAndFeel (lf);
  66. };
  67. addAndMakeVisible (lookAndFeelLabel);
  68. lookAndFeelLabel.setJustificationType (Justification::centredRight);
  69. lookAndFeelLabel.attachToComponent (&lookAndFeelSelector, true);
  70. addAndMakeVisible (rendererSelector);
  71. rendererSelector.onChange = [this] { mainComponent.setRenderingEngine (rendererSelector.getSelectedItemIndex()); };
  72. addAndMakeVisible (rendererLabel);
  73. rendererLabel.setJustificationType (Justification::centredRight);
  74. rendererLabel.attachToComponent (&rendererSelector, true);
  75. audioSettings.reset (new AudioDeviceSelectorComponent (getSharedAudioDeviceManager(),
  76. 0, 256, 0, 256, true, true, true, false));
  77. addAndMakeVisible (audioSettings.get());
  78. audioSettings->setItemHeight (itemHeight);
  79. setOpaque (true);
  80. }
  81. void paint (Graphics& g) override
  82. {
  83. g.fillAll (findColour (ResizableWindow::backgroundColourId).contrasting (0.2f));
  84. }
  85. void resized() override
  86. {
  87. auto bounds = getLocalBounds();
  88. auto space = itemHeight / 4;
  89. graphicsTitleLabel.setBounds (bounds.removeFromTop (30));
  90. bounds.removeFromTop (space);
  91. auto xPos = (float) bounds.getX() + ((float) bounds.getWidth() * 0.35f);
  92. auto width = (float) bounds.getWidth() * 0.6f;
  93. lookAndFeelSelector.setBounds (bounds.removeFromTop (itemHeight).withWidth ((int) width).withX ((int) xPos));
  94. bounds.removeFromTop (space);
  95. rendererSelector.setBounds (bounds.removeFromTop (itemHeight).withWidth ((int) width).withX ((int) xPos));
  96. bounds.removeFromTop (space);
  97. audioTitleLabel.setBounds (bounds.removeFromTop (30));
  98. bounds.removeFromTop (space);
  99. audioSettings->setBounds (bounds);
  100. }
  101. //==============================================================================
  102. int getMinimumHeight() const noexcept { return 550; }
  103. int getMinimumWidth() const noexcept { return 350; }
  104. private:
  105. MainComponent& mainComponent;
  106. ComponentPeer* peer = nullptr;
  107. const int itemHeight = 30;
  108. Label graphicsTitleLabel { {}, "Graphics" },
  109. audioTitleLabel { {}, "Audio" },
  110. lookAndFeelLabel { {}, "LookAndFeel:" },
  111. rendererLabel { {}, "Renderer:" };
  112. ComboBox lookAndFeelSelector, rendererSelector;
  113. StringArray lookAndFeelNames;
  114. OwnedArray<LookAndFeel> lookAndFeels;
  115. std::unique_ptr<AudioDeviceSelectorComponent> audioSettings;
  116. //==============================================================================
  117. void refreshRenderingEngineSelector()
  118. {
  119. StringArray renderingEngines (mainComponent.getRenderingEngines());
  120. rendererSelector.clear (NotificationType::dontSendNotification);
  121. for (int i = 0; i < renderingEngines.size(); ++i)
  122. rendererSelector.addItem (renderingEngines.getReference (i), i + 1);
  123. rendererSelector.setSelectedItemIndex (mainComponent.getCurrentRenderingEngine());
  124. }
  125. //==============================================================================
  126. void componentMovedOrResized (bool, bool) override {}
  127. using ComponentListener::componentMovedOrResized;
  128. void componentVisibilityChanged() override {}
  129. using ComponentListener::componentVisibilityChanged;
  130. void componentPeerChanged() override
  131. {
  132. auto* newPeer = getPeer();
  133. if (peer != newPeer)
  134. {
  135. peer = newPeer;
  136. if (peer != nullptr)
  137. refreshRenderingEngineSelector();
  138. }
  139. }
  140. //==============================================================================
  141. void addLookAndFeels()
  142. {
  143. lookAndFeelNames.addArray ({ "LookAndFeel_V1", "LookAndFeel_V2", "LookAndFeel_V3",
  144. "LookAndFeel_V4 (Dark)", "LookAndFeel_V4 (Midnight)",
  145. "LookAndFeel_V4 (Grey)", "LookAndFeel_V4 (Light)" });
  146. lookAndFeels.add (new LookAndFeel_V1());
  147. lookAndFeels.add (new LookAndFeel_V2());
  148. lookAndFeels.add (new LookAndFeel_V3());
  149. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getDarkColourScheme()));
  150. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getMidnightColourScheme()));
  151. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getGreyColourScheme()));
  152. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getLightColourScheme()));
  153. }
  154. };
  155. InnerContent innerContent;
  156. };