GarminHomeAssistant/source/HomeAssistantMenuItemFactory.mc

139 lines
4.1 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
//
//
// Description:
//
// MenuItems Factory.
//
//-----------------------------------------------------------------------------------
using Toybox.Application;
using Toybox.Lang;
using Toybox.WatchUi;
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;
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();
}
static function create() as HomeAssistantMenuItemFactory {
if (instance == null) {
instance = new HomeAssistantMenuItemFactory();
}
return instance;
}
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
);
}
function tap(
label as Lang.String or Lang.Symbol,
entity 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 != null) {
if (data == null) {
data = { "entity_id" => entity };
} else {
data.put("entity_id", entity);
}
}
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
);
}
}
function group(
definition as Lang.Dictionary,
template as Lang.String or Null
) as WatchUi.MenuItem {
return new HomeAssistantGroupMenuItem(
definition,
template,
mGroupTypeIcon,
mMenuItemOptions
);
}
}