Timeline: filter to select the pinned prefix part of the profile

...when rendering this part, which shall be always visible.
And the rest of the profile needs to be rendered into a second canvas,
which is placed within a pane with scrollbar.

Implemented as a statefull iterator filter
This commit is contained in:
Fischlurch 2019-06-21 23:18:44 +02:00
parent ac3f1d8bef
commit 06163f6016
4 changed files with 183 additions and 245 deletions

View file

@ -42,18 +42,15 @@
// 10/18 - investigate insidious reinterpret cast
// 12/18 - investigate the trinomial random number algorithm from the C standard lib
// 04/19 - forwarding tuple element(s) to function invocation
// 06/19 - use a statefull counting filter in a treeExplorer pipeline
/** @file try.cpp
* Research how to apply a tuple to a varargs function forwarder.
* The recent standard library has a std::apply, which we can not yet use, unfortunately.
* @note this research remains inconclusive. As far as I can see, the simplified setup
* exactly mimics the problematic call situation; however, in the real use case,
* we need to std::forward<Args> the argument tuple object field while here in
* this simplified case, it compiles just fine without -- as it should after all,
* since that is the whole point of perfect forwarding; std::get should expose
* a LValue reference to the tuple element, and we pass that through a forwarding
* function into the double dispatch to the receiving visitor.
* How to pick a configurable prefix segment from an iterable sequence.
* Instead of using a classic indexed for loop, the same effect can be achieved
* through a statefull filter functor in a `treeExplore()`-pipeline; after full
* optimisation I'd expect even to get the same assembly as from an equivalent
* hand written for loop. (Caveat: debug builds will be bloated)
*/
typedef unsigned int uint;
@ -61,17 +58,13 @@ typedef unsigned int uint;
#include "lib/format-cout.hpp"
#include "lib/test/test-helper.hpp"
#include "lib/util.hpp"
#include "lib/verb-visitor.hpp"
#include "lib/meta/variadic-helper.hpp"
#include "lib/iter-tree-explorer.hpp"
#include <utility>
#include <string>
#include <tuple>
#include <vector>
using lib::Literal;
using std::string;
using std::tuple;
@ -80,219 +73,37 @@ using std::tuple;
#define SHOW_EXPR(_XX_) \
cout << "Probe " << STRINGIFY(_XX_) << " ? = " << _XX_ <<endl;
template<typename FUN, typename...ARGS>
void
forwardInvoker (FUN& fun, ARGS&&... args)
template<class IT>
auto
selectSeg(IT&& it, bool useFirst)
{
cout << "forwardInvoker...\n"
<< lib::test::showVariadicTypes(args...)
<< endl;
fun (std::forward<ARGS>(args)...);
}
template<typename FUN, typename...ARGS>
struct Holder
{
using Args = tuple<ARGS...>;
Args tup;
Holder (Args& tup)
: tup{tup}
{ }
template<size_t...idx>
void
unpack_and_forward (FUN& fun, lib::meta::IndexSeq<idx...>)
{
cout << "unpack_and_forward...\n";
SHOW_TYPE (Args)
forwardInvoker (fun, std::get<idx> (tup)...);
}
void
applyTuple (FUN& fun)
{
cout << "applyTuple...\n";
SHOW_TYPE (Args)
using SequenceIterator = typename lib::meta::BuildIdxIter<ARGS...>::Ascending;
unpack_and_forward (fun, SequenceIterator());
}
};
///////////////////////////TODO : Debugging
struct Trackr
{
size_t num;
Trackr (size_t val)
: num(val)
struct CountingFilter
{
cout <<"Trackr("<<val<<")"<<endl;
}
~Trackr()
{
cout <<"~Trackr("<<num<<")"<<endl;
}
Trackr (Trackr const& lval)
: num(lval.num)
{
cout <<"Trackr()<<-LVal"<<endl;
}
Trackr (Trackr && rval)
: num(rval.num)
{
cout <<"Trackr()<<-RVal"<<endl;
}
Trackr&
operator= (Trackr const& orig)
{
cout <<"Tracker = orig"<<endl;
num = orig.num;
return *this;
}
};
///////////////////////////TODO : Debugging
struct Receiver
{
void
grrrn (uint& x, Trackr y)
{
cout <<"grrrn()..."<< x<<"*Trckr("<<y.num<<")="<<(x*y.num)<<endl;
}
};
template<class REC, class SIG>
struct Hodler;
template<class REC, class RET, typename... ARGS>
struct Hodler<REC, RET(ARGS...)>
{
typedef RET (REC::*Handler) (ARGS...);
Handler handler_;
using Verb = lib::VerbToken<REC,RET(ARGS...)>;
using Args = std::tuple<ARGS...>;
/** meta-sequence to pick argument values from the storage tuple */
using SequenceIterator = typename lib::meta::BuildIdxIter<ARGS...>::Ascending;
Verb verb_;
Args args_;
// Hodler (typename Verb::Handler handlerRef, Literal verbID, ARGS&&... args)
Hodler (Handler handlerRef, Literal verbID, ARGS&&... args)
: handler_{handlerRef}
, verb_{handlerRef, verbID}
, args_{std::forward<ARGS> (args)...}
{ }
RET
applyTo (REC& receiver)
{
return invokeVerb (receiver, SequenceIterator());
}
template<size_t...idx>
RET
invokeVerb (REC& receiver, lib::meta::IndexSeq<idx...>)
{ //////////////////////////////////////////TICKET #1006 | TICKET #1184 why do we need std::forward here? the target is a "perfect forwarding" function, which should be able to receive a LValue reference to the tuple element just fine...
// lib::test::TypeDebugger<Args> buggy;
// return verb_.applyTo (receiver, std::get<idx> (std::forward<Args>(args_))...); /// <<------------this compiles, but consumes the tuple's content (move init)
// return verb_.applyTo (receiver, std::get<idx> (args_)...);
// return (receiver.*handler_)(std::get<idx> (args_)...); /// <<------------this works
// return applyToVerb (receiver, std::get<idx> (args_)...);
// return getVerbFun(receiver) (std::get<idx> (args_)...); /// <<------------this compiles, but creates a spurious copy
return verb_.applyTo (receiver, forwardElm<idx> (args_)...); /// <<------------this compiles, but consumes the tuple's content (move init)
}
template<size_t idx>
using TupleElmType = typename std::tuple_element<idx, Args>::type;
template<size_t idx>
// std::remove_reference_t<decltype(std::get<idx> (args))>&&
TupleElmType<idx>&&
forwardElm (Args& args)
{
using ElmRef = decltype(std::get<idx> (args));
using Elm = std::remove_reference_t<TupleElmType<idx>>;
int cnt;
bool useFirst;
return std::forward<TupleElmType<idx>> (std::get<idx> (args));
}
RET
applyToVerb (REC& receiver, ARGS&& ...args)
{
// REQUIRE ("NIL" != token_);
return (receiver.*handler_)(std::forward<ARGS>(args)...);
}
// std::function<RET(ARGS...)>
decltype(auto)
getVerbFun(REC& receiver)
{
return [&](ARGS...args) -> RET
{
return (receiver.*handler_)(std::forward<ARGS>(args)...);
};
}
};
using lib::meta::Yes_t;
using lib::meta::No_t;
META_DETECT_FUNCTION(void, cloneInto, (void*) const);
META_DETECT_FUNCTION_NAME(cloneInto);
bool
operator() (...)
{
bool isPrefixPart = 0 < cnt--;
return useFirst? isPrefixPart : not isPrefixPart;
}
};
return lib::treeExplore(std::forward<IT> (it))
.filter(CountingFilter{50, useFirst});
}
int
main (int, char**)
{
auto tup = std::make_tuple(1,2,3);
auto fun = [](int a, int b, int c)
{
cout << a<<"+"<<b<<"+"<<c<<"="<<(a+b+c)<<endl;
};
using Hol = Holder<decltype(fun), int, int, int>;
Hol holder(tup);
holder.applyTuple (fun);
uint zwo{2};
std::tuple<uint&, Trackr> trp{zwo,Trackr(3)};
auto frn = [](uint& x, Trackr y)
{
cout << x<<"*Trckr("<<y.num<<")="<<(x*y.num)<<endl;
};
using Hrl = Holder<decltype(frn), uint&, Trackr>;
Hrl hrlder(trp);
hrlder.applyTuple (frn);
cout << "\n.ulps.\n";
Hodler<Receiver, void(uint&,Trackr)> holyh(&Receiver::grrrn, "holyhandgrenade", zwo, Trackr(5));
Receiver recy;
// recy.grrrn (std::get<0>(trp), Trackr(5));
holyh.applyTo (recy);
cout << "---Types---"<<endl;
using BussI = lib::VerbInvoker<Receiver, void>;
using CloneI = lib::polyvalue::CloneValueSupport<lib::polyvalue::EmptyBase>;
SHOW_TYPE(BussI);
SHOW_EXPR (lib::polyvalue::exposes_CloneFunction<BussI>::value)
SHOW_EXPR (HasFunSig_cloneInto<BussI>::value)
SHOW_EXPR (HasFunSig_cloneInto<CloneI>::value)
SHOW_EXPR (HasFunName_cloneInto<BussI>::value)
SHOW_EXPR (HasFunName_cloneInto<CloneI>::value)
using BussP = decltype(&BussI::cloneInto);
SHOW_TYPE(BussP)
using VecN = std::vector<int>;
VecN numz{1,1,2,3,5,8,13,21};
for (auto& elm : selectSeg(numz, false))
cout << elm<<"::";
for (auto& elm : selectSeg(numz, true))
cout << elm<<"::";
cout << "\n.gulp.\n";
return 0;

View file

@ -220,8 +220,7 @@ namespace timeline {
return [&](CairoC cox)
{
PINT concreteRenderScheme{cox, layout};
/////////////////////////////////////////////////////////////////////////////////TICKET #1039 : find out a way how to select the header/body part of the profile!
getProfile().performWith (concreteRenderScheme);
getProfile().performWith (concreteRenderScheme, isRuler);
};
}

View file

@ -41,6 +41,7 @@
#include "stage/gtk-base.hpp"
#include "lib/verb-visitor.hpp"
#include "lib/iter-tree-explorer.hpp"
#include "lib/symbol.hpp"
#include "lib/util.hpp"
@ -110,6 +111,10 @@ namespace timeline {
slopeVerb.applyTo (interpreter);
}
void performWith (ProfileInterpreter& interpreter, bool selectRuler);
private:/* ===== Internals: handling tokens ===== */
template<typename FUN, typename...ARGS>
@ -151,12 +156,6 @@ namespace timeline {
append_close (1);
}
uint
getPinnedPrefixCnt()
{
return firstEntryIs("prelude")? elements.front().accessArg<uint>() : 0;
}
private:
bool
firstEntryIs (Literal expectedToken)
@ -180,8 +179,57 @@ namespace timeline {
++ slopeDepth;
}
int
getPinnedPrefixCnt()
{
return firstEntryIs("prelude")? elements.front().accessArg<uint>() : 0;
}
auto
filterSegment(bool selectPrefixPart)
{
struct CountingFilter
{
int cnt;
bool selectPrefix;
bool
operator() (...)
{
bool isPrefixPart = 0 < cnt--;
return selectPrefix? isPrefixPart : not isPrefixPart;
}
};
return lib::treeExplore(elements)
.filter(CountingFilter{getPinnedPrefixCnt(), selectPrefixPart});
}
};
/**
* A variation of standard evaluation, only rendering one segment of the profile.
* The `prelude` verb defines a special _prefix part_ of the track profile, which
* is assumed to correspond to the timecode ruler tracks. These special _overview_
* tracks are rendered _always visible_ at the top of the timeline, even when scrolling
* down on large arrangements with several tracks. Effectively this means we have to
* split the TrackProfile into two segments, which are to be rendered within two
* distinct TimelineCanvas widgets (the first one always on top, while the second one
* with the actual track content is shown within pane with scrollbars).
* @param selectRuler decide if this evaluation shall render the overview rulers
* (when given `true`) or alternatively the remaining standard body
* part of the timeline (when given `false`).
*/
inline void
TrackProfile::performWith (ProfileInterpreter& interpreter, bool selectRuler)
{
for (auto& slopeVerb : filterSegment(selectRuler))
slopeVerb.applyTo (interpreter);
}
}}// namespace stage::timeline
#endif /*STAGE_TIMELINE_TRACK_PROFILE_H*/

