/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2020 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 6 End-User License Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). End User License Agreement: www.juce.com/juce-6-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #pragma once #include "../../Utility/Helpers/jucer_MiscUtilities.h" //============================================================================== namespace NewProjectTemplates { enum class ProjectCategory { application, plugin, library }; inline String getProjectCategoryString (ProjectCategory category) { if (category == ProjectCategory::application) return "Application"; if (category == ProjectCategory::plugin) return "Plug-In"; if (category == ProjectCategory::library) return "Library"; jassertfalse; return "Unknown"; } enum class FileCreationOptions { noFiles, main, header, headerAndCpp, processorAndEditor }; using FilenameAndContent = std::pair; using OptionAndFilenameAndContent = std::pair>; using OptionsAndFiles = std::vector; struct ProjectTemplate { ProjectCategory category; String displayName, description, projectTypeString; const char* icon; StringArray requiredModules; OptionsAndFiles fileOptionsAndFiles; FileCreationOptions defaultFileOption; std::vector getFilesForOption (FileCreationOptions option) const { auto iter = std::find_if (fileOptionsAndFiles.begin(), fileOptionsAndFiles.end(), [option] (const OptionAndFilenameAndContent& opt) { return opt.first == option; }); if (iter != fileOptionsAndFiles.end()) return iter->second; return {}; } }; inline bool isApplication (const ProjectTemplate& t) noexcept { return t.category == ProjectCategory::application; } inline bool isPlugin (const ProjectTemplate& t) noexcept { return t.category == ProjectCategory::plugin; } inline bool isLibrary (const ProjectTemplate& t) noexcept { return t.category == ProjectCategory::library; } //============================================================================== inline var getVarForFileOption (FileCreationOptions opt) { if (opt == FileCreationOptions::noFiles) return "none"; if (opt == FileCreationOptions::main) return "main"; if (opt == FileCreationOptions::header) return "header"; if (opt == FileCreationOptions::headerAndCpp) return "headercpp"; if (opt == FileCreationOptions::processorAndEditor) return "processoreditor"; jassertfalse; return {}; } inline FileCreationOptions getFileOptionForVar (var opt) { if (opt == "none") return FileCreationOptions::noFiles; if (opt == "main") return FileCreationOptions::main; if (opt == "header") return FileCreationOptions::header; if (opt == "headercpp") return FileCreationOptions::headerAndCpp; if (opt == "processoreditor") return FileCreationOptions::processorAndEditor; jassertfalse; return {}; } inline String getStringForFileOption (FileCreationOptions opt) { if (opt == FileCreationOptions::noFiles) return "No Files"; if (opt == FileCreationOptions::main) return "Main.cpp"; if (opt == FileCreationOptions::header) return "Main.cpp + .h"; if (opt == FileCreationOptions::headerAndCpp) return "Main.cpp + .h/.cpp "; if (opt == FileCreationOptions::processorAndEditor) return "Processor and Editor"; jassertfalse; return {}; } //============================================================================== template inline StringArray addAndReturn (StringArray arr, Strings... strings) { arr.addArray ({ strings... }); return arr; } inline std::vector getAllTemplates() { return { { ProjectCategory::application, "Blank", "Creates a blank JUCE GUI application.", build_tools::ProjectType_GUIApp::getTypeName(), BinaryData::wizard_GUI_svg, getModulesRequiredForComponent(), {}, FileCreationOptions::noFiles }, { ProjectCategory::application, "GUI", "Creates a blank JUCE GUI application with a single window component.", build_tools::ProjectType_GUIApp::getTypeName(), BinaryData::wizard_GUI_svg, getModulesRequiredForComponent(), { { FileCreationOptions::noFiles, {} }, { FileCreationOptions::main, { { "Main.cpp", "jucer_MainTemplate_NoWindow_cpp" } } }, { FileCreationOptions::header, { { "Main.cpp", "jucer_MainTemplate_Window_cpp" }, { "MainComponent.h", "jucer_ContentCompSimpleTemplate_h" } } }, { FileCreationOptions::headerAndCpp, { { "Main.cpp", "jucer_MainTemplate_Window_cpp" }, { "MainComponent.h", "jucer_ContentCompTemplate_h" }, { "MainComponent.cpp", "jucer_ContentCompTemplate_cpp" } } } }, FileCreationOptions::headerAndCpp }, { ProjectCategory::application, "Audio", "Creates a blank JUCE GUI application with a single window component and audio and MIDI in/out functions.", build_tools::ProjectType_GUIApp::getTypeName(), BinaryData::wizard_AudioApp_svg, addAndReturn (getModulesRequiredForComponent(), "juce_audio_basics", "juce_audio_devices", "juce_audio_formats", "juce_audio_processors", "juce_audio_utils", "juce_gui_extra"), { { FileCreationOptions::header, { { "Main.cpp", "jucer_MainTemplate_Window_cpp" }, { "MainComponent.h", "jucer_AudioComponentSimpleTemplate_h" } } }, { FileCreationOptions::headerAndCpp, { { "Main.cpp", "jucer_MainTemplate_Window_cpp" }, { "MainComponent.h", "jucer_AudioComponentTemplate_h" }, { "MainComponent.cpp", "jucer_AudioComponentTemplate_cpp" } } } }, FileCreationOptions::headerAndCpp }, { ProjectCategory::application, "Console", "Creates a command-line application without GUI support.", build_tools::ProjectType_ConsoleApp::getTypeName(), BinaryData::wizard_ConsoleApp_svg, getModulesRequiredForConsole(), { { FileCreationOptions::noFiles, {} }, { FileCreationOptions::main, { { "Main.cpp", "jucer_MainConsoleAppTemplate_cpp" } } } }, FileCreationOptions::main }, { ProjectCategory::application, "Animated", "Creates a JUCE GUI application which draws an animated graphical display.", build_tools::ProjectType_GUIApp::getTypeName(), BinaryData::wizard_AnimatedApp_svg, addAndReturn (getModulesRequiredForComponent(), "juce_gui_extra"), { { FileCreationOptions::header, { { "Main.cpp", "jucer_MainTemplate_Window_cpp" }, { "MainComponent.h", "jucer_AudioComponentSimpleTemplate_h" } } }, { FileCreationOptions::headerAndCpp, { { "Main.cpp", "jucer_MainTemplate_Window_cpp" }, { "MainComponent.h", "jucer_AnimatedComponentTemplate_h" }, { "MainComponent.cpp", "jucer_AnimatedComponentTemplate_cpp" } } } }, FileCreationOptions::headerAndCpp }, { ProjectCategory::application, "OpenGL", "Creates a blank JUCE application with a single window component. " "This component supports openGL drawing features including 3D model import and GLSL shaders.", build_tools::ProjectType_GUIApp::getTypeName(), BinaryData::wizard_OpenGL_svg, addAndReturn (getModulesRequiredForComponent(), "juce_gui_extra", "juce_opengl"), { { FileCreationOptions::header, { { "Main.cpp", "jucer_MainTemplate_Window_cpp" }, { "MainComponent.h", "jucer_AudioComponentSimpleTemplate_h" } } }, { FileCreationOptions::headerAndCpp, { { "Main.cpp", "jucer_MainTemplate_Window_cpp" }, { "MainComponent.h", "jucer_OpenGLComponentTemplate_h" }, { "MainComponent.cpp", "jucer_OpenGLComponentTemplate_cpp" } } } }, FileCreationOptions::headerAndCpp }, { ProjectCategory::plugin, "Basic", "Creates an audio plug-in with a single window GUI and audio/MIDI IO functions.", build_tools::ProjectType_AudioPlugin::getTypeName(), BinaryData::wizard_AudioPlugin_svg, getModulesRequiredForAudioProcessor(), { { FileCreationOptions::processorAndEditor, { { "PluginProcessor.cpp", "jucer_AudioPluginFilterTemplate_cpp" }, { "PluginProcessor.h", "jucer_AudioPluginFilterTemplate_h" }, { "PluginEditor.cpp", "jucer_AudioPluginEditorTemplate_cpp" }, { "PluginEditor.h", "jucer_AudioPluginEditorTemplate_h" } } } }, FileCreationOptions::processorAndEditor }, { ProjectCategory::library, "Static Library", "Creates a static library.", build_tools::ProjectType_StaticLibrary::getTypeName(), BinaryData::wizard_StaticLibrary_svg, getModulesRequiredForConsole(), {}, FileCreationOptions::noFiles }, { ProjectCategory::library, "Dynamic Library", "Creates a dynamic library.", build_tools::ProjectType_DLL::getTypeName(), BinaryData::wizard_DLL_svg, getModulesRequiredForConsole(), {}, FileCreationOptions::noFiles } }; } }