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.

207 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. addAndMakeVisible (audioSettings = new AudioDeviceSelectorComponent (getSharedAudioDeviceManager(),
  77. 0, 256, 0, 256, true, true, true, false));
  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 = bounds.getX() + (bounds.getWidth() * 0.35f);
  92. auto width = 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. ScopedPointer<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. void componentVisibilityChanged() override {}
  128. void componentPeerChanged() override
  129. {
  130. auto* newPeer = getPeer();
  131. if (peer != newPeer)
  132. {
  133. peer = newPeer;
  134. if (peer != nullptr)
  135. refreshRenderingEngineSelector();
  136. }
  137. }
  138. //==============================================================================
  139. void addLookAndFeels()
  140. {
  141. lookAndFeelNames.addArray ({ "LookAndFeel_V1", "LookAndFeel_V2", "LookAndFeel_V3",
  142. "LookAndFeel_V4 (Dark)", "LookAndFeel_V4 (Midnight)",
  143. "LookAndFeel_V4 (Grey)", "LookAndFeel_V4 (Light)" });
  144. lookAndFeels.add (new LookAndFeel_V1());
  145. lookAndFeels.add (new LookAndFeel_V2());
  146. lookAndFeels.add (new LookAndFeel_V3());
  147. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getDarkColourScheme()));
  148. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getMidnightColourScheme()));
  149. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getGreyColourScheme()));
  150. lookAndFeels.add (new LookAndFeel_V4 (LookAndFeel_V4::getLightColourScheme()));
  151. }
  152. };
  153. InnerContent innerContent;
  154. };