diff --git a/source/HomeAssistantMenuItemFactory.mc b/source/HomeAssistantMenuItemFactory.mc new file mode 100644 index 0000000..5703829 --- /dev/null +++ b/source/HomeAssistantMenuItemFactory.mc @@ -0,0 +1,105 @@ +//----------------------------------------------------------------------------------- +// +// 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 & SomeoneOnEarth, 17 November 2023 +// +// +// Description: +// +// MenuItems Factory. +// +//----------------------------------------------------------------------------------- + +using Toybox.Application; +using Toybox.Lang; +using Toybox.WatchUi; + +class HomeAssistantMenuItemFactory { + + private var mRightLabelAlignement; + private var mLabelToggle; + private var strMenuItemTap; + private var bLeanDesign; + + private var mTapIcon; + + private static var instance; + + private function initialize() { + mLabelToggle = { + :enabled => WatchUi.loadResource($.Rez.Strings.MenuItemOn) as Lang.String, + :disabled => WatchUi.loadResource($.Rez.Strings.MenuItemOff) as Lang.String + }; + + bLeanDesign = Application.Properties.getValue("lean_ui") as Lang.Boolean; + + mRightLabelAlignement = {:alignment => WatchUi.MenuItem.MENU_ITEM_LABEL_ALIGN_RIGHT}; + + strMenuItemTap = WatchUi.loadResource($.Rez.Strings.MenuItemTap); + mTapIcon = new WatchUi.Bitmap({ + :rezId=>$.Rez.Drawables.TapIcon + }); + + } + + static function create() { + if (instance == null) { + instance = new HomeAssistantMenuItemFactory(); + } + return instance; + } + + function toggle(label as Lang.String or Lang.Symbol, identifier as Lang.Object or Null) as WatchUi.MenuItem{ + var subLabel = null; + + if (bLeanDesign == false){ + subLabel=mLabelToggle; + } + + return new HomeAssistantToggleMenuItem( + label, + subLabel, + identifier, + false, + null + ); + } + + function tap(label as Lang.String or Lang.Symbol, identifier as Lang.Object or Null, service as Lang.String or Null) as WatchUi.MenuItem{ + if (bLeanDesign) { + return new HomeAssistantIconMenuItem( + label, + null, + identifier, + service, + mTapIcon, + mRightLabelAlignement + ); + + } else { + return new HomeAssistantMenuItem( + label, + strMenuItemTap, + identifier, + service, + null + ); + } + } + + function group(definition as Lang.Dictionary) as WatchUi.MenuItem{ + if (bLeanDesign) { + return new HomeAssistantViewIconMenuItem(definition); + } else { + return new HomeAssistantViewMenuItem(definition); + } + } +} diff --git a/source/HomeAssistantView.mc b/source/HomeAssistantView.mc index df0a826..a2c9ead 100644 --- a/source/HomeAssistantView.mc +++ b/source/HomeAssistantView.mc @@ -28,7 +28,6 @@ class HomeAssistantView extends WatchUi.Menu2 { // List of items that need to have their status updated periodically hidden var mListToggleItems = []; hidden var mListMenuItems = []; - hidden var mListIconMenuItems = []; function initialize( definition as Lang.Dictionary, @@ -38,17 +37,6 @@ class HomeAssistantView extends WatchUi.Menu2 { :theme as WatchUi.MenuTheme or Null } or Null ) { - - var toggle_obj = null; - var strMenuItemTap = null; - - if ((Application.Properties.getValue("lean_ui") as Lang.Boolean) == false){ - toggle_obj = { - :enabled => WatchUi.loadResource($.Rez.Strings.MenuItemOn) as Lang.String, - :disabled => WatchUi.loadResource($.Rez.Strings.MenuItemOff) as Lang.String - }; - strMenuItemTap = WatchUi.loadResource($.Rez.Strings.MenuItemTap); - } if (options == null) { options = { @@ -67,55 +55,15 @@ class HomeAssistantView extends WatchUi.Menu2 { var service = items[i].get("service") as Lang.String or Null; if (type != null && name != null && entity != null) { if (type.equals("toggle")) { - var item = new HomeAssistantToggleMenuItem( - name, - toggle_obj, - entity, - false, - null - ); + var item = HomeAssistantMenuItemFactory.create().toggle(name, entity); addItem(item); mListToggleItems.add(item); } else if (type.equals("tap") && service != null) { - if ((Application.Properties.getValue("lean_ui") as Lang.Boolean) == true){ - - var icon = new WatchUi.Bitmap({ - :rezId=>Rez.Drawables.TapIcon - }); - - var alignement = {:alignment => WatchUi.MenuItem.MENU_ITEM_LABEL_ALIGN_RIGHT}; - - addItem( - new HomeAssistantIconMenuItem( - name, - strMenuItemTap, - entity, - service, - icon, - alignement - ) - ); - } else { - addItem( - new HomeAssistantMenuItem( - name, - strMenuItemTap, - entity, - service, - null - ) - ); - } + addItem( HomeAssistantMenuItemFactory.create().tap(name, entity, service)); } else if (type.equals("group")) { - if ((Application.Properties.getValue("lean_ui") as Lang.Boolean) == true){ - var item = new HomeAssistantViewIconMenuItem(items[i]); - addItem(item); - mListIconMenuItems.add(item); - } else { - var item = new HomeAssistantViewMenuItem(items[i]); - addItem(item); - mListMenuItems.add(item); - } + var item = HomeAssistantMenuItemFactory.create().group(items[i]); + addItem(item); + mListMenuItems.add(item); } } } @@ -124,14 +72,14 @@ class HomeAssistantView extends WatchUi.Menu2 { function getItemsToUpdate() as Lang.Array { var fullList = []; - var lmi = mListMenuItems as Lang.Array; - for(var i = 0; i < lmi.size(); i++) { - fullList.addAll(lmi[i].getMenuView().getItemsToUpdate()); - } - - var limi = mListIconMenuItems as Lang.Array; - for(var i = 0; i < limi.size(); i++) { - fullList.addAll(limi[i].getMenuView().getItemsToUpdate()); + var lmi = mListMenuItems as Lang.Array; + for(var i = 0; i < mListMenuItems.size(); i++) { + var item = lmi[i]; + if (item instanceof HomeAssistantViewMenuItem) { + fullList.addAll(item.getMenuView().getItemsToUpdate()); + } else if (item instanceof HomeAssistantViewIconMenuItem) { + fullList.addAll(item.getMenuView().getItemsToUpdate()); + } } return fullList.addAll(mListToggleItems); diff --git a/source/HomeAssistantViewIconMenuItem.mc b/source/HomeAssistantViewIconMenuItem.mc index 63333b8..094055d 100644 --- a/source/HomeAssistantViewIconMenuItem.mc +++ b/source/HomeAssistantViewIconMenuItem.mc @@ -9,12 +9,12 @@ // 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, 31 October 2023 +// P A Abbey & J D Abbey & SomeoneOnEarth, 16 November 2023 // // // Description: // -// Menu button that opens a sub-menu. +// Menu button with an icon that opens a sub-menu. // //-----------------------------------------------------------------------------------