From e8838b3eaf0c26b4ff790e18b38d769c6b8e6bba Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 3 Oct 2023 12:10:49 +0200 Subject: [PATCH] ui/lvgl: add an optional spinner to card widget some cards will need to show a nondeterministic progress. the spinner in the top right corner does exactly that, controlled via the new spin function. the default is no spinner. --- src/ui/bitcoin.zig | 6 +++--- src/ui/lightning.zig | 6 +++--- src/ui/lvgl.zig | 35 +++++++++++++++++++++++++++++++---- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/ui/bitcoin.zig b/src/ui/bitcoin.zig index efda243..c9423d5 100644 --- a/src/ui/bitcoin.zig +++ b/src/ui/bitcoin.zig @@ -45,7 +45,7 @@ pub fn initTabPanel(cont: lvgl.Container) !void { // blockchain section { - const card = try lvgl.Card.new(parent, "BLOCKCHAIN"); + const card = try lvgl.Card.new(parent, "BLOCKCHAIN", .{}); const row = try lvgl.FlexLayout.new(card, .row, .{}); row.setWidth(lvgl.sizePercent(100)); row.setHeightToContent(); @@ -69,7 +69,7 @@ pub fn initTabPanel(cont: lvgl.Container) !void { } // balance section { - const card = try lvgl.Card.new(parent, "ON-CHAIN BALANCE"); + const card = try lvgl.Card.new(parent, "ON-CHAIN BALANCE", .{}); const row = try lvgl.FlexLayout.new(card, .row, .{}); row.setWidth(lvgl.sizePercent(100)); row.setHeightToContent(); @@ -93,7 +93,7 @@ pub fn initTabPanel(cont: lvgl.Container) !void { } // mempool section { - const card = try lvgl.Card.new(parent, "MEMPOOL"); + const card = try lvgl.Card.new(parent, "MEMPOOL", .{}); const row = try lvgl.FlexLayout.new(card, .row, .{}); row.setWidth(lvgl.sizePercent(100)); row.clearFlag(.scrollable); diff --git a/src/ui/lightning.zig b/src/ui/lightning.zig index 3b7100a..a12abea 100644 --- a/src/ui/lightning.zig +++ b/src/ui/lightning.zig @@ -39,7 +39,7 @@ pub fn initTabPanel(cont: lvgl.Container) !void { // info section { - const card = try lvgl.Card.new(parent, "INFO"); + const card = try lvgl.Card.new(parent, "INFO", .{}); const row = try lvgl.FlexLayout.new(card, .row, .{}); row.setHeightToContent(); row.setWidth(lvgl.sizePercent(100)); @@ -63,7 +63,7 @@ pub fn initTabPanel(cont: lvgl.Container) !void { } // balance section { - const card = try lvgl.Card.new(parent, "BALANCE"); + const card = try lvgl.Card.new(parent, "BALANCE", .{}); const row = try lvgl.FlexLayout.new(card, .row, .{}); row.setWidth(lvgl.sizePercent(100)); row.clearFlag(.scrollable); @@ -89,7 +89,7 @@ pub fn initTabPanel(cont: lvgl.Container) !void { } // channels section { - const card = try lvgl.Card.new(parent, "CHANNELS"); + const card = try lvgl.Card.new(parent, "CHANNELS", .{}); tab.channels_cont = try lvgl.FlexLayout.new(card, .column, .{}); tab.channels_cont.setHeightToContent(); tab.channels_cont.setWidth(lvgl.sizePercent(100)); diff --git a/src/ui/lvgl.zig b/src/ui/lvgl.zig index 75ae62c..2788afd 100644 --- a/src/ui/lvgl.zig +++ b/src/ui/lvgl.zig @@ -623,17 +623,44 @@ pub const Window = struct { pub const Card = struct { lvobj: *LvObj, title: Label, + spinner: ?Spinner = null, pub usingnamespace BaseObjMethods; pub usingnamespace WidgetMethods; - pub fn new(parent: anytype, title: [*:0]const u8) !Card { + pub const Opt = struct { + /// embeds a spinner in the top-right corner; control with spin fn. + spinner: bool = false, + }; + + pub fn new(parent: anytype, title: [*:0]const u8, opt: Opt) !Card { const flex = (try Container.new(parent)).flex(.column, .{}); flex.setHeightToContent(); flex.setWidth(sizePercent(100)); - const tl = try Label.new(flex, title, .{}); - tl.addStyle(nm_style_title(), .{}); - return .{ .lvobj = flex.lvobj, .title = tl }; + var card: Card = .{ .lvobj = flex.lvobj, .title = undefined }; + + if (opt.spinner) { + const row = try FlexLayout.new(flex, .row, .{}); + row.setWidth(sizePercent(100)); + row.setHeightToContent(); + card.title = try Label.new(row, title, .{}); + card.title.flexGrow(1); + card.spinner = try Spinner.new(row); + card.spinner.?.flexGrow(0); + card.spin(.off); + } else { + card.title = try Label.new(flex, title, .{}); + } + card.title.addStyle(nm_style_title(), .{}); + + return card; + } + + pub fn spin(self: Card, onoff: enum { on, off }) void { + if (self.spinner) |p| switch (onoff) { + .on => p.show(), + .off => p.hide(), + }; } };