Before Width: | Height: | Size: 623 B After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 617 B After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 617 B After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 618 B After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 622 B After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 614 B After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 618 B After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 654 B After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 608 B After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 616 B After Width: | Height: | Size: 4.2 KiB |
@ -0,0 +1,113 @@ |
|||||||
|
local lvgl = require("lvgl") |
||||||
|
local widgets = require("widgets") |
||||||
|
local legacy_ui = require("legacy_ui") |
||||||
|
local database = require("database") |
||||||
|
local backstack = require("backstack") |
||||||
|
|
||||||
|
local browser = {} |
||||||
|
|
||||||
|
function browser.create(opts) |
||||||
|
local screen = {} |
||||||
|
screen.root = lvgl.Object(nil, { |
||||||
|
flex = { |
||||||
|
flex_direction = "column", |
||||||
|
flex_wrap = "wrap", |
||||||
|
justify_content = "flex-start", |
||||||
|
align_items = "flex-start", |
||||||
|
align_content = "flex-start", |
||||||
|
}, |
||||||
|
w = lvgl.HOR_RES(), |
||||||
|
h = lvgl.VER_RES(), |
||||||
|
}) |
||||||
|
screen.root:center() |
||||||
|
|
||||||
|
screen.status_bar = widgets.StatusBar(screen.root, { |
||||||
|
back_cb = backstack.pop, |
||||||
|
title = opts.title, |
||||||
|
}) |
||||||
|
|
||||||
|
if opts.breadcrumb then |
||||||
|
local header = screen.root:Object { |
||||||
|
flex = { |
||||||
|
flex_direction = "column", |
||||||
|
flex_wrap = "wrap", |
||||||
|
justify_content = "flex-start", |
||||||
|
align_items = "flex-start", |
||||||
|
align_content = "flex-start", |
||||||
|
}, |
||||||
|
w = lvgl.HOR_RES(), |
||||||
|
h = lvgl.SIZE_CONTENT, |
||||||
|
pad_left = 4, |
||||||
|
pad_right = 4, |
||||||
|
pad_top = 2, |
||||||
|
pad_bottom = 2, |
||||||
|
bg_opa = lvgl.OPA(100), |
||||||
|
bg_color = "#f3e5f5", |
||||||
|
scrollbar_mode = lvgl.SCROLLBAR_MODE.OFF, |
||||||
|
} |
||||||
|
|
||||||
|
header:Label { text = opts.breadcrumb } |
||||||
|
|
||||||
|
local buttons = header:Object({ |
||||||
|
flex = { |
||||||
|
flex_direction = "row", |
||||||
|
flex_wrap = "wrap", |
||||||
|
justify_content = "flex-end", |
||||||
|
align_items = "center", |
||||||
|
align_content = "center", |
||||||
|
}, |
||||||
|
w = lvgl.PCT(100), |
||||||
|
h = lvgl.SIZE_CONTENT, |
||||||
|
pad_column = 4, |
||||||
|
}) |
||||||
|
local enqueue = buttons:Button {} |
||||||
|
enqueue:Label { text = "Enqueue" } |
||||||
|
enqueue:add_flag(lvgl.FLAG.HIDDEN) |
||||||
|
local play = buttons:Button {} |
||||||
|
play:Label { text = "Play all" } |
||||||
|
end |
||||||
|
|
||||||
|
screen.list = lvgl.List(screen.root, { |
||||||
|
w = lvgl.PCT(100), |
||||||
|
h = lvgl.PCT(100), |
||||||
|
flex_grow = 1, |
||||||
|
scrollbar_mode = lvgl.SCROLLBAR_MODE.OFF, |
||||||
|
}) |
||||||
|
|
||||||
|
screen.focused_item = 0 |
||||||
|
screen.last_item = 0 |
||||||
|
screen.add_item = function(item) |
||||||
|
if not item then return end |
||||||
|
screen.last_item = screen.last_item + 1 |
||||||
|
local this_item = screen.last_item |
||||||
|
local btn = screen.list:add_btn(nil, tostring(item)) |
||||||
|
btn:onClicked(function() |
||||||
|
local contents = item:contents() |
||||||
|
if type(contents) == "function" then |
||||||
|
backstack.push(function() |
||||||
|
return browser.create({ |
||||||
|
title = opts.title, |
||||||
|
iterator = contents, |
||||||
|
breadcrumb = tostring(item), |
||||||
|
}) |
||||||
|
end) |
||||||
|
else |
||||||
|
print("selected track", contents) |
||||||
|
end |
||||||
|
end) |
||||||
|
btn:onevent(lvgl.EVENT.FOCUSED, function() |
||||||
|
screen.focused_item = this_item |
||||||
|
if screen.last_item - 5 < this_item then |
||||||
|
opts.iterator(screen.add_item) |
||||||
|
end |
||||||
|
end) |
||||||
|
end |
||||||
|
|
||||||
|
for _ = 1, 8 do |
||||||
|
opts.iterator(screen.add_item) |
||||||
|
end |
||||||
|
|
||||||
|
return screen |
||||||
|
end |
||||||
|
|
||||||
|
return browser.create |