mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-11 08:20:53 +00:00
* [refactor] Improve renderer architecture organization Building on PR #5388, this refines the renderer domain structure: **Key improvements:** - Group all transform utilities in `transform/` subdirectory for better cohesion - Move canvas state to dedicated `renderer/core/canvas/` domain - Consolidate coordinate system logic (TransformPane, useTransformState, sync utilities) **File organization:** - `renderer/core/canvas/canvasStore.ts` (was `stores/graphStore.ts`) - `renderer/core/layout/transform/` contains all coordinate system utilities - Transform sync utilities co-located with core transform logic This creates clearer domain boundaries and groups related functionality while building on the foundation established in PR #5388. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: Clean up linter-modified files * Fix import paths and clean up unused imports after rebase - Update all remaining @/stores/graphStore references to @/renderer/core/canvas/canvasStore - Remove unused imports from selection toolbox components - All tests pass, only reka-ui upstream issue remains in typecheck 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * [auto-fix] Apply ESLint and Prettier fixes --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: GitHub Action <action@github.com>
73 lines
1.9 KiB
Vue
73 lines
1.9 KiB
Vue
<template>
|
|
<Button
|
|
v-tooltip.top="{
|
|
value: t('selectionToolbox.executeButton.tooltip'),
|
|
showDelay: 1000
|
|
}"
|
|
class="dark-theme:bg-[#0B8CE9] bg-[#31B9F4] size-8 !p-0"
|
|
text
|
|
@mouseenter="() => handleMouseEnter()"
|
|
@mouseleave="() => handleMouseLeave()"
|
|
@click="handleClick"
|
|
>
|
|
<i-lucide:play class="fill-path-white w-4 h-4" />
|
|
</Button>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import Button from 'primevue/button'
|
|
import { computed, ref } from 'vue'
|
|
import { useI18n } from 'vue-i18n'
|
|
|
|
import { useSelectionState } from '@/composables/graph/useSelectionState'
|
|
import type { LGraphNode } from '@/lib/litegraph/src/litegraph'
|
|
import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
|
|
import { useCommandStore } from '@/stores/commandStore'
|
|
import { isLGraphNode } from '@/utils/litegraphUtil'
|
|
import { isOutputNode } from '@/utils/nodeFilterUtil'
|
|
|
|
const { t } = useI18n()
|
|
const commandStore = useCommandStore()
|
|
const canvasStore = useCanvasStore()
|
|
const { selectedNodes } = useSelectionState()
|
|
|
|
const canvas = canvasStore.getCanvas()
|
|
const buttonHovered = ref(false)
|
|
const selectedOutputNodes = computed(() =>
|
|
selectedNodes.value.filter(isLGraphNode).filter(isOutputNode)
|
|
)
|
|
|
|
function outputNodeStokeStyle(this: LGraphNode) {
|
|
if (
|
|
this.selected &&
|
|
this.constructor.nodeData?.output_node &&
|
|
buttonHovered.value
|
|
) {
|
|
return { color: 'orange', lineWidth: 2, padding: 10 }
|
|
}
|
|
}
|
|
|
|
const handleMouseEnter = () => {
|
|
buttonHovered.value = true
|
|
for (const node of selectedOutputNodes.value) {
|
|
node.strokeStyles['outputNode'] = outputNodeStokeStyle
|
|
}
|
|
canvas.setDirty(true)
|
|
}
|
|
|
|
const handleMouseLeave = () => {
|
|
buttonHovered.value = false
|
|
canvas.setDirty(true)
|
|
}
|
|
|
|
const handleClick = async () => {
|
|
await commandStore.execute('Comfy.QueueSelectedOutputNodes')
|
|
}
|
|
</script>
|
|
<style scoped>
|
|
:deep.fill-path-white > path {
|
|
fill: white;
|
|
stroke: unset;
|
|
}
|
|
</style>
|