From 28331f9f8aa03a85e3f92f92cde257caf10f95e0 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 18 Mar 2023 00:58:55 +0100 Subject: [PATCH] Timeline: complete the rework of UI backbone and Timeline (closes: #1014) check private notes and mindmap and fix some remaining minor inconsistencies, notably the calculations in the overlay renderer in the `BodyCanvasWidget`. --- src/stage/timeline/body-canvas-widget.cpp | 94 ++- src/stage/timeline/body-canvas-widget.hpp | 7 +- src/stage/timeline/timeline-layout.cpp | 3 - src/stage/timeline/track-body.cpp | 2 - src/stage/timeline/track-body.hpp | 2 +- src/stage/timeline/track-head-widget.hpp | 2 +- src/stage/timeline/track-presenter.hpp | 2 +- wiki/thinkPad.ichthyo.mm | 903 ++++++++++++++-------- 8 files changed, 669 insertions(+), 346 deletions(-) diff --git a/src/stage/timeline/body-canvas-widget.cpp b/src/stage/timeline/body-canvas-widget.cpp index cd4b695ed..330048c75 100644 --- a/src/stage/timeline/body-canvas-widget.cpp +++ b/src/stage/timeline/body-canvas-widget.cpp @@ -36,10 +36,12 @@ ** timeline::TrackBody::establishTrackSpace(), based on specifications drawn from the real ** CSS layout definitions. Here, within this translation unit, we define the corresponding ** timeline::ProfileInterpreter implementations; these are the concrete visitors and are - ** invoked repeatedly to carry out the actual drawing requests. - ** - ** @todo WIP-WIP-WIP as of 6/2019 + ** invoked repeatedly to carry out the actual drawing requests. ** + ** @todo as of 3/2023 the foundation of this rewritten, highly flexible drawing code established, + ** and the layout seemingly behaves reasonably stable and visually as expected, yet with + ** some minor glitches. Any kind of dynamic adjustment in response to expanding/collapsing + ** or the content representation of clips is *not yet implemented* */ @@ -50,34 +52,22 @@ #include "stage/timeline/track-body.hpp" #include "stage/style-scheme.hpp" -//#include "stage/ui-bus.hpp" -//#include "lib/format-string.hpp" #include "lib/format-cout.hpp"//////////////TODO - #include "common/advice.hpp" #include "lib/util.hpp" -//#include -//#include #include - -//using util::_Fmt; using lib::time::Time; using util::max; using util::isnil; -//using util::contains; -//using Gtk::Widget; using Gdk::Rectangle; -//using sigc::mem_fun; -//using sigc::ptr_fun; -//using std::cout; -//using std::endl; using std::string; using std::move; + namespace stage { namespace timeline { @@ -147,7 +137,7 @@ namespace timeline { styleBody->add_class (slopeClassName(depth)); TrackBody::decoration.borders[depth] = styleBody->get_border().get_bottom(); - TrackBody::decoration.borders[0] = styleBody->get_border().get_top(); // Note: we use a common size for all opening borders + TrackBody::decoration.borders[0] = styleBody->get_border().get_top(); // Note: we use a common size for all opening borders styleBody->remove_class (slopeClassName(depth)); // styleBody->context_restore(); // <<<---does not work... @@ -167,15 +157,17 @@ namespace timeline { * mechanism to invoke a set of (virtual) drawing primitives, the * actual drawing code is in the two following subclasses, * separate for the background and for drawing overlays. + * @note the *invariant* is: after processing a _verb_ from the profile, + * all drawing including the current "water level" #line_ is complete. */ class AbstractTrackRenderer : public ProfileInterpreter { protected: CairoC cox_; - StyleC style_; - StyleC styleR_; - PixSpan visible_; + StyleC style_; // CSS style for the main track body + StyleC styleR_; // CSS style for the an overview ruler + PixSpan visible_; // vertical extension of the timeline /** the current painting "water level". * To be updated while drawing top-down */ @@ -195,10 +187,18 @@ namespace timeline { public: AbstractTrackRenderer (CairoC currentDrawContext, DisplayManager& layout) : cox_{currentDrawContext} - , style_{trackBodyStyle.getAdvice()} // storing a const& to the advice is potentially dangerous, but safe here, since it is not long-lived + , style_{trackBodyStyle.getAdvice()} , styleR_{trackRulerStyle.getAdvice()} , visible_{layout.getPixSpan()} { } + /* + * Note: we store a const& to the advice in the member fields. + * This is potentially dangerous, but seems adequate here, since + * the renderer instance does not outlive the BodyCanvasWidget, + * and the style context accessed through the advice is created + * once, at application startup. Please take into account that + * this drawing code is invoked very frequently from GUI thread. + */ }; @@ -299,14 +299,18 @@ 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 + * @note to get drawing of the border corners right, + * we "set back" by the border width and draw some spurious + * vertical part, hidden outside of the visible canvas area. + */ void close (uint n) override { // style_->context_save(); // <<<---does not work. Asked on SO: https://stackoverflow.com/q/57342478 style_->add_class (slopeClassName(n)); int slopeWidth = style_->get_border().get_bottom(); - line_ -= slopeWidth; // set back to create room for the (invisible) top side of the frame + line_ -= slopeWidth; // set back to create room for the (invisible) top side of the frame style_->render_frame_gap(cox_ ,visible_.b +30 ////////////////////////////////////////TODO: visual debugging @@ -351,35 +355,60 @@ namespace timeline { } /** draw overlays on top of overview/ruler track - * @param h ruler track height */ + * @param contentHeight ruler track height */ void - ruler (uint h) override + ruler (uint contentHeight) override { - line_ += h; + int marTop = styleR_->get_margin().get_top(); + int marBot = styleR_->get_margin().get_bottom(); + int padTop = styleR_->get_padding().get_top(); + int padBot = styleR_->get_padding().get_bottom(); + int frameT = styleR_->get_border().get_top(); + int frameB = styleR_->get_border().get_bottom(); + + int heightWithFrame = contentHeight + padTop+padBot + frameT+frameB; + + /* nothing to paint */ + line_ += marTop + + heightWithFrame + + marBot; } /** render overlays on top of padding/gap */ void gap (uint h) override { - UNIMPLEMENTED ("overlays for gap"); + /* nothing to paint */ + line_ += h; } /** place overlays on top of of track content area, * @remark anything to show semi-transparent * on top of the content clips */ void - content (uint h) override + content (uint contentHeight) override { + int marTop = style_->get_margin().get_top(); + int marBot = style_->get_margin().get_bottom(); + int padTop = style_->get_padding().get_top(); + int padBot = style_->get_padding().get_bottom(); + int heightWithPadding = contentHeight + padTop+padBot; + /* nothing to paint */ - line_ += h; + line_ += marTop + + heightWithPadding + + marBot; } /** render overlays covering the opening slope towards nested tracks */ void open() override { +// style_->context_save(); // <<<---does not work. Asked on SO: https://stackoverflow.com/q/57342478 + style_->add_class (slopeClassName (1)); int slopeWidth = style_->get_border().get_top(); +// style_->context_restore(); // <<<---does not work... + style_->remove_class (slopeClassName(1)); line_ += slopeWidth; } @@ -387,11 +416,12 @@ namespace timeline { void close (uint n) override { - style_->context_save(); - style_->add_class(slopeClassName(n)); +// style_->context_save(); // <<<---does not work. Asked on SO: https://stackoverflow.com/q/57342478 + style_->add_class (slopeClassName(n)); int slopeWidth = style_->get_border().get_bottom(); +// style_->context_restore(); // <<<---does not work... + style_->remove_class (slopeClassName(n)); line_ += slopeWidth; - style_->context_restore(); } public: diff --git a/src/stage/timeline/body-canvas-widget.hpp b/src/stage/timeline/body-canvas-widget.hpp index 9157c2be3..72d9cba66 100644 --- a/src/stage/timeline/body-canvas-widget.hpp +++ b/src/stage/timeline/body-canvas-widget.hpp @@ -27,7 +27,7 @@ ** implemented with automatic layout by the UI toolkit set. Rather, we need to ** control a precise temporal display grid, and we need to limit the actual widgets ** added for display, since a given timeline may easily hold several hundred up to - ** thousands of elements. To ease such tasks, a _canvas control_ -- here implemented + ** thousands of elements. To ease such tasks, a _canvas control_ — here implemented ** on top of Gtk::Layout, allows to combine _custom drawing_ with the placement of ** embedded child widgets, where the latter's layout is again managed automatically ** by the toolkit set. This approach allows us to circumvent some of the perils of @@ -51,7 +51,7 @@ ** ** ## Coordinate systems ** When drawing onto a canvas, we need to define the coordinate system. This task is - ** complicated here, since -- on implementation level -- we end up with several `Gtk::Layout` + ** complicated here, since — on implementation level — we end up with several `Gtk::Layout` ** elements (the actual canvas widget). This is necessary to accommodate for the display ** "mechanics": part of the timeline has to stay "pinned" on top, including the time ** overview ruler and possible further marker displays. Based on practical considerations @@ -66,8 +66,6 @@ ** So effectively, from the view point of (sub)widget management, we thus get virtual ** canvas coordinates per (sub)track. ** - ** @todo WIP-WIP-WIP as of 6/2019 - ** */ @@ -137,7 +135,6 @@ namespace timeline { * On the other hand, for attachment of sub-widgets onto the canvas (Clips, Effects, Markers) * we use the Interface model::CanvasHook, which allows us to break down the access hierarchically. * Each sub-Track can be outfitted with its own "virtual canvas", exposed as delegating CanvasHook. - * @todo WIP-WIP as of 6/2019 */ class BodyCanvasWidget : public Gtk::Box diff --git a/src/stage/timeline/timeline-layout.cpp b/src/stage/timeline/timeline-layout.cpp index 3b9d0d853..d445e6dbd 100644 --- a/src/stage/timeline/timeline-layout.cpp +++ b/src/stage/timeline/timeline-layout.cpp @@ -24,9 +24,6 @@ /** @file timeline-layout.cpp ** Implementation details of global timeline layout management. ** - ** @todo as of 10/2018 timeline display in the UI is rebuilt to match the architecture - ** @todo WIP-WIP-WIP as of 12/2019 - ** ** @see track-body.cpp for mapping individual tracks onto the common canvas ** @see body-canvas-widget.cpp for painting track background and overlays ** diff --git a/src/stage/timeline/track-body.cpp b/src/stage/timeline/track-body.cpp index b8f7820a8..2efc2834f 100644 --- a/src/stage/timeline/track-body.cpp +++ b/src/stage/timeline/track-body.cpp @@ -30,8 +30,6 @@ ** @see TrackBody::establishTrackSpace (TrackProfile&) ** @see BodyCanvasWidget::maybeRebuildLayout() invocation ** - ** @todo WIP-WIP-WIP as of 6/2019 - ** */ diff --git a/src/stage/timeline/track-body.hpp b/src/stage/timeline/track-body.hpp index e554050f5..1b4fc46bd 100644 --- a/src/stage/timeline/track-body.hpp +++ b/src/stage/timeline/track-body.hpp @@ -32,7 +32,7 @@ ** in the [header pane](\ref timeline::HeaderPaneWidget) and the display of the ** timeline body; the latter is actually a canvas for custom drawing. ** - ** @todo WIP-WIP-WIP as of 12/2016 + ** @todo as of 3/2023 the reworked Timeline-UI is basically complete ** */ diff --git a/src/stage/timeline/track-head-widget.hpp b/src/stage/timeline/track-head-widget.hpp index d0b942d0b..9814790b1 100644 --- a/src/stage/timeline/track-head-widget.hpp +++ b/src/stage/timeline/track-head-widget.hpp @@ -38,7 +38,7 @@ ** which serves to control such aspects relevant for all content contained within the scope ** of this track, including the sub-tracks nested therein. ** - ** @todo WIP-WIP-WIP as of 10/2018 + ** @todo as of 3/2023 the reworked Timeline-UI is basically complete ** */ diff --git a/src/stage/timeline/track-presenter.hpp b/src/stage/timeline/track-presenter.hpp index 1598786cc..4858694b9 100644 --- a/src/stage/timeline/track-presenter.hpp +++ b/src/stage/timeline/track-presenter.hpp @@ -88,7 +88,7 @@ ** investigated when there is a sufficiently complete implementation available -- see #1254 ** ** @todo as of 10/2018 timeline display in the UI is rebuilt to match the architecture - ** @todo still WIP as of 3/2020 -- yet the basic structure is settled by now. + ** @todo as of 3/2023, the basic structure is settled and the design validated ** */ diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index d6a4e2c67..729be05a1 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -17,7 +17,7 @@ - + @@ -36,7 +36,9 @@ - + + + @@ -94,11 +96,19 @@ - - + + + - + + + + + + + + @@ -107,22 +117,24 @@ - - - + + + + + - + - + - + @@ -209,7 +221,7 @@ - + @@ -253,16 +265,16 @@ - + - + - + @@ -378,12 +390,12 @@ - + - + @@ -759,9 +771,10 @@ - + - + + @@ -1034,19 +1047,19 @@ - + - + - + - + @@ -1112,7 +1125,7 @@ - + @@ -1139,7 +1152,9 @@ - + + + @@ -1387,7 +1402,7 @@ - + @@ -1457,7 +1472,7 @@ - + @@ -1646,7 +1661,7 @@ - + @@ -3995,7 +4010,7 @@ - + @@ -4091,7 +4106,7 @@ - + @@ -4122,7 +4137,7 @@ - + @@ -4138,7 +4153,7 @@ - + @@ -4293,7 +4308,7 @@ - + @@ -4319,7 +4334,8 @@ - + + @@ -4360,7 +4376,7 @@ - + @@ -5121,7 +5137,7 @@ - + @@ -5245,7 +5261,7 @@ - + @@ -5294,7 +5310,7 @@ - + @@ -5305,7 +5321,8 @@

- + + @@ -5438,16 +5455,19 @@
- + - + - + + - + + + @@ -5468,11 +5488,11 @@ - + - - - + + + @@ -5488,38 +5508,39 @@ - + - + - + - - + - - - + + + + - + - + - - - - + + + + - + - + - + - + + @@ -5995,7 +6016,7 @@ - + @@ -6171,7 +6192,7 @@

- + @@ -6417,8 +6438,8 @@ - - + + @@ -6724,7 +6745,17 @@ - + + + + + + +

+ das ist ein gaaaanz großes Strategisches Thema; vor 2023 hatte ich schon mehrfach versucht, es zu fassen — das ist mir aber bisher nicht gelungen, und deshalb wartet es.... ⌛ +

+ +
@@ -6885,7 +6916,7 @@ - + @@ -6958,7 +6989,7 @@ - + @@ -7025,7 +7056,8 @@ - + + @@ -7219,12 +7251,26 @@ - + - + + + + + + + +

+ ...das können wir erst dann sinnvoll angehen, wenn die Application-Core weiter ausgereift ist +

+ +
+ + +
@@ -15519,7 +15565,7 @@
- +
@@ -16107,7 +16153,7 @@ - + @@ -17194,10 +17240,10 @@ - + - + @@ -18067,7 +18113,7 @@ - + @@ -18151,7 +18197,7 @@ - + @@ -18257,7 +18303,7 @@ - + @@ -19080,8 +19126,9 @@ - - + + + @@ -19111,8 +19158,9 @@ - + + @@ -19140,7 +19188,8 @@ - + + @@ -20457,6 +20506,7 @@ + @@ -21601,8 +21651,9 @@ - + + @@ -23539,8 +23590,9 @@ - - + + + @@ -23586,7 +23638,7 @@ - + @@ -23716,7 +23768,7 @@ - + @@ -23740,7 +23792,7 @@ - + @@ -24911,6 +24963,7 @@ + @@ -25078,7 +25131,7 @@ - + @@ -25229,10 +25282,11 @@ - + - - + + + @@ -25369,13 +25423,23 @@ - - + + - - + + + + + + +

+ ...bis jetzt genügt es, das TrackProfile selbst als "dirty-flag" zu misbrauchen. Aber ich vermute, längerfristig bekommen wir irgendwo im GUI noch weiteren "dirty-state" ⟹ und dann bleibt die Frage, wo siedeln wir den an... +

+ +
+
@@ -25386,7 +25450,8 @@ - + + @@ -25400,7 +25465,8 @@ - + + @@ -25451,7 +25517,8 @@ - + + @@ -25525,12 +25592,12 @@ - + - + @@ -25658,7 +25725,8 @@ - + + @@ -25747,7 +25815,8 @@ - + + @@ -25803,7 +25872,7 @@

- + @@ -25811,9 +25880,10 @@
- + + - + @@ -25849,7 +25919,7 @@ - + @@ -25863,7 +25933,7 @@ - + @@ -25883,8 +25953,8 @@ - - + + @@ -25903,9 +25973,9 @@ - + - + @@ -25917,7 +25987,7 @@ - + @@ -25950,7 +26020,7 @@ - + @@ -26039,7 +26109,7 @@ - + @@ -26105,7 +26175,7 @@ - + @@ -26146,10 +26216,12 @@ - - - - + + + + + + @@ -26166,11 +26238,11 @@ - + - + @@ -26192,7 +26264,8 @@ - + + @@ -26250,7 +26323,7 @@ - + @@ -26592,7 +26665,7 @@ - + @@ -26623,7 +26696,7 @@ - + @@ -26632,7 +26705,7 @@ - + @@ -26721,7 +26794,7 @@ - + @@ -26765,10 +26838,10 @@ - + - + @@ -27603,7 +27676,7 @@ - + @@ -27612,7 +27685,7 @@ - + @@ -27766,7 +27839,7 @@ - + @@ -28146,7 +28219,8 @@ - + + @@ -28211,10 +28285,8 @@ - - - - + + @@ -29816,13 +29888,40 @@ - + + + + + + + + +

+ Mehrere Aspekte sind hier offen (2023: Abschluß der GUI-Neugründung und vor Playback-Vertical-Slice): +

+
    +
  • + die Track-Head-Abschnitte beginnen nicht exakt korrekt bündig mit dem zugehörigen Bereich im Body; möglicherweise ein "run-away" um ein paar Pixel +
  • +
  • + die Scopes reagieren noch nicht dynamisch auf den Inhalt (und es fehlt die aktive Abstimmung) +
  • +
  • + die Scopes sollten auch eine dynamische Status-Anzeige unterstützen +
  • +
+ +
+ + + +
@@ -32474,7 +32573,7 @@
- + @@ -32500,9 +32599,10 @@
- + - + + @@ -32759,13 +32859,14 @@ - + + - + @@ -32808,7 +32909,7 @@ - + @@ -33313,8 +33414,9 @@ - - + + + @@ -33349,7 +33451,8 @@ - + + @@ -33362,6 +33465,7 @@ + @@ -33372,7 +33476,8 @@ - + + @@ -33390,10 +33495,12 @@ - + + + @@ -33453,9 +33560,9 @@ - + - + @@ -33563,8 +33670,8 @@ - - + + @@ -33639,8 +33746,11 @@ + + - + + @@ -33690,7 +33800,7 @@ - + @@ -33720,7 +33830,7 @@ - + @@ -33730,20 +33840,7 @@ - - - - - - -

- Wir erzeugen künstlich einen widget-Path und verankern ihn sinngemäß an der logisch richtigen Stelle (wobei aber die im Pfad aufgeführten Widgets gar nicht existieren, sondern logische Platzhalter sind). Über diesen Widget-Path greifen wir in einen CSS-Scope hinein, der typischerweise alle seine Styles von umschließenden Scopes erbt; indirekt ist damit aber auch die Möglichkeit geschaffen, diesen speziellen Scope gezielt mit CSS-Regeln zu addressieren — wodurch der Designer direkt auf das Erscheinungbild von Lumiera Einfluß nehmen kann -

- -
- -
- + @@ -33756,10 +33853,22 @@ TiddlyWiki + doc/technical/stage/style/Timeline.txt

- -
+
+ + + + + + +

+ Wir erzeugen künstlich einen widget-Path und verankern ihn sinngemäß an der logisch richtigen Stelle (wobei aber die im Pfad aufgeführten Widgets gar nicht existieren, sondern logische Platzhalter sind). Über diesen Widget-Path greifen wir in einen CSS-Scope hinein, der typischerweise alle seine Styles von umschließenden Scopes erbt; indirekt ist damit aber auch die Möglichkeit geschaffen, diesen speziellen Scope gezielt mit CSS-Regeln zu addressieren — wodurch der Designer direkt auf das Erscheinungbild von Lumiera Einfluß nehmen kann +

+ +
+ +
@@ -33790,7 +33899,8 @@
- + + @@ -33804,8 +33914,9 @@
- - + + + @@ -34147,7 +34258,8 @@ - + + @@ -34188,7 +34300,8 @@ - + + @@ -34476,18 +34589,18 @@ - + - - - - + + + + - + @@ -34514,34 +34627,28 @@ - - - - - - - + + - - + - - + + - - + + - + - + - + @@ -34558,7 +34665,7 @@ - + @@ -34568,35 +34675,6 @@ - - - - - - - - - - -

- ...darüber bin ich auch beim Zeichnen der Connector im StaveBracket gestolpert -

- -
-
- - - - - - -

- sichtbar an der Höhe der Sub-Scope-Verbindungen auf den StaveBrackets -

- -
- -
@@ -34604,14 +34682,33 @@
- - + + + + - - - - - + + + + + + + + + +

+ ...aber das wird sich ganz gewiß ändern ⟶ Stichwort Bereichsmarkierungen +

+ +
+ +
+
+ + + + + @@ -34659,7 +34756,7 @@ - + @@ -34825,13 +34922,52 @@ - - + + - + + + + + + + +

+ sollte theoretisch funktionieren.... +

+ +
+ + + + + + + + + + +

+ ClipPresenter::determineRequiredVerticalExtension() +

+ +
+ +
+ + + + + + + + + + +
- + @@ -35157,10 +35293,11 @@
- - - - + + + + + @@ -35249,13 +35386,40 @@ - - - + + + + + + + + + + + + + +
    +
  • + Feature-Definition der »Ruler« noch nicht gegeben +
  • +
  • + viele Details zum »Content« in den Tracks sind noch nicht klar +
  • +
  • + vertikale Positionierung von Content innerhalb der Tracks ist noch nicht gelöst +
  • +
+ +
+ + +
- - + + + @@ -35266,19 +35430,43 @@ - - - - - + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + @@ -35335,6 +35523,39 @@
+ + + + + + + + + + + + + +

+ ...darüber bin ich auch beim Zeichnen der Connector im StaveBracket gestolpert +

+ +
+
+ + + + + + +

+ sichtbar an der Höhe der Sub-Scope-Verbindungen auf den StaveBrackets +

+ +
+ +
+
@@ -36461,9 +36682,13 @@ + + + + - + @@ -36488,7 +36713,25 @@ - + + + + + + + + + +

+ Und zwar geht es hier um eine sehr grundsätzliche Layout / + Design-Entscheidung, die auch sehr starken Einfluß auf den Workflow und + die »Mechanik« der Clips haben wird; im aktuellen Stand + (2023) der Entwicklung habe ich nicht den Boden, um diese Enstscheidung + treffen zu können �� +

+ +
+
@@ -37308,7 +37551,7 @@ - + @@ -37371,8 +37614,10 @@ - + + + @@ -47138,9 +47383,9 @@ - + - + @@ -49906,7 +50151,7 @@ - + @@ -49969,7 +50214,7 @@ - + @@ -51758,7 +52003,7 @@ - + @@ -55192,7 +55437,7 @@ - + @@ -69649,7 +69894,7 @@ - + @@ -73099,6 +73344,7 @@ + @@ -73128,7 +73374,8 @@ - + + @@ -73137,21 +73384,30 @@ - + - - - - - + + + + + + + +

+ auf diese Stellen konzentrierte sich für längere Zeit die Aktivität, und keines dieser Themen konnte ich wirklich abschließen, denn es sind noch zu viele strategische Fragen ungeklärt — mit 2022 ist immerhin jedes dieser Themen auf einen längerfristig tragfähigen Grund gestellt +

+ +
+ + + + - - + + - - - + @@ -73172,6 +73428,10 @@
+ + + +
@@ -73203,10 +73463,30 @@ + + + + + - + + + + + + + + + +

+ das ViewHook / CanvasHook-Konzept hat sich hervorragend bewährt, und durch das zoom-metric-Mix-in gibt es auch bereits eine sehr elaborierte und robuste Implementierung für alle Belange der temporalen Ausdehnung (horizontal). Allerdings funktionieren alle diese Basis-Implementierungen bisher nur für den eigentlichen Content in der Timeline — ganz einfach weil ich noch nicht so recht weiß, was es mit den »Rulern« so auf sich hat ....  ⌛ +

+ +
+ +
@@ -73229,8 +73509,21 @@

....dieses Thema sollte generisch gelöst werden, und dann weiter entwickelt in Richtung »Interaction Design« — also mit einem aktuellen Fokus verbunden, und mit jeweils eigener Historie pro Fokus, so daß man in die verschiedenen Fokus-Zonen über gut etablierte "Leitern" wieder einsteigen könnte. Leider muß ich (Stand 9/2022) das GUI nun wieder verlassen, und es ist ganz und gar ungeklärt, unter welchen Umständen dieses zentrale Thema wieder aufgenommen werden kann...

+ +
+ +
+ + + + + +

- WaitingDesign um den Display-Frame im Timeline-Layout  + Es gibt immer noch Zweifel ob gewisser Race-Conditions.... +

+

+ Diese hängen jedoch eng mit dem Design des Subsystem-Runners zusammen, welches zwar grundsätzlich in Ordnung ist, aber alles in allem „etwas zu knapp gehalten“: man sollte hier explizit und fein differenziert die Lebenszyklus-Phasen ausformulieren, denn dann ist man nicht mehr von Subtilitäten der Implementierungs-Reihenfolge abhängig

@@ -73250,14 +73543,18 @@
- + + + - + + + - + @@ -73377,10 +73674,10 @@ - - + + - + @@ -73394,7 +73691,7 @@

- +
@@ -73457,8 +73754,9 @@
- + + @@ -73468,13 +73766,13 @@ - + - + - + @@ -73487,13 +73785,16 @@ - - - + + + + + +