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.

234 lines
10KB

  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. //==============================================================================
  21. class GlobalPathsWindowComponent : public Component
  22. {
  23. public:
  24. GlobalPathsWindowComponent()
  25. {
  26. addLabelsAndSetProperties();
  27. addAndMakeVisible (info);
  28. info.setInfoToDisplay ("Use this dropdown to set the global paths for different OSes. "
  29. "\nN.B. These paths are stored locally and will only be used when "
  30. "saving a project on this machine. Other machines will have their own "
  31. "locally stored paths.");
  32. addAndMakeVisible (osSelector);
  33. osSelector.addItem ("OSX", 1);
  34. osSelector.addItem ("Windows", 2);
  35. osSelector.addItem ("Linux", 3);
  36. osSelector.onChange = [this]
  37. {
  38. addLabelsAndSetProperties();
  39. updateFilePathPropertyComponents();
  40. };
  41. auto os = TargetOS::getThisOS();
  42. if (os == TargetOS::osx) osSelector.setSelectedId (1);
  43. else if (os == TargetOS::windows) osSelector.setSelectedId (2);
  44. else if (os == TargetOS::linux) osSelector.setSelectedId (3);
  45. updateFilePathPropertyComponents();
  46. }
  47. void paint (Graphics& g) override
  48. {
  49. g.fillAll (findColour (backgroundColourId));
  50. }
  51. void resized() override
  52. {
  53. auto b = getLocalBounds().reduced (10);
  54. auto topSlice = b.removeFromTop (25);
  55. osSelector.setSize (200, 25);
  56. osSelector.setCentrePosition (topSlice.getCentre());
  57. info.setBounds (osSelector.getBounds().withWidth (osSelector.getHeight()).translated ((osSelector.getWidth() + 5), 0).reduced (2));
  58. int labelIndex = 0;
  59. for (auto* pathComp : pathPropertyComponents)
  60. {
  61. if (pathComp == nullptr)
  62. {
  63. b.removeFromTop (15);
  64. pathPropertyLabels.getUnchecked (labelIndex++)->setBounds (b.removeFromTop (20));
  65. b.removeFromTop (20);
  66. }
  67. else
  68. {
  69. pathComp->setBounds (b.removeFromTop (pathComp->getPreferredHeight()));
  70. b.removeFromTop (5);
  71. }
  72. }
  73. }
  74. private:
  75. OwnedArray<Label> pathPropertyLabels;
  76. OwnedArray<PropertyComponent> pathPropertyComponents;
  77. ComboBox osSelector;
  78. InfoButton info;
  79. //==============================================================================
  80. bool isSelectedOSThisOS() { return TargetOS::getThisOS() == getSelectedOS(); }
  81. TargetOS::OS getSelectedOS() const
  82. {
  83. auto selectedOS = TargetOS::unknown;
  84. switch (osSelector.getSelectedId())
  85. {
  86. case 1: selectedOS = TargetOS::osx; break;
  87. case 2: selectedOS = TargetOS::windows; break;
  88. case 3: selectedOS = TargetOS::linux; break;
  89. default: break;
  90. }
  91. return selectedOS;
  92. }
  93. void updateFilePathPropertyComponents()
  94. {
  95. pathPropertyComponents.clear();
  96. auto& settings = getAppSettings();
  97. if (isSelectedOSThisOS())
  98. {
  99. pathPropertyComponents.add (nullptr);
  100. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::defaultJuceModulePath),
  101. "JUCE Modules", true)));
  102. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::defaultUserModulePath),
  103. "User Modules", true, {}, {}, true)));
  104. pathPropertyComponents.add (nullptr);
  105. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::vst3Path),
  106. "VST3 SDK", true)));
  107. if (getSelectedOS() == TargetOS::linux)
  108. {
  109. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent ({}, "RTAS SDK", true)));
  110. pathPropertyComponents.getLast()->setEnabled (false);
  111. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent ({}, "AAX SDK", true)));
  112. pathPropertyComponents.getLast()->setEnabled (false);
  113. }
  114. else
  115. {
  116. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::rtasPath),
  117. "RTAS SDK", true)));
  118. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::aaxPath),
  119. "AAX SDK", true)));
  120. }
  121. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::androidSDKPath),
  122. "Android SDK", true)));
  123. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::androidNDKPath),
  124. "Android NDK", true)));
  125. pathPropertyComponents.add (nullptr);
  126. #if JUCE_MAC
  127. String exeLabel ("app");
  128. #elif JUCE_WINDOWS
  129. String exeLabel ("executable");
  130. #else
  131. String exeLabel ("startup script");
  132. #endif
  133. addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::clionExePath),
  134. "CLion " + exeLabel, false)));
  135. }
  136. else
  137. {
  138. auto selectedOS = getSelectedOS();
  139. auto maxChars = 1024;
  140. pathPropertyComponents.add (nullptr);
  141. addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::defaultJuceModulePath, selectedOS),
  142. "JUCE Modules", maxChars, false)));
  143. addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::defaultUserModulePath, selectedOS),
  144. "User Modules", maxChars, false)));
  145. pathPropertyComponents.add (nullptr);
  146. addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::vst3Path, selectedOS),
  147. "VST3 SDK", maxChars, false)));
  148. if (selectedOS == TargetOS::linux)
  149. {
  150. addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (Value(), "RTAS SDK", maxChars, false)));
  151. pathPropertyComponents.getLast()->setEnabled (false);
  152. addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (Value(), "AAX SDK", maxChars, false)));
  153. pathPropertyComponents.getLast()->setEnabled (false);
  154. }
  155. else
  156. {
  157. addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::rtasPath, selectedOS),
  158. "RTAS SDK", maxChars, false)));
  159. addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::aaxPath, selectedOS),
  160. "AAX SDK", maxChars, false)));
  161. }
  162. addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::androidSDKPath, selectedOS),
  163. "Android SDK", maxChars, false)));
  164. addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::androidNDKPath, selectedOS),
  165. "Android NDK", maxChars, false)));
  166. }
  167. resized();
  168. }
  169. void addLabelsAndSetProperties()
  170. {
  171. pathPropertyLabels.clear();
  172. pathPropertyLabels.add (new Label ("modulesLabel", "Modules"));
  173. pathPropertyLabels.add (new Label ("sdksLabel", "SDKs"));
  174. pathPropertyLabels.add (new Label ("otherLabel", "Other"));
  175. for (auto* l : pathPropertyLabels)
  176. {
  177. addAndMakeVisible (l);
  178. l->setFont (Font (18.0f, Font::FontStyleFlags::bold));
  179. l->setJustificationType (Justification::centredLeft);
  180. }
  181. }
  182. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GlobalPathsWindowComponent)
  183. };