LMMS
Loading...
Searching...
No Matches
juce_TabbedButtonBar.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
34
36
37int TabBarButton::getIndex() const { return owner.indexOfTabButton (this); }
38Colour TabBarButton::getTabBackgroundColour() const { return owner.getTabBackgroundColour (getIndex()); }
39bool TabBarButton::isFrontTab() const { return getToggleState(); }
40
41void TabBarButton::paintButton (Graphics& g, const bool shouldDrawButtonAsHighlighted, const bool shouldDrawButtonAsDown)
42{
43 getLookAndFeel().drawTabButton (*this, g, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);
44}
45
47{
48 if (mods.isPopupMenu())
49 owner.popupMenuClickOnTab (getIndex(), getButtonText());
50 else
51 owner.setCurrentTabIndex (getIndex());
52}
53
54bool TabBarButton::hitTest (int mx, int my)
55{
56 auto area = getActiveArea();
57
58 if (owner.isVertical())
59 {
61 && my >= area.getY() + overlapPixels && my < area.getBottom() - overlapPixels)
62 return true;
63 }
64 else
65 {
67 && mx >= area.getX() + overlapPixels && mx < area.getRight() - overlapPixels)
68 return true;
69 }
70
71 Path p;
72 getLookAndFeel().createTabButtonShape (*this, p, false, false);
73
74 return p.contains ((float) (mx - area.getX()),
75 (float) (my - area.getY()));
76}
77
78int TabBarButton::getBestTabLength (const int depth)
79{
80 return getLookAndFeel().getTabButtonBestWidth (*this, depth);
81}
82
83void TabBarButton::calcAreas (Rectangle<int>& extraComp, Rectangle<int>& textArea) const
84{
85 auto& lf = getLookAndFeel();
86 textArea = getActiveArea();
87
88 auto depth = owner.isVertical() ? textArea.getWidth() : textArea.getHeight();
89 auto overlap = lf.getTabButtonOverlap (depth);
90
91 if (overlap > 0)
92 {
93 if (owner.isVertical())
94 textArea.reduce (0, overlap);
95 else
96 textArea.reduce (overlap, 0);
97 }
98
99 if (extraComponent != nullptr)
100 {
101 extraComp = lf.getTabButtonExtraComponentBounds (*this, textArea, *extraComponent);
102
103 auto orientation = owner.getOrientation();
104
105 if (orientation == TabbedButtonBar::TabsAtLeft || orientation == TabbedButtonBar::TabsAtRight)
106 {
107 if (extraComp.getCentreY() > textArea.getCentreY())
108 textArea.setBottom (jmin (textArea.getBottom(), extraComp.getY()));
109 else
110 textArea.setTop (jmax (textArea.getY(), extraComp.getBottom()));
111 }
112 else
113 {
114 if (extraComp.getCentreX() > textArea.getCentreX())
115 textArea.setRight (jmin (textArea.getRight(), extraComp.getX()));
116 else
117 textArea.setLeft (jmax (textArea.getX(), extraComp.getRight()));
118 }
119 }
120}
121
123{
124 Rectangle<int> extraComp, textArea;
125 calcAreas (extraComp, textArea);
126 return textArea;
127}
128
130{
131 auto r = getLocalBounds();
132 auto spaceAroundImage = getLookAndFeel().getTabButtonSpaceAroundImage();
133 auto orientation = owner.getOrientation();
134
135 if (orientation != TabbedButtonBar::TabsAtLeft) r.removeFromRight (spaceAroundImage);
136 if (orientation != TabbedButtonBar::TabsAtRight) r.removeFromLeft (spaceAroundImage);
137 if (orientation != TabbedButtonBar::TabsAtBottom) r.removeFromTop (spaceAroundImage);
138 if (orientation != TabbedButtonBar::TabsAtTop) r.removeFromBottom (spaceAroundImage);
139
140 return r;
141}
142
151
153{
154 if (c == extraComponent.get())
155 {
156 owner.resized();
157 resized();
158 }
159}
160
162{
163 if (extraComponent != nullptr)
164 {
165 Rectangle<int> extraComp, textArea;
166 calcAreas (extraComp, textArea);
167
168 if (! extraComp.isEmpty())
169 extraComponent->setBounds (extraComp);
170 }
171}
172
173//==============================================================================
175{
176public:
178 {
179 setInterceptsMouseClicks (false, false);
180 }
181
182 void paint (Graphics& g) override
183 {
184 getLookAndFeel().drawTabAreaBehindFrontButton (owner, g, getWidth(), getHeight());
185 }
186
187 void enablementChanged() override
188 {
189 repaint();
190 }
191
193
195};
196
197
198//==============================================================================
207
209{
210 tabs.clear();
211 extraTabsButton.reset();
212}
213
214//==============================================================================
216{
217 orientation = newOrientation;
218
219 for (auto* child : getChildren())
220 child->resized();
221
222 resized();
223}
224
226{
227 return new TabBarButton (name, *this);
228}
229
230void TabbedButtonBar::setMinimumTabScaleFactor (double newMinimumScale)
231{
232 minimumScale = newMinimumScale;
233 resized();
234}
235
236//==============================================================================
238{
239 tabs.clear();
240 extraTabsButton.reset();
242}
243
244void TabbedButtonBar::addTab (const String& tabName,
245 Colour tabBackgroundColour,
246 int insertIndex)
247{
248 jassert (tabName.isNotEmpty()); // you have to give them all a name..
249
250 if (tabName.isNotEmpty())
251 {
252 if (! isPositiveAndBelow (insertIndex, tabs.size()))
253 insertIndex = tabs.size();
254
255 auto* currentTab = tabs[currentTabIndex];
256
257 auto* newTab = new TabInfo();
258 newTab->name = tabName;
259 newTab->colour = tabBackgroundColour;
260 newTab->button.reset (createTabButton (tabName, insertIndex));
261 jassert (newTab->button != nullptr);
262
263 tabs.insert (insertIndex, newTab);
264 currentTabIndex = tabs.indexOf (currentTab);
265 addAndMakeVisible (newTab->button.get(), insertIndex);
266
267 resized();
268
269 if (currentTabIndex < 0)
271 }
272}
273
274void TabbedButtonBar::setTabName (int tabIndex, const String& newName)
275{
276 if (auto* tab = tabs[tabIndex])
277 {
278 if (tab->name != newName)
279 {
280 tab->name = newName;
281 tab->button->setButtonText (newName);
282 resized();
283 }
284 }
285}
286
287void TabbedButtonBar::removeTab (const int indexToRemove, const bool animate)
288{
289 if (isPositiveAndBelow (indexToRemove, tabs.size()))
290 {
291 auto oldSelectedIndex = currentTabIndex;
292
293 if (indexToRemove == currentTabIndex)
294 oldSelectedIndex = -1;
295 else if (indexToRemove < oldSelectedIndex)
296 --oldSelectedIndex;
297
298 tabs.remove (indexToRemove);
299
300 setCurrentTabIndex (oldSelectedIndex);
301 updateTabPositions (animate);
302 }
303}
304
305void TabbedButtonBar::moveTab (const int currentIndex, const int newIndex, const bool animate)
306{
307 auto* currentTab = tabs[currentTabIndex];
308 tabs.move (currentIndex, newIndex);
309 currentTabIndex = tabs.indexOf (currentTab);
310 updateTabPositions (animate);
311}
312
314{
315 return tabs.size();
316}
317
319{
320 if (auto* tab = tabs [currentTabIndex])
321 return tab->name;
322
323 return {};
324}
325
327{
328 StringArray names;
329
330 for (auto* t : tabs)
331 names.add (t->name);
332
333 return names;
334}
335
336void TabbedButtonBar::setCurrentTabIndex (int newIndex, bool shouldSendChangeMessage)
337{
338 if (currentTabIndex != newIndex)
339 {
340 if (! isPositiveAndBelow (newIndex, tabs.size()))
341 newIndex = -1;
342
343 currentTabIndex = newIndex;
344
345 for (int i = 0; i < tabs.size(); ++i)
346 tabs.getUnchecked(i)->button->setToggleState (i == newIndex, dontSendNotification);
347
348 resized();
349
350 if (shouldSendChangeMessage)
352
354 }
355}
356
358{
359 if (auto* tab = tabs[index])
360 return static_cast<TabBarButton*> (tab->button.get());
361
362 return nullptr;
363}
364
366{
367 for (int i = tabs.size(); --i >= 0;)
368 if (tabs.getUnchecked(i)->button.get() == button)
369 return i;
370
371 return -1;
372}
373
375{
376 if (button == nullptr || indexOfTabButton (button) == -1)
377 return {};
378
379 auto& animator = Desktop::getInstance().getAnimator();
380
381 return animator.isAnimating (button) ? animator.getComponentDestination (button)
382 : button->getBounds();
383}
384
390
392{
393 getLookAndFeel().drawTabbedButtonBarBackground (*this, g);
394}
395
397{
398 updateTabPositions (false);
399}
400
401//==============================================================================
403{
404 auto& lf = getLookAndFeel();
405
406 auto depth = getWidth();
407 auto length = getHeight();
408
409 if (! isVertical())
410 std::swap (depth, length);
411
412 auto overlap = lf.getTabButtonOverlap (depth) + lf.getTabButtonSpaceAroundImage() * 2;
413
414 auto totalLength = jmax (0, overlap);
415 auto numVisibleButtons = tabs.size();
416
417 for (int i = 0; i < tabs.size(); ++i)
418 {
419 auto* tb = tabs.getUnchecked(i)->button.get();
420
421 totalLength += tb->getBestTabLength (depth) - overlap;
422 tb->overlapPixels = jmax (0, overlap / 2);
423 }
424
425 double scale = 1.0;
426
427 if (totalLength > length)
428 scale = jmax (minimumScale, length / (double) totalLength);
429
430 const bool isTooBig = (int) (totalLength * scale) > length;
431 int tabsButtonPos = 0;
432
433 if (isTooBig)
434 {
435 if (extraTabsButton == nullptr)
436 {
437 extraTabsButton.reset (lf.createTabBarExtrasButton());
439 extraTabsButton->setAlwaysOnTop (true);
440 extraTabsButton->setTriggeredOnMouseDown (true);
441 extraTabsButton->onClick = [this] { showExtraItemsMenu(); };
442 }
443
444 auto buttonSize = jmin (proportionOfWidth (0.7f), proportionOfHeight (0.7f));
445 extraTabsButton->setSize (buttonSize, buttonSize);
446
447 if (isVertical())
448 {
449 tabsButtonPos = getHeight() - buttonSize / 2 - 1;
450 extraTabsButton->setCentrePosition (getWidth() / 2, tabsButtonPos);
451 }
452 else
453 {
454 tabsButtonPos = getWidth() - buttonSize / 2 - 1;
455 extraTabsButton->setCentrePosition (tabsButtonPos, getHeight() / 2);
456 }
457
458 totalLength = 0;
459
460 for (int i = 0; i < tabs.size(); ++i)
461 {
462 auto* tb = tabs.getUnchecked(i)->button.get();
463 auto newLength = totalLength + tb->getBestTabLength (depth);
464
465 if (i > 0 && newLength * minimumScale > tabsButtonPos)
466 {
467 totalLength += overlap;
468 break;
469 }
470
471 numVisibleButtons = i + 1;
472 totalLength = newLength - overlap;
473 }
474
475 scale = jmax (minimumScale, tabsButtonPos / (double) totalLength);
476 }
477 else
478 {
479 extraTabsButton.reset();
480 }
481
482 int pos = 0;
483
484 TabBarButton* frontTab = nullptr;
485 auto& animator = Desktop::getInstance().getAnimator();
486
487 for (int i = 0; i < tabs.size(); ++i)
488 {
489 if (auto* tb = getTabButton (i))
490 {
491 auto bestLength = roundToInt (scale * tb->getBestTabLength (depth));
492
493 if (i < numVisibleButtons)
494 {
495 auto newBounds = isVertical() ? Rectangle<int> (0, pos, getWidth(), bestLength)
496 : Rectangle<int> (pos, 0, bestLength, getHeight());
497
498 if (animate)
499 {
500 animator.animateComponent (tb, newBounds, 1.0f, 200, false, 3.0, 0.0);
501 }
502 else
503 {
504 animator.cancelAnimation (tb, false);
505 tb->setBounds (newBounds);
506 }
507
508 tb->toBack();
509
510 if (i == currentTabIndex)
511 frontTab = tb;
512
513 tb->setVisible (true);
514 }
515 else
516 {
517 tb->setVisible (false);
518 }
519
520 pos += bestLength - overlap;
521 }
522 }
523
524 behindFrontTab->setBounds (getLocalBounds());
525
526 if (frontTab != nullptr)
527 {
528 frontTab->toFront (false);
529 behindFrontTab->toBehind (frontTab);
530 }
531}
532
533//==============================================================================
535{
536 if (auto* tab = tabs[tabIndex])
537 return tab->colour;
538
540}
541
543{
544 if (auto* tab = tabs [tabIndex])
545 {
546 if (tab->colour != newColour)
547 {
548 tab->colour = newColour;
549 repaint();
550 }
551 }
552}
553
555{
556 PopupMenu m;
557
558 for (int i = 0; i < tabs.size(); ++i)
559 {
560 auto* tab = tabs.getUnchecked(i);
561
562 if (! tab->button->isVisible())
563 m.addItem (PopupMenu::Item (tab->name)
565 .setAction ([this, i] { setCurrentTabIndex (i); }));
566 }
567
568 m.showMenuAsync (PopupMenu::Options()
569 .withDeletionCheck (*this)
570 .withTargetComponent (extraTabsButton.get()));
571}
572
573//==============================================================================
576
577//==============================================================================
578std::unique_ptr<AccessibilityHandler> TabbedButtonBar::createAccessibilityHandler()
579{
580 return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::group);
581}
582
583} // namespace juce
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
bool getToggleState() const noexcept
Definition juce_Button.h:127
Button(const String &buttonName)
Definition juce_Button.cpp:76
const String & getButtonText() const
Definition juce_Button.h:67
void sendChangeMessage()
Definition juce_ChangeBroadcaster.cpp:65
Definition juce_Colour.h:38
Definition juce_Component.h:36
int proportionOfWidth(float proportion) const noexcept
Definition juce_Component.cpp:1111
void setInterceptsMouseClicks(bool allowClicksOnThisComponent, bool allowClicksOnChildComponents) noexcept
Definition juce_Component.cpp:1420
int proportionOfHeight(float proportion) const noexcept
Definition juce_Component.cpp:1112
void setFocusContainerType(FocusContainerType containerType) noexcept
Definition juce_Component.cpp:2862
int getHeight() const noexcept
Definition juce_Component.h:274
void toFront(bool shouldAlsoGainKeyboardFocus)
Definition juce_Component.cpp:954
void addAndMakeVisible(Component *child, int zOrder=-1)
Definition juce_Component.cpp:1554
void repaint()
Definition juce_Component.cpp:1917
Component() noexcept
Definition juce_Component.cpp:517
@ keyboardFocusContainer
Definition juce_Component.h:1307
void setWantsKeyboardFocus(bool wantsFocus) noexcept
Definition juce_Component.cpp:2842
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
const Array< Component * > & getChildren() const noexcept
Definition juce_Component.h:685
virtual void setVisible(bool shouldBeVisible)
Definition juce_Component.cpp:575
static Desktop &JUCE_CALLTYPE getInstance()
Definition juce_Desktop.cpp:50
Definition juce_GraphicsContext.h:45
Definition juce_ModifierKeys.h:41
bool isPopupMenu() const noexcept
Definition juce_ModifierKeys.h:78
Definition juce_Path.h:65
Definition juce_PopupMenu.h:457
Definition juce_PopupMenu.h:80
Definition juce_Rectangle.h:67
ValueType getRight() const noexcept
Definition juce_Rectangle.h:139
void setLeft(ValueType newLeft) noexcept
Definition juce_Rectangle.h:261
ValueType getCentreX() const noexcept
Definition juce_Rectangle.h:145
ValueType getHeight() const noexcept
Definition juce_Rectangle.h:136
void setRight(ValueType newRight) noexcept
Definition juce_Rectangle.h:285
void setBottom(ValueType newBottom) noexcept
Definition juce_Rectangle.h:297
ValueType getCentreY() const noexcept
Definition juce_Rectangle.h:148
ValueType getBottom() const noexcept
Definition juce_Rectangle.h:142
void setTop(ValueType newTop) noexcept
Definition juce_Rectangle.h:273
ValueType getX() const noexcept
Definition juce_Rectangle.h:127
ValueType getWidth() const noexcept
Definition juce_Rectangle.h:133
bool isEmpty() const noexcept
Definition juce_Rectangle.h:121
ValueType getY() const noexcept
Definition juce_Rectangle.h:130
void reduce(ValueType deltaX, ValueType deltaY) noexcept
Definition juce_Rectangle.h:474
Definition juce_StringArray.h:35
void add(String stringToAdd)
Definition juce_StringArray.cpp:136
Definition juce_String.h:53
bool isNotEmpty() const noexcept
Definition juce_String.h:316
Definition juce_TabbedButtonBar.h:44
int getIndex() const
Definition juce_TabbedButtonBar.cpp:37
Rectangle< int > getActiveArea() const
Definition juce_TabbedButtonBar.cpp:129
bool hitTest(int x, int y) override
Definition juce_TabbedButtonBar.cpp:54
void calcAreas(Rectangle< int > &, Rectangle< int > &) const
Definition juce_TabbedButtonBar.cpp:83
Rectangle< int > getTextArea() const
Definition juce_TabbedButtonBar.cpp:122
TabBarButton(const String &name, TabbedButtonBar &ownerBar)
Definition juce_TabbedButtonBar.cpp:29
void clicked(const ModifierKeys &) override
Definition juce_TabbedButtonBar.cpp:46
ExtraComponentPlacement extraCompPlacement
Definition juce_TabbedButtonBar.h:127
friend class TabbedButtonBar
Definition juce_TabbedButtonBar.h:122
Colour getTabBackgroundColour() const
Definition juce_TabbedButtonBar.cpp:38
std::unique_ptr< Component > extraComponent
Definition juce_TabbedButtonBar.h:126
ExtraComponentPlacement
Definition juce_TabbedButtonBar.h:60
@ beforeText
Definition juce_TabbedButtonBar.h:61
@ afterText
Definition juce_TabbedButtonBar.h:62
TabbedButtonBar & owner
Definition juce_TabbedButtonBar.h:123
int overlapPixels
Definition juce_TabbedButtonBar.h:124
bool isFrontTab() const
Definition juce_TabbedButtonBar.cpp:39
void paintButton(Graphics &, bool, bool) override
Definition juce_TabbedButtonBar.cpp:41
void setExtraComponent(Component *extraTabComponent, ExtraComponentPlacement extraComponentPlacement)
Definition juce_TabbedButtonBar.cpp:143
void resized() override
Definition juce_TabbedButtonBar.cpp:161
virtual int getBestTabLength(int depth)
Definition juce_TabbedButtonBar.cpp:78
~TabBarButton() override
Definition juce_TabbedButtonBar.cpp:35
void childBoundsChanged(Component *) override
Definition juce_TabbedButtonBar.cpp:152
Definition juce_TabbedButtonBar.cpp:175
void enablementChanged() override
Definition juce_TabbedButtonBar.cpp:187
void paint(Graphics &g) override
Definition juce_TabbedButtonBar.cpp:182
TabbedButtonBar & owner
Definition juce_TabbedButtonBar.cpp:192
BehindFrontTabComp(TabbedButtonBar &tb)
Definition juce_TabbedButtonBar.cpp:177
String getCurrentTabName() const
Definition juce_TabbedButtonBar.cpp:318
std::unique_ptr< BehindFrontTabComp > behindFrontTab
Definition juce_TabbedButtonBar.h:362
double minimumScale
Definition juce_TabbedButtonBar.h:358
void setTabName(int tabIndex, const String &newName)
Definition juce_TabbedButtonBar.cpp:274
std::unique_ptr< AccessibilityHandler > createAccessibilityHandler() override
Definition juce_TabbedButtonBar.cpp:578
TabBarButton * getTabButton(int index) const
Definition juce_TabbedButtonBar.cpp:357
~TabbedButtonBar() override
Definition juce_TabbedButtonBar.cpp:208
TabbedButtonBar(Orientation orientation)
Definition juce_TabbedButtonBar.cpp:199
void moveTab(int currentIndex, int newIndex, bool animate=false)
Definition juce_TabbedButtonBar.cpp:305
int indexOfTabButton(const TabBarButton *button) const
Definition juce_TabbedButtonBar.cpp:365
void setTabBackgroundColour(int tabIndex, Colour newColour)
Definition juce_TabbedButtonBar.cpp:542
void updateTabPositions(bool animate)
Definition juce_TabbedButtonBar.cpp:402
Rectangle< int > getTargetBounds(TabBarButton *button) const
Definition juce_TabbedButtonBar.cpp:374
OwnedArray< TabInfo > tabs
Definition juce_TabbedButtonBar.h:355
Orientation orientation
Definition juce_TabbedButtonBar.h:357
void setOrientation(Orientation orientation)
Definition juce_TabbedButtonBar.cpp:215
Orientation
Definition juce_TabbedButtonBar.h:162
@ TabsAtLeft
Definition juce_TabbedButtonBar.h:165
@ TabsAtTop
Definition juce_TabbedButtonBar.h:163
@ TabsAtBottom
Definition juce_TabbedButtonBar.h:164
@ TabsAtRight
Definition juce_TabbedButtonBar.h:166
std::unique_ptr< Button > extraTabsButton
Definition juce_TabbedButtonBar.h:363
void removeTab(int tabIndex, bool animate=false)
Definition juce_TabbedButtonBar.cpp:287
void setCurrentTabIndex(int newTabIndex, bool sendChangeMessage=true)
Definition juce_TabbedButtonBar.cpp:336
virtual TabBarButton * createTabButton(const String &tabName, int tabIndex)
Definition juce_TabbedButtonBar.cpp:225
bool isVertical() const noexcept
Definition juce_TabbedButtonBar.h:193
int getNumTabs() const
Definition juce_TabbedButtonBar.cpp:313
virtual void currentTabChanged(int newCurrentTabIndex, const String &newCurrentTabName)
Definition juce_TabbedButtonBar.cpp:574
int currentTabIndex
Definition juce_TabbedButtonBar.h:359
StringArray getTabNames() const
Definition juce_TabbedButtonBar.cpp:326
virtual void popupMenuClickOnTab(int tabIndex, const String &tabName)
Definition juce_TabbedButtonBar.cpp:575
void showExtraItemsMenu()
Definition juce_TabbedButtonBar.cpp:554
void clearTabs()
Definition juce_TabbedButtonBar.cpp:237
void resized() override
Definition juce_TabbedButtonBar.cpp:396
void lookAndFeelChanged() override
Definition juce_TabbedButtonBar.cpp:385
void paint(Graphics &) override
Definition juce_TabbedButtonBar.cpp:391
Colour getTabBackgroundColour(int tabIndex)
Definition juce_TabbedButtonBar.cpp:534
void setMinimumTabScaleFactor(double newMinimumScale)
Definition juce_TabbedButtonBar.cpp:230
void addTab(const String &tabName, Colour tabBackgroundColour, int insertIndex)
Definition juce_TabbedButtonBar.cpp:244
unsigned * m
Definition inflate.c:1559
struct huft * t
Definition inflate.c:943
int g
Definition inflate.c:1573
register unsigned i
Definition inflate.c:1575
static const char * name
Definition pugl.h:1582
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE(className)
static int JUCE_CDECL comp(const void *a, const void *b)
Definition lsp.c:298
const Colour transparentBlack
Definition juce_Colours.h:40
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
@ dontSendNotification
Definition juce_NotificationType.h:33
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
int roundToInt(const FloatType value) noexcept
Definition juce_MathsFunctions.h:465
@ button
Definition juce_AccessibilityRole.h:38
@ group
Definition juce_AccessibilityRole.h:61
png_uint_32 length
Definition png.c:2247
Definition juce_PopupMenu.h:111
Item & setTicked(bool shouldBeTicked=true) &noexcept
Definition juce_PopupMenu.cpp:1669
Item & setAction(std::function< void()> action) &noexcept
Definition juce_PopupMenu.cpp:1681
Definition juce_TabbedButtonBar.h:349
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
int r
Definition crypt.c:458
typedef int(UZ_EXP MsgFn)()