From e73fa53bee1b7f16d89a0353e814d433ee70d052 Mon Sep 17 00:00:00 2001 From: liu weikai Date: Fri, 16 Oct 2026 12:47:43 +0800 Subject: [PATCH] Keep compact music status clear of seek and playback controls --- docs/images/music/pager-paused.png | Bin 0 -> 8638 bytes docs/images/music/tdeck-interrupted.png | Bin 0 -> 8539 bytes docs/uiux/components/music.md | 10 ++++++-- .../ui/screens/music/music_page_layout.cpp | 9 +++++++ tests/site/music-native-ui.test.mjs | 8 ++++++ tools/web_simulator/preview_music.cpp | 24 +++++++++++++++--- 6 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 docs/images/music/pager-paused.png create mode 100644 docs/images/music/tdeck-interrupted.png diff --git a/docs/images/music/pager-paused.png b/docs/images/music/pager-paused.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf952cac5e1cf745322f6db1deadae259fbfe6b GIT binary patch literal 8638 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 nGZa&*O&ZXMp@B=Lj^=Ac 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.env.MUSIC_UI click('Repeat one');assert.ok(snapshot().some(item=>item.text==='Shuffle')); click('Shuffle');assert.ok(snapshot().some(item=>item.text==='Repeat all')); await capture('now-playing'); + click('Pause');assert.ok(snapshot().some(item=>item.text==='Paused')); + assert.equal(runtime._native_music_geometry(),0,`${device}: paused status clears the progress knob and time labels`); + await capture('paused'); + runtime._native_preview_music_playing(2);tick();tick(); + assert.ok(snapshot().some(item=>item.text.startsWith('Paused for')),'interrupted status remains readable when elided'); + assert.equal(runtime._native_music_geometry(),0,`${device}: interrupted status clears the progress knob and time labels`); + await capture('interrupted'); + runtime._native_preview_music_playing(1);tick();tick(); click('Lyrics');assert.ok(snapshot().some(item=>item.text==='We take the quiet way home'));await capture('lyrics'); click('\uf053');click('Menu');click('Track info');await capture('metadata');assert.ok(snapshot().some(item=>item.text==='Aster')); click('\uf053');click('Library');click('Browse');click('Playlists');await capture('playlists'); diff --git a/tools/web_simulator/preview_music.cpp b/tools/web_simulator/preview_music.cpp index c14ba0cd..7682904d 100644 --- a/tools/web_simulator/preview_music.cpp +++ b/tools/web_simulator/preview_music.cpp @@ -306,9 +306,13 @@ class Source final : public music::IService ++out.revision; return true; } - void set_playing(bool value) + void set_playing(int value) { - if (value) play(1); + if (value) + { + play(1); + if (value == 2) out.playback = music::Playback::Interrupted; + } else out.playback = music::Playback::Stopped; } } source; @@ -319,7 +323,7 @@ void preview_bind_music() ui::menu::dashboard::bindMusicSource(&source); } music::IService* preview_music_service() { return &source; } -extern "C" EMSCRIPTEN_KEEPALIVE void native_preview_music_playing(int value) { source.set_playing(value != 0); } +extern "C" EMSCRIPTEN_KEEPALIVE void native_preview_music_playing(int value) { source.set_playing(value); } // QA only: inspect the actual shared LVGL objects, including slider knob clearance. extern "C" EMSCRIPTEN_KEEPALIVE int native_music_geometry() { @@ -335,5 +339,19 @@ extern "C" EMSCRIPTEN_KEEPALIVE int native_music_geometry() const auto knob = lv_obj_get_style_pad_top(self->progress, LV_PART_KNOB) + lv_obj_get_height(self->progress); if (cover.y2 + knob >= progress.y1) return 1; if (top.y2 >= body.y1 || body.y2 >= footer.y1) return 2; + if (self->playback_status && lv_label_get_text(self->playback_status)[0]) + { + lv_area_t status{}, elapsed{}, duration{}, controls{}; + lv_obj_get_coords(self->playback_status, &status); + lv_obj_get_coords(self->elapsed, &elapsed); + lv_obj_get_coords(self->duration, &duration); + lv_obj_get_coords(lv_obj_get_parent(self->play_label), &controls); + auto painted = progress; + painted.y1 -= lv_obj_get_style_pad_top(self->progress, LV_PART_KNOB) + 1; + painted.y2 += lv_obj_get_style_pad_bottom(self->progress, LV_PART_KNOB) + 1; + const auto overlaps = [](const lv_area_t& a, const lv_area_t& b) + { return a.x1 <= b.x2 && a.x2 >= b.x1 && a.y1 <= b.y2 && a.y2 >= b.y1; }; + if (overlaps(status, painted) || overlaps(status, elapsed) || overlaps(status, duration) || overlaps(status, controls)) return 3; + } return 0; }