Create and delete playlists, show the player bar in three sizes, start minimized, and prepare the 0.4.0 release #19

Merged
GrumpyStraw merged 1 commit from release-0.4.0 into main 2026-10-19 21:47:33 +02:00
Owner

Playlists

  • A + button in the playlists header opens NewPlaylistDialog.qml, which asks for a name and saves an empty Name.m3u8. It goes in the playlist folder, or in the first readable music folder when no playlist folder is set. That music folder then becomes the playlist folder, as the first-run dialog does, so the new playlist shows. A playlist folder that is set but cannot be read turns the button off instead of falling back.
  • Names are trimmed, and a typed .m3u or .m3u8 is not doubled. A name cannot start with a dot, contain a slash, or match another playlist's name ignoring case (playlistNameUsable, playlistNameTaken). An existing file is never replaced.
  • Right-click a playlist → Delete… asks first, then calls the Trash portal's TrashFile with the file opened read-write. The portal only accepts ~/.local/share/Trash/files and info with mode 0700 exactly (get_child_mkdir_p_0700 in xdg-desktop-portal's trash.c). KIO creates them without a mode, so on Plasma they are often 0755. When the portal refuses, a second prompt offers a permanent delete, which needs no permission beyond the playlist folder.

Player bar

  • Three sizes, switched with the arrows at the right end and saved under [player] size. Mini is the 0.3.0 bar. Normal has a 6 grid unit cover with the album, year, genre and format. Expanded has an 11 grid unit cover and the lyrics on the right. In Expanded, the lyrics shrink before the buttons do.
  • The bar always shows, with the controls off before the first song. The window's minimum height grows with the bar.
  • Player has new album, year, genre, format and lyrics properties. tags::read_details reads the format (such as FLAC · 44.1 kHz · 16-bit) and the lyrics from the Lyrics tag, or from an .lrc file with the song's name. plain_lyrics drops LRC timestamps, [ar:…] lines and enhanced word times, and puts the lines in time order.

Start minimized

  • A Settings checkbox, stored as [window] startMinimized, read once at start. Every start opens in the tray when Close to the system tray is on, and minimized otherwise. The window is visible: false until Component.onCompleted, so a tray start never maps it, and a saved maximized state is restored the first time it shows.

Roadmap items left out

  • The autostart icon item is removed. The Background portal writes no Icon= line, and adding one needs write access to ~/.config/autostart.
  • Restoring the window position after closing to the tray moves to Later. It needs xdg-session-management. KWin 6.8 has the stable xdg_session_manager_v1, Qt 6.11 in the runtime has only xx_session_manager_v1, and Flathub has no KDE 6.12 runtime yet.

Documentation

  • The README now covers only installing, and building and testing locally in three steps. What the app does moved to FEATURES.md, and the code layout, CI, CI image, portals and license details moved to DEVELOPMENT.md. The CI image comments in .forgejo/ point to the new file.

0.4.0 release prep

  • Version 0.4.0 in Cargo.toml, Cargo.lock, CMakeLists.txt and the README's install command.
  • A 0.4.0 entry in data/app.strawly.music.metainfo.xml. appstreamcli validate passes.
  • The Unreleased items in CHANGELOG.md are now under [0.4.0] - 2026-10-19, with the compare links updated.
  • The shipped 0.4.0 items leave ROADMAP.md.

Checked

check.sh passes in org.kde.Sdk//6.11, with all 3 tests, including new Rust tests for playlist names, LRC parsing, lyrics from a FLAC tag (tests/data/lyrics.flac) and from an .lrc file, the format line, and the year. .forgejo/release-notes.sh 0.4.0 prints the notes. The Flatpak builds, installs and reports version 0.4.0.

Tested in a nested KWin on a private bus, with input sent through KWin's EIS interface:

  • Start minimized: with no tray the window starts minimized and restores. With a tray, no window is mapped until the tray icon is activated.
  • Create: "Night drive" in the playlist folder, and "Mix" in the music folder when no playlist folder is set.
  • Delete: the trash prompt, then the permanent-delete prompt, which deletes the file.
  • All three player bar sizes, with details and .lrc lyrics.

A successful move to the trash was not seen in the app, because the trash folders on the test machine are 0755.

