mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-01 22:09:55 +00:00
## Summary Selection box was being drawn on canvas which appeared below DOM widgets like images and textareas. Now rendered via SelectionRectangle.vue with high z-index to ensure visibility during drag selection. ## Screenshots (if applicable) before <img width="1268" height="1258" alt="image" src="https://github.com/user-attachments/assets/7cb1271c-9ce6-4fac-83a9-ac783a309d97" /> after <img width="1509" height="1129" alt="image" src="https://github.com/user-attachments/assets/55dd698f-1213-4e60-ae46-9ed292ecd70c" /> ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-7474-fix-render-selection-rectangle-in-DOM-layer-to-appear-above-DOM-widgets-2c96d73d36508142bc2ac0d0943043c5) by [Unito](https://www.unito.io)
64 lines
1.4 KiB
Vue
64 lines
1.4 KiB
Vue
<template>
|
|
<div
|
|
v-if="isVisible"
|
|
class="pointer-events-none absolute z-9999 border border-blue-400 bg-blue-500/20"
|
|
:style="rectangleStyle"
|
|
/>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { useRafFn } from '@vueuse/core'
|
|
import { computed, ref } from 'vue'
|
|
|
|
import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
|
|
|
|
const canvasStore = useCanvasStore()
|
|
|
|
const selectionRect = ref<{
|
|
x: number
|
|
y: number
|
|
w: number
|
|
h: number
|
|
} | null>(null)
|
|
|
|
useRafFn(() => {
|
|
const canvas = canvasStore.canvas
|
|
if (!canvas) {
|
|
selectionRect.value = null
|
|
return
|
|
}
|
|
|
|
const { pointer, dragging_rectangle } = canvas
|
|
|
|
if (dragging_rectangle && pointer.eDown && pointer.eMove) {
|
|
const x = pointer.eDown.safeOffsetX
|
|
const y = pointer.eDown.safeOffsetY
|
|
const w = pointer.eMove.safeOffsetX - x
|
|
const h = pointer.eMove.safeOffsetY - y
|
|
|
|
selectionRect.value = { x, y, w, h }
|
|
} else {
|
|
selectionRect.value = null
|
|
}
|
|
})
|
|
|
|
const isVisible = computed(() => selectionRect.value !== null)
|
|
|
|
const rectangleStyle = computed(() => {
|
|
const rect = selectionRect.value
|
|
if (!rect) return {}
|
|
|
|
const left = rect.w >= 0 ? rect.x : rect.x + rect.w
|
|
const top = rect.h >= 0 ? rect.y : rect.y + rect.h
|
|
const width = Math.abs(rect.w)
|
|
const height = Math.abs(rect.h)
|
|
|
|
return {
|
|
left: `${left}px`,
|
|
top: `${top}px`,
|
|
width: `${width}px`,
|
|
height: `${height}px`
|
|
}
|
|
})
|
|
</script>
|