1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Projucer: Added new start page window

This commit is contained in:
ed 2020-06-04 14:52:29 +01:00
parent 4c95c227f6
commit 3283f2224a
107 changed files with 2475 additions and 3452 deletions

View file

@ -31,202 +31,152 @@
#include "../Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h"
//==============================================================================
static void addType (Array<ProjectExporter::ExporterTypeInfo>& list,
const char* name, const void* iconData, int iconDataSize)
std::vector<ProjectExporter::ExporterTypeInfo> ProjectExporter::getExporterTypeInfos()
{
ProjectExporter::ExporterTypeInfo type = { name, iconData, iconDataSize };
list.add (type);
}
Array<ProjectExporter::ExporterTypeInfo> ProjectExporter::getExporterTypes()
{
Array<ProjectExporter::ExporterTypeInfo> types;
addType (types, XcodeProjectExporter::getNameMac(), BinaryData::export_xcode_svg, BinaryData::export_xcode_svgSize);
addType (types, XcodeProjectExporter::getNameiOS(), BinaryData::export_xcode_svg, BinaryData::export_xcode_svgSize);
addType (types, MSVCProjectExporterVC2019::getName(), BinaryData::export_visualStudio_svg, BinaryData::export_visualStudio_svgSize);
addType (types, MSVCProjectExporterVC2017::getName(), BinaryData::export_visualStudio_svg, BinaryData::export_visualStudio_svgSize);
addType (types, MSVCProjectExporterVC2015::getName(), BinaryData::export_visualStudio_svg, BinaryData::export_visualStudio_svgSize);
addType (types, MakefileProjectExporter::getNameLinux(), BinaryData::export_linux_svg, BinaryData::export_linux_svgSize);
addType (types, AndroidProjectExporter::getName(), BinaryData::export_android_svg, BinaryData::export_android_svgSize);
addType (types, CodeBlocksProjectExporter::getNameWindows(), BinaryData::export_codeBlocks_svg, BinaryData::export_codeBlocks_svgSize);
addType (types, CodeBlocksProjectExporter::getNameLinux(), BinaryData::export_codeBlocks_svg, BinaryData::export_codeBlocks_svgSize);
addType (types, CLionProjectExporter::getName(), BinaryData::export_clion_svg, BinaryData::export_clion_svgSize);
return types;
}
ProjectExporter* ProjectExporter::createNewExporter (Project& project, const int index)
{
ProjectExporter* exp = nullptr;
switch (index)
auto createIcon = [](const void* iconData, size_t iconDataSize)
{
case 0: exp = new XcodeProjectExporter (project, ValueTree (XcodeProjectExporter ::getValueTreeTypeName (false)), false); break;
case 1: exp = new XcodeProjectExporter (project, ValueTree (XcodeProjectExporter ::getValueTreeTypeName (true)), true); break;
case 2: exp = new MSVCProjectExporterVC2019 (project, ValueTree (MSVCProjectExporterVC2019 ::getValueTreeTypeName())); break;
case 3: exp = new MSVCProjectExporterVC2017 (project, ValueTree (MSVCProjectExporterVC2017 ::getValueTreeTypeName())); break;
case 4: exp = new MSVCProjectExporterVC2015 (project, ValueTree (MSVCProjectExporterVC2015 ::getValueTreeTypeName())); break;
case 5: exp = new MakefileProjectExporter (project, ValueTree (MakefileProjectExporter ::getValueTreeTypeName())); break;
case 6: exp = new AndroidProjectExporter (project, ValueTree (AndroidProjectExporter ::getValueTreeTypeName())); break;
case 7: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter ::getValueTreeTypeName (CodeBlocksProjectExporter::windowsTarget)), CodeBlocksProjectExporter::windowsTarget); break;
case 8: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter ::getValueTreeTypeName (CodeBlocksProjectExporter::linuxTarget)), CodeBlocksProjectExporter::linuxTarget); break;
case 9: exp = new CLionProjectExporter (project, ValueTree (CLionProjectExporter ::getValueTreeTypeName())); break;
default: break;
}
Image image (Image::ARGB, 200, 200, true);
Graphics g (image);
exp->createDefaultConfigs();
exp->createDefaultModulePaths();
std::unique_ptr<Drawable> svgDrawable (Drawable::createFromImageData (iconData, iconDataSize));
return exp;
svgDrawable->drawWithin (g, image.getBounds().toFloat(), RectanglePlacement::fillDestination, 1.0f);
return image;
};
using namespace BinaryData;
static std::vector<ProjectExporter::ExporterTypeInfo> infos
{
{ XcodeProjectExporter::getValueTreeTypeNameMac(),
XcodeProjectExporter::getDisplayNameMac(),
XcodeProjectExporter::getTargetFolderNameMac(),
createIcon (export_xcode_svg, (size_t) export_xcode_svgSize) },
{ XcodeProjectExporter::getValueTreeTypeNameiOS(),
XcodeProjectExporter::getDisplayNameiOS(),
XcodeProjectExporter::getTargetFolderNameiOS(),
createIcon (export_xcode_svg, (size_t) export_xcode_svgSize) },
{ MSVCProjectExporterVC2019::getValueTreeTypeName(),
MSVCProjectExporterVC2019::getDisplayName(),
MSVCProjectExporterVC2019::getTargetFolderName(),
createIcon (export_visualStudio_svg, export_visualStudio_svgSize) },
{ MSVCProjectExporterVC2017::getValueTreeTypeName(),
MSVCProjectExporterVC2017::getDisplayName(),
MSVCProjectExporterVC2017::getTargetFolderName(),
createIcon (export_visualStudio_svg, export_visualStudio_svgSize) },
{ MSVCProjectExporterVC2015::getValueTreeTypeName(),
MSVCProjectExporterVC2015::getDisplayName(),
MSVCProjectExporterVC2015::getTargetFolderName(),
createIcon (export_visualStudio_svg, export_visualStudio_svgSize) },
{ MakefileProjectExporter::getValueTreeTypeName(),
MakefileProjectExporter::getDisplayName(),
MakefileProjectExporter::getTargetFolderName(),
createIcon (export_linux_svg, export_linux_svgSize) },
{ AndroidProjectExporter::getValueTreeTypeName(),
AndroidProjectExporter::getDisplayName(),
AndroidProjectExporter::getTargetFolderName(),
createIcon (export_android_svg, export_android_svgSize) },
{ CodeBlocksProjectExporter::getValueTreeTypeNameWindows(),
CodeBlocksProjectExporter::getDisplayNameWindows(),
CodeBlocksProjectExporter::getTargetFolderNameWindows(),
createIcon (export_codeBlocks_svg, export_codeBlocks_svgSize) },
{ CodeBlocksProjectExporter::getValueTreeTypeNameLinux(),
CodeBlocksProjectExporter::getDisplayNameLinux(),
CodeBlocksProjectExporter::getTargetFolderNameLinux(),
createIcon (export_codeBlocks_svg, export_codeBlocks_svgSize) },
{ CLionProjectExporter::getValueTreeTypeName(),
CLionProjectExporter::getDisplayName(),
CLionProjectExporter::getTargetFolderName(),
createIcon (export_clion_svg, export_clion_svgSize) }
};
return infos;
}
StringArray ProjectExporter::getExporterNames()
ProjectExporter::ExporterTypeInfo ProjectExporter::getTypeInfoForExporter (const Identifier& exporterIdentifier)
{
StringArray s;
auto typeInfos = getExporterTypeInfos();
for (auto& e : getExporterTypes())
s.add (e.name);
auto predicate = [exporterIdentifier] (const ProjectExporter::ExporterTypeInfo& info)
{
return info.identifier == exporterIdentifier;
};
return s;
}
auto iter = std::find_if (typeInfos.begin(), typeInfos.end(),
std::move (predicate));
StringArray ProjectExporter::getExporterValueTreeNames()
{
StringArray s;
for (auto& n : getExporterNames())
s.add (getValueTreeNameForExporter (n));
return s;
}
String ProjectExporter::getValueTreeNameForExporter (const String& exporterName)
{
if (exporterName == XcodeProjectExporter::getNameMac())
return XcodeProjectExporter::getValueTreeTypeName (false);
if (exporterName == XcodeProjectExporter::getNameiOS())
return XcodeProjectExporter::getValueTreeTypeName (true);
if (exporterName == MSVCProjectExporterVC2019::getName())
return MSVCProjectExporterVC2019::getValueTreeTypeName();
if (exporterName == MSVCProjectExporterVC2017::getName())
return MSVCProjectExporterVC2017::getValueTreeTypeName();
if (exporterName == MSVCProjectExporterVC2015::getName())
return MSVCProjectExporterVC2015::getValueTreeTypeName();
if (exporterName == MakefileProjectExporter::getNameLinux())
return MakefileProjectExporter::getValueTreeTypeName();
if (exporterName == AndroidProjectExporter::getName())
return AndroidProjectExporter::getValueTreeTypeName();
if (exporterName == CodeBlocksProjectExporter::getNameLinux())
return CodeBlocksProjectExporter::getValueTreeTypeName (CodeBlocksProjectExporter::CodeBlocksOS::linuxTarget);
if (exporterName == CodeBlocksProjectExporter::getNameWindows())
return CodeBlocksProjectExporter::getValueTreeTypeName (CodeBlocksProjectExporter::CodeBlocksOS::windowsTarget);
if (exporterName == CLionProjectExporter::getName())
return CLionProjectExporter::getValueTreeTypeName();
if (iter != typeInfos.end())
return *iter;
return {};
}
String ProjectExporter::getTargetFolderForExporter (const String& exporterValueTreeName)
ProjectExporter::ExporterTypeInfo ProjectExporter::getCurrentPlatformExporterTypeInfo()
{
if (exporterValueTreeName == "XCODE_MAC") return "MacOSX";
if (exporterValueTreeName == "XCODE_IPHONE") return "iOS";
if (exporterValueTreeName == "VS2019") return "VisualStudio2019";
if (exporterValueTreeName == "VS2017") return "VisualStudio2017";
if (exporterValueTreeName == "VS2015") return "VisualStudio2015";
if (exporterValueTreeName == "LINUX_MAKE") return "LinuxMakefile";
if (exporterValueTreeName == "ANDROIDSTUDIO") return "Android";
if (exporterValueTreeName == "CODEBLOCKS_WINDOWS") return "CodeBlocksWindows";
if (exporterValueTreeName == "CODEBLOCKS_LINUX") return "CodeBlocksLinux";
if (exporterValueTreeName == "CLION") return "CLion";
return {};
#if JUCE_MAC
return ProjectExporter::getTypeInfoForExporter (XcodeProjectExporter::getValueTreeTypeNameMac());
#elif JUCE_WINDOWS
return ProjectExporter::getTypeInfoForExporter (MSVCProjectExporterVC2019::getValueTreeTypeName());
#elif JUCE_LINUX
return ProjectExporter::getTypeInfoForExporter (MakefileProjectExporter::getValueTreeTypeName());
#else
#error "unknown platform!"
#endif
}
StringArray ProjectExporter::getAllDefaultBuildsFolders()
std::unique_ptr<ProjectExporter> ProjectExporter::createNewExporter (Project& project, const Identifier& exporterIdentifier)
{
StringArray folders;
auto exporter = createExporterFromSettings (project, ValueTree (exporterIdentifier));
jassert (exporter != nullptr);
folders.add (getDefaultBuildsRootFolder() + "iOS");
folders.add (getDefaultBuildsRootFolder() + "MacOSX");
folders.add (getDefaultBuildsRootFolder() + "VisualStudio2019");
folders.add (getDefaultBuildsRootFolder() + "VisualStudio2017");
folders.add (getDefaultBuildsRootFolder() + "VisualStudio2015");
folders.add (getDefaultBuildsRootFolder() + "LinuxMakefile");
folders.add (getDefaultBuildsRootFolder() + "CodeBlocksWindows");
folders.add (getDefaultBuildsRootFolder() + "CodeBlocksLinux");
folders.add (getDefaultBuildsRootFolder() + "Android");
folders.add (getDefaultBuildsRootFolder() + "CLion");
exporter->createDefaultConfigs();
exporter->createDefaultModulePaths();
return folders;
return exporter;
}
String ProjectExporter::getCurrentPlatformExporterName()
std::unique_ptr<ProjectExporter> ProjectExporter::createExporterFromSettings (Project& project, const ValueTree& settings)
{
#if JUCE_MAC
return XcodeProjectExporter::getNameMac();
#elif JUCE_WINDOWS
return MSVCProjectExporterVC2019::getName();
#elif JUCE_LINUX
return MakefileProjectExporter::getNameLinux();
#else
#error // huh?
#endif
}
std::unique_ptr<ProjectExporter> exporter;
ProjectExporter* ProjectExporter::createNewExporter (Project& project, const String& name)
{
return createNewExporter (project, getExporterNames().indexOf (name));
}
exporter.reset (XcodeProjectExporter::createForSettings (project, settings));
if (exporter == nullptr) exporter.reset (MSVCProjectExporterVC2019::createForSettings (project, settings));
if (exporter == nullptr) exporter.reset (MSVCProjectExporterVC2017::createForSettings (project, settings));
if (exporter == nullptr) exporter.reset (MSVCProjectExporterVC2015::createForSettings (project, settings));
if (exporter == nullptr) exporter.reset (MakefileProjectExporter::createForSettings (project, settings));
if (exporter == nullptr) exporter.reset (AndroidProjectExporter::createForSettings (project, settings));
if (exporter == nullptr) exporter.reset (CodeBlocksProjectExporter::createForSettings (project, settings));
if (exporter == nullptr) exporter.reset (CLionProjectExporter::createForSettings (project, settings));
ProjectExporter* ProjectExporter::createExporter (Project& project, const ValueTree& settings)
{
ProjectExporter* exp = MSVCProjectExporterVC2019 ::createForSettings (project, settings);
if (exp == nullptr) exp = MSVCProjectExporterVC2017 ::createForSettings (project, settings);
if (exp == nullptr) exp = MSVCProjectExporterVC2015 ::createForSettings (project, settings);
if (exp == nullptr) exp = XcodeProjectExporter ::createForSettings (project, settings);
if (exp == nullptr) exp = MakefileProjectExporter ::createForSettings (project, settings);
if (exp == nullptr) exp = AndroidProjectExporter ::createForSettings (project, settings);
if (exp == nullptr) exp = CodeBlocksProjectExporter ::createForSettings (project, settings);
if (exp == nullptr) exp = CLionProjectExporter ::createForSettings (project, settings);
jassert (exp != nullptr);
return exp;
jassert (exporter != nullptr);
return exporter;
}
bool ProjectExporter::canProjectBeLaunched (Project* project)
{
if (project != nullptr)
{
const char* types[] =
static Identifier types[]
{
#if JUCE_MAC
XcodeProjectExporter::getValueTreeTypeName (false),
XcodeProjectExporter::getValueTreeTypeName (true),
#elif JUCE_WINDOWS
MSVCProjectExporterVC2019::getValueTreeTypeName(),
MSVCProjectExporterVC2017::getValueTreeTypeName(),
MSVCProjectExporterVC2015::getValueTreeTypeName(),
#elif JUCE_LINUX
// (this doesn't currently launch.. not really sure what it would do on linux)
//MakefileProjectExporter::getValueTreeTypeName(),
#endif
AndroidProjectExporter::getValueTreeTypeName(),
nullptr
#if JUCE_MAC
XcodeProjectExporter::getValueTreeTypeNameMac(),
XcodeProjectExporter::getValueTreeTypeNameiOS(),
#elif JUCE_WINDOWS
MSVCProjectExporterVC2019::getValueTreeTypeName(),
MSVCProjectExporterVC2017::getValueTreeTypeName(),
MSVCProjectExporterVC2015::getValueTreeTypeName(),
#endif
AndroidProjectExporter::getValueTreeTypeName()
};
for (const char** type = types; *type != nullptr; ++type)
if (project->getExporters().getChildWithName (*type).isValid())
for (auto& exporterIdentifier : types)
if (project->getExporters().getChildWithName (exporterIdentifier).isValid())
return true;
}
@ -255,14 +205,23 @@ ProjectExporter::ProjectExporter (Project& p, const ValueTree& state)
updateCompilerFlagValues();
}
ProjectExporter::~ProjectExporter()
String ProjectExporter::getUniqueName() const
{
}
auto targetLocationString = getTargetLocationString();
auto defaultBuildsRootFolder = getDefaultBuildsRootFolder();
String ProjectExporter::getName() const
{
if (! getAllDefaultBuildsFolders().contains (getTargetLocationString()))
return name + " - " + getTargetLocationString();
auto typeInfos = getExporterTypeInfos();
auto predicate = [targetLocationString, defaultBuildsRootFolder] (const ProjectExporter::ExporterTypeInfo& info)
{
return defaultBuildsRootFolder + info.targetFolder == targetLocationString;
};
auto iter = std::find_if (typeInfos.begin(), typeInfos.end(),
std::move (predicate));
if (iter == typeInfos.end())
return name + " - " + targetLocationString;
return name;
}
@ -302,7 +261,7 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props)
if ((shouldBuildTargetType (build_tools::ProjectType::Target::VSTPlugIn) && project.shouldBuildVST()) || (project.isVSTPluginHost() && supportsTargetType (build_tools::ProjectType::Target::VSTPlugIn)))
{
props.add (new FilePathPropertyComponent (vstLegacyPathValueWrapper.wrappedValue, "VST (Legacy) SDK Folder", true,
props.add (new FilePathPropertyComponent (vstLegacyPathValueWrapper.getWrappedValueWithDefault(), "VST (Legacy) SDK Folder", true,
getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()),
"If you're building a VST plug-in or host, you can use this field to override the global VST (Legacy) SDK path with a project-specific path. "
"This can be an absolute path, or a path relative to the Projucer project file.");
@ -310,14 +269,14 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props)
if (shouldBuildTargetType (build_tools::ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX())
{
props.add (new FilePathPropertyComponent (aaxPathValueWrapper.wrappedValue, "AAX SDK Folder", true,
props.add (new FilePathPropertyComponent (aaxPathValueWrapper.getWrappedValueWithDefault(), "AAX SDK Folder", true,
getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()),
"If you're building an AAX plug-in, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file.");
}
if (shouldBuildTargetType (build_tools::ProjectType::Target::RTASPlugIn) && project.shouldBuildRTAS())
{
props.add (new FilePathPropertyComponent (rtasPathValueWrapper.wrappedValue, "RTAS SDK Folder", true,
props.add (new FilePathPropertyComponent (rtasPathValueWrapper.getWrappedValueWithDefault(), "RTAS SDK Folder", true,
getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()),
"If you're building an RTAS plug-in, this must be the folder containing the RTAS SDK. This can be an absolute path, or a path relative to the Projucer project file.");
}