1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-17 00:44:19 +00:00

Projucer: Avoid use-after-free in Sidebar destructor

This commit is contained in:
reuk 2021-05-14 14:53:12 +01:00
parent bfdda737a2
commit 9c016af6ee

View file

@ -32,7 +32,7 @@ NewFileWizard::Type* createGUIComponentWizard();
//==============================================================================
ProjectContentComponent::ProjectContentComponent()
: sidebar (new Sidebar (project))
: sidebar (std::make_unique<Sidebar> (project))
{
setOpaque (true);
setWantsKeyboardFocus (true);
@ -76,10 +76,10 @@ void ProjectContentComponent::resized()
r.removeFromTop (10);
auto sidebarArea = r.removeFromLeft (sidebar->getWidth() != 0 ? sidebar->getWidth()
: r.getWidth() / 4);
auto sidebarArea = r.removeFromLeft (sidebar != nullptr && sidebar->getWidth() != 0 ? sidebar->getWidth()
: r.getWidth() / 4);
if (sidebar->isVisible())
if (sidebar != nullptr && sidebar->isVisible())
sidebar->setBounds (sidebarArea);
if (resizerBar != nullptr)
@ -87,7 +87,7 @@ void ProjectContentComponent::resized()
contentViewComponent.setBounds (r);
headerComponent.sidebarTabsWidthChanged (sidebar->getWidth());
headerComponent.sidebarTabsWidthChanged (sidebarArea.getWidth());
}
void ProjectContentComponent::lookAndFeelChanged()
@ -113,6 +113,7 @@ void ProjectContentComponent::setProject (Project* newProject)
hideEditor();
resizerBar = nullptr;
sidebar = nullptr;
project = newProject;
@ -122,8 +123,8 @@ void ProjectContentComponent::setProject (Project* newProject)
addAndMakeVisible (sidebar.get());
//==============================================================================
resizerBar.reset (new ResizableEdgeComponent (sidebar.get(), &sidebarSizeConstrainer,
ResizableEdgeComponent::rightEdge));
resizerBar = std::make_unique<ResizableEdgeComponent> (sidebar.get(), &sidebarSizeConstrainer,
ResizableEdgeComponent::rightEdge);
addAndMakeVisible (resizerBar.get());
resizerBar->setAlwaysOnTop (true);
@ -138,7 +139,6 @@ void ProjectContentComponent::setProject (Project* newProject)
}
else
{
sidebar->setVisible (false);
headerComponent.setVisible (false);
projectMessagesComponent.setVisible (false);
}
@ -190,14 +190,16 @@ void ProjectContentComponent::changeListenerCallback (ChangeBroadcaster* broadca
void ProjectContentComponent::refreshProjectTreeFileStatuses()
{
if (auto* fileTree = sidebar->getFileTreePanel())
fileTree->repaint();
if (sidebar != nullptr)
if (auto* fileTree = sidebar->getFileTreePanel())
fileTree->repaint();
}
void ProjectContentComponent::updateMissingFileStatuses()
{
if (auto* tree = sidebar->getFileTreePanel())
tree->updateMissingFileStatuses();
if (sidebar != nullptr)
if (auto* tree = sidebar->getFileTreePanel())
tree->updateMissingFileStatuses();
}
bool ProjectContentComponent::showEditorForFile (const File& fileToShow, bool grabFocus)
@ -415,6 +417,9 @@ void ProjectContentComponent::showExporterSettings (const String& exporterName)
showExportersPanel();
if (sidebar == nullptr)
return;
if (auto* exportersPanel = sidebar->getExportersTreePanel())
{
if (auto* exporters = dynamic_cast<TreeItemTypes::ExportersTreeRoot*> (exportersPanel->rootItem.get()))
@ -440,6 +445,9 @@ void ProjectContentComponent::showModule (const String& moduleID)
{
showModulesPanel();
if (sidebar == nullptr)
return;
if (auto* modsPanel = sidebar->getModuleTreePanel())
{
if (auto* mods = dynamic_cast<TreeItemTypes::EnabledModulesItem*> (modsPanel->rootItem.get()))
@ -521,8 +529,9 @@ void ProjectContentComponent::showNewExporterMenu()
void ProjectContentComponent::deleteSelectedTreeItems()
{
if (auto* tree = sidebar->getTreeWithSelectedItems())
tree->deleteSelectedItems();
if (sidebar != nullptr)
if (auto* tree = sidebar->getTreeWithSelectedItems())
tree->deleteSelectedItems();
}
void ProjectContentComponent::showBubbleMessage (Rectangle<int> pos, const String& text)
@ -869,5 +878,6 @@ void ProjectContentComponent::addNewGUIFile()
//==============================================================================
void ProjectContentComponent::showProjectPanel (const int index)
{
sidebar->showPanel (index);
if (sidebar != nullptr)
sidebar->showPanel (index);
}