Skip to main content

max / audiofiles

The activation spinner becomes the activity mark Phase 4 of wiki `loading-and-progress-standard`. This was the app's one native `ui.spinner()`; every other spinner in audiofiles came from quasi-immediate, which stopped drawing them in quasi 0.64.0. A licence check is a round trip with nothing observable in between, so it is the fallback case under rule 3: a fixed blink at the house cadence, not an event-driven one, and not an arc turning at a rate it invented. The button beside it is already disabled and relabelled to "Activating", which is most of what rule 4 asks for; the mark is the part that says the wait is still running rather than wedged. `widgets::activity` sits beside `widgets::field` and for its reason: makeover-immediate takes the palette and the geometry as values, and a call site that assembled both would be this app choosing what a wait looks like. Pins moved with it: makeover-immediate 0.36.0 for the widget, quasi 0.64 for the renderer that no longer needs one.
Author: Max Johnson <me@maxj.phd> · 2026-08-26 20:02 UTC
Signed with PGP, not checked
Commit: 4fe2fa4542326990a938892742a8751085784781
Parent: bd97380
4 files changed, +77 insertions, -39 deletions
M Cargo.lock +36 -35
@@ -3074,13 +3074,14 @@
3074 3074
3075 3075 [[package]]
3076 3076 name = "makeover-immediate"
3077 - version = "0.35.0"
3077 + version = "0.36.0"
3078 3078 source = "registry+https://github.com/rust-lang/crates.io-index"
3079 - checksum = "d12682cc00dee1866075ff3cd9890d393e68b801c1c93e9dd525d332a8dadee0"
3079 + checksum = "8747a39c2a5de617b357978354ffc0d850c1be7ac95098952b4c6850c2b0d51f"
3080 3080 dependencies = [
3081 3081 "egui",
3082 3082 "egui_extras",
3083 3083 "makeover-layout",
3084 + "makeover-timing",
3084 3085 ]
3085 3086
3086 3087 [[package]]
@@ -3091,9 +3092,9 @@
3091 3092
3092 3093 [[package]]
3093 3094 name = "makeover-timing"
3094 - version = "0.1.0"
3095 + version = "0.1.1"
3095 3096 source = "registry+https://github.com/rust-lang/crates.io-index"
3096 - checksum = "3457a82ddd617b6c0ee19bb6f6419d296753e6e9fcb6e94b88da33d4d67a97b3"
3097 + checksum = "c83b1e0502c0179754752e59dd98fa4b15df8f9d0b454e0291b80c984aa2bd49"
3097 3098 dependencies = [
3098 3099 "makeover-geometry",
3099 3100 ]
@@ -3412,7 +3413,7 @@
3412 3413 source = "registry+https://github.com/rust-lang/crates.io-index"
3413 3414 checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
3414 3415 dependencies = [
3415 - "proc-macro-crate 1.3.1",
3416 + "proc-macro-crate 3.5.0",
3416 3417 "proc-macro2",
3417 3418 "quote",
3418 3419 "syn 2.0.119",
@@ -4255,7 +4256,7 @@
4255 4256
4256 4257 [[package]]
4257 4258 name = "quasi-immediate"
4258 - version = "0.63.0"
4259 + version = "0.64.0"
4259 4260 dependencies = [
4260 4261 "docengine",
4261 4262 "egui",
@@ -4265,7 +4266,7 @@
4265 4266
4266 4267 [[package]]
4267 4268 name = "quasi-router"
4268 - version = "0.63.0"
4269 + version = "0.64.0"
4269 4270 dependencies = [
4270 4271 "makeover-layout",
4271 4272 ]
@@ -7554,6 +7555,34 @@
7554 7555 "winnow 1.0.4",
7555 7556 ]
7556 7557
7558 + [[patch.unused]]
7559 + name = "quasi-axum"
7560 + version = "0.64.0"
7561 +
7562 + [[patch.unused]]
7563 + name = "quasi-basics"
7564 + version = "0.64.0"
7565 +
7566 + [[patch.unused]]
7567 + name = "quasi-http"
7568 + version = "0.64.0"
7569 +
7570 + [[patch.unused]]
7571 + name = "quasi-notifs"
7572 + version = "0.64.0"
7573 +
7574 + [[patch.unused]]
7575 + name = "quasi-store"
7576 + version = "0.1.0"
7577 +
7578 + [[patch.unused]]
7579 + name = "quasi-tauri"
7580 + version = "0.64.0"
7581 +
7582 + [[patch.unused]]
7583 + name = "quasi-webview"
7584 + version = "0.64.0"
7585 +
7557 7586 [[patch.unused]]
7558 7587 name = "kberg"
7559 7588 version = "0.1.0"
@@ -7566,34 +7595,6 @@
7566 7595 name = "painhours"
7567 7596 version = "0.1.0"
7568 7597
7569 - [[patch.unused]]
7570 - name = "quasi-axum"
7571 - version = "0.63.0"
7572 -
7573 - [[patch.unused]]
7574 - name = "quasi-basics"
7575 - version = "0.63.0"
7576 -
7577 - [[patch.unused]]
7578 - name = "quasi-http"
7579 - version = "0.63.0"
7580 -
7581 - [[patch.unused]]
7582 - name = "quasi-notifs"
7583 - version = "0.63.0"
7584 -
7585 - [[patch.unused]]
7586 - name = "quasi-store"
7587 - version = "0.1.0"
7588 -
7589 - [[patch.unused]]
7590 - name = "quasi-tauri"
7591 - version = "0.63.0"
7592 -
7593 - [[patch.unused]]
7594 - name = "quasi-webview"
7595 - version = "0.63.0"
7596 -
7597 7598 [[patch.unused]]
7598 7599 name = "quasi-type"
7599 7600 version = "0.1.0"
M Cargo.toml +3 -3
@@ -18,7 +18,7 @@
18 18 # makeover-immediate re-exports nothing, so the `Column` the app describes and
19 19 # the `Column` the renderer matches on have to be the same type.
20 20 makeover-layout = "0.35.0"
21 - makeover-immediate = "0.35.0"
21 + makeover-immediate = "0.36.0"
22 22 # The time axis. Minor rather than exact patch: it re-exports nothing and no
23 23 # type of its crosses a renderer boundary, so it is under the same rule as
24 24 # makeover-geometry above rather than the layout/immediate pair below.
@@ -26,8 +26,8 @@
26 26 # The described screens, which are audiofiles-browser's screens. By git URL with
27 27 # a version requirement, per the tree's rule for cross-repo deps. They were
28 28 # behind a `quasi` feature until 2026-08-25, when the last flip landed.
29 - quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.63" }
30 - quasi-immediate = { git = "https://makenot.work/git/max/quasi.git", version = "0.63" }
29 + quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.64" }
30 + quasi-immediate = { git = "https://makenot.work/git/max/quasi.git", version = "0.64" }
31 31 egui = { version = "0.35", default-features = false, features = ["default_fonts"] }
32 32 egui_extras = { version = "0.35", default-features = false }
33 33 eframe = { version = "0.35", default-features = false, features = ["default_fonts", "glow"] }
@@ -155,7 +155,14 @@
155 155 }
156 156 if self.activating {
157 157 ui.add_space(theme::space::bound());
158 - ui.spinner();
158 + // Rule 2 of wiki `loading-and-progress-standard`. A
159 + // licence check is a round trip with nothing observable
160 + // in between, so the mark blinks at the house cadence
161 + // and claims nothing about how far along it is. The
162 + // button beside it is already disabled and relabelled,
163 + // which is most of what rule 4 asks for; this is the
164 + // part that says the wait is still running.
165 + widgets::activity(ui);
159 166 }
160 167
161 168 // What went wrong with the attempt rather than with the key:
@@ -496,6 +496,36 @@
496 496 makeover_immediate::field(ui, field, filling, state, &theme::palette(), &field_style())
497 497 }
498 498
499 + /// The geometry the activity mark is drawn at.
500 + ///
501 + /// Only `mark_size` is this app's to say and the rest is the default, which is
502 + /// what [`field_style`] does with the parts of a field it has no opinion on.
503 + /// The mark is a square at the height of a bar, which is `makeover-immediate`'s
504 + /// own default, so this exists to be the one place a different answer would go
505 + /// rather than because there is one today.
506 + fn widget_style() -> makeover_immediate::widget::WidgetStyle {
507 + makeover_immediate::widget::WidgetStyle::default()
508 + }
509 +
510 + /// The activity mark: something is happening, and nothing more is claimed.
511 + ///
512 + /// Wiki `loading-and-progress-standard`, rule 2. This app's one native
513 + /// `ui.spinner()` was here, on the activation round trip, and a spinner turns
514 + /// at a rate it invented: it reads as progress on a wait with nothing countable
515 + /// in it at all.
516 + ///
517 + /// For an unmeasured wait only. A wait with a size draws through
518 + /// `makeover_immediate::widget::awaiting`, which needs a delivery count beside
519 + /// it, and nothing in this app watches one yet.
520 + ///
521 + /// Reduced motion is not read from anywhere: egui has no
522 + /// `prefers-reduced-motion`, and this app has no setting for it, so the mark
523 + /// blinks. That is the whole of what would change when one arrives -- pass the
524 + /// bool through, and `makeover-timing` stills the mark.
525 + pub fn activity(ui: &mut egui::Ui) -> egui::Response {
526 + makeover_immediate::widget::activity(ui, false, &theme::palette(), &widget_style())
527 + }
528 +
499 529 /// A set of described fields laid down a column, at this app's field geometry.
500 530 ///
501 531 /// [`field`]'s wrapper for the same reason, and one more: the gap between one