Skip to main content

max / audiofiles

Take quasi 0.69.2, and require a row under the drag `quasi_immediate::row_at` (quasicoherent `600c9e42`) answers which described row the renderer drew under a point, so `dragging_out` can require one. A press on the toolbar, the column heads or the empty space below the last row no longer starts an OS drag of the selection, which was the concrete hazard the finding named: those presses could not be told from a press on a row. Still not the shipped list's behaviour, and now closable rather than blocked: the drag does not collapse the selection onto the row under the cursor. The remaining plumbing is this app's, since the file list's rows carry no `Cells::value` and the row has to be matched back by index. Filed. A patch of quasi, so the `^0.69` requirement is unchanged.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-27 18:38 UTC
Signed with PGP, not checked
Commit: 66b129c40bb8681644d1af579afd37cbac77733e
Parent: c1b7c59
2 files changed, +36 insertions, -23 deletions
M Cargo.lock +12 -12
@@ -4256,7 +4256,7 @@
4256 4256
4257 4257 [[package]]
4258 4258 name = "quasi-immediate"
4259 - version = "0.69.1"
4259 + version = "0.69.2"
4260 4260 dependencies = [
4261 4261 "docengine",
4262 4262 "egui",
@@ -4267,7 +4267,7 @@
4267 4267
4268 4268 [[package]]
4269 4269 name = "quasi-router"
4270 - version = "0.69.1"
4270 + version = "0.69.2"
4271 4271 dependencies = [
4272 4272 "makeover-layout",
4273 4273 ]
@@ -7558,19 +7558,19 @@
7558 7558
7559 7559 [[patch.unused]]
7560 7560 name = "quasi-axum"
7561 - version = "0.69.1"
7561 + version = "0.69.2"
7562 7562
7563 7563 [[patch.unused]]
7564 7564 name = "quasi-basics"
7565 - version = "0.69.1"
7565 + version = "0.69.2"
7566 7566
7567 7567 [[patch.unused]]
7568 7568 name = "quasi-http"
7569 - version = "0.69.1"
7569 + version = "0.69.2"
7570 7570
7571 7571 [[patch.unused]]
7572 7572 name = "quasi-notifs"
7573 - version = "0.69.1"
7573 + version = "0.69.2"
7574 7574
7575 7575 [[patch.unused]]
7576 7576 name = "quasi-store"
@@ -7578,11 +7578,15 @@
7578 7578
7579 7579 [[patch.unused]]
7580 7580 name = "quasi-tauri"
7581 - version = "0.69.1"
7581 + version = "0.69.2"
7582 7582
7583 7583 [[patch.unused]]
7584 7584 name = "quasi-webview"
7585 - version = "0.69.1"
7585 + version = "0.69.2"
7586 +
7587 + [[patch.unused]]
7588 + name = "quasi-type"
7589 + version = "0.1.0"
7586 7590
7587 7591 [[patch.unused]]
7588 7592 name = "kberg"
@@ -7595,7 +7599,3 @@
7595 7599 [[patch.unused]]
7596 7600 name = "painhours"
7597 7601 version = "0.1.0"
7598 -
7599 - [[patch.unused]]
7600 - name = "quasi-type"
7601 - version = "0.1.0"
@@ -2408,16 +2408,23 @@
2408 2408 /// drawn into, which leaves out the filter panel, the detail panel and every
2409 2409 /// floating window.
2410 2410 ///
2411 - /// **What it cannot tell apart is a press on the toolbar from a press on a
2412 - /// row**, and what follows from that is the one behaviour that is not the
2413 - /// shipped list's: this drags *what is chosen* rather than the row under the
2414 - /// cursor, where the shipped list collapsed the selection onto that row first.
2415 - /// Pressing a chosen row and dragging is the ordinary case and is exact;
2416 - /// pressing an unchosen one drags the chosen set instead, which the drag image
2417 - /// and the status line both name. The per-row hover that said "Just dragged.
2418 - /// Ready again in a moment." is gone with the rows for the same reason. Closing
2419 - /// either wants the description to say where its rows are, which is a question
2420 - /// for the vocabulary rather than something to guess at here.
2411 + /// - **A row under the press.** `quasi_immediate::row_at` answers which
2412 + /// described row the renderer drew under a point, so a press on the toolbar,
2413 + /// the column heads or the empty space below the last row no longer starts a
2414 + /// drag. Added 2026-08-27 with quasi 0.69.2; the ruling on quasicoherent
2415 + /// `600c9e42` is that a description hands back no geometry and the *renderer*
2416 + /// does, because where a row landed is the renderer's answer and a different
2417 + /// one per host.
2418 + ///
2419 + /// **What is still not the shipped list's behaviour**: this drags *what is
2420 + /// chosen* rather than the row under the cursor, where the shipped list
2421 + /// collapsed the selection onto that row first. Pressing a chosen row and
2422 + /// dragging is the ordinary case and is exact; pressing an unchosen one drags
2423 + /// the chosen set instead, which the drag image and the status line both name.
2424 + /// The rects make that closable now and the plumbing is this app's rather than
2425 + /// the vocabulary's -- the file list's rows carry no `Cells::value`, so the row
2426 + /// has to be matched back by index against the samples the description was
2427 + /// built from. Filed rather than guessed at here.
2421 2428 fn dragging_out(ui: &egui::Ui, state: &mut BrowserState) -> bool {
2422 2429 let ctx = ui.ctx();
2423 2430 let (held, origin, latest) = ctx.input(|input| {
@@ -2445,7 +2452,13 @@
2445 2452 let (Some(origin), Some(latest)) = (origin, latest) else {
2446 2453 return false;
2447 2454 };
2448 - (latest - origin).length() > DRAG_THRESHOLD && ui.max_rect().contains(origin)
2455 + if (latest - origin).length() <= DRAG_THRESHOLD || !ui.max_rect().contains(origin) {
2456 + return false;
2457 + }
2458 + // The press has to have landed on a row. Read off the renderer, which drew
2459 + // the table earlier this frame; the description says what is on the screen
2460 + // and never where, so this is the one side that can answer.
2461 + quasi_immediate::row_at(ui.ctx(), origin).is_some()
2449 2462 }
2450 2463
2451 2464 /// Whether the last OS drag is still holding this one off.