Use store to manage nodeSearchService (#214)

This commit is contained in:
Chenlei Hu
2024-07-24 12:00:23 -04:00
committed by GitHub
parent b73fe80761
commit ebdd7b8e40
7 changed files with 33 additions and 43 deletions

View File

@@ -110,7 +110,9 @@ export class ComfyPage {
}`, }`,
}); });
await this.page.waitForFunction(() => document.fonts.ready); await this.page.waitForFunction(() => document.fonts.ready);
await this.page.waitForFunction(() => window["app"] !== undefined); await this.page.waitForFunction(
() => window["app"] !== undefined && window["app"].vueAppReady
);
await this.page.evaluate(() => { await this.page.evaluate(() => {
window["app"]["canvas"].show_info = false; window["app"]["canvas"].show_info = false;
}); });

View File

@@ -13,20 +13,16 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, onMounted, onUnmounted, provide, ref, watch } from "vue"; import { computed, onMounted, ref, watch } from "vue";
import NodeSearchboxPopover from "@/components/NodeSearchBoxPopover.vue"; import NodeSearchboxPopover from "@/components/NodeSearchBoxPopover.vue";
import SideToolBar from "@/components/sidebar/SideToolBar.vue"; import SideToolBar from "@/components/sidebar/SideToolBar.vue";
import LiteGraphCanvasSplitterOverlay from "@/components/LiteGraphCanvasSplitterOverlay.vue"; import LiteGraphCanvasSplitterOverlay from "@/components/LiteGraphCanvasSplitterOverlay.vue";
import ProgressSpinner from "primevue/progressspinner"; import ProgressSpinner from "primevue/progressspinner";
import { NodeSearchService } from "./services/nodeSearchService";
import { app } from "./scripts/app"; import { app } from "./scripts/app";
import { useSettingStore } from "./stores/settingStore"; import { useSettingStore } from "./stores/settingStore";
import { useNodeDefStore } from "./stores/nodeDefStore"; import { useNodeDefStore } from "./stores/nodeDefStore";
const isLoading = ref(true); const isLoading = ref(true);
const nodeSearchService = computed(
() => new NodeSearchService(useNodeDefStore().nodeDefs)
);
const nodeSearchEnabled = computed<boolean>( const nodeSearchEnabled = computed<boolean>(
() => useSettingStore().get("Comfy.NodeSearchBoxImpl") === "default" () => useSettingStore().get("Comfy.NodeSearchBoxImpl") === "default"
); );
@@ -47,22 +43,21 @@ watch(
{ immediate: true } { immediate: true }
); );
const init = async () => { const init = () => {
useNodeDefStore().addNodeDefs(Object.values(app.nodeDefs)); useNodeDefStore().addNodeDefs(Object.values(app.nodeDefs));
useSettingStore().addSettings(app.ui.settings); useSettingStore().addSettings(app.ui.settings);
app.vueAppReady = true;
}; };
onMounted(async () => { onMounted(() => {
try { try {
await init(); init();
} catch (e) { } catch (e) {
console.error("Failed to init Vue app", e); console.error("Failed to init Vue app", e);
} finally { } finally {
isLoading.value = false; isLoading.value = false;
} }
}); });
provide("nodeSearchService", nodeSearchService);
</script> </script>
<style scoped> <style scoped>

View File

@@ -60,11 +60,9 @@ import Badge from "primevue/badge";
import NodeSearchFilter from "@/components/NodeSearchFilter.vue"; import NodeSearchFilter from "@/components/NodeSearchFilter.vue";
import NodeSourceChip from "@/components/NodeSourceChip.vue"; import NodeSourceChip from "@/components/NodeSourceChip.vue";
import { ComfyNodeDef } from "@/types/apiTypes"; import { ComfyNodeDef } from "@/types/apiTypes";
import { import { type FilterAndValue } from "@/services/nodeSearchService";
NodeSearchService,
type FilterAndValue,
} from "@/services/nodeSearchService";
import NodePreview from "./NodePreview.vue"; import NodePreview from "./NodePreview.vue";
import { useNodeDefStore } from "@/stores/nodeDefStore";
const props = defineProps({ const props = defineProps({
filters: { filters: {
@@ -76,10 +74,6 @@ const props = defineProps({
}, },
}); });
const nodeSearchService = (
inject("nodeSearchService") as Ref<NodeSearchService>
).value;
const inputId = `comfy-vue-node-search-box-input-${Math.random()}`; const inputId = `comfy-vue-node-search-box-input-${Math.random()}`;
const suggestions = ref<ComfyNodeDef[]>([]); const suggestions = ref<ComfyNodeDef[]>([]);
const hoveredSuggestion = ref<ComfyNodeDef | null>(null); const hoveredSuggestion = ref<ComfyNodeDef | null>(null);
@@ -88,9 +82,13 @@ const placeholder = computed(() => {
}); });
const search = (query: string) => { const search = (query: string) => {
suggestions.value = nodeSearchService.searchNode(query, props.filters, { suggestions.value = useNodeDefStore().nodeSearchService.searchNode(
limit: props.searchLimit, query,
}); props.filters,
{
limit: props.searchLimit,
}
);
}; };
const emit = defineEmits(["addFilter", "removeFilter", "addNode"]); const emit = defineEmits(["addFilter", "removeFilter", "addNode"]);

View File

