mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-02-01 03:10:06 +00:00
Introjucer: Added Android Studio exporter
This commit is contained in:
parent
ddcd78eae8
commit
810f2bfb2a
40 changed files with 2257 additions and 376 deletions
|
|
@ -174,6 +174,7 @@ public:
|
|||
exportersTree.addListener (this);
|
||||
}
|
||||
|
||||
bool isRoot() const override { return true; }
|
||||
bool isProjectSettings() const override { return true; }
|
||||
String getRenamingName() const override { return getDisplayName(); }
|
||||
String getDisplayName() const override { return project.getTitle(); }
|
||||
|
|
@ -197,25 +198,8 @@ public:
|
|||
|
||||
void showPopupMenu() override
|
||||
{
|
||||
PopupMenu menu;
|
||||
|
||||
const StringArray exporters (ProjectExporter::getExporterNames());
|
||||
|
||||
for (int i = 0; i < exporters.size(); ++i)
|
||||
menu.addItem (i + 1, "Create a new " + exporters[i] + " target");
|
||||
|
||||
launchPopupMenu (menu);
|
||||
}
|
||||
|
||||
void handlePopupMenuResult (int resultCode) override
|
||||
{
|
||||
if (resultCode > 0)
|
||||
{
|
||||
String exporterName (ProjectExporter::getExporterNames() [resultCode - 1]);
|
||||
|
||||
if (exporterName.isNotEmpty())
|
||||
project.addNewExporter (exporterName);
|
||||
}
|
||||
if (ProjectContentComponent* pcc = getProjectContentComponent())
|
||||
pcc->showNewExporterMenu();
|
||||
}
|
||||
|
||||
bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails) override
|
||||
|
|
|
|||
|
|
@ -27,12 +27,12 @@ class ExporterItem : public ConfigTreeItemBase
|
|||
public:
|
||||
ExporterItem (Project& p, ProjectExporter* e, int index)
|
||||
: project (p), exporter (e), configListTree (exporter->getConfigurations()),
|
||||
exporterIndex (index)
|
||||
exporterIndex (index), icon (createIcon (exporter->getName()))
|
||||
{
|
||||
configListTree.addListener (this);
|
||||
jassert (exporter != nullptr);
|
||||
}
|
||||
|
||||
int getItemHeight() const override { return 22; }
|
||||
bool canBeSelected() const override { return true; }
|
||||
bool mightContainSubItems() override { return exporter->getNumConfigurations() > 0; }
|
||||
String getUniqueName() const override { return "exporter_" + String (exporterIndex); }
|
||||
|
|
@ -40,9 +40,18 @@ public:
|
|||
String getDisplayName() const override { return exporter->getName(); }
|
||||
void setName (const String&) override {}
|
||||
bool isMissing() override { return false; }
|
||||
Icon getIcon() const override { return Icon (getIcons().exporter, getContrastingColour (0.5f)); }
|
||||
Icon getIcon() const override { return Icon(); }
|
||||
void showDocument() override { showSettingsPage (new SettingsComp (exporter)); }
|
||||
|
||||
void paintIcon (Graphics& g, Rectangle<int> area) override
|
||||
{
|
||||
g.setColour (Colours::black);
|
||||
|
||||
g.drawImageWithin (icon, area.getX(), area.getY(),
|
||||
area.getWidth(), area.getHeight(),
|
||||
RectanglePlacement::centred, false);
|
||||
}
|
||||
|
||||
void deleteItem() override
|
||||
{
|
||||
if (AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, "Delete Exporter",
|
||||
|
|
@ -122,6 +131,22 @@ private:
|
|||
ScopedPointer<ProjectExporter> exporter;
|
||||
ValueTree configListTree;
|
||||
int exporterIndex;
|
||||
Image icon;
|
||||
|
||||
static Image createIcon (const String& exporterName)
|
||||
{
|
||||
Array<ProjectExporter::ExporterTypeInfo> types (ProjectExporter::getExporterTypes());
|
||||
|
||||
for (int i = 0; i < types.size(); ++i)
|
||||
{
|
||||
const ProjectExporter::ExporterTypeInfo& type = types.getReference (i);
|
||||
|
||||
if (type.name == exporterName)
|
||||
return type.getIcon();
|
||||
}
|
||||
|
||||
return Image();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
class SettingsComp : public Component
|
||||
|
|
|
|||
|
|
@ -300,6 +300,7 @@ public:
|
|||
moduleListTree.addListener (this);
|
||||
}
|
||||
|
||||
int getItemHeight() const override { return 22; }
|
||||
bool isModulesList() const override { return true; }
|
||||
bool canBeSelected() const override { return true; }
|
||||
bool mightContainSubItems() override { return true; }
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ public:
|
|||
|
||||
//==============================================================================
|
||||
File getGeneratedCodeFolder() const { return getFile().getSiblingFile ("JuceLibraryCode"); }
|
||||
File getSourceFilesFolder() const { return getProjectFolder().getChildFile ("Source"); }
|
||||
File getLocalModulesFolder() const { return getGeneratedCodeFolder().getChildFile ("modules"); }
|
||||
File getLocalModuleFolder (const String& moduleID) const { return getLocalModulesFolder().getChildFile (moduleID); }
|
||||
File getAppIncludeFile() const { return getGeneratedCodeFolder().getChildFile (getJuceSourceHFilename()); }
|
||||
|
|
|
|||
|
|
@ -64,6 +64,11 @@ public:
|
|||
#if JUCE_MAC || JUCE_WINDOWS
|
||||
ApplicationCommandManager& commandManager = IntrojucerApp::getCommandManager();
|
||||
|
||||
addAndMakeVisible (createExporterButton);
|
||||
createExporterButton.setCommandToTrigger (&commandManager, CommandIDs::createNewExporter, true);
|
||||
createExporterButton.setButtonText (commandManager.getNameOfCommand (CommandIDs::createNewExporter));
|
||||
createExporterButton.setColour (TextButton::buttonColourId, Colours::white.withAlpha (0.5f));
|
||||
|
||||
addAndMakeVisible (openProjectButton);
|
||||
openProjectButton.setCommandToTrigger (&commandManager, CommandIDs::openInIDE, true);
|
||||
openProjectButton.setButtonText (commandManager.getNameOfCommand (CommandIDs::openInIDE));
|
||||
|
|
@ -87,20 +92,32 @@ public:
|
|||
if (openProjectButton.isVisible())
|
||||
openProjectButton.setBounds (r.removeFromBottom (30).reduced (16, 4));
|
||||
|
||||
if (createExporterButton.isVisible())
|
||||
{
|
||||
r.removeFromBottom (10);
|
||||
createExporterButton.setBounds (r.removeFromBottom (30).reduced (16, 4));
|
||||
}
|
||||
|
||||
tree.setBounds (r);
|
||||
}
|
||||
|
||||
static void reselect (TreeViewItem& item)
|
||||
{
|
||||
item.setSelected (false, true);
|
||||
item.setSelected (true, true);
|
||||
}
|
||||
|
||||
void showProjectSettings()
|
||||
{
|
||||
if (ConfigTreeItemTypes::ConfigTreeItemBase* root = dynamic_cast<ConfigTreeItemTypes::ConfigTreeItemBase*> (rootItem.get()))
|
||||
if (root->isProjectSettings())
|
||||
root->setSelected (true, true);
|
||||
reselect (*root);
|
||||
}
|
||||
|
||||
void showModules()
|
||||
{
|
||||
if (ConfigTreeItemTypes::ConfigTreeItemBase* mods = getModulesItem())
|
||||
mods->setSelected (true, true);
|
||||
reselect (*mods);
|
||||
}
|
||||
|
||||
void showModule (const String& moduleID)
|
||||
|
|
@ -112,11 +129,11 @@ public:
|
|||
for (int i = mods->getNumSubItems(); --i >= 0;)
|
||||
if (ConfigTreeItemTypes::ModuleItem* m = dynamic_cast<ConfigTreeItemTypes::ModuleItem*> (mods->getSubItem (i)))
|
||||
if (m->moduleID == moduleID)
|
||||
m->setSelected (true, true);
|
||||
reselect (*m);
|
||||
}
|
||||
}
|
||||
|
||||
TextButton openProjectButton, saveAndOpenButton;
|
||||
TextButton createExporterButton, openProjectButton, saveAndOpenButton;
|
||||
|
||||
private:
|
||||
ConfigTreeItemTypes::ConfigTreeItemBase* getModulesItem()
|
||||
|
|
@ -134,6 +151,12 @@ private:
|
|||
//==============================================================================
|
||||
struct LogoComponent : public Component
|
||||
{
|
||||
LogoComponent()
|
||||
{
|
||||
ScopedPointer<XmlElement> svg (XmlDocument::parse (BinaryData::background_logo_svg));
|
||||
logo = Drawable::createFromSVG (*svg);
|
||||
}
|
||||
|
||||
void paint (Graphics& g)
|
||||
{
|
||||
g.setColour (findColour (mainBackgroundColourId).contrasting (0.3f));
|
||||
|
|
@ -141,11 +164,10 @@ struct LogoComponent : public Component
|
|||
Rectangle<int> r (getLocalBounds());
|
||||
|
||||
g.setFont (15.0f);
|
||||
g.drawFittedText (getVersionInfo(), r.removeFromBottom (50), Justification::centred, 3);
|
||||
g.drawFittedText (getVersionInfo(), r.removeFromBottom (50), Justification::centredBottom, 3);
|
||||
|
||||
const Path& logo = getIcons().mainJuceLogo;
|
||||
g.fillPath (logo, RectanglePlacement (RectanglePlacement::centred)
|
||||
.getTransformToFit (logo.getBounds(), r.toFloat()));
|
||||
logo->drawWithin (g, r.withTrimmedBottom (r.getHeight() / 4).toFloat(),
|
||||
RectanglePlacement (RectanglePlacement::centred), 1.0f);
|
||||
}
|
||||
|
||||
static String getVersionInfo()
|
||||
|
|
@ -154,6 +176,8 @@ struct LogoComponent : public Component
|
|||
+ newLine
|
||||
+ IntrojucerApp::getApp().getVersionDescription();
|
||||
}
|
||||
|
||||
ScopedPointer<Drawable> logo;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -618,6 +642,42 @@ void ProjectContentComponent::openInIDE (bool saveFirst)
|
|||
}
|
||||
}
|
||||
|
||||
static void newExporterMenuCallback (int result, ProjectContentComponent* comp)
|
||||
{
|
||||
if (comp != nullptr && result > 0)
|
||||
{
|
||||
if (Project* p = comp->getProject())
|
||||
{
|
||||
String exporterName (ProjectExporter::getExporterNames() [result - 1]);
|
||||
|
||||
if (exporterName.isNotEmpty())
|
||||
p->addNewExporter (exporterName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectContentComponent::showNewExporterMenu()
|
||||
{
|
||||
if (project != nullptr)
|
||||
{
|
||||
PopupMenu menu;
|
||||
|
||||
menu.addSectionHeader ("Create a new export target:");
|
||||
|
||||
Array<ProjectExporter::ExporterTypeInfo> exporters (ProjectExporter::getExporterTypes());
|
||||
|
||||
for (int i = 0; i < exporters.size(); ++i)
|
||||
{
|
||||
const ProjectExporter::ExporterTypeInfo& type = exporters.getReference(i);
|
||||
|
||||
menu.addItem (i + 1, type.name, true, false, type.getIcon());
|
||||
}
|
||||
|
||||
menu.showMenuAsync (PopupMenu::Options(),
|
||||
ModalCallbackFunction::forComponent (newExporterMenuCallback, this));
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectContentComponent::deleteSelectedTreeItems()
|
||||
{
|
||||
if (TreePanelBase* const tree = dynamic_cast<TreePanelBase*> (treeViewTabs.getCurrentContentComponent()))
|
||||
|
|
@ -695,6 +755,7 @@ void ProjectContentComponent::getAllCommands (Array <CommandID>& commands)
|
|||
CommandIDs::closeProject,
|
||||
CommandIDs::openInIDE,
|
||||
CommandIDs::saveAndOpenInIDE,
|
||||
CommandIDs::createNewExporter,
|
||||
CommandIDs::showFilePanel,
|
||||
CommandIDs::showConfigPanel,
|
||||
CommandIDs::showProjectSettings,
|
||||
|
|
@ -779,32 +840,29 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica
|
|||
break;
|
||||
|
||||
case CommandIDs::openInIDE:
|
||||
#if JUCE_MAC
|
||||
result.setInfo ("Open in Xcode...",
|
||||
#elif JUCE_WINDOWS
|
||||
result.setInfo ("Open in Visual Studio...",
|
||||
#else
|
||||
result.setInfo ("Open as a Makefile...",
|
||||
#endif
|
||||
result.setInfo ("Open in IDE...",
|
||||
|
||||
"Launches the project in an external IDE",
|
||||
CommandCategories::general, 0);
|
||||
result.setActive (ProjectExporter::canProjectBeLaunched (project));
|
||||
break;
|
||||
|
||||
case CommandIDs::saveAndOpenInIDE:
|
||||
#if JUCE_MAC
|
||||
result.setInfo ("Save Project and Open in Xcode...",
|
||||
#elif JUCE_WINDOWS
|
||||
result.setInfo ("Save Project and Open in Visual Studio...",
|
||||
#else
|
||||
result.setInfo ("Save Project and Open as a Makefile...",
|
||||
#endif
|
||||
result.setInfo ("Save Project and Open in IDE...",
|
||||
|
||||
"Saves the project and launches it in an external IDE",
|
||||
CommandCategories::general, 0);
|
||||
result.setActive (ProjectExporter::canProjectBeLaunched (project));
|
||||
result.defaultKeypresses.add (KeyPress ('l', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0));
|
||||
break;
|
||||
|
||||
case CommandIDs::createNewExporter:
|
||||
result.setInfo ("Create New Exporter...",
|
||||
"Creates a new exporter for a compiler type",
|
||||
CommandCategories::general, 0);
|
||||
result.setActive (project != nullptr);
|
||||
break;
|
||||
|
||||
case CommandIDs::showFilePanel:
|
||||
result.setInfo ("Show File Panel",
|
||||
"Shows the tree of files for this project",
|
||||
|
|
@ -901,6 +959,8 @@ bool ProjectContentComponent::perform (const InvocationInfo& info)
|
|||
case CommandIDs::openInIDE: openInIDE (false); break;
|
||||
case CommandIDs::saveAndOpenInIDE: openInIDE (true); break;
|
||||
|
||||
case CommandIDs::createNewExporter: showNewExporterMenu(); break;
|
||||
|
||||
case CommandIDs::deleteSelectedItem: deleteSelectedTreeItems(); break;
|
||||
|
||||
case CommandIDs::showTranslationTool: showTranslationTool(); break;
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ public:
|
|||
void closeProject();
|
||||
void openInIDE (bool saveFirst);
|
||||
void openInIDE (int exporterIndex, bool saveFirst);
|
||||
void showNewExporterMenu();
|
||||
|
||||
void showFilesTab();
|
||||
void showConfigTab();
|
||||
|
|
|
|||
|
|
@ -38,14 +38,12 @@ public:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
virtual bool isRoot() const { return false; }
|
||||
|
||||
virtual bool acceptsFileDrop (const StringArray& files) const = 0;
|
||||
virtual bool acceptsDragItems (const OwnedArray<Project::Item>& selectedNodes) = 0;
|
||||
|
||||
//==============================================================================
|
||||
String getDisplayName() const override { return item.getName(); }
|
||||
String getRenamingName() const override { return getDisplayName(); }
|
||||
String getDisplayName() const override { return item.getName(); }
|
||||
String getRenamingName() const override { return getDisplayName(); }
|
||||
|
||||
void setName (const String& newName) override
|
||||
{
|
||||
|
|
@ -55,10 +53,10 @@ public:
|
|||
item.getNameValue() = newName;
|
||||
}
|
||||
|
||||
bool isMissing() override { return isFileMissing; }
|
||||
virtual File getFile() const { return item.getFile(); }
|
||||
bool isMissing() override { return isFileMissing; }
|
||||
virtual File getFile() const { return item.getFile(); }
|
||||
|
||||
void deleteItem() override { item.removeItemFromProject(); }
|
||||
void deleteItem() override { item.removeItemFromProject(); }
|
||||
|
||||
virtual void deleteAllSelectedItems() override
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue