summaryrefslogtreecommitdiff
path: root/lua/widgets.lua
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-04-18 11:38:53 +1000
committerjacqueline <me@jacqueline.id.au>2024-04-18 11:38:53 +1000
commitb17f8a3dcc36ec2479412f603c7b5e77003b80a2 (patch)
tree17a73431f0fddd2acd5cd357d782ba86d210198e /lua/widgets.lua
parentcc255f6d779b0478ae3eb795c2cae5ec864d8ef0 (diff)
downloadtangara-fw-b17f8a3dcc36ec2479412f603c7b5e77003b80a2.tar.gz
Merge the StatusBar bindings table with each screen's bindings table
Diffstat (limited to 'lua/widgets.lua')
-rw-r--r--lua/widgets.lua102
1 files changed, 54 insertions, 48 deletions
diff --git a/lua/widgets.lua b/lua/widgets.lua
index fa991758..be018e19 100644
--- a/lua/widgets.lua
+++ b/lua/widgets.lua
@@ -6,6 +6,7 @@ local backstack = require("backstack")
local styles = require("styles")
local database = require("database")
local theme = require("theme")
+local screen = require("screen")
local img = {
db = lvgl.ImgData("//lua/img/db.png"),
@@ -23,27 +24,29 @@ local img = {
local widgets = {}
-function widgets.MenuScreen(opts)
- local screen = {}
- screen.root = lvgl.Object(nil, {
- flex = {
- flex_direction = "column",
- flex_wrap = "nowrap",
- justify_content = "flex-start",
- align_items = "flex-start",
- align_content = "flex-start",
- },
- w = lvgl.PCT(100),
- h = lvgl.PCT(100),
- })
- screen.root:center()
- screen.status_bar = widgets.StatusBar(screen.root, {
- back_cb = opts.show_back and backstack.pop or nil,
- title = opts.title,
- transparent_bg = true
- })
- return screen
-end
+widgets.MenuScreen = screen:new {
+ show_back = false,
+ title = "",
+ createUi = function(self)
+ self.root = lvgl.Object(nil, {
+ flex = {
+ flex_direction = "column",
+ flex_wrap = "nowrap",
+ justify_content = "flex-start",
+ align_items = "flex-start",
+ align_content = "flex-start",
+ },
+ w = lvgl.PCT(100),
+ h = lvgl.PCT(100),
+ })
+ self.root:center()
+ self.status_bar = widgets.StatusBar(self, {
+ back_cb = self.show_back and backstack.pop or nil,
+ title = self.title,
+ transparent_bg = true
+ })
+ end
+}
function widgets.Row(parent, left, right)
local container = parent:Object {
@@ -61,10 +64,14 @@ function widgets.Row(parent, left, right)
container:Label { text = right }
end
-function widgets.StatusBar(parent, opts)
- local status_bar = {}
+local bindings_meta = {
+ __add = function(a, b)
+ return table.move(a, 1, #a, #b + 1, b)
+ end
+}
- status_bar.root = parent:Object {
+function widgets.StatusBar(parent, opts)
+ local root = parent.root:Object {
flex = {
flex_direction = "row",
justify_content = "flex-start",
@@ -81,19 +88,19 @@ function widgets.StatusBar(parent, opts)
}
if not opts.transparent_bg then
- theme.set_style(status_bar.root, "header");
+ theme.set_style(root, "header");
end
if opts.back_cb then
- status_bar.back = status_bar.root:Button {
+ local back = root:Button {
w = lvgl.SIZE_CONTENT,
h = 12,
}
- status_bar.back:Label({ text = "<", align = lvgl.ALIGN.CENTER })
- status_bar.back:onClicked(opts.back_cb)
+ back:Label({ text = "<", align = lvgl.ALIGN.CENTER })
+ back:onClicked(opts.back_cb)
end
- status_bar.title = status_bar.root:Label {
+ local title = root:Label {
w = lvgl.PCT(100),
h = lvgl.SIZE_CONTENT,
text_font = font.fusion_10,
@@ -102,15 +109,15 @@ function widgets.StatusBar(parent, opts)
flex_grow = 1,
}
if opts.title then
- status_bar.title:set { text = opts.title }
+ title:set { text = opts.title }
end
- status_bar.db_updating = status_bar.root:Image { src = img.db }
- theme.set_style(status_bar.db_updating, "database_indicator")
- status_bar.bluetooth = status_bar.root:Image {}
- status_bar.battery = status_bar.root:Image {}
- status_bar.chg = status_bar.battery:Image { src = img.chg }
- status_bar.chg:center()
+ local db_updating = root:Image { src = img.db }
+ theme.set_style(db_updating, "database_indicator")
+ local bt_icon = root:Image {}
+ local battery_icon = root:Image {}
+ local charge_icon = battery_icon:Image { src = img.chg }
+ charge_icon:center()
local is_charging = nil
local percent = nil
@@ -136,19 +143,19 @@ function widgets.StatusBar(parent, opts)
end
end
if is_charging then
- status_bar.chg:clear_flag(lvgl.FLAG.HIDDEN)
+ charge_icon:clear_flag(lvgl.FLAG.HIDDEN)
else
- status_bar.chg:add_flag(lvgl.FLAG.HIDDEN)
+ charge_icon:add_flag(lvgl.FLAG.HIDDEN)
end
- status_bar.battery:set_src(src)
+ battery_icon:set_src(src)
end
- status_bar.bindings = {
+ parent.bindings = {
database.updating:bind(function(yes)
if yes then
- status_bar.db_updating:clear_flag(lvgl.FLAG.HIDDEN)
+ db_updating:clear_flag(lvgl.FLAG.HIDDEN)
else
- status_bar.db_updating:add_flag(lvgl.FLAG.HIDDEN)
+ db_updating:add_flag(lvgl.FLAG.HIDDEN)
end
end),
power.battery_pct:bind(function(pct)
@@ -161,21 +168,20 @@ function widgets.StatusBar(parent, opts)
end),
bluetooth.enabled:bind(function(en)
if en then
- status_bar.bluetooth:clear_flag(lvgl.FLAG.HIDDEN)
+ bt_icon:clear_flag(lvgl.FLAG.HIDDEN)
else
- status_bar.bluetooth:add_flag(lvgl.FLAG.HIDDEN)
+ bt_icon:add_flag(lvgl.FLAG.HIDDEN)
end
end),
bluetooth.connected:bind(function(connected)
if connected then
- status_bar.bluetooth:set_src(img.bt_conn)
+ bt_icon:set_src(img.bt_conn)
else
- status_bar.bluetooth:set_src(img.bt)
+ bt_icon:set_src(img.bt)
end
end),
}
-
- return status_bar
+ setmetatable(parent.bindings, bindings_meta)
end
function widgets.IconBtn(parent, icon, text)