From e8f2c0d3bbb9c9a5e51f6fa05db79f2c0274f9f3 Mon Sep 17 00:00:00 2001 From: Philip Abbey Date: Fri, 28 Mar 2025 00:22:09 +0000 Subject: [PATCH] Amended menu item class inheritance --- HISTORY.md | 1 + source/HomeAssistantGroupMenuItem.mc | 48 +++-------------- source/HomeAssistantMenuItem.mc | 79 ++++++++++++++++++++++++++++ source/HomeAssistantTapMenuItem.mc | 54 +++++-------------- 4 files changed, 100 insertions(+), 82 deletions(-) create mode 100644 source/HomeAssistantMenuItem.mc diff --git a/HISTORY.md b/HISTORY.md index 8471ad5..b1e6e38 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -38,3 +38,4 @@ | 2.23 | Added "info" menu item for displaying information via a template without a tap or toggle. Essentially like the old 'template' type that was deprecated when all items were amended to display evaluated templates. That action removed the display only items too hastily. Added 5 new devices in the model range Instinct 3 and Instinct E. | | 2.24 | Experiment to prevent new Webhook IDs being created unnecessarily. Reduced the latency for the first menu update. Added 4 new devices: approachs50, descentg2, descentmk1, and gpsmap66. | | 2.25 | 2 Bug fixes. First time startup issues caused by v2.24 change and a fix for pure numbers in returned templates. | +| 2.26 | Retry responsive menu fix failed in v2.24. Cosmetic internal class changes. | diff --git a/source/HomeAssistantGroupMenuItem.mc b/source/HomeAssistantGroupMenuItem.mc index e886cd4..f4df2a7 100644 --- a/source/HomeAssistantGroupMenuItem.mc +++ b/source/HomeAssistantGroupMenuItem.mc @@ -22,8 +22,7 @@ using Toybox.Lang; using Toybox.WatchUi; -class HomeAssistantGroupMenuItem extends WatchUi.IconMenuItem { - private var mTemplate as Lang.String or Null; +class HomeAssistantGroupMenuItem extends HomeAssistantMenuItem { private var mMenu as HomeAssistantView; function initialize( @@ -34,52 +33,21 @@ class HomeAssistantGroupMenuItem extends WatchUi.IconMenuItem { :alignment as WatchUi.MenuItem.Alignment } or Null ) { + if (options != null) { + options.put(:icon, icon); + } else { + options = { :icon => icon }; + } - WatchUi.IconMenuItem.initialize( + HomeAssistantMenuItem.initialize( definition.get("name") as Lang.String, - null, - null, - icon, + template, options ); - mTemplate = template; mMenu = new HomeAssistantView(definition, null); } - function hasTemplate() as Lang.Boolean { - return mTemplate != null; - } - - function buildTemplate() as Lang.String or Null { - return mTemplate; - } - - function updateState(data as Lang.String or Lang.Dictionary or Null) as Void { - if (data == null) { - setSubLabel(null); - } else if(data instanceof Lang.String) { - setSubLabel(data); - } else if(data instanceof Lang.Number) { - var d = data as Lang.Number; - setSubLabel(d.format("%d")); - } else if(data instanceof Lang.Float) { - var f = data as Lang.Float; - setSubLabel(f.format("%f")); - } else if(data instanceof Lang.Dictionary) { - // System.println("HomeAssistantGroupMenuItem updateState() data = " + data); - if (data.get("error") != null) { - setSubLabel($.Rez.Strings.TemplateError); - } else { - setSubLabel($.Rez.Strings.PotentialError); - } - } else { - // The template must return a Lang.String, Number or Float, or the item cannot be formatted locally without error. - setSubLabel(WatchUi.loadResource($.Rez.Strings.TemplateError) as Lang.String); - } - WatchUi.requestUpdate(); - } - function getMenuView() as HomeAssistantView { return mMenu; } diff --git a/source/HomeAssistantMenuItem.mc b/source/HomeAssistantMenuItem.mc new file mode 100644 index 0000000..fbb060d --- /dev/null +++ b/source/HomeAssistantMenuItem.mc @@ -0,0 +1,79 @@ +//----------------------------------------------------------------------------------- +// +// Distributed under MIT Licence +// See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE. +// +//----------------------------------------------------------------------------------- +// +// GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely +// tested on a Venu 2 device. The source code is provided at: +// https://github.com/house-of-abbey/GarminHomeAssistant. +// +// P A Abbey & J D Abbey & Someone0nEarth, 31 October 2023 +// +// +// Description: +// +// Generic menu button with an icon that optionally renders a Home Assistant Template. +// +//----------------------------------------------------------------------------------- + +using Toybox.Lang; +using Toybox.WatchUi; +using Toybox.Graphics; + +class HomeAssistantMenuItem extends WatchUi.IconMenuItem { + private var mTemplate as Lang.String or Null; + + function initialize( + label as Lang.String or Lang.Symbol, + template as Lang.String, + options as { + :alignment as WatchUi.MenuItem.Alignment, + :icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol + } or Null + ) { + WatchUi.IconMenuItem.initialize( + label, + null, + null, + options.get(:icon), + options + ); + mTemplate = template; + } + + function hasTemplate() as Lang.Boolean { + return mTemplate != null; + } + + function buildTemplate() as Lang.String or Null { + return mTemplate; + } + + function updateState(data as Lang.String or Lang.Dictionary or Null) as Void { + if (data == null) { + setSubLabel($.Rez.Strings.Empty); + } else if(data instanceof Lang.String) { + setSubLabel(data); + } else if(data instanceof Lang.Number) { + var d = data as Lang.Number; + setSubLabel(d.format("%d")); + } else if(data instanceof Lang.Float) { + var f = data as Lang.Float; + setSubLabel(f.format("%f")); + } else if(data instanceof Lang.Dictionary) { + // System.println("HomeAssistantMenuItem updateState() data = " + data); + if (data.get("error") != null) { + setSubLabel($.Rez.Strings.TemplateError); + } else { + setSubLabel($.Rez.Strings.PotentialError); + } + } else { + // The template must return a Lang.String, Number or Float, or the item cannot be formatted locally without error. + setSubLabel(WatchUi.loadResource($.Rez.Strings.TemplateError) as Lang.String); + } + WatchUi.requestUpdate(); + } + +} \ No newline at end of file diff --git a/source/HomeAssistantTapMenuItem.mc b/source/HomeAssistantTapMenuItem.mc index 1c8a2be..9e89e78 100644 --- a/source/HomeAssistantTapMenuItem.mc +++ b/source/HomeAssistantTapMenuItem.mc @@ -9,7 +9,7 @@ // tested on a Venu 2 device. The source code is provided at: // https://github.com/house-of-abbey/GarminHomeAssistant. // -// P A Abbey & J D Abbey & Someone0nEarth, 31 October 2023 +// P A Abbey & J D Abbey & Someone0nEarth & moesterheld, 31 October 2023 // // // Description: @@ -22,9 +22,8 @@ using Toybox.Lang; using Toybox.WatchUi; using Toybox.Graphics; -class HomeAssistantTapMenuItem extends WatchUi.IconMenuItem { +class HomeAssistantTapMenuItem extends HomeAssistantMenuItem { private var mHomeAssistantService as HomeAssistantService; - private var mTemplate as Lang.String; private var mService as Lang.String or Null; private var mConfirm as Lang.Boolean; private var mPin as Lang.Boolean; @@ -39,59 +38,30 @@ class HomeAssistantTapMenuItem extends WatchUi.IconMenuItem { data as Lang.Dictionary or Null, icon as Graphics.BitmapType or WatchUi.Drawable, options as { - :alignment as WatchUi.MenuItem.Alignment + :alignment as WatchUi.MenuItem.Alignment, + :icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol } or Null, haService as HomeAssistantService ) { - WatchUi.IconMenuItem.initialize( + if (options != null) { + options.put(:icon, icon); + } else { + options = { :icon => icon }; + } + + HomeAssistantMenuItem.initialize( label, - null, - null, - icon, + template, options ); mHomeAssistantService = haService; - mTemplate = template; mService = service; mConfirm = confirm; mPin = pin; mData = data; } - function hasTemplate() as Lang.Boolean { - return mTemplate != null; - } - - function buildTemplate() as Lang.String or Null { - return mTemplate; - } - - function updateState(data as Lang.String or Lang.Dictionary or Null) as Void { - if (data == null) { - setSubLabel($.Rez.Strings.Empty); - } else if(data instanceof Lang.String) { - setSubLabel(data); - } else if(data instanceof Lang.Number) { - var d = data as Lang.Number; - setSubLabel(d.format("%d")); - } else if(data instanceof Lang.Float) { - var f = data as Lang.Float; - setSubLabel(f.format("%f")); - } else if(data instanceof Lang.Dictionary) { - // System.println("HomeAssistantTapMenuItem updateState() data = " + data); - if (data.get("error") != null) { - setSubLabel($.Rez.Strings.TemplateError); - } else { - setSubLabel($.Rez.Strings.PotentialError); - } - } else { - // The template must return a Lang.String, Number or Float, or the item cannot be formatted locally without error. - setSubLabel(WatchUi.loadResource($.Rez.Strings.TemplateError) as Lang.String); - } - WatchUi.requestUpdate(); - } - function callService() as Void { var hasTouchScreen = System.getDeviceSettings().isTouchScreen; if (mPin && hasTouchScreen) {