Vuo  2.3.2
VuoSubcompositionMessageRouter.cc
Go to the documentation of this file.
1 
10 #include "VuoFileUtilities.hh"
11 #include "VuoStringUtilities.hh"
12 #include "VuoCompiler.hh"
14 #include "VuoCompilerNode.hh"
15 #include "VuoEditorComposition.hh"
16 #include "VuoEditorWindow.hh"
17 
19 
23 VuoSubcompositionMessageRouter::CompositionInfo::CompositionInfo(void)
24 {
25  window = NULL;
26  topLevelComposition = NULL;
27  supercomposition = NULL;
28  nodeIdentifierInSupercomposition = "";
29  compositionIdentifier = "";
30 }
31 
35 VuoSubcompositionMessageRouter::CompositionInfo::CompositionInfo(VuoEditorWindow *window)
36 {
37  this->window = window;
38  reset();
39 }
40 
44 void VuoSubcompositionMessageRouter::CompositionInfo::reset(void)
45 {
46  topLevelComposition = window->getComposition();
47  supercomposition = NULL;
48  nodeIdentifierInSupercomposition = "";
50 }
51 
56 {
57 }
58 
63 {
64  compositionInfosMutex.lock();
65  compositionInfosMutex.unlock();
66 }
67 
75 {
76  compositionInfosMutex.lock();
77 
78  compositionInfos[window->getComposition()] = CompositionInfo(window);
79 
80  compositionInfosMutex.unlock();
81 }
82 
87 {
88  compositionInfosMutex.lock();
89 
90  map<VuoEditorComposition *, CompositionInfo> *cis[] = { &compositionInfos, &unlinkedCompositionInfos };
91  for (int i = 0; i < 2; ++i)
92  {
93  auto curr = (*cis[i]).find(window->getComposition());
94  if (curr != (*cis[i]).end())
95  (*cis[i]).erase(curr);
96 
97  for (auto &c : *cis[i])
98  if (c.second.topLevelComposition == window->getComposition())
99  c.second.reset();
100  }
101 
102  compositionInfosMutex.unlock();
103 }
104 
110  VuoEditorComposition *supercomposition,
111  VuoRendererNode *nodeInSupercomposition)
112 {
113  compositionInfosMutex.lock();
114 
115  auto sub = compositionInfos.find(subcompositionInstance);
116  if (sub != compositionInfos.end())
117  {
118  auto super = compositionInfos.find(supercomposition);
119  if (super != compositionInfos.end())
120  {
121  sub->second.topLevelComposition = super->second.topLevelComposition;
122  sub->second.supercomposition = supercomposition;
123  sub->second.nodeIdentifierInSupercomposition = nodeInSupercomposition->getBase()->getCompiler()->getIdentifier();
124  sub->second.compositionIdentifier = VuoStringUtilities::buildCompositionIdentifier(super->second.compositionIdentifier,
125  nodeInSupercomposition->getBase()->getCompiler()->getIdentifier());
126  }
127  }
128 
129  compositionInfosMutex.unlock();
130 }
131 
137 {
138  compositionInfosMutex.lock();
139 
140  auto sub = compositionInfos.find(subcompositionInstance);
141  if (sub != compositionInfos.end())
142  compositionInfos[sub->first].reset();
143 
144  sub = unlinkedCompositionInfos.find(subcompositionInstance);
145  if (sub != unlinkedCompositionInfos.end())
146  unlinkedCompositionInfos.erase(sub);
147 
148  compositionInfosMutex.unlock();
149 }
150 
156  const string &nodeIdentifier)
157 {
158  compositionInfosMutex.lock();
159 
160  for (auto &c : compositionInfos)
161  {
162  if (c.second.supercomposition == supercomposition && c.second.nodeIdentifierInSupercomposition == nodeIdentifier)
163  {
164  unlinkedCompositionInfos[c.first] = c.second;
165  c.second.reset();
166  }
167  }
168 
169  compositionInfosMutex.unlock();
170 }
171 
178  const string &nodeIdentifier)
179 {
180  compositionInfosMutex.lock();
181 
182  for (map<VuoEditorComposition *, CompositionInfo>::iterator i = unlinkedCompositionInfos.begin(); i != unlinkedCompositionInfos.end(); ++i)
183  {
184  if (i->second.supercomposition == supercomposition && i->second.nodeIdentifierInSupercomposition == nodeIdentifier)
185  {
186  compositionInfos[i->first] = i->second;
187  unlinkedCompositionInfos.erase(i);
188  break;
189  }
190  }
191 
192  compositionInfosMutex.unlock();
193 }
194 
201 {
202  compositionInfosMutex.lock();
203 
204  string compositionIdentifier;
205  auto curr = compositionInfos.find(composition);
206  if (curr != compositionInfos.end())
207  compositionIdentifier = curr->second.compositionIdentifier;
208 
209  compositionInfosMutex.unlock();
210 
211  return compositionIdentifier;
212 }
213 
221  CompositionCallbackWithIdentifier doForComposition)
222 {
223  compositionInfosMutex.lock_shared();
224 
225  auto curr = compositionInfos.find(currComposition);
226  if (curr != compositionInfos.end())
227  doForComposition(curr->second.topLevelComposition, curr->second.compositionIdentifier);
228 
229  compositionInfosMutex.unlock_shared();
230 }
231 
239  string compositionIdentifier,
240  CompositionCallback doForComposition)
241 {
242  compositionInfosMutex.lock_shared();
243 
244  auto curr = compositionInfos.find(currComposition);
245  if (curr != compositionInfos.end())
246  for (auto c : compositionInfos)
247  if (c.second.topLevelComposition == curr->second.topLevelComposition && c.second.compositionIdentifier == compositionIdentifier)
248  doForComposition(c.first);
249 
250  compositionInfosMutex.unlock_shared();
251 }
252 
260  CompositionCallbackWithIdentifier doForComposition)
261 {
262  compositionInfosMutex.lock_shared();
263 
264  auto curr = compositionInfos.find(currComposition);
265  if (curr != compositionInfos.end())
266  for (auto c : compositionInfos)
267  if (c.second.topLevelComposition == curr->second.topLevelComposition)
268  doForComposition(c.first, c.second.compositionIdentifier);
269 
270  compositionInfosMutex.unlock_shared();
271 }
272 
280  CompositionCallback doForComposition)
281 {
282  compositionInfosMutex.lock_shared();
283 
284  for (auto c : compositionInfos)
285  if (c.first != currComposition && c.first == c.second.topLevelComposition)
286  doForComposition(c.first);
287 
288  compositionInfosMutex.unlock_shared();
289 }
290 
297  CompositionCallbackWithPath doForComposition)
298 {
299  compositionInfosMutex.lock_shared();
300 
301  auto curr = compositionInfos.find(currComposition);
302  if (curr != compositionInfos.end())
303  {
304  string compositionPath = curr->second.window->windowFilePath().toStdString();
305  if (VuoFileUtilities::isInstalledAsModule(compositionPath))
306  doForComposition(currComposition, compositionPath);
307  }
308 
309  compositionInfosMutex.unlock_shared();
310 }
311 
319  CompositionCallbackWithPath doForComposition)
320 {
321  compositionInfosMutex.lock_shared();
322 
323  for (auto c : compositionInfos)
324  if (c.first != currComposition)
325  applyIfInstalledAsSubcomposition(c.first, doForComposition);
326 
327  compositionInfosMutex.unlock_shared();
328 }