@@ -32,11 +32,9 @@ import {
LGraphNode, LGraphNode,
LinkReleaseContext, LinkReleaseContext,
} from "@comfyorg/litegraph"; } from "@comfyorg/litegraph";
import { import { FilterAndValue } from "@/services/nodeSearchService";
FilterAndValue,
NodeSearchService,
} from "@/services/nodeSearchService";
import { ComfyNodeDef } from "@/types/apiTypes"; import { ComfyNodeDef } from "@/types/apiTypes";
import { useNodeDefStore } from "@/stores/nodeDefStore";
interface LiteGraphPointerEvent extends Event { interface LiteGraphPointerEvent extends Event {
canvasX: number; canvasX: number;
@@ -114,9 +112,6 @@ const addNode = (nodeDef: ComfyNodeDef) => {
} }
} }
}; };
const nodeSearchService = (
inject("nodeSearchService") as Ref<NodeSearchService>
).value;
const canvasEventHandler = (e: LiteGraphCanvasEvent) => { const canvasEventHandler = (e: LiteGraphCanvasEvent) => {
const shiftPressed = (e.detail.originalEvent as KeyboardEvent).shiftKey; const shiftPressed = (e.detail.originalEvent as KeyboardEvent).shiftKey;
@@ -128,9 +123,10 @@ const canvasEventHandler = (e: LiteGraphCanvasEvent) => {
if (e.detail.subType === "empty-release") { if (e.detail.subType === "empty-release") {
const destIsInput = e.detail.linkReleaseContext.node_from !== undefined; const destIsInput = e.detail.linkReleaseContext.node_from !== undefined;
const filter = destIsInput const filter = useNodeDefStore().nodeSearchService.getFilterById(
? nodeSearchService.getFilterById("input") destIsInput ? "input" : "output"
: nodeSearchService.getFilterById("output"); );
const value = destIsInput const value = destIsInput
? e.detail.linkReleaseContext.type_filter_in ? e.detail.linkReleaseContext.type_filter_in
: e.detail.linkReleaseContext.type_filter_out; : e.detail.linkReleaseContext.type_filter_out;
@@ -172,6 +168,7 @@ onUnmounted(() => {
background-color: transparent !important; background-color: transparent !important;
margin-top: 25vh; margin-top: 25vh;
} }
.node-search-box-dialog-mask { .node-search-box-dialog-mask {
align-items: flex-start !important; align-items: flex-start !important;
} }

View File

@@ -34,26 +34,22 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { import { NodeFilter, type FilterAndValue } from "@/services/nodeSearchService";
NodeFilter,
NodeSearchService,
type FilterAndValue,
} from "@/services/nodeSearchService";
import Button from "primevue/button"; import Button from "primevue/button";
import Dialog from "primevue/dialog"; import Dialog from "primevue/dialog";
import SelectButton from "primevue/selectbutton"; import SelectButton from "primevue/selectbutton";
import AutoComplete from "primevue/autocomplete"; import AutoComplete from "primevue/autocomplete";
import { inject, ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { useNodeDefStore } from "@/stores/nodeDefStore";
const visible = ref<boolean>(false); const visible = ref<boolean>(false);
const nodeSearchService: NodeSearchService = inject("nodeSearchService").value;
const filters = ref<NodeFilter[]>([]); const filters = ref<NodeFilter[]>([]);
const selectedFilter = ref<NodeFilter>(); const selectedFilter = ref<NodeFilter>();
const filterValues = ref<string[]>([]); const filterValues = ref<string[]>([]);
const selectedFilterValue = ref<string>(""); const selectedFilterValue = ref<string>("");
onMounted(() => { onMounted(() => {
const nodeSearchService = useNodeDefStore().nodeSearchService;
filters.value = nodeSearchService.nodeFilters; filters.value = nodeSearchService.nodeFilters;
selectedFilter.value = nodeSearchService.nodeFilters[0]; selectedFilter.value = nodeSearchService.nodeFilters[0];
}); });

View File

@@ -45,6 +45,4 @@ comfyApp.setup().then(() => {
.use(pinia) .use(pinia)
.use(i18n) .use(i18n)
.mount("#vue-app"); .mount("#vue-app");
comfyApp.vueAppReady = true;
}); });

View File

@@ -1,3 +1,4 @@
import { NodeSearchService } from "@/services/nodeSearchService";
import { ComfyNodeDef } from "@/types/apiTypes"; import { ComfyNodeDef } from "@/types/apiTypes";
import { defineStore } from "pinia"; import { defineStore } from "pinia";
@@ -54,6 +55,9 @@ export const useNodeDefStore = defineStore("nodeDef", {
nodeDefs(state) { nodeDefs(state) {
return Object.values(state.nodeDefsByName); return Object.values(state.nodeDefsByName);
}, },
nodeSearchService(state) {
return new NodeSearchService(Object.values(state.nodeDefsByName));
},
}, },
actions: { actions: {
addNodeDef(nodeDef: ComfyNodeDef) { addNodeDef(nodeDef: ComfyNodeDef) {
@@ -61,7 +65,7 @@ export const useNodeDefStore = defineStore("nodeDef", {
}, },
addNodeDefs(nodeDefs: ComfyNodeDef[]) { addNodeDefs(nodeDefs: ComfyNodeDef[]) {
for (const nodeDef of nodeDefs) { for (const nodeDef of nodeDefs) {
this.addNodeDef(nodeDef); this.nodeDefsByName[nodeDef.name] = nodeDef;
} }
}, },
}, },