custom
jacqueline 7 months ago
parent a879e7b603
commit 90b82e4ad6
  1. 242
      lua/browser.lua

@ -11,133 +11,133 @@ local screen = require("screen")
local database = require("database") local database = require("database")
local img = require("images") local img = require("images")
return screen:new{ return screen:new {
create_ui = function(self) create_ui = function(self)
self.root = lvgl.Object(nil, { self.root = lvgl.Object(nil, {
flex = { flex = {
flex_direction = "column", flex_direction = "column",
flex_wrap = "wrap", flex_wrap = "wrap",
justify_content = "flex-start", justify_content = "flex-start",
align_items = "flex-start", align_items = "flex-start",
align_content = "flex-start" align_content = "flex-start"
}, },
w = lvgl.HOR_RES(), w = lvgl.HOR_RES(),
h = lvgl.VER_RES() h = lvgl.VER_RES()
}) })
self.root:center() self.root:center()
self.status_bar = widgets.StatusBar(self, { self.status_bar = widgets.StatusBar(self, {
back_cb = backstack.pop, back_cb = backstack.pop,
title = self.title title = self.title
}) })
local header = self.root:Object{ local header = self.root:Object {
flex = { flex = {
flex_direction = "column", flex_direction = "column",
flex_wrap = "wrap", flex_wrap = "wrap",
justify_content = "flex-start", justify_content = "flex-start",
align_items = "flex-start", align_items = "flex-start",
align_content = "flex-start" align_content = "flex-start"
}, },
w = lvgl.HOR_RES(), w = lvgl.HOR_RES(),
h = lvgl.SIZE_CONTENT, h = lvgl.SIZE_CONTENT,
pad_left = 4, pad_left = 4,
pad_right = 4, pad_right = 4,
pad_bottom = 2, pad_bottom = 2,
scrollbar_mode = lvgl.SCROLLBAR_MODE.OFF scrollbar_mode = lvgl.SCROLLBAR_MODE.OFF
} }
theme.set_subject(header, "header") theme.set_subject(header, "header")
if self.breadcrumb then if self.breadcrumb then
header:Label{ header:Label {
text = self.breadcrumb, text = self.breadcrumb,
text_font = font.fusion_10 text_font = font.fusion_10
} }
end end
if (self.mediatype == database.MediaTypes.Music) then
local buttons = header:Object({
flex = {
flex_direction = "row",
flex_wrap = "wrap",
justify_content = "space-between",
align_items = "center",
align_content = "center"
},
w = lvgl.PCT(100),
h = lvgl.SIZE_CONTENT,
pad_column = 4
})
local original_iterator = self.iterator:clone()
local enqueue = widgets.IconBtn(buttons, img.enqueue, "Enqueue")
enqueue:onClicked(function()
queue.add(original_iterator)
playback.playing:set(true)
end)
local shuffle_play = widgets.IconBtn(buttons, img.shuffleplay, "Shuffle")
shuffle_play:onClicked(function()
queue.clear()
queue.random:set(true)
queue.add(original_iterator)
playback.playing:set(true)
backstack.push(playing:new())
end)
-- enqueue:add_flag(lvgl.FLAG.HIDDEN)
local play = widgets.IconBtn(buttons, img.play_small, "Play")
play:onClicked(function()
queue.clear()
queue.random:set(false)
queue.add(original_iterator)
playback.playing:set(true)
backstack.push(playing:new())
end)
end
local get_icon_func = nil if (self.mediatype == database.MediaTypes.Music) then
local show_listened = self.mediatype == database.MediaTypes.Audiobook or self.mediatype == database.MediaTypes.Podcast local buttons = header:Object({
if show_listened then flex = {
get_icon_func = function (item) flex_direction = "row",
local contents = item:contents() flex_wrap = "wrap",
if type(contents) == "userdata" then justify_content = "space-between",
return align_items = "center",
else align_content = "center"
local track = database.track_by_id(contents) },
if not track then return end w = lvgl.PCT(100),
if (track.play_count > 0) then h = lvgl.SIZE_CONTENT,
return img.listened pad_column = 4
else })
return img.unlistened local original_iterator = self.iterator:clone()
end local enqueue = widgets.IconBtn(buttons, img.enqueue, "Enqueue")
end enqueue:onClicked(function()
queue.add(original_iterator)
playback.playing:set(true)
end)
local shuffle_play = widgets.IconBtn(buttons, img.shuffleplay, "Shuffle")
shuffle_play:onClicked(function()
queue.clear()
queue.random:set(true)
queue.add(original_iterator)
playback.playing:set(true)
backstack.push(playing:new())
end)
-- enqueue:add_flag(lvgl.FLAG.HIDDEN)
local play = widgets.IconBtn(buttons, img.play_small, "Play")
play:onClicked(function()
queue.clear()
queue.random:set(false)
queue.add(original_iterator)
playback.playing:set(true)
backstack.push(playing:new())
end)
end
end local get_icon_func = nil
local show_listened = self.mediatype == database.MediaTypes.Audiobook or
self.mediatype == database.MediaTypes.Podcast
if show_listened then
get_icon_func = function(item)
local contents = item:contents()
if type(contents) == "userdata" then
return
else
local track = database.track_by_id(contents)
if not track then return end
if (track.play_count > 0) then
return img.listened
else
return img.unlistened
end
end end
end
end
widgets.InfiniteList(self.root, self.iterator, { widgets.InfiniteList(self.root, self.iterator, {
get_icon = get_icon_func, get_icon = get_icon_func,
callback = function(item) callback = function(item)
return function() return function()
local contents = item:contents() local contents = item:contents()
if type(contents) == "userdata" then if type(contents) == "userdata" then
backstack.push(require("browser"):new{ backstack.push(require("browser"):new {
title = self.title, title = self.title,
iterator = contents, iterator = contents,
mediatype = self.mediatype, mediatype = self.mediatype,
breadcrumb = tostring(item) breadcrumb = tostring(item)
}) })
else else
queue.clear() queue.clear()
local track = database.track_by_id(contents) local track = database.track_by_id(contents)
if (track) then if (track) then
queue.play_from(track.filepath, track.saved_position) queue.play_from(track.filepath, track.saved_position)
else else
queue.add(contents) queue.add(contents)
end
playback.playing:set(true)
backstack.push(playing:new())
end
end
end end
}) playback.playing:set(true)
end backstack.push(playing:new())
end
end
end
})
end
} }

Loading…
Cancel
Save