@@ -34,16 +34,20 @@ class GlobalSearchPathsWindowComponent : public Component, | |||||
public: | public: | ||||
GlobalSearchPathsWindowComponent() | GlobalSearchPathsWindowComponent() | ||||
: modulesLabel ("modulesLabel", "Modules"), | : modulesLabel ("modulesLabel", "Modules"), | ||||
sdksLabel ("sdksLabel", "SDKs") | |||||
sdksLabel ("sdksLabel", "SDKs"), | |||||
cLionLabel ("cLionLabel", "CLion") | |||||
{ | { | ||||
addAndMakeVisible (modulesLabel); | addAndMakeVisible (modulesLabel); | ||||
addAndMakeVisible (sdksLabel); | addAndMakeVisible (sdksLabel); | ||||
addAndMakeVisible (cLionLabel); | |||||
modulesLabel.setFont (Font (18.0f, Font::FontStyleFlags::bold)); | 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); | modulesLabel.setJustificationType (Justification::centredLeft); | ||||
sdksLabel.setJustificationType (Justification::centredLeft); | |||||
sdksLabel .setJustificationType (Justification::centredLeft); | |||||
cLionLabel .setJustificationType (Justification::centredLeft); | |||||
addAndMakeVisible (info); | addAndMakeVisible (info); | ||||
info.setInfoToDisplay ("Use this dropdown to set the global paths for different OSes. " | info.setInfoToDisplay ("Use this dropdown to set the global paths for different OSes. " | ||||
@@ -85,10 +89,13 @@ public: | |||||
modulesLabel.setBounds (b.removeFromTop (20)); | modulesLabel.setBounds (b.removeFromTop (20)); | ||||
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); | b.removeFromTop (5); | ||||
if (i == 1) | if (i == 1) | ||||
@@ -98,12 +105,17 @@ public: | |||||
b.removeFromTop (20); | b.removeFromTop (20); | ||||
} | } | ||||
++i; | |||||
if (selectedOS == thisOS && i == numComps - 2) | |||||
{ | |||||
b.removeFromTop (15); | |||||
cLionLabel.setBounds (b.removeFromTop (20)); | |||||
b.removeFromTop (20); | |||||
} | |||||
} | } | ||||
} | } | ||||
private: | private: | ||||
Label modulesLabel, sdksLabel; | |||||
Label modulesLabel, sdksLabel, cLionLabel; | |||||
OwnedArray<PropertyComponent> pathPropertyComponents; | OwnedArray<PropertyComponent> pathPropertyComponents; | ||||
ComboBox osSelector; | ComboBox osSelector; | ||||
InfoButton info; | InfoButton info; | ||||
@@ -113,11 +125,8 @@ private: | |||||
updateFilePathPropertyComponents(); | updateFilePathPropertyComponents(); | ||||
} | } | ||||
void updateFilePathPropertyComponents() | |||||
TargetOS::OS getSelectedOS() const | |||||
{ | { | ||||
pathPropertyComponents.clear(); | |||||
auto thisOS = TargetOS::getThisOS(); | |||||
auto selectedOS = TargetOS::unknown; | auto selectedOS = TargetOS::unknown; | ||||
switch (osSelector.getSelectedId()) | switch (osSelector.getSelectedId()) | ||||
@@ -128,6 +137,16 @@ private: | |||||
default: break; | default: break; | ||||
} | } | ||||
return selectedOS; | |||||
} | |||||
void updateFilePathPropertyComponents() | |||||
{ | |||||
pathPropertyComponents.clear(); | |||||
const auto thisOS = TargetOS::getThisOS(); | |||||
const auto selectedOS = getSelectedOS(); | |||||
auto& settings = getAppSettings(); | auto& settings = getAppSettings(); | ||||
if (selectedOS == thisOS) | if (selectedOS == thisOS) | ||||
@@ -160,6 +179,16 @@ private: | |||||
"Android SDK", true))); | "Android SDK", true))); | ||||
addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::androidNDKPath), | addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::androidNDKPath), | ||||
"Android NDK", true))); | "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 | else | ||||
{ | { | ||||
@@ -109,6 +109,8 @@ public: | |||||
static Identifier exporterName ("XCODE_MAC"); | static Identifier exporterName ("XCODE_MAC"); | ||||
#elif JUCE_WINDOWS | #elif JUCE_WINDOWS | ||||
static Identifier exporterName ("CODEBLOCKS_WINDOWS"); | static Identifier exporterName ("CODEBLOCKS_WINDOWS"); | ||||
#elif JUCE_LINUX | |||||
static Identifier exporterName ("LINUX_MAKE"); | |||||
#else | #else | ||||
static Identifier exporterName; | static Identifier exporterName; | ||||
#endif | #endif | ||||
@@ -121,7 +123,7 @@ public: | |||||
bool launchProject() override | bool launchProject() override | ||||
{ | { | ||||
return getCLionExecutable().startAsProcess (getTargetFolder().getFullPathName()); | |||||
return getCLionExecutable().startAsProcess (getTargetFolder().getFullPathName().quoted()); | |||||
} | } | ||||
String getDescription() override | String getDescription() override | ||||
@@ -148,7 +150,7 @@ public: | |||||
<< newLine | << newLine | ||||
<< "Not all features of all the exporters are currently supported. Notable omissions are AUv3 " | << "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 " | << "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; | return description; | ||||
} | } | ||||
@@ -225,17 +227,17 @@ private: | |||||
//============================================================================== | //============================================================================== | ||||
static File getCLionExecutable() | 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 | #endif | ||||
return {}; | |||||
return clionExe; | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
@@ -295,7 +295,7 @@ Value StoredSettings::getFallbackPathForOS (const Identifier& key, DependencyPat | |||||
else if (key == Ids::aaxPath) | else if (key == Ids::aaxPath) | ||||
{ | { | ||||
if (os == TargetOS::windows) v = "C:\\SDKs\\AAX"; | 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 jassertfalse; // no AAX on this OS! | ||||
} | } | ||||
else if (key == Ids::androidSDKPath) | else if (key == Ids::androidSDKPath) | ||||
@@ -306,6 +306,29 @@ Value StoredSettings::getFallbackPathForOS (const Identifier& key, DependencyPat | |||||
{ | { | ||||
v = "${user.home}/Library/Android/sdk/ndk-bundle"; | 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; | return v; | ||||
@@ -357,6 +380,16 @@ bool StoredSettings::isGlobalPathValid (const File& relativeTo, const Identifier | |||||
{ | { | ||||
fileToCheckFor = {}; | 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 | else | ||||
{ | { | ||||
// didn't recognise the key provided! | // didn't recognise the key provided! | ||||
@@ -221,6 +221,7 @@ namespace Ids | |||||
DECLARE_ID (clionMakefileEnabled); | DECLARE_ID (clionMakefileEnabled); | ||||
DECLARE_ID (clionXcodeEnabled); | DECLARE_ID (clionXcodeEnabled); | ||||
DECLARE_ID (clionCodeBlocksEnabled); | DECLARE_ID (clionCodeBlocksEnabled); | ||||
DECLARE_ID (clionExePath); | |||||
DECLARE_ID (font); | DECLARE_ID (font); | ||||
DECLARE_ID (colour); | DECLARE_ID (colour); | ||||
DECLARE_ID (userNotes); | DECLARE_ID (userNotes); | ||||