Clip: draft the decision logic for the clip presentation mode

This commit is contained in:
Fischlurch 2020-04-03 19:44:46 +02:00
parent cfa8e87931
commit 765d124fff
6 changed files with 263 additions and 31 deletions

View file

@ -155,6 +155,7 @@ namespace model {
using Hooked = ViewHooked<WID,BASE>;
using Canvas = CanvasHook<BASE>;
protected:
Canvas&
getCanvas()
{

View file

@ -159,6 +159,7 @@ namespace timeline {
target->buildMutator (buff);
return true;
}))
//-Diff-Change-Listener----------------
.onLocalChange ([this]()
{
this->resetAppearanceStyle();

View file

@ -88,13 +88,14 @@ namespace timeline {
unique_ptr<ClipDelegate> widget_;
/** default level of detail presentation desired for each clip.
* @note the actual appearance style is chosen based on this setting
* yet limited by the additional information necessary to establish
* a given level; e.g. name or content renderer must be available
/** default maximum level of detail presentation desired for each clip.
* @note the actual appearance style is chosen based on this setting, yet
* limited by the additional information necessary to establish a
* given level; e.g. name and content renderer must be available
* to allow for a detailed rendering of the clip in the timeline. */
static const ClipDelegate::Appearance defaultAppearance = ClipDelegate::COMPACT;
public:
ClipPresenter (ID, ctrl::BusTerm&, WidgetHook&, optional<Time> startTime);

View file

@ -41,7 +41,7 @@
//#include "lib/format-string.hpp"
//#include "lib/format-cout.hpp"
//#include "lib/util.hpp"
#include "lib/util.hpp"
//#include <algorithm>
//#include <vector>
@ -53,6 +53,7 @@
//using Gtk::Widget;
//using sigc::mem_fun;
//using sigc::ptr_fun;
using util::unConst;
//using std::cout;
//using std::endl;
using std::optional;
@ -77,8 +78,19 @@ namespace timeline {
namespace {// details of concrete clip appearance styles...
using WidgetHook = model::CanvasHook<Gtk::Widget>;
using HookedWidget = model::CanvasHooked<Gtk::Button, Gtk::Widget>; ///////////////////////////////////////////TICKET #1211 : need preliminary placeholder clip widget for timeline layout
using HookedWidget = model::CanvasHooked<Gtk::Button, Gtk::Widget>; ///////////////////////////////////////////TICKET #1211 : need preliminary placeholder clip widget for timeline layout
enum Mode { HIDDEN, SUMMARY, INDIVIDUAL };
inline Mode
classify (ClipDelegate::Appearance appearance)
{
return appearance < ClipDelegate::SYMBOLIC? HIDDEN
: appearance < ClipDelegate::ABRIDGED? SUMMARY
: INDIVIDUAL;
}
class ClipData
: public ClipDelegate
, util::NonCopyable
@ -87,28 +99,137 @@ namespace timeline {
/* === Interface ClipDelegate === */
Appearance
currentAppearance() const override
{
return Appearance::PENDING;
}
Appearance
changeAppearance (Appearance desired) override
{
return currentAppearance();
}
cuString
getClipName() const override
{
return "lala LOLO"; ///////////////////////////////////////////////////////////////TICKET #1038 : data storage; here : store the clip name/ID
}
Time
getStartTime() const override
{
return Time::NEVER; ///////////////////////////////////////////////////////////////TICKET #1038 : data storage; here : store the clip start time
}
WidgetHook&
getCanvas() const override
{
return unConst(this)->display_;
}
WidgetHook::Pos
establishHookPoint (WidgetHook* newView) const override
{
if (not newView)
newView = &display_;
return newView->hookedAt (getStartTime(), defaultOffsetY);
}
public:
ClipData(WidgetHook& displayAnchor)
: ClipDelegate{}
, display_{displayAnchor}
{ }
/** state switch ctor */
ClipData(ClipDelegate& existing)
: ClipDelegate{}
, display_{existing.getCanvas()}
{
TODO("copy further clip presentation properties");
}
};
class ClipWidget
: public HookedWidget
, public ClipDelegate
, util::NonCopyable
{
/* === Interface ClipDelegate === */
Appearance
currentAppearance() const override
{
///////////////////////////////////////////////////////////////////////////////////////TICKET #1038 : determine appearance style dynamically
return Appearance::COMPACT;
}
Appearance
changeAppearance (Appearance desired) override
{
///////////////////////////////////////////////////////////////////////////////////////TICKET #1038 : change possible appearance style dynamically
return currentAppearance();
}
cuString
getClipName() const override
{
return this->get_label();
}
Time
getStartTime() const override
{
return Time::NEVER; ///////////////////////////////////////////////////////////////TICKET #1038 : data storage; here : store the clip start time
}
WidgetHook&
getCanvas() const override
{
UNIMPLEMENTED("sort the base access out"); //return static_cast<HookedWidget&> (unConst(*this)).getCanvas();
}
WidgetHook::Pos
establishHookPoint (WidgetHook* newView) const override
{
if (not newView)
newView = &getCanvas();
return newView->hookedAt (getStartTime(), defaultOffsetY);
} ///////////////////////////////////////////////////////////////TICKET #1038 : TODO mostly duplicated implementation
public:
ClipWidget(WidgetHook::Pos hookPoint, uString clipName)
: HookedWidget{hookPoint, clipName}
, ClipDelegate{}
{ }
/** state switch ctor */
ClipWidget(ClipDelegate& existing, WidgetHook* newView)
: HookedWidget{existing.establishHookPoint(newView), existing.getClipName()}
, ClipDelegate{}
{
TODO("copy further clip presentation properties");
}
};
inline ClipDelegate*
buildDelegateFor (Mode newMode, ClipDelegate& existingDelegate, WidgetHook* newView =0)
{
switch (newMode)
{
case HIDDEN:
return new ClipData (existingDelegate);
case INDIVIDUAL:
return new ClipWidget (existingDelegate, newView);
case SUMMARY:
UNIMPLEMENTED ("Summary/Overview presentation style");
}
}
}//(End)clip appearance details.
@ -118,9 +239,20 @@ namespace timeline {
ClipDelegate::Appearance
ClipDelegate::switchAppearance (PDelegate& manager, Appearance desired, WidgetHook* newView)
{
UNIMPLEMENTED ("clip appearance style state management");
REQUIRE (manager, "pre-existing clip delegate required");
Mode curMode = classify (manager->currentAppearance());
Mode newMode = classify (desired);
if (newMode != curMode or newView)
{ // need to switch the clip delegate
PDelegate newState (buildDelegateFor (newMode, *manager, newView));
swap (manager, newState);
return manager->changeAppearance (desired);
}
else
return manager->changeAppearance (desired);
}
ClipDelegate::Appearance
ClipDelegate::buildDelegate (PDelegate& manager, WidgetHook& view, optional<Time> startTime)
{

View file

@ -136,7 +136,7 @@ namespace timeline {
ClipDelegate();
enum Appearance {PENDING, SYMBOLIC, ABRIDGED, COMPACT, EXPANDED, DEGRADED};
enum Appearance {PENDING, SYMBOLIC, DEGRADED, ABRIDGED, COMPACT, EXPANDED};
/** vertical offset below the track start */
@ -145,10 +145,31 @@ namespace timeline {
/** placeholder name -- typically overridden from the model */
static const string defaultName;
/** presentation mode and style currently employed */
virtual Appearance currentAppearance() const =0;
/** alter appearance style, to the degree possible for this delegate.
* @return the new #Appearance style acquired */
virtual Appearance changeAppearance (Appearance desired) =0;
/** human readable rendering of the clip's name or identity */
virtual cuString getClipName() const =0;
virtual Time getStartTime() const =0;
virtual WidgetHook& getCanvas() const =0;
/** (re)establish current canvas attachment coordinates,
* thereby possibly switching to a new canvas implementation
* @param newView (optional) new canvas; use existing if not given
* @return record defining the canvas and the coordinates thereon
*/
virtual WidgetHook::Pos establishHookPoint (WidgetHook* newView) const =0;
/** request to change the clip delegate's appearance style, if possible.
* @param manager entity to hold and maintain this specific appearance state.
* @param desired the intended style of mode to achieve
* @param desired the intended style or mode to acquire
* @param displayAnchor (optionally) a different view to hook up the delegate.
* @return the actual mode the presentation was switched to
* @remark switching the appearance style is a state transition; sometimes
@ -161,11 +182,11 @@ namespace timeline {
* with the current configuration.
* @note Default and fallback appearance style is `PENDING`, which turns the
* delegate into a mere data record without visual representation.
* @note whenever a ViewHook (instance) different than the existing one is
* given, the existing widget / delegate will be destroyed and
* @note whenever a WidgetHook (instance) different than the existing one
* is given, the existing widget / delegate will be destroyed and
* replaced by a suitable copy hooked up into the new display.
* The ctor #ClipDelegate(WidgetViewHook) ensures there is
* always a display_ (ViewHook) to refer to.
* The base ctor #ClipData(WidgetHook&) ensures there is
* always a display_ (WidgetHook) to refer to.
*/
static Appearance switchAppearance (PDelegate& manager,
Appearance desired =PENDING,

View file

@ -6746,7 +6746,7 @@
</node>
<node CREATED="1489191732869" ID="ID_1031180144" MODIFIED="1518487921062" TEXT="nicht sofort zu l&#xf6;sen"/>
<node CREATED="1489191744764" ID="ID_898481930" MODIFIED="1518487921062" TEXT="aber Grundlagen legen">
<arrowlink COLOR="#606d94" DESTINATION="ID_346158251" ENDARROW="Default" ENDINCLINATION="842;21;" ID="Arrow_ID_726918944" STARTARROW="None" STARTINCLINATION="1012;0;"/>
<arrowlink COLOR="#606d94" DESTINATION="ID_346158251" ENDARROW="Default" ENDINCLINATION="883;21;" ID="Arrow_ID_726918944" STARTARROW="None" STARTINCLINATION="1012;0;"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1492461289101" ID="ID_1507239589" MODIFIED="1518487921062" TEXT="Frage: Objekt-Referenzen">
@ -16696,7 +16696,7 @@
</node>
<node CREATED="1489777837120" ID="ID_466927949" MODIFIED="1557498707220" TEXT="Ort f&#xfc;r Command-Definitionen"/>
<node COLOR="#338800" CREATED="1489777846095" ID="ID_1401258681" MODIFIED="1575131582794" TEXT="Design Proc-Command-Framework vorantreiben">
<arrowlink COLOR="#352c7d" DESTINATION="ID_1622574347" ENDARROW="Default" ENDINCLINATION="-240;-3336;" ID="Arrow_ID_1512127407" STARTARROW="None" STARTINCLINATION="1996;0;"/>
<arrowlink COLOR="#352c7d" DESTINATION="ID_1622574347" ENDARROW="Default" ENDINCLINATION="-220;-3339;" ID="Arrow_ID_1512127407" STARTARROW="None" STARTINCLINATION="2016;0;"/>
<font NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="button_ok"/>
</node>
@ -19182,8 +19182,8 @@
</node>
</node>
<node COLOR="#338800" CREATED="1576757730509" FOLDED="true" ID="ID_1949130658" MODIFIED="1584932567087" TEXT="&#xbb;Widget-Position&#xab; heraus-abstrahieren">
<linktarget COLOR="#605bb8" DESTINATION="ID_1949130658" ENDARROW="Default" ENDINCLINATION="204;611;" ID="Arrow_ID_993970158" SOURCE="ID_1816490333" STARTARROW="None" STARTINCLINATION="299;12;"/>
<linktarget COLOR="#47cdcd" DESTINATION="ID_1949130658" ENDARROW="Default" ENDINCLINATION="-1150;77;" ID="Arrow_ID_662295339" SOURCE="ID_730955223" STARTARROW="None" STARTINCLINATION="877;53;"/>
<linktarget COLOR="#605bb8" DESTINATION="ID_1949130658" ENDARROW="Default" ENDINCLINATION="204;611;" ID="Arrow_ID_993970158" SOURCE="ID_1816490333" STARTARROW="None" STARTINCLINATION="299;12;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1576757867075" ID="ID_1947629675" MODIFIED="1576757891150" TEXT="der Themenkomplex &quot;move()&quot; steht isoliert da">
<icon BUILTIN="idea"/>
@ -22098,8 +22098,7 @@
da weit &#252;ber den Code verstreut
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1584888427300" ID="ID_1626398524" MODIFIED="1584888438510" TEXT="l&#xf6;st nicht das Problem mit dem re-Konstruieren"/>
<node CREATED="1584888442705" ID="ID_1729804708" MODIFIED="1584888451663" TEXT="unterst&#xfc;tzt keine nachtr&#xe4;glichen Anpassungen"/>
@ -23001,7 +23000,7 @@
</node>
</node>
<node CREATED="1575050510878" ID="ID_350484232" MODIFIED="1575580714937" TEXT="Basis ist vom Diff-System zu leisten">
<arrowlink COLOR="#624d7d" DESTINATION="ID_101148427" ENDARROW="Default" ENDINCLINATION="-3637;-782;" ID="Arrow_ID_1277214644" STARTARROW="None" STARTINCLINATION="2973;244;"/>
<arrowlink COLOR="#624d7d" DESTINATION="ID_101148427" ENDARROW="Default" ENDINCLINATION="-3637;-782;" ID="Arrow_ID_1277214644" STARTARROW="None" STARTINCLINATION="2954;247;"/>
<linktarget COLOR="#4d81bf" DESTINATION="ID_350484232" ENDARROW="Default" ENDINCLINATION="-77;-68;" ID="Arrow_ID_658076840" SOURCE="ID_932505699" STARTARROW="None" STARTINCLINATION="-201;12;"/>
<node COLOR="#338800" CREATED="1576168044826" ID="ID_1912653386" MODIFIED="1576441631231" TEXT="#1206 diff structure change listener">
<icon BUILTIN="button_ok"/>
@ -27951,8 +27950,7 @@
Nebenbei bemerkt: die Aktion mu&#223; <b>idempotent</b>&#160;sein
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
</node>
@ -27997,12 +27995,11 @@
wenn man das naiv coden w&#252;rde, dann w&#252;rden wir f&#252;r jeden Clip erst mal einen ClipData-Placeholder erzeugen, nur um dann, nach dem Empfangen des vollst&#228;ndigen Diff, diesen wieder zu deallozieren und daf&#252;r ein ClipWidget zu erzeugen...
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1584201841529" ID="ID_1310327519" MODIFIED="1584202923362" TEXT="Nebengedanke: Eigenheiten des Populations-Diff">
<arrowlink COLOR="#2e3f60" DESTINATION="ID_1634323626" ENDARROW="Default" ENDINCLINATION="-1672;80;" ID="Arrow_ID_1671674197" STARTARROW="None" STARTINCLINATION="-1515;90;"/>
<arrowlink COLOR="#2e3f60" DESTINATION="ID_1634323626" ENDARROW="Default" ENDINCLINATION="-1672;80;" ID="Arrow_ID_1671674197" STARTARROW="None" STARTINCLINATION="-1522;89;"/>
</node>
</node>
</node>
@ -28184,6 +28181,85 @@
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1584319635024" ID="ID_1833569495" MODIFIED="1584932955050" TEXT="Logik im Detail ausimplementieren">
<linktarget COLOR="#4768d0" DESTINATION="ID_1833569495" ENDARROW="Default" ENDINCLINATION="943;-75;" ID="Arrow_ID_416244548" SOURCE="ID_1737560927" STARTARROW="None" STARTINCLINATION="207;23;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1585012756014" HGAP="67" ID="ID_1256841575" MODIFIED="1585012768478" TEXT="konzeptionell...." VSHIFT="-6">
<node CREATED="1585012775180" HGAP="101" ID="ID_1578039290" MODIFIED="1585012804301" TEXT="Modus vs Stil" VSHIFT="13">
<node CREATED="1585012812495" ID="ID_112398937" MODIFIED="1585012828657" TEXT="Modus ist die grundlegende Form">
<node CREATED="1585012830612" ID="ID_1153727552" MODIFIED="1585012839351" TEXT="verborgen (Datencontainer)"/>
<node CREATED="1585012840187" ID="ID_313601159" MODIFIED="1585012848078" TEXT="individuelle Anzeige"/>
<node CREATED="1585012848975" ID="ID_1618567382" MODIFIED="1585012862104" TEXT="Teil einer &#xdc;bersichtsgraphik"/>
</node>
<node CREATED="1585012925784" ID="ID_1875100027" MODIFIED="1585012968430" TEXT="Modus entscheidet &#xfc;ber das Delegate"/>
<node CREATED="1585012969538" ID="ID_623305880" MODIFIED="1585012977855" TEXT="das Delegate entscheidet &#xfc;ber den Stil"/>
</node>
<node CREATED="1585013243486" HGAP="65" ID="ID_1462532047" MODIFIED="1585013261423" TEXT="Ordnung der Modi" VSHIFT="4">
<node CREATED="1585013262627" ID="ID_1902435778" MODIFIED="1585013271278" TEXT="ist nicht linear-parametrisch"/>
<node CREATED="1585013272098" ID="ID_1116174873" MODIFIED="1585013276773" TEXT="sondern eine Verzweigung">
<node CREATED="1585013324819" ID="ID_152773896" MODIFIED="1585013334819" TEXT="k&#xf6;nnte auch noch komplexer werden"/>
<node CREATED="1585013335575" ID="ID_1950230557" MODIFIED="1585013822494" TEXT="es sind wenige, und essentiell festgelegte">
<arrowlink COLOR="#653773" DESTINATION="ID_645312696" ENDARROW="Default" ENDINCLINATION="114;0;" ID="Arrow_ID_192929536" STARTARROW="Default" STARTINCLINATION="139;0;"/>
</node>
</node>
</node>
</node>
<node CREATED="1585010903183" ID="ID_1658829752" MODIFIED="1585010924829" TEXT="Kernfragen">
<icon BUILTIN="help"/>
<node CREATED="1585010871688" ID="ID_1289641734" MODIFIED="1585010901339" TEXT="wer entscheidet &#xfc;ber den m&#xf6;glichen Stil?">
<node CREATED="1585011007329" ID="ID_1945212792" MODIFIED="1585928197710" TEXT="die Factory">
<icon BUILTIN="smily_bad"/>
<node CREATED="1585013037644" ID="ID_765039376" MODIFIED="1585928217290" TEXT="das geht zwar immer">
<icon BUILTIN="smiley-angry"/>
</node>
<node CREATED="1585013043104" ID="ID_645312696" MODIFIED="1585013815190" TEXT="..w&#xfc;rde aber die Logik fest verdrahten">
<linktarget COLOR="#653773" DESTINATION="ID_645312696" ENDARROW="Default" ENDINCLINATION="114;0;" ID="Arrow_ID_192929536" SOURCE="ID_1950230557" STARTARROW="Default" STARTINCLINATION="139;0;"/>
</node>
</node>
<node CREATED="1585011013867" ID="ID_1777393889" MODIFIED="1585011031594" TEXT="Methode im Basis-Delegate">
<node CREATED="1585013060956" ID="ID_1696216374" MODIFIED="1585013076512" TEXT="kann nur den Zugang zum Modus weisen"/>
<node CREATED="1585013104936" ID="ID_280575875" MODIFIED="1585013115674" TEXT="kann aber ekennen, ob das Delgate wechselt"/>
</node>
<node CREATED="1585011032442" ID="ID_1163292905" MODIFIED="1585011037825" TEXT="das konkrete Delegate?">
<node CREATED="1585013118735" ID="ID_1852369137" MODIFIED="1585013129889" TEXT="nur dieses kennt die Feinheiten des Stils"/>
<node CREATED="1585013162456" ID="ID_1644140186" MODIFIED="1585013172896" TEXT="und justiert diese in einer virtuellen Methode"/>
</node>
</node>
<node CREATED="1585010936491" ID="ID_418040349" MODIFIED="1585013943024" TEXT="wer entscheidet &#xfc;ber den konkreten Delegate-Typ?"/>
<node CREATED="1585013943839" ID="ID_1056640354" MODIFIED="1585013970000" TEXT="kann ein bereits eingeschlagener Weg abelehnt werden?">
<node CREATED="1585013977195" ID="ID_727500697" MODIFIED="1585013993925" TEXT="d.h. wer pr&#xfc;ft die Mindestanforderungen?">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1585931039924" ID="ID_29030858" MODIFIED="1585931110002" TEXT="Problem Mindestl&#xe4;nge">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1585931060297" ID="ID_1656250390" MODIFIED="1585931069044" TEXT="eigentlich ein generisches Kriterium"/>
<node CREATED="1585931069824" ID="ID_432040203" MODIFIED="1585931078051" TEXT="tritt aber repliziert auf Blatt-Ebene auf"/>
<node CREATED="1585931078903" ID="ID_702074103" MODIFIED="1585931095124" TEXT="Gefahr der massiven Daten-Duplikation"/>
</node>
</node>
<node CREATED="1585928556619" ID="ID_1959943787" MODIFIED="1585928560215" TEXT="Kriterien">
<node CREATED="1585928575585" ID="ID_1181266579" MODIFIED="1585928581974" TEXT="individueller Clip">
<node CREATED="1585928654303" ID="ID_1323996178" MODIFIED="1585928665049" TEXT="hat Startpunkt"/>
<node CREATED="1585928673364" ID="ID_1131131049" MODIFIED="1585928737490" TEXT="Mindestl&#xe4;nge"/>
</node>
<node CREATED="1585928582857" ID="ID_1870451258" MODIFIED="1585928588716" TEXT="Teil einer &#xdc;bersicht">
<node CREATED="1585930006760" ID="ID_1545926932" MODIFIED="1585930010979" TEXT="hat Startpunkt"/>
<node CREATED="1585931000122" ID="ID_121156248" MODIFIED="1585931009316" TEXT="Wunsch oder Pin auf diesen Modus"/>
</node>
<node CREATED="1585928596439" ID="ID_1983527574" MODIFIED="1585928606156" TEXT="sonst: Datencontainer">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
<node CREATED="1585010953762" ID="ID_236488907" MODIFIED="1585010961491" TEXT="wer baut/klont ein Delegate?"/>
</node>
<node CREATED="1585924331517" HGAP="27" ID="ID_1558559501" MODIFIED="1585924351368" TEXT="state pattern" VSHIFT="26">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="idea"/>
<node CREATED="1585924411195" ID="ID_1837360138" MODIFIED="1585924430097" TEXT="das Clip-Delegate ist eine nat&#xfc;rliche State-Repr&#xe4;asentation">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1585924431448" ID="ID_1611710777" MODIFIED="1585924442213" TEXT="Schwachstelle: state handling API">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1585924446046" ID="ID_554920835" MODIFIED="1585924462752" TEXT="dieses wird auf &#xe4;u&#xdf;erer/innerer Kapsel aufgedoppelt"/>
<node CREATED="1585924468627" ID="ID_1944983930" MODIFIED="1585924475997" TEXT="was brauchen wir hier f&#xfc;r Operationen?"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1584319522106" ID="ID_600779996" MODIFIED="1584319541312" TEXT="Vorsicht Falle: Kopieren beim Wechsel des Anzeigestils">
<icon BUILTIN="messagebox_warning"/>
@ -28301,8 +28377,8 @@
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1584932054082" ID="ID_535289114" MODIFIED="1584932261288" TEXT="#1216 Some UI components are still connected to the backbone at shutdown">
<linktarget COLOR="#d23194" DESTINATION="ID_535289114" ENDARROW="Default" ENDINCLINATION="90;0;" ID="Arrow_ID_186398670" SOURCE="ID_429363053" STARTARROW="None" STARTINCLINATION="110;9;"/>
<linktarget COLOR="#b183a2" DESTINATION="ID_535289114" ENDARROW="Default" ENDINCLINATION="-2880;0;" ID="Arrow_ID_1219325605" SOURCE="ID_1234616959" STARTARROW="None" STARTINCLINATION="595;36;"/>
<linktarget COLOR="#d23194" DESTINATION="ID_535289114" ENDARROW="Default" ENDINCLINATION="90;0;" ID="Arrow_ID_186398670" SOURCE="ID_429363053" STARTARROW="None" STARTINCLINATION="110;9;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
@ -34849,7 +34925,7 @@
<node CREATED="1489191126256" HGAP="24" ID="ID_127004361" MODIFIED="1518487921092" TEXT="Tickets" VSHIFT="26">
<icon BUILTIN="info"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1489191161395" ID="ID_346158251" MODIFIED="1518487921092" TEXT="#1087 GUI/Session command handling">
<linktarget COLOR="#606d94" DESTINATION="ID_346158251" ENDARROW="Default" ENDINCLINATION="842;21;" ID="Arrow_ID_726918944" SOURCE="ID_898481930" STARTARROW="None" STARTINCLINATION="1012;0;"/>
<linktarget COLOR="#606d94" DESTINATION="ID_346158251" ENDARROW="Default" ENDINCLINATION="883;21;" ID="Arrow_ID_726918944" SOURCE="ID_898481930" STARTARROW="None" STARTINCLINATION="1012;0;"/>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1489191208557" ID="ID_632390561" MODIFIED="1561827465704" TEXT="#1088 Command definition registration">
@ -36062,7 +36138,7 @@
</node>
</node>
<node COLOR="#252298" CREATED="1489546623162" HGAP="-24" ID="ID_1622574347" MODIFIED="1575131582794" TEXT="was wird gebraucht" VSHIFT="21">
<linktarget COLOR="#352c7d" DESTINATION="ID_1622574347" ENDARROW="Default" ENDINCLINATION="-240;-3336;" ID="Arrow_ID_1512127407" SOURCE="ID_1401258681" STARTARROW="None" STARTINCLINATION="1996;0;"/>
<linktarget COLOR="#352c7d" DESTINATION="ID_1622574347" ENDARROW="Default" ENDINCLINATION="-220;-3339;" ID="Arrow_ID_1512127407" SOURCE="ID_1401258681" STARTARROW="None" STARTINCLINATION="2016;0;"/>
<font NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="help"/>
<node COLOR="#f10a1a" CREATED="1489546678250" ID="ID_228157787" MODIFIED="1518487921093" TEXT="Vorsicht UI-Programmierung">
@ -37719,7 +37795,7 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1573837634757" ID="ID_101148427" MODIFIED="1575577381370" TEXT="Aufgabe: Ordnung (re)Konstruieren">
<linktarget COLOR="#624d7d" DESTINATION="ID_101148427" ENDARROW="Default" ENDINCLINATION="-3637;-782;" ID="Arrow_ID_498364014" SOURCE="ID_646844971" STARTARROW="None" STARTINCLINATION="2862;94;"/>
<linktarget COLOR="#624d7d" DESTINATION="ID_101148427" ENDARROW="Default" ENDINCLINATION="-3637;-782;" ID="Arrow_ID_1277214644" SOURCE="ID_350484232" STARTARROW="None" STARTINCLINATION="2973;244;"/>
<linktarget COLOR="#624d7d" DESTINATION="ID_101148427" ENDARROW="Default" ENDINCLINATION="-3637;-782;" ID="Arrow_ID_1277214644" SOURCE="ID_350484232" STARTARROW="None" STARTINCLINATION="2954;247;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1573837829595" ID="ID_613778773" MODIFIED="1573837833320" TEXT="immer wenn...">
<node CREATED="1573837834482" ID="ID_980057100" MODIFIED="1573837839549" TEXT="ein Element hinzugekommen ist"/>
@ -46315,7 +46391,7 @@
<node CREATED="1584202239940" ID="ID_1326489257" MODIFIED="1584202242808" TEXT="Wert-Manipulation"/>
</node>
<node CREATED="1584201875333" ID="ID_1634323626" MODIFIED="1584202923362" TEXT="Konstruktor vs. Populations-Diff">
<linktarget COLOR="#2e3f60" DESTINATION="ID_1634323626" ENDARROW="Default" ENDINCLINATION="-1672;80;" ID="Arrow_ID_1671674197" SOURCE="ID_1310327519" STARTARROW="None" STARTINCLINATION="-1515;90;"/>
<linktarget COLOR="#2e3f60" DESTINATION="ID_1634323626" ENDARROW="Default" ENDINCLINATION="-1672;80;" ID="Arrow_ID_1671674197" SOURCE="ID_1310327519" STARTARROW="None" STARTINCLINATION="-1522;89;"/>
<node CREATED="1584202280926" ID="ID_1191279412" MODIFIED="1584202293547" TEXT="Objekte geben Invarianten via Konstruktor vor"/>
<node CREATED="1584202294330" ID="ID_930873161" MODIFIED="1584202321186" TEXT="INS liefert einen Wert ohne Einschr&#xe4;nkungen"/>
<node CREATED="1584202321796" ID="ID_78459313" MODIFIED="1584202344074" TEXT="Diskrepanz -&gt; Policy">