diff --git a/src/stage/interact/drag-relocate-controller.hpp b/src/stage/interact/drag-relocate-controller.hpp index 41d3760a2..6fd290057 100644 --- a/src/stage/interact/drag-relocate-controller.hpp +++ b/src/stage/interact/drag-relocate-controller.hpp @@ -159,8 +159,8 @@ namespace interact { return false; // Event not handled by this controller REQUIRE (motion_event); std::cerr << _Fmt{"MOVE x=%3.1f y=%3.1f subject=%s"} - % motion_event->x - % motion_event->y + % motion_event->x_root + % motion_event->y_root % subject << std::endl; if (not isAnchored()) @@ -199,8 +199,8 @@ namespace interact { { REQUIRE (motion_event); this->subject_ = & subject; - this->anchorX_ = motion_event->x; - this->anchorY_ = motion_event->y; + this->anchorX_ = motion_event->x_root; + this->anchorY_ = motion_event->y_root; std::cerr << _Fmt{"ANCHOR at x=%3.1f y=%3.1f ('%s')"} % anchorX_ % anchorY_ @@ -211,8 +211,8 @@ namespace interact { void probeActivation (GdkEventMotion* motion_event) { - isInFormation_ = DISTANCE_THRESHOLD < abs (motion_event->x - anchorX_) - or DISTANCE_THRESHOLD < abs (motion_event->y - anchorY_); + isInFormation_ = DISTANCE_THRESHOLD < abs (motion_event->x_root - anchorX_) + or DISTANCE_THRESHOLD < abs (motion_event->y_root - anchorY_); } void @@ -225,8 +225,8 @@ namespace interact { doTrackGesture (GdkEventMotion* motion_event) { REQUIRE (motion_event); - gdouble deltaX = motion_event->x - this->anchorX_; - gdouble deltaY = motion_event->y - this->anchorY_; + gdouble deltaX = motion_event->x_root - this->anchorX_; + gdouble deltaY = motion_event->y_root - this->anchorY_; // notify Subject to feed current delta observer_->updateOffset (deltaX, deltaY); } diff --git a/src/stage/timeline/body-canvas-widget.cpp b/src/stage/timeline/body-canvas-widget.cpp index fd2872d27..f6de3832a 100644 --- a/src/stage/timeline/body-canvas-widget.cpp +++ b/src/stage/timeline/body-canvas-widget.cpp @@ -436,7 +436,7 @@ namespace timeline { // respond to any structure changes of the timeline by recomputing the TrackProfile layout_.signalStructureChange_.connect (sigc::mem_fun (*this, &BodyCanvasWidget::slotStructureChange)); - // access and possible (re)establish the current "profile" of the tracks on demand... + // on demand access and possible (re)establish the current "profile" of the tracks for drawing... getProfile = [this]() -> TrackProfile& { maybeRebuildLayout(); @@ -704,6 +704,7 @@ namespace timeline { cox->set_source_rgb(0.2, 0.4, 0.9); // blue cox->set_line_width (2.0); + cox->move_to(w, 0); cox->arc(rad, rad, rad, 0.0, 2.0*M_PI); // full circle cox->stroke(); /////////////////////////////////////////////TICKET #1039 : placeholder drawing diff --git a/src/stage/timeline/clip-presenter.hpp b/src/stage/timeline/clip-presenter.hpp index f7a8849d6..625e2c0dd 100644 --- a/src/stage/timeline/clip-presenter.hpp +++ b/src/stage/timeline/clip-presenter.hpp @@ -223,6 +223,7 @@ namespace timeline { private:/* ===== Subject-Interface ===== */ + /** @internal Adapter used while a dragging gesture is in formation */ class DragRelocateObserver : public interact::GestureObserver { @@ -240,8 +241,8 @@ namespace timeline { % getCmdID() % deltaX % deltaY - % subject_.widget_->accessStartTime() % oldTime_ + % subject_.widget_->accessStartTime() << std::endl; } @@ -285,10 +286,10 @@ namespace timeline { * Whenever a new clip widget has been created, this function is also responsible * for additional setup, and especially to enable the dragging gestures on this clip. * @remark a typical example would be, when a clip's temporal position, previously unspecified, - * now becomes defined through a diff message. With this data, it becomes feasible + * now becomes defined through a diff message. With this data, it then would become feasible * _actually to show the clip_ in the timeline. Thus the [Appearance style](\ref ClipDelegate::Appearance) * of the presentation widget (delegate) can be switched up from `PENDING` to `ABRIDGED`. - * @note however this function is invoked from ctor and then serves to allocate the delegate initially. + * @note however this function is also invoked from ctor and then serves to allocate the delegate initially. */ void establishAppearance(WidgetHook* newView =nullptr, diff --git a/src/stage/timeline/timeline-layout.cpp b/src/stage/timeline/timeline-layout.cpp index d6856190c..5908cd3bb 100644 --- a/src/stage/timeline/timeline-layout.cpp +++ b/src/stage/timeline/timeline-layout.cpp @@ -27,6 +27,9 @@ ** @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 aca615ca3..d7f81f72b 100644 --- a/src/stage/timeline/track-body.cpp +++ b/src/stage/timeline/track-body.cpp @@ -23,7 +23,9 @@ /** @file track-body.cpp ** Implementation details regarding display management of the - ** track body area within the timeline display canvas. + ** track body area within the timeline display canvas. Especially, + ** this code handles the structuring of vertical space, and the way + ** this vertical extension maps to specific tracks. ** ** @todo WIP-WIP-WIP as of 6/2019 ** diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 0af3bb00d..06cf0f353 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -5297,8 +5297,8 @@ - - + + @@ -5352,24 +5352,24 @@ - - + + - - + + - + - + @@ -5386,16 +5386,19 @@ - - + + - - + + + + + @@ -5476,13 +5479,25 @@ - + - - + + + + + + + + + + + + + + @@ -17863,7 +17878,7 @@ - + @@ -20927,7 +20942,7 @@ - + @@ -23856,7 +23871,7 @@ - + @@ -23975,6 +23990,7 @@ + @@ -25951,7 +25967,9 @@ - + + + @@ -28800,7 +28818,7 @@ - + @@ -29508,8 +29526,9 @@ - - + + + @@ -30111,7 +30130,7 @@ - + @@ -30122,7 +30141,8 @@

- + +
@@ -31668,6 +31688,7 @@ + @@ -32260,7 +32281,7 @@

- ...d.h. es wäre zu vermeiden, daß ein irgendwo vorgegebenes Konfigurations-Setup an anderer Stelle im Code noch passend verankert oder korrespondieren eingerichtet werden muß.

Konkret: die drag-Fähigkeit eines Clip wird konfiguriert im Clip-Presenter. Fertig. + ...d.h. es wäre zu vermeiden, daß ein irgendwo vorgegebenes Konfigurations-Setup an anderer Stelle im Code noch passend verankert oder korrespondierend eingerichtet werden muß.

Konkret: die drag-Fähigkeit eines Clip wird konfiguriert im Clip-Presenter. Fertig.

@@ -32845,8 +32866,8 @@ - - + + @@ -32871,9 +32892,10 @@ - + - + + @@ -32884,6 +32906,8 @@ + + @@ -33215,6 +33239,7 @@ + @@ -33227,21 +33252,48 @@ - + - - + + + + + + +

+ das time::Control lebt dann wohl im Observer, und dieser muß eine Schnittstelle haben, über die das time::Control auf das eigentliche Zielfeld gesetzt wird...

...das klingt alles gefährlich indirekt... +

+ +
+
- - + + + + + + + + + + +

+ Stand: funktioniert ― ist aber halbfertig +

+ +
+ + + +
@@ -33284,8 +33336,8 @@
- - + + @@ -33442,7 +33494,7 @@

- ...sonst würde entweder das Subject selber ad hoc etwas bereitstellen müssen und dafür zusätzliche Storage brauchen (Hebel, es gibt sehr viele Subjekte!), oder das Interface "Subject" würde löchrigt und zu einer Kodifizierung von Einzelfällen. Die Lösung mit dem Adapter stattdessen fällt unter das Prinzip Inversion of Control + ...sonst würde entweder das Subject selber ad hoc etwas bereitstellen müssen und dafür zusätzliche Storage brauchen (Hebel, es gibt sehr viele Subjekte!), oder das Interface "Subject" würde löchrig und zu einer Kodifizierung von Einzelfällen. Die Lösung mit dem Adapter stattdessen fällt unter das Prinzip Inversion of Control

@@ -33671,6 +33723,7 @@ + @@ -33701,19 +33754,34 @@
- - - - - + + + + + - + + + + + + + +

+ sobald man globale Screen-Koordinaten für die Delta-Berechnung verwendet; der Button klebt jetzt exakt an der Stelle, an der zuerst geklickt wurde +

+ +
+ + +
- + + @@ -33724,10 +33792,165 @@

+ + + + + + + + + + +

+ ...bevor die Trigger-Schwelle erreicht ist, wachsen sie schön monoton
...auch ist das Springen exakt alternierend, ein Schritt vor, ein Schritt zurück +

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

+ aber das von GDK gelieferte Delta hängt eben vom GDK-Window des widgets ab +

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

+ der Gesten-Controller sollte hier nicht mitmischen +

+ +
+ +
+ + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + +

+ ...dieser zeichnet die Kreise mit Ausdehnung der Allocation, und auch genau mit dieser Farbe und Linienbreite +

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

+ ein cout in genau diesem Testcode gibt stets nur alternierend den Allocation-Wert für den Ruler-Canvas (konstant 5px) und dann den Main-Canvas (variiert mit Fensterhöhe) aus +

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

+ jede Zeichen-Primitive zeichnet von der aktuellen Position weg +

+ +
+
+ + + + + + + +

+ sonst verschleppt man eine zufällig vorher gegebene Position +

+ +
+
@@ -33854,7 +34077,7 @@ - + @@ -33872,6 +34095,11 @@
+ + + + +
@@ -57504,6 +57732,17 @@
+ + + + + + + + + + + @@ -57605,6 +57844,11 @@ + + + + +