mirror of
https://github.com/CharaChorder/DeviceManager.git
synced 2026-01-17 07:22:50 +00:00
63 lines
1.6 KiB
TypeScript
63 lines
1.6 KiB
TypeScript
import type {Action} from "svelte/action"
|
|
import {changes, ChangeType, settings} from "$lib/undo-redo"
|
|
|
|
export const setting: Action<HTMLInputElement, {id: number; inverse?: number; scale?: number}> = function (
|
|
node: HTMLInputElement,
|
|
{id, inverse, scale},
|
|
) {
|
|
node.setAttribute("disabled", "")
|
|
const type = node.getAttribute("type") as "number" | "checkbox"
|
|
|
|
const unsubscribe = settings.subscribe(async settings => {
|
|
if (id in settings) {
|
|
const {value, isApplied} = settings[id]
|
|
if (type === "number") {
|
|
node.value = (
|
|
inverse !== undefined ? inverse / value : scale !== undefined ? scale * value : value
|
|
).toString()
|
|
} else {
|
|
node.checked = value !== 0
|
|
}
|
|
if (isApplied) {
|
|
node.classList.remove("pending-changes")
|
|
} else {
|
|
node.classList.add("pending-changes")
|
|
}
|
|
node.removeAttribute("disabled")
|
|
} else {
|
|
node.setAttribute("disabled", "")
|
|
}
|
|
})
|
|
|
|
async function listener() {
|
|
let value: number
|
|
if (type === "number") {
|
|
value = Number.parseInt(node.value)
|
|
if (Number.isNaN(value)) return
|
|
value = Math.floor(
|
|
inverse !== undefined ? inverse / value : scale !== undefined ? value / scale : value,
|
|
)
|
|
} else {
|
|
value = node.checked ? 1 : 0
|
|
}
|
|
|
|
changes.update(changes => {
|
|
changes.push({
|
|
type: ChangeType.Setting,
|
|
id: id,
|
|
setting: value,
|
|
})
|
|
return changes
|
|
})
|
|
}
|
|
|
|
node.addEventListener("change", listener)
|
|
|
|
return {
|
|
destroy() {
|
|
node.removeEventListener("change", listener)
|
|
unsubscribe()
|
|
},
|
|
}
|
|
}
|