Timeline: after a long break... reconsider how to integrate the new VerbPack

...into the draft skeleton of timeline drawing
This commit is contained in:
Fischlurch 2019-06-10 16:08:31 +02:00
parent f6e5886348
commit 1a8917e60a
12 changed files with 121 additions and 63 deletions

View file

@ -24,7 +24,7 @@
/** @file body-canvas-widget.cpp
** Implementation details of timeline custom drawing.
**
** @todo WIP-WIP-WIP as of 12/2016
** @todo WIP-WIP-WIP as of 6/2019
**
*/
@ -77,8 +77,8 @@ namespace timeline {
/** paint the top of the track body area
@param f number of consecutive track elements
to keep pinned (always visible) at top */
* @param f number of consecutive track elements
* to keep pinned (always visible) at top */
void
prelude (uint f) override
{
@ -86,7 +86,7 @@ namespace timeline {
}
/** finish painting the track body area
@param pad additional padding to add at bottom */
* @param pad additional padding to add at bottom */
void
coda (uint pad) override
{
@ -94,7 +94,7 @@ namespace timeline {
}
/** draw grounding of a overview/ruler track
with the given height */
* with the given height */
void
ruler (uint h) override
{
@ -109,7 +109,7 @@ namespace timeline {
}
/** fill background of track content area
with the given vertical extension */
* with the given vertical extension */
void
content (uint h) override
{
@ -117,7 +117,7 @@ namespace timeline {
}
/** paint opening slope to enter nested sub tracks
@note we only ever open one level deep a time */
* @note we only ever open one level deep a time */
void
open (uint n) override
{
@ -125,7 +125,7 @@ namespace timeline {
}
/** paint closing slope to finish nested sub tracks
@param n number of nested levels to close */
* @param n number of nested levels to close */
void
close (uint n) override
{
@ -194,7 +194,7 @@ namespace timeline {
* rather, each sequence holds a _fork of nested scopes._ This recursively nested structure is reflected in the way
* we organise and draw the timeline representation onto the TimelineCanvas: we use an intermediary entity, the TrackBody
* as an organisational grouping device, even while we draw _all of the timeline representation_ onto a single global
* ::canvas_ within the (scrollable) BodyCanvasWidget. Thus, adding the first TrackBody to represent the root track
* #mainCanvas_ within the (scrollable) #contentArea_. Thus, adding the first TrackBody to represent the root track
* of a Timeline, will also prepare the grounding for any other nested entities to be drawn on top.
*/
void

View file

@ -49,7 +49,7 @@
** As result, some new widgets may be injected, existing widgets might be removed or
** hidden, and other widgets may be relocated to different virtual canvas coordinates.
**
** @todo WIP-WIP-WIP as of 12/2016
** @todo WIP-WIP-WIP as of 6/2019
**
*/
@ -98,18 +98,18 @@ namespace timeline {
TimelineCanvas (_RenderFactory groundingFac, _RenderFactory overlayFac);
private:
virtual bool on_draw (Cairo::RefPtr<Cairo::Context> const&) override;
virtual bool on_draw (CairoC) override;
void openCanvas (Cairo::RefPtr<Cairo::Context> const&);
void closeCanvas (Cairo::RefPtr<Cairo::Context> const&);
void openCanvas (CairoC);
void closeCanvas (CairoC);
void drawGrounding (Cairo::RefPtr<Cairo::Context> const&);
void drawOverlays (Cairo::RefPtr<Cairo::Context> const&);
void drawGrounding (CairoC);
void drawOverlays (CairoC);
};
/**
* @todo WIP-WIP as of 12/2016
* @todo WIP-WIP as of 6/2019
*/
class BodyCanvasWidget
: public Gtk::Box

View file

@ -25,7 +25,7 @@
** Implementation details regarding custom drawing of track overview
** and time code ticks and markers onto the TimelineCanvas.
**
** @todo WIP-WIP-WIP as of 12/2018
** @todo WIP-WIP-WIP as of 6/2019
** @todo this is more or less preliminary/placeholder code as of 4/2019
**
*/

View file

@ -28,13 +28,15 @@
** this track content area we build a horizontal ruler to show the timecode or
** frame count references plus any markers, ranges and locators. In case of
** group tracks or collapsed tracks, a synopsis of the content may be rendered
** into this overview bar. Since any of these display elements need to be aligned
** into this overview bar. However, similar ruler tracks can also be used _within_
** the actual fork of tracks, to represent a sub-scope or a similar kind of overview
** or summarising display. Since any of these display elements need to be aligned
** precisely with the content, we employ custom drawing for the rulers as well.
** The RulerTrack -- like any parts of the coordinated TimelineLayout, will be
** referred to from and used by the BodyCanvasWidget for offloading specific
** parts of the drawing routines.
**
** @todo WIP-WIP-WIP as of 12/2018
** @todo WIP-WIP-WIP as of 6/2019
**
*/

View file

@ -64,7 +64,7 @@ namespace timeline {
TimelineLayout::TimelineLayout (Gtk::Paned& topLevelContainer)
: paneSplitPosition_{topLevelContainer.property_position()}
, bodyCanvas_{*this} // inject (as interface DisplayManager)
, headerPane_{bodyCanvas_.get_vadjustment()} // wire the header pane (Gtk::Viewport) to follow the body vertical scroll movement
, headerPane_{bodyCanvas_.get_vadjustment()} // wire the patchbay (Gtk::Viewport) to follow the body vertical scroll movement
{
topLevelContainer.add1 (headerPane_);
topLevelContainer.add2 (bodyCanvas_);

View file

@ -69,7 +69,7 @@
**
** For this to work, the _element_ can not be the actual widget, since the result of this whole
** process might be to create or retract an actual GTK widget. For this reason, the timeline
** layout management relies on a _Presenter_ entity, which in turn controls a mostly passive
** layout management relies on _Presenter_ entities, which in turn control a mostly passive
** view -- our solution in fact relies on some flavour of the
** [MVP pattern](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter) here.
**

View file

@ -118,7 +118,7 @@ namespace timeline {
* @param trackID the mandatory root track used in the associated Sequence
* @param nexus some established connection to the UI-Bus, will be used
* to register the embedded TimelineController as communication
* partner to respond under the given ID.
* partner to respond under the given timeline ID.
* @remarks after creation, the widget can just be hooked up and wired like
* any ordinary GTK element; it becomes passive and just responds to
* signals. The active role is played by the controller, which also

View file

@ -25,7 +25,7 @@
** Implementation details regarding display management of the
** track body area within the timeline display canvas.
**
** @todo WIP-WIP-WIP as of 12/2016
** @todo WIP-WIP-WIP as of 6/2019
**
*/

View file

@ -67,7 +67,7 @@ namespace timeline {
* task of a TrackBody is to find out about its own overall height, including the
* overall height required by all its nested children. Moreover, the height of
* the content area needs to be negotiated with the actual content elements.
* @todo WIP-WIP as of 10/2018
* @todo WIP-WIP as of 6/2019
*/
class TrackBody
{

View file

@ -22,7 +22,7 @@
/** @file track-profile.hpp
** Abstraction build the layout for the track spaces for timeline display.
** Abstraction to build the layout for the track spaces within timeline display.
** In Lumiera, tracks are arranged into a fork of nested shapes, which structure
** is parallelled into nested structure of TrackBody elements. A tree walk over
** this structure yields a sequence of adjacent timeline elements, like overview
@ -30,7 +30,7 @@
** be transformed into suitable drawing instructions to create a 3D shaded
** display, clearly highlighting the complex structure of the track arrangement.
**
** @todo WIP-WIP-WIP as of 4/2019
** @todo WIP-WIP-WIP as of 6/2019
**
*/
@ -53,11 +53,12 @@ namespace stage {
namespace timeline {
using lib::Literal;
using util::isnil;
class ProfileInterpreter
{
public:
~ProfileInterpreter() { } ///< this is an interface
virtual ~ProfileInterpreter() { } ///< this is an interface
virtual void ruler(uint h) =0; ///< represent a overview/ruler track with the given height
virtual void gap(uint h) =0; ///< represent a gap to structure the display
@ -90,7 +91,7 @@ namespace timeline {
explicit
operator bool() const
{
return not util::isnil (elements);
return not isnil (elements);
}
void

View file

@ -3517,11 +3517,11 @@ In accordance with the Lumiera application architecture in general, the UI is no
<pre>A specially configured LumieraPlugin, which actually contains or loads the complete code of the (GTK)GUI, and additionally is linked dynamically against the application core lib. During the [[UI startup process|GuiStart]], loading of this Plugin is triggered from {{{main()}}}. Actually this causes spawning of the GTK event thread and execution of the GTK main loop.
</pre>
</div>
<div title="GuiTimelineDraw" creator="Ichthyostega" modifier="Ichthyostega" created="201904052156" modified="201904061546" tags="GuiPattern spec impl img draft" changecount="90">
<div title="GuiTimelineDraw" creator="Ichthyostega" modifier="Ichthyostega" created="201904052156" modified="201906101247" tags="GuiPattern spec impl img draft" changecount="92">
<pre>The presentation of the track body area relies on the [[Gtk::Layout &quot;canvas widget&quot;|GtkLayoutWidget]], thus allowing for a mixture of custom drawing with embedded custom Gtk widgets. The actual drawing routine is activated in response to the {{{on_draw}}} signal -- and invoking the inherited handler function will initiate the standard drawing for the embedded child widgets. This partitions the additional, specific drawing activities into a pre-widget drawing phase to prepare the background and framework structure of the track area, and a post-widget drawing phase to show all kinds of overlays, markers cursors and similar UI indicators. A nested structure of {{{TrackBody}}} objects serves as organisational device to structure these custom drawing activities in accordance with the nested structure of the track fork.
!Building a nested 3D structure
[&gt;img[3D structure of track drawing|draw/UI-TimelineTrackProfile-1.png]]A proficient UI design often relies on subtle cues to guide the user intuitively -- which includes shading of boundary areas to structure the interface space. Both the space and the means to give such unambiguous visual clues are limited, and it would be unwise to forgo such possibilities to follow some stylish fad. Rather, we strive at some degree of internal coherency within the application of these stylistic means.
[&gt;img[3D structure of track drawing|draw/UI-TimelineTrackProfile-1.png]]A proficient UI design often relies on subtle cues to guide the user intuitively -- which includes shading of boundary areas to structure the interface space. Both the space and the means to give such unambiguous visual clues are limited, and it would be unwise to forgo such possibilities to follow some stylish fad. Rather, we strive at achieving some degree of internal coherency within the application of these stylistic means.
In Lumiera, the //tracks// represent an organisational device, a nested set of //scopes,// which -- for the UI representation -- is paralleled by nested insets holding the media content. One or several //rulers// as guiding devices run alongside the top of each scope, either representing the scope as a whole, or introducing the working area of this scope similar to a side walk running alongside a channel. A system of increasingly deeper nested scopes thus becomes a cadence of insets in the way of a lateral staircase.

View file

@ -19667,7 +19667,7 @@
<node CREATED="1555247665396" ID="ID_1210108422" MODIFIED="1557498707228" TEXT="vermutlich werden Lambdas eine Rolle spielen"/>
<node CREATED="1555247678988" ID="ID_1615700205" MODIFIED="1557498707228" TEXT="aber ich m&#xf6;chte Heap-Storage vermeiden"/>
</node>
<node COLOR="#338800" CREATED="1555247704342" ID="ID_929740643" MODIFIED="1557590585181" TEXT="Entwurf/Test">
<node COLOR="#338800" CREATED="1555247704342" FOLDED="true" ID="ID_929740643" MODIFIED="1560172875969" TEXT="Entwurf/Test">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1555247713060" ID="ID_1159666241" MODIFIED="1557590555065" TEXT="proof-of-concept">
<icon BUILTIN="button_ok"/>
@ -19881,8 +19881,7 @@
d.h er funktioniert nur, wenn man das std::get&lt;idx&gt; (tuple) unmittelbar an den jeweiligen Ziel-Parameter bindet
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1557414442871" ID="ID_501615874" MODIFIED="1557498707228" TEXT="dagegen std::forward w&#xe4;hlt flexibel einen von zwei overloads">
<richcontent TYPE="NOTE"><html>
@ -19897,8 +19896,7 @@
und einen, der einen RValue entgegennimmt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1557414483962" ID="ID_656447545" MODIFIED="1557498707228" TEXT="und dies kann ich hier nicht nachbilden">
<linktarget COLOR="#f05859" DESTINATION="ID_656447545" ENDARROW="Default" ENDINCLINATION="45;-420;" ID="Arrow_ID_1477395313" SOURCE="ID_474705115" STARTARROW="None" STARTINCLINATION="649;0;"/>
@ -19916,8 +19914,7 @@
steht in keinem Verh&#228;ltnis zum Zweck
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="stop-sign"/>
</node>
</node>
@ -20011,8 +20008,7 @@
Also ist das sogar das korrekte Verhalten.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1557446482447" ID="ID_835188518" MODIFIED="1557498707229" TEXT="L&#xf6;sung: Duck-Detector f&#xfc;r Methoden-Name">
<node CREATED="1557446494679" ID="ID_1259664145" MODIFIED="1557498707229" TEXT="verzichtet auf Signatur-Check">
@ -20025,8 +20021,7 @@
d.h. wenn zuf&#228;llig das Interface auch eine Methode CloneInto() enth&#228;lt, aber mit einer unpassenden Signatur
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1557446561925" ID="ID_1267977919" MODIFIED="1557498707229" TEXT="ist ohnehin keine wirkliche Sicherheit"/>
@ -20050,8 +20045,7 @@
das ist auch gut so, zu viel Flexibilit&#228;t schadet (besonders, wenn man sie dann gar nicht unterst&#252;tzt)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
</node>
@ -20071,8 +20065,7 @@
Leider haben wir dann zweimal die gleiche Basisklasse in beiden Zweigen der multiple inheritance...
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1557446924907" ID="ID_1029661613" MODIFIED="1557498707229" TEXT="...was hier absolut naheliegend ist">
<richcontent TYPE="NOTE"><html>
@ -20087,8 +20080,7 @@
(was ich bisher in der Praxis so noch nie gemacht habe)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1557447075623" ID="ID_1422873677" MODIFIED="1557498707229" TEXT="dummerweise kann dann der GCC die EmptyBase nicht wegoptimieren">
<richcontent TYPE="NOTE"><html>
@ -20103,8 +20095,7 @@
hab das ganz explizit ausgeknobelt, es fehlt hier genau dieser eine zus&#228;tzliche &quot;Slot&quot;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="broken-line"/>
</node>
<node COLOR="#338800" CREATED="1557447159900" ID="ID_691196423" MODIFIED="1557498722522" TEXT="L&#xf6;sung: anderen Namen verwenden">
@ -20119,8 +20110,8 @@
<node CREATED="1555807464657" ID="ID_1089528099" MODIFIED="1557498707229" TEXT="diese meta-Intelligenz sollte komplett in dem Adapter stecken"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1557446611550" ID="ID_596556632" MODIFIED="1557590501784" TEXT="Ticket #1197 : rationalise copy support in PolymorphicValue">
<linktarget COLOR="#1a64bc" DESTINATION="ID_596556632" ENDARROW="Default" ENDINCLINATION="-129;0;" ID="Arrow_ID_884404467" SOURCE="ID_1511870599" STARTARROW="None" STARTINCLINATION="-284;0;"/>
<linktarget COLOR="#829ebf" DESTINATION="ID_596556632" ENDARROW="Default" ENDINCLINATION="-282;0;" ID="Arrow_ID_1622655110" SOURCE="ID_383098394" STARTARROW="None" STARTINCLINATION="-74;193;"/>
<linktarget COLOR="#1a64bc" DESTINATION="ID_596556632" ENDARROW="Default" ENDINCLINATION="-129;0;" ID="Arrow_ID_884404467" SOURCE="ID_1511870599" STARTARROW="None" STARTINCLINATION="-284;0;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
@ -20220,8 +20211,7 @@
wo wir die konkreten Argumente in den vorbereiteten Argument-Tupel im Holder schieben
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="button_ok"/>
</node>
</node>
@ -20250,8 +20240,7 @@
</li>
</ul>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1557590794163" ID="ID_497379433" MODIFIED="1557590811601" TEXT="Werte kopiert und verglichen">
@ -20311,8 +20300,7 @@
und es obliegt der n&#228;chst h&#246;heren Schicht, dies auch in sinnvollem Rahmen zu tun...
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<arrowlink COLOR="#fcda04" DESTINATION="ID_1932269477" ENDARROW="Default" ENDINCLINATION="290;0;" ID="Arrow_ID_742389536" STARTARROW="None" STARTINCLINATION="187;8;"/>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
@ -20321,7 +20309,60 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1557590586650" ID="ID_1348312855" MODIFIED="1557590595855" TEXT="den (neu gebauten) VerbPack integrieren">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1560175373902" ID="ID_1956293405" MODIFIED="1560175561475" TEXT="bestehendes TrackProfile sinngem&#xe4;&#xdf; umbauen">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560175492578" ID="ID_1159091213" MODIFIED="1560175557813" TEXT="Verb + explizite Storage -&gt; VerbPack">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560175383722" ID="ID_107500239" MODIFIED="1560175568187" TEXT="Problem: addSlopeUp()">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1560175410857" ID="ID_1553338375" MODIFIED="1560175429772" TEXT="bisher konnten wir einfach das Argument manipulieren"/>
<node CREATED="1560175430998" ID="ID_125919592" MODIFIED="1560175477371" TEXT="...aber jetzt gibt es nicht mehr &quot;das&quot; Argument">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
sondern die Argumente sind in einem Tuple eingewickelt,
</p>
<p>
und befinden sich tief vergraben in der Implementierungsklasse,
</p>
<p>
innerhalb eines PolymorphicValue.
</p>
</body>
</html>
</richcontent>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1560175478468" ID="ID_105401193" MODIFIED="1560175566685" TEXT="Hilfe... was tun?">
<icon BUILTIN="flag-pink"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560175529230" ID="ID_914166338" MODIFIED="1560175635885">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Verh&#228;ltnis zum Inteface <b>Renderer</b>&#160;kl&#228;ren
</p>
</body>
</html>
</richcontent>
<arrowlink COLOR="#508bd1" DESTINATION="ID_1592949721" ENDARROW="Default" ENDINCLINATION="59;-58;" ID="Arrow_ID_1618633786" STARTARROW="None" STARTINCLINATION="-91;0;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1560175579123" ID="ID_678068478" MODIFIED="1560175590213" TEXT="in generische draw()-Routine einbinden">
<node CREATED="1560175593361" ID="ID_1592949721" MODIFIED="1560175631513" TEXT="wo kommt der Renderer ins Spiel?">
<linktarget COLOR="#508bd1" DESTINATION="ID_1592949721" ENDARROW="Default" ENDINCLINATION="59;-58;" ID="Arrow_ID_1618633786" SOURCE="ID_914166338" STARTARROW="None" STARTINCLINATION="-91;0;"/>
</node>
<node CREATED="1560175646834" ID="ID_585934033" MODIFIED="1560175663115" TEXT="wo wird entschieden, was in den Ruler-Teil kommt?"/>
</node>
</node>
</node>
@ -20421,6 +20462,15 @@
<icon BUILTIN="forward"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560173474830" ID="ID_351544133" MODIFIED="1560173496890" TEXT="sind es &quot;zwei&quot; oder sind es N Konfigs?">
<icon BUILTIN="help"/>
<node COLOR="#ba568c" CREATED="1560173511341" ID="ID_637775069" MODIFIED="1560173529984" TEXT="Monate sp&#xe4;ter...">
<icon BUILTIN="smily_bad"/>
</node>
<node CREATED="1560173498827" ID="ID_553759798" MODIFIED="1560173508018" TEXT="und was meint hier &quot;Konfig&quot;...?">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
</node>
</node>
@ -20464,7 +20514,7 @@
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1541862804070" ID="ID_430268635" MODIFIED="1557498707230" TEXT="Display-Manager == Abstraktion">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1541862816104" FOLDED="true" ID="ID_1545586243" MODIFIED="1557498707230" TEXT="lokal injiziert beim Aufbau">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1541862816104" FOLDED="true" ID="ID_1545586243" MODIFIED="1560173642952" TEXT="lokal injiziert beim Aufbau">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1554475687257" ID="ID_908192712" MODIFIED="1554475728633" TEXT="das hei&#xdf;t: separates Thema">
<icon BUILTIN="yes"/>
@ -22667,7 +22717,7 @@
<node CREATED="1541545696185" ID="ID_1907010009" MODIFIED="1557498707234" TEXT="Grund: UI-Bus - Routing">
<icon BUILTIN="info"/>
</node>
<node COLOR="#435e98" CREATED="1541545933006" FOLDED="true" ID="ID_1850412206" MODIFIED="1557498707234" TEXT="t&#xfc;ckisches Problem">
<node COLOR="#435e98" CREATED="1541545933006" FOLDED="true" ID="ID_1850412206" MODIFIED="1560172942629" TEXT="t&#xfc;ckisches Problem">
<linktarget COLOR="#c9876a" DESTINATION="ID_1850412206" ENDARROW="Default" ENDINCLINATION="49;-155;" ID="Arrow_ID_1571993328" SOURCE="ID_787025622" STARTARROW="None" STARTINCLINATION="-11;173;"/>
<linktarget COLOR="#c9876a" DESTINATION="ID_1850412206" ENDARROW="Default" ENDINCLINATION="369;179;" ID="Arrow_ID_1229280605" SOURCE="ID_659707505" STARTARROW="None" STARTINCLINATION="586;-203;"/>
<icon BUILTIN="messagebox_warning"/>
@ -22879,10 +22929,13 @@
</node>
<node CREATED="1538956703435" ID="ID_275497582" MODIFIED="1557498707234" TEXT="Timeline">
<node CREATED="1538956945754" ID="ID_1216887436" MODIFIED="1557498707234" TEXT="&quot;name&quot;"/>
<node CREATED="1538956717369" ID="ID_21520084" MODIFIED="1557498707234" TEXT="&quot;fork&quot; = Track"/>
<node CREATED="1538956717369" ID="ID_21520084" MODIFIED="1560172967031" TEXT="&quot;fork&quot; = Track">
<arrowlink DESTINATION="ID_1319425167" ENDARROW="Default" ENDINCLINATION="-1;-52;" ID="Arrow_ID_1260691192" STARTARROW="None" STARTINCLINATION="-79;17;"/>
</node>
<node CREATED="1538956709026" ID="ID_326010297" MODIFIED="1557498707234" TEXT="Sequence{Marker}"/>
</node>
<node CREATED="1538956769298" ID="ID_1319425167" MODIFIED="1557498707234" TEXT="Track">
<node CREATED="1538956769298" ID="ID_1319425167" MODIFIED="1560172967031" TEXT="Track">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1319425167" ENDARROW="Default" ENDINCLINATION="-1;-52;" ID="Arrow_ID_1260691192" SOURCE="ID_21520084" STARTARROW="None" STARTINCLINATION="-79;17;"/>
<node CREATED="1538956775249" ID="ID_1811758034" MODIFIED="1557498707234" TEXT="Sequence{Track}">
<node CREATED="1538957049292" ID="ID_1618683787" MODIFIED="1557498707234" TEXT="if typeID = &quot;Fork&quot;"/>
<node CREATED="1544846114433" ID="ID_1306886572" MODIFIED="1557498707234" TEXT="die Sub-Tracks">
@ -22895,7 +22948,8 @@
<node CREATED="1538956802701" ID="ID_840384156" MODIFIED="1557498707234" TEXT="Sequence{Marker}">
<node CREATED="1538957049292" ID="ID_1955645432" MODIFIED="1557498707234" TEXT="if typeID = &quot;Marker&quot;"/>
</node>
<node CREATED="1544839585279" ID="ID_1083901292" MODIFIED="1557498707234" TEXT="Sequence{Ruler}">
<node CREATED="1544839585279" ID="ID_1083901292" MODIFIED="1560173044668" TEXT="Sequence{Ruler}">
<arrowlink DESTINATION="ID_433238862" ENDARROW="Default" ENDINCLINATION="-37;-96;" ID="Arrow_ID_472987279" STARTARROW="None" STARTINCLINATION="-69;14;"/>
<linktarget COLOR="#5f84b0" DESTINATION="ID_1083901292" ENDARROW="Default" ENDINCLINATION="-756;-82;" ID="Arrow_ID_1167484185" SOURCE="ID_43593052" STARTARROW="None" STARTINCLINATION="-981;0;"/>
<node CREATED="1544846037083" ID="ID_667362504" MODIFIED="1557498707234" TEXT="if typeID = &quot;Ruler&quot;"/>
<node CREATED="1544846062288" ID="ID_855083299" MODIFIED="1557498707234" TEXT="storage direkt (nested) im TrackBody"/>
@ -22912,8 +22966,9 @@
<node CREATED="1538957049292" ID="ID_98299428" MODIFIED="1557498707234" TEXT="if typeID = &quot;Marker&quot;"/>
</node>
</node>
<node CREATED="1544840312839" ID="ID_433238862" MODIFIED="1557498707234" TEXT="Ruler">
<node CREATED="1544840312839" ID="ID_433238862" MODIFIED="1560173044668" TEXT="Ruler">
<linktarget COLOR="#3e63c5" DESTINATION="ID_433238862" ENDARROW="Default" ENDINCLINATION="-612;-125;" ID="Arrow_ID_1858329997" SOURCE="ID_1391546845" STARTARROW="None" STARTINCLINATION="-747;0;"/>
<linktarget COLOR="#a9b4c1" DESTINATION="ID_433238862" ENDARROW="Default" ENDINCLINATION="-37;-96;" ID="Arrow_ID_472987279" SOURCE="ID_1083901292" STARTARROW="None" STARTINCLINATION="-69;14;"/>
<node CREATED="1544840455429" ID="ID_1283986005" MODIFIED="1557498707234" TEXT="&quot;timecode&quot; = formatID"/>
<node CREATED="1544840496225" ID="ID_230755841" MODIFIED="1557498707234" TEXT="&quot;contentFormat&quot; = formatID (none|pivot|frames|wave|synopsis)"/>
<node CREATED="1544840634822" ID="ID_1138129422" MODIFIED="1557498707234" TEXT="Sequence{Marker.kind}">
@ -41262,7 +41317,7 @@
</node>
</node>
</node>
<node CREATED="1541547600640" HGAP="79" ID="ID_659707505" MODIFIED="1557498707237" TEXT="Element-IDs m&#xfc;ssen eindeutig sein" VSHIFT="10">
<node CREATED="1541547600640" HGAP="79" ID="ID_659707505" MODIFIED="1560172942629" TEXT="Element-IDs m&#xfc;ssen eindeutig sein" VSHIFT="10">
<arrowlink COLOR="#c9876a" DESTINATION="ID_1850412206" ENDARROW="Default" ENDINCLINATION="369;179;" ID="Arrow_ID_1229280605" STARTARROW="None" STARTINCLINATION="586;-203;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1541547743885" ID="ID_1112550435" MODIFIED="1557498707237" TEXT="wegen UI-Bus-Routing"/>