summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorSam <github@samlord.co.uk>2025-02-04 21:13:52 +0000
committerSam <github@samlord.co.uk>2025-02-04 21:13:52 +0000
commitff733e8f0c827e3d2d91bb7db29a85807867ab5e (patch)
treeede269bca54b5316e5e0cd13eedde82d938b26dc /lua
parent844b3f733ec30eff41c3b3d48c74561d7b11da8e (diff)
downloadtangara-fw-ff733e8f0c827e3d2d91bb7db29a85807867ab5e.tar.gz
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
Diffstat (limited to 'lua')
-rw-r--r--lua/file_browser.lua5
-rw-r--r--lua/main_menu.lua16
-rw-r--r--lua/playlist_browser.lua20
-rw-r--r--lua/playlist_iterator.lua35
-rw-r--r--lua/table_iterator.lua27
5 files changed, 55 insertions, 48 deletions
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