The destination for a Nextcloud export was a text field. Nobody recalls the exact spelling of a path three levels down, and getting it wrong does not fail — `create_dir` makes whatever was typed, so a misremembered folder becomes a new one at the root and the exports are somewhere nobody looks. So it is picked the way the library root is picked, using the same `FolderBrowser` model the launch screen drives: up, into, and "use this folder", confirming the folder currently *shown* rather than one selected in the list. Same rule in both places, so the phrase means one thing. The model is shared; the worker is not. `settings_ui::spawn_folder_list` is a near-twin of the launch screen's, because that one reaches into the `LaunchController` for its session and reports onto the launch screen's error line, while this one is handed credentials and writes to the settings page. Factoring them together needs a function taking both controllers or a trait implemented twice to abstract two call sites — more machinery than the twenty lines it saves. What matters is shared already: navigation behaves identically because both drive the same model. The callbacks are wired in `lib.rs` rather than in `settings_ui::wire`, because listing a remote folder needs credentials and the settings page holds no session on purpose — it is reachable before a library is opened and must not depend on one existing. With no account the picker says to sign in first, rather than showing an empty list that reads as a server with no folders. Details that are decisions rather than accidents: the picker opens at the library root rather than at whatever half-typed path is in the field, which would list nothing and look broken. The listing area is a fixed 180px, since a folder with sixty children would otherwise push the rest of the settings page off the bottom. "Up" is disabled at the root rather than hidden, so the row does not jump as the user navigates. A failed listing leaves the picker open on the folder it was showing — where the user had got to is not something to discard over a dropped request. And the chosen folder saves immediately like every other setting on a page that has no Save button. The poll timer lives on the controller for the reason `LaunchController` keeps its own there: a `slint::Timer` stops when dropped, so one local to the function that starts it would be collected before the listing arrived. Carries in-flight work from a parallel session — a segmentation pass in dr-gpu, a sidecar cache, and the develop panel's continuing changes. 1020 tests pass, fmt clean. One clippy warning remains and is not mine: `sidecar_cache::dir` is unused while that work is in progress. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
39 lines
847 B
TOML
39 lines
847 B
TOML
[package]
|
|
name = "dr-gpu"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
license.workspace = true
|
|
|
|
[dependencies]
|
|
dr-types.workspace = true
|
|
dr-decode.workspace = true
|
|
dr-pipeline.workspace = true
|
|
wgpu.workspace = true
|
|
thiserror.workspace = true
|
|
log.workspace = true
|
|
bytemuck.workspace = true
|
|
# Needed outside tests: shader compilation errors are collected through an
|
|
# async error scope, which must be resolved before the pipeline is returned.
|
|
pollster.workspace = true
|
|
|
|
[dev-dependencies]
|
|
env_logger.workspace = true
|
|
|
|
[[example]]
|
|
name = "bench"
|
|
required-features = ["readback"]
|
|
|
|
[[example]]
|
|
name = "develop"
|
|
required-features = ["readback"]
|
|
|
|
[features]
|
|
default = []
|
|
# Exposes read_pixels outside tests. Production must not enable this.
|
|
readback = []
|
|
|
|
[[example]]
|
|
name = "segment"
|
|
required-features = ["readback"]
|