1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-13 00:04:19 +00:00
JUCE/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTab.h

295 lines
9.2 KiB
C++

/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2017 - ROLI Ltd.
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 5 End-User License
Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
27th April 2017).
End User License Agreement: www.juce.com/juce-5-licence
Privacy Policy: www.juce.com/juce-5-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
//==========================================================================
struct ProjectSettingsComponent : public Component,
private ChangeListener
{
ProjectSettingsComponent (Project& p)
: project (p),
group (project.getProjectFilenameRoot(),
Icon (getIcons().settings, Colours::transparentBlack))
{
addAndMakeVisible (group);
updatePropertyList();
project.addChangeListener (this);
}
~ProjectSettingsComponent()
{
project.removeChangeListener (this);
}
void resized() override
{
group.updateSize (12, 0, getWidth() - 24);
group.setBounds (getLocalBounds().reduced (12, 0));
}
void updatePropertyList()
{
PropertyListBuilder props;
project.createPropertyEditors (props);
group.setProperties (props);
group.setName ("Project Settings");
lastProjectType = project.getProjectTypeValue().getValue();
parentSizeChanged();
}
void changeListenerCallback (ChangeBroadcaster*) override
{
if (lastProjectType != project.getProjectTypeValue().getValue())
updatePropertyList();
}
void parentSizeChanged() override
{
const auto width = jmax (550, getParentWidth());
auto y = group.updateSize (12, 0, width - 12);
y = jmax (getParentHeight(), y);
setSize (width, y);
}
Project& project;
var lastProjectType;
PropertyGroupComponent group;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectSettingsComponent)
};
//==============================================================================
struct FileTreePanel : public TreePanelBase
{
FileTreePanel (Project& p)
: TreePanelBase (&p, "fileTreeState")
{
tree.setMultiSelectEnabled (true);
setRoot (new TreeItemTypes::GroupItem (p.getMainGroup()));
tree.setRootItemVisible (false);
}
void updateMissingFileStatuses()
{
if (auto* p = dynamic_cast<TreeItemTypes::FileTreeItemBase*> (rootItem.get()))
p->checkFileStatus();
}
};
struct ModuleTreePanel : public TreePanelBase
{
ModuleTreePanel (Project& p)
: TreePanelBase (&p, "moduleTreeState")
{
tree.setMultiSelectEnabled (false);
setRoot (new TreeItemTypes::EnabledModulesItem (p));
tree.setRootItemVisible (false);
}
};
struct ExportersTreePanel : public TreePanelBase
{
ExportersTreePanel (Project& p)
: TreePanelBase (&p, "exportersTreeState")
{
tree.setMultiSelectEnabled (false);
setRoot (new TreeItemTypes::ExportersTreeRoot (p));
tree.setRootItemVisible (false);
}
void deleteSelectedItems() override
{
for (int i = rootItem->getNumSubItems() - 1; i >= 0; --i)
if (rootItem->getSubItem (i)->isSelected())
if (auto* root = dynamic_cast<TreeItemTypes::ExportersTreeRoot*> (rootItem.get()))
root->removeExporter (i);
}
};
//==============================================================================
class ProjectTab : public Component,
private ChangeListener
{
public:
ProjectTab (Project* p)
: project (p)
{
addAndMakeVisible (concertinaPanel);
buildConcertina();
}
~ProjectTab()
{
getFileTreePanel()->saveOpenness();
getModuleTreePanel()->saveOpenness();
getExportersTreePanel()->saveOpenness();
}
void paint (Graphics& g) override
{
g.fillAll (findColour (secondaryBackgroundColourId));
}
void resized() override
{
concertinaPanel.setBounds (getLocalBounds());
}
TreePanelBase* getTreeWithSelectedItems()
{
for (int i = concertinaPanel.getNumPanels() - 1; i >= 0; --i)
{
if (auto* treeComponent = dynamic_cast<ConcertinaTreeComponent*> (concertinaPanel.getPanel (i)))
{
if (auto* base = treeComponent->getTree())
if (base->tree.getNumSelectedItems() != 0)
return base;
}
}
return nullptr;
}
FileTreePanel* getFileTreePanel()
{
if (auto* panel = dynamic_cast<ConcertinaTreeComponent*> (concertinaPanel.getPanel (0)))
return dynamic_cast<FileTreePanel*> (panel->getTree());
return nullptr;
}
ModuleTreePanel* getModuleTreePanel()
{
if (auto* panel = dynamic_cast<ConcertinaTreeComponent*> (concertinaPanel.getPanel (1)))
return dynamic_cast<ModuleTreePanel*> (panel->getTree());
return nullptr;
}
ExportersTreePanel* getExportersTreePanel()
{
if (auto* panel = dynamic_cast<ConcertinaTreeComponent*> (concertinaPanel.getPanel (2)))
return dynamic_cast<ExportersTreePanel*> (panel->getTree());
return nullptr;
}
void showPanel (int panelIndex)
{
jassert (isPositiveAndBelow (panelIndex, concertinaPanel.getNumPanels()));
concertinaPanel.expandPanelFully (concertinaPanel.getPanel (panelIndex), true);
}
void setPanelHeightProportion (int panelIndex, float prop)
{
jassert (isPositiveAndBelow (panelIndex, concertinaPanel.getNumPanels()));
concertinaPanel.setPanelSize (concertinaPanel.getPanel (panelIndex),
roundToInt (prop * (concertinaPanel.getHeight() - 90)), false);
}
float getPanelHeightProportion (int panelIndex)
{
jassert (isPositiveAndBelow (panelIndex, concertinaPanel.getNumPanels()));
return ((float) (concertinaPanel.getPanel (panelIndex)->getHeight()) / (concertinaPanel.getHeight() - 90));
}
private:
ConcertinaPanel concertinaPanel;
OwnedArray<ConcertinaHeader> headers;
Project* project = nullptr;
//==============================================================================
void changeListenerCallback (ChangeBroadcaster* source) override
{
if (auto* header = dynamic_cast<ConcertinaHeader*> (source))
{
auto index = headers.indexOf (header);
concertinaPanel.expandPanelFully (concertinaPanel.getPanel (index), true);
}
}
void buildConcertina()
{
for (int i = concertinaPanel.getNumPanels() - 1; i >= 0 ; --i)
concertinaPanel.removePanel (concertinaPanel.getPanel (i));
headers.clear();
if (project != nullptr)
{
concertinaPanel.addPanel (0, new ConcertinaTreeComponent (new FileTreePanel (*project), true, false, true), true);
concertinaPanel.addPanel (1, new ConcertinaTreeComponent (new ModuleTreePanel (*project), true, true), true);
concertinaPanel.addPanel (2, new ConcertinaTreeComponent (new ExportersTreePanel (*project), true), true);
}
headers.add (new ConcertinaHeader ("File explorer", getIcons().fileExplorer));
headers.add (new ConcertinaHeader ("Modules", getIcons().modules));
headers.add (new ConcertinaHeader ("Exporters", getIcons().exporter));
for (int i = 0; i < concertinaPanel.getNumPanels(); ++i)
{
auto* p = concertinaPanel.getPanel (i);
auto* h = headers.getUnchecked (i);
p->addMouseListener (this, true);
h->addChangeListener (this);
h->yPosition = i * 30;
concertinaPanel.setCustomPanelHeader (p, h, false);
concertinaPanel.setPanelHeaderSize (p, 30);
}
}
void mouseDown (const MouseEvent& e) override
{
for (int i = concertinaPanel.getNumPanels() - 1; i >= 0; --i)
{
auto* p = concertinaPanel.getPanel (i);
if (! (p->isParentOf (e.eventComponent)))
{
auto* base = dynamic_cast<TreePanelBase*> (p);
if (base == nullptr)
base = dynamic_cast<ConcertinaTreeComponent*> (p)->getTree();
if (base != nullptr)
base->tree.clearSelectedItems();
}
}
}
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectTab)
};