KerbalCalculations/src/gui/manoeuvres.ts
2026-03-30 11:42:09 +02:00

117 lines
5.6 KiB
TypeScript

import { createDisabledInput, createLabel } from "./common";
import type { ProgressMessage } from "./worker";
export class ManoeuvresGui {
parentDiv: HTMLElement;
displayProgress: (progressMessage: ProgressMessage) => void;
constructor(displayProgress?: boolean) {
if (displayProgress === undefined) {
displayProgress = true;
}
this.parentDiv = document.createElement("div");
let explanationParagraph = document.createElement("p");
this.parentDiv.appendChild(explanationParagraph);
let manoeuvresContainer = document.createElement("div");
manoeuvresContainer.classList.add("flexContainer");
this.parentDiv.appendChild(manoeuvresContainer);
let manoeuvreOneContainer = document.createElement("div");
let manoeuvreTwoContainer = document.createElement("div");
manoeuvreOneContainer.classList.add("orbitalParameter");
manoeuvreTwoContainer.classList.add("orbitalParameter");
manoeuvresContainer.appendChild(manoeuvreOneContainer);
manoeuvresContainer.appendChild(manoeuvreTwoContainer);
let manoeuvreOneHeader = document.createElement("h4");
manoeuvreOneHeader.appendChild(document.createTextNode("First manoeuvre:"));
manoeuvreOneContainer.appendChild(manoeuvreOneHeader);
const addTo = (container: HTMLElement, children: HTMLElement[]) => {
children.forEach(child => {
container.appendChild(child);
})
container.appendChild(document.createElement("br"));
};
let firstTimeId = crypto.randomUUID();
let firstTimeLabel = createLabel(firstTimeId, "Time:");
let firstManoeuvreTime = createDisabledInput(firstTimeId);
addTo(manoeuvreOneContainer, [firstTimeLabel, firstManoeuvreTime]);
let firstProgradeId = crypto.randomUUID();
let firstProgradeLabel = createLabel(firstProgradeId, "Prograde delta-v:");
let firstManoeuvrePrograde = createDisabledInput(firstProgradeId);
addTo(manoeuvreOneContainer, [firstProgradeLabel, firstManoeuvrePrograde]);
let firstNormalId = crypto.randomUUID();
let firstNormalLabel = createLabel(firstNormalId, "Normal delta-v:");
let firstManoeuvreNormal = createDisabledInput(firstNormalId);
addTo(manoeuvreOneContainer, [firstNormalLabel, firstManoeuvreNormal]);
let firstRadialId = crypto.randomUUID();
let firstRadialLabel = createLabel(firstRadialId, "Radial delta-v:");
let firstManoeuvreRadial = createDisabledInput(firstRadialId);
addTo(manoeuvreOneContainer, [firstRadialLabel, firstManoeuvreRadial]);
let firstTotalId = crypto.randomUUID();
let firstTotalLabel = createLabel(firstTotalId, "Total delta-v:");
let firstManoeuvreTotal = createDisabledInput(firstTotalId);
addTo(manoeuvreOneContainer, [firstTotalLabel, firstManoeuvreTotal]);
let manoeuvreTwoHeader = document.createElement("h4");
manoeuvreTwoHeader.appendChild(document.createTextNode("Second manoeuvre"));
manoeuvreTwoContainer.appendChild(manoeuvreTwoHeader);
let secondTimeId = crypto.randomUUID();
let secondTimeLabel = createLabel(secondTimeId, "Time:");
let secondManoeuvreTime = createDisabledInput(secondTimeId);
addTo(manoeuvreTwoContainer, [secondTimeLabel, secondManoeuvreTime]);
let secondProgradeId = crypto.randomUUID();
let secondProgradeLabel = createLabel(secondProgradeId, "Prograde delta-v:");
let secondManoeuvrePrograde = createDisabledInput(secondProgradeId);
addTo(manoeuvreTwoContainer, [secondProgradeLabel, secondManoeuvrePrograde]);
let secondNormalId = crypto.randomUUID();
let secondNormalLabel = createLabel(secondNormalId, "Normal delta-v:");
let secondManoeuvreNormal = createDisabledInput(secondNormalId);
addTo(manoeuvreTwoContainer, [secondNormalLabel, secondManoeuvreNormal]);
let secondRadialId = crypto.randomUUID();
let secondRadialLabel = createLabel(secondRadialId, "Radial delta-v:");
let secondManoeuvreRadial = createDisabledInput(secondRadialId);
addTo(manoeuvreTwoContainer, [secondRadialLabel, secondManoeuvreRadial]);
let secondTotalId = crypto.randomUUID();
let secondTotalLabel = createLabel(secondTotalId, "Total delta-v:");
let secondManoeuvreTotal = createDisabledInput(secondTotalId);
addTo(manoeuvreTwoContainer, [secondTotalLabel, secondManoeuvreTotal]);
this.displayProgress = (progressMessage) => {
explanationParagraph.innerHTML = "";
if (displayProgress) {
explanationParagraph.appendChild(document.createTextNode(`The search is ${progressMessage.percentDone.toFixed(2)}% complete.`));
if (progressMessage.bestDeltaV) {
explanationParagraph.appendChild(document.createElement("br"));
explanationParagraph.appendChild(document.createTextNode(`The best transfer costs ${progressMessage.bestDeltaV.toFixed(3)} m/s`));
}
}
firstManoeuvreTime.value = progressMessage.bestTransfer?.firstManoeuvre.time.toFixed(0) ?? "";
firstManoeuvrePrograde.value = progressMessage.bestTransfer?.firstManoeuvre.progradeDeltaV.toFixed(3) ?? "";
firstManoeuvreNormal.value = progressMessage.bestTransfer?.firstManoeuvre.normalDeltaV.toFixed(3) ?? "";
firstManoeuvreRadial.value = progressMessage.bestTransfer?.firstManoeuvre.radialDeltaV.toFixed(3) ?? "";
firstManoeuvreTotal.value = progressMessage.bestTransfer?.firstManoeuvre.totalDeltaV.toFixed(3) ?? "";
secondManoeuvreTime.value = progressMessage.bestTransfer?.secondManoeuvre.time.toFixed(0) ?? "";
secondManoeuvrePrograde.value = progressMessage.bestTransfer?.secondManoeuvre.progradeDeltaV.toFixed(3) ?? "";
secondManoeuvreNormal.value = progressMessage.bestTransfer?.secondManoeuvre.normalDeltaV.toFixed(3) ?? "";
secondManoeuvreRadial.value = progressMessage.bestTransfer?.secondManoeuvre.radialDeltaV.toFixed(3) ?? "";
secondManoeuvreTotal.value = progressMessage.bestTransfer?.secondManoeuvre.totalDeltaV.toFixed(3) ?? "";
};
}
}