annotate web/fade/Light9Fader.ts @ 2385:39110a37e5ac

revive midiFade
author drewp@bigasterisk.com
date Mon, 13 May 2024 18:08:34 -0700
parents 4556eebe5d73
children 9a4bc2ea264e
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;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
24 border: 5px gray outset;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
25 position: relative;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
26 left: 0;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
27 right: -25px;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
28 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
29 `,
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 @property() value: number = 0;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
33
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
34 @query("#handle") handleEl!: HTMLElement;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
35
2355
078e6e7ec206 shorter sliders send fewer events
drewp@bigasterisk.com
parents: 2339
diff changeset
36 troughHeight = 80 - 2 - 2 - 5 - 5;
078e6e7ec206 shorter sliders send fewer events
drewp@bigasterisk.com
parents: 2339
diff changeset
37 handleHeight = 10;
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
38
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
39 drag?: Drag;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
40 unmutedValue: number = 1;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
41
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
42 render() {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
43 return html` <div id="handle"><hr /></div> `;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
44 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
45
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
46 protected update(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
47 super.update(changedProperties);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
48 if (changedProperties.has("value")) {
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
49
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
50 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
51 }
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
52 valueChangedFromUi() {
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 this.value= clamp(this.value, 0, 1)
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
54 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
55 }
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
56
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
57 protected updated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
58 super.updated(_changedProperties);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
59 const y = this.sliderTopY(this.value);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
60 this.handleEl.style.top = y + "px";
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
61 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
62
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
63 protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
64 super.firstUpdated(_changedProperties);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
65 this.handleEl.style.height = this.handleHeight + "px";
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
66 this.events();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
67 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
68
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
69 events() {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
70 const hand = this.handleEl;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
71 hand.addEventListener("mousedown", (ev: MouseEvent) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
72 ev.stopPropagation();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
73 if (ev.buttons == 1) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
74 this.drag = new Drag(ev.clientY, this.value);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
75 } else if (ev.buttons == 2) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
76 this.onRmb();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
77 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
78 });
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
79 this.addEventListener("mousedown", (ev: MouseEvent) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
80 ev.stopPropagation();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
81 if (ev.buttons == 1) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
82 this.value = this.sliderValue(ev.offsetY);
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
83 this.valueChangedFromUi()
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
84 this.drag = new Drag(ev.clientY, this.value);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
85 } else if (ev.buttons == 2) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
86 // RMB in trough
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
87 this.onRmb();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
88 }
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 this.addEventListener("contextmenu", (event) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
92 event.preventDefault();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
93 });
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
94
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
95 this.addEventListener("wheel", (ev: WheelEvent) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
96 ev.preventDefault();
2355
078e6e7ec206 shorter sliders send fewer events
drewp@bigasterisk.com
parents: 2339
diff changeset
97 this.value += ev.deltaY / this.troughHeight * -.05;
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
98 this.valueChangedFromUi()
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
99 });
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
100
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
101 const maybeDrag = (ev: MouseEvent) => {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
102 if (ev.buttons != 1) return;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
103 if (this.drag === undefined) return;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
104 ev.stopPropagation();
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
105 this.onMouseDrag(ev.clientY - this.drag.startDragPxY!);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
106 };
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
107 hand.addEventListener("mousemove", maybeDrag);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
108 this.addEventListener("mousemove", maybeDrag);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
109 window.addEventListener("mousemove", maybeDrag);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
110
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
111 hand.addEventListener("mouseup", this.onMouseUpAnywhere.bind(this));
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
112 this.addEventListener("mouseup", this.onMouseUpAnywhere.bind(this));
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
113 window.addEventListener("mouseup", this.onMouseUpAnywhere.bind(this));
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
114 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
115 onRmb() {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
116 if (this.value > 0.1) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
117 // mute
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
118 this.unmutedValue = this.value;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
119 this.value = 0;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
120 } else {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
121 // unmute
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
122 this.value = this.unmutedValue;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
123 }
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
124 this.valueChangedFromUi()
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
125 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
126 onMouseDrag(dy: number) {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
127 if (this.drag === undefined) throw "unexpected";
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
128 this.value = this.drag.startDragValue - dy / this.troughHeight;
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
129 this.valueChangedFromUi()
2320
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
130 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
131
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
132 onMouseUpAnywhere() {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
133 this.drag = undefined;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
134 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
135
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
136 sliderTopY(value: number): number {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
137 const usableY = this.troughHeight - this.handleHeight;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
138 const yAdj = this.handleHeight / 2 - 5 - 2;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
139 return (1 - value) * usableY + yAdj;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
140 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
141 sliderValue(offsetY: number): number {
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
142 const usableY = this.troughHeight - this.handleHeight;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
143 const yAdj = this.handleHeight / 2 - 5 - 2;
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
144 return clamp(1 - (offsetY - yAdj) / usableY, 0, 1);
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
145 }
280be980aaa0 new fader widget
drewp@bigasterisk.com
parents:
diff changeset
146 }