mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-01-30 04:50:04 +00:00
* refactor: move settingStore to platform/settings Move src/stores/settingStore.ts to src/platform/settings/settingStore.ts to separate platform infrastructure from domain logic following DDD principles. Updates all import references across ~70 files to maintain compatibility. * fix: update remaining settingStore imports after rebase * fix: complete remaining settingStore import updates * fix: update vi.mock paths for settingStore in tests Update all test files to mock the new settingStore location at @/platform/settings/settingStore instead of @/stores/settingStore * fix: resolve remaining settingStore imports and unused imports after rebase * fix: update settingStore mock path in SelectionToolbox test Fix vi.mock path from @/stores/settingStore to @/platform/settings/settingStore to resolve failing Load3D viewer button test. * refactor: complete comprehensive settings migration to platform layer This commit completes the migration of all settings-related code to the platform layer as part of the Domain-Driven Design (DDD) architecture refactoring. - constants/coreSettings.ts → platform/settings/constants/coreSettings.ts - types/settingTypes.ts → platform/settings/types.ts - stores/settingStore.ts → platform/settings/settingStore.ts (already moved) - composables/setting/useSettingUI.ts → platform/settings/composables/useSettingUI.ts - composables/setting/useSettingSearch.ts → platform/settings/composables/useSettingSearch.ts - composables/useLitegraphSettings.ts → platform/settings/composables/useLitegraphSettings.ts - components/dialog/content/SettingDialogContent.vue → platform/settings/components/SettingDialogContent.vue - components/dialog/content/setting/SettingItem.vue → platform/settings/components/SettingItem.vue - components/dialog/content/setting/SettingGroup.vue → platform/settings/components/SettingGroup.vue - components/dialog/content/setting/SettingsPanel.vue → platform/settings/components/SettingsPanel.vue - components/dialog/content/setting/ColorPaletteMessage.vue → platform/settings/components/ColorPaletteMessage.vue - components/dialog/content/setting/ExtensionPanel.vue → platform/settings/components/ExtensionPanel.vue - components/dialog/content/setting/ServerConfigPanel.vue → platform/settings/components/ServerConfigPanel.vue - ~100+ import statements updated across the codebase - Test file imports corrected - Component imports fixed in dialog service and command menubar - Composable imports updated in GraphCanvas.vue ``` src/platform/settings/ ├── components/ # All settings UI components ├── composables/ # Settings-related composables ├── constants/ # Core settings definitions ├── types.ts # Settings type definitions └── settingStore.ts # Central settings state management ``` ✅ TypeScript compilation successful ✅ All tests passing (settings store, search functionality, UI components) ✅ Production build successful ✅ Domain boundaries properly established This migration consolidates all settings functionality into a cohesive platform domain, improving maintainability and following DDD principles for better code organization. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: format and lint after rebase conflict resolution * fix: update remaining import paths to platform settings - Fix browser test import: extensionAPI.spec.ts - Fix script import: collect-i18n-general.ts - Complete settings migration import path updates 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
150 lines
4.0 KiB
Vue
150 lines
4.0 KiB
Vue
<template>
|
|
<div
|
|
v-if="tooltipText"
|
|
ref="tooltipRef"
|
|
class="node-tooltip"
|
|
:style="{ left, top }"
|
|
>
|
|
{{ tooltipText }}
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { useEventListener } from '@vueuse/core'
|
|
import { nextTick, ref } from 'vue'
|
|
|
|
import { st } from '@/i18n'
|
|
import {
|
|
LiteGraph,
|
|
isOverNodeInput,
|
|
isOverNodeOutput
|
|
} from '@/lib/litegraph/src/litegraph'
|
|
import { useSettingStore } from '@/platform/settings/settingStore'
|
|
import { app as comfyApp } from '@/scripts/app'
|
|
import { isDOMWidget } from '@/scripts/domWidget'
|
|
import { useNodeDefStore } from '@/stores/nodeDefStore'
|
|
import { normalizeI18nKey } from '@/utils/formatUtil'
|
|
|
|
let idleTimeout: number
|
|
const nodeDefStore = useNodeDefStore()
|
|
const settingStore = useSettingStore()
|
|
const tooltipRef = ref<HTMLDivElement | undefined>()
|
|
const tooltipText = ref('')
|
|
const left = ref<string>()
|
|
const top = ref<string>()
|
|
|
|
const hideTooltip = () => (tooltipText.value = '')
|
|
|
|
const showTooltip = async (tooltip: string | null | undefined) => {
|
|
if (!tooltip) return
|
|
|
|
left.value = comfyApp.canvas.mouse[0] + 'px'
|
|
top.value = comfyApp.canvas.mouse[1] + 'px'
|
|
tooltipText.value = tooltip
|
|
|
|
await nextTick()
|
|
|
|
const rect = tooltipRef.value?.getBoundingClientRect()
|
|
if (!rect) return
|
|
|
|
if (rect.right > window.innerWidth) {
|
|
left.value = comfyApp.canvas.mouse[0] - rect.width + 'px'
|
|
}
|
|
|
|
if (rect.top < 0) {
|
|
top.value = comfyApp.canvas.mouse[1] + rect.height + 'px'
|
|
}
|
|
}
|
|
|
|
const onIdle = () => {
|
|
const { canvas } = comfyApp
|
|
const node = canvas.node_over
|
|
if (!node) return
|
|
|
|
const ctor = node.constructor as { title_mode?: 0 | 1 | 2 | 3 }
|
|
const nodeDef = nodeDefStore.nodeDefsByName[node.type ?? '']
|
|
|
|
if (
|
|
ctor.title_mode !== LiteGraph.NO_TITLE &&
|
|
canvas.graph_mouse[1] < node.pos[1] // If we are over a node, but not within the node then we are on its title
|
|
) {
|
|
return showTooltip(nodeDef.description)
|
|
}
|
|
|
|
if (node.flags?.collapsed) return
|
|
|
|
const inputSlot = isOverNodeInput(
|
|
node,
|
|
canvas.graph_mouse[0],
|
|
canvas.graph_mouse[1],
|
|
[0, 0]
|
|
)
|
|
if (inputSlot !== -1) {
|
|
const inputName = node.inputs[inputSlot].name
|
|
const translatedTooltip = st(
|
|
`nodeDefs.${normalizeI18nKey(node.type ?? '')}.inputs.${normalizeI18nKey(inputName)}.tooltip`,
|
|
nodeDef.inputs[inputName]?.tooltip ?? ''
|
|
)
|
|
return showTooltip(translatedTooltip)
|
|
}
|
|
|
|
const outputSlot = isOverNodeOutput(
|
|
node,
|
|
canvas.graph_mouse[0],
|
|
canvas.graph_mouse[1],
|
|
[0, 0]
|
|
)
|
|
if (outputSlot !== -1) {
|
|
const translatedTooltip = st(
|
|
`nodeDefs.${normalizeI18nKey(node.type ?? '')}.outputs.${outputSlot}.tooltip`,
|
|
nodeDef.outputs[outputSlot]?.tooltip ?? ''
|
|
)
|
|
return showTooltip(translatedTooltip)
|
|
}
|
|
|
|
const widget = comfyApp.canvas.getWidgetAtCursor()
|
|
// Dont show for DOM widgets, these use native browser tooltips as we dont get proper mouse events on these
|
|
if (widget && !isDOMWidget(widget)) {
|
|
const translatedTooltip = st(
|
|
`nodeDefs.${normalizeI18nKey(node.type ?? '')}.inputs.${normalizeI18nKey(widget.name)}.tooltip`,
|
|
nodeDef.inputs[widget.name]?.tooltip ?? ''
|
|
)
|
|
// Widget tooltip can be set dynamically, current translation collection does not support this.
|
|
return showTooltip(widget.tooltip ?? translatedTooltip)
|
|
}
|
|
}
|
|
|
|
const onMouseMove = (e: MouseEvent) => {
|
|
hideTooltip()
|
|
clearTimeout(idleTimeout)
|
|
|
|
if ((e.target as Node).nodeName !== 'CANVAS') return
|
|
idleTimeout = window.setTimeout(
|
|
onIdle,
|
|
settingStore.get('LiteGraph.Node.TooltipDelay')
|
|
)
|
|
}
|
|
|
|
useEventListener(window, 'mousemove', onMouseMove)
|
|
useEventListener(window, 'click', hideTooltip)
|
|
</script>
|
|
|
|
<style lang="css" scoped>
|
|
.node-tooltip {
|
|
pointer-events: none;
|
|
background: var(--comfy-input-bg);
|
|
border-radius: 5px;
|
|
box-shadow: 0 0 5px rgba(0, 0, 0, 0.4);
|
|
color: var(--input-text);
|
|
font-family: sans-serif;
|
|
left: 0;
|
|
max-width: 30vw;
|
|
padding: 4px 8px;
|
|
position: absolute;
|
|
top: 0;
|
|
transform: translate(5px, calc(-100% - 5px));
|
|
white-space: pre-wrap;
|
|
z-index: 99999;
|
|
}
|
|
</style>
|