From 9db964ce743fa077bdf82ab5ef1cfb6459846c10 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 28 Jun 2024 09:57:46 +1000 Subject: [PATCH] WIP start on an updated main menu ui --- lib/luavgl/src/style.c | 13 +++++ lua/images.lua | 13 +++++ lua/img/files.png | Bin 0 -> 8410 bytes lua/img/queue.png | Bin 0 -> 6992 bytes lua/img/settings.png | Bin 0 -> 5898 bytes lua/main_menu.lua | 120 ++++++++++++++++++++++++++++++++++++----- lua/playing.lua | 9 +--- 7 files changed, 135 insertions(+), 20 deletions(-) create mode 100644 lua/images.lua create mode 100644 lua/img/files.png create mode 100644 lua/img/queue.png create mode 100644 lua/img/settings.png diff --git a/lib/luavgl/src/style.c b/lib/luavgl/src/style.c index 95c9f363..5bfba2bb 100644 --- a/lib/luavgl/src/style.c +++ b/lib/luavgl/src/style.c @@ -18,6 +18,7 @@ typedef enum { enum { LV_STYLE_SIZE = _LV_STYLE_LAST_BUILT_IN_PROP + 1, + LV_STYLE_MARGIN_ALL, LV_STYLE_PAD_ALL, LV_STYLE_PAD_VER, LV_STYLE_PAD_HOR, @@ -61,6 +62,10 @@ static const struct style_map_s { {"transform_pivot_x", LV_STYLE_TRANSFORM_PIVOT_X, STYLE_TYPE_INT }, {"transform_pivot_y", LV_STYLE_TRANSFORM_PIVOT_Y, STYLE_TYPE_INT }, #endif + {"margin_top", LV_STYLE_MARGIN_TOP, STYLE_TYPE_INT }, + {"margin_bottom", LV_STYLE_MARGIN_BOTTOM, STYLE_TYPE_INT }, + {"margin_left", LV_STYLE_MARGIN_LEFT, STYLE_TYPE_INT }, + {"margin_right", LV_STYLE_MARGIN_RIGHT, STYLE_TYPE_INT }, {"pad_top", LV_STYLE_PAD_TOP, STYLE_TYPE_INT }, {"pad_bottom", LV_STYLE_PAD_BOTTOM, STYLE_TYPE_INT }, {"pad_left", LV_STYLE_PAD_LEFT, STYLE_TYPE_INT }, @@ -134,6 +139,7 @@ static const struct style_map_s { /* styles combined */ {"size", LV_STYLE_SIZE, STYLE_TYPE_SPECIAL | STYLE_TYPE_INT }, + {"margin_all", LV_STYLE_MARGIN_ALL, STYLE_TYPE_SPECIAL | STYLE_TYPE_INT }, {"pad_all", LV_STYLE_PAD_ALL, STYLE_TYPE_SPECIAL | STYLE_TYPE_INT }, {"pad_ver", LV_STYLE_PAD_VER, STYLE_TYPE_SPECIAL | STYLE_TYPE_INT }, {"pad_hor", LV_STYLE_PAD_HOR, STYLE_TYPE_SPECIAL | STYLE_TYPE_INT }, @@ -417,6 +423,13 @@ static int luavgl_set_style_kv(lua_State *L, style_set_cb_t cb, void *args) cb(LV_STYLE_HEIGHT, value, args); break; + case LV_STYLE_MARGIN_ALL: + cb(LV_STYLE_MARGIN_TOP, value, args); + cb(LV_STYLE_MARGIN_BOTTOM, value, args); + cb(LV_STYLE_MARGIN_LEFT, value, args); + cb(LV_STYLE_MARGIN_RIGHT, value, args); + break; + case LV_STYLE_PAD_ALL: cb(LV_STYLE_PAD_TOP, value, args); cb(LV_STYLE_PAD_BOTTOM, value, args); diff --git a/lua/images.lua b/lua/images.lua new file mode 100644 index 00000000..84c957e8 --- /dev/null +++ b/lua/images.lua @@ -0,0 +1,13 @@ +local lvgl = require("lvgl") + +return { + play = lvgl.ImgData("//lua/img/play.png"), + pause = lvgl.ImgData("//lua/img/pause.png"), + next = lvgl.ImgData("//lua/img/next.png"), + prev = lvgl.ImgData("//lua/img/prev.png"), + shuffle = lvgl.ImgData("//lua/img/shuffle.png"), + repeat_src = lvgl.ImgData("//lua/img/repeat.png"), -- repeat is a reserved word + queue = lvgl.ImgData("//lua/img/queue.png"), + files = lvgl.ImgData("//lua/img/files.png"), + settings = lvgl.ImgData("//lua/img/settings.png"), +} diff --git a/lua/img/files.png b/lua/img/files.png new file mode 100644 index 0000000000000000000000000000000000000000..dd33559ca847d273b0208ed27ad11cfdbfb4cb79 GIT binary patch literal 8410 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 literal 0 HcmV?d00001 diff --git a/lua/img/queue.png b/lua/img/queue.png new file mode 100644 index 0000000000000000000000000000000000000000..577397720b638db543e31467e194da8b84f297e6 GIT binary patch literal 6992 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 literal 0 HcmV?d00001 diff --git a/lua/img/settings.png b/lua/img/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc29e512f5e0287ee210452824cd947c43f9258 GIT binary patch literal 5898 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 literal 0 HcmV?d00001 diff --git a/lua/main_menu.lua b/lua/main_menu.lua index 9c52340b..da90fd44 100644 --- a/lua/main_menu.lua +++ b/lua/main_menu.lua @@ -7,23 +7,94 @@ 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") +local playback = require("playback") return widgets.MenuScreen:new { createUi = function(self) widgets.MenuScreen.createUi(self) + -- At the top, a card showing details about the current track. Hidden if + -- there is no track currently playing. + -- || Cool Song 0:01 + + local now_playing = lvgl.Button(self.root, { + flex = { + flex_direction = "row", + flex_wrap = "nowrap", + justify_content = "flex-start", + align_items = "center", + align_content = "flex-start", + }, + w = lvgl.PCT(100), + h = lvgl.SIZE_CONTENT, + margin_all = 2, + pad_column = 4, + border_color = "#FFFFFF", + border_width = 1, + }) + + local play_pause = now_playing:Image { src = img.play } + local title = now_playing:Label { + flex_grow = 1, + h = lvgl.SIZE_CONTENT, + text = " ", + long_mode = 1, + } + local time_remaining = now_playing:Label { + text = " ", + text_font = font.fusion_10, + } + + now_playing:onClicked(function() backstack.push(playing:new()) end) + + local has_focus = false + local track_duration = nil + + self.bindings = self.bindings + { + playback.playing:bind(function(playing) + if playing then + play_pause:set_src(img.play) + else + play_pause:set_src(img.pause) + end + end), + playback.track:bind(function(track) + if not track then + now_playing:add_flag(lvgl.FLAG.HIDDEN) + return + else + has_focus = true + now_playing:clear_flag(lvgl.FLAG.HIDDEN) + end + title:set { text = track.title } + if track.duration then + track_duration = track.duration + end + end), + playback.position:bind(function(pos) + if not pos then return end + if not track_duration then return end + local remaining = track_duration - pos + if remaining < 0 then remaining = 0 end + time_remaining:set { + text = string.format("%d:%02d", remaining // 60, remaining % 60) + } + end), + } + + -- Next, a list showing the user's prefer's music source. This defaults to + -- a list of all available database indexes, but could also be the contents + -- of the SD card root. + local list = lvgl.List(self.root, { w = lvgl.PCT(100), h = lvgl.PCT(100), flex_grow = 1, }) - local now_playing = list:add_btn(nil, "Now Playing") - now_playing:onClicked(function() - backstack.push(playing:new()) - end) - now_playing:add_style(styles.list_item) - local indexes = database.indexes() for _, idx in ipairs(indexes) do local btn = list:add_btn(nil, tostring(idx)) @@ -34,21 +105,46 @@ return widgets.MenuScreen:new { }) end) btn:add_style(styles.list_item) + if not has_focus then + has_focus = true + btn:focus() + end end - local files = list:add_btn(nil, "Files") - files:onClicked(function() + -- Finally, the bottom bar with icon buttons for other device features. + + local bottom_bar = lvgl.Object(self.root, { + flex = { + flex_direction = "row", + flex_wrap = "nowrap", + justify_content = "space-evenly", + align_items = "center", + align_content = "flex-start", + }, + w = lvgl.PCT(100), + h = lvgl.SIZE_CONTENT, + pad_top = 4, + }) + + local queue_btn = bottom_bar:Button {} + queue_btn:Image { src = img.queue } + theme.set_style(queue_btn, "icon_enabled") + + local files_btn = bottom_bar:Button {} + files_btn:onClicked(function() backstack.push(require("file_browser"):new { title = "Files", iterator = filesystem.iterator(""), }) end) - files:add_style(styles.list_item) + files_btn:Image { src = img.files } + theme.set_style(files_btn, "icon_enabled") - local settings = list:add_btn(nil, "Settings") - settings:onClicked(function() + local settings_btn = bottom_bar:Button {} + settings_btn:onClicked(function() backstack.push(require("settings"):new()) end) - settings:add_style(styles.list_item) + settings_btn:Image { src = img.settings } + theme.set_style(settings_btn, "icon_enabled") end, } diff --git a/lua/playing.lua b/lua/playing.lua index 6a9488e2..90e20f49 100644 --- a/lua/playing.lua +++ b/lua/playing.lua @@ -7,14 +7,7 @@ local queue = require("queue") local screen = require("screen") local theme = require("theme") -local img = { - play = lvgl.ImgData("//lua/img/play.png"), - pause = lvgl.ImgData("//lua/img/pause.png"), - next = lvgl.ImgData("//lua/img/next.png"), - prev = lvgl.ImgData("//lua/img/prev.png"), - shuffle = lvgl.ImgData("//lua/img/shuffle.png"), - repeat_src = lvgl.ImgData("//lua/img/repeat.png"), -- repeat is a reserved word -} +local img = require("images") local format_time = function(time) time = math.floor(time)