LMMS
Loading...
Searching...
No Matches
juce_RelativeCoordinatePositioner.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
30{
32
33 Expression getSymbolValue (const String& symbol) const override
34 {
36
37 if (type == RelativeCoordinate::StandardStrings::width) return Expression ((double) component.getWidth());
38 if (type == RelativeCoordinate::StandardStrings::height) return Expression ((double) component.getHeight());
39
41
42 if (auto* marker = findMarker (component, symbol, list))
43 return Expression (marker->position.getExpression().evaluate (*this));
44
46 }
47
48 void visitRelativeScope (const String& scopeName, Visitor& visitor) const override
49 {
51 {
52 if (auto* parent = component.getParentComponent())
53 {
54 visitor.visit (MarkerListScope (*parent));
55 return;
56 }
57 }
58
59 Expression::Scope::visitRelativeScope (scopeName, visitor);
60 }
61
62 String getScopeUID() const override
63 {
64 return String::toHexString ((pointer_sized_int) (void*) &component) + "m";
65 }
66
68 {
69 const MarkerList::Marker* marker = nullptr;
70
71 auto* mlh = dynamic_cast<MarkerList::MarkerListHolder*> (&component);
72
73 if (mlh != nullptr)
74 {
75 list = mlh->getMarkers (true);
76
77 if (list != nullptr)
78 marker = list->getMarker (name);
79 }
80
81 if (marker == nullptr)
82 {
83 if (mlh != nullptr)
84 {
85 list = mlh->getMarkers (false);
86
87 if (list != nullptr)
88 marker = list->getMarker (name);
89 }
90 }
91
92 return marker;
93 }
94
96};
97
98//==============================================================================
103
105{
107 {
112 case RelativeCoordinate::StandardStrings::width: return Expression ((double) component.getWidth());
113 case RelativeCoordinate::StandardStrings::height: return Expression ((double) component.getHeight());
114 case RelativeCoordinate::StandardStrings::right: return Expression ((double) component.getRight());
115 case RelativeCoordinate::StandardStrings::bottom: return Expression ((double) component.getBottom());
118 default: break;
119 }
120
121 if (Component* const parent = component.getParentComponent())
122 {
124
125 if (auto* marker = MarkerListScope::findMarker (*parent, symbol, list))
126 {
128 return Expression (marker->position.getExpression().evaluate (scope));
129 }
130 }
131
132 return Expression::Scope::getSymbolValue (symbol);
133}
134
136{
137 if (auto* targetComp = (scopeName == RelativeCoordinate::Strings::parent)
138 ? component.getParentComponent()
139 : findSiblingComponent (scopeName))
140 visitor.visit (ComponentScope (*targetComp));
141 else
142 Expression::Scope::visitRelativeScope (scopeName, visitor);
143}
144
149
151{
152 if (Component* const parent = component.getParentComponent())
153 return parent->findChildWithID (componentID);
154
155 return nullptr;
156}
157
158//==============================================================================
160{
161public:
166
167 Expression getSymbolValue (const String& symbol) const override
168 {
170 {
179 positioner.registerComponentListener (component);
180 break;
181
184 default:
185 if (auto* parent = component.getParentComponent())
186 {
188
189 if (MarkerListScope::findMarker (*parent, symbol, list) != nullptr)
190 {
191 positioner.registerMarkerListListener (list);
192 }
193 else
194 {
195 // The marker we want doesn't exist, so watch all lists in case they change and the marker appears later..
196 if (auto* mlh = dynamic_cast<MarkerList::MarkerListHolder*> (parent))
197 {
198 positioner.registerMarkerListListener (mlh->getMarkers (true));
199 positioner.registerMarkerListListener (mlh->getMarkers (false));
200 }
201
202 ok = false;
203 }
204 }
205 break;
206 }
207
208 return ComponentScope::getSymbolValue (symbol);
209 }
210
211 void visitRelativeScope (const String& scopeName, Visitor& visitor) const override
212 {
213 if (Component* const targetComp = (scopeName == RelativeCoordinate::Strings::parent)
214 ? component.getParentComponent()
215 : findSiblingComponent (scopeName))
216 {
217 visitor.visit (DependencyFinderScope (*targetComp, positioner, ok));
218 }
219 else
220 {
221 // The named component doesn't exist, so we'll watch the parent for changes in case it appears later..
222 if (Component* const parent = component.getParentComponent())
223 positioner.registerComponentListener (*parent);
224
225 positioner.registerComponentListener (component);
226 ok = false;
227 }
228 }
229
230private:
232 bool& ok;
233};
234
235//==============================================================================
240
245
246void RelativeCoordinatePositionerBase::componentMovedOrResized (Component&, bool /*wasMoved*/, bool /*wasResized*/)
247{
248 apply();
249}
250
255
257{
258 if (getComponent().getParentComponent() == &changed && ! registeredOk)
259 apply();
260}
261
263{
264 jassert (sourceComponents.contains (&comp));
265 sourceComponents.removeFirstMatchingValue (&comp);
266 registeredOk = false;
267}
268
273
275{
276 jassert (sourceMarkerLists.contains (markerList));
277 sourceMarkerLists.removeFirstMatchingValue (markerList);
278}
279
290
292{
293 bool ok = true;
294 DependencyFinderScope finderScope (getComponent(), *this, ok);
295 coord.getExpression().evaluate (finderScope);
296 return ok;
297}
298
300{
301 const bool ok = addCoordinate (point.x);
302 return addCoordinate (point.y) && ok;
303}
304
306{
307 if (! sourceComponents.contains (&comp))
308 {
309 comp.addComponentListener (this);
310 sourceComponents.add (&comp);
311 }
312}
313
315{
316 if (list != nullptr && ! sourceMarkerLists.contains (list))
317 {
318 list->addListener (this);
320 }
321}
322
324{
325 for (int i = sourceComponents.size(); --i >= 0;)
326 sourceComponents.getUnchecked(i)->removeComponentListener (this);
327
328 for (int i = sourceMarkerLists.size(); --i >= 0;)
329 sourceMarkerLists.getUnchecked(i)->removeListener (this);
330
331 sourceComponents.clear();
332 sourceMarkerLists.clear();
333}
334
335} // namespace juce
static Audio_Scope * scope
Definition player.cpp:26
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
static String toHexString(int number)
Definition String.cpp:1830
Positioner(Component &component) noexcept
Definition juce_Component.cpp:2266
Component & getComponent() const noexcept
Definition juce_Component.h:2363
Definition juce_Component.h:36
Definition juce_Expression.h:137
virtual void visit(const Scope &)=0
Definition juce_Expression.h:109
virtual Expression getSymbolValue(const String &symbol) const
Definition juce_Expression.cpp:1123
virtual void visitRelativeScope(const String &scopeName, Visitor &visitor) const
Definition juce_Expression.cpp:1165
Definition juce_Expression.h:44
double evaluate() const
Definition juce_Expression.cpp:984
Definition juce_MarkerList.h:54
Definition juce_MarkerList.h:39
Definition juce_RelativeCoordinate.h:73
const Expression & getExpression() const
Definition juce_RelativeCoordinate.h:132
Component & component
Definition juce_RelativeCoordinatePositioner.h:67
ComponentScope(Component &)
Definition juce_RelativeCoordinatePositioner.cpp:99
String getScopeUID() const override
Definition juce_RelativeCoordinatePositioner.cpp:145
void visitRelativeScope(const String &scopeName, Visitor &) const override
Definition juce_RelativeCoordinatePositioner.cpp:135
Expression getSymbolValue(const String &symbol) const override
Definition juce_RelativeCoordinatePositioner.cpp:104
Component * findSiblingComponent(const String &componentID) const
Definition juce_RelativeCoordinatePositioner.cpp:150
Definition juce_RelativeCoordinatePositioner.cpp:160
Expression getSymbolValue(const String &symbol) const override
Definition juce_RelativeCoordinatePositioner.cpp:167
DependencyFinderScope(Component &comp, RelativeCoordinatePositionerBase &p, bool &result)
Definition juce_RelativeCoordinatePositioner.cpp:162
void visitRelativeScope(const String &scopeName, Visitor &visitor) const override
Definition juce_RelativeCoordinatePositioner.cpp:211
bool & ok
Definition juce_RelativeCoordinatePositioner.cpp:232
RelativeCoordinatePositionerBase & positioner
Definition juce_RelativeCoordinatePositioner.cpp:231
void componentBeingDeleted(Component &) override
Definition juce_RelativeCoordinatePositioner.cpp:262
void componentChildrenChanged(Component &) override
Definition juce_RelativeCoordinatePositioner.cpp:256
bool addPoint(const RelativePoint &)
Definition juce_RelativeCoordinatePositioner.cpp:299
void markersChanged(MarkerList *) override
Definition juce_RelativeCoordinatePositioner.cpp:269
RelativeCoordinatePositionerBase(Component &)
Definition juce_RelativeCoordinatePositioner.cpp:236
void registerMarkerListListener(MarkerList *)
Definition juce_RelativeCoordinatePositioner.cpp:314
void componentParentHierarchyChanged(Component &) override
Definition juce_RelativeCoordinatePositioner.cpp:251
bool registeredOk
Definition juce_RelativeCoordinatePositioner.h:81
bool addCoordinate(const RelativeCoordinate &)
Definition juce_RelativeCoordinatePositioner.cpp:291
Array< MarkerList * > sourceMarkerLists
Definition juce_RelativeCoordinatePositioner.h:80
~RelativeCoordinatePositionerBase() override
Definition juce_RelativeCoordinatePositioner.cpp:241
void registerComponentListener(Component &)
Definition juce_RelativeCoordinatePositioner.cpp:305
void componentMovedOrResized(Component &, bool, bool) override
Definition juce_RelativeCoordinatePositioner.cpp:246
Array< Component * > sourceComponents
Definition juce_RelativeCoordinatePositioner.h:79
void apply()
Definition juce_RelativeCoordinatePositioner.cpp:280
void markerListBeingDeleted(MarkerList *) override
Definition juce_RelativeCoordinatePositioner.cpp:274
void unregisterListeners()
Definition juce_RelativeCoordinatePositioner.cpp:323
Definition juce_RelativePoint.h:38
RelativeCoordinate x
Definition juce_RelativePoint.h:88
RelativeCoordinate y
Definition juce_RelativePoint.h:88
Definition juce_String.h:53
register unsigned i
Definition inflate.c:1575
static const char * name
Definition pugl.h:1582
static uintptr_t parent
Definition pugl.h:1644
int marker
Definition jpeglib.h:950
#define jassert(expression)
static int JUCE_CDECL comp(const void *a, const void *b)
Definition lsp.c:298
Definition carla_juce.cpp:31
int pointer_sized_int
Definition juce_MathsFunctions.h:80
@ list
Definition juce_AccessibilityRole.h:56
#define false
Definition ordinals.h:83
Definition juce_MarkerList.h:153
Definition juce_RelativeCoordinatePositioner.cpp:30
static const MarkerList::Marker * findMarker(Component &component, const String &name, MarkerList *&list)
Definition juce_RelativeCoordinatePositioner.cpp:67
Component & component
Definition juce_RelativeCoordinatePositioner.cpp:95
Expression getSymbolValue(const String &symbol) const override
Definition juce_RelativeCoordinatePositioner.cpp:33
void visitRelativeScope(const String &scopeName, Visitor &visitor) const override
Definition juce_RelativeCoordinatePositioner.cpp:48
String getScopeUID() const override
Definition juce_RelativeCoordinatePositioner.cpp:62
MarkerListScope(Component &comp)
Definition juce_RelativeCoordinatePositioner.cpp:31
@ y
Definition juce_RelativeCoordinate.h:168
@ top
Definition juce_RelativeCoordinate.h:167
@ left
Definition juce_RelativeCoordinate.h:167
@ unknown
Definition juce_RelativeCoordinate.h:170
@ right
Definition juce_RelativeCoordinate.h:167
@ parent
Definition juce_RelativeCoordinate.h:169
@ x
Definition juce_RelativeCoordinate.h:168
@ height
Definition juce_RelativeCoordinate.h:168
@ width
Definition juce_RelativeCoordinate.h:168
@ bottom
Definition juce_RelativeCoordinate.h:167
static Type getTypeOf(const String &s) noexcept
Definition juce_RelativeCoordinate.cpp:39
static const String parent
Definition juce_RelativeCoordinate.h:151
uch * p
Definition crypt.c:594
int result
Definition process.c:1455