//----------------------------------------------------------------------------------- // // 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, 31 October 2023 // // // Description: // // Home Assistant menu construction. // //----------------------------------------------------------------------------------- using Toybox.Lang; using Toybox.Graphics; using Toybox.WatchUi; class HomeAssistantView extends WatchUi.Menu2 { function initialize( definition as Lang.Dictionary, options as { :focus as Lang.Number, :icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol, :theme as WatchUi.MenuTheme or Null } or Null ) { var toggle_obj = { :enabled => "On", :disabled => "Off" }; if (options == null) { options = { :title => definition.get("title") as Lang.String }; } else { options.put(:title, definition.get("title") as Lang.String); } WatchUi.Menu2.initialize(options); var items = definition.get("items") as Lang.Dictionary; for(var i = 0; i < items.size(); i++) { var type = items[i].get("type") as Lang.String or Null; var name = items[i].get("name") as Lang.String or Null; var entity = items[i].get("entity") as Lang.String or Null; if (type != null && name != null && entity != null) { if (type.equals("toggle")) { addItem( new HomeAssistantToggleMenuItem( name, toggle_obj, entity, false, null ) ); } else if (type.equals("tap")) { addItem( new HomeAssistantMenuItem( name, "Tap", entity, null ) ); } else if (type.equals("group")) { addItem( new HomeAssistantViewMenuItem(items[i]) ); } } } } // Called when this View is brought to the foreground. Restore // the state of this View and prepare it to be shown. This includes // loading resources into memory. function onShow() as Void { for(var i = 0; i < mItems.size(); i++) { if (mItems[i] instanceof HomeAssistantToggleMenuItem) { var toggleItem = mItems[i] as HomeAssistantToggleMenuItem; toggleItem.getState(); if (Globals.debug) { System.println("HomeAssistantView Note: " + toggleItem.getLabel() + " ID=" + toggleItem.getId() + " Enabled=" + toggleItem.isEnabled()); } } } } function stateUpdate() as Void { for(var i = 0; i < mItems.size(); i++) { if (mItems[i] instanceof HomeAssistantToggleMenuItem) { var toggleItem = mItems[i] as HomeAssistantToggleMenuItem; toggleItem.getState(); if (Globals.debug) { System.println("HomeAssistantView Toggle stateUpdate: " + toggleItem.getLabel() + " ID=" + toggleItem.getId() + " Enabled=" + toggleItem.isEnabled()); } } else if (mItems[i] instanceof HomeAssistantViewMenuItem) { var menu = mItems[i] as HomeAssistantViewMenuItem; if (Globals.debug) { System.println("HomeAssistantView Menu stateUpdate: " + menu.getLabel() + " ID=" + menu.getId()); } menu.getMenuView().stateUpdate(); } } } } class HomeAssistantViewDelegate extends WatchUi.Menu2InputDelegate { function initialize() { Menu2InputDelegate.initialize(); } function onSelect(item as WatchUi.MenuItem) as Void { if (item instanceof HomeAssistantToggleMenuItem) { var haToggleItem = item as HomeAssistantToggleMenuItem; if (Globals.debug) { System.println(haToggleItem.getLabel() + " " + haToggleItem.getId() + " " + haToggleItem.isEnabled()); } haToggleItem.setState(haToggleItem.isEnabled()); } else if (item instanceof HomeAssistantMenuItem) { var haItem = item as HomeAssistantMenuItem; if (Globals.debug) { System.println(haItem.getLabel() + " " + haItem.getId()); } haItem.execScript(); } else if (item instanceof HomeAssistantViewMenuItem) { var haMenuItem = item as HomeAssistantViewMenuItem; if (Globals.debug) { System.println("Menu: " + haMenuItem.getLabel() + " " + haMenuItem.getId()); } // No delegate state to be amended, so re-use 'self'. WatchUi.pushView(haMenuItem.getMenuView(), self, WatchUi.SLIDE_LEFT); } else { if (Globals.debug) { System.println(item.getLabel() + " " + item.getId()); } } } function onSwipe(swipeEvent) as Lang.Boolean { switch (swipeEvent.getDirection()) { case WatchUi.SWIPE_RIGHT: WatchUi.popView(WatchUi.SLIDE_RIGHT); break; default: // Do nothing break; } return true; } }