annotate web/fade/Light9Fader.ts @ 2417:ae4b90efb55a

start calibration tool
author drewp@bigasterisk.com
date Mon, 20 May 2024 01:28:12 -0700
parents 9a4bc2ea264e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
1 import debug from "debug";
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
2 import { css, html, LitElement, PropertyValueMap } from "lit";
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
3 import { customElement, property, query } from "lit/decorators.js";
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
4
2372
06bf6dae8e64 reorg tools into light9/web/ and a single vite instance
drewp@bigasterisk.com
parents: 2355
diff changeset
5 import { clamp } from "../floating_color_picker";
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
6 const log = debug("fade");
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
7
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
8 class Drag {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
9 constructor(public startDragPxY: number, public startDragValue: number) {}
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
10 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
11
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
12 @customElement("light9-fader")
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
13 export class Light9Fader extends LitElement {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
14 static styles = [
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
15 css`
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
16 :host {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
17 display: inline-block;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
18 border: 2px gray inset;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
19 background: #000;
2355
078e6e7ec206 shorter sliders send fewer events
drewp@bigasterisk.com
parents: 2339
diff changeset
20 height: 80px;
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
21 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
22 #handle {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
23 background: gray;
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
24 border: 3px outset #838499;
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
25 position: relative;
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
26 left: 0px;
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
27 right: -25px;
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
28 border-radius: 4px;
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
29 margin: 0 1px;
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
30 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
31 `,
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
32 ];
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
33
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
34 @property() value: number = 0;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
35
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
36 @query("#handle") handleEl!: HTMLElement;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
37
2355
078e6e7ec206 shorter sliders send fewer events
drewp@bigasterisk.com
parents: 2339
diff changeset
38 troughHeight = 80 - 2 - 2 - 5 - 5;
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
39 handleHeight = 16;
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
40
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
41 drag?: Drag;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
42 unmutedValue: number = 1;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
43
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
44 render() {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
45 return html` <div id="handle"><hr /></div> `;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
46 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
47
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
48 protected update(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
49 super.update(changedProperties);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
50 if (changedProperties.has("value")) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
51 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
52 }
2339
2210d934d62d fader was echoing external edits as patches back into the graph. This fixes that the wrong way, circumventing lit
drewp@bigasterisk.com
parents: 2331
diff changeset
53 valueChangedFromUi() {
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
54 this.value = clamp(this.value, 0, 1);
2339
2210d934d62d fader was echoing external edits as patches back into the graph. This fixes that the wrong way, circumventing lit
drewp@bigasterisk.com
parents: 2331
diff changeset
55 this.dispatchEvent(new CustomEvent("change", { detail: { value: this.value } }));
2210d934d62d fader was echoing external edits as patches back into the graph. This fixes that the wrong way, circumventing lit
drewp@bigasterisk.com
parents: 2331
diff changeset
56 }
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
57
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
58 protected updated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
59 super.updated(_changedProperties);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
60 const y = this.sliderTopY(this.value);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
61 this.handleEl.style.top = y + "px";
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
62 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
63
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
64 protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
65 super.firstUpdated(_changedProperties);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
66 this.handleEl.style.height = this.handleHeight + "px";
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
67 this.events();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
68 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
69
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
70 events() {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
71 const hand = this.handleEl;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
72 hand.addEventListener("mousedown", (ev: MouseEvent) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
73 ev.stopPropagation();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
74 if (ev.buttons == 1) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
75 this.drag = new Drag(ev.clientY, this.value);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
76 } else if (ev.buttons == 2) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
77 this.onRmb();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
78 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
79 });
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
80 this.addEventListener("mousedown", (ev: MouseEvent) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
81 ev.stopPropagation();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
82 if (ev.buttons == 1) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
83 this.value = this.sliderValue(ev.offsetY);
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
84 this.valueChangedFromUi();
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
85 this.drag = new Drag(ev.clientY, this.value);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
86 } else if (ev.buttons == 2) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
87 // RMB in trough
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
88 this.onRmb();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
89 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
90 });
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
91
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
92 this.addEventListener("contextmenu", (event) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
93 event.preventDefault();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
94 });
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
95
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
96 this.addEventListener("wheel", (ev: WheelEvent) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
97 ev.preventDefault();
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
98 this.value += (ev.deltaY / this.troughHeight) * -0.03;
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
99 this.valueChangedFromUi();
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
100 });
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
101
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
102 const maybeDrag = (ev: MouseEvent) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
103 if (ev.buttons != 1) return;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
104 if (this.drag === undefined) return;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
105 ev.stopPropagation();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
106 this.onMouseDrag(ev.clientY - this.drag.startDragPxY!);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
107 };
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
108 hand.addEventListener("mousemove", maybeDrag);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
109 this.addEventListener("mousemove", maybeDrag);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
110 window.addEventListener("mousemove", maybeDrag);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
111
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
112 hand.addEventListener("mouseup", this.onMouseUpAnywhere.bind(this));
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
113 this.addEventListener("mouseup", this.onMouseUpAnywhere.bind(this));
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
114 window.addEventListener("mouseup", this.onMouseUpAnywhere.bind(this));
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
115 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
116 onRmb() {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
117 if (this.value > 0.1) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
118 // mute
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
119 this.unmutedValue = this.value;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
120 this.value = 0;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
121 } else {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
122 // unmute
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
123 this.value = this.unmutedValue;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
124 }
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
125 this.valueChangedFromUi();
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
126 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
127 onMouseDrag(dy: number) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
128 if (this.drag === undefined) throw "unexpected";
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
129 this.value = this.drag.startDragValue - dy / this.troughHeight;
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
130 this.valueChangedFromUi();
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
131 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
132
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
133 onMouseUpAnywhere() {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
134 this.drag = undefined;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
135 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
136
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
137 sliderTopY(value: number): number {
2400
9a4bc2ea264e ui tweaks and link fix
drewp@bigasterisk.com
parents: 2376
diff changeset
138 const usableY = this.troughHeight - this.handleHeight / 2 - 1;
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
139 const yAdj = this.handleHeight / 2 - 5 - 2;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
140 return (1 - value) * usableY + yAdj;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
141 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
142 sliderValue(offsetY: number): number {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
143 const usableY = this.troughHeight - this.handleHeight;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
144 const yAdj = this.handleHeight / 2 - 5 - 2;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
145 return clamp(1 - (offsetY - yAdj) / usableY, 0, 1);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
146 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
147 }