Hovering in the unification area

fixes #25
This commit is contained in:
Arne Keller 2021-08-29 08:32:15 +02:00
parent 26c97d937e
commit 8b1371ce08
4 changed files with 40 additions and 18 deletions

View File

@ -1,4 +1,5 @@
import {MathjaxAdapter} from "./mathjax-adapter"; import {MathjaxAdapter} from "./mathjax-adapter";
import {hoverAreaAroundElements} from "./mathjax-style-hacks";
declare let window: { declare let window: {
svgPanZoomFun: (svg: SVGElement, options: { svgPanZoomFun: (svg: SVGElement, options: {
@ -51,7 +52,6 @@ class MathjaxProofTree extends MathjaxAdapter {
} }
protected calculateSteps(extraData: any): void { protected calculateSteps(extraData: any): void {
console.log(extraData);
const data = typeof extraData === "string" ? JSON.parse(extraData) : []; const data = typeof extraData === "string" ? JSON.parse(extraData) : [];
const root = this.shadowRoot!; const root = this.shadowRoot!;
// setup style container for styles applied on hover // setup style container for styles applied on hover
@ -69,8 +69,6 @@ class MathjaxProofTree extends MathjaxAdapter {
unificationEl.shadowRoot!.querySelector("mjx-head")!.appendChild(hoverStylesUnification); unificationEl.shadowRoot!.querySelector("mjx-head")!.appendChild(hoverStylesUnification);
} }
// set the size of the rendered SVG to the size of the container element // set the size of the rendered SVG to the size of the container element
// enlarge hover area of certain elements
//console.log(unificationEl);
if (!root.querySelector("#style-fixes")) { if (!root.querySelector("#style-fixes")) {
const style = document.createElement('style'); const style = document.createElement('style');
style.innerHTML = "\ style.innerHTML = "\
@ -80,15 +78,11 @@ class MathjaxProofTree extends MathjaxAdapter {
mjx-container {\ mjx-container {\
margin: 0 !important;\ margin: 0 !important;\
}\ }\
.typicalc-type, g[semantics='bspr_prooflabel:left'] {\
/* cross-browser-compatibility: Chrome does not support the stroke trick, but instead bounding-box (which is not supported by Firefox..) */\
stroke: transparent; stroke-width: 600px; pointer-events: all; pointer-events: bounding-box;\
}\
#typicalc-definition-abs, #typicalc-definition-abs-let, #typicalc-definition-app,\ #typicalc-definition-abs, #typicalc-definition-abs-let, #typicalc-definition-app,\
#typicalc-definition-const, #typicalc-definition-var, #typicalc-definition-var-let, #typicalc-definition-let {\ #typicalc-definition-const, #typicalc-definition-var, #typicalc-definition-var-let, #typicalc-definition-let {\
display: none;\ display: none;\
border: 2px solid red;\ border: 2px solid red;\
}"; }" + hoverAreaAroundElements;
style.innerHTML += "svg { width: 100%; }"; style.innerHTML += "svg { width: 100%; }";
style.id = "style-fixes"; style.id = "style-fixes";
root.querySelector("mjx-head")!.appendChild(style); root.querySelector("mjx-head")!.appendChild(style);
@ -270,7 +264,6 @@ class MathjaxProofTree extends MathjaxAdapter {
} }
} }
const conclusion0 = root.querySelector<SVGElement>(inferenceRuleSelector)!.children[1].children[0].children[0].children[1] as SVGGraphicsElement; const conclusion0 = root.querySelector<SVGElement>(inferenceRuleSelector)!.children[1].children[0].children[0].children[1] as SVGGraphicsElement;
console.log(conclusion0);
const conclusionWidth = conclusion0.getBBox().width; const conclusionWidth = conclusion0.getBBox().width;
const svgWidth = svg.viewBox.baseVal.width; const svgWidth = svg.viewBox.baseVal.width;
const offset = (svg.children[1] as SVGGraphicsElement).getTransformToElement(conclusion0); const offset = (svg.children[1] as SVGGraphicsElement).getTransformToElement(conclusion0);
@ -389,12 +382,6 @@ class MathjaxProofTree extends MathjaxAdapter {
return; return;
} }
} }
let stepTarget = typeTarget;
while (stepTarget.getAttribute("typicalc") !== "step" && counter < 15) {
stepTarget = stepTarget.parentNode! as SVGGraphicsElement;
counter++;
}
let stepIndex = stepTarget.getAttribute("typicalc") === "step" ? Number(stepTarget.id.substring(4)) : - 1;
let isType = typeTarget.classList.contains("typicalc-type"); let isType = typeTarget.classList.contains("typicalc-type");
let isLabel = typeTarget.classList.contains("typicalc-label"); let isLabel = typeTarget.classList.contains("typicalc-label");
if (mouseIn) { if (mouseIn) {
@ -404,6 +391,13 @@ class MathjaxProofTree extends MathjaxAdapter {
hoverStyles!.innerHTML = css; hoverStyles!.innerHTML = css;
hoverStylesUnification!.innerHTML = css; hoverStylesUnification!.innerHTML = css;
} else if (isLabel) { } else if (isLabel) {
let stepTarget = typeTarget;
while (stepTarget.getAttribute("typicalc") !== "step" && counter < 15) {
stepTarget = stepTarget.parentNode! as SVGGraphicsElement;
counter++;
}
let stepIndex = stepTarget.getAttribute("typicalc") === "step" ? Number(stepTarget.id.substring(4)) : - 1;
const defId = typeTarget.classList[1].replace("-label-", "-definition-"); const defId = typeTarget.classList[1].replace("-label-", "-definition-");
const defEl = this.shadowRoot!.getElementById(defId)! as unknown as SVGGraphicsElement; const defEl = this.shadowRoot!.getElementById(defId)! as unknown as SVGGraphicsElement;
const transform = viewport.getTransformToElement(typeTarget); const transform = viewport.getTransformToElement(typeTarget);
@ -510,6 +504,10 @@ class MathjaxProofTree extends MathjaxAdapter {
svg.querySelector("#step0")!.addEventListener("mouseout", e => { svg.querySelector("#step0")!.addEventListener("mouseout", e => {
handleMouseEvent(e as MouseEvent, false); handleMouseEvent(e as MouseEvent, false);
}); });
// @ts-ignore
this.shadowRoot.host.handleHoverEvent = (e: MouseEvent, mouseIn: boolean) => {
handleMouseEvent(e, mouseIn);
}
this.$server!.setStepCount(steps.length); this.$server!.setStepCount(steps.length);
} }

View File

@ -0,0 +1,5 @@
export const hoverAreaAroundElements: string = `
.typicalc-type, g[semantics='bspr_prooflabel:left'] {
/* cross-browser-compatibility: Chrome does not support the stroke trick, but instead bounding-box (which is not supported by Firefox..) */
stroke: transparent; stroke-width: 600px; pointer-events: all; pointer-events: bounding-box;
}`;

View File

@ -1,4 +1,5 @@
import {MathjaxAdapter} from "./mathjax-adapter"; import {MathjaxAdapter} from "./mathjax-adapter";
import {hoverAreaAroundElements} from "./mathjax-style-hacks";
class MathjaxUnification extends MathjaxAdapter { class MathjaxUnification extends MathjaxAdapter {
connectedCallback() { connectedCallback() {
@ -15,6 +16,27 @@ class MathjaxUnification extends MathjaxAdapter {
protected showStep(_n: number): void { protected showStep(_n: number): void {
this.requestTypeset(null); this.requestTypeset(null);
} }
protected calculateSteps(_extraData: any) {
const root = this.shadowRoot!;
// re-apply style hacks
if (!root.querySelector("#style-fixes")) {
const style = document.createElement('style');
style.innerHTML = hoverAreaAroundElements;
style.id = "style-fixes";
root.querySelector("mjx-head")!.appendChild(style);
}
// re-attach event listeners
const prooftree = this.shadowRoot!.host.ownerDocument.querySelector("tc-proof-tree")!;
root.querySelector("mjx-body")!.addEventListener("mouseover", e => {
// @ts-ignore
prooftree.handleHoverEvent(e as MouseEvent, true);
});
root.querySelector("mjx-body")!.addEventListener("mouseout", e => {
// @ts-ignore
prooftree.handleHoverEvent(e as MouseEvent, false);
});
}
} }
customElements.define('tc-unification', MathjaxUnification); customElements.define('tc-unification', MathjaxUnification);

View File

@ -3,12 +3,9 @@ package edu.kit.typicalc.view.content.typeinferencecontent.latexcreator;
import edu.kit.typicalc.model.Model; import edu.kit.typicalc.model.Model;
import edu.kit.typicalc.model.ModelImpl; import edu.kit.typicalc.model.ModelImpl;
import edu.kit.typicalc.model.TypeInfererInterface; import edu.kit.typicalc.model.TypeInfererInterface;
import org.junit.Ignore;
import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import static edu.kit.typicalc.view.content.typeinferencecontent.latexcreator.LatexCreatorConstants.*; import static edu.kit.typicalc.view.content.typeinferencecontent.latexcreator.LatexCreatorConstants.*;