mirror of
https://github.com/house-of-abbey/GarminHomeAssistant.git
synced 2025-07-09 22:38:40 +00:00
The newer SDK support tooltips to show the function prototype and help text, so best to make good use of it.
163 lines
5.2 KiB
MonkeyC
163 lines
5.2 KiB
MonkeyC
//-----------------------------------------------------------------------------------
|
|
//
|
|
// 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, 17 November 2023
|
|
//
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
using Toybox.Application;
|
|
using Toybox.Lang;
|
|
using Toybox.WatchUi;
|
|
|
|
//! MenuItems Factory class.
|
|
//
|
|
class HomeAssistantMenuItemFactory {
|
|
private var mMenuItemOptions as Lang.Dictionary;
|
|
private var mTapTypeIcon as WatchUi.Bitmap;
|
|
private var mGroupTypeIcon as WatchUi.Bitmap;
|
|
private var mInfoTypeIcon as WatchUi.Bitmap;
|
|
private var mHomeAssistantService as HomeAssistantService;
|
|
|
|
private static var instance;
|
|
|
|
//! Class Constructor
|
|
//
|
|
private function initialize() {
|
|
mMenuItemOptions = {
|
|
:alignment => Settings.getMenuAlignment()
|
|
};
|
|
|
|
mTapTypeIcon = new WatchUi.Bitmap({
|
|
:rezId => $.Rez.Drawables.TapTypeIcon,
|
|
:locX => WatchUi.LAYOUT_HALIGN_CENTER,
|
|
:locY => WatchUi.LAYOUT_VALIGN_CENTER
|
|
});
|
|
|
|
mGroupTypeIcon = new WatchUi.Bitmap({
|
|
:rezId => $.Rez.Drawables.GroupTypeIcon,
|
|
:locX => WatchUi.LAYOUT_HALIGN_CENTER,
|
|
:locY => WatchUi.LAYOUT_VALIGN_CENTER
|
|
});
|
|
|
|
mInfoTypeIcon = new WatchUi.Bitmap({
|
|
:rezId => $.Rez.Drawables.InfoTypeIcon,
|
|
:locX => WatchUi.LAYOUT_HALIGN_CENTER,
|
|
:locY => WatchUi.LAYOUT_VALIGN_CENTER
|
|
});
|
|
|
|
mHomeAssistantService = new HomeAssistantService();
|
|
}
|
|
|
|
//! Create the one and only instance of this class.
|
|
//
|
|
static function create() as HomeAssistantMenuItemFactory {
|
|
if (instance == null) {
|
|
instance = new HomeAssistantMenuItemFactory();
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
//! Toggle menu item.
|
|
//!
|
|
//! @param label Menu item label.
|
|
//! @param entity_id Home Assistant Entity ID (optional)
|
|
//! @param template Template for Home Assistant to render (optional)
|
|
//! @param confirm Should this menu item selection be confirmed?
|
|
//! @param pin Should this menu item selection request the security PIN?
|
|
//
|
|
function toggle(
|
|
label as Lang.String or Lang.Symbol,
|
|
entity_id as Lang.String or Null,
|
|
template as Lang.String or Null,
|
|
confirm as Lang.Boolean,
|
|
pin as Lang.Boolean
|
|
) as WatchUi.MenuItem {
|
|
return new HomeAssistantToggleMenuItem(
|
|
label,
|
|
template,
|
|
confirm,
|
|
pin,
|
|
{ "entity_id" => entity_id },
|
|
mMenuItemOptions
|
|
);
|
|
}
|
|
|
|
//! Tap menu item.
|
|
//!
|
|
//! @param label Menu item label.
|
|
//! @param entity_id Home Assistant Entity ID (optional)
|
|
//! @param template Template for Home Assistant to render (optional)
|
|
//! @param service Template for Home Assistant to render (optional)
|
|
//! @param confirm Should this menu item selection be confirmed?
|
|
//! @param pin Should this menu item selection request the security PIN?
|
|
//! @param data Sourced from the menu JSON, this is the `data` field from the `tap_action` field.
|
|
//
|
|
function tap(
|
|
label as Lang.String or Lang.Symbol,
|
|
entity_id as Lang.String or Null,
|
|
template as Lang.String or Null,
|
|
service as Lang.String or Null,
|
|
confirm as Lang.Boolean,
|
|
pin as Lang.Boolean,
|
|
data as Lang.Dictionary or Null
|
|
) as WatchUi.MenuItem {
|
|
if (entity_id != null) {
|
|
if (data == null) {
|
|
data = { "entity_id" => entity_id };
|
|
} else {
|
|
data.put("entity_id", entity_id);
|
|
}
|
|
}
|
|
if (service != null) {
|
|
return new HomeAssistantTapMenuItem(
|
|
label,
|
|
template,
|
|
service,
|
|
confirm,
|
|
pin,
|
|
data,
|
|
mTapTypeIcon,
|
|
mMenuItemOptions,
|
|
mHomeAssistantService
|
|
);
|
|
} else {
|
|
return new HomeAssistantTapMenuItem(
|
|
label,
|
|
template,
|
|
service,
|
|
confirm,
|
|
pin,
|
|
data,
|
|
mInfoTypeIcon,
|
|
mMenuItemOptions,
|
|
mHomeAssistantService
|
|
);
|
|
}
|
|
}
|
|
|
|
//! Group menu item.
|
|
//!
|
|
//! @param definition Items array from the JSON that defines this sub menu.
|
|
//! @param template Template for Home Assistant to render (optional)
|
|
//
|
|
function group(
|
|
definition as Lang.Dictionary,
|
|
template as Lang.String or Null
|
|
) as WatchUi.MenuItem {
|
|
return new HomeAssistantGroupMenuItem(
|
|
definition,
|
|
template,
|
|
mGroupTypeIcon,
|
|
mMenuItemOptions
|
|
);
|
|
}
|
|
}
|