46 lines
1.2 KiB
Go
46 lines
1.2 KiB
Go
package transcode
|
||
|
||
// HandlerZoom holds the current scroll center for timeline zoom calculations.
|
||
type HandlerZoom struct {
|
||
Center float64 // center of the visible window in seconds
|
||
}
|
||
|
||
// ZoomResult is the result of a TimelineZoom calculation.
|
||
type ZoomResult struct {
|
||
Type string `json:"type"`
|
||
Percent float64 `json:"percent"`
|
||
ViewStart float64 `json:"viewStart"`
|
||
ViewEnd float64 `json:"viewEnd"`
|
||
}
|
||
|
||
// TimelineZoom computes the visible time window for the given zoomPercentage
|
||
// (1–100, where 100 = full duration visible) centered on h.Center.
|
||
func (h *HandlerZoom) TimelineZoom(zoomPercentage, duration float64) *ZoomResult {
|
||
visibleDuration := duration * (zoomPercentage / 100)
|
||
half := visibleDuration / 2
|
||
|
||
viewStart := h.Center - half
|
||
viewEnd := h.Center + half
|
||
|
||
// Clamp to [0, duration], shifting the window rather than just truncating
|
||
// so the visible span stays the same size when near the edges.
|
||
if viewStart < 0 {
|
||
viewEnd -= viewStart
|
||
viewStart = 0
|
||
}
|
||
if viewEnd > duration {
|
||
viewStart -= viewEnd - duration
|
||
viewEnd = duration
|
||
}
|
||
if viewStart < 0 {
|
||
viewStart = 0
|
||
}
|
||
|
||
return &ZoomResult{
|
||
Type: "zoom",
|
||
Percent: zoomPercentage,
|
||
ViewStart: viewStart,
|
||
ViewEnd: viewEnd,
|
||
}
|
||
}
|