LMMS
Loading...
Searching...
No Matches
juce_PopupMenu.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
29//==============================================================================
80{
81public:
82 //==============================================================================
84 PopupMenu() = default;
85
87 PopupMenu (const PopupMenu&);
88
91
93 PopupMenu& operator= (const PopupMenu&);
94
97
99 PopupMenu& operator= (PopupMenu&&) noexcept;
100
101 //==============================================================================
102 class CustomComponent;
103 class CustomCallback;
104
105 //==============================================================================
107 void clear();
108
111 {
117
122 Item (String text);
123
124 Item (const Item&);
125 Item& operator= (const Item&);
127 Item& operator= (Item&&);
128
131
137 int itemID = 0;
138
140 std::function<void()> action;
141
143 std::unique_ptr<PopupMenu> subMenu;
144
146 std::unique_ptr<Drawable> image;
147
150
153
156
164
169
171 bool isEnabled = true;
172
174 bool isTicked = false;
175
177 bool isSeparator = false;
178
180 bool isSectionHeader = false;
181
183 bool shouldBreakAfter = false;
184
186 Item& setTicked (bool shouldBeTicked = true) & noexcept;
188 Item& setEnabled (bool shouldBeEnabled) & noexcept;
190 Item& setAction (std::function<void()> action) & noexcept;
192 Item& setID (int newID) & noexcept;
194 Item& setColour (Colour) & noexcept;
198 Item& setImage (std::unique_ptr<Drawable>) & noexcept;
199
201 Item&& setTicked (bool shouldBeTicked = true) && noexcept;
203 Item&& setEnabled (bool shouldBeEnabled) && noexcept;
205 Item&& setAction (std::function<void()> action) && noexcept;
207 Item&& setID (int newID) && noexcept;
209 Item&& setColour (Colour) && noexcept;
213 Item&& setImage (std::unique_ptr<Drawable>) && noexcept;
214 };
215
220 void addItem (Item newItem);
221
223 void addItem (String itemText,
224 std::function<void()> action);
225
227 void addItem (String itemText,
228 bool isEnabled,
229 bool isTicked,
230 std::function<void()> action);
231
244 void addItem (int itemResultID,
245 String itemText,
246 bool isEnabled = true,
247 bool isTicked = false);
248
262 void addItem (int itemResultID,
263 String itemText,
264 bool isEnabled,
265 bool isTicked,
266 const Image& iconToUse);
267
282 void addItem (int itemResultID,
283 String itemText,
284 bool isEnabled,
285 bool isTicked,
286 std::unique_ptr<Drawable> iconToUse);
287
299 void addCommandItem (ApplicationCommandManager* commandManager,
300 CommandID commandID,
301 String displayName = {},
302 std::unique_ptr<Drawable> iconToUse = {});
303
310 void addColouredItem (int itemResultID,
311 String itemText,
312 Colour itemTextColour,
313 bool isEnabled = true,
314 bool isTicked = false,
315 const Image& iconToUse = {});
316
323 void addColouredItem (int itemResultID,
324 String itemText,
325 Colour itemTextColour,
326 bool isEnabled,
327 bool isTicked,
328 std::unique_ptr<Drawable> iconToUse);
329
341 void addCustomItem (int itemResultID,
342 std::unique_ptr<CustomComponent> customComponent,
343 std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr,
344 const String& itemTitle = {});
345
362 void addCustomItem (int itemResultID,
363 Component& customComponent,
364 int idealWidth,
365 int idealHeight,
366 bool triggerMenuItemAutomaticallyWhenClicked,
367 std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr,
368 const String& itemTitle = {});
369
376 void addSubMenu (String subMenuName,
377 PopupMenu subMenu,
378 bool isEnabled = true);
379
386 void addSubMenu (String subMenuName,
387 PopupMenu subMenu,
388 bool isEnabled,
389 const Image& iconToUse,
390 bool isTicked = false,
391 int itemResultID = 0);
392
403 void addSubMenu (String subMenuName,
404 PopupMenu subMenu,
405 bool isEnabled,
406 std::unique_ptr<Drawable> iconToUse,
407 bool isTicked = false,
408 int itemResultID = 0);
409
416 void addSeparator();
417
422 void addSectionHeader (String title);
423
431 void addColumnBreak();
432
436 int getNumItems() const noexcept;
437
439 bool containsCommandItem (int commandID) const;
440
442 bool containsAnyActiveItems() const noexcept;
443
444 //==============================================================================
457 {
458 public:
460 Options();
461
462 Options (const Options&) = default;
463 Options& operator= (const Options&) = default;
464
465 enum class PopupDirection
466 {
467 upwards,
468 downwards
469 };
470
471 //==============================================================================
486 JUCE_NODISCARD Options withTargetComponent (Component* targetComponent) const;
487 JUCE_NODISCARD Options withTargetComponent (Component& targetComponent) const;
488
503 JUCE_NODISCARD Options withTargetScreenArea (Rectangle<int> targetArea) const;
504
511 JUCE_NODISCARD Options withMousePosition() const;
512
520 JUCE_NODISCARD Options withDeletionCheck (Component& componentToWatchForDeletion) const;
521
523 JUCE_NODISCARD Options withMinimumWidth (int minWidth) const;
524
526 JUCE_NODISCARD Options withMinimumNumColumns (int minNumColumns) const;
527
529 JUCE_NODISCARD Options withMaximumNumColumns (int maxNumColumns) const;
530
532 JUCE_NODISCARD Options withStandardItemHeight (int standardHeight) const;
533
539 JUCE_NODISCARD Options withItemThatMustBeVisible (int idOfItemToBeVisible) const;
540
550 JUCE_NODISCARD Options withParentComponent (Component* parentComponent) const;
551
553 JUCE_NODISCARD Options withPreferredPopupDirection (PopupDirection direction) const;
554
563 JUCE_NODISCARD Options withInitiallySelectedItem (int idOfItemToBeSelected) const;
564
565 //==============================================================================
571
577
583
589
595
601
607
613
619
625
631
632 private:
633 //==============================================================================
639 };
640
641 //==============================================================================
642 #if JUCE_MODAL_LOOPS_PERMITTED
676 int show (int itemIDThatMustBeVisible = 0,
677 int minimumWidth = 0,
678 int maximumNumColumns = 0,
679 int standardItemHeight = 0,
681
682
696 int showAt (Rectangle<int> screenAreaToAttachTo,
697 int itemIDThatMustBeVisible = 0,
698 int minimumWidth = 0,
699 int maximumNumColumns = 0,
700 int standardItemHeight = 0,
702
709 int showAt (Component* componentToAttachTo,
710 int itemIDThatMustBeVisible = 0,
711 int minimumWidth = 0,
712 int maximumNumColumns = 0,
713 int standardItemHeight = 0,
715
718 int showMenu (const Options& options);
719 #endif
720
722 void showMenuAsync (const Options& options);
723
725 void showMenuAsync (const Options& options,
727
729 void showMenuAsync (const Options& options,
730 std::function<void (int)> callback);
731
732 //==============================================================================
740
741
742 //==============================================================================
748 void setLookAndFeel (LookAndFeel* newLookAndFeel);
749
750 //==============================================================================
759 {
760 backgroundColourId = 0x1000700,
761 textColourId = 0x1000600,
763 headerTextColourId = 0x1000601,
769 };
770
771 //==============================================================================
782 {
783 public:
784 //==============================================================================
796 MenuItemIterator (const PopupMenu& menu, bool searchRecursively = false);
797
800
804 bool next();
805
809 Item& getItem() const;
810
811 private:
812 //==============================================================================
814
818
821 };
822
823 //==============================================================================
829 {
830 public:
833
847
853 virtual void getIdealSize (int& idealWidth, int& idealHeight) = 0;
854
860 void triggerMenuItem();
861
867
874
878 void setHighlighted (bool shouldBeHighlighted);
879
880 private:
881 //==============================================================================
883 const PopupMenu::Item* item = nullptr;
884
885 friend PopupMenu;
886
888 };
889
890 //==============================================================================
895 {
896 public:
898 ~CustomCallback() override;
899
904 virtual bool menuItemTriggered() = 0;
905
906 private:
908 };
909
910 //==============================================================================
915 {
916 virtual ~LookAndFeelMethods() = default;
917
919 virtual void drawPopupMenuBackground (Graphics&, int width, int height);
920
923 int width,
924 int height,
925 const Options&) = 0;
926
928 virtual void drawPopupMenuItem (Graphics&, const Rectangle<int>& area,
929 bool isSeparator, bool isActive, bool isHighlighted,
930 bool isTicked, bool hasSubMenu,
931 const String& text,
932 const String& shortcutKeyText,
933 const Drawable* icon,
934 const Colour* textColour);
935
938 bool isHighlighted,
939 const Item& item,
940 const Options&) = 0;
941
943 const String&);
944
946 const String& sectionName,
947 const Options&) = 0;
948
950 virtual Font getPopupMenuFont() = 0;
951
952 virtual void drawPopupMenuUpDownArrow (Graphics&,
953 int width, int height,
954 bool isScrollUpArrow);
955
957 int width, int height,
958 bool isScrollUpArrow,
959 const Options&) = 0;
960
962 virtual void getIdealPopupMenuItemSize (const String& text,
963 bool isSeparator,
964 int standardMenuItemHeight,
965 int& idealWidth,
966 int& idealHeight);
967
970 bool isSeparator,
971 int standardMenuItemHeight,
972 int& idealWidth,
973 int& idealHeight,
974 const Options&) = 0;
975
976 virtual int getMenuWindowFlags() = 0;
977
978 virtual void drawMenuBarBackground (Graphics&, int width, int height,
979 bool isMouseOverBar,
980 MenuBarComponent&) = 0;
981
982 virtual int getDefaultMenuBarHeight() = 0;
983
984 virtual int getMenuBarItemWidth (MenuBarComponent&, int itemIndex, const String& itemText) = 0;
985
986 virtual Font getMenuBarFont (MenuBarComponent&, int itemIndex, const String& itemText) = 0;
987
988 virtual void drawMenuBarItem (Graphics&, int width, int height,
989 int itemIndex,
990 const String& itemText,
991 bool isMouseOverItem,
992 bool isMenuOpen,
993 bool isMouseOverBar,
994 MenuBarComponent&) = 0;
995
997
998 virtual void preparePopupMenuWindow (Component& newWindow) = 0;
999
1003 virtual bool shouldPopupMenuScaleWithTargetComponent (const Options& options) = 0;
1004
1005 virtual int getPopupMenuBorderSize();
1006
1008
1015 const Rectangle<int>& bounds,
1016 const Options&) = 0;
1017
1020 };
1021
1022 //==============================================================================
1023 #ifndef DOXYGEN
1024 [[deprecated ("Use the new method.")]]
1025 int drawPopupMenuItem (Graphics&, int, int, bool, bool, bool, bool, bool, const String&, const String&, Image*, const Colour*) { return 0; }
1026 #endif
1027
1028private:
1029 //==============================================================================
1030 JUCE_PUBLIC_IN_DLL_BUILD (struct HelperClasses)
1031 class Window;
1032 friend struct HelperClasses;
1033 friend class MenuBarComponent;
1034
1037
1040
1041 static void setItem (CustomComponent&, const Item*);
1042
1044};
1045
1046} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
Definition String.h:48
Definition juce_ApplicationCommandManager.h:88
Definition juce_Array.h:56
Definition juce_Colour.h:38
Definition juce_Component.h:36
Component() noexcept
Definition juce_Component.cpp:517
Definition juce_Drawable.h:38
Definition juce_Font.h:42
Definition juce_GraphicsContext.h:45
Definition juce_Image.h:58
Definition juce_LookAndFeel.h:108
Definition juce_ModalComponentManager.h:56
Definition juce_PopupMenu.h:895
CustomCallback()
Definition juce_PopupMenu.cpp:2306
virtual bool menuItemTriggered()=0
Definition juce_PopupMenu.h:829
friend PopupMenu
Definition juce_PopupMenu.h:885
virtual void getIdealSize(int &idealWidth, int &idealHeight)=0
bool triggeredAutomatically
Definition juce_PopupMenu.h:882
void triggerMenuItem()
Definition juce_PopupMenu.cpp:2283
bool isItemHighlighted() const noexcept
Definition juce_PopupMenu.h:866
CustomComponent()
Definition juce_PopupMenu.cpp:2270
const PopupMenu::Item * item
Definition juce_PopupMenu.h:883
const PopupMenu::Item * getItem() const noexcept
Definition juce_PopupMenu.h:873
bool isHighlighted
Definition juce_PopupMenu.h:882
bool isTriggeredAutomatically() const noexcept
Definition juce_PopupMenu.h:876
Array< const PopupMenu * > menus
Definition juce_PopupMenu.h:816
bool next()
Definition juce_PopupMenu.cpp:2318
Item & getItem() const
Definition juce_PopupMenu.cpp:2347
PopupMenu::Item * currentItem
Definition juce_PopupMenu.h:817
MenuItemIterator(const PopupMenu &menu, bool searchRecursively=false)
Definition juce_PopupMenu.cpp:2310
Array< int > index
Definition juce_PopupMenu.h:815
bool searchRecursively
Definition juce_PopupMenu.h:813
Definition juce_PopupMenu.h:457
int getInitiallySelectedItemId() const noexcept
Definition juce_PopupMenu.h:630
bool hasWatchedComponentBeenDeleted() const noexcept
Definition juce_PopupMenu.h:582
PopupDirection getPreferredPopupDirection() const noexcept
Definition juce_PopupMenu.h:624
int getMaximumNumColumns() const noexcept
Definition juce_PopupMenu.h:600
Component * getParentComponent() const noexcept
Definition juce_PopupMenu.h:570
int standardHeight
Definition juce_PopupMenu.h:636
int getMinimumNumColumns() const noexcept
Definition juce_PopupMenu.h:606
WeakReference< Component > targetComponent
Definition juce_PopupMenu.h:635
Rectangle< int > getTargetScreenArea() const noexcept
Definition juce_PopupMenu.h:588
int initiallySelectedItemId
Definition juce_PopupMenu.h:636
int minColumns
Definition juce_PopupMenu.h:636
bool isWatchingForDeletion
Definition juce_PopupMenu.h:637
int getMinimumWidth() const noexcept
Definition juce_PopupMenu.h:594
WeakReference< Component > componentToWatchForDeletion
Definition juce_PopupMenu.h:635
Options(const Options &)=default
Rectangle< int > targetArea
Definition juce_PopupMenu.h:634
int getStandardItemHeight() const noexcept
Definition juce_PopupMenu.h:612
int getItemThatMustBeVisible() const noexcept
Definition juce_PopupMenu.h:618
int minWidth
Definition juce_PopupMenu.h:636
Options()
Definition juce_PopupMenu.cpp:1945
WeakReference< Component > parentComponent
Definition juce_PopupMenu.h:635
PopupDirection preferredPopupDirection
Definition juce_PopupMenu.h:638
int maxColumns
Definition juce_PopupMenu.h:636
PopupDirection
Definition juce_PopupMenu.h:466
@ downwards
Definition juce_PopupMenu.h:468
int visibleItemID
Definition juce_PopupMenu.h:636
Component * getTargetComponent() const noexcept
Definition juce_PopupMenu.h:576
friend class MenuBarComponent
Definition juce_PopupMenu.h:1033
Array< Item > items
Definition juce_PopupMenu.h:1035
int drawPopupMenuItem(Graphics &, int, int, bool, bool, bool, bool, bool, const String &, const String &, Image *, const Colour *)
Definition juce_PopupMenu.h:1025
void showMenuAsync(const Options &options)
Definition juce_PopupMenu.cpp:2139
void setLookAndFeel(LookAndFeel *newLookAndFeel)
Definition juce_PopupMenu.cpp:2258
ColourIds
Definition juce_PopupMenu.h:759
@ headerTextColourId
Definition juce_PopupMenu.h:763
@ highlightedTextColourId
Definition juce_PopupMenu.h:767
@ backgroundColourId
Definition juce_PopupMenu.h:760
@ highlightedBackgroundColourId
Definition juce_PopupMenu.h:765
@ textColourId
Definition juce_PopupMenu.h:761
PopupMenu()=default
void clear()
Definition juce_PopupMenu.cpp:1619
static void setItem(CustomComponent &, const Item *)
Definition juce_PopupMenu.cpp:2263
int showWithOptionalCallback(const Options &, ModalComponentManager::Callback *, bool)
Definition juce_PopupMenu.cpp:2099
void addCommandItem(ApplicationCommandManager *commandManager, CommandID commandID, String displayName={}, std::unique_ptr< Drawable > iconToUse={})
Definition juce_PopupMenu.cpp:1815
void addItem(Item newItem)
Definition juce_PopupMenu.cpp:1753
static bool JUCE_CALLTYPE dismissAllActiveMenus()
Definition juce_PopupMenu.cpp:2201
Component * createWindow(const Options &, ApplicationCommandManager **) const
Definition juce_PopupMenu.cpp:2029
WeakReference< LookAndFeel > lookAndFeel
Definition juce_PopupMenu.h:1036
Definition juce_Rectangle.h:67
Definition juce_ReferenceCountedObject.h:247
Definition juce_String.h:53
Definition juce_WeakReference.h:78
int g
Definition inflate.c:1573
static const char * title
Definition pugl.h:1747
static int int height
Definition pugl.h:1594
static int width
Definition pugl.h:1593
#define JUCE_NODISCARD
Definition juce_CompilerSupport.h:108
#define JUCE_LEAK_DETECTOR(OwnerClass)
Definition juce_LeakedObjectDetector.h:138
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
#define JUCE_CALLTYPE
#define JUCE_API
Definition juce_StandardHeader.h:152
#define JUCE_PUBLIC_IN_DLL_BUILD(declaration)
Definition juce_StandardHeader.h:158
Definition carla_juce.cpp:31
int CommandID
Definition juce_ApplicationCommandID.h:37
@ showMenu
Definition juce_AccessibilityActions.h:61
Definition juce_PopupMenu.cpp:39
Definition juce_PopupMenu.h:111
ApplicationCommandManager * commandManager
Definition juce_PopupMenu.h:155
bool isTicked
Definition juce_PopupMenu.h:174
bool isSectionHeader
Definition juce_PopupMenu.h:180
bool shouldBreakAfter
Definition juce_PopupMenu.h:183
ReferenceCountedObjectPtr< CustomCallback > customCallback
Definition juce_PopupMenu.h:152
Item & setImage(std::unique_ptr< Drawable >) &noexcept
Definition juce_PopupMenu.cpp:1705
Item & setTicked(bool shouldBeTicked=true) &noexcept
Definition juce_PopupMenu.cpp:1669
std::unique_ptr< Drawable > image
Definition juce_PopupMenu.h:146
String text
Definition juce_PopupMenu.h:130
std::unique_ptr< PopupMenu > subMenu
Definition juce_PopupMenu.h:143
int itemID
Definition juce_PopupMenu.h:137
ReferenceCountedObjectPtr< CustomComponent > customComponent
Definition juce_PopupMenu.h:149
bool isEnabled
Definition juce_PopupMenu.h:171
std::function< void()> action
Definition juce_PopupMenu.h:140
Item & setCustomComponent(ReferenceCountedObjectPtr< CustomComponent > customComponent) &noexcept
Definition juce_PopupMenu.cpp:1699
Item & setEnabled(bool shouldBeEnabled) &noexcept
Definition juce_PopupMenu.cpp:1675
bool isSeparator
Definition juce_PopupMenu.h:177
String shortcutKeyDescription
Definition juce_PopupMenu.h:163
Item & setAction(std::function< void()> action) &noexcept
Definition juce_PopupMenu.cpp:1681
Colour colour
Definition juce_PopupMenu.h:168
Item & setID(int newID) &noexcept
Definition juce_PopupMenu.cpp:1687
Item & setColour(Colour) &noexcept
Definition juce_PopupMenu.cpp:1693
Definition juce_PopupMenu.h:915
virtual void drawMenuBarItem(Graphics &, int width, int height, int itemIndex, const String &itemText, bool isMouseOverItem, bool isMenuOpen, bool isMouseOverBar, MenuBarComponent &)=0
virtual void drawPopupMenuUpDownArrow(Graphics &, int width, int height, bool isScrollUpArrow)
Definition juce_PopupMenu.cpp:2366
virtual int getPopupMenuColumnSeparatorWidthWithOptions(const Options &)=0
virtual void getIdealPopupMenuItemSizeWithOptions(const String &text, bool isSeparator, int standardMenuItemHeight, int &idealWidth, int &idealHeight, const Options &)=0
virtual void drawPopupMenuItemWithOptions(Graphics &, const Rectangle< int > &area, bool isHighlighted, const Item &item, const Options &)=0
virtual void drawPopupMenuSectionHeaderWithOptions(Graphics &, const Rectangle< int > &area, const String &sectionName, const Options &)=0
virtual void drawPopupMenuBackgroundWithOptions(Graphics &, int width, int height, const Options &)=0
virtual void preparePopupMenuWindow(Component &newWindow)=0
virtual void drawPopupMenuColumnSeparatorWithOptions(Graphics &g, const Rectangle< int > &bounds, const Options &)=0
virtual int getPopupMenuBorderSize()
Definition juce_PopupMenu.cpp:2370
virtual int getMenuBarItemWidth(MenuBarComponent &, int itemIndex, const String &itemText)=0
virtual bool shouldPopupMenuScaleWithTargetComponent(const Options &options)=0
virtual void drawPopupMenuUpDownArrowWithOptions(Graphics &, int width, int height, bool isScrollUpArrow, const Options &)=0
virtual void drawPopupMenuSectionHeader(Graphics &, const Rectangle< int > &, const String &)
Definition juce_PopupMenu.cpp:2363
virtual void drawMenuBarBackground(Graphics &, int width, int height, bool isMouseOverBar, MenuBarComponent &)=0
virtual void getIdealPopupMenuItemSize(const String &text, bool isSeparator, int standardMenuItemHeight, int &idealWidth, int &idealHeight)
Definition juce_PopupMenu.cpp:2368
virtual void drawPopupMenuBackground(Graphics &, int width, int height)
Definition juce_PopupMenu.cpp:2353
virtual void drawPopupMenuItem(Graphics &, const Rectangle< int > &area, bool isSeparator, bool isActive, bool isHighlighted, bool isTicked, bool hasSubMenu, const String &text, const String &shortcutKeyText, const Drawable *icon, const Colour *textColour)
Definition juce_PopupMenu.cpp:2355
virtual int getPopupMenuBorderSizeWithOptions(const Options &)=0
virtual Font getMenuBarFont(MenuBarComponent &, int itemIndex, const String &itemText)=0
virtual Component * getParentComponentForMenuOptions(const Options &options)=0
const char * text
Definition swell-functions.h:167
RECT const char void(* callback)(const char *droppath))) SWELL_API_DEFINE(BOOL
Definition swell-functions.h:1004
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137