diff --git a/src/lib/time/control.hpp b/src/lib/time/control.hpp
index 24740e38c..379162cdc 100644
--- a/src/lib/time/control.hpp
+++ b/src/lib/time/control.hpp
@@ -40,7 +40,9 @@
** of time-like entities -- be it the running time display in a GUI widget, a ruler marker
** which can be dragged, a modifiable selection or the animated playhead cursor.
**
- ** \par usage scenarios
+ **
+ ** # Usage scenarios
+ **
** The time::Control element provides mediating functionality, but doesn't assume or provide
** anything special regarding the usage pattern or the lifecycle, beyond the ability to
** attach listeners, attach to a (different) target and to detach from all connections.
@@ -59,10 +61,10 @@
** may expose a time::Control, thus allowing to attach target and listeners, while the
** actual changes will originate somewhere within the opaque service implementation.
**
- ** Another usage pattern would be to expose a time::Control \c const&, allowing only to
+ ** Another usage pattern would be to expose a `time::Control const&`, allowing only to
** impose changes, but not to change the target or listener attachments. To the contrary,
- ** when exposing only a time::Mutation \c const& through an interface allows only to
- ** attach new target elements, but not to change listeners or feed any value changes.
+ ** exposing only a time::Mutation \c const& through some interface allows only to attach
+ ** new target elements, but not to change listeners or feed any value changes.
**
** Using time::Control as an implementation building block and just exposing the
** change (function) operators or the listener attachment through an forwarding sub
@@ -71,7 +73,7 @@
** @note time::Control is default constructible and freely copyable.
**
**
- ** \par changing quantised (grid aligned) time entities
+ ** ## Changing quantised (grid aligned) time entities
**
** The time::Control element includes the functionality to handle grid aligned time values,
** both as target and as change/notification value. This ability is compiled in conditionally,
@@ -80,7 +82,8 @@
** the LIB_TIME_TIMEQUANT_H header guard needs to be defined, which happens automatically
** if lib/time/mutation.hpp is included prior to lib/time/control.hpp.
**
- ** \par implementation notes
+ **
+ ** # implementation notes
** - the validity of a given combination of change and target is checked immediately,
** when connecting to the target. Depending on the situation, the actual changes later
** are subject to specific treatment (e.g. frame quantisation)
diff --git a/src/stage/model/canvas-hook.hpp b/src/stage/model/canvas-hook.hpp
index 7b5d6d5ff..57d6c9350 100644
--- a/src/stage/model/canvas-hook.hpp
+++ b/src/stage/model/canvas-hook.hpp
@@ -88,6 +88,13 @@ namespace model {
/** extension point for time axis zoom management. */
virtual int translateTimeToPixels (TimeValue) const =0;
+
+ /** translate an offset in pixel coordinates into a temporal position
+ * @param anchor the start point on the time axis where to apply the delta
+ * @param deltaPx a delta given as canvas pixel displacement
+ * @return resulting TimeValue when applying the offset within current metric
+ */
+ virtual TimeValue applyScreenDelta(Time anchor, double deltaPx) const =0;
};
diff --git a/src/stage/timeline/clip-presenter.hpp b/src/stage/timeline/clip-presenter.hpp
index d939bb952..4772a56bf 100644
--- a/src/stage/timeline/clip-presenter.hpp
+++ b/src/stage/timeline/clip-presenter.hpp
@@ -226,14 +226,18 @@ namespace timeline {
: public interact::GestureObserver
{
ClipPresenter& subject_;
+ model::DisplayMetric const& metric_;
void
updateOffset (double deltaX, double deltaY) override
{
- std::cerr << _Fmt{"Gesture(%s) --> Δ := (%3.1f,%3.1f)"}
+ TimeValue newStartTime = metric_.applyScreenDelta(subject_.widget_->getStartTime(), deltaX);
+ std::cerr << _Fmt{"Gesture(%s) → Δ ≔ (%3.1f,%3.1f) ⟹ %s ↷ %s"}
% getCmdID()
% deltaX
% deltaY
+ % subject_.widget_->getStartTime()
+ % newStartTime
<< std::endl;
}
@@ -249,6 +253,7 @@ namespace timeline {
DragRelocateObserver(Symbol cmdID, ClipPresenter& clipPresenter)
: interact::GestureObserver{cmdID}
, subject_{clipPresenter}
+ , metric_{clipPresenter.widget_->getCanvas().getMetric()}
{ }
};
diff --git a/src/stage/timeline/timeline-layout.cpp b/src/stage/timeline/timeline-layout.cpp
index 7d54a2243..d6856190c 100644
--- a/src/stage/timeline/timeline-layout.cpp
+++ b/src/stage/timeline/timeline-layout.cpp
@@ -129,9 +129,16 @@ namespace timeline {
int
TimelineLayout::translateTimeToPixels (TimeValue startTimePoint) const
{
- return _raw(startTimePoint) * TODO_px_per_second / Time::SCALE; //////////TICKET #1213 : delegate zoom handling to the display manager (field #layout_) !!
+ return _raw(startTimePoint) * TODO_px_per_second / Time::SCALE; //////////TICKET #1213 : use a mix-in component, which in turn relies on the "ZoomWindow" !!
}
+ TimeValue
+ TimelineLayout::applyScreenDelta(Time anchor, double deltaPx) const
+ { //////////TICKET #1213 : use a mix-in component, which in turn relies on the "ZoomWindow" !!
+ return anchor + TimeValue{gavl_time_t(Time::SCALE * deltaPx / TODO_px_per_second)};
+ }
+
+
/**
* Perform a complete recursive pass over all elements relevant for layout,
diff --git a/src/stage/timeline/timeline-layout.hpp b/src/stage/timeline/timeline-layout.hpp
index 4bdfeb4d9..2de40bfdd 100644
--- a/src/stage/timeline/timeline-layout.hpp
+++ b/src/stage/timeline/timeline-layout.hpp
@@ -89,6 +89,7 @@
#include "stage/timeline/body-canvas-widget.hpp"
#include "stage/model/canvas-hook.hpp"
#include "stage/model/view-hook.hpp"
+#include "lib/time/timevalue.hpp"
//#include "lib/util.hpp"
@@ -100,6 +101,8 @@
namespace stage {
namespace timeline {
+ using lib::time::Time;
+
class LayoutElement;
class TrackHeadWidget;
class TrackBody;
@@ -140,8 +143,9 @@ namespace timeline {
void triggerDisplayEvaluation() override;
/////////////////////////////////////////////////////////////////////////////////////////////TICKET 1218 : better extract into a sub component when providing a non-dummy implementation
- virtual lib::time::TimeSpan coveredTime() const override;
- virtual int translateTimeToPixels (TimeValue) const override;
+ virtual lib::time::TimeSpan coveredTime() const override;
+ virtual int translateTimeToPixels (TimeValue) const override;
+ virtual TimeValue applyScreenDelta(Time, double) const override;
/////////////////////////////////////////////////////////////////////////////////////////////TICKET 1218 : better extract into a sub component when providing a non-dummy implementation
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index 21aa77a9c..10d600900 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -32884,7 +32884,23 @@
-
+
+
+
+
+
+
+
+
+
+ verwendet hart gedrahtete Konstante TODO_px_per_second
+
+
+
+
+
+
+
@@ -33072,7 +33088,7 @@
- der clipHook() delegiert an seinen jweiligen refHook_
+ der clipHook() delegiert an seinen jeweiligen refHook_
dieser wird bei der Konstruktion tatsächlich jweils auf den Anchor-Hook des Parent-Hook gesetzt
@@ -33168,15 +33184,15 @@