diff --git a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj index beded00060..c77b5e00ae 100644 --- a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj +++ b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj @@ -818,6 +818,13 @@ path = "../../Source/Wizards/jucer_ProjectWizard_Animated.h"; sourceTree = "SOURCE_ROOT"; }; + 3D36F0CEB84B27BD02FC461A = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = "jucer_LabelPropertyComponent.h"; + path = "../../Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h"; + sourceTree = "SOURCE_ROOT"; + }; 3D6FD9C0065BF16568EC0AB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; @@ -3022,6 +3029,7 @@ children = ( 9EB33734D0DBD0370AB1247B, E367FC2BDAF5EBA48D767FBB, + 3D36F0CEB84B27BD02FC461A, 59F8A47C0020D62C8836A1E7, ); name = PropertyComponents; diff --git a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj index 00f4ae2b0a..19ee89f129 100644 --- a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj @@ -1619,6 +1619,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters index b83d15f2a0..80e1150c58 100644 --- a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters @@ -2325,6 +2325,9 @@ Projucer\Utility\UI\PropertyComponents + + Projucer\Utility\UI\PropertyComponents + Projucer\Utility\UI\PropertyComponents diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj index 9d247a7b2f..2a963c43cd 100644 --- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj @@ -1619,6 +1619,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters index d9c9e4dd18..99cfe492bb 100644 --- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters @@ -2325,6 +2325,9 @@ Projucer\Utility\UI\PropertyComponents + + Projucer\Utility\UI\PropertyComponents + Projucer\Utility\UI\PropertyComponents diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj index a2d7df4e7f..21002462ca 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj @@ -1621,6 +1621,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters index 9b37792bf5..db33f63ec5 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters @@ -2325,6 +2325,9 @@ Projucer\Utility\UI\PropertyComponents + + Projucer\Utility\UI\PropertyComponents + Projucer\Utility\UI\PropertyComponents diff --git a/extras/Projucer/Projucer.jucer b/extras/Projucer/Projucer.jucer index 55909bd625..d9e2cd0cd8 100644 --- a/extras/Projucer/Projucer.jucer +++ b/extras/Projucer/Projucer.jucer @@ -657,6 +657,8 @@ resource="0" file="Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h"/> + diff --git a/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h b/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h index 9b5e538f24..29a71d3c14 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h +++ b/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h @@ -26,51 +26,63 @@ #pragma once +#include "../../Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h" //============================================================================== class GlobalPathsWindowComponent : public Component, - private Timer + private Timer, + private Value::Listener { public: GlobalPathsWindowComponent() { - addLabelsAndSetProperties(); - - addAndMakeVisible (info); - info.setInfoToDisplay ("Use this dropdown to set the global paths for different OSes. " - "\nN.B. These paths are stored locally and will only be used when " - "saving a project on this machine. Other machines will have their own " - "locally stored paths."); - - addAndMakeVisible (osSelector); - osSelector.addItem ("OSX", 1); - osSelector.addItem ("Windows", 2); - osSelector.addItem ("Linux", 3); - - osSelector.onChange = [this] + addChildComponent (rescanJUCEPathButton); + rescanJUCEPathButton.onClick = [this] { - addLabelsAndSetProperties(); - updateValues(); - updateFilePathPropertyComponents(); + ProjucerApplication::getApp().rescanJUCEPathModules(); + lastJUCEModulePath = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get(); }; - auto os = TargetOS::getThisOS(); - - if (os == TargetOS::osx) osSelector.setSelectedId (1); - else if (os == TargetOS::windows) osSelector.setSelectedId (2); - else if (os == TargetOS::linux) osSelector.setSelectedId (3); - - addChildComponent (rescanJUCEPathButton); - rescanJUCEPathButton.onClick = [] { ProjucerApplication::getApp().rescanJUCEPathModules(); }; - addChildComponent (rescanUserPathButton); - rescanUserPathButton.onClick = [] { ProjucerApplication::getApp().rescanUserPathModules(); }; + rescanUserPathButton.onClick = [this] + { + ProjucerApplication::getApp().rescanUserPathModules(); + lastUserModulePath = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()).get(); + }; addAndMakeVisible (resetToDefaultsButton); resetToDefaultsButton.onClick = [this] { resetCurrentOSPathsToDefaults(); }; - updateValues(); - updateFilePathPropertyComponents(); + addAndMakeVisible (propertyViewport); + propertyViewport.setViewedComponent (&propertyGroup, false); + + auto os = TargetOS::getThisOS(); + + if (os == TargetOS::osx) selectedOSValue = "osx"; + else if (os == TargetOS::windows) selectedOSValue = "windows"; + else if (os == TargetOS::linux) selectedOSValue = "linux"; + + selectedOSValue.addListener (this); + + buildProps(); + + lastJUCEModulePath = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get(); + lastUserModulePath = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()).get(); + } + + ~GlobalPathsWindowComponent() + { + auto juceValue = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()); + auto userValue = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()); + + auto jucePathNeedsScanning = (! juceValue.isUsingDefault() && juceValue.get() != lastJUCEModulePath); + auto userPathNeedsScanning = (! userValue.isUsingDefault() && userValue.get() != lastUserModulePath); + + if (jucePathNeedsScanning) + ProjucerApplication::getApp().rescanJUCEPathModules(); + + if (userPathNeedsScanning) + ProjucerApplication::getApp().rescanUserPathModules(); } void paint (Graphics& g) override @@ -88,59 +100,31 @@ public: { auto b = getLocalBounds().reduced (10); - auto topSlice = b.removeFromTop (25); - osSelector.setSize (200, 25); - osSelector.setCentrePosition (topSlice.getCentre()); + auto buttonBounds = b.removeFromBottom (50); - info.setBounds (osSelector.getBounds().withWidth (osSelector.getHeight()).translated ((osSelector.getWidth() + 5), 0).reduced (2)); + rescanJUCEPathButton.setBounds (buttonBounds.removeFromLeft (150).reduced (5, 10)); + rescanUserPathButton.setBounds (buttonBounds.removeFromLeft (150).reduced (5, 10)); - int labelIndex = 0; - bool isFirst = true; - bool showRescanButtons = (rescanJUCEPathButton.isVisible() && rescanUserPathButton.isVisible()); + resetToDefaultsButton.setBounds (buttonBounds.removeFromRight (150).reduced (5, 10)); - for (auto* pathComp : pathPropertyComponents) - { - if (pathComp == nullptr) - { - b.removeFromTop (15); - pathPropertyLabels.getUnchecked (labelIndex++)->setBounds (b.removeFromTop (20)); - b.removeFromTop (20); - } - else - { - if (isFirst) - b.removeFromTop (20); - - auto compBounds = b.removeFromTop (pathComp->getPreferredHeight()); - - if (showRescanButtons) - { - auto propName = pathComp->getName(); - - if (propName == "JUCE Modules") - rescanJUCEPathButton.setBounds (compBounds.removeFromRight (75).reduced (5, 0)); - else if (propName == "User Modules") - rescanUserPathButton.setBounds (compBounds.removeFromRight (75).reduced (5, 0)); - } - - - pathComp->setBounds (compBounds); - b.removeFromTop (5); - } - - isFirst = false; - } - - resetToDefaultsButton.setBounds (b.removeFromBottom (35).reduced (150, 0)); + propertyGroup.updateSize (0, 0, getWidth() - 20 - propertyViewport.getScrollBarThickness()); + propertyViewport.setBounds (b); } void highlightJUCEPath() { - if (! isTimerRunning() && isSelectedOSThisOS()) - { - if (auto* jucePathComp = pathPropertyComponents.getFirst()) - boundsToHighlight = jucePathComp->getBounds(); + if (isTimerRunning() || ! isSelectedOSThisOS()) + return; + PropertyComponent* jucePathPropertyComponent = nullptr; + + for (auto* prop : propertyGroup.properties) + if (prop->getName() == "Path to JUCE") + jucePathPropertyComponent = prop; + + if (jucePathPropertyComponent != nullptr) + { + boundsToHighlight = getLocalArea (&propertyGroup, jucePathPropertyComponent->getBounds()); flashAlpha = 0.0f; hasFlashed = false; @@ -149,22 +133,6 @@ public: } private: - ValueWithDefault jucePathValue, juceModulePathValue, userModulePathValue, vst3PathValue, rtasPathValue, aaxPathValue, - androidSDKPathValue, androidNDKPathValue, clionExePathValue, androidStudioExePathValue; - - OwnedArray