import { ref } from 'vue' import { global, useHookShareState } from '.' import { getImageGenerationInfoBatch } from '@/api' import { FileNodeInfo, GenDiffInfo } from '@/api/files' import { parse } from '@/util/stable-diffusion-image-metadata' import { delay } from 'vue3-ts-util' import { isImageFile } from '@/util' const geninfocache = new Map() export const useGenInfoDiff = () => { const { useEventListen, sortedFiles, getViewableAreaFiles } = useHookShareState().toRefs() const changeIndchecked = ref(global.defaultChangeIndchecked) const seedChangeChecked = ref(global.defaultSeedChangeChecked) const setGenInfo = async () => { await delay(100) if (!changeIndchecked.value) return const files = getViewableAreaFiles.value().filter(v => isImageFile(v.fullpath) && !v.gen_info_obj) if (!files.length) return const geninfos = await getImageGenerationInfoBatch(files.map(v => v.fullpath).filter(v => !geninfocache.has(v))) files.forEach(item => { const info = geninfos[item.fullpath] || geninfocache.get(item.fullpath) || '' geninfocache.set(item.fullpath, info) item.gen_info_obj = parse(info) item.gen_info_raw = info }) } useEventListen.value('viewableAreaFilesChange',setGenInfo) const getGenDiffWatchDep = (idx: number) => { const fs = sortedFiles.value return [idx, seedChangeChecked.value , fs[idx-1], fs[idx], fs[idx+1] ] } function getGenDiff (ownGenInfo: any, idx: any, increment: any, ownFile: FileNodeInfo) { //init result obj const result: GenDiffInfo = { diff: {}, empty: true, ownFile: '', otherFile: '' } //check for out of bounds if (idx + increment < 0 || idx + increment >= sortedFiles.value.length || sortedFiles.value[idx] == undefined) { return result } //check for gen_info_obj existence if (!('gen_info_obj' in sortedFiles.value[idx]) || !('gen_info_obj' in sortedFiles.value[idx + increment])) { return result } //diff vars init const gen_a = ownGenInfo const gen_b: any = sortedFiles.value[idx + increment].gen_info_obj if (gen_b == undefined) { return result } //further vars const skip = ['hashes', 'resources'] result.diff = {} result.ownFile = ownFile.name, result.otherFile = sortedFiles.value[idx + increment].name, result.empty = false if (!seedChangeChecked.value) { skip.push('seed') } //actual per property diff for (const k in gen_a) { //skip unwanted values if (skip.includes(k)) { continue } //for all non-identical values, compare type based //existence test if (!(k in gen_b)) { result.diff[k] = '+' continue } //content test if (gen_a[k] != gen_b[k]) { if (k.includes('rompt') && gen_a[k] != '' && gen_b[k] != '') { //prompt values are comma separated, handle them differently const tokenize_a = gen_a[k].split(',') const tokenize_b = gen_b[k].split(',') //count how many tokens are different or at a different place let diff_count = 0 for (const i in tokenize_a) { if (tokenize_a[i] != tokenize_b[i]) { diff_count++ } } result.diff[k] = diff_count } else { //all others result.diff[k] = [gen_a[k], gen_b[k]] } } } //result return result } return { getGenDiff, changeIndchecked, seedChangeChecked, getRawGenParams: () => setGenInfo(), getGenDiffWatchDep } }