xref: /aosp_15_r20/tools/netsim/ui/ts/device-dragzone.ts (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1*cf78ab8cSAndroid Build Coastguard Workerimport {html, LitElement} from 'lit';
2*cf78ab8cSAndroid Build Coastguard Workerimport {customElement, property} from 'lit/decorators.js';
3*cf78ab8cSAndroid Build Coastguard Worker
4*cf78ab8cSAndroid Build Coastguard Workerimport {simulationState} from './device-observer.js';
5*cf78ab8cSAndroid Build Coastguard Worker
6*cf78ab8cSAndroid Build Coastguard Worker@customElement('ns-device-dragzone')
7*cf78ab8cSAndroid Build Coastguard Workerexport class DeviceDragZone extends LitElement {
8*cf78ab8cSAndroid Build Coastguard Worker  static dragged: EventTarget|null;
9*cf78ab8cSAndroid Build Coastguard Worker
10*cf78ab8cSAndroid Build Coastguard Worker  @property({type: String, attribute: 'action'}) action = 'move';
11*cf78ab8cSAndroid Build Coastguard Worker
12*cf78ab8cSAndroid Build Coastguard Worker  constructor() {
13*cf78ab8cSAndroid Build Coastguard Worker    super();
14*cf78ab8cSAndroid Build Coastguard Worker    this.addEventListener('dragstart', this.handleDragStart);
15*cf78ab8cSAndroid Build Coastguard Worker    this.addEventListener('dragend', this.handleDragEnd);
16*cf78ab8cSAndroid Build Coastguard Worker    this.addEventListener('click', this.handleSelect);
17*cf78ab8cSAndroid Build Coastguard Worker  }
18*cf78ab8cSAndroid Build Coastguard Worker
19*cf78ab8cSAndroid Build Coastguard Worker  connectedCallback() {
20*cf78ab8cSAndroid Build Coastguard Worker    this.draggable = true;
21*cf78ab8cSAndroid Build Coastguard Worker  }
22*cf78ab8cSAndroid Build Coastguard Worker
23*cf78ab8cSAndroid Build Coastguard Worker  handleDragStart(ev: DragEvent) {
24*cf78ab8cSAndroid Build Coastguard Worker    this.style.opacity = '0.4';
25*cf78ab8cSAndroid Build Coastguard Worker    if (ev.dataTransfer && ev.target) {
26*cf78ab8cSAndroid Build Coastguard Worker      simulationState.patchSelected((ev.target as Element).id);
27*cf78ab8cSAndroid Build Coastguard Worker      DeviceDragZone.dragged = ev.target;
28*cf78ab8cSAndroid Build Coastguard Worker      // eslint-disable-next-line no-param-reassign
29*cf78ab8cSAndroid Build Coastguard Worker      ev.dataTransfer.effectAllowed = this.action === 'move' ? 'move' : 'copy';
30*cf78ab8cSAndroid Build Coastguard Worker    }
31*cf78ab8cSAndroid Build Coastguard Worker  }
32*cf78ab8cSAndroid Build Coastguard Worker
33*cf78ab8cSAndroid Build Coastguard Worker  handleDragEnd() {
34*cf78ab8cSAndroid Build Coastguard Worker    this.style.opacity = '1';
35*cf78ab8cSAndroid Build Coastguard Worker    DeviceDragZone.dragged = null;
36*cf78ab8cSAndroid Build Coastguard Worker  }
37*cf78ab8cSAndroid Build Coastguard Worker
38*cf78ab8cSAndroid Build Coastguard Worker  // Allow the information panel to figure what has been selected.
39*cf78ab8cSAndroid Build Coastguard Worker  handleSelect(ev: Event) {
40*cf78ab8cSAndroid Build Coastguard Worker    this.style.opacity = '1';
41*cf78ab8cSAndroid Build Coastguard Worker    if (ev.target) {
42*cf78ab8cSAndroid Build Coastguard Worker      simulationState.patchSelected((ev.target as Element).id);
43*cf78ab8cSAndroid Build Coastguard Worker      // We can add a feature for visually showing a selected object (i.e.
44*cf78ab8cSAndroid Build Coastguard Worker      // bolded borders)
45*cf78ab8cSAndroid Build Coastguard Worker    }
46*cf78ab8cSAndroid Build Coastguard Worker  }
47*cf78ab8cSAndroid Build Coastguard Worker
48*cf78ab8cSAndroid Build Coastguard Worker  render() {
49*cf78ab8cSAndroid Build Coastguard Worker    return html` <slot></slot> `;
50*cf78ab8cSAndroid Build Coastguard Worker  }
51*cf78ab8cSAndroid Build Coastguard Worker}
52