mapcomplete/UI/Input/Toggle.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

53 lines
1.6 KiB
TypeScript
Raw Normal View History

import { Store, UIEventSource } from "../../Logic/UIEventSource"
2021-06-10 01:36:20 +02:00
import BaseUIElement from "../BaseUIElement"
import { VariableUiElement } from "../Base/VariableUIElement"
import Lazy from "../Base/Lazy"
2021-06-10 01:36:20 +02:00
/**
* The 'Toggle' is a UIElement showing either one of two elements, depending on the state.
* It can be used to implement e.g. checkboxes or collapsible elements
*/
export default class Toggle extends VariableUiElement {
public readonly isEnabled: Store<boolean>
2022-09-08 21:40:48 +02:00
2022-06-06 19:37:22 +02:00
constructor(
showEnabled: string | BaseUIElement,
showDisabled: string | BaseUIElement,
isEnabled: Store<boolean>
) {
super(isEnabled?.map((isEnabled) => (isEnabled ? showEnabled : showDisabled)))
2021-06-12 02:58:32 +02:00
this.isEnabled = isEnabled
2021-06-14 02:39:23 +02:00
}
public static If(condition: Store<boolean>, constructor: () => BaseUIElement): BaseUIElement {
2021-11-07 16:34:51 +01:00
if (constructor === undefined) {
return undefined
}
return new Toggle(new Lazy(constructor), undefined, condition)
2021-11-07 16:34:51 +01:00
}
}
/**
* Same as `Toggle`, but will swap on click
*/
export class ClickableToggle extends Toggle {
public declare readonly isEnabled: UIEventSource<boolean>
2022-09-08 21:40:48 +02:00
constructor(
showEnabled: string | BaseUIElement,
showDisabled: string | BaseUIElement,
isEnabled: UIEventSource<boolean> = new UIEventSource<boolean>(false)
) {
super(showEnabled, showDisabled, isEnabled)
this.isEnabled = isEnabled
}
2022-09-08 21:40:48 +02:00
public ToggleOnClick(): ClickableToggle {
2021-11-07 16:34:51 +01:00
const self = this
this.onClick(() => {
self.isEnabled.setData(!self.isEnabled.data)
})
return this
}
2021-06-10 01:36:20 +02:00
}