1
0
Fork 0
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:
ed 2017-05-15 09:29:15 +01:00
parent 41bc46fd0b
commit 1a266e822b
7 changed files with 124 additions and 8 deletions

View file

@ -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());

View file

@ -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; }

View file

@ -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
{

View file

@ -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 {}

View file

@ -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)
{

View file

@ -341,6 +341,9 @@ public:
bool hasProjectBeenModified();
void updateModificationTime() { modificationTime = getFile().getLastModificationTime(); }
//==============================================================================
String getUniqueTargetFolderSuffixForExporter (const String& exporterName, const String& baseTargetFolder);
//==============================================================================
bool shouldWaitAfterSaving = false;

View file

@ -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