From 635e070cbafd0b3201ff1ed0606ef41b55119e75 Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 27 Sep 2019 10:56:13 +0100 Subject: [PATCH] Added method PopupMenu::CustomComponent::getItem() to give them access to item details --- modules/juce_gui_basics/menus/juce_PopupMenu.cpp | 12 ++++++++++++ modules/juce_gui_basics/menus/juce_PopupMenu.h | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp index bc2d63d397..cbd79a66a7 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp @@ -80,7 +80,10 @@ struct ItemComponent : public Component customComp = *new HeaderItemComponent (item.text); if (customComp != nullptr) + { + setItem (*customComp, &item); addAndMakeVisible (*customComp); + } parent.addAndMakeVisible (this); @@ -96,6 +99,9 @@ struct ItemComponent : public Component ~ItemComponent() override { + if (customComp != nullptr) + setItem (*customComp, nullptr); + removeChildComponent (customComp.get()); } @@ -1893,6 +1899,12 @@ void PopupMenu::setLookAndFeel (LookAndFeel* const newLookAndFeel) lookAndFeel = newLookAndFeel; } +void PopupMenu::setItem (CustomComponent& c, const Item* itemToUse) +{ + c.item = itemToUse; + c.repaint(); +} + //============================================================================== PopupMenu::CustomComponent::CustomComponent (bool autoTrigger) : triggeredAutomatically (autoTrigger) diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.h b/modules/juce_gui_basics/menus/juce_PopupMenu.h index 6da361ab2a..95c6661f4d 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.h +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.h @@ -699,6 +699,13 @@ public: */ bool isItemHighlighted() const noexcept { return isHighlighted; } + /** Returns a pointer to the Item that holds this custom component, if this + component is currently held by an Item. + You can query the Item for information that you might want to use + in your paint() method, such as the item's enabled and ticked states. + */ + const PopupMenu::Item* getItem() const noexcept { return item; } + /** @internal */ bool isTriggeredAutomatically() const noexcept { return triggeredAutomatically; } /** @internal */ @@ -707,6 +714,9 @@ public: private: //============================================================================== bool isHighlighted = false, triggeredAutomatically; + const PopupMenu::Item* item = nullptr; + + friend PopupMenu; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CustomComponent) }; @@ -812,6 +822,8 @@ private: Component* createWindow (const Options&, ApplicationCommandManager**) const; int showWithOptionalCallback (const Options&, ModalComponentManager::Callback*, bool); + static void setItem (CustomComponent&, const Item*); + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE // These methods have new implementations now - see its new definition int drawPopupMenuItem (Graphics&, int, int, bool, bool, bool, bool, bool, const String&, const String&, Image*, const Colour*) { return 0; }