mirror of
https://github.com/Pax1601/DCSOlympus.git
synced 2025-10-29 16:56:34 +00:00
159 lines
6.7 KiB
TypeScript
159 lines
6.7 KiB
TypeScript
import { LatLng } from "leaflet";
|
|
import { getApp } from "..";
|
|
import { GAME_MASTER, IADSTypes } from "../constants/constants";
|
|
import { CoalitionArea } from "../map/coalitionarea/coalitionarea";
|
|
import { ContextMenu } from "./contextmenu";
|
|
import { Dropdown } from "../controls/dropdown";
|
|
import { Slider } from "../controls/slider";
|
|
import { Switch } from "../controls/switch";
|
|
import { groundUnitDatabase } from "../unit/databases/groundunitdatabase";
|
|
import { createCheckboxOption, getCheckboxOptions } from "../other/utils";
|
|
|
|
/** This context menu allows the user to edit or delete a CoalitionArea. Moreover, it allows the user to create a IADS automatically using the CoalitionArea as bounds. */
|
|
export class CoalitionAreaContextMenu extends ContextMenu {
|
|
#coalitionSwitch: Switch;
|
|
#coalitionArea: CoalitionArea | null = null;
|
|
#iadsDensitySlider: Slider;
|
|
#iadsDistributionSlider: Slider;
|
|
#iadsTypesDropdown: Dropdown;
|
|
#iadsErasDropdown: Dropdown;
|
|
#iadsRangesDropdown: Dropdown;
|
|
|
|
/**
|
|
*
|
|
* @param ID - the ID of the HTML element which will contain the context menu
|
|
*/
|
|
constructor(ID: string){
|
|
super(ID);
|
|
|
|
/* Create the coalition switch */
|
|
this.#coalitionSwitch = new Switch("coalition-area-switch", (value: boolean) => this.#onSwitchClick(value));
|
|
this.#coalitionSwitch.setValue(false);
|
|
|
|
/* Create the controls of the IADS creation submenu */
|
|
this.#iadsTypesDropdown = new Dropdown("iads-units-type-options", () => { });
|
|
this.#iadsErasDropdown = new Dropdown("iads-era-options", () => {});
|
|
this.#iadsRangesDropdown = new Dropdown("iads-range-options", () => {});
|
|
this.#iadsDensitySlider = new Slider("iads-density-slider", 5, 100, "%", (value: number) => { });
|
|
this.#iadsDistributionSlider = new Slider("iads-distribution-slider", 5, 100, "%", (value: number) => { });
|
|
|
|
/* Set the default parameters of the sliders */
|
|
this.#iadsDensitySlider.setIncrement(5);
|
|
this.#iadsDensitySlider.setValue(50);
|
|
this.#iadsDensitySlider.setActive(true);
|
|
this.#iadsDistributionSlider.setIncrement(5);
|
|
this.#iadsDistributionSlider.setValue(50);
|
|
this.#iadsDistributionSlider.setActive(true);
|
|
|
|
document.addEventListener("coalitionAreaContextMenuShow", (e: any) => {
|
|
if (this.getVisibleSubMenu() !== e.detail.type)
|
|
this.#showSubMenu(e.detail.type);
|
|
else
|
|
this.#hideSubMenus();
|
|
});
|
|
|
|
document.addEventListener("coalitionAreaBringToBack", (e: any) => {
|
|
if (this.#coalitionArea)
|
|
getApp().getMap().bringCoalitionAreaToBack(this.#coalitionArea);
|
|
getApp().getMap().hideCoalitionAreaContextMenu();
|
|
});
|
|
|
|
document.addEventListener("coalitionAreaDelete", (e: any) => {
|
|
if (this.#coalitionArea)
|
|
getApp().getMap().deleteCoalitionArea(this.#coalitionArea);
|
|
getApp().getMap().hideCoalitionAreaContextMenu();
|
|
});
|
|
|
|
document.addEventListener("contextMenuCreateIads", (e: any) => {
|
|
const area = this.getCoalitionArea();
|
|
if (area)
|
|
getApp().getUnitsManager().createIADS(area, getCheckboxOptions(this.#iadsTypesDropdown), getCheckboxOptions(this.#iadsErasDropdown), getCheckboxOptions(this.#iadsRangesDropdown), this.#iadsDensitySlider.getValue(), this.#iadsDistributionSlider.getValue());
|
|
})
|
|
this.hide();
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param x X screen coordinate of the top left corner of the context menu
|
|
* @param y Y screen coordinate of the top left corner of the context menu
|
|
* @param latlng Leaflet latlng object of the mouse click
|
|
*/
|
|
show(x: number, y: number, latlng: LatLng) {
|
|
super.show(x, y, latlng);
|
|
|
|
/* Create the checkboxes to select the unit roles */
|
|
this.#iadsTypesDropdown.setOptionsElements(IADSTypes.map((role: string) => {
|
|
return createCheckboxOption(role, `Add ${role}s to the IADS` );
|
|
}));
|
|
|
|
|
|
/* Create the checkboxes to select the unit periods */
|
|
this.#iadsErasDropdown.setOptionsElements(groundUnitDatabase.getEras().map((era: string) => {
|
|
return createCheckboxOption(era, `Add ${era} era units to the IADS`);
|
|
}));
|
|
|
|
/* Create the checkboxes to select the unit ranges */
|
|
this.#iadsRangesDropdown.setOptionsElements(groundUnitDatabase.getRanges().map((range: string) => {
|
|
return createCheckboxOption(range, `Add ${range} units to the IADS`);
|
|
}));
|
|
|
|
if (getApp().getMissionManager().getCommandModeOptions().commandMode !== GAME_MASTER)
|
|
this.#coalitionSwitch.hide()
|
|
}
|
|
|
|
/** Set the CoalitionArea object the user will be able to edit using this menu
|
|
*
|
|
* @param coalitionArea The CoalitionArea object to edit
|
|
*/
|
|
setCoalitionArea(coalitionArea: CoalitionArea) {
|
|
this.#coalitionArea = coalitionArea;
|
|
this.getContainer()?.querySelectorAll('[data-coalition]').forEach((element: any) => {
|
|
element.setAttribute("data-coalition", this.getCoalitionArea()?.getCoalition())
|
|
});
|
|
this.#coalitionSwitch.setValue(this.getCoalitionArea()?.getCoalition() === "red");
|
|
}
|
|
|
|
/** Get the CoalitionArea object the contextmenu is editing
|
|
*
|
|
* @returns The CoalitionArea the contextmenu is editing
|
|
*/
|
|
getCoalitionArea() {
|
|
return this.#coalitionArea;
|
|
}
|
|
|
|
/** Show a submenu of the contextmenu
|
|
*
|
|
* @param type The submenu type, currently only "iads"
|
|
*/
|
|
#showSubMenu(type: string) {
|
|
this.getContainer()?.querySelector("#iads-menu")?.classList.toggle("hide", type !== "iads");
|
|
this.getContainer()?.querySelector("#iads-button")?.classList.toggle("is-open", type === "iads");
|
|
this.clip();
|
|
|
|
this.setVisibleSubMenu(type);
|
|
}
|
|
|
|
/** Hide all submenus
|
|
*
|
|
*/
|
|
#hideSubMenus() {
|
|
this.getContainer()?.querySelector("#iads-menu")?.classList.toggle("hide", true);
|
|
this.getContainer()?.querySelector("#iads-button")?.classList.toggle("is-open", false);
|
|
this.clip();
|
|
|
|
this.setVisibleSubMenu(null);
|
|
}
|
|
|
|
/** Callback event called when the coalition switch is clicked to change the coalition of the CoalitionArea
|
|
*
|
|
* @param value Switch position (false: blue, true: red)
|
|
*/
|
|
#onSwitchClick(value: boolean) {
|
|
if (getApp().getMissionManager().getCommandModeOptions().commandMode == GAME_MASTER) {
|
|
this.getCoalitionArea()?.setCoalition(value ? "red" : "blue");
|
|
this.getContainer()?.querySelectorAll('[data-coalition]').forEach((element: any) => {
|
|
element.setAttribute("data-coalition", this.getCoalitionArea()?.getCoalition())
|
|
});
|
|
}
|
|
}
|
|
} |