From 61cc7209ef69e6142242fd67d8c484bc1c976dbe Mon Sep 17 00:00:00 2001 From: ailurux Date: Fri, 17 Jan 2025 02:24:05 +0000 Subject: ailurux/now-playing-menu (#184) Overflow menu for the now playing screen. New home for the info screen here. Adds quick navigation to current album or artist (thanks tjk!) and clear queue button. Also fixed up the way the now playing screen looks when queue is cleared (remove previous duration and don't show "loading" if nothing is actively loading). Reviewed-on: https://codeberg.org/cool-tech-zone/tangara-fw/pulls/184 Co-authored-by: ailurux Co-committed-by: ailurux --- lua/playing_menu.lua | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 lua/playing_menu.lua (limited to 'lua/playing_menu.lua') diff --git a/lua/playing_menu.lua b/lua/playing_menu.lua new file mode 100644 index 00000000..8ab2961b --- /dev/null +++ b/lua/playing_menu.lua @@ -0,0 +1,141 @@ + +-- SPDX-FileCopyrightText: 2025 ailurux +-- +-- SPDX-License-Identifier: GPL-3.0-only + +local lvgl = require("lvgl") +local widgets = require("widgets") +local backstack = require("backstack") +local font = require("font") +local playback = require("playback") +local queue = require("queue") +local screen = require("screen") +local theme = require("theme") +local track_info = require("track_info") +local styles = require("styles") + +return screen:new { + create_ui = function(self) + self.root = lvgl.Object(nil, { + flex = { + flex_direction = "column", + flex_wrap = "wrap", + justify_content = "center", + align_items = "center", + align_content = "center", + }, + w = lvgl.HOR_RES(), + h = lvgl.VER_RES(), + }) + self.root:center() + + self.status_bar = widgets.StatusBar(self, { + back_cb = backstack.pop, + transparent_bg = true, + }) + + + local menu_items = lvgl.List(self.root, { + w = lvgl.PCT(100), + h = lvgl.PCT(100), + flex_grow = 1, + }) + + local info_btn = menu_items:add_btn(nil, "Track Info") + info_btn:onClicked(function() + backstack.push(track_info:new()) + end) + info_btn:add_style(styles.list_item) + + local current_artist = nil + local album_artist = nil + local current_album = nil + + local artist_btn = menu_items:add_btn(nil, "Go To Artist") + artist_btn:add_style(styles.list_item) + artist_btn:onClicked(function() + local found_iter = nil + local media_type = nil + for _, idx in ipairs(database.indexes()) do + if idx:id() == database.IndexTypes.ALL_ARTISTS then + -- Find the sub-index for this artist. + local artist_iter = idx:iter() + -- Workaround for lack of pairs/ipairs on these iterators. + local artist_record = artist_iter:next() + while artist_record do + if artist_record:title() == current_artist then + found_iter = artist_record:contents() + media_type = idx:type() + goto artist_done + end + artist_record = artist_iter:next() + end + end + end + ::artist_done:: + if found_iter then + backstack.push(require("browser"):new { + title = current_artist, + iterator = found_iter, + mediatype = media_type, + }) + end + end) + + local album_btn = menu_items:add_btn(nil, "Go To Album") + album_btn:add_style(styles.list_item) + album_btn:onClicked(function() + local found_iter = nil + local media_type = nil + for _, idx in ipairs(database.indexes()) do + if idx:id() == database.IndexTypes.ALBUMS_BY_ARTIST then + -- Find the sub-index for this artist. + local artist_iter = idx:iter() + -- Workaround for lack of pairs/ipairs on these iterators. + local artist_record = artist_iter:next() + while artist_record do + if artist_record:title() == album_artist then + -- Find the sub-sub-index for this album. + local album_iter = artist_record:contents() + local album_record = album_iter:next() + while album_record do + if album_record:title() == current_album then + found_iter = album_record:contents() + media_type = idx:type() + goto album_done + end + album_record = album_iter:next() + end + end + artist_record = artist_iter:next() + end + end + end + ::album_done:: + if found_iter then + backstack.push(require("browser"):new { + title = current_album, + iterator = found_iter, + mediatype = media_type, + }) + end + end) + + + local clear_btn = menu_items:add_btn(nil, "Clear Queue") + clear_btn:onClicked(function() + queue.clear() + backstack.pop() + end) + clear_btn:add_style(styles.list_item) + + self.bindings = self.bindings + { + playback.track:bind(function(track) + current_artist = track.artist + current_album = track.album + album_artist = track.album_artist + end), + } + + end +} -- cgit v1.2.3