// v4's editing keys: undo/redo, delete the selected scene, +/- zoom the timeline, space/K/L play and pause, J back a second, S split. Scene keys do nothing in Simple mode, where no timeline shows. import * as edits from "../../shell/edits.js"; import { segments } from "../../shell/scenes.js"; export default { id: "keys", mount: "menubar.menus", needs: ["project", "selection", "keys"], setup({ app }) { const p = app.project, sel = app.selection; const scene = (fn) => (e) => fn(e); const frame = () => (p.project && p.project.frame_rate) || 25; const step = (dir) => scene((e) => (e && e.target && e.target.closest && e.target.closest("button, a, [role=slider], [role=tab], [role=radio], [role=option], [role=menuitem], [role=separator]") ? false : app.playhead.set(app.playhead.at + dir / frame()))); // a widget that uses the arrows keeps them const edge = (which) => { // I / O: the playhead to the picked clip's in / out point const s = p.project && segments(p.project).find((x) => x.kind === "scene" && x.id === sel.focus); if (!s) return false; app.playhead.set(which === "start" ? s.start : s.start + s.dur); }; const remove = scene(() => sel.ids.length ? sel.ids.forEach((id) => p.edit((pr) => edits.removeScene(pr, id))) : false); const off = [ app.keys.bind("mod+z", () => p.undo()), app.keys.bind("shift+mod+z", () => p.redo()), app.keys.bind("mod+y", () => p.redo()), app.keys.bind("delete", remove), app.keys.bind("backspace", remove), ...["+", "="].map((k) => app.keys.bind(k, scene(() => app.say("zoom.in")))), app.keys.bind("-", scene(() => app.say("zoom.out"))), app.keys.bind(" ", (e) => (e.target.closest && e.target.closest("button, a, [role=slider]") ? false : app.say("play.toggle"))), app.keys.bind("k", () => app.say("play.pause")), app.keys.bind("l", () => app.say("play.start")), app.keys.bind("j", () => app.playhead.set(app.playhead.at - 1)), app.keys.bind("s", scene(() => app.say("split"))), app.keys.bind("arrowleft", step(-1)), app.keys.bind("arrowright", step(1)), app.keys.bind("i", scene(() => edge("start"))), app.keys.bind("o", scene(() => edge("end"))), app.keys.bind("mod+,", () => (app.openSettings ? app.openSettings() : false)), ]; return () => off.forEach((f) => f()); }, };