diff --git a/tl/src/tl/events.cljs b/tl/src/tl/events.cljs index 9a63411..c0e31ed 100644 --- a/tl/src/tl/events.cljs +++ b/tl/src/tl/events.cljs @@ -71,14 +71,22 @@ (rf/reg-event-db ::set-zoom (fn [db [_ z]] (assoc-in db [:view :zoom] z))) (rf/reg-event-db ::set-row-h (fn [db [_ h]] (assoc-in db [:view :row-h] h))) -(rf/reg-event-db ::expand (fn [db [_ gid]] (update-in db [:view :stack] conj gid))) -(rf/reg-event-db ::collapse (fn [db _] (update-in db [:view :stack] - (fn [s] (if (> (count s) 1) (pop s) s))))) -(rf/reg-event-db ::pop-to - (fn [db [_ gid]] - (update-in db [:view :stack] - (fn [s] (let [i (first (keep-indexed #(when (= gid %2) %1) s))] - (if i (subvec s 0 (inc i)) s)))))) +;; moving around the timeline stack: pause and seek the video to the context +;; we land in, at its remembered playhead (0 = that context's start). +(defn- enter-ctx + [db stack-fn] + (let [db (update-in db [:view :stack] stack-fn) + ctx (peek (get-in db [:view :stack])) + segs (scene/content-segments (:scene db) ctx) + sf (scene/local->source segs (scene/playhead (:view db) ctx))] + {:db db :player/pause true :player/seek (when sf (/ sf (:fps db)))})) + +(rf/reg-event-fx ::expand (fn [{:keys [db]} [_ gid]] (enter-ctx db #(conj % gid)))) +(rf/reg-event-fx ::collapse (fn [{:keys [db]} _] (enter-ctx db #(if (> (count %) 1) (pop %) %)))) +(rf/reg-event-fx ::pop-to + (fn [{:keys [db]} [_ gid]] + (enter-ctx db (fn [s] (let [i (first (keep-indexed #(when (= gid %2) %1) s))] + (if i (subvec s 0 (inc i)) s)))))) ;; --- authoring ------------------------------------------------------------ ;; The draft is just a normal annotation group, flagged :draft (:new while diff --git a/tl/src/tl/views.cljs b/tl/src/tl/views.cljs index 732316e..d69b2b9 100644 --- a/tl/src/tl/views.cljs +++ b/tl/src/tl/views.cljs @@ -23,15 +23,19 @@ (set! (.-currentTime @video-el) (/ source-frame fps)))) (defn- seg-at - "Index of the segment whose local range contains `local` (0 if none)." + "Index of the segment whose LOCAL range contains `local` (0 if none)." [segs local] (or (first (keep-indexed (fn [i {[c d] :local}] (when (<= c local d) i)) segs)) 0)) -(defn- stop-play! [] - (when @raf (js/cancelAnimationFrame @raf) (reset! raf nil)) - (reset! play nil) - (when-let [v @video-el] (.pause v)) - (rf/dispatch [::events/set-playing false])) +(defn- seg-at-src + "Index of the segment whose SOURCE range contains source frame `sf` (0 if none)." + [segs sf] + (or (first (keep-indexed (fn [i {[a b] :src}] (when (<= a sf b) i)) segs)) 0)) + +;; The