Add a detailed view, a playlist order of your own and Now Playing kept between starts, and prepare the 0.5.0 release #20

Merged
GrumpyStraw merged 1 commit from detailed-view-0.5.0 into main 2026-10-20 20:07:04 +02:00
Owner

Detailed view

  • Settings → Song lists chooses between the summarized view and the detailed view, stored as [menus] detailedView. The detailed view is a table for All Music and every playlist, with the cover left of the columns.
  • The shared parts are SongColumns.qml (shown columns, their order, widths and sort for one list), SongTableHeader.qml (the column names, with the column popup) and SongTableCells.qml (one row's cells).
  • columns.rs works out the columns from a song's tags, for SongModel and TrackModel alike. Each column has a role named after it, such as albumColumn, and lengthSort sorts the length by seconds. Until the tags are read, the title and artist come from the file name.
  • TrackModel reads the tags of a playlist's songs in the background, as SongModel does, and matches the results by path, so rows moved in the meantime keep the right values. search.rs caches the tags and the length next to the search text, so the table reads no file twice.
  • The defaults are order number, title, artist, album, year and length. Right-clicking the column names opens a checkbox for each of 19 columns, with Reset below them. A column ticked again goes at the end.
  • Clicking a column name sorts by it, then the other way, then back to the list's own order. SearchFilterModel sorts in natural order through lessThan, with empty values last in both directions. A sorted playlist plays in the order shown through the new Player.playPlaylistTracks, and reordering, Move up and Move down are off while it is sorted, as during a search.
  • Each column starts as wide as its longest value, measured with FontMetrics from the five longest values longest() returns. When the columns do not fit, the widest narrow first, so short ones stay whole. Dragging the line at a column's right edge sets its width, up to the room the other columns leave. Dragging a column name moves the column.
  • All Music and each playlist keep their own columns, order, widths and sort in columns.conf in the app's config folder, keyed by allMusic or playlist: and the path.

Playlists

  • A handle on each playlist on the left drags it into an order of your own, saved as playlistOrder. New playlists go at the end, by name. Sort A-Z, above the playlists and in their right-click menu, clears the order. While not searching, the list uses PlaylistLibrary directly, so a drag moves rows in place instead of resetting the proxy.
  • The Add songs button above a playlist is gone, and Remove songs shows only its icon.

Now Playing

  • The queue is saved in play order to now-playing.m3u8 in the app's config folder, with absolute paths so portal paths stay valid. The place, the playlist it came from, the shuffle setting and the time are saved under [nowPlaying]. The time is saved on pause and every 5 seconds of playback.
  • At start, Player.resume() loads all of it paused and seeks once the song has loaded. A song that cannot be read at that point does not start the next one.
  • Play next and Add to Now Playing are in the right-click menus of songs in All Music and in playlists, and of playlists on the left. With nothing queued, the songs start playing. With shuffle on, added songs stay where they were put.
  • Two buttons above Now Playing clear the songs after the current one, or the whole queue. Clearing after the current song also drops those songs from the shuffle pool.

Player bar and Settings

  • The Mini player bar is one row. The song keeps a fixed width and the progress bar takes the rest, so only the progress bar changes width with the window.
  • The Settings window opens as tall as its settings, up to the screen height.

Fixes

  • The song lists clip their rows, which drew over the tabs when scrolled.
  • The Normal player bar keeps its lines laid out while they are empty. Hiding them while a new song's tags were read made the bar shrink and grow, which moved any list scrolled to its end. A screen recording found it, and only the Normal size grows with its text.

0.5.0 release prep

  • Version 0.5.0 in Cargo.toml, Cargo.lock, CMakeLists.txt and the README's install command.
  • A 0.5.0 entry in data/app.strawly.music.metainfo.xml. appstreamcli validate passes.
  • The Unreleased items in CHANGELOG.md are now under [0.5.0] - 2026-10-20, with the compare links updated. FEATURES.md covers the detailed view, the playlist order and Now Playing.

Checked

check.sh passes in org.kde.Sdk//6.11, with all 3 tests. New tests cover the column values from tags and from file names, the longest values, sorting by a role in SearchFilterModel, resuming the queue, clearing it, and queueing next and at the end. .forgejo/release-notes.sh 0.5.0 prints the notes. The Flatpak builds, installs and reports version 0.5.0.

Tested in a nested KWin on a private bus, with the state set through the config files and screenshots:

  • The detailed view in All Music and in a playlist, with saved columns, order, widths and sort, a missing file and a narrow window.
  • The column popup, the Settings window height, and the Mini and Normal player bars at two widths.
  • A scrolled list under the tabs, the playlist order with Sort A-Z, Now Playing resumed at 1:30, and the new menu items.

Dragging, clicking to sort and the menu actions were tested by hand on the installed build.

## Detailed view - Settings → Song lists chooses between the summarized view and the detailed view, stored as `[menus] detailedView`. The detailed view is a table for All Music and every playlist, with the cover left of the columns. - The shared parts are `SongColumns.qml` (shown columns, their order, widths and sort for one list), `SongTableHeader.qml` (the column names, with the column popup) and `SongTableCells.qml` (one row's cells). - `columns.rs` works out the columns from a song's tags, for `SongModel` and `TrackModel` alike. Each column has a role named after it, such as `albumColumn`, and `lengthSort` sorts the length by seconds. Until the tags are read, the title and artist come from the file name. - `TrackModel` reads the tags of a playlist's songs in the background, as `SongModel` does, and matches the results by path, so rows moved in the meantime keep the right values. `search.rs` caches the tags and the length next to the search text, so the table reads no file twice. - The defaults are order number, title, artist, album, year and length. Right-clicking the column names opens a checkbox for each of 19 columns, with Reset below them. A column ticked again goes at the end. - Clicking a column name sorts by it, then the other way, then back to the list's own order. `SearchFilterModel` sorts in natural order through `lessThan`, with empty values last in both directions. A sorted playlist plays in the order shown through the new `Player.playPlaylistTracks`, and reordering, Move up and Move down are off while it is sorted, as during a search. - Each column starts as wide as its longest value, measured with `FontMetrics` from the five longest values `longest()` returns. When the columns do not fit, the widest narrow first, so short ones stay whole. Dragging the line at a column's right edge sets its width, up to the room the other columns leave. Dragging a column name moves the column. - All Music and each playlist keep their own columns, order, widths and sort in `columns.conf` in the app's config folder, keyed by `allMusic` or `playlist:` and the path. ## Playlists - A handle on each playlist on the left drags it into an order of your own, saved as `playlistOrder`. New playlists go at the end, by name. Sort A-Z, above the playlists and in their right-click menu, clears the order. While not searching, the list uses `PlaylistLibrary` directly, so a drag moves rows in place instead of resetting the proxy. - The Add songs button above a playlist is gone, and Remove songs shows only its icon. ## Now Playing - The queue is saved in play order to `now-playing.m3u8` in the app's config folder, with absolute paths so portal paths stay valid. The place, the playlist it came from, the shuffle setting and the time are saved under `[nowPlaying]`. The time is saved on pause and every 5 seconds of playback. - At start, `Player.resume()` loads all of it paused and seeks once the song has loaded. A song that cannot be read at that point does not start the next one. - Play next and Add to Now Playing are in the right-click menus of songs in All Music and in playlists, and of playlists on the left. With nothing queued, the songs start playing. With shuffle on, added songs stay where they were put. - Two buttons above Now Playing clear the songs after the current one, or the whole queue. Clearing after the current song also drops those songs from the shuffle pool. ## Player bar and Settings - The Mini player bar is one row. The song keeps a fixed width and the progress bar takes the rest, so only the progress bar changes width with the window. - The Settings window opens as tall as its settings, up to the screen height. ## Fixes - The song lists clip their rows, which drew over the tabs when scrolled. - The Normal player bar keeps its lines laid out while they are empty. Hiding them while a new song's tags were read made the bar shrink and grow, which moved any list scrolled to its end. A screen recording found it, and only the Normal size grows with its text. ## 0.5.0 release prep - Version 0.5.0 in `Cargo.toml`, `Cargo.lock`, `CMakeLists.txt` and the README's install command. - A 0.5.0 entry in `data/app.strawly.music.metainfo.xml`. `appstreamcli validate` passes. - The Unreleased items in `CHANGELOG.md` are now under `[0.5.0] - 2026-10-20`, with the compare links updated. `FEATURES.md` covers the detailed view, the playlist order and Now Playing. ## Checked `check.sh` passes in `org.kde.Sdk//6.11`, with all 3 tests. New tests cover the column values from tags and from file names, the longest values, sorting by a role in `SearchFilterModel`, resuming the queue, clearing it, and queueing next and at the end. `.forgejo/release-notes.sh 0.5.0` prints the notes. The Flatpak builds, installs and reports version 0.5.0. Tested in a nested KWin on a private bus, with the state set through the config files and screenshots: - The detailed view in All Music and in a playlist, with saved columns, order, widths and sort, a missing file and a narrow window. - The column popup, the Settings window height, and the Mini and Normal player bars at two widths. - A scrolled list under the tabs, the playlist order with Sort A-Z, Now Playing resumed at 1:30, and the new menu items. Dragging, clicking to sort and the menu actions were tested by hand on the installed build.
Add a detailed view, a playlist order of your own and Now Playing kept between starts, and prepare the 0.5.0 release
All checks were successful
Pull request checks / Lint and test (pull_request) Successful in 7m1s
32c1dedd3a
- All Music and the playlists can show a table with a column for each tag chosen. Each list
  keeps its own columns, order, widths and sort in columns.conf
- Drag the playlists into an order of your own, or sort them A-Z again
- Now Playing is saved and comes back paused after a restart. Play next, Add to Now Playing
  and two Clear buttons manage it
- The Mini player bar is one row, and the Settings window fits its settings
- The song lists clip their rows, and the Normal player bar keeps its height while a song's
  tags are read
- Version 0.5.0, with its metainfo entry and changelog section
GrumpyStraw scheduled this pull request to auto merge when all checks succeed 2026-10-20 20:02:23 +02:00
GrumpyStraw deleted branch detailed-view-0.5.0 2026-10-20 20:07:04 +02:00
Sign in to join this conversation.
No description provided.