mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Projucer: The Projucer now adds a unique suffix to the target project folder of duplicate exporters and the 'selected exporter' drop-down now defaults to the first exporter that can launch the project if none were previously selected
This commit is contained in:
parent
41bc46fd0b
commit
1a266e822b
7 changed files with 124 additions and 8 deletions
|
|
@ -93,6 +93,55 @@ StringArray ProjectExporter::getExporterNames()
|
|||
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 == MSVCProjectExporterVC2013::getName())
|
||||
return MSVCProjectExporterVC2013::getValueTreeTypeName();
|
||||
|
||||
if (exporterName == MSVCProjectExporterVC2015::getName())
|
||||
return MSVCProjectExporterVC2015::getValueTreeTypeName();
|
||||
|
||||
if (exporterName == MSVCProjectExporterVC2017::getName())
|
||||
return MSVCProjectExporterVC2017::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);
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
StringArray ProjectExporter::getAllDefaultBuildsFolders()
|
||||
{
|
||||
StringArray folders;
|
||||
|
||||
folders.add (getDefaultBuildsRootFolder() + "iOS");
|
||||
folders.add (getDefaultBuildsRootFolder() + "MacOSX");
|
||||
folders.add (getDefaultBuildsRootFolder() + "VisualStudio2013");
|
||||
folders.add (getDefaultBuildsRootFolder() + "VisualStudio2015");
|
||||
folders.add (getDefaultBuildsRootFolder() + "VisualStudio2017");
|
||||
folders.add (getDefaultBuildsRootFolder() + "LinuxMakefile");
|
||||
folders.add (getDefaultBuildsRootFolder() + "CodeBlocksWindows");
|
||||
folders.add (getDefaultBuildsRootFolder() + "CodeBlocksLinux");
|
||||
folders.add (getDefaultBuildsRootFolder() + "Android");
|
||||
|
||||
return folders;
|
||||
}
|
||||
|
||||
String ProjectExporter::getCurrentPlatformExporterName()
|
||||
{
|
||||
#if JUCE_MAC
|
||||
|
|
@ -171,6 +220,14 @@ ProjectExporter::~ProjectExporter()
|
|||
|
||||
void ProjectExporter::updateDeprecatedProjectSettingsInteractively() {}
|
||||
|
||||
String ProjectExporter::getName() const
|
||||
{
|
||||
if (! getAllDefaultBuildsFolders().contains (getTargetLocationString()))
|
||||
return name + " - " + getTargetLocationString();
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
File ProjectExporter::getTargetFolder() const
|
||||
{
|
||||
return project.resolveFilename (getTargetLocationString());
|
||||
|
|
|
|||
|
|
@ -60,6 +60,8 @@ public:
|
|||
|
||||
static StringArray getExporterNames();
|
||||
static Array<ExporterTypeInfo> getExporterTypes();
|
||||
static String getValueTreeNameForExporter (const String& exporterName);
|
||||
static StringArray getAllDefaultBuildsFolders();
|
||||
|
||||
static ProjectExporter* createNewExporter (Project&, const int index);
|
||||
static ProjectExporter* createNewExporter (Project&, const String& name);
|
||||
|
|
@ -125,7 +127,7 @@ public:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
String getName() const { return name; }
|
||||
String getName() const;
|
||||
File getTargetFolder() const;
|
||||
|
||||
Project& getProject() noexcept { return project; }
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@
|
|||
==============================================================================
|
||||
*/
|
||||
|
||||
class ExporterItem : public ConfigTreeItemBase
|
||||
class ExporterItem : public ConfigTreeItemBase,
|
||||
private Value::Listener
|
||||
{
|
||||
public:
|
||||
ExporterItem (Project& p, ProjectExporter* e, int index)
|
||||
|
|
@ -32,6 +33,8 @@ public:
|
|||
exporterIndex (index)
|
||||
{
|
||||
configListTree.addListener (this);
|
||||
targetLocationValue.referTo (exporter->getTargetLocationValue());
|
||||
targetLocationValue.addListener (this);
|
||||
}
|
||||
|
||||
int getItemHeight() const override { return 25; }
|
||||
|
|
@ -42,6 +45,7 @@ public:
|
|||
String getDisplayName() const override { return exporter->getName(); }
|
||||
void setName (const String&) override {}
|
||||
bool isMissing() const override { return false; }
|
||||
String getTooltip() override { return getDisplayName(); }
|
||||
|
||||
static Icon getIconForExporter (ProjectExporter* e)
|
||||
{
|
||||
|
|
@ -155,6 +159,14 @@ private:
|
|||
ValueTree configListTree;
|
||||
int exporterIndex;
|
||||
|
||||
Value targetLocationValue;
|
||||
|
||||
void valueChanged (Value& value) override
|
||||
{
|
||||
if (value == exporter->getTargetLocationValue())
|
||||
refreshSubItems();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
struct SettingsComp : public Component
|
||||
{
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@ public:
|
|||
auto selectedName = getSelectedExporterName();
|
||||
|
||||
exporterBox.clear();
|
||||
int preferredExporterIndex = 0;
|
||||
auto preferredExporterIndex = -1;
|
||||
|
||||
int i = 0;
|
||||
for (Project::ExporterIterator exporter (*project); exporter.next(); ++i)
|
||||
|
|
@ -326,12 +326,13 @@ public:
|
|||
if (selectedName == exporter->getName())
|
||||
exporterBox.setSelectedId (i + 1);
|
||||
|
||||
if (exporter->canLaunchProject())
|
||||
if (exporter->canLaunchProject() && preferredExporterIndex == -1)
|
||||
preferredExporterIndex = i;
|
||||
}
|
||||
|
||||
if (exporterBox.getSelectedItemIndex() == -1)
|
||||
exporterBox.setSelectedItemIndex (preferredExporterIndex);
|
||||
exporterBox.setSelectedItemIndex (preferredExporterIndex != -1 ? preferredExporterIndex
|
||||
: 0);
|
||||
|
||||
updateExporterButton();
|
||||
}
|
||||
|
|
@ -427,7 +428,10 @@ private:
|
|||
void changeListenerCallback (ChangeBroadcaster* source) override
|
||||
{
|
||||
if (source == project)
|
||||
{
|
||||
updateName();
|
||||
updateExporters();
|
||||
}
|
||||
}
|
||||
|
||||
void valueTreePropertyChanged (ValueTree&, const Identifier&) override {}
|
||||
|
|
|
|||
|
|
@ -1413,8 +1413,11 @@ void Project::addNewExporter (const String& exporterName)
|
|||
{
|
||||
ScopedPointer<ProjectExporter> exp (ProjectExporter::createNewExporter (*this, exporterName));
|
||||
|
||||
ValueTree exporters (getExporters());
|
||||
exporters.addChild (exp->settings, -1, getUndoManagerFor (exporters));
|
||||
exp->getTargetLocationValue() = exp->getTargetLocationString()
|
||||
+ getUniqueTargetFolderSuffixForExporter (exp->getName(), exp->getTargetLocationString());
|
||||
|
||||
auto exportersTree = getExporters();
|
||||
exportersTree.addChild (exp->settings, -1, getUndoManagerFor (exportersTree));
|
||||
}
|
||||
|
||||
void Project::createExporterForCurrentPlatform()
|
||||
|
|
@ -1422,6 +1425,38 @@ void Project::createExporterForCurrentPlatform()
|
|||
addNewExporter (ProjectExporter::getCurrentPlatformExporterName());
|
||||
}
|
||||
|
||||
String Project::getUniqueTargetFolderSuffixForExporter (const String& exporterName, const String& base)
|
||||
{
|
||||
StringArray buildFolders;
|
||||
|
||||
auto exportersTree = getExporters();
|
||||
auto type = ProjectExporter::getValueTreeNameForExporter (exporterName);
|
||||
|
||||
for (int i = 0; i < exportersTree.getNumChildren(); ++i)
|
||||
{
|
||||
auto exporterNode = exportersTree.getChild (i);
|
||||
|
||||
if (exporterNode.getType() == Identifier (type))
|
||||
buildFolders.add (exporterNode.getProperty ("targetFolder").toString());
|
||||
}
|
||||
|
||||
if (buildFolders.size() == 0 || ! buildFolders.contains (base))
|
||||
return {};
|
||||
|
||||
buildFolders.remove (buildFolders.indexOf (base));
|
||||
|
||||
auto num = 1;
|
||||
for (auto f : buildFolders)
|
||||
{
|
||||
if (! f.endsWith ("_" + String (num)))
|
||||
break;
|
||||
|
||||
++num;
|
||||
}
|
||||
|
||||
return "_" + String (num);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
String Project::getFileTemplate (const String& templateName)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -341,6 +341,9 @@ public:
|
|||
bool hasProjectBeenModified();
|
||||
void updateModificationTime() { modificationTime = getFile().getLastModificationTime(); }
|
||||
|
||||
//==============================================================================
|
||||
String getUniqueTargetFolderSuffixForExporter (const String& exporterName, const String& baseTargetFolder);
|
||||
|
||||
//==============================================================================
|
||||
bool shouldWaitAfterSaving = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,8 @@ class ProjectContentComponent;
|
|||
class Project;
|
||||
|
||||
//==============================================================================
|
||||
class JucerTreeViewBase : public TreeViewItem
|
||||
class JucerTreeViewBase : public TreeViewItem,
|
||||
public TooltipClient
|
||||
{
|
||||
public:
|
||||
JucerTreeViewBase();
|
||||
|
|
@ -76,6 +77,8 @@ public:
|
|||
virtual void showPlusMenu();
|
||||
virtual void handlePopupMenuResult (int resultCode);
|
||||
|
||||
String getTooltip() override { return {}; }
|
||||
|
||||
//==============================================================================
|
||||
// To handle situations where an item gets deleted before openness is
|
||||
// restored for it, this OpennessRestorer keeps only a pointer to the
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue