mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-30 04:57:54 -06:00
Merge remote-tracking branch 'upstream/main' into gap-behaviors-presets
This commit is contained in:
+4
-1
@@ -533,7 +533,10 @@ indices): character attributes
|
||||
starts editing (`position` instead of `box` makes point text; `vertical: true` vertical type).
|
||||
2. `text.insert {"text":"Hello world"}` types at the caret (replacing the selection);
|
||||
`text.setSelection {"start":6,"end":11}` selects "world"; `text.moveCaret {"to":"wordLeft",
|
||||
"extend":true}` moves like the arrow keys; `text.delete {"word":true}` is Alt+Backspace.
|
||||
"extend":true}` moves like the arrow keys; `text.delete {"word":true}` is Alt+Backspace;
|
||||
`text.deleteSurrounding {"before":1,"after":2,"bytes":true}` deletes the characters around the
|
||||
selection without deleting it (what an input method's replacement asks for: the selection stays
|
||||
for the commit that follows; a byte count ending inside a character leaves that character).
|
||||
3. `layer.setText {"range":[6,11], "size":40, "fill":"#ff5500"}` styles the selection (the
|
||||
Character panel does the same); with an empty range it sets the style the next typed text takes.
|
||||
4. `edit.copy`, `edit.paste`, `edit.pasteTextMatchFormatting` and `edit.pasteTextFormattingOnly`
|
||||
|
||||
@@ -356,7 +356,7 @@ to the preview cache. Scoped allocation failures retain the adaptive budget/CPU
|
||||
|
||||
**Recovery boundary:** the host installs handlers through eframe's CreationContext, after egui's
|
||||
presentation pipelines but before EffectCraft's pipelines. This does not cover that earlier egui
|
||||
startup window. eframe 0.36.2 supports lost-surface recreation, not replacing its live device and
|
||||
startup window. eframe 0.37 supports lost-surface recreation, not replacing its live device and
|
||||
all presentation resources. Device loss therefore requires restarting the presentation backend;
|
||||
CPU compositing alone cannot restore that display. No automatic restart or persistent safe-mode
|
||||
sentinel is implemented here. Browser scope futures are not synchronously awaited; the browser page
|
||||
|
||||
+60
-17
@@ -126,7 +126,7 @@ frames and can be assigned through `shortcuts.set`.
|
||||
|
||||
| Method | Params | Result |
|
||||
|---|---|---|
|
||||
| `ui.screenshot` | `{path?, panel?, id?}` | `{path, width, height}`: a PNG of the window, or cropped to one panel or element. |
|
||||
| `ui.screenshot` | `{path?, panel?, id?}` | `{path, width, height}`: a PNG of the window, or cropped to one panel or element. The panel or element rectangle is resolved when the capture is issued (after the UI settles), so it follows a panel that moved; a panel or id that is not on screen is retried and then reported, never replaced by a whole-window shot. |
|
||||
|
||||
Element ids are stable, for example `tools.Selection`, `panel.Timeline`, `panel.tab.EffectControls`,
|
||||
`panel.tab.Timeline.<comp>` (one Timeline tab per open comp; `panel.tab.Timeline` is the shown
|
||||
@@ -186,20 +186,63 @@ including outside the layer's `[in, out)` range. Timing metadata carries outside
|
||||
`prop.get.time` is comp seconds. For these commands, `path` or `prop` identifies a property, not a group.
|
||||
Set a layer's offset with `layer.timing {layer, start}` (comp seconds).
|
||||
|
||||
Panel moves, tab ordering, edge splits and floating geometry use shared docking transactions.
|
||||
`window.floatPanel` requires exactly four finite numbers when `rect` is supplied. Invalid
|
||||
geometry or missing source/anchor panels leaves the layout unchanged. The persisted workspace
|
||||
shape is unchanged: accordion open states and explicit heights, floating groups, and dynamic
|
||||
viewer/ScriptUI identities remain app data. Pointer drops use the same shared placement rules
|
||||
as commands, with floating groups resolved in their actual window stacking order.
|
||||
Panels dock in craft-ui's shared docking (`craft_ui::docking`): split frames, tab groups,
|
||||
stacked panels and floating windows. Every change, by pointer, menu or command, is one
|
||||
transaction that checks the whole result; an invalid one returns an error and leaves the layout
|
||||
unchanged. No move or float may leave the docked area empty; closing its last panel is allowed.
|
||||
Panels name themselves by id (`"EffectControls"`), by title (`"Effect Controls"`) where a command
|
||||
takes a name, or as `{"Viewer":42}` and `{"ScriptPanel":77}` for viewers and ScriptUI panels.
|
||||
|
||||
`window.dockAction` accepts `{action}` using the shared docking action's JSON form. It
|
||||
covers tab moves and ordering, split and floating geometry, activation, and closing.
|
||||
For example, `{"action":{"ResizeSplit":{"path":[],"size":{"FixedFirst":360}}}}`
|
||||
resizes the root split; path entries use `false` for the first child and `true` for
|
||||
the second. `{"action":{"MoveFloating":{"panel":"Info","rect":[45,65,420,320]}}}`
|
||||
repositions and resizes the floating group containing Info. Invalid actions leave the
|
||||
layout unchanged. Pointer gestures dispatch through this same catalog command.
|
||||
EffectCraft also supports `SetStackOpen` and `ResizeStack`. Dynamic panel identities use
|
||||
`{"Viewer":42}` or `{"ScriptPanel":77}` in the action. Closing runs the existing viewer
|
||||
and ScriptUI lifecycle callbacks; opening uses the existing panel creation commands.
|
||||
- `window.dockAction {action}` applies one craft-ui `Action` in its JSON form. For example,
|
||||
`{"action":{"ResizeSplit":{"path":[],"size":{"FixedFirst":360}}}}` resizes the root split
|
||||
(path entries are `false` for the first child and `true` for the second), and
|
||||
`{"action":{"MoveFloating":{"panel":"Info","rect":[45,65,420,320]}}}` moves and resizes the
|
||||
floating window holding Info. `Open` and `OpenAt` are refused: panels open through the panel
|
||||
commands (`window.panel`, `ui.panel.show`), which run the viewer and ScriptUI lifecycles.
|
||||
Closing runs them too. Pointer gestures dispatch through this command.
|
||||
- craft-ui's commands: `window.panel.move`, `.float`, `.dock`, `.activate`, `.close`,
|
||||
`.closeGroup`, `.closeOthers`, `.minimize`, `.iconic`, `.window` and `.layout`, with the params
|
||||
of craft-ui's `DockCommand` (`docs/ui-docking.md` in craft-libs). `window.panel.<Panel>`
|
||||
(`window.panel.Align`) opens and shows that panel. `window.panel.activate` on a closed panel
|
||||
reopens it where it was.
|
||||
- `ui.dock {operation, panel, …}` or `ui.dock {action}`: craft-ui's `ui.dock` operations
|
||||
(`open`, `close`, `activate`, `float {rect}`, `moveFloating {rect}`,
|
||||
`move {target, zone?, before?}`, `setStackOpen {open}`, `resizeStack {height}`,
|
||||
`resizeSplit {path, size}`; `rect` is `[x, y, width, height]`). It returns
|
||||
`{"docking": workspace}`. `ui.dock.reset` returns the current workspace to its saved or
|
||||
built-in layout and returns the same.
|
||||
- `window.dockPanel {panel, anchor?, zone?, before?}` docks as `window.panel.dock`: `zone` is
|
||||
`center`, `tab`, `left`, `right`, `top`, `bottom`, `above` or `below`; without an anchor a
|
||||
side zone docks along that edge of the whole workspace. `window.floatPanel {panel, rect?}`
|
||||
requires exactly four finite numbers when `rect` is given and otherwise floats a 420x320
|
||||
window in the middle of the app window. `window.closePanel {panel}` closes it.
|
||||
- `window.panelWindow {panel, window?}` puts a panel in a floating window of its own with a
|
||||
desktop place over the panel's place in the main window, and returns `{"window": bool}`. A
|
||||
docked panel floats first. `window` false docks it again, as a tab of the first docked group;
|
||||
without `window` it toggles.
|
||||
|
||||
On desktop every floating window is an OS window of its own (craft-ui's `native-windows`), which
|
||||
can go on another monitor; on Wayland, on the web and where egui embeds viewports, floating
|
||||
windows stay in the main window. Keys pressed in a floating window that none of its widgets uses
|
||||
run the main window's shortcuts, and files dropped on one import as on the main window. While a
|
||||
modal dialog is open, floating windows take no input.
|
||||
|
||||
The automation ids of the docking chrome are `panel.tab.<Panel>`, `panel.drag.<Panel>` (a
|
||||
group's drag bar), `panel.tabs.more.<Panel>`, `panel.menu.<Panel>` (≡), `panel.header.<Panel>`
|
||||
(a stacked panel's open and close button), `panel.tab.<Panel>.lock` (viewer lock),
|
||||
`panel.tab.Timeline.<comp>` and `panel.tab.Timeline.close` (the Timeline's comp tabs),
|
||||
`panel.float.<n>.move`, `.close`, `.resize` and `.resize.<Edge>` for floating window `n`,
|
||||
`dock.gutter.<path>` for dividers (`a`/`b` per split level; a stack's gap below entry `i` adds
|
||||
`s<i>`) and `dock.corner.<outer>.<inner>` where two dividers meet.
|
||||
|
||||
Saved workspaces (`workspaces.json`, version 2) hold craft-ui `Workspace`s: the layout, the
|
||||
closed panels with where each goes back, the lock, and each floating window's desktop place. A
|
||||
version 1 file (EffectCraft 0.10 and earlier) and the older unversioned record of
|
||||
named workspaces load with every panel in place: the current layout, the named workspaces,
|
||||
floating windows and their native window places. A column of stacked frames becomes tab groups
|
||||
split top to bottom: each open frame keeps all its tabs and its height (as a fixed size), and a
|
||||
closed frame's tabs join the open frame above it. A native window's place moves from the OS
|
||||
window's outer position to its content's, by the main window's title bar, before the first save.
|
||||
Panels that were closed stay closed and reopen at their default place. The first save writes version 2 and keeps
|
||||
the earlier file as `workspaces.old.json`. A damaged, unknown or newer file loads as the default
|
||||
layout and is left unchanged.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -76,7 +76,7 @@ are grouped by area; the issue tracker has the rest.
|
||||
| 17 | **Media Browser lists files import refuses** | `media_browser.rs` lists AVI; `media::is_importable` has none of them (Targa and Radiance HDR import since #745; DPX and Cineon since #756, log shown as stored: no Cineon Settings conversion yet; MXF OP1a / OP-Atom since #767; FilmCraft has no AVI demuxer); #431 and #324 closed | Confusing failures on common VFX formats | 15–30 h | G6 · [file-format-parity.md](file-format-parity.md) |
|
||||
| 18 | **Relative paths and relinking** | Projects store absolute footage paths; no relink when a project moves | Moving or sharing a project breaks it | 6–12 h | G4 · [file-format-parity.md](file-format-parity.md) |
|
||||
| 19 | **Plug-in ecosystem** | No After Effects SDK hosting (#600, #327 OpenFX, #334, #376 plug-in manager); our WebAssembly API has no third-party plug-ins | Many pro projects depend on Trapcode, Element, Saber… | 40–80 h for API growth; SDK hosting needs an owner decision | G8 · [scripting-parity.md](scripting-parity.md) |
|
||||
| 20 | **Multi-monitor and video output** | #486: any panel can move into a native window of its own (panel menu ▸ Move Panel to New Window, `window.panelWindow`) and so onto another screen, restored with the workspace; still missing: dragging tabs between those windows, app shortcuts while one has the focus, named workspaces remembering them, Mercury Transmit to video hardware (we have a second preview window only) | Two-screen setups are standard for professionals | 10–20 h | G2 · [hardware-parity.md](hardware-parity.md) |
|
||||
| 20 | **Multi-monitor and video output** | #486: on Windows, macOS and X11 every floating panel is an OS window of its own (Undock Panel, a drag out of the main window, panel menu ▸ Move Panel to New Window, `window.panelWindow`) and so can go onto another screen (on Wayland, the web and in embedded viewports floating panels stay in the app window, since Wayland reports no window positions); tabs and groups drag between windows, shortcuts work in them, and the current and named workspaces restore their places; still missing: Mercury Transmit to video hardware (we have a second preview window only) | Two-screen setups are standard for professionals | 10–20 h | G2 · [hardware-parity.md](hardware-parity.md) |
|
||||
| 21 | **Small 26.x features** | Proportional Scrubbing (26.2), pasting Illustrator's own clipboard data as shapes (26.3; SVG markup on the clipboard pastes as a shape layer, #738), variable-font filter (26.3), the rebuilt Effect Controls (26.5). Percentage guides (View ▸ Add Percentage Guide, Convert Guides to Percentage / Pixels) and effect colour labels (Effect Controls header bar and right-click Label menu, `effect.setLabel`) are in (#1095), built from the release notes' one-line descriptions and never compared with After Effects: the Timeline's effect rows wear the label as a colour bar on the left edge (#1509), but After Effects' exact UI there is unknown | Users of the current version expect them | 10–20 h left | — · [ui-parity.md](ui-parity.md) |
|
||||
| 22 | **Encoder efficiency** | HEVC / AV1 have no B-frames, multi-reference or SAO / CDEF; Opus no FEC / DTX; single-file intermediates are 8-bit uncompressed QuickTime only (#372 closed by #778: no 16-bpc, AVI or lossless-compressed codec); #325 render over existing file | Larger files than After Effects + Media Encoder | 20–40 h | G6 · [file-format-parity.md](file-format-parity.md) |
|
||||
| 23 | **Essential Graphics interchange** | Templates are `.ectemplate`, not `.mogrt`; #338 and #611 closed | Premiere editors can't use our templates | 15–30 h | — · [file-format-parity.md](file-format-parity.md) |
|
||||
|
||||
+3
-4
@@ -16,7 +16,7 @@ feel and platform differences, and the 26.x interface changes are not in yet.
|
||||
| Area | Status | % | Evidence and gaps |
|
||||
|---|---|---:|---|
|
||||
| Menu bar | After Effects' menus, order, submenus and labels; native on macOS; keyboard-operable in-window bar | 95% | 587 entries in `crates/engine/src/menus.rs`; Adobe-service entries omitted by design; `ui_menus` tests (#279) |
|
||||
| Panels and workspaces | Every After Effects panel; all standard workspaces; drag-to-dock, tabs, floating panels, maximise | 75% | `ui_tabs`, `ui_panels`; panels move into their own native windows on any screen (#486 open: no dragging tabs between those windows); #302, #301 and #320 (docking, stacked-panel headers, workspace persistence) are closed |
|
||||
| Panels and workspaces | Every After Effects panel; all standard workspaces; drag-to-dock, tabs, floating panels, maximise | 75% | `ui_tabs`, `ui_panels`; on Windows, macOS and X11 floating panels are OS windows of their own on any screen (on Wayland, the web and in embedded viewports they stay in the app window), with tabs and groups dragging between windows and shortcuts working in them (#486); #302, #301 and #320 (docking, stacked-panel headers, workspace persistence) are closed |
|
||||
| Timeline | Switches, modes, parent & link, twirl-downs, reveal shortcuts (U, UU, P, S, R, T, A, E, M, F, Alt+Shift…), pick whips, graph editor, work area, markers | 75% | `ui_keyframes`, `ui_timeline_*`; expand precomps in place (#601); #456, #457, #569 and #355 (Graph Editor jitter and buttons, negative rotation, bulk keyframing) are closed; Proportional Scrubbing (26.2: Ctrl+Alt / Cmd+Opt scrub of hot text spreads the change over the selected layers by selection order, #770) matched for layers selected as a whole, not yet for individually selected properties; every layer has the Video switch, nulls, cameras and lights included (a hidden null, camera or light has no box or handles in the viewer and isn't picked there; other selected hidden layers keep their layer controls and paths, #1769); a row control (a switch, the label swatch, a Modes cell) clicked on one of several selected layers acts on the whole selection, with the layers the switch doesn't apply to left out (#1849); a shape group's inner Contents (After Effects' elided Vectors group) draws no row — the group's path, fill/stroke and Transform list directly under it |
|
||||
| Composition viewer | Selection, handles with direction-aware cursors, rulers, guides, grids, snapping, channels, exposure, region of interest, snapshots, 3D views, Spacebar hand | 70% | `ui_viewer`, `ui_viewers`; Cmd/Ctrl +/− doesn't zoom (#570); anchor point grab on Linux (#492); #352 (snapping) is closed; no 3D transform gizmos (#392, #347); percentage guides (26.5) exist as View ▸ Add Percentage Guide and Convert Guides to Percentage / Pixels (a guide stores a percent of the comp, so it follows comp-size changes; behaviour inferred from the release note, not compared with After Effects); Copy Frame to Clipboard (26.3) is in the Composition menu and the viewer's context menu |
|
||||
| Tools panel | All After Effects tools; long-press flyouts; Tool Creates Shape / Mask; Fill / Stroke options | 80% | #213, #227 fixed; #553 (pen and vertex tools on motion paths) is closed |
|
||||
@@ -41,9 +41,8 @@ cover shape paths and masks, corner-vertex dragging and undo, and layers without
|
||||
|
||||
## Estimate
|
||||
|
||||
**≈ 60–120 h**: the open interaction issues above (25–45 h, about 0.2–0.5 h each with a scripted
|
||||
test), 3D gizmos 8–15 h, multi-monitor panels 10–20 h, the 26.x interface changes 10–20 h, an
|
||||
accessibility pass 15–30 h. Checking feel against After Effects needs the owner's Mac with After
|
||||
**≈ 60–110 h**: the open interaction issues above (25–45 h, about 0.2–0.5 h each with a scripted
|
||||
test), 3D gizmos 8–15 h, the 26.x interface changes 10–20 h, an accessibility pass 15–30 h. Checking feel against After Effects needs the owner's Mac with After
|
||||
Effects running; most of the rest parallelises.
|
||||
|
||||
## Revision history
|
||||
|
||||
Reference in New Issue
Block a user