/******************************************************************************* The block below describes the properties of this PIP. A PIP is a short snippet of code that can be read by the Projucer and used to generate a JUCE project. BEGIN_JUCE_PIP_METADATA name: CustomMenuItemTest dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics exporters: xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 type: Component mainClass: MyComponent END_JUCE_PIP_METADATA *******************************************************************************/ #pragma once //============================================================================== class MyComponent : public Component { public: //============================================================================== MyComponent() { setSize(600, 400); status.setJustificationType(Justification::centred); status.setColour(Label::textColourId, Colours::black); status.setInterceptsMouseClicks(false, false); addAndMakeVisible(status); } ~MyComponent() { } //============================================================================== void paint(Graphics& g) override { // (Our component is opaque, so we must completely fill the background with a solid colour) g.fillAll(Colours::whitesmoke); } void resized() override { status.centreWithSize(getWidth(), 400); } void mouseUp(const MouseEvent& event) override { if (!event.mouseWasClicked()) return; class CustomItem : public PopupMenu::CustomComponent { public: CustomItem(Colour colour) : colour(colour) {} void getIdealSize(int& idealWidth, int& idealHeight) override { idealWidth = 100; idealHeight = 20; } void paint(Graphics& g) override { g.fillAll(colour); } private: const Colour colour; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CustomItem) }; PopupMenu menu; int itemID = 1; menu.addCustomItem(itemID++, new CustomItem(Colours::red)); menu.addCustomItem(itemID++, new CustomItem(Colours::green)); menu.addCustomItem(itemID++, new CustomItem(Colours::blue)); // If you use non-custom menu items, they work: // menu.addItem(itemID++, "First"); // menu.addItem(itemID++, "Second"); // menu.addItem(itemID++, "Third"); // If you leave out the withParentComponent(), it works: const auto options = PopupMenu::Options() .withParentComponent(this); menu.showMenuAsync(options, [weakThis = WeakReference(this)](int result) { if (!weakThis) return; static_cast(*weakThis).status.setText("Result: " + String(result), sendNotificationSync); }); } private: //============================================================================== // Your private member variables go here... Label status{ "", "Click to open menu" }; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MyComponent) };