From 4451d5bfc94d60bc932c573ac957620dd5ea30b3 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 30 Jan 2021 16:29:06 +0100 Subject: [PATCH] Clip: implement re-attachment after layout change with these changes, essentially the clip is moved to the new position established in the preceding DisplayEvaluation. ...there is still some problem when this DisplayEvaluation itself is triggered from within draw(), because then GTK still uses the old sub-widget coordinates within this draw code, pretty much as if they were cached somewhere. The next draw() call then uses the proper new coordinates. --- src/stage/timeline/clip-presenter.cpp | 4 +- src/stage/timeline/clip-presenter.hpp | 2 +- src/stage/timeline/clip-widget.cpp | 13 ++ src/stage/timeline/clip-widget.hpp | 14 +- wiki/thinkPad.ichthyo.mm | 195 +++++++++++++++++++++++--- 5 files changed, 204 insertions(+), 24 deletions(-) diff --git a/src/stage/timeline/clip-presenter.cpp b/src/stage/timeline/clip-presenter.cpp index 429fb5425..cb01bafb1 100644 --- a/src/stage/timeline/clip-presenter.cpp +++ b/src/stage/timeline/clip-presenter.cpp @@ -79,6 +79,7 @@ namespace timeline { , widget_{} { ClipDelegate::buildDelegate (widget_, view, timing); + ENSURE (widget_); } @@ -172,7 +173,8 @@ namespace timeline { void ClipPresenter::relink() { - UNIMPLEMENTED ("attach the Delegate again at its nominal position, if applicable"); + REQUIRE (widget_); + widget_->updatePosition(); } diff --git a/src/stage/timeline/clip-presenter.hpp b/src/stage/timeline/clip-presenter.hpp index 1431f0c1e..6c5ef8669 100644 --- a/src/stage/timeline/clip-presenter.hpp +++ b/src/stage/timeline/clip-presenter.hpp @@ -118,7 +118,7 @@ namespace timeline { * position onto the drawing canvas, be it due to a zoom change, or * as result of layout re-flow. */ - void relink(); + void relink(); private:/* ===== Internals ===== */ diff --git a/src/stage/timeline/clip-widget.cpp b/src/stage/timeline/clip-widget.cpp index d78267759..e8adf48df 100644 --- a/src/stage/timeline/clip-widget.cpp +++ b/src/stage/timeline/clip-widget.cpp @@ -244,6 +244,12 @@ namespace timeline { return unConst(this)->display_; } + void + updatePosition() override + { + /* NOOP */ + } + public: DormantClip(WidgetHook& displayAnchor) @@ -312,6 +318,13 @@ namespace timeline { return HookedWidget::getCanvas(); } + void + updatePosition() override + { + WidgetHook::Pos nominalPos = establishHookPoint(nullptr); + this->moveTo (nominalPos.x, nominalPos.y); + } + public: ClipWidget(WidgetHook::Pos hookPoint, TimeSpan timings, uString clipName) diff --git a/src/stage/timeline/clip-widget.hpp b/src/stage/timeline/clip-widget.hpp index 04b0deb59..be86fd0d5 100644 --- a/src/stage/timeline/clip-widget.hpp +++ b/src/stage/timeline/clip-widget.hpp @@ -147,7 +147,7 @@ namespace timeline { /** - * @todo WIP-WIP as of 3/2020 + * @todo WIP-WIP as of 2/2021 */ class ClipDelegate { @@ -176,18 +176,20 @@ namespace timeline { virtual Appearance changeAppearance (Appearance desired) =0; /** human readable rendering of the clip's name or identity */ - virtual cuString getClipName() const =0; + virtual cuString getClipName() const =0; virtual void setClipName (cuString) =0; virtual void changeTiming (TimeSpan) =0; - virtual Time getStartTime() const =0; - virtual Duration getLen() const =0; + virtual Time getStartTime() const =0; + virtual Duration getLen() const =0; - virtual uint getVerticalOffset() const =0; + virtual uint getVerticalOffset() const =0; virtual WidgetHook& getCanvas() const =0; + virtual void updatePosition() =0; + + virtual uint calcRequiredHeight() const =0; - virtual uint calcRequiredHeight() const =0; /** (re)establish current canvas attachment coordinates, * thereby possibly switching to a new canvas implementation diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 6f048f2d6..35fcd782f 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -19290,8 +19290,7 @@ aber dieses Design ist schief

- - + @@ -19746,8 +19745,7 @@ Ursache ist ein schiefes Design

- - + @@ -19757,8 +19755,7 @@ ...und das ist wohl entstanden, weil ich ursprünglich einen generischen Visitor im Blick hatte; es hat sich aber dann gezeigt, daß eine solche universelle "Quer-Beweglichkeit" weder notwendig noch wünschenswert ist

- -
+
@@ -22160,20 +22157,181 @@ - - + + - - + + + + - - - + + + + + + + + + + + + + + +

+ berücksichtigt also nicht die Dekoration und das Padding... obwohl doch eigentlich der 2.Pass das Track-Profil aufgebaut haben sollte +

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

+ der Test-Diff ist ungeschickt geschrieben +

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

+ ich wollte mal ein viel generischeres Design schaffen, das sogar eine Art Grundgerüst für das Zusammenbauen des GUI sein könnte. In der vertieften Analyse wurde dann aber klar, daß dieses Design nicht so ohne Weiteres realisierbar ist. Daraufhin habe ich beschlossen, die Idee aufzugeben und stattdessen auf Einzelfälle zu spezialisieren. Und in einem weiteren Schritt habe ich dann die Themen "Grid" und "Canvas" voneinander getrennt +

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

+ ...and "realizes" the widget +

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

+ beim ersten Mal wird "nebenbei" festgestellt, daß das Track-Profil (noch)nicht existiert. +

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

+ ...denn selbst wenn wir das für das erste Mal irgendwie hinbiegen, so kann das doch in jedem späteren draw() wieder passieren +

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

+ ...dafür bräuchte ich aber einen Diff-Listener für alle strukturellen Änderungen incl sub-Scope. Das ist nicht trivial zu implementieren, weil die sub-Scopes ja beliebig tief verschachtelt sein können, und alle rekursiv delegiert werden +

+ +
+
+ + +
@@ -28116,7 +28274,7 @@
- + @@ -28128,6 +28286,10 @@ + + + + @@ -28975,7 +29137,7 @@ - + @@ -53221,7 +53383,8 @@ - + +