import {html} from "@benev/slate"
import {light_view} from "../../../../context/context.js"
import {ProposedTimecode} from "../../../../context/types.js"
import {calculate_effect_width} from "../../utils/calculate_effect_width.js"
import {calculate_start_position} from "../../utils/calculate_start_position.js"
import {calculate_effect_track_index} from "../../utils/calculate_effect_track_index.js"
import {calculate_effect_track_placement} from "../../utils/calculate_effect_track_placement.js"
import {getEffectsOnTrack} from "../../../../context/controllers/timeline/utils/get-effects-on-track.js"
import {EffectDrag, EffectDrop} from "../../../../context/controllers/timeline/parts/drag-related/effect-drag.js"
export const ProposalIndicator = light_view(use => () => {
const controller = use.context.controllers.timeline
const zoom = use.context.state.zoom
const trim_handler = use.context.controllers.timeline.effectTrimHandler
const effectDragHandler = controller.effectDragHandler
const [_, setDraggedOverAddTrackIndicator, getDraggedOverAddTrackIndicator] = use.state(false)
const [proposedTimecode, setProposedTimecode] = use.state({
proposed_place: {track: 0, start_at_position: 0},
duration: null,
effects_to_push: null
})
const track_effects = getEffectsOnTrack(use.context.state, proposedTimecode.proposed_place.track)
function translate_to_timecode({grabbed, position}: EffectDrop | EffectDrag) {
const baseline_zoom = use.context.state.zoom
const [x, y] = position.coordinates
const start = ((x - grabbed.offset.x) * Math.pow(2, -baseline_zoom))
const timeline_start = start >= 0 ? start : 0
const timeline_end = ((x - grabbed.offset.x) * Math.pow(2, -baseline_zoom)) + (grabbed.effect.end - grabbed.effect.start)
const track = calculate_effect_track_index(y, use.context.state.tracks.length, use.context.state.effects) > use.context.state.tracks.length - 1
? use.context.state.tracks.length - 1
: calculate_effect_track_index(y, use.context.state.tracks.length, use.context.state.effects)
return {
timeline_start,
timeline_end,
track
}
}
use.mount(() => {
const disposeDrop = effectDragHandler.onDrop(props => {
const timecode = translate_to_timecode(props)
const proposed_timecode = controller
.calculate_proposed_timecode(
timecode,
props,
use.context.state
)
controller.set_proposed_timecode(props, proposed_timecode, use.context.state)
use.context.controllers.compositor.managers.transitionManager.removeTransitionFromNoLongerTouchingEffects(use.context.state)
})
const disposeDrag = effectDragHandler.onEffectDrag(props => {
if(props.position && props.grabbed) {
const timecode = translate_to_timecode(props)
const proposed_timecode = use.context.controllers.timeline
.calculate_proposed_timecode(
timecode,
props,
use.context.state
)
setDraggedOverAddTrackIndicator(props.position.indicator?.type === "addTrack")
setProposedTimecode(proposed_timecode)
}
})
return () => {disposeDrag(); disposeDrop()}
})
const text_effect_specific_styles = () => {
return !track_effects.some(effect => effect.kind !== "text") && track_effects.find(effect => effect.kind === "text")
? `height: 30px;`
: ""
}
return html`
`
})