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 <ailuruxx@gmail.com> Co-committed-by: ailurux <ailuruxx@gmail.com>custom
parent
0180c9311d
commit
61cc7209ef
After Width: | Height: | Size: 6.9 KiB |
@ -0,0 +1,141 @@ |
|||||||
|
|
||||||
|
-- SPDX-FileCopyrightText: 2025 ailurux <ailuruxx@gmail.com> |
||||||
|
-- |
||||||
|
-- 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 |
||||||
|
} |
Loading…
Reference in new issue