diff --git a/extras/Projucer/Source/Application/Windows/jucer_GlobalSearchPathsWindowComponent.h b/extras/Projucer/Source/Application/Windows/jucer_GlobalSearchPathsWindowComponent.h index cfc0ac4bfe..2ae37a5666 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_GlobalSearchPathsWindowComponent.h +++ b/extras/Projucer/Source/Application/Windows/jucer_GlobalSearchPathsWindowComponent.h @@ -34,16 +34,20 @@ class GlobalSearchPathsWindowComponent : public Component, public: GlobalSearchPathsWindowComponent() : modulesLabel ("modulesLabel", "Modules"), - sdksLabel ("sdksLabel", "SDKs") + sdksLabel ("sdksLabel", "SDKs"), + cLionLabel ("cLionLabel", "CLion") { addAndMakeVisible (modulesLabel); addAndMakeVisible (sdksLabel); + addAndMakeVisible (cLionLabel); modulesLabel.setFont (Font (18.0f, Font::FontStyleFlags::bold)); - sdksLabel.setFont (Font (18.0f, Font::FontStyleFlags::bold)); + sdksLabel .setFont (Font (18.0f, Font::FontStyleFlags::bold)); + cLionLabel .setFont (Font (18.0f, Font::FontStyleFlags::bold)); modulesLabel.setJustificationType (Justification::centredLeft); - sdksLabel.setJustificationType (Justification::centredLeft); + sdksLabel .setJustificationType (Justification::centredLeft); + cLionLabel .setJustificationType (Justification::centredLeft); addAndMakeVisible (info); info.setInfoToDisplay ("Use this dropdown to set the global paths for different OSes. " @@ -85,10 +89,13 @@ public: modulesLabel.setBounds (b.removeFromTop (20)); b.removeFromTop (20); - auto i = 0; - for (auto propertyComponent : pathPropertyComponents) + auto thisOS = TargetOS::getThisOS(); + auto selectedOS = getSelectedOS(); + const int numComps = pathPropertyComponents.size(); + + for (int i = 0; i < numComps; ++i) { - propertyComponent->setBounds (b.removeFromTop (propertyComponent->getPreferredHeight())); + pathPropertyComponents[i]->setBounds (b.removeFromTop (pathPropertyComponents[i]->getPreferredHeight())); b.removeFromTop (5); if (i == 1) @@ -98,12 +105,17 @@ public: b.removeFromTop (20); } - ++i; + if (selectedOS == thisOS && i == numComps - 2) + { + b.removeFromTop (15); + cLionLabel.setBounds (b.removeFromTop (20)); + b.removeFromTop (20); + } } } private: - Label modulesLabel, sdksLabel; + Label modulesLabel, sdksLabel, cLionLabel; OwnedArray pathPropertyComponents; ComboBox osSelector; InfoButton info; @@ -113,11 +125,8 @@ private: updateFilePathPropertyComponents(); } - void updateFilePathPropertyComponents() + TargetOS::OS getSelectedOS() const { - pathPropertyComponents.clear(); - - auto thisOS = TargetOS::getThisOS(); auto selectedOS = TargetOS::unknown; switch (osSelector.getSelectedId()) @@ -128,6 +137,16 @@ private: default: break; } + return selectedOS; + } + + void updateFilePathPropertyComponents() + { + pathPropertyComponents.clear(); + + const auto thisOS = TargetOS::getThisOS(); + const auto selectedOS = getSelectedOS(); + auto& settings = getAppSettings(); if (selectedOS == thisOS) @@ -160,6 +179,16 @@ private: "Android SDK", true))); addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::androidNDKPath), "Android NDK", true))); + + #if JUCE_MAC + String exeLabel ("app"); + #elif JUCE_WINDOWS + String exeLabel ("executable"); + #else + String exeLabel ("startup script"); + #endif + addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::clionExePath), + "CLion " + exeLabel, false))); } else { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h index 2ddb1eb731..6152705817 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h @@ -109,6 +109,8 @@ public: static Identifier exporterName ("XCODE_MAC"); #elif JUCE_WINDOWS static Identifier exporterName ("CODEBLOCKS_WINDOWS"); + #elif JUCE_LINUX + static Identifier exporterName ("LINUX_MAKE"); #else static Identifier exporterName; #endif @@ -121,7 +123,7 @@ public: bool launchProject() override { - return getCLionExecutable().startAsProcess (getTargetFolder().getFullPathName()); + return getCLionExecutable().startAsProcess (getTargetFolder().getFullPathName().quoted()); } String getDescription() override @@ -148,7 +150,7 @@ public: << newLine << "Not all features of all the exporters are currently supported. Notable omissions are AUv3 " << "plug-ins, embedding resources and fat binaries on MacOS, and adding application icons. On " - << "Windows CLion requires a GCC-based compiler like MinGW."; + << "Windows the CLion exporter requires a GCC-based compiler like MinGW."; return description; } @@ -225,17 +227,17 @@ private: //============================================================================== static File getCLionExecutable() { - #if JUCE_MAC - return { "/Applications/CLion.app/Contents/MacOS/clion" }; - #elif JUCE_WINDOWS - auto regValue = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Applications\\clion64.exe\\shell\\open\\command\\", {}, {}); - auto openCmd = StringArray::fromTokens (regValue, true); + File clionExe (getAppSettings() + .getStoredPath (Ids::clionExePath) + .toString() + .replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName())); - if (! openCmd.isEmpty()) - return { openCmd[0].unquoted() }; + #if JUCE_MAC + if (clionExe.getFileName().endsWith (".app")) + clionExe = clionExe.getChildFile ("Contents/MacOS/clion"); #endif - return {}; + return clionExe; } //============================================================================== diff --git a/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp b/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp index c2d3c7a645..0b6392d993 100644 --- a/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp +++ b/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp @@ -295,7 +295,7 @@ Value StoredSettings::getFallbackPathForOS (const Identifier& key, DependencyPat else if (key == Ids::aaxPath) { if (os == TargetOS::windows) v = "C:\\SDKs\\AAX"; - else if (os == TargetOS::osx) v = "~/SDKs/AAX" ; + else if (os == TargetOS::osx) v = "~/SDKs/AAX"; else jassertfalse; // no AAX on this OS! } else if (key == Ids::androidSDKPath) @@ -306,6 +306,29 @@ Value StoredSettings::getFallbackPathForOS (const Identifier& key, DependencyPat { v = "${user.home}/Library/Android/sdk/ndk-bundle"; } + else if (key == Ids::clionExePath) + { + if (os == TargetOS::windows) + { + #if JUCE_WINDOWS + auto regValue = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Applications\\clion64.exe\\shell\\open\\command\\", {}, {}); + auto openCmd = StringArray::fromTokens (regValue, true); + + if (! openCmd.isEmpty()) + return Value (openCmd[0].unquoted()); + #endif + + v = "C:\\Program Files\\JetBrains\\CLion YYYY.MM.DD\\bin\\clion64.exe"; + } + else if (os == TargetOS::osx) + { + v = "/Applications/CLion.app"; + } + else + { + v = "${user.home}/clion/bin/clion.sh"; + } + } } return v; @@ -357,6 +380,16 @@ bool StoredSettings::isGlobalPathValid (const File& relativeTo, const Identifier { fileToCheckFor = {}; } + else if (key == Ids::clionExePath) + { + #if JUCE_MAC + fileToCheckFor = path.trim().endsWith (".app") ? "Contents/MacOS/clion" : "../clion"; + #elif JUCE_WIDOWS + fileToCheckFor = "../clion64.exe"; + #else + fileToCheckFor = "../clion.sh"; + #endif + } else { // didn't recognise the key provided! diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h index 31fdc7d887..8f37a1bc72 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h @@ -221,6 +221,7 @@ namespace Ids DECLARE_ID (clionMakefileEnabled); DECLARE_ID (clionXcodeEnabled); DECLARE_ID (clionCodeBlocksEnabled); + DECLARE_ID (clionExePath); DECLARE_ID (font); DECLARE_ID (colour); DECLARE_ID (userNotes);