LMMS
Loading...
Searching...
No Matches
juce_BurgerMenuComponent.cpp
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//==============================================================================
31{
33 {
34 setInterceptsMouseClicks (false, true);
35 update (customComponent);
36 }
37
39 {
40 jassert (newComponent != nullptr);
41
42 if (newComponent != custom)
43 {
44 if (custom != nullptr)
46
47 custom = newComponent;
49 resized();
50 }
51 }
52
53 void resized() override
54 {
55 custom->setBounds (getLocalBounds());
56 }
57
59
61};
62
63//==============================================================================
65{
67 listBox.addMouseListener (this, true);
68
69 setModel (modelToUse);
71}
72
74{
75 if (model != nullptr)
76 model->removeListener (this);
77}
78
80{
81 if (newModel != model)
82 {
83 if (model != nullptr)
84 model->removeListener (this);
85
86 model = newModel;
87
88 if (model != nullptr)
89 model->addListener (this);
90
91 refresh();
92 listBox.updateContent();
93 }
94}
95
100
102{
104
105 rows.clear();
106
107 if (model != nullptr)
108 {
109 auto menuBarNames = model->getMenuBarNames();
110
111 for (auto menuIdx = 0; menuIdx < menuBarNames.size(); ++menuIdx)
112 {
114 menuItem.text = menuBarNames[menuIdx];
115
117 auto menu = model->getMenuForIndex (menuIdx, ignore);
118
119 rows.add (Row { true, menuIdx, menuItem });
120 addMenuBarItemsForMenu (menu, menuIdx);
121 }
122 }
123}
124
126{
127 for (PopupMenu::MenuItemIterator it (menu); it.next();)
128 {
129 auto& item = it.getItem();
130
131 if (item.isSeparator)
132 continue;
133
134 if (hasSubMenu (item))
135 addMenuBarItemsForMenu (*item.subMenu, menuIdx);
136 else
137 rows.add (Row {false, menuIdx, it.getItem()});
138 }
139}
140
142{
143 return rows.size();
144}
145
147{
148 getLookAndFeel().drawPopupMenuBackground (g, getWidth(), getHeight());
149}
150
151void BurgerMenuComponent::paintListBoxItem (int rowIndex, Graphics& g, int w, int h, bool highlight)
152{
153 auto& lf = getLookAndFeel();
154 Rectangle<int> r (w, h);
155
156 auto row = (rowIndex < rows.size() ? rows.getReference (rowIndex)
157 : Row { true, 0, {} });
158
159 g.fillAll (findColour (PopupMenu::backgroundColourId));
160
161 if (row.isMenuHeader)
162 {
163 lf.drawPopupMenuSectionHeader (g, r.reduced (20, 0), row.item.text);
164 g.setColour (Colours::grey);
165 g.fillRect (r.withHeight (1));
166 }
167 else
168 {
169 auto& item = row.item;
170 auto* colour = item.colour != Colour() ? &item.colour : nullptr;
171
172 if (item.customComponent == nullptr)
173 lf.drawPopupMenuItem (g, r.reduced (20, 0),
174 item.isSeparator,
175 item.isEnabled,
176 highlight,
177 item.isTicked,
178 hasSubMenu (item),
179 item.text,
180 item.shortcutKeyDescription,
181 item.image.get(),
182 colour);
183 }
184}
185
187{
188 return item.subMenu != nullptr && (item.itemID == 0 || item.subMenu->getNumItems() > 0);
189}
190
192{
193 auto row = rowIndex < rows.size() ? rows.getReference (rowIndex)
194 : Row { true, 0, {} };
195
196 if (! row.isMenuHeader)
197 {
198 lastRowClicked = rowIndex;
199 inputSourceIndexOfLastClick = e.source.getIndex();
200 }
201}
202
204{
205 auto row = rowIndex < rows.size() ? rows.getReference (rowIndex)
206 : Row { true, 0, {} };
207
208 auto hasCustomComponent = (row.item.customComponent != nullptr);
209
210 if (existing == nullptr && hasCustomComponent)
211 return new CustomMenuBarItemHolder (row.item.customComponent);
212
213 if (existing != nullptr)
214 {
215 auto* componentToUpdate = dynamic_cast<CustomMenuBarItemHolder*> (existing);
216 jassert (componentToUpdate != nullptr);
217
218 if (hasCustomComponent && componentToUpdate != nullptr)
219 {
220 row.item.customComponent->setHighlighted (isRowSelected);
221 componentToUpdate->update (row.item.customComponent);
222 }
223 else
224 {
225 delete existing;
226 existing = nullptr;
227 }
228 }
229
230 return existing;
231}
232
234{
235 listBox.setBounds (getLocalBounds());
236}
237
239{
240 setModel (menuBarModel);
241}
242
246
248{
249 auto rowIndex = listBox.getSelectedRow();
250
251 if (rowIndex == lastRowClicked && rowIndex < rows.size()
253 {
254 auto& row = rows.getReference (rowIndex);
255
256 if (! row.isMenuHeader)
257 {
258 listBox.selectRow (-1);
259
260 lastRowClicked = -1;
262
263 topLevelIndexClicked = row.topLevelMenuIndex;
264 auto& item = row.item;
265
266 if (auto* managerOfChosenCommand = item.commandManager)
267 {
270
271 managerOfChosenCommand->invoke (info, true);
272 }
273
274 postCommandMessage (item.itemID);
275 }
276 }
277}
278
280{
281 if (model != nullptr)
282 {
283 model->menuItemSelected (commandID, topLevelIndexClicked);
285
286 refresh();
287 listBox.updateContent();
288 }
289}
290
292{
293 listBox.setRowHeight (roundToInt (getLookAndFeel().getPopupMenuFont().getHeight() * 2.0f));
294}
295
296//==============================================================================
297std::unique_ptr<AccessibilityHandler> BurgerMenuComponent::createAccessibilityHandler()
298{
299 return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::menuBar);
300}
301
302} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
void menuCommandInvoked(MenuBarModel *, const ApplicationCommandTarget::InvocationInfo &) override
Definition juce_BurgerMenuComponent.cpp:243
void resized() override
Definition juce_BurgerMenuComponent.cpp:233
void menuBarItemsChanged(MenuBarModel *) override
Definition juce_BurgerMenuComponent.cpp:238
int getNumRows() override
Definition juce_BurgerMenuComponent.cpp:141
void lookAndFeelChanged() override
Definition juce_BurgerMenuComponent.cpp:291
int inputSourceIndexOfLastClick
Definition juce_BurgerMenuComponent.h:104
void paint(Graphics &) override
Definition juce_BurgerMenuComponent.cpp:146
Component * refreshComponentForRow(int, bool, Component *) override
Definition juce_BurgerMenuComponent.cpp:203
MenuBarModel * model
Definition juce_BurgerMenuComponent.h:100
ListBox listBox
Definition juce_BurgerMenuComponent.h:101
Array< Row > rows
Definition juce_BurgerMenuComponent.h:102
void setModel(MenuBarModel *newModel)
Definition juce_BurgerMenuComponent.cpp:79
static bool hasSubMenu(const PopupMenu::Item &)
Definition juce_BurgerMenuComponent.cpp:186
BurgerMenuComponent(MenuBarModel *model=nullptr)
Definition juce_BurgerMenuComponent.cpp:64
void handleCommandMessage(int) override
Definition juce_BurgerMenuComponent.cpp:279
MenuBarModel * getModel() const noexcept
Definition juce_BurgerMenuComponent.cpp:96
int lastRowClicked
Definition juce_BurgerMenuComponent.h:104
void addMenuBarItemsForMenu(PopupMenu &, int)
Definition juce_BurgerMenuComponent.cpp:125
void mouseUp(const MouseEvent &) override
Definition juce_BurgerMenuComponent.cpp:247
void refresh()
Definition juce_BurgerMenuComponent.cpp:101
void listBoxItemClicked(int, const MouseEvent &) override
Definition juce_BurgerMenuComponent.cpp:191
void paintListBoxItem(int, Graphics &, int, int, bool) override
Definition juce_BurgerMenuComponent.cpp:151
std::unique_ptr< AccessibilityHandler > createAccessibilityHandler() override
Definition juce_BurgerMenuComponent.cpp:297
int topLevelIndexClicked
Definition juce_BurgerMenuComponent.h:104
~BurgerMenuComponent() override
Definition juce_BurgerMenuComponent.cpp:73
void setInterceptsMouseClicks(bool allowClicksOnThisComponent, bool allowClicksOnChildComponents) noexcept
Definition juce_Component.cpp:1420
int getHeight() const noexcept
Definition juce_Component.h:274
void addAndMakeVisible(Component *child, int zOrder=-1)
Definition juce_Component.cpp:1554
void postCommandMessage(int commandId)
Definition juce_Component.cpp:2361
Component() noexcept
Definition juce_Component.cpp:517
void removeChildComponent(Component *childToRemove)
Definition juce_Component.cpp:1569
int getWidth() const noexcept
Definition juce_Component.h:271
LookAndFeel & getLookAndFeel() const noexcept
Definition juce_Component.cpp:2173
Rectangle< int > getLocalBounds() const noexcept
Definition juce_Component.cpp:2283
Definition juce_GraphicsContext.h:45
Definition juce_MenuBarModel.h:42
Definition juce_MouseEvent.h:39
MouseInputSource source
Definition juce_MouseEvent.h:191
int getIndex() const noexcept
Definition juce_MouseInputSource.cpp:575
Definition juce_PopupMenu.h:782
bool next()
Definition juce_PopupMenu.cpp:2318
Definition juce_PopupMenu.h:80
@ backgroundColourId
Definition juce_PopupMenu.h:760
Definition juce_Rectangle.h:67
Definition juce_ReferenceCountedObject.h:247
Definition juce_String.h:53
* e
Definition inflate.c:1404
UINT_D64 w
Definition inflate.c:942
int g
Definition inflate.c:1573
static bool ignore
Definition pugl.h:1696
struct backing_store_struct * info
Definition jmemsys.h:183
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
const Colour grey
Definition juce_Colours.h:93
Definition carla_juce.cpp:31
int roundToInt(const FloatType value) noexcept
Definition juce_MathsFunctions.h:465
@ menuItem
Definition juce_AccessibilityRole.h:47
@ menuBar
Definition juce_AccessibilityRole.h:48
@ row
Definition juce_AccessibilityRole.h:53
Definition juce_ApplicationCommandTarget.h:61
@ fromMenu
Definition juce_ApplicationCommandTarget.h:80
Definition juce_BurgerMenuComponent.h:78
Definition juce_BurgerMenuComponent.cpp:31
CustomMenuBarItemHolder(const ReferenceCountedObjectPtr< PopupMenu::CustomComponent > &customComponent)
Definition juce_BurgerMenuComponent.cpp:32
ReferenceCountedObjectPtr< PopupMenu::CustomComponent > custom
Definition juce_BurgerMenuComponent.cpp:58
void update(const ReferenceCountedObjectPtr< PopupMenu::CustomComponent > &newComponent)
Definition juce_BurgerMenuComponent.cpp:38
void resized() override
Definition juce_BurgerMenuComponent.cpp:53
Definition juce_PopupMenu.h:111
std::unique_ptr< PopupMenu > subMenu
Definition juce_PopupMenu.h:143
int itemID
Definition juce_PopupMenu.h:137
int r
Definition crypt.c:458
uch h[RAND_HEAD_LEN]
Definition crypt.c:459
existing
Definition fileio.c:1978
#define const
Definition zconf.h:137