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.

208 lines
7.8KB

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