UI-top-level: decide upon the relation of ViewLocator and Navigator

...and how the former can rely on the latter, abstracted as LocationQuery
This commit is contained in:
Fischlurch 2018-01-14 01:58:25 +01:00
parent d0b59a1c52
commit 3c32cd5acb
7 changed files with 231 additions and 32 deletions

View file

@ -83,9 +83,9 @@ namespace interact {
InteractionDirector::InteractionDirector (GlobalCtx& globals)
: model::Controller(session::Root::getID(), globals.uiBus_.getAccessPoint())
, globalCtx_(globals)
, viewLocator_{new ViewLocator{globals.windowLoc_.locatePanel()}}
, viewLocator_{new ViewLocator{globals, [this]() -> LocationQuery& { return *navigator_; }}}
, spotLocator_{new SpotLocator}
, navigator_{new Navigator{*spotLocator_}}
, navigator_{new Navigator{*spotLocator_, *viewLocator_}}
, tracker_{new FocusTracker{*navigator_}}
, uiState_{new UiState{globals.uiBus_.getStateManager(), *tracker_}}
, assets_{new AssetController{session::Root::getAssetID(), this->uiBus_}}

View file

@ -23,8 +23,14 @@
/** @file navigator.cpp
** Implementation of global interface navigation mechanisms.
** Especially we implement the LocationQuery interface, which exposes the structures
** of the UI as an abstracted, tree-shaped topology. This task adds up to levelling all the
** specifics of accessing individual components and to assemble them into a virtual component tree.
** The actual details of component access are thereby delegated to the ViewLocator, which is a sibling
** service maintained by the InteractionDirector.
**
** @todo WIP 2/2017 early draft / foundations of "interaction control"
** @todo WIP 1/2018 integrating the concept of UI-Coordinate navigation and resolution. Still WIP-WIP-WIP...
*/
@ -47,11 +53,36 @@ namespace interact {
{ }
Navigator::Navigator (SpotLocator& spotLocator)
: spotLocator_{spotLocator}
Navigator::Navigator (SpotLocator& spotLoc, ViewLocator& viewLoc)
: spotLocator_{spotLoc}
, viewLocator_{viewLoc}
{ }
/* ==== implementing the LocationQuery API ==== */
Literal
Navigator::determineAnchor (UICoord const& path)
{
UNIMPLEMENTED ("LocationQuery in real UI: resolve anchor point of given UI-Coordinates");
}
size_t
Navigator::determineCoverage (UICoord const& path)
{
UNIMPLEMENTED ("LocationQuery in real UI: determine explicit coverage of given UI-Coordinates");
}
LocationQuery::ChildIter
Navigator::getChildren (UICoord const& path, size_t pos)
{
UNIMPLEMENTED ("LocationQuery in real UI: build child iterator rooted at given point in the UI tree");
}
/** */

View file

@ -39,6 +39,7 @@
#define GUI_INTERACT_NAVIGATOR_H
#include "gui/gtk-base.hpp"
#include "gui/interact/ui-coord-resolver.hpp"
#include <boost/noncopyable.hpp>
//#include <string>
@ -53,6 +54,7 @@ namespace interact {
// class GlobalCtx;
class SpotLocator;
class ViewLocator;
@ -63,14 +65,21 @@ namespace interact {
* @see UiCoordResolver
*/
class Navigator
: boost::noncopyable
: public LocationQuery
, boost::noncopyable
{
SpotLocator& spotLocator_;
ViewLocator& viewLocator_;
public:
Navigator (SpotLocator&);
Navigator (SpotLocator&, ViewLocator&);
~Navigator ();
/* === LocationQuery API === */
Literal determineAnchor (UICoord const& path) override final;
size_t determineCoverage (UICoord const& path) override final;
ChildIter getChildren (UICoord const& path, size_t pos) override final;
private:
};

View file

@ -29,13 +29,18 @@
#include "gui/interact/view-locator.hpp"
//#include "gui/ctrl/global-ctx.hpp"
#include "gui/ctrl/panel-locator.hpp"
#include "gui/ctrl/window-locator.hpp"
#include "gui/interact/ui-coord-resolver.hpp"
#include "gui/ctrl/global-ctx.hpp"
#include "lib/symbol.hpp"
//#include "lib/util.hpp"
//using util::cStr;
//using util::isnil;
using lib::Symbol;
using gui::ctrl::PanelLocator;
using gui::ctrl::WindowLocator;
namespace gui {
@ -52,11 +57,29 @@ namespace interact {
ViewLocator::~ViewLocator() { }
ViewLocator::ViewLocator (ctrl::PanelLocator& panelLocator)
: panelLoc_{panelLocator}
ViewLocator::ViewLocator (ctrl::GlobalCtx& uiTopLevel, std::function<LocationQuery&()> getLocQuery)
: globals_{uiTopLevel}
, locationQuery{getLocQuery}
{ }
/* === Service accessors within global context === */
PanelLocator&
ViewLocator::panelLocator()
{
return globals_.windowLoc_.locatePanel();
}
WindowLocator&
ViewLocator::windowLocator()
{
return globals_.windowLoc_;
}
/** */

View file

@ -45,19 +45,26 @@
#include "gui/gtk-base.hpp"
#include "gui/id-scheme.hpp"
#include "gui/ctrl/panel-locator.hpp"
#include <boost/noncopyable.hpp>
#include <functional>
//#include <string>
//#include <memory>
namespace gui {
namespace ctrl{
class GlobalCtx;
class PanelLocator;
class WindowLocator;
}
namespace interact {
// using std::unique_ptr;
// using std::string;
using std::function;
class LocationQuery;
// class GlobalCtx;
@ -70,10 +77,10 @@ namespace interact {
class ViewLocator
: boost::noncopyable
{
ctrl::PanelLocator& panelLoc_;
ctrl::GlobalCtx& globals_;
public:
ViewLocator (ctrl::PanelLocator&);
ViewLocator (ctrl::GlobalCtx&, function<LocationQuery&()>);
~ViewLocator();
@ -84,6 +91,10 @@ namespace interact {
V& get();
private:
/* === accessors to sibling global services === */
function<LocationQuery&()> locationQuery;
ctrl::PanelLocator& panelLocator();
ctrl::WindowLocator& windowLocator();
};

View file

@ -3705,7 +3705,7 @@ Especially the focus navigation entails the use of some kind of ubiquitous [[coo
</pre>
</div>
<div title="InteractionDirector" creator="Ichthyostega" modifier="Ichthyostega" created="201702102146" modified="201709021522" tags="def design GuiPattern" changecount="25">
<div title="InteractionDirector" creator="Ichthyostega" modifier="Ichthyostega" created="201702102146" modified="201801132336" tags="def design GuiPattern" changecount="27">
<pre>//the top-level controller within the UI.//
In Lumiera, the structures of the model within the [[Session]] (the so called HighLevelModel) are mapped onto corresponding [[tangible UI entities|UI-Element]], which serve as a front-end to represent those entities towards the user. Within this model, there is a //conceptual root node// -- which logically corresponds to the session itself. This [[root element in model|ModelRootMO]] links together the actual top-level entities, which are the (multiple) timelines, together with the asset management and defaults and rules configuration within the session.
@ -3726,7 +3726,7 @@ The InteractionDirector is part of the model, and thus we have to distinguish be
:anything related to forming and tracking of user interactions &amp;rarr; InteractionControl
:* the SpotLocator is what is &quot;moved&quot; when the [[Spot]] of current activity moves
:* the FocusTracker is responsible for //detecting changes in current selection and focus.//
:* the [[Navigator]] is a special controller to handle moving the SpotLocator
:* the [[Navigator]] is a special controller to handle moving the SpotLocator within the UI tree topology
!Collaborations
* several global actions are exposed here, like opening the session and creating a new timeline.&lt;br/&gt;Such operations are typically bound into menu and action buttons, and in turn invoke [[commands|CommandHandling]] into the Session
@ -3736,6 +3736,9 @@ The InteractionDirector is part of the model, and thus we have to distinguish be
** or can exist only once per top level window
** some might even be required once per window
** while others may be duplicated locally or globally
!!!cyclic dependencies
The InteractionDirector interconnects various aspects of UI management and thus can be expected to exhibit cyclic dependencies on several levels. Bootstraping the InteractionDirector is thus a tricky procedure and requires all participating services to operate demand-driven. In fact, these services represent some aspects of the same whole -- the UI. They are bounded by thematic considerations, not so much implementation concerns, and many of them rely on their siblings actually provide some essential part of their service. For example, the Navigator exposes the UI as topological tree structure, while the ViewLocator encapsulates the concrete access paths towards specific kinds of UI entities (views, panels). Obviously, the Navigator needs the ViewLocator to build its tree abstraction on top. But, thematically, //resolving a view// is part of accessing and / or creating some view, and thus the ViewLocator becomes indirectly dependent on the tree topology established by the Navigator.
</pre>
</div>
<div title="InteractionState" creator="Ichthyostega" modifier="Ichthyostega" created="201511280402" modified="201704171824" tags="def design GuiIntegration draft" changecount="9">

View file

@ -762,7 +762,7 @@
</node>
</node>
<node CREATED="1484876114521" ID="ID_1082250595" MODIFIED="1501778463955" TEXT="Protokoll zur Kommunikation">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1484876122960" ID="ID_31825421" MODIFIED="1514829311463" TEXT="UI-Bus nur im GUI-Thread">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1484876122960" ID="ID_31825421" MODIFIED="1515885889041" TEXT="UI-Bus nur im GUI-Thread">
<arrowlink COLOR="#6c5f80" DESTINATION="ID_489078622" ENDARROW="Default" ENDINCLINATION="289;0;" ID="Arrow_ID_485145709" STARTARROW="None" STARTINCLINATION="1538;-37;"/>
<linktarget COLOR="#b7748e" DESTINATION="ID_31825421" ENDARROW="Default" ENDINCLINATION="560;150;" ID="Arrow_ID_1434676575" SOURCE="ID_935689465" STARTARROW="Default" STARTINCLINATION="587;44;"/>
<icon BUILTIN="messagebox_warning"/>
@ -2436,7 +2436,7 @@
<node CREATED="1483921070115" ID="ID_398046799" MODIFIED="1483921131646" TEXT="Prototyp-Service"/>
<node CREATED="1483921132114" ID="ID_1652398711" MODIFIED="1483921138070" TEXT="liefert dekorierte Command-ID"/>
<node CREATED="1483921149368" ID="ID_1028150245" MODIFIED="1483921160762" TEXT="im GUI nur noch Command-IDs"/>
<node CREATED="1483924872930" ID="ID_242219866" MODIFIED="1483925475104">
<node CREATED="1483924872930" ID="ID_242219866" MODIFIED="1515885915837">
<richcontent TYPE="NODE"><html>
<head>
@ -2447,7 +2447,7 @@
</p>
</body>
</html></richcontent>
<linktarget COLOR="#e9ba2d" DESTINATION="ID_242219866" ENDARROW="Default" ENDINCLINATION="-784;1692;" ID="Arrow_ID_1617518648" SOURCE="ID_1479669922" STARTARROW="None" STARTINCLINATION="3436;-1136;"/>
<linktarget COLOR="#e9ba2d" DESTINATION="ID_242219866" ENDARROW="Default" ENDINCLINATION="-822;1685;" ID="Arrow_ID_1617518648" SOURCE="ID_1479669922" STARTARROW="None" STARTINCLINATION="3436;-1136;"/>
</node>
<node CREATED="1483927472385" HGAP="30" ID="ID_774425061" MODIFIED="1483927503424" VSHIFT="13">
<richcontent TYPE="NODE"><html>
@ -4201,6 +4201,15 @@
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181800067" ID="ID_196802981" MODIFIED="1515209565927" TEXT="Wiring">
<icon BUILTIN="hourglass"/>
<node CREATED="1515209567856" ID="ID_1008245035" MODIFIED="1515209577219" TEXT="warten auf reales UI..."/>
<node COLOR="#338800" CREATED="1515891216245" ID="ID_1439162441" MODIFIED="1515891233851" TEXT="Verh&#xe4;ltnis von ViewLocator und Navigator kl&#xe4;ren">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1515891241785" ID="ID_1731852581" MODIFIED="1515891272422" TEXT="Komponenten-Zugriffe in ViewLocator">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1515891256616" ID="ID_1103868933" MODIFIED="1515891271590" TEXT="Baum-Abstraktion im Navigator">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node COLOR="#338800" CREATED="1506181802699" ID="ID_582767851" MODIFIED="1508625703401" TEXT="Test-Setup">
<icon BUILTIN="button_ok"/>
@ -9009,27 +9018,138 @@
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1506957414370" ID="ID_848105210" MODIFIED="1506957613469">
<node CREATED="1506957414370" ID="ID_848105210" MODIFIED="1515884149284">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Integration
Integration ViewLocator
</p>
<p>
Resolver / Navigator
</p>
</body>
</html></richcontent>
</html>
</richcontent>
<linktarget COLOR="#3f4b87" DESTINATION="ID_848105210" ENDARROW="Default" ENDINCLINATION="-1260;542;" ID="Arrow_ID_1760927309" SOURCE="ID_1256149179" STARTARROW="None" STARTINCLINATION="1244;-591;"/>
<icon BUILTIN="help"/>
<node CREATED="1515884080567" ID="ID_1610510897" MODIFIED="1515884091139" TEXT="Frage der Abh&#xe4;ngigkeit">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1515884093053" ID="ID_578386223" MODIFIED="1515884098622" TEXT="k&#xf6;nnte zyklisch sein">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
<node CREATED="1515884156717" ID="ID_1719646750" MODIFIED="1515885023884" TEXT="ViewLocator">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<node CREATED="1515884167067" ID="ID_252275651" MODIFIED="1515884182853" TEXT="Einzel-Zugang"/>
<node CREATED="1515884183937" ID="ID_1146786067" MODIFIED="1515884192404" TEXT="explizit per Typ"/>
<node CREATED="1515884193464" ID="ID_680693474" MODIFIED="1515885158375">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
aber auch: <b>Resolver</b>
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#3b6680" DESTINATION="ID_680693474" ENDARROW="Default" ENDINCLINATION="-178;8;" ID="Arrow_ID_1157808975" SOURCE="ID_1356241564" STARTARROW="None" STARTINCLINATION="98;0;"/>
<font NAME="SansSerif" SIZE="12"/>
<node CREATED="1515884215165" ID="ID_1855078495" MODIFIED="1515884219600" TEXT="baut auf DSL auf"/>
<node CREATED="1515884220428" ID="ID_513230162" MODIFIED="1515884234262" TEXT="Struktur-Regeln"/>
<node CREATED="1515884235658" ID="ID_1028909961" MODIFIED="1515884243981" TEXT="finden oder zeugen"/>
</node>
<node CREATED="1515885720655" ID="ID_1092683882" MODIFIED="1515891084044" TEXT="b&#xfc;ndelt low-level-Zugang">
<linktarget COLOR="#8c98a0" DESTINATION="ID_1092683882" ENDARROW="Default" ENDINCLINATION="-155;0;" ID="Arrow_ID_1761525173" SOURCE="ID_150080053" STARTARROW="None" STARTINCLINATION="-156;6;"/>
<node CREATED="1515885728374" ID="ID_152777185" MODIFIED="1515885746768" TEXT="Bezug auf GlobalCtx">
<node CREATED="1515885839951" ID="ID_123309845" MODIFIED="1515885846514" TEXT="f&#xfc;r WindowLocator"/>
<node CREATED="1515885847767" ID="ID_1781347382" MODIFIED="1515885853122" TEXT="f&#xfc;r PanelManager"/>
<node CREATED="1515885855014" ID="ID_1634512088" MODIFIED="1515885976709" TEXT="f&#xfc;r LocationQuery">
<arrowlink COLOR="#8c98a0" DESTINATION="ID_150080053" ENDARROW="Default" ENDINCLINATION="198;0;" ID="Arrow_ID_1806083846" STARTARROW="None" STARTINCLINATION="10;48;"/>
</node>
</node>
<node CREATED="1515885751787" ID="ID_1669926039" MODIFIED="1515885759828" TEXT="indirekt zyklisch">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1515885762754" ID="ID_657098401" MODIFIED="1515885821023" TEXT="ist OK">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
die Regel ist:
</p>
<p>
Bei zyklischen Abh&#228;ngigkeiten erfolgt der Ringschlu&#223;
</p>
<p>
an einer Stelle &#252;ber eine allgemeine Abstraktion
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node CREATED="1515884935318" ID="ID_1231381049" MODIFIED="1515885022531" TEXT="Navigator">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<node CREATED="1515884949013" ID="ID_562171495" MODIFIED="1515884954959" TEXT="nur lesend"/>
<node CREATED="1515884972018" ID="ID_105092644" MODIFIED="1515884977708" TEXT="leistet Baum-Abstraktion"/>
<node CREATED="1515884955620" ID="ID_1330012545" MODIFIED="1515884963254" TEXT="manipuliert Zustand, nicht Struktur"/>
<node CREATED="1515885006181" ID="ID_150080053" MODIFIED="1515891084044">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
implementiert <b>LocationQuery</b>
</p>
</body>
</html>
</richcontent>
<arrowlink COLOR="#8c98a0" DESTINATION="ID_1092683882" ENDARROW="Default" ENDINCLINATION="-155;0;" ID="Arrow_ID_1761525173" STARTARROW="None" STARTINCLINATION="-156;6;"/>
<linktarget COLOR="#8c98a0" DESTINATION="ID_150080053" ENDARROW="Default" ENDINCLINATION="198;0;" ID="Arrow_ID_1806083846" SOURCE="ID_1634512088" STARTARROW="None" STARTINCLINATION="10;48;"/>
</node>
</node>
</node>
<node CREATED="1515891291587" HGAP="42" ID="ID_1000521247" MODIFIED="1515891329347" TEXT="Design" VSHIFT="11">
<node CREATED="1515891297466" ID="ID_1885414397" MODIFIED="1515891306893" TEXT="Komponenten sind nach Themen geschnitten"/>
<node CREATED="1515891308057" ID="ID_89499528" MODIFIED="1515891321467" TEXT="Zyklen werden &#xfc;ber abstrakte Interfaces gef&#xfc;hrt"/>
<node CREATED="1515891349731" ID="ID_1663035567" MODIFIED="1515891368503" TEXT="ViewLocator &quot;generiert nebenbei&quot; die DSL-Token">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506175097367" ID="ID_1442345755" MODIFIED="1506181085379" TEXT="ViewSpec-DSL">
<arrowlink COLOR="#b45c5a" DESTINATION="ID_686917529" ENDARROW="Default" ENDINCLINATION="-468;-196;" ID="Arrow_ID_1955094318" STARTARROW="None" STARTINCLINATION="360;85;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1515877499720" HGAP="-59" ID="ID_1283126436" MODIFIED="1515877526258" TEXT="Basis" VSHIFT="29">
<node CREATED="1515877527300" ID="ID_1356241564" MODIFIED="1515885188347" TEXT="ist Teil des ViewLocators">
<arrowlink COLOR="#3b6680" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-269;-228;" ID="Arrow_ID_408957918" STARTARROW="Default" STARTINCLINATION="-858;0;"/>
<arrowlink COLOR="#3b6680" DESTINATION="ID_680693474" ENDARROW="Default" ENDINCLINATION="-178;8;" ID="Arrow_ID_1157808975" STARTARROW="None" STARTINCLINATION="98;0;"/>
</node>
<node CREATED="1515877545642" ID="ID_1723275956" MODIFIED="1515877557060" TEXT="lebt in der Implementierung"/>
<node CREATED="1515877577414" ID="ID_664776417" MODIFIED="1515877611753" TEXT="Bausteine sind sichtbar...">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...als Namespace-globale Variable mit externer Linkage
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181855132" ID="ID_787628963" MODIFIED="1506181859251" TEXT="ViewSpec">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181868898" ID="ID_1852393086" MODIFIED="1506181871266" TEXT="Resolver">
@ -9121,7 +9241,7 @@
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#338800" CREATED="1515726221600" ID="ID_1657507656" MODIFIED="1515803758366" TEXT="Implementierung">
<node COLOR="#338800" CREATED="1515726221600" FOLDED="true" ID="ID_1657507656" MODIFIED="1515874594393" TEXT="Implementierung">
<icon BUILTIN="button_ok"/>
<node CREATED="1515726234742" ID="ID_95404514" MODIFIED="1515726237056" TEXT="Prinzip">
<node CREATED="1515726238061" ID="ID_1475189544" MODIFIED="1515726244416" TEXT="ctor nimmt beliebige Funktion"/>
@ -10424,9 +10544,10 @@
<node CREATED="1487461242609" ID="ID_164538059" MODIFIED="1487461245308" TEXT="Struktur">
<node CREATED="1487461304560" ID="ID_349728972" MODIFIED="1488492188626" TEXT="betreibt">
<node CREATED="1487273437019" ID="ID_1653934212" MODIFIED="1506956689947" TEXT="Navigator">
<node CREATED="1506957512565" ID="ID_1256149179" MODIFIED="1507935759248" TEXT="dient als Resolver">
<node CREATED="1515879320297" ID="ID_1194515598" MODIFIED="1515879338135" TEXT="(abstrahierte) Baum-Struktur"/>
<node CREATED="1506957512565" ID="ID_1256149179" MODIFIED="1515879353706" TEXT="dient als Resolver">
<arrowlink COLOR="#3f4b87" DESTINATION="ID_848105210" ENDARROW="Default" ENDINCLINATION="-1260;542;" ID="Arrow_ID_1760927309" STARTARROW="None" STARTINCLINATION="1244;-591;"/>
<linktarget COLOR="#5068a8" DESTINATION="ID_1256149179" ENDARROW="Default" ENDINCLINATION="-87;78;" ID="Arrow_ID_1490250373" SOURCE="ID_650732591" STARTARROW="None" STARTINCLINATION="225;-6;"/>
<linktarget COLOR="#5068a8" DESTINATION="ID_1256149179" ENDARROW="Default" ENDINCLINATION="-104;99;" ID="Arrow_ID_1490250373" SOURCE="ID_650732591" STARTARROW="None" STARTINCLINATION="225;-6;"/>
</node>
</node>
<node CREATED="1487270206369" ID="ID_1888334597" MODIFIED="1487461321289" TEXT="SpotLocator"/>
@ -10476,19 +10597,20 @@
</html></richcontent>
</node>
<node CREATED="1507935461787" ID="ID_1244300168" MODIFIED="1507935472477" TEXT="bietet command-and-query-Interface"/>
<node CREATED="1507935474273" ID="ID_650732591" MODIFIED="1507935737076" TEXT="dient als (Pfad-)Resolver f&#xfc;r UI-Coord">
<arrowlink COLOR="#5068a8" DESTINATION="ID_1256149179" ENDARROW="Default" ENDINCLINATION="-87;78;" ID="Arrow_ID_1490250373" STARTARROW="None" STARTINCLINATION="225;-6;"/>
<node CREATED="1507935474273" ID="ID_650732591" MODIFIED="1515879353706" TEXT="dient als (Pfad-)Resolver f&#xfc;r UI-Coord">
<arrowlink COLOR="#5068a8" DESTINATION="ID_1256149179" ENDARROW="Default" ENDINCLINATION="-104;99;" ID="Arrow_ID_1490250373" STARTARROW="None" STARTINCLINATION="225;-6;"/>
</node>
<node CREATED="1507935538409" ID="ID_1407528424" MODIFIED="1507935647550" TEXT="st&#xfc;tzt sich auf ViewLocator ab">
<arrowlink COLOR="#89919c" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="90;-49;" ID="Arrow_ID_1845784021" STARTARROW="None" STARTINCLINATION="-18;26;"/>
<node CREATED="1507935538409" ID="ID_1407528424" MODIFIED="1515879366384" TEXT="st&#xfc;tzt sich auf ViewLocator ab">
<arrowlink COLOR="#89919c" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="90;-49;" ID="Arrow_ID_1845784021" STARTARROW="None" STARTINCLINATION="-22;31;"/>
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1504368969990" ID="ID_344392695" MODIFIED="1507935619563" TEXT="ViewLocator">
<node CREATED="1504368969990" ID="ID_344392695" MODIFIED="1515879429968" TEXT="ViewLocator">
<linktarget COLOR="#9da9b7" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-96;-128;" ID="Arrow_ID_17315740" SOURCE="ID_948587913" STARTARROW="None" STARTINCLINATION="-94;5;"/>
<linktarget COLOR="#89919c" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="90;-49;" ID="Arrow_ID_1845784021" SOURCE="ID_1407528424" STARTARROW="None" STARTINCLINATION="-18;26;"/>
<linktarget COLOR="#89919c" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="90;-49;" ID="Arrow_ID_1845784021" SOURCE="ID_1407528424" STARTARROW="None" STARTINCLINATION="-22;31;"/>
<linktarget COLOR="#7c8aa8" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-676;143;" ID="Arrow_ID_1224269755" SOURCE="ID_869653682" STARTARROW="None" STARTINCLINATION="641;-106;"/>
<linktarget COLOR="#7f97bd" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-977;81;" ID="Arrow_ID_1627222173" SOURCE="ID_1747666798" STARTARROW="None" STARTINCLINATION="1159;303;"/>
<linktarget COLOR="#3b6680" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-269;-228;" ID="Arrow_ID_408957918" SOURCE="ID_1356241564" STARTARROW="Default" STARTINCLINATION="-858;0;"/>
<node CREATED="1504387078950" ID="ID_1433555277" MODIFIED="1504387097144" TEXT="bietet Komponenten-Management">
<node CREATED="1504387105363" ID="ID_631730744" MODIFIED="1504387110342" TEXT="neue Komponente"/>
<node CREATED="1504387110866" ID="ID_879632055" MODIFIED="1504387115157" TEXT="Komponente l&#xf6;schen"/>
@ -19304,8 +19426,8 @@
<node CREATED="1492205732389" ID="ID_1080697951" MODIFIED="1492205739216" TEXT="wir k&#xf6;nnen stets gleich triggern"/>
</node>
<node CREATED="1492205741483" ID="ID_1132272888" MODIFIED="1492205758781" TEXT="Command wird sofort nach dem Binden getriggert"/>
<node COLOR="#338800" CREATED="1483925280108" HGAP="30" ID="ID_1479669922" MODIFIED="1492205824434" TEXT="Protokoll-Erweiterung" VSHIFT="8">
<arrowlink COLOR="#e9ba2d" DESTINATION="ID_242219866" ENDARROW="Default" ENDINCLINATION="-784;1692;" ID="Arrow_ID_1617518648" STARTARROW="None" STARTINCLINATION="3436;-1136;"/>
<node COLOR="#338800" CREATED="1483925280108" HGAP="30" ID="ID_1479669922" MODIFIED="1515885915837" TEXT="Protokoll-Erweiterung" VSHIFT="8">
<arrowlink COLOR="#e9ba2d" DESTINATION="ID_242219866" ENDARROW="Default" ENDINCLINATION="-822;1685;" ID="Arrow_ID_1617518648" STARTARROW="None" STARTINCLINATION="3436;-1136;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1483925298713" ID="ID_347702585" MODIFIED="1483925306749" TEXT="Command-Prototyp forken"/>
<node CREATED="1483925307385" ID="ID_509982277" MODIFIED="1492205808486" TEXT="ID durch Kontext-ID dekorieren"/>
@ -19352,7 +19474,7 @@
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1501778430101" ID="ID_489078622" MODIFIED="1514829311464" TEXT="#1098 hand-over to UI thread">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1501778430101" ID="ID_489078622" MODIFIED="1515885889041" TEXT="#1098 hand-over to UI thread">
<linktarget COLOR="#6c5f80" DESTINATION="ID_489078622" ENDARROW="Default" ENDINCLINATION="289;0;" ID="Arrow_ID_485145709" SOURCE="ID_31825421" STARTARROW="None" STARTINCLINATION="1538;-37;"/>
<icon BUILTIN="flag-yellow"/>
</node>