# HG changeset patch
# User drewp@bigasterisk.com
# Date 2022-05-29 08:43:11
# Node ID fe807af851c837ca507d4aff0577de6aa705cd94
# Parent 0a4ae00833827988eb7348c7fbebf8c3860e3799
partial port of editchoice
diff --git a/light9/web/edit-choice.html b/light9/web/EditChoice.ts
rename from light9/web/edit-choice.html
rename to light9/web/EditChoice.ts
--- a/light9/web/edit-choice.html
+++ b/light9/web/EditChoice.ts
@@ -1,33 +1,112 @@
-
-
+// see light9/editchoice.py for gtk version
+import debug from "debug";
+import { css, html, LitElement } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { NamedNode } from "n3";
+
+const log = debug("editchoice");
+const RDFS = "http://www.w3.org/2000/01/rdf-schema#";
+
+function setupDrop(
+ senseElem: HTMLElement,
+ highlightElem: HTMLElement,
+ coordinateOriginElem: HTMLElement | null,
+ onDrop: (uri: NamedNode, pos: Vector | null) => void
+) {
+ const highlight = () => highlightElem.classList.add("dragging");
+ const unhighlight = () => highlightElem.classList.remove("dragging");
+
+ senseElem.addEventListener("drag", (event: DragEvent) => {});
+
+ senseElem.addEventListener("dragstart", (event: DragEvent) => {});
+
+ senseElem.addEventListener("dragend", (event: DragEvent) => {});
+
+ senseElem.addEventListener("dragover", (event: DragEvent) => {
+ event.preventDefault();
+ event.dataTransfer!.dropEffect = "copy";
+ highlight();
+ });
+
+ senseElem.addEventListener("dragenter", (event: DragEvent) => {
+ highlight();
+ });
+
+ senseElem.addEventListener("dragleave", (event: DragEvent) => {
+ unhighlight();
+ });
+
+ senseElem.addEventListener("drop", (event: DragEvent) => {
+ event.preventDefault();
+ const uri = new NamedNode(event.dataTransfer!.getData("text/uri-list"));
+
+ let pos: Vector | null = null;
+ if (coordinateOriginElem != null) {
+ const root = coordinateOriginElem.getBoundingClientRect();
+ pos = $V([event.pageX - root.left, event.pageY - root.top]);
+ }
-
-
-
-
-
-
-
-
-
-
-
-
+ try {
+ onDrop(uri, pos);
+ } catch (e) {
+ log(e);
+ }
+ unhighlight();
+ });
+}
+
+// Picks a URI based on the caller setting the property OR
+// the user drag-and-dropping a text/uri-list resource (probably
+// an or tag)
+@customElement("edit-choice")
+export class EditChoice extends LitElement {
+ @property() uri: NamedNode | null = null;
+ static styles = [
+ css`
+ :host {
+ display: inline-block;
+ background: #141448;
+ min-width: 10em;
+ padding: 3px 8px;
+ }
+ .dragging {
+ background: rgba(126, 52, 245, 0.0784313725490196);
+ box-shadow: 0 0 20px #ffff00;
+ }
+ a {
+ color: #8e8eff;
+ padding: 3px;
+ display: inline-block;
+ font-size: 145%;
+ }
+ `,
+ ];
+ render() {
+ return html`
+
+
+ `;
+ }
+
+ constructor() {
+ super();
+ setupDrop(this, this, null, this._setUri.bind(this));
+ }
+
+ // updated(changedProperties: PropertyValues) {
+ // log('cp' ,changedProperties)
+ // if (changedProperties.has("box")) {
+ // log('setupdrop', this.box)
+ // setupDrop(this.box, this.box, null, this._setUri.bind(this));
+ // }
+ // }
+
+ _setUri(u: any) {
+ this.uri = u;
+ this.dispatchEvent(new CustomEvent("edited"));
+ }
+
+ unlink() {
+ return this._setUri(null);
+ }
+}