From ff733e8f0c827e3d2d91bb7db29a85807867ab5e Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 4 Feb 2025 21:13:52 +0000 Subject: [PATCH] Wrap filesystem iterator Change to wrapping the filesystem iterator rather than iterating over table values. Also centralise the is_playlist check and hide Playlists menu if none are present --- lua/file_browser.lua | 5 ++--- lua/main_menu.lua | 16 +++++++++++++++- lua/playlist_browser.lua | 20 +++----------------- lua/playlist_iterator.lua | 35 +++++++++++++++++++++++++++++++++++ lua/table_iterator.lua | 27 --------------------------- 5 files changed, 55 insertions(+), 48 deletions(-) create mode 100644 lua/playlist_iterator.lua delete mode 100644 lua/table_iterator.lua diff --git a/lua/file_browser.lua b/lua/file_browser.lua index 98261d55..6289828f 100644 --- a/lua/file_browser.lua +++ b/lua/file_browser.lua @@ -8,11 +8,11 @@ local backstack = require("backstack") local font = require("font") local queue = require("queue") local playing = require("playing") -local styles = require("styles") local playback = require("playback") local theme = require("theme") local screen = require("screen") local filesystem = require("filesystem") +local playlist_iterator = require("playlist_iterator") return screen:new { create_ui = function(self) @@ -70,8 +70,7 @@ return screen:new { breadcrumb = item:filepath() }) elseif - item:filepath():match("%.playlist$") or - item:filepath():match("%.m3u8?$") then + playlist_iterator:is_playlist(item) then queue.open_playlist(item:filepath()) playback.playing:set(true) backstack.push(playing:new()) diff --git a/lua/main_menu.lua b/lua/main_menu.lua index c8edf766..fdf11956 100644 --- a/lua/main_menu.lua +++ b/lua/main_menu.lua @@ -11,7 +11,6 @@ local browser = require("browser") local playing = require("playing") local styles = require("styles") local filesystem = require("filesystem") -local screen = require("screen") local font = require("font") local theme = require("theme") local img = require("images") @@ -151,6 +150,14 @@ return widgets.MenuScreen:new { indexes_list:clear_flag(lvgl.FLAG.HIDDEN) end + local function hide_playlist_listing() + playlist_btn:add_flag(lvgl.FLAG.HIDDEN) + end + + local function show_playlist_listing() + playlist_btn:clear_flag(lvgl.FLAG.HIDDEN) + end + local function update_visible_indexes() local has_valid_index = false for _, idx in ipairs(indexes) do @@ -164,6 +171,13 @@ return widgets.MenuScreen:new { end if has_valid_index then hide_no_indexes() + + -- If we have valid indexes, then also check for playlists + if filesystem.iterator("/Playlists/"):next() == nil then + hide_playlist_listing() + else + show_playlist_listing() + end else if require("database").updating:get() then show_no_indexes("The database is updating for the first time. Please wait.") diff --git a/lua/playlist_browser.lua b/lua/playlist_browser.lua index 4824b581..0339d59b 100644 --- a/lua/playlist_browser.lua +++ b/lua/playlist_browser.lua @@ -12,7 +12,7 @@ local font = require("font") local theme = require("theme") local playback = require("playback") local queue = require("queue") -local table_iterator = require("table_iterator") +local playlist_iterator = require("playlist_iterator") local img = require("images") @@ -60,11 +60,6 @@ return screen:new { } end - local is_playlist = function(item) - return item:filepath():match("%.playlist$") - or item:filepath():match("%.m3u8?$") - end - local get_icon_func = function(item) if item:is_directory() then return img.files @@ -73,16 +68,7 @@ return screen:new { end end - local playlists_and_dirs = {}; - for item in self.iterator do - if - is_playlist(item) or - item:is_directory() then - table.insert(playlists_and_dirs, item) - end - end - - widgets.InfiniteList(self.root, table_iterator:create(playlists_and_dirs), { + widgets.InfiniteList(self.root, playlist_iterator:create(self.iterator), { focus_first_item = true, get_icon = get_icon_func, callback = function(item) @@ -95,7 +81,7 @@ return screen:new { breadcrumb = item:filepath() }) elseif - is_playlist(item) then + playlist_iterator:is_playlist(item) then -- TODO: playlist viewer queue.open_playlist(item:filepath()) playback.playing:set(true) diff --git a/lua/playlist_iterator.lua b/lua/playlist_iterator.lua new file mode 100644 index 00000000..06e80ad2 --- /dev/null +++ b/lua/playlist_iterator.lua @@ -0,0 +1,35 @@ +local PlaylistIterator = {} + +function PlaylistIterator:is_playlist(item) + return item:filepath():match("%.playlist$") + or item:filepath():match("%.m3u8?$") +end + +function PlaylistIterator:create(fs_iterator) + local iterator = fs_iterator:clone() + local obj = {}; + + local find_matching = function(iterate_fn) + local next = iterate_fn(iterator); + while next and (not PlaylistIterator:is_playlist(next) and not next:is_directory()) do + next = iterate_fn(); + end + return next; + end + + function obj:clone() + return PlaylistIterator:create(iterator) + end + + function obj:next() + return find_matching(iterator.next) + end + + function obj:prev() + return find_matching(iterator.prev) + end + + return obj +end + +return PlaylistIterator diff --git a/lua/table_iterator.lua b/lua/table_iterator.lua deleted file mode 100644 index 5bacada6..00000000 --- a/lua/table_iterator.lua +++ /dev/null @@ -1,27 +0,0 @@ - -local TableIterator = {} - -function TableIterator:create(table) - local iterator = {}; - iterator.index = 0; - iterator.table = table; - - function iterator:clone() - return TableIterator:create(table) - end - - function iterator:next() - self.index = self.index + 1 - return self.table[self.index] - end - - function iterator:prev() - self.index = self.index - 1 - return self.table[self.index] - end - - return iterator -end - - -return TableIterator \ No newline at end of file