## Playlists - A + button in the playlists header opens `NewPlaylistDialog.qml`, which asks for a name and saves an empty `Name.m3u8`. It goes in the playlist folder, or in the first readable music folder when no playlist folder is set. That music folder then becomes the playlist folder, as the first-run dialog does, so the new playlist shows. A playlist folder that is set but cannot be read turns the button off instead of falling back. - Names are trimmed, and a typed `.m3u` or `.m3u8` is not doubled. A name cannot start with a dot, contain a slash, or match another playlist's name ignoring case (`playlistNameUsable`, `playlistNameTaken`). An existing file is never replaced. - Right-click a playlist → Delete… asks first, then calls the Trash portal's `TrashFile` with the file opened read-write. The portal only accepts `~/.local/share/Trash/files` and `info` with mode 0700 exactly (`get_child_mkdir_p_0700` in xdg-desktop-portal's `trash.c`). KIO creates them without a mode, so on Plasma they are often 0755. When the portal refuses, a second prompt offers a permanent delete, which needs no permission beyond the playlist folder. ## Player bar - Three sizes, switched with the arrows at the right end and saved under `[player] size`. Mini is the 0.3.0 bar. Normal has a 6 grid unit cover with the album, year, genre and format. Expanded has an 11 grid unit cover and the lyrics on the right. In Expanded, the lyrics shrink before the buttons do. - The bar always shows, with the controls off before the first song. The window's minimum height grows with the bar. - `Player` has new `album`, `year`, `genre`, `format` and `lyrics` properties. `tags::read_details` reads the format (such as `FLAC · 44.1 kHz · 16-bit`) and the lyrics from the `Lyrics` tag, or from an `.lrc` file with the song's name. `plain_lyrics` drops LRC timestamps, `[ar:…]` lines and enhanced word times, and puts the lines in time order. ## Start minimized - A Settings checkbox, stored as `[window] startMinimized`, read once at start. Every start opens in the tray when Close to the system tray is on, and minimized otherwise. The window is `visible: false` until `Component.onCompleted`, so a tray start never maps it, and a saved maximized state is restored the first time it shows. ## Roadmap items left out - The autostart icon item is removed. The Background portal writes no `Icon=` line, and adding one needs write access to `~/.config/autostart`. - Restoring the window position after closing to the tray moves to Later. It needs xdg-session-management. KWin 6.8 has the stable `xdg_session_manager_v1`, Qt 6.11 in the runtime has only `xx_session_manager_v1`, and Flathub has no KDE 6.12 runtime yet. ## Documentation - The README now covers only installing, and building and testing locally in three steps. What the app does moved to `FEATURES.md`, and the code layout, CI, CI image, portals and license details moved to `DEVELOPMENT.md`. The CI image comments in `.forgejo/` point to the new file. ## 0.4.0 release prep - Version 0.4.0 in `Cargo.toml`, `Cargo.lock`, `CMakeLists.txt` and the README's install command. - A 0.4.0 entry in `data/app.strawly.music.metainfo.xml`. `appstreamcli validate` passes. - The Unreleased items in `CHANGELOG.md` are now under `[0.4.0] - 2026-10-19`, with the compare links updated. - The shipped 0.4.0 items leave `ROADMAP.md`. ## Checked `check.sh` passes in `org.kde.Sdk//6.11`, with all 3 tests, including new Rust tests for playlist names, LRC parsing, lyrics from a FLAC tag (`tests/data/lyrics.flac`) and from an `.lrc` file, the format line, and the year. `.forgejo/release-notes.sh 0.4.0` prints the notes. The Flatpak builds, installs and reports version 0.4.0. Tested in a nested KWin on a private bus, with input sent through KWin's EIS interface: - Start minimized: with no tray the window starts minimized and restores. With a tray, no window is mapped until the tray icon is activated. - Create: "Night drive" in the playlist folder, and "Mix" in the music folder when no playlist folder is set. - Delete: the trash prompt, then the permanent-delete prompt, which deletes the file. - All three player bar sizes, with details and `.lrc` lyrics. A successful move to the trash was not seen in the app, because the trash folders on the test machine are 0755.
Create and delete playlists, show the player bar in three sizes, start minimized, and prepare the 0.4.0 release
All checks were successful
Pull request checks / Lint and test (pull_request) Successful in 6m45s
24ffe70023
GrumpyStraw scheduled this pull request to auto merge when all checks succeed 2026-10-19 21:45:22 +02:00
GrumpyStraw deleted branch release-0.4.0 2026-10-19 21:47:33 +02:00
Sign in to join this conversation.
No description provided.