diff options
Diffstat (limited to 'lua/playing_menu.lua')
| -rw-r--r-- | lua/playing_menu.lua | 141 |
1 files changed, 141 insertions, 0 deletions
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 <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 +} |
