Skip to content

Commit dca03d5

Browse files
committed
move minmap to own pixi app and use html to overlay it
1 parent f2aff5c commit dca03d5

File tree

5 files changed

+65
-77
lines changed

5 files changed

+65
-77
lines changed

org.knime.ui.js/src/components/workflowEditor/WebGLKanvas/WorkflowCanvas.vue

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ const { activeWorkflow, isWorkflowEmpty, isWritable } = storeToRefs(
4444
const aiQuickActionsStore = useAiQuickActionsStore();
4545
const canvasStore = useWebGLCanvasStore();
4646
47-
const { containerSize, shouldHideMiniMap, interactionsEnabled } =
48-
storeToRefs(canvasStore);
47+
const { containerSize, interactionsEnabled } = storeToRefs(canvasStore);
4948
5049
const skeletonAnnotationData = computed(
5150
() =>
@@ -114,7 +113,6 @@ onMounted(() => {
114113
115114
const rootEl = useTemplateRef("rootEl");
116115
const initResizeObserver = () => {
117-
let minimapVisibilityTimeout: number;
118116
if (!rootEl.value) {
119117
return;
120118
}
@@ -130,17 +128,6 @@ const initResizeObserver = () => {
130128
return;
131129
}
132130
133-
shouldHideMiniMap.value = true;
134-
135-
if (minimapVisibilityTimeout) {
136-
clearTimeout(minimapVisibilityTimeout);
137-
}
138-
139-
minimapVisibilityTimeout = window.setTimeout(() => {
140-
shouldHideMiniMap.value = false;
141-
// eslint-disable-next-line no-magic-numbers
142-
}, 300);
143-
144131
updateContainerSize();
145132
});
146133

org.knime.ui.js/src/components/workflowEditor/WebGLKanvas/floatingToolbar/canvasTools/FloatingCanvasTools.vue

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import { useLifecycleStore } from "@/store/application/lifecycle";
1717
import { useApplicationSettingsStore } from "@/store/application/settings";
1818
import { useSettingsStore } from "@/store/settings";
1919
import { useWorkflowStore } from "@/store/workflow/workflow";
20+
import { canvasMinimapAspectRatio } from "@/style/shapes";
21+
import { Application, type ApplicationInst } from "@/vue3-pixi";
22+
import Minimap from "../../kanvas/Minimap.vue";
2023
2124
import ZoomMenu from "./ZoomMenu.vue";
2225
@@ -42,9 +45,32 @@ const { hasPanModeEnabled: isPanModeActive } = storeToRefs(
4245
const applicationSettingsStore = useApplicationSettingsStore();
4346
const { devMode } = storeToRefs(applicationSettingsStore);
4447
const enableWorkflowActions = import.meta.env.MODE !== "e2e" && devMode;
48+
const minimapWidth = 200;
49+
const minimapHeight = minimapWidth / canvasMinimapAspectRatio;
4550
</script>
4651

4752
<template>
53+
<div v-show="isMinimapVisible" class="minimap-wrapper">
54+
<Application
55+
ref="minimapPixi"
56+
:background-color="0x000000"
57+
:background-alpha="0"
58+
:width="minimapWidth"
59+
:height="minimapHeight"
60+
@contextmenu.prevent
61+
@pointerdown.stop
62+
@pointerenter.stop.capture
63+
@pointerleave.stop.capture
64+
@click.stop
65+
>
66+
<Minimap
67+
v-if="isMinimapVisible"
68+
:canvas="($refs.minimapPixi as ApplicationInst).app.canvas"
69+
:width="minimapWidth"
70+
:height="minimapHeight"
71+
/>
72+
</Application>
73+
</div>
4874
<div
4975
v-if="!isLoadingWorkflow && isBrowser() && enableWorkflowActions"
5076
class="workflow-actions toolbar"
@@ -115,6 +141,27 @@ const enableWorkflowActions = import.meta.env.MODE !== "e2e" && devMode;
115141
padding: var(--kds-spacing-container-0-25x);
116142
}
117143
144+
.minimap-wrapper {
145+
position: absolute;
146+
bottom: calc(
147+
v-bind("$shapes.floatingCanvasToolsBottomOffset") * 1px +
148+
calc(v-bind("$shapes.floatingCanvasToolsSize") * 1px) +
149+
var(--kds-spacing-container-0-37x)
150+
);
151+
width: 200px;
152+
height: 150px;
153+
right: calc(v-bind("$shapes.floatingCanvasToolsBottomOffset") * 1px);
154+
display: flex;
155+
place-items: center center;
156+
background: var(--knime-white);
157+
border: var(--kds-border-base-subtle);
158+
border-radius: var(--kds-border-radius-container-0-50x);
159+
box-shadow: var(--kds-elevation-level-1);
160+
z-index: v-bind("$zIndices.layerCanvasDecorations");
161+
padding: 0;
162+
overflow: hidden;
163+
}
164+
118165
.workflow-actions {
119166
left: calc(v-bind("$shapes.floatingCanvasToolsBottomOffset") * 1px);
120167
}

org.knime.ui.js/src/components/workflowEditor/WebGLKanvas/kanvas/Kanvas.vue

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { computed, onUnmounted, ref, useTemplateRef, watch } from "vue";
2+
import { onUnmounted, ref, useTemplateRef, watch } from "vue";
33
import { useDevicePixelRatio } from "@vueuse/core";
44
import { storeToRefs } from "pinia";
55
import {
@@ -14,15 +14,13 @@ import { performanceTracker } from "@/services/performanceTracker";
1414
import { useCanvasModesStore } from "@/store/application/canvasModes";
1515
import { useApplicationSettingsStore } from "@/store/application/settings";
1616
import { useWebGLCanvasStore } from "@/store/canvas/canvas-webgl";
17-
import { useSettingsStore } from "@/store/settings";
1817
import { Application, type ApplicationInst } from "@/vue3-pixi";
1918
import Debug from "../Debug.vue";
2019
import { clearIconCache } from "../common/iconCache";
2120
import { pixiGlobals } from "../common/pixiGlobals";
2221
import { initE2ETestUtils } from "../util/e2eTest";
2322
import { isMarkedEvent } from "../util/interaction";
2423
25-
import Minimap from "./Minimap.vue";
2624
import { useKanvasNodePortHint } from "./useKanvasNodePortHint";
2725
import { useMouseWheel } from "./useMouseWheel";
2826
import { useCanvasPanning } from "./usePanning";
@@ -33,7 +31,6 @@ const emit = defineEmits<{
3331
3432
const canvasStore = useWebGLCanvasStore();
3533
const {
36-
shouldHideMiniMap,
3734
containerSize,
3835
isDebugModeEnabled: isCanvasDebugEnabled,
3936
canvasLayers,
@@ -42,10 +39,6 @@ const {
4239
isHoldingDownSpace,
4340
} = storeToRefs(canvasStore);
4441
45-
const isMinimapVisible = computed(
46-
() => useSettingsStore().settings.isMinimapVisible,
47-
);
48-
4942
const MAIN_CONTAINER_LABEL = "MainContainer";
5043
const { devMode } = storeToRefs(useApplicationSettingsStore());
5144
@@ -189,8 +182,6 @@ watch(
189182
<Debug v-if="devMode" :visible="isCanvasDebugEnabled" />
190183
<slot />
191184
</Container>
192-
193-
<Minimap v-if="isMinimapVisible && !shouldHideMiniMap" />
194185
</Application>
195186
</template>
196187

org.knime.ui.js/src/components/workflowEditor/WebGLKanvas/kanvas/Minimap.vue

Lines changed: 16 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,21 @@
22
<script setup lang="ts">
33
import { computed, useTemplateRef } from "vue";
44
import { storeToRefs } from "pinia";
5-
import { BlurFilter, type FederatedPointerEvent, type Graphics } from "pixi.js";
5+
import { type FederatedPointerEvent, type Graphics } from "pixi.js";
6+
import { Rectangle } from "pixi.js";
67
78
import { clamp } from "@/lib/math";
89
import { useWebGLCanvasStore } from "@/store/canvas/canvas-webgl";
9-
import * as $shapes from "@/style/shapes";
10-
import { pixiGlobals } from "../common/pixiGlobals";
11-
import { markPointerEventAsHandled } from "../util/interaction";
1210
1311
import MiniPreview from "./MiniPreview.vue";
1412
15-
const paddingBottom = 6;
16-
const rightOffset = $shapes.floatingCanvasToolsBottomOffset;
17-
const bottomOffset =
18-
$shapes.floatingCanvasToolsBottomOffset +
19-
$shapes.floatingCanvasToolsSize +
20-
paddingBottom;
13+
type Props = {
14+
canvas: HTMLCanvasElement;
15+
width: number;
16+
height: number;
17+
};
18+
19+
const { canvas, width, height } = defineProps<Props>();
2120
2221
const canvasStore = useWebGLCanvasStore();
2322
@@ -26,19 +25,12 @@ const { containerSize, canvasOffset, zoomFactor, maxWorldContentBounds } =
2625
2726
const worldBounds = computed(() => maxWorldContentBounds.value);
2827
29-
const minimapWidth = 200;
30-
const minimapHeight = minimapWidth / $shapes.canvasMinimapAspectRatio;
31-
3228
const minimapBounds = computed(() => {
33-
const { width: containerWidth, height: containerHeight } =
34-
containerSize.value;
35-
3629
return {
37-
x: containerWidth - minimapWidth - rightOffset,
38-
y: containerHeight - minimapHeight - bottomOffset,
39-
40-
width: minimapWidth,
41-
height: minimapHeight,
30+
x: 0,
31+
y: 0,
32+
width,
33+
height,
4234
};
4335
});
4436
@@ -88,8 +80,6 @@ const minimapDeltaToCanvasDelta = (value: number, isXAxis = true) => {
8880
};
8981
9082
const onCameraPointerdown = (pointerdown: FederatedPointerEvent) => {
91-
markPointerEventAsHandled(pointerdown, { initiator: "minimap-pan" });
92-
9383
const isOutOfBounds = (move: PointerEvent) => {
9484
return (
9585
move.offsetX < minimapBounds.value.x ||
@@ -99,7 +89,6 @@ const onCameraPointerdown = (pointerdown: FederatedPointerEvent) => {
9989
);
10090
};
10191
102-
const canvas = pixiGlobals.getCanvas();
10392
canvas.setPointerCapture(pointerdown.pointerId);
10493
10594
let lastPan = {
@@ -157,8 +146,6 @@ const onMinimapPointerdown = (pointerdown: FederatedPointerEvent) => {
157146
// continue interaction into a camera pan
158147
onCameraPointerdown(pointerdown);
159148
};
160-
161-
const blur = new BlurFilter({ strength: 4 });
162149
</script>
163150

164151
<template>
@@ -167,33 +154,11 @@ const blur = new BlurFilter({ strength: 4 });
167154
label="Minimap"
168155
event-mode="static"
169156
:position="minimapBounds"
157+
:hit-area="new Rectangle(0, 0, width, height)"
170158
@pointerdown.stop="onMinimapPointerdown"
159+
@pointerenter.stop
160+
@pointerleave.stop
171161
>
172-
<Graphics
173-
label="MinimapBackgroundBoxShadow"
174-
:filters="[blur]"
175-
@render="
176-
(graphics) => {
177-
graphics
178-
.clear()
179-
.roundRect(0, 1, minimapBounds.width, minimapBounds.height, 8)
180-
.fill($colors.GrayDarkSemi);
181-
}
182-
"
183-
/>
184-
185-
<Graphics
186-
label="MinimapBackground"
187-
@render="
188-
(graphics) => {
189-
graphics
190-
.clear()
191-
.roundRect(0, 0, minimapBounds.width, minimapBounds.height, 8)
192-
.fill($colors.White);
193-
}
194-
"
195-
/>
196-
197162
<MiniPreview :minimap-transform="minimapTransform" />
198163

199164
<Graphics

org.knime.ui.js/src/store/canvas/canvas-webgl.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ export const useWebGLCanvasStore = defineStore("canvasWebGL", () => {
7373
const pixelRatio = ref(1);
7474
const isPanning = ref(false);
7575
const isHoldingDownSpace = ref(false);
76-
const shouldHideMiniMap = ref(false);
7776

7877
const pixelRatioWithLimits = computed(() => {
7978
// use lower bound to avoid blurry rendering (happen when having a ratio of 1)
@@ -816,7 +815,6 @@ export const useWebGLCanvasStore = defineStore("canvasWebGL", () => {
816815
contentBounds,
817816

818817
// webgl only
819-
shouldHideMiniMap,
820818
canvasAnchor,
821819
canvasLayers,
822820
isDebugModeEnabled,

0 commit comments

Comments
 (0)