summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-11-14 13:20:04 +1100
committerjacqueline <me@jacqueline.id.au>2023-11-14 13:20:04 +1100
commit71ed09a6f70901c9097973a44b24d6a6ced2834f (patch)
tree3d02e4e180cd0a5caa1185eba89181607c4bccb9 /lua
parent8a0a167adbf3d9b6f8b6f16aaf20ca39ad5549de (diff)
downloadtangara-fw-71ed09a6f70901c9097973a44b24d6a6ced2834f.tar.gz
Add two-way databinding for lua, and flesh out the lua statusbar
Diffstat (limited to 'lua')
-rw-r--r--lua/assets/audio.pngbin0 -> 623 bytes
-rw-r--r--lua/assets/battery_20.pngbin0 -> 617 bytes
-rw-r--r--lua/assets/battery_40.pngbin0 -> 617 bytes
-rw-r--r--lua/assets/battery_60.pngbin0 -> 618 bytes
-rw-r--r--lua/assets/battery_80.pngbin0 -> 622 bytes
-rw-r--r--lua/assets/battery_empty.pngbin0 -> 614 bytes
-rw-r--r--lua/assets/battery_full.binbin0 -> 292 bytes
-rw-r--r--lua/assets/battery_full.pngbin0 -> 618 bytes
-rw-r--r--lua/assets/bt.pngbin0 -> 8502 bytes
-rw-r--r--lua/assets/bt_conn.pngbin0 -> 654 bytes
-rw-r--r--lua/assets/pause.pngbin0 -> 608 bytes
-rw-r--r--lua/assets/play.pngbin0 -> 616 bytes
-rw-r--r--lua/backstack.lua37
-rw-r--r--lua/main.lua4
-rw-r--r--lua/main_menu.lua19
-rw-r--r--lua/widgets.lua95
16 files changed, 128 insertions, 27 deletions
diff --git a/lua/assets/audio.png b/lua/assets/audio.png
new file mode 100644
index 00000000..b8ad9071
--- /dev/null
+++ b/lua/assets/audio.png
Binary files differ
diff --git a/lua/assets/battery_20.png b/lua/assets/battery_20.png
new file mode 100644
index 00000000..9012376f
--- /dev/null
+++ b/lua/assets/battery_20.png
Binary files differ
diff --git a/lua/assets/battery_40.png b/lua/assets/battery_40.png
new file mode 100644
index 00000000..88a0b448
--- /dev/null
+++ b/lua/assets/battery_40.png
Binary files differ
diff --git a/lua/assets/battery_60.png b/lua/assets/battery_60.png
new file mode 100644
index 00000000..d86c997a
--- /dev/null
+++ b/lua/assets/battery_60.png
Binary files differ
diff --git a/lua/assets/battery_80.png b/lua/assets/battery_80.png
new file mode 100644
index 00000000..344b3703
--- /dev/null
+++ b/lua/assets/battery_80.png
Binary files differ
diff --git a/lua/assets/battery_empty.png b/lua/assets/battery_empty.png
new file mode 100644
index 00000000..c9176e8c
--- /dev/null
+++ b/lua/assets/battery_empty.png
Binary files differ
diff --git a/lua/assets/battery_full.bin b/lua/assets/battery_full.bin
new file mode 100644
index 00000000..b01ca61f
--- /dev/null
+++ b/lua/assets/battery_full.bin
Binary files differ
diff --git a/lua/assets/battery_full.png b/lua/assets/battery_full.png
new file mode 100644
index 00000000..57122a23
--- /dev/null
+++ b/lua/assets/battery_full.png
Binary files differ
diff --git a/lua/assets/bt.png b/lua/assets/bt.png
new file mode 100644
index 00000000..180e6b3a
--- /dev/null
+++ b/lua/assets/bt.png
Binary files differ
diff --git a/lua/assets/bt_conn.png b/lua/assets/bt_conn.png
new file mode 100644
index 00000000..7a5f2b27
--- /dev/null
+++ b/lua/assets/bt_conn.png
Binary files differ
diff --git a/lua/assets/pause.png b/lua/assets/pause.png
new file mode 100644
index 00000000..ec388cd5
--- /dev/null
+++ b/lua/assets/pause.png
Binary files differ
diff --git a/lua/assets/play.png b/lua/assets/play.png
new file mode 100644
index 00000000..0d0bb34d
--- /dev/null
+++ b/lua/assets/play.png
Binary files differ
diff --git a/lua/backstack.lua b/lua/backstack.lua
new file mode 100644
index 00000000..c54fbac4
--- /dev/null
+++ b/lua/backstack.lua
@@ -0,0 +1,37 @@
+local lvgl = require("lvgl")
+
+local backstack = {
+ root = lvgl.Object(nil, {
+ w = lvgl.HOR_RES(),
+ h = lvgl.VER_RES(),
+ }),
+ stack = {},
+}
+
+function backstack:Top()
+ return self.stack[#self.stack]
+end
+
+function backstack:SetTopParent(parent)
+ local top = self:Top()
+ if top and top.root then
+ top.root:set_parent(parent)
+ end
+end
+
+function backstack:Push(screen)
+ self:SetTopParent(nil)
+ table.insert(self.stack, screen)
+ self:SetTopParent(self.root)
+end
+
+function backstack:Pop(num)
+ num = num or 1
+ for _ = 1, num do
+ local removed = table.remove(self.stack)
+ removed.root:delete()
+ end
+ self:SetTopParent(self.root)
+end
+
+return backstack
diff --git a/lua/main.lua b/lua/main.lua
index 2a80a571..ce9596af 100644
--- a/lua/main.lua
+++ b/lua/main.lua
@@ -1 +1,3 @@
-require("main_menu"):Create()
+local backstack = require("backstack")
+local main_menu = require("main_menu"):Create(backstack.root)
+backstack:Push(main_menu)
diff --git a/lua/main_menu.lua b/lua/main_menu.lua
index 924b51cf..f0be33de 100644
--- a/lua/main_menu.lua
+++ b/lua/main_menu.lua
@@ -5,8 +5,9 @@ local database = require("database")
local main_menu = {}
-function main_menu:Create()
- local root = lvgl.Object(nil, {
+function main_menu:Create(parent)
+ local menu = {}
+ menu.root = lvgl.Object(parent, {
flex = {
flex_direction = "column",
flex_wrap = "wrap",
@@ -17,31 +18,33 @@ function main_menu:Create()
w = lvgl.HOR_RES(),
h = lvgl.VER_RES(),
})
- root:center()
+ menu.root:center()
- widgets.StatusBar(root, {})
+ menu.status_bar = widgets.StatusBar(menu.root, {})
- local list = lvgl.List(root, {
+ menu.list = lvgl.List(menu.root, {
w = lvgl.PCT(100),
h = lvgl.PCT(100),
flex_grow = 1,
})
- list:add_btn(nil, "Now Playing"):onClicked(function()
+ menu.list:add_btn(nil, "Now Playing"):onClicked(function()
legacy_ui.open_now_playing();
end)
local indexes = database.get_indexes()
for id, name in ipairs(indexes) do
- local btn = list:add_btn(nil, name)
+ local btn = menu.list:add_btn(nil, name)
btn:onClicked(function()
legacy_ui.open_browse(id);
end)
end
- list:add_btn(nil, "Settings"):onClicked(function()
+ menu.list:add_btn(nil, "Settings"):onClicked(function()
legacy_ui.open_settings();
end)
+
+ return menu
end
return main_menu
diff --git a/lua/widgets.lua b/lua/widgets.lua
index bcc3ca59..a281620e 100644
--- a/lua/widgets.lua
+++ b/lua/widgets.lua
@@ -1,37 +1,96 @@
local lvgl = require("lvgl")
+local power = require("power")
+local bluetooth = require("bluetooth")
+local playback = require("playback")
local widgets = {}
-function widgets.StatusBar(parent)
- local container = parent:Object {
+function widgets.StatusBar(parent, opts)
+ local status_bar = {}
+
+ status_bar.root = parent:Object {
flex = {
- flex_direction = "row",
- justify_content = "flex-start",
- align_items = "center",
- align_content = "center",
+ flex_direction = "row",
+ justify_content = "flex-start",
+ align_items = "center",
+ align_content = "center",
},
w = lvgl.HOR_RES(),
- h = 16,
+ h = 18,
}
- container:Label {
- w = lvgl.SIZE_CONTENT,
- h = 12,
- text = "<",
- }
+ if opts.back_cb then
+ status_bar.back = status_bar.root:Label {
+ w = lvgl.SIZE_CONTENT,
+ h = 12,
+ text = "<",
+ }
+ status_bar.back:onClicked(opts.back_cb)
+ end
- container:Label {
+ status_bar.title = status_bar.root:Label {
w = lvgl.PCT(100),
h = 16,
- text = "cool title",
+ text = "",
flex_grow = 1,
}
+ if opts.title then
+ status_bar.title.set { text = opts.title }
+ end
- container:Label {
- w = lvgl.SIZE_CONTENT,
- h = 16,
- text = "69%",
+ status_bar.playing = status_bar.root:Image {}
+ status_bar.bluetooth = status_bar.root:Image {}
+ status_bar.battery = status_bar.root:Image {}
+
+ status_bar.bindings = {
+ power.battery_pct:bind(function(percent)
+ local src
+ if percent >= 95 then
+ src = "battery_full.png"
+ elseif percent >= 75 then
+ src = "battery_80.png"
+ elseif percent >= 55 then
+ src = "battery_60.png"
+ elseif percent >= 35 then
+ src = "battery_40.png"
+ elseif percent >= 15 then
+ src = "battery_20.png"
+ else
+ src = "battery_empty.png"
+ end
+ status_bar.battery:set_src("//lua/assets/" .. src)
+ end),
+ playback.playing:bind(function(playing)
+ if playing then
+ status_bar.playing:set_src("//lua/assets/play.png")
+ else
+ status_bar.playing:set_src("//lua/assets/pause.png")
+ end
+ end),
+ playback.track:bind(function(track)
+ if track then
+ status_bar.playing:clear_flag(lvgl.FLAG.HIDDEN)
+ else
+ status_bar.playing:add_flag(lvgl.FLAG.HIDDEN)
+ end
+ end),
+ bluetooth.enabled:bind(function(en)
+ if en then
+ status_bar.bluetooth:clear_flag(lvgl.FLAG.HIDDEN)
+ else
+ status_bar.bluetooth:add_flag(lvgl.FLAG.HIDDEN)
+ end
+ end),
+ bluetooth.connected:bind(function(connected)
+ if connected then
+ status_bar.bluetooth:set_src("//lua/assets/bt_conn.png")
+ else
+ status_bar.bluetooth:set_src("//lua/assets/bt.png")
+ end
+ end),
}
+
+ return status_bar
end
return widgets