diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp index 7e7af1da47..7e888ea9d2 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp @@ -1288,6 +1288,7 @@ PopupMenu::Options LookAndFeel_V2::getOptionsForComboBoxPopupMenu (ComboBox& box { return PopupMenu::Options().withTargetComponent (&box) .withItemThatMustBeVisible (box.getSelectedId()) + .withInitiallySelectedItem (box.getSelectedId()) .withMinimumWidth (box.getWidth()) .withMaximumNumColumns (1) .withStandardItemHeight (label.getHeight()); diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp index c0b50ae13f..3ef7f4ab14 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp @@ -252,12 +252,19 @@ struct MenuWindow : public Component setOpaque (lf.findColour (PopupMenu::backgroundColourId).isOpaque() || ! Desktop::canUseSemiTransparentWindows()); + const auto initialSelectedId = options.getInitiallySelectedItemId(); + for (int i = 0; i < menu.items.size(); ++i) { auto& item = menu.items.getReference (i); if (i + 1 < menu.items.size() || ! item.isSeparator) - items.add (new ItemComponent (item, options, *this)); + { + auto* child = items.add (new ItemComponent (item, options, *this)); + + if (initialSelectedId != 0 && item.itemID == initialSelectedId) + setCurrentlyHighlightedChild (child); + } } auto targetArea = options.getTargetScreenArea() / scaleFactor; @@ -1239,7 +1246,7 @@ private: { if (globalMousePos != lastMousePos || timeNow > lastMouseMoveTime + 350) { - const bool isMouseOver = window.reallyContains (localMousePos, true); + const auto isMouseOver = window.reallyContains (localMousePos, true); if (isMouseOver) window.hasBeenOver = true; @@ -1279,7 +1286,12 @@ private: window.activeSubMenu->hide (nullptr, true); if (! isMouseOver) + { + if (! window.hasBeenOver) + return; + itemUnderMouse = nullptr; + } window.setCurrentlyHighlightedChild (itemUnderMouse); } @@ -1820,6 +1832,11 @@ PopupMenu::Options PopupMenu::Options::withPreferredPopupDirection (PopupDirecti return with (*this, &Options::preferredPopupDirection, direction); } +PopupMenu::Options PopupMenu::Options::withInitiallySelectedItem (int idOfItemToBeSelected) const +{ + return with (*this, &Options::initiallySelectedItemId, idOfItemToBeSelected); +} + Component* PopupMenu::createWindow (const Options& options, ApplicationCommandManager** managerOfChosenCommand) const { diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.h b/modules/juce_gui_basics/menus/juce_PopupMenu.h index 495c62c3c2..56db43b962 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.h +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.h @@ -470,6 +470,7 @@ public: Options withItemThatMustBeVisible (int idOfItemToBeVisible) const; Options withParentComponent (Component* parentComponent) const; Options withPreferredPopupDirection (PopupDirection direction) const; + Options withInitiallySelectedItem (int idOfItemToBeSelected) const; //============================================================================== Component* getParentComponent() const noexcept { return parentComponent; } @@ -482,6 +483,7 @@ public: int getStandardItemHeight() const noexcept { return standardHeight; } int getItemThatMustBeVisible() const noexcept { return visibleItemID; } PopupDirection getPreferredPopupDirection() const noexcept { return preferredPopupDirection; } + int getInitiallySelectedItemId() const noexcept { return initiallySelectedItemId; } private: //============================================================================== @@ -489,7 +491,7 @@ public: Component* targetComponent = nullptr; Component* parentComponent = nullptr; WeakReference componentToWatchForDeletion; - int visibleItemID = 0, minWidth = 0, minColumns = 1, maxColumns = 0, standardHeight = 0; + int visibleItemID = 0, minWidth = 0, minColumns = 1, maxColumns = 0, standardHeight = 0, initiallySelectedItemId = 0; bool isWatchingForDeletion = false; PopupDirection preferredPopupDirection = PopupDirection::downwards; };