View file

@ -16671,7 +16671,7 @@
<node COLOR="#338800" CREATED="1539270786646" ID="ID_1019344552" MODIFIED="1557498707221" TEXT="delegierenden Mutator implementieren">
<icon BUILTIN="button_ok"/>
<node CREATED="1539270801572" ID="ID_1535443502" MODIFIED="1557498707221" TEXT="f&#xfc;r InteractionDirector">
<node CREATED="1539270491013" ID="ID_1136748343" MODIFIED="1557498707221" TEXT="Problem der korrekten Diff-Struktur">
<node CREATED="1539270491013" ID="ID_1136748343" MODIFIED="1561140449209" TEXT="Problem der korrekten Diff-Struktur">
<arrowlink COLOR="#cbada9" DESTINATION="ID_1555798999" ENDARROW="Default" ENDINCLINATION="1069;-129;" ID="Arrow_ID_46239762" STARTARROW="None" STARTINCLINATION="-474;40;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
@ -18018,7 +18018,7 @@
</node>
<node CREATED="1480723110777" HGAP="24" ID="ID_1197860604" MODIFIED="1557498707224" TEXT="Kontrollstruktur" VSHIFT="7">
<icon BUILTIN="pencil"/>
<node CREATED="1480723136861" ID="ID_839909208" MODIFIED="1557498707224" TEXT="Einstiegspunkt">
<node CREATED="1480723136861" ID="ID_839909208" MODIFIED="1561151251774" TEXT="Einstiegspunkt">
<arrowlink COLOR="#8d8ba5" DESTINATION="ID_1295897045" ENDARROW="Default" ENDINCLINATION="296;-456;" ID="Arrow_ID_150397161" STARTARROW="None" STARTINCLINATION="1056;0;"/>
<node CREATED="1480723144188" ID="ID_420419439" MODIFIED="1557498707224" TEXT="TimelineWidget"/>
<node CREATED="1480723148572" ID="ID_1331974915" MODIFIED="1557498707224" TEXT="wirklich">
@ -19241,7 +19241,8 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1561047338983" ID="ID_608382986" MODIFIED="1561047362267" TEXT="wie werden &#xc4;nderungen dieser realisiert?">
<icon BUILTIN="help"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1561048744043" ID="ID_1401239177" MODIFIED="1561048756692" TEXT="Konzept kl&#xe4;ren">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1561048744043" ID="ID_1401239177" MODIFIED="1561140347286" TEXT="Konzept kl&#xe4;ren">
<linktarget COLOR="#b13064" DESTINATION="ID_1401239177" ENDARROW="Default" ENDINCLINATION="363;61;" ID="Arrow_ID_807164253" SOURCE="ID_1143074852" STARTARROW="None" STARTINCLINATION="1263;0;"/>
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1561048792468" ID="ID_638394722" MODIFIED="1561048797689" TEXT="#1199 handle Timeline layout changes">
<icon BUILTIN="flag-yellow"/>
@ -20619,9 +20620,9 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560175646834" ID="ID_585934033" MODIFIED="1560442420666" TEXT="Selektor f&#xfc;r den relevanten Teil des Profils">
<node COLOR="#338800" CREATED="1560175646834" ID="ID_585934033" MODIFIED="1561150742874" TEXT="Selektor f&#xfc;r den relevanten Teil des Profils">
<linktarget COLOR="#235691" DESTINATION="ID_585934033" ENDARROW="Default" ENDINCLINATION="-259;-8;" ID="Arrow_ID_975721855" SOURCE="ID_1448105245" STARTARROW="Default" STARTINCLINATION="168;-53;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1560442117286" ID="ID_1565882906" MODIFIED="1560442234529" TEXT="wir haben jetzt zwei Canvas">
<icon BUILTIN="info"/>
<node CREATED="1560442238349" ID="ID_1013135995" MODIFIED="1560442245202" TEXT="Overview-Ruler (always on top)"/>
@ -20712,6 +20713,60 @@
<node CREATED="1560618449106" ID="ID_450355502" MODIFIED="1560618479666" TEXT="undurchdringbar verworren">
<icon BUILTIN="broken-line"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1561150468059" ID="ID_725781646" MODIFIED="1561151353967" TEXT="mu&#xdf; wohl letztlich irgendwie aus der Session kommen">
<arrowlink COLOR="#ce7c94" DESTINATION="ID_1443277448" ENDARROW="Default" ENDINCLINATION="509;0;" ID="Arrow_ID_1589685813" STARTARROW="None" STARTINCLINATION="296;0;"/>
<icon BUILTIN="bell"/>
</node>
</node>
<node COLOR="#338800" CREATED="1561150497032" ID="ID_617550585" MODIFIED="1561150736047" TEXT="Aufspalten des Profils">
<icon BUILTIN="button_ok"/>
<node CREATED="1561150521519" ID="ID_1498693390" MODIFIED="1561150537509" TEXT="Schei...">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="smiley-angry"/>
<node CREATED="1561150540851" ID="ID_490080987" MODIFIED="1561150545451" TEXT="noch eine Komplexit&#xe4;t"/>
</node>
<node CREATED="1561150547674" ID="ID_1791753235" MODIFIED="1561150564863" TEXT="naja, eigentlich nur noch einen Z&#xe4;hler in die For-Loop einbauen"/>
<node CREATED="1561150569779" ID="ID_1587537475" MODIFIED="1561150583155" TEXT="ich will aber den Standardfall irgendwie erhalten">
<node CREATED="1561150585582" ID="ID_791249238" MODIFIED="1561150668295" TEXT="und sei es blo&#xdf; zur Dokumentation">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
d.h. ich will den Standardfall als Standardfall sichtbar haben,
</p>
<p>
und dann diese zus&#228;tzliche Filterung oben drauf pflanzen
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1561150616496" ID="ID_942796141" MODIFIED="1561150627953" TEXT="also irgendwie noch einen Dekorator bauen??">
<icon BUILTIN="button_cancel"/>
</node>
</node>
<node COLOR="#338800" CREATED="1561150669160" ID="ID_1043420247" MODIFIED="1561150734271" TEXT="L&#xf6;sung mit einem Iterator-Filter">
<icon BUILTIN="button_ok"/>
<node CREATED="1561150688515" ID="ID_1217282542" MODIFIED="1561150695224" TEXT="stateful counting Filter geht doch..."/>
<node CREATED="1561150696094" ID="ID_1756846313" MODIFIED="1561150726654" TEXT="sollte am Ende genauso effizient sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
als ob es darauf ank&#228;me...
</p>
<p>
Hauptsache, keine zus&#228;tzliche Speicher-Allokation
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
</node>
</node>
@ -20761,9 +20816,11 @@
<node CREATED="1560618694269" ID="ID_1133842596" MODIFIED="1560618694932" TEXT="der TrackBody-Struktur"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560687839463" ID="ID_1827462767" MODIFIED="1560687897342" TEXT="wer bewirkt diesen Aufbau?">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560687839463" ID="ID_1827462767" MODIFIED="1561140522795" TEXT="wer bewirkt diesen Aufbau?">
<arrowlink COLOR="#a394b6" DESTINATION="ID_1098160043" ENDARROW="Default" ENDINCLINATION="-688;15;" ID="Arrow_ID_1886446261" STARTARROW="None" STARTINCLINATION="442;0;"/>
<arrowlink COLOR="#9a6ea1" DESTINATION="ID_453891028" ENDARROW="Default" ENDINCLINATION="227;0;" ID="Arrow_ID_1574621169" STARTARROW="None" STARTINCLINATION="227;0;"/>
<icon BUILTIN="help"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1560687908668" ID="ID_1449365398" MODIFIED="1560687970291" TEXT="sp&#xe4;testens onDraw() mu&#xdf; es da sein...">
<node COLOR="#435e98" CREATED="1560687908668" ID="ID_1449365398" MODIFIED="1561140382981" TEXT="sp&#xe4;testens onDraw() mu&#xdf; es da sein...">
<icon BUILTIN="idea"/>
<node CREATED="1560688238047" ID="ID_228690289" MODIFIED="1560698414957" TEXT="L&#xf6;sung-1 : refresh/rebuild im Aufruf">
<icon BUILTIN="button_cancel"/>
@ -20792,17 +20849,19 @@
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node CREATED="1560618895535" ID="ID_1961154233" MODIFIED="1560688445449" TEXT="L&#xf6;sung-2 : rebuild bei Struktur&#xe4;nderung">
<node CREATED="1560618895535" ID="ID_1961154233" MODIFIED="1561140376217" TEXT="L&#xf6;sung-2 : rebuild bei Struktur&#xe4;nderung">
<linktarget COLOR="#795ea0" DESTINATION="ID_1961154233" ENDARROW="Default" ENDINCLINATION="-24;56;" ID="Arrow_ID_1097113138" SOURCE="ID_1716935157" STARTARROW="None" STARTINCLINATION="150;0;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1560698425620" ID="ID_620629162" MODIFIED="1560698443221" TEXT="hierf&#xfc;r fehlt noch komplett die Infrastuktur"/>
<node CREATED="1560698444169" ID="ID_1929184570" MODIFIED="1560698455499" TEXT="wir bauen bisher nur Sub-Widgets auf"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1561049066764" ID="ID_1132615828" MODIFIED="1561049077241" TEXT="Aufbau on-demand">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1561049066764" ID="ID_1132615828" MODIFIED="1561140354363" TEXT="Aufbau on-demand">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1561049080043" ID="ID_1865072728" MODIFIED="1561049150441" TEXT="signalStructureChange leert das Profil">
<arrowlink COLOR="#89adc8" DESTINATION="ID_1799554074" ENDARROW="Default" ENDINCLINATION="340;0;" ID="Arrow_ID_19787354" STARTARROW="None" STARTINCLINATION="1589;0;"/>
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1561049195744" ID="ID_795602177" MODIFIED="1561049204230" TEXT="Zugriff der Renderer auf das Profil">
<node COLOR="#338800" CREATED="1561049195744" ID="ID_795602177" MODIFIED="1561140362229" TEXT="Zugriff der Renderer auf das Profil">
<icon BUILTIN="button_ok"/>
<node CREATED="1561049205709" ID="ID_87098848" MODIFIED="1561049213673" TEXT="bisher direkte Referenz">
<icon BUILTIN="button_cancel"/>
</node>
@ -20832,8 +20891,16 @@
</richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1561139978982" ID="ID_1098160043" MODIFIED="1561139990042" TEXT="doch in den Layout-Manager verschieben?">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1561139978982" ID="ID_1098160043" MODIFIED="1561140431874" TEXT="doch in den Layout-Manager verschieben?">
<linktarget COLOR="#a394b6" DESTINATION="ID_1098160043" ENDARROW="Default" ENDINCLINATION="-688;15;" ID="Arrow_ID_1886446261" SOURCE="ID_1827462767" STARTARROW="None" STARTINCLINATION="442;0;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1561140197469" ID="ID_198072463" MODIFIED="1561140213679" TEXT="Nachteil: der mu&#xdf; dann von der TrackBody-Struktur wissen"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1561140221999" ID="ID_1143074852" MODIFIED="1561140347286" TEXT="es sei denn...">
<arrowlink COLOR="#b13064" DESTINATION="ID_1401239177" ENDARROW="Default" ENDINCLINATION="363;61;" ID="Arrow_ID_807164253" STARTARROW="None" STARTINCLINATION="1263;0;"/>
<icon BUILTIN="hourglass"/>
<node CREATED="1561140235537" ID="ID_633845025" MODIFIED="1561140252066" TEXT="da&#xdf; das gar nicht Aufgabe der TrackBody-Struktur w&#xe4;re,"/>
<node CREATED="1561140254165" ID="ID_1265373483" MODIFIED="1561140267869" TEXT="bzw. dies anders aufgeh&#xe4;ngt und aktualisiert w&#xfc;rde"/>
</node>
</node>
</node>
</node>
@ -20848,7 +20915,8 @@
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1560618715494" ID="ID_453891028" MODIFIED="1560618729609" TEXT="wer verwaltet das TrackProfil?">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1560618715494" ID="ID_453891028" MODIFIED="1561140513713" TEXT="wer verwaltet das TrackProfil?">
<linktarget COLOR="#9a6ea1" DESTINATION="ID_453891028" ENDARROW="Default" ENDINCLINATION="227;0;" ID="Arrow_ID_1574621169" SOURCE="ID_1827462767" STARTARROW="None" STARTINCLINATION="227;0;"/>
<icon BUILTIN="help"/>
<node CREATED="1560618780573" ID="ID_1295221704" MODIFIED="1560619724431" TEXT="naheliegend: das BodyCanvasWidget selber">
<icon BUILTIN="forward"/>
@ -20939,7 +21007,14 @@
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1554995841966" ID="ID_1443277448" MODIFIED="1557498707229" TEXT="genaue Rolle der Session??">
<node CREATED="1561151742029" ID="ID_857875045" MODIFIED="1561151755207" TEXT="repr&#xe4;sentiert als Ruler des top-level-Track"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1561151772593" ID="ID_1142063549" MODIFIED="1561151789167" TEXT="aber die Zahl der Pr&#xe4;fix-Elemente mu&#xdf; korrekt eingesetzt werden">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1554995841966" ID="ID_1443277448" MODIFIED="1561151658998" TEXT="genaue Rolle der Session??">
<linktarget COLOR="#ce7c94" DESTINATION="ID_1443277448" ENDARROW="Default" ENDINCLINATION="509;0;" ID="Arrow_ID_1589685813" SOURCE="ID_725781646" STARTARROW="None" STARTINCLINATION="296;0;"/>
<linktarget COLOR="#ce7c94" DESTINATION="ID_1443277448" ENDARROW="Default" ENDINCLINATION="509;0;" ID="Arrow_ID_1860575220" SOURCE="ID_790305134" STARTARROW="None" STARTINCLINATION="296;0;"/>
<linktarget COLOR="#337fe3" DESTINATION="ID_1443277448" ENDARROW="Default" ENDINCLINATION="-2069;0;" ID="Arrow_ID_934863827" SOURCE="ID_1520503504" STARTARROW="Default" STARTINCLINATION="-702;0;"/>
<icon BUILTIN="help"/>
</node>
</node>
@ -21175,7 +21250,7 @@
<node COLOR="#338800" CREATED="1554516438055" ID="ID_1490793853" MODIFIED="1557498707230" TEXT="open / close">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1554567321239" FOLDED="true" ID="ID_1638157583" MODIFIED="1557498707230" TEXT="prelude / coda">
<node COLOR="#338800" CREATED="1554567321239" FOLDED="true" ID="ID_1638157583" MODIFIED="1561151276838" TEXT="prelude / coda">
<icon BUILTIN="button_ok"/>
<node CREATED="1554567338981" ID="ID_1124816442" MODIFIED="1554567365787" TEXT="damit der Display-Code da was Spezielles machen kann..."/>
</node>
@ -21214,6 +21289,10 @@
</node>
<node CREATED="1554516951713" ID="ID_318462518" MODIFIED="1557498707230" TEXT="Verben (rekursiv) generieren">
<node CREATED="1554516977204" ID="ID_305770947" MODIFIED="1557498707230" TEXT="Ruler"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1561150468059" ID="ID_790305134" MODIFIED="1561151468663" TEXT="fixed Overview Ruler steuern">
<arrowlink COLOR="#ce7c94" DESTINATION="ID_1443277448" ENDARROW="Default" ENDINCLINATION="509;0;" ID="Arrow_ID_1860575220" STARTARROW="None" STARTINCLINATION="296;0;"/>
<icon BUILTIN="bell"/>
</node>
<node CREATED="1554516979454" ID="ID_508239889" MODIFIED="1557498707230" TEXT="Gaps handhaben"/>
<node CREATED="1554516984485" ID="ID_351302473" MODIFIED="1557498707230" TEXT="Content">
<icon BUILTIN="hourglass"/>
@ -22982,7 +23061,7 @@
<node CREATED="1488423428942" ID="ID_1847992077" MODIFIED="1557498707233" TEXT="Stop"/>
</node>
<node CREATED="1488423436478" ID="ID_1037695008" MODIFIED="1557498707233" TEXT="Einstieg">
<node CREATED="1488423440629" ID="ID_1295897045" MODIFIED="1557498707233" TEXT="in Timeline">
<node CREATED="1488423440629" ID="ID_1295897045" MODIFIED="1561151251774" TEXT="in Timeline">
<linktarget COLOR="#8d8ba5" DESTINATION="ID_1295897045" ENDARROW="Default" ENDINCLINATION="296;-456;" ID="Arrow_ID_150397161" SOURCE="ID_839909208" STARTARROW="None" STARTINCLINATION="1056;0;"/>
<node CREATED="1488423569203" ID="ID_1753722831" MODIFIED="1557498707233" TEXT="TimelinePane anzeigen">
<linktarget COLOR="#a1543e" DESTINATION="ID_1753722831" ENDARROW="Default" ENDINCLINATION="1150;-267;" ID="Arrow_ID_912757548" SOURCE="ID_292894978" STARTARROW="None" STARTINCLINATION="496;-77;"/>
@ -23455,7 +23534,8 @@
<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 CREATED="1560686038649" FOLDED="true" ID="ID_1520503504" MODIFIED="1560686343370" TEXT="pinned overview Rulers">
<node CREATED="1560686038649" FOLDED="true" ID="ID_1520503504" MODIFIED="1561151688909" TEXT="pinned overview Rulers">
<arrowlink COLOR="#337fe3" DESTINATION="ID_1443277448" ENDARROW="Default" ENDINCLINATION="-2069;0;" ID="Arrow_ID_934863827" STARTARROW="Default" STARTINCLINATION="-702;0;"/>
<linktarget COLOR="#486ebf" DESTINATION="ID_1520503504" ENDARROW="Default" ENDINCLINATION="-1443;0;" ID="Arrow_ID_312917871" SOURCE="ID_1236432450" STARTARROW="None" STARTINCLINATION="630;0;"/>
<node CREATED="1560686062574" ID="ID_250993855" MODIFIED="1560686076868" TEXT="Timecode und Marker-Anzeige"/>
<node CREATED="1560686051799" ID="ID_1555560276" MODIFIED="1560686061961" TEXT="auch bei vertikalem Scrolling immer sichtbar"/>
@ -41818,7 +41898,7 @@
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1539270417847" ID="ID_1555798999" MODIFIED="1557498707237" TEXT="korrekte Diff-Struktur">
<node CREATED="1539270417847" ID="ID_1555798999" MODIFIED="1561140449209" TEXT="korrekte Diff-Struktur">
<linktarget COLOR="#cbada9" DESTINATION="ID_1555798999" ENDARROW="Default" ENDINCLINATION="1069;-129;" ID="Arrow_ID_46239762" SOURCE="ID_1136748343" STARTARROW="None" STARTINCLINATION="-474;40;"/>
<linktarget COLOR="#d47366" DESTINATION="ID_1555798999" ENDARROW="Default" ENDINCLINATION="713;-263;" ID="Arrow_ID_971172326" SOURCE="ID_1387553695" STARTARROW="None" STARTINCLINATION="-1999;120;"/>
<linktarget COLOR="#d47366" DESTINATION="ID_1555798999" ENDARROW="Default" ENDINCLINATION="590;-127;" ID="Arrow_ID_308349501" SOURCE="ID_1435731309" STARTARROW="None" STARTINCLINATION="915;0;"/>