diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp index 2e2c8f4414..6b47010343 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp @@ -1237,7 +1237,7 @@ private: //============================================================================== struct NormalComponentWrapper : public PopupMenu::CustomComponent { - NormalComponentWrapper (Component* comp, int w, int h, bool triggerMenuItemAutomaticallyWhenClicked) + NormalComponentWrapper (Component& comp, int w, int h, bool triggerMenuItemAutomaticallyWhenClicked) : PopupMenu::CustomComponent (triggerMenuItemAutomaticallyWhenClicked), width (w), height (h) { @@ -1530,22 +1530,26 @@ void PopupMenu::addColouredItem (int itemResultID, String itemText, Colour itemT addItem (std::move (i)); } -void PopupMenu::addCustomItem (int itemResultID, CustomComponent* cc, const PopupMenu* subMenu) +void PopupMenu::addCustomItem (int itemResultID, + std::unique_ptr cc, + std::unique_ptr subMenu) { Item i; i.itemID = itemResultID; - i.customComponent = cc; - i.subMenu.reset (createCopyIfNotNull (subMenu)); + i.customComponent = cc.release(); + i.subMenu.reset (createCopyIfNotNull (subMenu.get())); addItem (std::move (i)); } -void PopupMenu::addCustomItem (int itemResultID, Component* customComponent, int idealWidth, int idealHeight, - bool triggerMenuItemAutomaticallyWhenClicked, const PopupMenu* subMenu) +void PopupMenu::addCustomItem (int itemResultID, + Component& customComponent, + int idealWidth, int idealHeight, + bool triggerMenuItemAutomaticallyWhenClicked, + std::unique_ptr subMenu) { - addCustomItem (itemResultID, - new HelperClasses::NormalComponentWrapper (customComponent, idealWidth, idealHeight, - triggerMenuItemAutomaticallyWhenClicked), - subMenu); + auto comp = std::make_unique (customComponent, idealWidth, idealHeight, + triggerMenuItemAutomaticallyWhenClicked); + addCustomItem (itemResultID, std::move (comp), std::move (subMenu)); } void PopupMenu::addSubMenu (String subMenuName, PopupMenu subMenu, bool isActive) diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.h b/modules/juce_gui_basics/menus/juce_PopupMenu.h index 2ebc3a7c3d..6da361ab2a 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.h +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.h @@ -323,22 +323,21 @@ public: /** Appends a custom menu item. - This will add a user-defined component to use as a menu item. The component - passed in will be deleted by this menu when it's no longer needed. + This will add a user-defined component to use as a menu item. Note that native macOS menus do not support custom components. @see CustomComponent */ void addCustomItem (int itemResultID, - CustomComponent* customComponent, - const PopupMenu* optionalSubMenu = nullptr); + std::unique_ptr customComponent, + std::unique_ptr optionalSubMenu = nullptr); /** Appends a custom menu item that can't be used to trigger a result. This will add a user-defined component to use as a menu item. - It's the caller's responsibility to delete the component that is passed-in - when it's no longer needed after the menu has been hidden. + The caller must ensure that the passed-in component stays alive + until after the menu has been hidden. If triggerMenuItemAutomaticallyWhenClicked is true, the menu itself will handle detection of a mouse-click on your component, and use that to trigger the @@ -348,11 +347,11 @@ public: Note that native macOS menus do support custom components. */ void addCustomItem (int itemResultID, - Component* customComponent, + Component& customComponent, int idealWidth, int idealHeight, bool triggerMenuItemAutomaticallyWhenClicked, - const PopupMenu* optionalSubMenu = nullptr); + std::unique_ptr optionalSubMenu = nullptr); /** Appends a sub-menu. diff --git a/modules/juce_gui_basics/widgets/juce_Toolbar.cpp b/modules/juce_gui_basics/widgets/juce_Toolbar.cpp index 7f24b86bc6..1049dbe404 100644 --- a/modules/juce_gui_basics/widgets/juce_Toolbar.cpp +++ b/modules/juce_gui_basics/widgets/juce_Toolbar.cpp @@ -542,7 +542,8 @@ void Toolbar::showMissingItems() if (missingItemsButton->isShowing()) { PopupMenu m; - m.addCustomItem (1, new MissingItemsComponent (*this, getThickness())); + auto comp = std::make_unique (*this, getThickness()); + m.addCustomItem (1, std::move (comp)); m.showMenuAsync (PopupMenu::Options().withTargetComponent (missingItemsButton.get())); } }