mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
250 lines
9.1 KiB
C++
250 lines
9.1 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library.
|
|
Copyright (c) 2015 - ROLI Ltd.
|
|
|
|
Permission is granted to use this software under the terms of either:
|
|
a) the GPL v2 (or any later version)
|
|
b) the Affero GPL v3
|
|
|
|
Details of these licenses can be found at: www.gnu.org/licenses
|
|
|
|
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
To release a closed-source product which uses JUCE, commercial licenses are
|
|
available: visit www.juce.com for more information.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
class ModulesPanel : public Component,
|
|
private TableListBoxModel,
|
|
private ValueTree::Listener,
|
|
private Button::Listener
|
|
{
|
|
public:
|
|
ModulesPanel (Project& p)
|
|
: project (p),
|
|
modulesValueTree (p.getModules().state),
|
|
setCopyModeButton ("Set copy-mode for all modules..."),
|
|
copyPathButton ("Set paths for all modules...")
|
|
{
|
|
table.getHeader().addColumn ("Module", nameCol, 180, 100, 400, TableHeaderComponent::notSortable);
|
|
table.getHeader().addColumn ("Version", versionCol, 100, 100, 100, TableHeaderComponent::notSortable);
|
|
table.getHeader().addColumn ("Make Local Copy", copyCol, 100, 100, 100, TableHeaderComponent::notSortable);
|
|
table.getHeader().addColumn ("Paths", pathCol, 250, 100, 600, TableHeaderComponent::notSortable);
|
|
|
|
table.setModel (this);
|
|
table.setColour (TableListBox::backgroundColourId, Colours::transparentBlack);
|
|
addAndMakeVisible (table);
|
|
table.updateContent();
|
|
table.setRowHeight (20);
|
|
table.setMultipleSelectionEnabled (true);
|
|
|
|
addAndMakeVisible (setCopyModeButton);
|
|
addAndMakeVisible (copyPathButton);
|
|
setCopyModeButton.addListener (this);
|
|
setCopyModeButton.setTriggeredOnMouseDown (true);
|
|
copyPathButton.addListener (this);
|
|
copyPathButton.setTriggeredOnMouseDown (true);
|
|
|
|
modulesValueTree.addListener (this);
|
|
lookAndFeelChanged();
|
|
}
|
|
|
|
void paint (Graphics& g) override
|
|
{
|
|
ProjucerLookAndFeel::fillWithBackgroundTexture (*this, g);
|
|
}
|
|
|
|
void resized() override
|
|
{
|
|
Rectangle<int> r (getLocalBounds().reduced (5, 4));
|
|
|
|
table.setBounds (r.removeFromTop (table.getRowPosition (getNumRows() - 1, true).getBottom() + 20));
|
|
|
|
Rectangle<int> buttonRow (r.removeFromTop (32).removeFromBottom (28));
|
|
setCopyModeButton.setBounds (buttonRow.removeFromLeft (jmin (260, r.getWidth() / 3)));
|
|
buttonRow.removeFromLeft (8);
|
|
copyPathButton.setBounds (buttonRow.removeFromLeft (jmin (260, r.getWidth() / 3)));
|
|
}
|
|
|
|
int getNumRows() override
|
|
{
|
|
return project.getModules().getNumModules();
|
|
}
|
|
|
|
void paintRowBackground (Graphics& g, int /*rowNumber*/, int width, int height, bool rowIsSelected) override
|
|
{
|
|
g.setColour (rowIsSelected ? Colours::lightblue.withAlpha (0.4f)
|
|
: Colours::white.withAlpha (0.4f));
|
|
g.fillRect (0, 0, width, height - 1);
|
|
}
|
|
|
|
void paintCell (Graphics& g, int rowNumber, int columnId, int width, int height, bool /*rowIsSelected*/) override
|
|
{
|
|
String text;
|
|
const String moduleID (project.getModules().getModuleID (rowNumber));
|
|
|
|
if (columnId == nameCol)
|
|
{
|
|
text = moduleID;
|
|
}
|
|
else if (columnId == versionCol)
|
|
{
|
|
text = project.getModules().getModuleInfo (moduleID).getVersion();
|
|
|
|
if (text.isEmpty())
|
|
text = "?";
|
|
}
|
|
else if (columnId == copyCol)
|
|
{
|
|
text = project.getModules().shouldCopyModuleFilesLocally (moduleID).getValue()
|
|
? "Yes" : "No";
|
|
}
|
|
else if (columnId == pathCol)
|
|
{
|
|
StringArray paths;
|
|
|
|
for (Project::ExporterIterator exporter (project); exporter.next();)
|
|
paths.addIfNotAlreadyThere (exporter->getPathForModuleString (moduleID).trim());
|
|
|
|
text = paths.joinIntoString (", ");
|
|
}
|
|
|
|
g.setColour (Colours::black);
|
|
g.setFont (height * 0.65f);
|
|
g.drawText (text, Rectangle<int> (width, height).reduced (4, 0), Justification::centredLeft, true);
|
|
}
|
|
|
|
void cellDoubleClicked (int rowNumber, int, const MouseEvent&) override
|
|
{
|
|
const String moduleID (project.getModules().getModuleID (rowNumber));
|
|
|
|
if (moduleID.isNotEmpty())
|
|
if (ProjectContentComponent* pcc = findParentComponentOfClass<ProjectContentComponent>())
|
|
pcc->showModule (moduleID);
|
|
}
|
|
|
|
void deleteKeyPressed (int row) override
|
|
{
|
|
project.getModules().removeModule (project.getModules().getModuleID (row));
|
|
}
|
|
|
|
void buttonClicked (Button* b) override
|
|
{
|
|
if (b == &setCopyModeButton) showCopyModeMenu();
|
|
if (b == ©PathButton) showSetPathsMenu();
|
|
}
|
|
|
|
private:
|
|
enum
|
|
{
|
|
nameCol = 1,
|
|
versionCol,
|
|
copyCol,
|
|
pathCol
|
|
};
|
|
|
|
Project& project;
|
|
ValueTree modulesValueTree;
|
|
TableListBox table;
|
|
TextButton setCopyModeButton, copyPathButton;
|
|
std::map<String, var> modulePathClipboard;
|
|
|
|
void valueTreePropertyChanged (ValueTree&, const Identifier&) override { itemChanged(); }
|
|
void valueTreeChildAdded (ValueTree&, ValueTree&) override { itemChanged(); }
|
|
void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override { itemChanged(); }
|
|
void valueTreeChildOrderChanged (ValueTree&, int, int) override { itemChanged(); }
|
|
void valueTreeParentChanged (ValueTree&) override { itemChanged(); }
|
|
|
|
void itemChanged()
|
|
{
|
|
table.updateContent();
|
|
resized();
|
|
repaint();
|
|
}
|
|
|
|
void showCopyModeMenu()
|
|
{
|
|
PopupMenu m;
|
|
m.addItem (1, "Set all modules to copy locally");
|
|
m.addItem (2, "Set all modules to not copy locally");
|
|
|
|
int res = m.showAt (&setCopyModeButton);
|
|
|
|
if (res != 0)
|
|
project.getModules().setLocalCopyModeForAllModules (res == 1);
|
|
}
|
|
|
|
void showSetPathsMenu()
|
|
{
|
|
enum
|
|
{
|
|
copyPathsToAllModulesID = 1,
|
|
copyPathsID,
|
|
pastePathsID
|
|
};
|
|
|
|
auto& moduleList = project.getModules();
|
|
auto moduleToCopy = moduleList.getModuleID (table.getSelectedRow());
|
|
|
|
if (moduleToCopy.isNotEmpty())
|
|
{
|
|
PopupMenu m;
|
|
m.addItem (copyPathsToAllModulesID, "Copy the paths from the module '" + moduleToCopy + "' to all other modules");
|
|
m.addItem (copyPathsID, "Copy paths from selected module", table.getNumSelectedRows() == 1);
|
|
m.addItem (pastePathsID, "Paste paths to selected modules", ! modulePathClipboard.empty());
|
|
|
|
int res = m.showAt (©PathButton);
|
|
|
|
if (res == copyPathsToAllModulesID)
|
|
{
|
|
for (Project::ExporterIterator exporter (project); exporter.next();)
|
|
{
|
|
for (int i = 0; i < moduleList.getNumModules(); ++i)
|
|
{
|
|
auto modID = moduleList.getModuleID (i);
|
|
|
|
if (modID != moduleToCopy)
|
|
exporter->getPathForModuleValue (modID) = exporter->getPathForModuleValue (moduleToCopy).getValue();
|
|
}
|
|
}
|
|
}
|
|
else if (res == copyPathsID)
|
|
{
|
|
modulePathClipboard.clear();
|
|
|
|
for (Project::ExporterIterator exporter (project); exporter.next();)
|
|
modulePathClipboard[exporter->getName()] = exporter->getPathForModuleValue (moduleToCopy).getValue();
|
|
}
|
|
else if (res == pastePathsID)
|
|
{
|
|
for (int selectionId = 0; selectionId < table.getNumSelectedRows(); ++selectionId)
|
|
{
|
|
auto rowNumber = table.getSelectedRow (selectionId);
|
|
auto modID = moduleList.getModuleID (rowNumber);
|
|
|
|
for (Project::ExporterIterator exporter (project); exporter.next();)
|
|
exporter->getPathForModuleValue (modID) = modulePathClipboard[exporter->getName()];
|
|
}
|
|
}
|
|
|
|
table.repaint();
|
|
}
|
|
else
|
|
{
|
|
PopupMenu m;
|
|
m.addItem (1, "(Select a module in the list above to use this option)", false);
|
|
|
|
m.showAt (©PathButton);
|
|
}
|
|
}
|
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModulesPanel)
|
|
};
|