void ProjectExporter::BuildConfiguration::createPropertyEditors (PropertyListBuilder& props) { if (exporter.supportsUserDefinedConfigurations()) props.add (new TextPropertyComponent (getNameValue(), "Name", 96, false), "The name of this configuration."); props.add (new BooleanPropertyComponent (isDebugValue(), "Debug mode", "Debugging enabled"), "If enabled, this means that the configuration should be built with debug symbols."); props.add (new TextPropertyComponent (getTargetBinaryName(), "Binary name", 256, false), "The filename to use for the destination binary executable file. If you don't add a suffix to this name, " "a suitable platform-specific suffix will be added automatically."); props.add (new TextPropertyComponent (getTargetBinaryRelativePath(), "Binary location", 1024, false), "The folder in which the finished binary should be placed. Leave this blank to cause the binary to be placed " "in its default location in the build folder."); props.addSearchPathProperty (getHeaderSearchPathValue(), "Header search paths", "Extra header search paths."); props.addSearchPathProperty (getLibrarySearchPathValue(), "Extra library search paths", "Extra library search paths."); props.add (new TextPropertyComponent (getBuildConfigPreprocessorDefs(), "Preprocessor definitions", 32768, true), "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, or " "new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); createConfigProperties (props); props.add (new TextPropertyComponent (getUserNotes(), "Notes", 32768, true), "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts."); }
//============================================================================== void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) { props.add (new TextPropertyComponent (getTargetLocationValue(), "Target Project Folder", 2048, false), "The location of the folder in which the " + name + " project will be created. " "This path can be absolute, but it's much more sensible to make it relative to the jucer project directory."); createDependencyPathProperties (props); props.add (new TextPropertyComponent (getExporterPreprocessorDefs(), "Extra Preprocessor Definitions", 32768, true), "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, " "or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); props.add (new TextPropertyComponent (getExtraCompilerFlags(), "Extra compiler flags", 8192, true), "Extra command-line flags to be passed to the compiler. This string can contain references to preprocessor definitions in the " "form ${NAME_OF_DEFINITION}, which will be replaced with their values."); props.add (new TextPropertyComponent (getExtraLinkerFlags(), "Extra linker flags", 8192, true), "Extra command-line flags to be passed to the linker. You might want to use this for adding additional libraries. " "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); props.add (new TextPropertyComponent (getExternalLibraries(), "External libraries to link", 8192, true), "Additional libraries to link (one per line). You should not add any platform specific decoration to these names. " "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); createIconProperties (props); createExporterProperties (props); props.add (new TextPropertyComponent (getUserNotes(), "Notes", 32768, true), "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts."); }
void ProjectExporter::createDependencyPathProperties (PropertyListBuilder& props) { if (shouldBuildTargetType (ProjectType::Target::VST3PlugIn) || project.isVST3PluginHost()) { if (dynamic_cast<DependencyPathValueSource*> (&getVST3PathValue().getValueSource()) != nullptr) props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getVST3PathValue(), "VST3 SDK Folder"), "If you're building a VST3 plugin or host, this must be the folder containing the VST3 SDK. This can be an absolute path, or a path relative to the Projucer project file."); } if (shouldBuildTargetType (ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX()) { if (dynamic_cast<DependencyPathValueSource*> (&getAAXPathValue().getValueSource()) != nullptr) props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getAAXPathValue(), "AAX SDK Folder"), "If you're building an AAX plugin, 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 (ProjectType::Target::RTASPlugIn) && project.shouldBuildRTAS()) { if (dynamic_cast<DependencyPathValueSource*> (&getRTASPathValue().getValueSource()) != nullptr) props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getRTASPathValue(), "RTAS SDK Folder"), "If you're building an RTAS, this must be the folder containing the RTAS SDK. This can be an absolute path, or a path relative to the Projucer project file."); } }
void ProjectExporter::BuildConfiguration::addGCCOptimisationProperty (PropertyListBuilder& props) { static const char* optimisationLevels[] = { "-O0 (no optimisation)", "-Os (minimise code size)", "-O1 (fast)", "-O2 (faster)", "-O3 (fastest with safe optimisations)", "-Ofast (uses aggressive optimisations)", nullptr }; static const int optimisationLevelValues[] = { gccO0, gccOs, gccO1, gccO2, gccO3, gccOfast, 0 }; props.add (new ChoicePropertyComponent (getOptimisationLevel(), "Optimisation", StringArray (optimisationLevels), Array<var> (optimisationLevelValues)), "The optimisation level for this configuration"); }
//============================================================================== void Project::createPropertyEditors (PropertyListBuilder& props) { props.add (new TextPropertyComponent (getProjectNameValue(), "Project Name", 256, false), "The name of the project."); props.add (new TextPropertyComponent (getVersionValue(), "Project Version", 16, false), "The project's version number, This should be in the format major.minor.point"); props.add (new TextPropertyComponent (getCompanyName(), "Company Name", 256, false), "Your company name, which will be added to the properties of the binary where possible"); { StringArray projectTypeNames; Array<var> projectTypeCodes; const Array<ProjectType*>& types = ProjectType::getAllTypes(); for (int i = 0; i < types.size(); ++i) { projectTypeNames.add (types.getUnchecked(i)->getDescription()); projectTypeCodes.add (types.getUnchecked(i)->getType()); } props.add (new ChoicePropertyComponent (getProjectTypeValue(), "Project Type", projectTypeNames, projectTypeCodes)); } props.add (new TextPropertyComponent (getBundleIdentifier(), "Bundle Identifier", 256, false), "A unique identifier for this product, mainly for use in OSX/iOS builds. It should be something like 'com.yourcompanyname.yourproductname'"); getProjectType().createPropertyEditors (*this, props); props.add (new TextPropertyComponent (getProjectPreprocessorDefs(), "Preprocessor definitions", 32768, false), "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate the items - to include a space or comma in a definition, precede it with a backslash."); props.add (new TextPropertyComponent (getProjectUserNotes(), "Notes", 32768, true), "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts."); }
void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props) { props.add (new BooleanPropertyComponent (shouldBuildVST(), "Build VST", "Enabled"), "Whether the project should produce a VST plugin."); props.add (new BooleanPropertyComponent (shouldBuildVST3(), "Build VST3", "Enabled"), "Whether the project should produce a VST3 plugin."); props.add (new BooleanPropertyComponent (shouldBuildAU(), "Build AudioUnit", "Enabled"), "Whether the project should produce an AudioUnit plugin."); props.add (new BooleanPropertyComponent (shouldBuildAUv3(), "Build AudioUnit v3", "Enabled"), "Whether the project should produce an AudioUnit version 3 plugin."); props.add (new BooleanPropertyComponent (shouldBuildRTAS(), "Build RTAS", "Enabled"), "Whether the project should produce an RTAS plugin."); props.add (new BooleanPropertyComponent (shouldBuildAAX(), "Build AAX", "Enabled"), "Whether the project should produce an AAX plugin."); /* TODO: this property editor is temporarily disabled because right now we build standalone if and only if we also build AUv3. However as soon as targets are supported on non-Xcode exporters as well, we should re-enable this option and allow to build the standalone plug-in independently from AUv3. */ // props.add (new BooleanPropertyComponent (shouldBuildStandalone(), "Build Standalone", "Enabled"), // "Whether the project should produce a standalone version of the plugin. Required for AUv3."); props.add (new TextPropertyComponent (getPluginName(), "Plugin Name", 128, false), "The name of your plugin (keep it short!)"); props.add (new TextPropertyComponent (getPluginDesc(), "Plugin Description", 256, false), "A short description of your plugin."); props.add (new TextPropertyComponent (getPluginManufacturer(), "Plugin Manufacturer", 256, false), "The name of your company (cannot be blank)."); props.add (new TextPropertyComponent (getPluginManufacturerCode(), "Plugin Manufacturer Code", 4, false), "A four-character unique ID for your company. Note that for AU compatibility, this must contain at least one upper-case letter!"); props.add (new TextPropertyComponent (getPluginCode(), "Plugin Code", 4, false), "A four-character unique ID for your plugin. Note that for AU compatibility, this must contain at least one upper-case letter!"); props.add (new TextPropertyComponent (getPluginChannelConfigs(), "Plugin Channel Configurations", 1024, false), "This list is a comma-separated set list in the form {numIns, numOuts} and each pair indicates a valid plug-in " "configuration. For example {1, 1}, {2, 2} means that the plugin can be used either with 1 input and 1 output, " "or with 2 inputs and 2 outputs. If your plug-in requires side-chains, aux output buses etc., then you must leave " "this field empty and override the setPreferredBusArrangement method in your AudioProcessor."); props.add (new BooleanPropertyComponent (getPluginIsSynth(), "Plugin is a Synth", "Is a Synth"), "Enable this if you want your plugin to be treated as a synth or generator. It doesn't make much difference to the plugin itself, but some hosts treat synths differently to other plugins."); props.add (new BooleanPropertyComponent (getPluginWantsMidiInput(), "Plugin Midi Input", "Plugin wants midi input"), "Enable this if you want your plugin to accept midi messages."); props.add (new BooleanPropertyComponent (getPluginProducesMidiOut(), "Plugin Midi Output", "Plugin produces midi output"), "Enable this if your plugin is going to produce midi messages."); props.add (new BooleanPropertyComponent (getPluginIsMidiEffectPlugin(), "Midi Effect Plugin", "Plugin is a midi effect plugin"), "Enable this if your plugin only processes midi and no audio."); props.add (new BooleanPropertyComponent (getPluginEditorNeedsKeyFocus(), "Key Focus", "Plugin editor requires keyboard focus"), "Enable this if your plugin needs keyboard input - some hosts can be a bit funny about keyboard focus.."); props.add (new TextPropertyComponent (getPluginAUExportPrefix(), "Plugin AU Export Prefix", 64, false), "A prefix for the names of exported entry-point functions that the component exposes - typically this will be a version of your plugin's name that can be used as part of a C++ token."); props.add (new TextPropertyComponent (getPluginAUMainType(), "Plugin AU Main Type", 128, false), "In an AU, this is the value that is set as JucePlugin_AUMainType. Leave it blank unless you want to use a custom value."); props.add (new TextPropertyComponent (getPluginVSTCategory(), "VST Category", 64, false), "In a VST, this is the value that is set as JucePlugin_VSTCategory. Leave it blank unless you want to use a custom value."); props.add (new TextPropertyComponent (getPluginRTASCategory(), "Plugin RTAS Category", 64, false), "(Leave this blank if your plugin is a synth). This is one of the RTAS categories from FicPluginEnums.h, such as: ePlugInCategory_None, ePlugInCategory_EQ, ePlugInCategory_Dynamics, " "ePlugInCategory_PitchShift, ePlugInCategory_Reverb, ePlugInCategory_Delay, " "ePlugInCategory_Modulation, ePlugInCategory_Harmonic, ePlugInCategory_NoiseReduction, " "ePlugInCategory_Dither, ePlugInCategory_SoundField"); props.add (new TextPropertyComponent (getPluginAAXCategory(), "Plugin AAX Category", 64, false), "This is one of the categories from the AAX_EPlugInCategory enum"); props.add (new TextPropertyComponent (getAAXIdentifier(), "Plugin AAX Identifier", 256, false), "The value to use for the JucePlugin_AAXIdentifier setting"); }
//============================================================================== void Project::createPropertyEditors (PropertyListBuilder& props) { props.add (new TextPropertyComponent (getProjectNameValue(), "Project Name", 256, false), "The name of the project."); props.add (new TextPropertyComponent (getVersionValue(), "Project Version", 16, false), "The project's version number, This should be in the format major.minor.point[.point]"); props.add (new TextPropertyComponent (getCompanyName(), "Company Name", 256, false), "Your company name, which will be added to the properties of the binary where possible"); props.add (new TextPropertyComponent (getCompanyWebsite(), "Company Website", 256, false), "Your company website, which will be added to the properties of the binary where possible"); props.add (new TextPropertyComponent (getCompanyEmail(), "Company E-mail", 256, false), "Your company e-mail, which will be added to the properties of the binary where possible"); { StringArray projectTypeNames; Array<var> projectTypeCodes; const Array<ProjectType*>& types = ProjectType::getAllTypes(); for (int i = 0; i < types.size(); ++i) { projectTypeNames.add (types.getUnchecked(i)->getDescription()); projectTypeCodes.add (types.getUnchecked(i)->getType()); } props.add (new ChoicePropertyComponent (getProjectTypeValue(), "Project Type", projectTypeNames, projectTypeCodes)); } props.add (new TextPropertyComponent (getBundleIdentifier(), "Bundle Identifier", 256, false), "A unique identifier for this product, mainly for use in OSX/iOS builds. It should be something like 'com.yourcompanyname.yourproductname'"); if (getProjectType().isAudioPlugin()) createAudioPluginPropertyEditors (props); { const int maxSizes[] = { 20480, 10240, 6144, 2048, 1024, 512, 256, 128, 64 }; StringArray maxSizeNames; Array<var> maxSizeCodes; maxSizeNames.add (TRANS("Default")); maxSizeCodes.add (var::null); maxSizeNames.add (String::empty); maxSizeCodes.add (var::null); for (int i = 0; i < numElementsInArray (maxSizes); ++i) { const int sizeInBytes = maxSizes[i] * 1024; maxSizeNames.add (File::descriptionOfSizeInBytes (sizeInBytes)); maxSizeCodes.add (sizeInBytes); } props.add (new ChoicePropertyComponent (getMaxBinaryFileSize(), "BinaryData.cpp size limit", maxSizeNames, maxSizeCodes), "When splitting binary data into multiple cpp files, the Projucer attempts to keep the file sizes below this threshold. " "(Note that individual resource files which are larger than this size cannot be split across multiple cpp files)."); } props.add (new BooleanPropertyComponent (shouldIncludeBinaryInAppConfig(), "Include Binary", "Include BinaryData.h in the AppConfig.h file")); props.add (new TextPropertyComponent (getProjectPreprocessorDefs(), "Preprocessor definitions", 32768, true), "Global preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, or " "new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); props.add (new TextPropertyComponent (getProjectUserNotes(), "Notes", 32768, true), "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts."); }
void createPropertyEditors (Project& project, PropertyListBuilder& props) const { props.add (new BooleanPropertyComponent (shouldBuildVST (project), "Build VST", "Enabled"), "Whether the project should produce a VST plugin."); props.add (new BooleanPropertyComponent (shouldBuildVST3 (project), "Build VST3", "Enabled"), "Whether the project should produce a VST3 plugin."); props.add (new BooleanPropertyComponent (shouldBuildAU (project), "Build AudioUnit", "Enabled"), "Whether the project should produce an AudioUnit plugin."); props.add (new BooleanPropertyComponent (shouldBuildRTAS (project), "Build RTAS", "Enabled"), "Whether the project should produce an RTAS plugin."); props.add (new BooleanPropertyComponent (shouldBuildAAX (project), "Build AAX", "Enabled"), "Whether the project should produce an AAX plugin."); props.add (new TextPropertyComponent (getPluginName (project), "Plugin Name", 128, false), "The name of your plugin (keep it short!)"); props.add (new TextPropertyComponent (getPluginDesc (project), "Plugin Description", 256, false), "A short description of your plugin."); props.add (new TextPropertyComponent (getPluginManufacturer (project), "Plugin Manufacturer", 256, false), "The name of your company (cannot be blank)."); props.add (new TextPropertyComponent (getPluginManufacturerCode (project), "Plugin Manufacturer Code", 4, false), "A four-character unique ID for your company. Note that for AU compatibility, this must contain at least one upper-case letter!"); props.add (new TextPropertyComponent (getPluginCode (project), "Plugin Code", 4, false), "A four-character unique ID for your plugin. Note that for AU compatibility, this must contain at least one upper-case letter!"); props.add (new TextPropertyComponent (getPluginChannelConfigs (project), "Plugin Channel Configurations", 256, false), "This is the set of input/output channel configurations that your plugin can handle. The list is a comma-separated set of pairs of values in the form { numInputs, numOutputs }, and each " "pair indicates a valid configuration that the plugin can handle. So for example, {1, 1}, {2, 2} means that the plugin can be used in just two configurations: either with 1 input " "and 1 output, or with 2 inputs and 2 outputs."); props.add (new BooleanPropertyComponent (getPluginIsSynth (project), "Plugin is a Synth", "Is a Synth"), "Enable this if you want your plugin to be treated as a synth or generator. It doesn't make much difference to the plugin itself, but some hosts treat synths differently to other plugins."); props.add (new BooleanPropertyComponent (getPluginWantsMidiInput (project), "Plugin Midi Input", "Plugin wants midi input"), "Enable this if you want your plugin to accept midi messages."); props.add (new BooleanPropertyComponent (getPluginProducesMidiOut (project), "Plugin Midi Output", "Plugin produces midi output"), "Enable this if your plugin is going to produce midi messages."); props.add (new BooleanPropertyComponent (getPluginSilenceInProducesSilenceOut (project), "Silence", "Silence in produces silence out"), "Enable this if your plugin has no tail - i.e. if passing a silent buffer to it will always result in a silent buffer being produced."); props.add (new BooleanPropertyComponent (getPluginEditorNeedsKeyFocus (project), "Key Focus", "Plugin editor requires keyboard focus"), "Enable this if your plugin needs keyboard input - some hosts can be a bit funny about keyboard focus.."); props.add (new TextPropertyComponent (getPluginAUExportPrefix (project), "Plugin AU Export Prefix", 64, false), "A prefix for the names of exported entry-point functions that the component exposes - typically this will be a version of your plugin's name that can be used as part of a C++ token."); props.add (new TextPropertyComponent (getPluginAUMainType (project), "Plugin AU Main Type", 128, false), "In an AU, this is the value that is set as JucePlugin_AUMainType. Leave it blank unless you want to use a custom value."); props.add (new TextPropertyComponent (getPluginVSTCategory (project), "VST Category", 64, false), "In a VST, this is the value that is set as JucePlugin_VSTCategory. Leave it blank unless you want to use a custom value."); props.add (new TextPropertyComponent (getPluginRTASCategory (project), "Plugin RTAS Category", 64, false), "(Leave this blank if your plugin is a synth). This is one of the RTAS categories from FicPluginEnums.h, such as: ePlugInCategory_None, ePlugInCategory_EQ, ePlugInCategory_Dynamics, " "ePlugInCategory_PitchShift, ePlugInCategory_Reverb, ePlugInCategory_Delay, " "ePlugInCategory_Modulation, ePlugInCategory_Harmonic, ePlugInCategory_NoiseReduction, " "ePlugInCategory_Dither, ePlugInCategory_SoundField"); props.add (new TextPropertyComponent (getPluginAAXCategory (project), "Plugin AAX Category", 64, false), "This is one of the categories from the AAX_EPlugInCategory enum"); props.add (new TextPropertyComponent (project.getAAXIdentifier(), "Plugin AAX Identifier", 256, false), "The value to use for the JucePlugin_AAXIdentifier setting"); }
void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) { props.add (new TextPropertyComponent (getTargetLocationValue(), "Target Project Folder", 1024, false), "The location of the folder in which the " + name + " project will be created. " "This path can be absolute, but it's much more sensible to make it relative to the jucer project directory."); props.add (new TextPropertyComponent (getJuceFolderValue(), "Local JUCE folder", 1024, false), "The location of the Juce library folder that the " + name + " project will use to when compiling. " "This can be an absolute path, or relative to the jucer project folder, but it must be valid on the " "filesystem of the machine you use to actually do the compiling."); OwnedArray<LibraryModule> modules; ModuleList moduleList; moduleList.rescan (ModuleList::getDefaultModulesFolder (&project)); project.createRequiredModules (moduleList, modules); for (int i = 0; i < modules.size(); ++i) modules.getUnchecked(i)->createPropertyEditors (*this, props); props.add (new TextPropertyComponent (getExporterPreprocessorDefs(), "Extra Preprocessor Definitions", 32768, true), "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, " "or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); props.add (new TextPropertyComponent (getExtraCompilerFlags(), "Extra compiler flags", 2048, true), "Extra command-line flags to be passed to the compiler. This string can contain references to preprocessor definitions in the " "form ${NAME_OF_DEFINITION}, which will be replaced with their values."); props.add (new TextPropertyComponent (getExtraLinkerFlags(), "Extra linker flags", 2048, true), "Extra command-line flags to be passed to the linker. You might want to use this for adding additional libraries. " "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); props.add (new TextPropertyComponent (getExternalLibraries(), "External libraries to link", 2048, true), "Additional libraries to link (one per line). You should not add any platform specific decoration to these names. " "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); { OwnedArray<Project::Item> images; project.findAllImageItems (images); StringArray choices; Array<var> ids; choices.add ("<None>"); ids.add (var::null); choices.add (String::empty); ids.add (var::null); for (int i = 0; i < images.size(); ++i) { choices.add (images.getUnchecked(i)->getName()); ids.add (images.getUnchecked(i)->getID()); } props.add (new ChoicePropertyComponent (getSmallIconImageItemID(), "Icon (small)", choices, ids), "Sets an icon to use for the executable."); props.add (new ChoicePropertyComponent (getBigIconImageItemID(), "Icon (large)", choices, ids), "Sets an icon to use for the executable."); } createExporterProperties (props); props.add (new TextPropertyComponent (getUserNotes(), "Notes", 32768, true), "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts."); }