mirror of
https://github.com/storytold/effectcraft.git
synced 2026-11-06 02:20:50 +00:00
* About: credits tables with resizable columns that fit without side-scrolling Contributors and Models were egui Grids inside a two-way scroll area, so the table opened wider than the dialog and scrolled sideways, and Company and Model sat almost touching. Both are now egui_extras tables: each column opens at its header and widest cell, the spare width goes to the text columns (Name; Company and Model), and every column edge can be dragged. Widening a column grows the table like a spreadsheet, and only then does it scroll sideways; the header stays put while the rows scroll. Counts and dates are right-aligned and every cell is vertically centred. The sorted column stays highlighted, with its direction on the toolbar's arrow button, so headers no longer reserve room for an arrow. The About dialog is 820 points wide (modals still shrink to the window) so every column fits at its natural width. egui_extras comes from the pinned egui fork without default features; it adds enum-map. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * About: credits column widths come from a tested fit_widths The opening widths of the credits tables are a pure function now, with unit tests that a fitted table fills its room exactly (no side-scrolling, no gap), that spare width goes to the growing columns, and that too little room shrinks only those. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let every credits column be dragged, and refit changed tables The last column was egui's remainder column, which has no drag handle, so it could only be resized from the edge before it. It is now an ordinary column with its own handle. A table keeps its column widths, so switching to a longer name left the Name column at its old width and clipped the text. The table now goes back to the opening fit whenever that fit changes: a longer widest cell or a resized window. Dragged widths are dropped at that point. fit_widths could overflow the room when one column hit the minimum, because the other columns did not take up its share. Columns now give way in proportion to their width above the minimum. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Refit credits tables on what they measure, not the fitted widths Comparing the fitted widths missed the case it was meant for. Name is the only growing column, so a longer name takes its extra width from the spare room and the fit comes out the same: a dragged Name width stayed, clipping the longer name. It could also drop dragged widths by accident. The fit comes from the available width inside the scroll area, which scrolling can nudge, so scrolling a widened table could reset it. The table now compares the natural widths and the clip rect's width, which scrolling does not move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
260 lines
12 KiB
TOML
260 lines
12 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["crates/*", "apps/*", "xtask"]
|
|
default-members = ["crates/*", "apps/*"]
|
|
|
|
[workspace.package]
|
|
version = "0.21.0"
|
|
edition = "2024"
|
|
license = "MIT OR Apache-2.0"
|
|
rust-version = "1.95"
|
|
repository = "https://github.com/storytold/effectcraft"
|
|
|
|
[workspace.dependencies]
|
|
craft-pdf = { git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0", version = "=0.1.0", default-features = false, features = ["read"] }
|
|
craft-docpath = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0" }
|
|
craft-quit = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0" }
|
|
craft-ecproj-format = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "ca1b5e2edb8568335c6c14f390307bd5beae8238" }
|
|
# craft-update: app-specific pretend versions apply to startup and manual checks.
|
|
craft-update = { git = "https://github.com/storytold/craft-libs", version = "=0.1.0", rev = "c5a1cbfb5f9049f9270955caffb5bee5997aebf7", features = ["egui"] }
|
|
# internal
|
|
effectcraft-time = { path = "crates/time" }
|
|
effectcraft-geom = { path = "crates/geom" }
|
|
effectcraft-color = { path = "crates/color" }
|
|
effectcraft-raster = { path = "crates/raster" }
|
|
effectcraft-path = { path = "crates/path" }
|
|
effectcraft-keyframe = { path = "crates/keyframe" }
|
|
effectcraft-project = { path = "crates/project" }
|
|
effectcraft-text = { path = "crates/text" }
|
|
effectcraft-effects = { path = "crates/effects" }
|
|
effectcraft-track = { path = "crates/track" }
|
|
effectcraft-segment = { path = "crates/segment" }
|
|
effectcraft-sam2 = { path = "crates/sam2" }
|
|
effectcraft-model = { path = "crates/model" }
|
|
effectcraft-render = { path = "crates/render" }
|
|
effectcraft-gpu = { path = "crates/gpu" }
|
|
effectcraft-media = { path = "crates/media" }
|
|
effectcraft-export = { path = "crates/export" }
|
|
effectcraft-expr = { path = "crates/expr" }
|
|
effectcraft-lottie = { path = "crates/lottie" }
|
|
effectcraft-interchange = { path = "crates/interchange" }
|
|
effectcraft-pdf = { path = "crates/pdf" }
|
|
effectcraft-psd = { path = "crates/psd" }
|
|
effectcraft-aep = { path = "crates/aep" }
|
|
effectcraft-vp9enc = { path = "crates/vp9enc" }
|
|
effectcraft-svg = { path = "crates/svg" }
|
|
effectcraft-engine = { path = "crates/engine" }
|
|
effectcraft-host = { path = "crates/host" }
|
|
effectcraft-ui-egui = { path = "crates/ui-egui" }
|
|
effectcraft-automation = { path = "crates/automation" }
|
|
effectcraft-opusenc = { path = "crates/opusenc" }
|
|
effectcraft-script = { path = "crates/script" }
|
|
effectcraft-hevcenc = { path = "crates/hevcenc" }
|
|
effectcraft-av1enc = { path = "crates/av1enc" }
|
|
effectcraft-plugin = { path = "crates/plugin" }
|
|
|
|
# foundation
|
|
thiserror = "2"
|
|
serde = { version = "1", features = ["derive", "rc"] }
|
|
serde_json = { version = "1", features = ["float_roundtrip"] }
|
|
log = "0.4"
|
|
# All date/time conversion goes through chrono (no hand-rolled calendar code beyond the 400-year range extension; AGENTS.md).
|
|
chrono = { version = "0.4.45", default-features = false, features = ["std"] }
|
|
rayon = "1"
|
|
# std::time::Instant/SystemTime on native; the browser clock on wasm32 (std's panic there).
|
|
web-time = "1"
|
|
gif = "0.14"
|
|
proptest = "1"
|
|
|
|
# scripting (expressions)
|
|
boa_engine = { version = "0.22", default-features = false }
|
|
# WebAssembly effect plug-ins (sandboxed interpreter; MIT/Apache-2.0, pure Rust)
|
|
wasmi = { version = "2", default-features = false, features = ["std", "validate", "wat", "deterministic", "portable-dispatch"] }
|
|
|
|
# geometry / fonts
|
|
kurbo = { version = "0.13", features = ["serde"] }
|
|
tiny-skia = { version = "0.12", default-features = false, features = ["std", "simd"] }
|
|
skrifa = { version = "0.44", default-features = false, features = ["std"] }
|
|
harfrust = { version = "0.12", default-features = false, features = ["std"] }
|
|
exr = "1.74"
|
|
image = { version = "0.25", default-features = false, features = ["png", "jpeg"] }
|
|
same-file = "1.0"
|
|
tempfile = "3.27"
|
|
|
|
# media codecs + containers: FilmCraft's pure-Rust crates, pinned to a revision (plan/adr/0001).
|
|
# Only `crates/media`, `crates/export` and `crates/interchange` may depend on these.
|
|
filmcraft-codecs = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-media = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-frame = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-color = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-time = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
# encoders + muxer (crates/export)
|
|
filmcraft-h264enc = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-prores = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-aac = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-isobmff = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
# container headers read for AAC channel layouts (crates/media)
|
|
filmcraft-matroska = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-mpegts = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
# decoder used as the round-trip oracle of effectcraft-opusenc (crates/export dev-dependency)
|
|
filmcraft-opus = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-vp9 = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
# decoders used as the round-trip oracles of effectcraft-hevcenc / effectcraft-av1enc (dev-dependencies only)
|
|
filmcraft-hevc = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-av1 = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
# timeline interchange (EDL, FCP7 XML, FCPXML, OTIO) for Premiere Pro interop (crates/interchange only)
|
|
filmcraft-interchange = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-project = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
filmcraft-geom = { git = "https://github.com/storytold/filmcraft", rev = "09aaf9bf15d510eda1c413c0ccabb1d7e08b41c5" }
|
|
|
|
# gpu (the same wgpu eframe / egui-wgpu use)
|
|
wgpu = { version = "30.0.1", features = ["fragile-send-sync-non-atomic-wasm"] }
|
|
bytemuck = "1"
|
|
pollster = "1"
|
|
|
|
# ui
|
|
# Shared frontend components; keep this dependency above the engine boundary.
|
|
# Shared UI and the complete egui family select reviewed immutable commits below.
|
|
craft-ui = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0", features = ["serde"] }
|
|
# `default_fonts` and `monochrome_emoji_fonts` are explicit: the app's `FontDefinitions::default()`
|
|
# and its `✔`/`▣` chrome glyphs need both, and kittest's own dev-dependencies do not propagate.
|
|
egui = { version = "0.37", default-features = false, features = ["default_fonts", "monochrome_emoji_fonts"] }
|
|
eframe = { version = "0.37", default-features = false }
|
|
# Resizable table columns (About ▸ Contributors / Models); no image loaders.
|
|
egui_extras = { version = "0.37", default-features = false }
|
|
egui_kittest = "0.37"
|
|
rfd = "0.17"
|
|
cpal = "0.16"
|
|
# The operating system's interface language (MIT/Apache-2.0, no dependencies on desktop).
|
|
sys-locale = "0.3"
|
|
|
|
# Local co-development against a FilmCraft checkout next to this repo: uncomment.
|
|
# [patch."https://github.com/storytold/filmcraft"]
|
|
# filmcraft-codecs = { path = "../filmcraft/crates/codecs" }
|
|
# filmcraft-media = { path = "../filmcraft/crates/media" }
|
|
# filmcraft-frame = { path = "../filmcraft/crates/frame" }
|
|
# filmcraft-color = { path = "../filmcraft/crates/color" }
|
|
# filmcraft-time = { path = "../filmcraft/crates/time" }
|
|
# filmcraft-h264enc = { path = "../filmcraft/crates/h264enc" }
|
|
# filmcraft-prores = { path = "../filmcraft/crates/prores" }
|
|
# filmcraft-aac = { path = "../filmcraft/crates/aac" }
|
|
# filmcraft-isobmff = { path = "../filmcraft/crates/isobmff" }
|
|
# filmcraft-matroska = { path = "../filmcraft/crates/matroska" }
|
|
# filmcraft-mpegts = { path = "../filmcraft/crates/mpegts" }
|
|
|
|
[workspace.lints.rust]
|
|
unsafe_code = "forbid"
|
|
|
|
[workspace.lints.clippy]
|
|
cognitive_complexity = "deny"
|
|
too_many_arguments = "deny"
|
|
wildcard_imports = "deny"
|
|
dbg_macro = "warn"
|
|
todo = "warn"
|
|
needless_range_loop = "allow"
|
|
type_complexity = "allow"
|
|
|
|
[profile.dev.package."*"]
|
|
opt-level = 2
|
|
debug = false
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
# Panics and backtraces keep file and line; full debug info only made the many test binaries large.
|
|
debug = "line-tables-only"
|
|
|
|
# Same settings as `dev`, but with full debug info for interactive debugger sessions: local
|
|
# variables, parameters and column breakpoints work. Use `--profile dev-full` when debugging;
|
|
# everything else stays on the fast default. See CONTRIBUTING.md, "Setup".
|
|
[profile.dev-full]
|
|
inherits = "dev"
|
|
debug = true
|
|
|
|
# Pixel hot loops: keep debug builds interactive.
|
|
[profile.dev.package.effectcraft-raster]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-render]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-gpu]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-effects]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-track]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-path]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-media]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-opusenc]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-export]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-vp9enc]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-hevcenc]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.effectcraft-av1enc]
|
|
opt-level = 3
|
|
|
|
# FilmCraft codec hot loops (same settings as FilmCraft's own workspace).
|
|
[profile.dev.package.filmcraft-h264]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-h264enc]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-hevc]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-vp9]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-prores]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-dnx]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-av1]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-aac]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-opus]
|
|
opt-level = 3
|
|
|
|
[profile.release]
|
|
lto = "thin"
|
|
codegen-units = 1
|
|
|
|
[patch.crates-io]
|
|
hayro-syntax = { git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0", version = "=0.7.2" }
|
|
hayro-jbig2 = { git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0", version = "=0.3.0" }
|
|
ecolor = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
emath = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
epaint = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
epaint_default_fonts = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui-winit = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui-wgpu = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_glow = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_extras = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_kittest = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_system_font_provider = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
eframe = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_demo_lib = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
egui_inspection = { git = "https://github.com/storytold/egui.git", rev = "6d518fc799681571963842f95b55a6b68431b15a" }
|
|
winit = { git = "https://github.com/storytold/winit.git", rev = "a517b3846ee8457d84ee4975110bfda6797c44dc" }
|