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
custom
Sam 2 months ago
parent 844b3f733e
commit ff733e8f0c
  1. 5
      lua/file_browser.lua
  2. 16
      lua/main_menu.lua
  3. 20
      lua/playlist_browser.lua
  4. 35
      lua/playlist_iterator.lua
  5. 27
      lua/table_iterator.lua

@ -8,11 +8,11 @@ local backstack = require("backstack")
local font = require("font") local font = require("font")
local queue = require("queue") local queue = require("queue")
local playing = require("playing") local playing = require("playing")
local styles = require("styles")
local playback = require("playback") local playback = require("playback")
local theme = require("theme") local theme = require("theme")
local screen = require("screen") local screen = require("screen")
local filesystem = require("filesystem") local filesystem = require("filesystem")
local playlist_iterator = require("playlist_iterator")
return screen:new { return screen:new {
create_ui = function(self) create_ui = function(self)
@ -70,8 +70,7 @@ return screen:new {
breadcrumb = item:filepath() breadcrumb = item:filepath()
}) })
elseif elseif
item:filepath():match("%.playlist$") or playlist_iterator:is_playlist(item) then
item:filepath():match("%.m3u8?$") then
queue.open_playlist(item:filepath()) queue.open_playlist(item:filepath())
playback.playing:set(true) playback.playing:set(true)
backstack.push(playing:new()) backstack.push(playing:new())

@ -11,7 +11,6 @@ local browser = require("browser")
local playing = require("playing") local playing = require("playing")
local styles = require("styles") local styles = require("styles")
local filesystem = require("filesystem") local filesystem = require("filesystem")
local screen = require("screen")
local font = require("font") local font = require("font")
local theme = require("theme") local theme = require("theme")
local img = require("images") local img = require("images")
@ -151,6 +150,14 @@ return widgets.MenuScreen:new {
indexes_list:clear_flag(lvgl.FLAG.HIDDEN) indexes_list:clear_flag(lvgl.FLAG.HIDDEN)
end 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 function update_visible_indexes()
local has_valid_index = false local has_valid_index = false
for _, idx in ipairs(indexes) do for _, idx in ipairs(indexes) do
@ -164,6 +171,13 @@ return widgets.MenuScreen:new {
end end
if has_valid_index then if has_valid_index then
hide_no_indexes() 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 else
if require("database").updating:get() then if require("database").updating:get() then
show_no_indexes("The database is updating for the first time. Please wait.") show_no_indexes("The database is updating for the first time. Please wait.")

@ -12,7 +12,7 @@ local font = require("font")
local theme = require("theme") local theme = require("theme")
local playback = require("playback") local playback = require("playback")
local queue = require("queue") local queue = require("queue")
local table_iterator = require("table_iterator") local playlist_iterator = require("playlist_iterator")
local img = require("images") local img = require("images")
@ -60,11 +60,6 @@ return screen:new {
} }
end end
local is_playlist = function(item)
return item:filepath():match("%.playlist$")
or item:filepath():match("%.m3u8?$")
end
local get_icon_func = function(item) local get_icon_func = function(item)
if item:is_directory() then if item:is_directory() then
return img.files return img.files
@ -73,16 +68,7 @@ return screen:new {
end end
end end
local playlists_and_dirs = {}; widgets.InfiniteList(self.root, playlist_iterator:create(self.iterator), {
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), {
focus_first_item = true, focus_first_item = true,
get_icon = get_icon_func, get_icon = get_icon_func,
callback = function(item) callback = function(item)
@ -95,7 +81,7 @@ return screen:new {
breadcrumb = item:filepath() breadcrumb = item:filepath()
}) })
elseif elseif
is_playlist(item) then playlist_iterator:is_playlist(item) then
-- TODO: playlist viewer -- TODO: playlist viewer
queue.open_playlist(item:filepath()) queue.open_playlist(item:filepath())
playback.playing:set(true) playback.playing:set(true)

@ -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

@ -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
Loading…
Cancel
Save