annotate web/fade/Light9Fader.ts @ 2405:69ca2b2fc133

overcomplicated attempt at persisting the pane layout in the rdf graph this was hard because we have to somehow wait for the graph to load before config'ing the panes
author drewp@bigasterisk.com
date Fri, 17 May 2024 16:58:26 -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 }