feat: support Keep Multi-selected

pull/565/head
zanllp 2024-03-28 21:41:34 +08:00
parent d70aebd1c0
commit d2124e9291
38 changed files with 244 additions and 112 deletions

1
vue/components.d.ts vendored
View File

@ -45,6 +45,7 @@ declare module '@vue/runtime-core' {
ChangeIndicator: typeof import('./src/components/ChangeIndicator.vue')['default'] ChangeIndicator: typeof import('./src/components/ChangeIndicator.vue')['default']
ContextMenu: typeof import('./src/components/ContextMenu.vue')['default'] ContextMenu: typeof import('./src/components/ContextMenu.vue')['default']
FileItem: typeof import('./src/components/FileItem.vue')['default'] FileItem: typeof import('./src/components/FileItem.vue')['default']
MultiSelectKeep: typeof import('./src/components/MultiSelectKeep.vue')['default']
NumInput: typeof import('./src/components/numInput.vue')['default'] NumInput: typeof import('./src/components/numInput.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink'] RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView'] RouterView: typeof import('vue-router')['RouterView']

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{d as a,o as t,k as s,c as n,cc as _,q as o}from"./index-423bec18.js";const c={class:"img-sli-container"},i=a({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(l){return(e,r)=>(t(),s("div",c,[n(_,{left:e.left,right:e.right},null,8,["left","right"])]))}});const d=o(i,[["__scopeId","data-v-ae3fb9a8"]]);export{d as default}; import{d as a,o as t,k as s,c as n,cc as _,q as o}from"./index-50eccecb.js";const c={class:"img-sli-container"},i=a({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(l){return(e,r)=>(t(),s("div",c,[n(_,{left:e.left,right:e.right},null,8,["left","right"])]))}});const d=o(i,[["__scopeId","data-v-ae3fb9a8"]]);export{d as default};

View File

@ -1 +0,0 @@
.preview-switch[data-v-d36b6e6b]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-d36b6e6b]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-d36b6e6b]{opacity:0;pointer-events:none;cursor:none}.container[data-v-d36b6e6b]{background:var(--zp-secondary-background)}.container .action-bar[data-v-d36b6e6b]{display:flex;align-items:center;user-select:none;gap:4px;padding:4px}.container .action-bar>*[data-v-d36b6e6b]{flex-wrap:wrap}.container .file-list[data-v-d36b6e6b]{list-style:none;padding:8px;overflow:auto;height:calc(var(--pane-max-height) - 40px);width:100%}.container .no-res-hint[data-v-d36b6e6b]{height:var(--pane-max-height);display:flex;align-items:center;flex-direction:column;justify-content:center}.container .no-res-hint .hint[data-v-d36b6e6b]{font-size:1.6em;margin-bottom:2em;text-align:center}

View File

@ -0,0 +1 @@
import{d as se,s as ne,a4 as oe,r as ie,o as u,k as I,c as s,B as e,A as n,E as R,l as d,G as ae,t as a,m as p,z as V,Q as de,p as k,R as z,U as re,V as ce,Y as B,am as ue,an as me,bC as pe,q as ge}from"./index-50eccecb.js";import{L as ve,R as fe,f as Ie,M as ke,S as _e}from"./MultiSelectKeep-494013af.js";import{g as Ce,h as he,F as we}from"./FileItem-17604ae5.js";import{c as Se,u as xe}from"./hook-d17e6ef3.js";import{o as be}from"./functionalCallableComp-07abeb37.js";import"./index-d087ab29.js";import"./index-25e23286.js";const Me=r=>(ue("data-v-479efe51"),r=r(),me(),r),ye={class:"hint"},Ae={class:"action-bar"},Te=Me(()=>d("div",{style:{padding:"16px 0 512px"}},null,-1)),$e={key:1},Fe={class:"no-res-hint"},Re={class:"hint"},Ve={key:2,class:"preview-switch"},ze=se({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(r){const _=r,g=Se(l=>pe(_.selectedTagIds,l)),{queue:D,images:i,onContextMenuClickU:C,stackViewEl:G,previewIdx:c,previewing:h,onPreviewVisibleChange:E,previewImgMove:w,canPreview:S,itemSize:x,gridItems:N,showGenInfo:m,imageGenInfo:b,q:U,multiSelectedIdxs:v,onFileItemClick:J,scroller:M,showMenuIdx:f,onFileDragStart:L,onFileDragEnd:P,cellWidth:q,onScroll:y,saveAllFileAsJson:K,saveLoadedFileAsJson:O}=xe(g);ne(()=>_.selectedTagIds,async()=>{var l;await g.reset(),await oe(),(l=M.value)==null||l.scrollToItem(0),y()},{immediate:!0});const Q=ie(),{onClearAllSelected:W,onSelectAll:Y,onReverseSelect:j}=Ce();return(l,t)=>{const H=ke,X=re,Z=ce,A=B,ee=B,te=_e;return u(),I("div",{class:"container",ref_key:"stackViewEl",ref:G},[s(H,{show:!!e(v).length||e(Q).keepMultiSelect,onClearAllSelected:e(W),onSelectAll:e(Y),onReverseSelect:e(j)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),s(te,{size:"large",spinning:!e(D).isIdle},{default:n(()=>{var T,$;return[s(Z,{visible:e(m),"onUpdate:visible":t[1]||(t[1]=o=>R(m)?m.value=o:null),width:"70vw","mask-closable":"",onOk:t[2]||(t[2]=o=>m.value=!1)},{cancelText:n(()=>[]),default:n(()=>[s(X,{active:"",loading:!e(U).isIdle},{default:n(()=>[d("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[0]||(t[0]=o=>e(ae)(e(b)))},[d("div",ye,a(l.$t("doubleClickToCopy")),1),p(" "+a(e(b)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),d("div",Ae,[s(A,{onClick:e(O)},{default:n(()=>[p(a(l.$t("saveLoadedImageAsJson")),1)]),_:1},8,["onClick"]),s(A,{onClick:e(K)},{default:n(()=>[p(a(l.$t("saveAllAsJson")),1)]),_:1},8,["onClick"])]),(T=e(i))!=null&&T.length?(u(),V(e(he),{key:0,ref_key:"scroller",ref:M,class:"file-list",items:e(i),"item-size":e(x).first,"key-field":"fullpath","item-secondary-size":e(x).second,gridItems:e(N),onScroll:e(y)},{after:n(()=>[Te]),default:n(({item:o,index:F})=>[s(we,{idx:F,file:o,"cell-width":e(q),"show-menu-idx":e(f),"onUpdate:showMenuIdx":t[3]||(t[3]=le=>R(f)?f.value=le:null),onDragstart:e(L),onDragend:e(P),onFileItemClick:e(J),"full-screen-preview-image-url":e(i)[e(c)]?e(de)(e(i)[e(c)]):"",selected:e(v).includes(F),onContextMenuClick:e(C),onPreviewVisibleChange:e(E),"is-selected-mutil-files":e(v).length>1},null,8,["idx","file","cell-width","show-menu-idx","onDragstart","onDragend","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange","is-selected-mutil-files"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):e(g).load&&l.selectedTagIds.and_tags.length===1&&!(($=l.selectedTagIds.folder_paths_str)!=null&&$.trim())?(u(),I("div",$e,[d("div",Fe,[d("p",Re,a(l.$t("tagSearchNoResultsMessage")),1),s(ee,{onClick:t[4]||(t[4]=o=>e(be)()),type:"primary"},{default:n(()=>[p(a(l.$t("rebuildImageIndex")),1)]),_:1})])])):k("",!0),e(h)?(u(),I("div",Ve,[s(e(ve),{onClick:t[5]||(t[5]=o=>e(w)("prev")),class:z({disable:!e(S)("prev")})},null,8,["class"]),s(e(fe),{onClick:t[6]||(t[6]=o=>e(w)("next")),class:z({disable:!e(S)("next")})},null,8,["class"])])):k("",!0)]}),_:1},8,["spinning"]),e(h)&&e(i)&&e(i)[e(c)]?(u(),V(Ie,{key:0,file:e(i)[e(c)],idx:e(c),onContextMenuClick:e(C)},null,8,["file","idx","onContextMenuClick"])):k("",!0)],512)}}});const Le=ge(ze,[["__scopeId","data-v-479efe51"]]);export{Le as default};

View File

@ -1 +0,0 @@
import{d as X,s as Z,a4 as ee,o as r,k as v,c as l,A as n,C as e,E as F,l as c,G as se,t as a,m as u,z as V,Q as te,p as f,R as z,U as le,V as ie,Y as D,bC as ne,q as oe}from"./index-423bec18.js";import{L as ae,R as de,f as re,S as ce}from"./fullScreenContextMenu-b87ca1f9.js";import{g as me,F as ue}from"./FileItem-08fb0ce5.js";import{c as pe,u as ge}from"./hook-edaa5e66.js";import{o as ve}from"./functionalCallableComp-81426c02.js";import"./index-8ac7462b.js";import"./index-fc855220.js";const fe={class:"hint"},Ie={class:"action-bar"},ke={key:1},Ce={class:"no-res-hint"},_e={class:"hint"},we={key:2,class:"preview-switch"},he=X({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(B){const I=B,p=pe(t=>ne(I.selectedTagIds,t)),{queue:R,images:o,onContextMenuClickU:k,stackViewEl:G,previewIdx:d,previewing:C,onPreviewVisibleChange:E,previewImgMove:_,canPreview:w,itemSize:h,gridItems:N,showGenInfo:m,imageGenInfo:b,q:U,multiSelectedIdxs:x,onFileItemClick:J,scroller:y,showMenuIdx:g,onFileDragStart:L,onFileDragEnd:P,cellWidth:q,onScroll:M,saveAllFileAsJson:O,saveLoadedFileAsJson:Q}=ge(p);return Z(()=>I.selectedTagIds,async()=>{var t;await p.reset(),await ee(),(t=y.value)==null||t.scrollToItem(0),M()},{immediate:!0}),(t,s)=>{const W=le,Y=ie,S=D,j=D,H=ce;return r(),v("div",{class:"container",ref_key:"stackViewEl",ref:G},[l(H,{size:"large",spinning:!e(R).isIdle},{default:n(()=>{var A,T;return[l(Y,{visible:e(m),"onUpdate:visible":s[1]||(s[1]=i=>F(m)?m.value=i:null),width:"70vw","mask-closable":"",onOk:s[2]||(s[2]=i=>m.value=!1)},{cancelText:n(()=>[]),default:n(()=>[l(W,{active:"",loading:!e(U).isIdle},{default:n(()=>[c("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:s[0]||(s[0]=i=>e(se)(e(b)))},[c("div",fe,a(t.$t("doubleClickToCopy")),1),u(" "+a(e(b)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),c("div",Ie,[l(S,{onClick:e(Q)},{default:n(()=>[u(a(t.$t("saveLoadedImageAsJson")),1)]),_:1},8,["onClick"]),l(S,{onClick:e(O)},{default:n(()=>[u(a(t.$t("saveAllAsJson")),1)]),_:1},8,["onClick"])]),(A=e(o))!=null&&A.length?(r(),V(e(me),{key:0,ref_key:"scroller",ref:y,class:"file-list",items:e(o),"item-size":e(h).first,"key-field":"fullpath","item-secondary-size":e(h).second,gridItems:e(N),onScroll:e(M)},{default:n(({item:i,index:$})=>[l(ue,{idx:$,file:i,"cell-width":e(q),"show-menu-idx":e(g),"onUpdate:showMenuIdx":s[3]||(s[3]=K=>F(g)?g.value=K:null),onDragstart:e(L),onDragend:e(P),onFileItemClick:e(J),"full-screen-preview-image-url":e(o)[e(d)]?e(te)(e(o)[e(d)]):"",selected:e(x).includes($),onContextMenuClick:e(k),onPreviewVisibleChange:e(E),"is-selected-mutil-files":e(x).length>1},null,8,["idx","file","cell-width","show-menu-idx","onDragstart","onDragend","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange","is-selected-mutil-files"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):e(p).load&&t.selectedTagIds.and_tags.length===1&&!((T=t.selectedTagIds.folder_paths_str)!=null&&T.trim())?(r(),v("div",ke,[c("div",Ce,[c("p",_e,a(t.$t("tagSearchNoResultsMessage")),1),l(j,{onClick:s[4]||(s[4]=i=>e(ve)()),type:"primary"},{default:n(()=>[u(a(t.$t("rebuildImageIndex")),1)]),_:1})])])):f("",!0),e(C)?(r(),v("div",we,[l(e(ae),{onClick:s[5]||(s[5]=i=>e(_)("prev")),class:z({disable:!e(w)("prev")})},null,8,["class"]),l(e(de),{onClick:s[6]||(s[6]=i=>e(_)("next")),class:z({disable:!e(w)("next")})},null,8,["class"])])):f("",!0)]}),_:1},8,["spinning"]),e(C)&&e(o)&&e(o)[e(d)]?(r(),V(re,{key:0,file:e(o)[e(d)],idx:e(d),onContextMenuClick:e(k)},null,8,["file","idx","onContextMenuClick"])):f("",!0)],512)}}});const $e=oe(he,[["__scopeId","data-v-d36b6e6b"]]);export{$e as default};

View File

@ -0,0 +1 @@
.preview-switch[data-v-479efe51]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-479efe51]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-479efe51]{opacity:0;pointer-events:none;cursor:none}.container[data-v-479efe51]{background:var(--zp-secondary-background);position:relative}.container .action-bar[data-v-479efe51]{display:flex;align-items:center;user-select:none;gap:4px;padding:4px}.container .action-bar>*[data-v-479efe51]{flex-wrap:wrap}.container .file-list[data-v-479efe51]{list-style:none;padding:8px;overflow:auto;height:calc(var(--pane-max-height) - 40px);width:100%}.container .no-res-hint[data-v-479efe51]{height:var(--pane-max-height);display:flex;align-items:center;flex-direction:column;justify-content:center}.container .no-res-hint .hint[data-v-479efe51]{font-size:1.6em;margin-bottom:2em;text-align:center}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[data-v-ecedc00a] .float-panel{position:fixed}.regex-icon[data-v-ecedc00a]{user-select:none;padding:4px;margin:0 4px;cursor:pointer;border:1px solid var(--zp-border);border-radius:4px}.regex-icon img[data-v-ecedc00a]{height:1.5em}.regex-icon[data-v-ecedc00a]:hover{background:var(--zp-border)}.regex-icon.selected[data-v-ecedc00a]{background:var(--primary-color-1);border:1px solid var(--primary-color)}.search-bar[data-v-ecedc00a]{padding:8px 8px 0;display:flex}.search-bar.last[data-v-ecedc00a]{padding-bottom:8px}.search-bar .form-name[data-v-ecedc00a]{flex-shrink:0;padding:4px 8px}.search-bar .actions>*[data-v-ecedc00a]{margin-right:4px}.preview-switch[data-v-ecedc00a]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-ecedc00a]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-ecedc00a]{opacity:0;pointer-events:none;cursor:none}.container[data-v-ecedc00a]{background:var(--zp-secondary-background);position:relative}.container .file-list[data-v-ecedc00a]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
.regex-icon[data-v-15925450]{user-select:none;padding:4px;margin:0 4px;cursor:pointer;border:1px solid var(--zp-border);border-radius:4px}.regex-icon img[data-v-15925450]{height:1.5em}.regex-icon[data-v-15925450]:hover{background:var(--zp-border)}.regex-icon.selected[data-v-15925450]{background:var(--primary-color-1);border:1px solid var(--primary-color)}.search-bar[data-v-15925450]{padding:8px 8px 0;display:flex}.search-bar.last[data-v-15925450]{padding-bottom:8px}.search-bar .form-name[data-v-15925450]{flex-shrink:0;padding:4px 8px}.search-bar .actions>*[data-v-15925450]{margin-right:4px}.preview-switch[data-v-15925450]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-15925450]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-15925450]{opacity:0;pointer-events:none;cursor:none}.container[data-v-15925450]{background:var(--zp-secondary-background)}.container .file-list[data-v-15925450]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{d as v,cd as C,bN as I,o as i,k as _,l as f,c,A as r,m as h,t as d,C as e,z,Q as F,ce as B,cf as x,Y as $,q as R}from"./index-423bec18.js";import{u as S,b as A,j as E,F as V,g as N}from"./FileItem-08fb0ce5.js";import"./functionalCallableComp-81426c02.js";import"./index-fc855220.js";import"./index-8ac7462b.js";const T={class:"actions-panel actions"},L={key:0,class:"file-list"},U={class:"hint"},j=v({__name:"batchDownload",props:{tabIdx:{},paneIdx:{},id:{}},setup(q){const{stackViewEl:w}=S().toRefs(),{itemSize:p,gridItems:k,cellWidth:b}=A(),n=E(),{selectdFiles:l}=C(n),m=I(),y=async t=>{const s=B(t);s&&n.addFiles(s.nodes)},D=async()=>{m.pushAction(async()=>{const t=await x.value.post("/zip",{paths:l.value.map(o=>o.fullpath)},{responseType:"blob"}),s=window.URL.createObjectURL(new Blob([t.data])),a=document.createElement("a");a.href=s,a.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(a),a.click()})},g=t=>{l.value.splice(t,1)};return(t,s)=>{const a=$;return i(),_("div",{class:"container",ref_key:"stackViewEl",ref:w,onDrop:y},[f("div",T,[c(a,{onClick:s[0]||(s[0]=o=>e(n).selectdFiles=[])},{default:r(()=>[h(d(t.$t("clear")),1)]),_:1}),c(a,{onClick:D,type:"primary",loading:!e(m).isIdle},{default:r(()=>[h(d(t.$t("zipDownload")),1)]),_:1},8,["loading"])]),e(l).length?(i(),z(e(N),{key:1,ref:"scroller",class:"file-list",items:e(l).slice(),"item-size":e(p).first,"key-field":"fullpath","item-secondary-size":e(p).second,gridItems:e(k)},{default:r(({item:o,index:u})=>[c(V,{idx:u,file:o,"cell-width":e(b),"enable-close-icon":"",onCloseIconClick:H=>g(u),"full-screen-preview-image-url":e(F)(o),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","onCloseIconClick","full-screen-preview-image-url"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):(i(),_("div",L,[f("p",U,d(t.$t("batchDownloaDDragAndDropHint")),1)]))],544)}}});const J=R(j,[["__scopeId","data-v-aab31da2"]]);export{J as default}; import{d as v,cd as C,bN as I,o as i,k as _,l as f,c,A as r,m as h,t as d,B as e,z,Q as B,ce as F,cf as x,Y as $,q as R}from"./index-50eccecb.js";import{u as S,b as A,k as E,F as V,h as N}from"./FileItem-17604ae5.js";import"./functionalCallableComp-07abeb37.js";import"./index-25e23286.js";import"./index-d087ab29.js";const T={class:"actions-panel actions"},L={key:0,class:"file-list"},U={class:"hint"},q=v({__name:"batchDownload",props:{tabIdx:{},paneIdx:{},id:{}},setup(H){const{stackViewEl:k}=S().toRefs(),{itemSize:p,gridItems:w,cellWidth:b}=A(),n=E(),{selectdFiles:l}=C(n),m=I(),y=async t=>{const s=F(t);s&&n.addFiles(s.nodes)},D=async()=>{m.pushAction(async()=>{const t=await x.value.post("/zip",{paths:l.value.map(o=>o.fullpath)},{responseType:"blob"}),s=window.URL.createObjectURL(new Blob([t.data])),a=document.createElement("a");a.href=s,a.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(a),a.click()})},g=t=>{l.value.splice(t,1)};return(t,s)=>{const a=$;return i(),_("div",{class:"container",ref_key:"stackViewEl",ref:k,onDrop:y},[f("div",T,[c(a,{onClick:s[0]||(s[0]=o=>e(n).selectdFiles=[])},{default:r(()=>[h(d(t.$t("clear")),1)]),_:1}),c(a,{onClick:D,type:"primary",loading:!e(m).isIdle},{default:r(()=>[h(d(t.$t("zipDownload")),1)]),_:1},8,["loading"])]),e(l).length?(i(),z(e(N),{key:1,ref:"scroller",class:"file-list",items:e(l).slice(),"item-size":e(p).first,"key-field":"fullpath","item-secondary-size":e(p).second,gridItems:e(w)},{default:r(({item:o,index:u})=>[c(V,{idx:u,file:o,"cell-width":e(b),"enable-close-icon":"",onCloseIconClick:Q=>g(u),"full-screen-preview-image-url":e(B)(o),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","onCloseIconClick","full-screen-preview-image-url"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):(i(),_("div",L,[f("p",U,d(t.$t("batchDownloaDDragAndDropHint")),1)]))],544)}}});const J=R(q,[["__scopeId","data-v-aab31da2"]]);export{J as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{u as w,b as k,F as y,g as x}from"./FileItem-08fb0ce5.js";import{d as F,r as h,c5 as C,v as D,aS as I,aW as b,o as E,k as S,c,A as V,C as e,Q as z,ce as B,cg as A,q as R}from"./index-423bec18.js";import"./functionalCallableComp-81426c02.js";import"./index-fc855220.js";import"./index-8ac7462b.js";const q=F({__name:"gridView",props:{tabIdx:{},paneIdx:{},id:{},removable:{type:Boolean},allowDragAndDrop:{type:Boolean},files:{},paneKey:{}},setup(p){const o=p,d=h(),{stackViewEl:m}=w().toRefs(),{itemSize:i,gridItems:u,cellWidth:f}=k(),g=C(),s=D(o.files??[]),_=async a=>{const l=B(a);o.allowDragAndDrop&&l&&(s.value=A([...s.value,...l.nodes]))},v=a=>{s.value.splice(a,1)};return I(()=>{d.pageFuncExportMap.set(o.paneKey,{getFiles:()=>b(s.value),setFiles:a=>s.value=a})}),(a,l)=>(E(),S("div",{class:"container",ref_key:"stackViewEl",ref:m,onDrop:_},[c(e(x),{ref:"scroller",class:"file-list",items:s.value.slice(),"item-size":e(i).first,"key-field":"fullpath","item-secondary-size":e(i).second,gridItems:e(u)},{default:V(({item:t,index:r})=>{var n;return[c(y,{idx:r,file:t,"cell-width":e(f),"enable-close-icon":o.removable,onCloseIconClick:K=>v(r),"full-screen-preview-image-url":e(z)(t),"extra-tags":(n=t==null?void 0:t.tags)==null?void 0:n.map(e(g).tagConvert),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","enable-close-icon","onCloseIconClick","full-screen-preview-image-url","extra-tags"])]}),_:1},8,["items","item-size","item-secondary-size","gridItems"])],544))}});const M=R(q,[["__scopeId","data-v-f35f4802"]]);export{M as default}; import{u as w,b as k,F as y,h as x}from"./FileItem-17604ae5.js";import{d as h,r as F,c5 as D,v as I,aS as b,aW as C,o as E,k as S,c,A as V,B as e,Q as z,ce as B,cg as A,q as R}from"./index-50eccecb.js";import"./functionalCallableComp-07abeb37.js";import"./index-25e23286.js";import"./index-d087ab29.js";const q=h({__name:"gridView",props:{tabIdx:{},paneIdx:{},id:{},removable:{type:Boolean},allowDragAndDrop:{type:Boolean},files:{},paneKey:{}},setup(p){const o=p,d=F(),{stackViewEl:m}=w().toRefs(),{itemSize:i,gridItems:u,cellWidth:f}=k(),g=D(),s=I(o.files??[]),_=async a=>{const l=B(a);o.allowDragAndDrop&&l&&(s.value=A([...s.value,...l.nodes]))},v=a=>{s.value.splice(a,1)};return b(()=>{d.pageFuncExportMap.set(o.paneKey,{getFiles:()=>C(s.value),setFiles:a=>s.value=a})}),(a,l)=>(E(),S("div",{class:"container",ref_key:"stackViewEl",ref:m,onDrop:_},[c(e(x),{ref:"scroller",class:"file-list",items:s.value.slice(),"item-size":e(i).first,"key-field":"fullpath","item-secondary-size":e(i).second,gridItems:e(u)},{default:V(({item:t,index:r})=>{var n;return[c(y,{idx:r,file:t,"cell-width":e(f),"enable-close-icon":o.removable,onCloseIconClick:K=>v(r),"full-screen-preview-image-url":e(z)(t),"extra-tags":(n=t==null?void 0:t.tags)==null?void 0:n.map(e(g).tagConvert),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","enable-close-icon","onCloseIconClick","full-screen-preview-image-url","extra-tags"])]}),_:1},8,["items","item-size","item-secondary-size","gridItems"])],544))}});const M=R(q,[["__scopeId","data-v-f35f4802"]]);export{M as default};

View File

@ -1 +1 @@
import{bd as F,v as g,b$ as R,c0 as x,aj as A,ag as q,bN as D,b3 as j,c1 as z}from"./index-423bec18.js";import{u as G,b as L,f as O,c as Q,d as H,e as T,h as U}from"./FileItem-08fb0ce5.js";let W=0;const $=()=>++W,B=(o,c,{dataUpdateStrategy:l="replace"}={})=>{const n=F([""]),u=g(!1),t=g(),a=g(!1);let f=g(-1);const v=new Set,w=e=>{var s;l==="replace"?t.value=e:l==="merge"&&(A((Array.isArray(t.value)||typeof t.value>"u")&&Array.isArray(e),"数据更新策略为合并时仅可用于值为数组的情况"),t.value=[...(s=t==null?void 0:t.value)!==null&&s!==void 0?s:[],...e])},d=e=>x(void 0,void 0,void 0,function*(){if(a.value||u.value&&typeof e>"u")return!1;a.value=!0;const s=$();f.value=s;try{let r;if(typeof e=="number"){if(r=n[e],typeof r!="string")return!1}else r=n[n.length-1];const m=yield o(r);if(v.has(s))return v.delete(s),!1;w(c(m));const i=m.cursor;if((e===n.length-1||typeof e!="number")&&(u.value=!i.has_next,i.has_next)){const p=i.next_cursor||i.next;A(typeof p=="string"),n.push(p)}}finally{f.value===s&&(a.value=!1)}return!0}),h=()=>{v.add(f.value),a.value=!1},S=(e=!1)=>x(void 0,void 0,void 0,function*(){const{refetch:s,force:r}=typeof e=="object"?e:{refetch:e};r&&h(),A(!a.value),n.splice(0,n.length,""),a.value=!1,t.value=void 0,u.value=!1,s&&(yield d())}),I=()=>({next:()=>x(void 0,void 0,void 0,function*(){if(a.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return R({abort:h,load:u,next:d,res:t,loading:a,cursorStack:n,reset:S,[Symbol.asyncIterator]:I,iter:{[Symbol.asyncIterator]:I}})},Y=o=>F(B(o,c=>c.files,{dataUpdateStrategy:"merge"})),Z=o=>{const c=F(new Set),l=q(()=>(o.res??[]).filter(y=>!c.has(y.fullpath))),n=D(),{stackViewEl:u,multiSelectedIdxs:t,stack:a,scroller:f}=G({images:l}).toRefs(),{itemSize:v,gridItems:w,cellWidth:d,onScroll:h}=L({fetchNext:()=>o.next()}),{showMenuIdx:S}=O(),{onFileDragStart:I,onFileDragEnd:e}=Q(),{showGenInfo:s,imageGenInfo:r,q:m,onContextMenuClick:i,onFileItemClick:p}=H({openNext:j}),{previewIdx:C,previewing:_,onPreviewVisibleChange:E,previewImgMove:M,canPreview:J}=T(),N=async(y,b,P)=>{a.value=[{curr:"",files:l.value}],await i(y,b,P)};U("removeFiles",async({paths:y})=>{y.forEach(b=>c.add(b))});const k=()=>{z(l.value)};return{images:l,scroller:f,queue:n,iter:o,onContextMenuClickU:N,stackViewEl:u,previewIdx:C,previewing:_,onPreviewVisibleChange:E,previewImgMove:M,canPreview:J,itemSize:v,gridItems:w,showGenInfo:s,imageGenInfo:r,q:m,onContextMenuClick:i,onFileItemClick:p,showMenuIdx:S,multiSelectedIdxs:t,onFileDragStart:I,onFileDragEnd:e,cellWidth:d,onScroll:h,saveLoadedFileAsJson:k,saveAllFileAsJson:async()=>{for(;!o.load;)await o.next();k()}}};export{Y as c,Z as u}; import{bd as F,v as g,b$ as R,c0 as x,aj as A,ag as q,bN as D,b3 as j,c1 as z}from"./index-50eccecb.js";import{u as G,b as L,f as O,c as Q,d as H,e as T,i as U}from"./FileItem-17604ae5.js";let W=0;const $=()=>++W,B=(o,c,{dataUpdateStrategy:l="replace"}={})=>{const n=F([""]),u=g(!1),t=g(),a=g(!1);let f=g(-1);const v=new Set,w=e=>{var s;l==="replace"?t.value=e:l==="merge"&&(A((Array.isArray(t.value)||typeof t.value>"u")&&Array.isArray(e),"数据更新策略为合并时仅可用于值为数组的情况"),t.value=[...(s=t==null?void 0:t.value)!==null&&s!==void 0?s:[],...e])},d=e=>x(void 0,void 0,void 0,function*(){if(a.value||u.value&&typeof e>"u")return!1;a.value=!0;const s=$();f.value=s;try{let r;if(typeof e=="number"){if(r=n[e],typeof r!="string")return!1}else r=n[n.length-1];const m=yield o(r);if(v.has(s))return v.delete(s),!1;w(c(m));const i=m.cursor;if((e===n.length-1||typeof e!="number")&&(u.value=!i.has_next,i.has_next)){const p=i.next_cursor||i.next;A(typeof p=="string"),n.push(p)}}finally{f.value===s&&(a.value=!1)}return!0}),h=()=>{v.add(f.value),a.value=!1},S=(e=!1)=>x(void 0,void 0,void 0,function*(){const{refetch:s,force:r}=typeof e=="object"?e:{refetch:e};r&&h(),A(!a.value),n.splice(0,n.length,""),a.value=!1,t.value=void 0,u.value=!1,s&&(yield d())}),I=()=>({next:()=>x(void 0,void 0,void 0,function*(){if(a.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return R({abort:h,load:u,next:d,res:t,loading:a,cursorStack:n,reset:S,[Symbol.asyncIterator]:I,iter:{[Symbol.asyncIterator]:I}})},Y=o=>F(B(o,c=>c.files,{dataUpdateStrategy:"merge"})),Z=o=>{const c=F(new Set),l=q(()=>(o.res??[]).filter(y=>!c.has(y.fullpath))),n=D(),{stackViewEl:u,multiSelectedIdxs:t,stack:a,scroller:f}=G({images:l}).toRefs(),{itemSize:v,gridItems:w,cellWidth:d,onScroll:h}=L({fetchNext:()=>o.next()}),{showMenuIdx:S}=O(),{onFileDragStart:I,onFileDragEnd:e}=Q(),{showGenInfo:s,imageGenInfo:r,q:m,onContextMenuClick:i,onFileItemClick:p}=H({openNext:j}),{previewIdx:C,previewing:_,onPreviewVisibleChange:E,previewImgMove:M,canPreview:J}=T(),N=async(y,b,P)=>{a.value=[{curr:"",files:l.value}],await i(y,b,P)};U("removeFiles",async({paths:y})=>{y.forEach(b=>c.add(b))});const k=()=>{z(l.value)};return{images:l,scroller:f,queue:n,iter:o,onContextMenuClickU:N,stackViewEl:u,previewIdx:C,previewing:_,onPreviewVisibleChange:E,previewImgMove:M,canPreview:J,itemSize:v,gridItems:w,showGenInfo:s,imageGenInfo:r,q:m,onContextMenuClick:i,onFileItemClick:p,showMenuIdx:S,multiSelectedIdxs:t,onFileDragStart:I,onFileDragEnd:e,cellWidth:d,onScroll:h,saveLoadedFileAsJson:k,saveAllFileAsJson:async()=>{for(;!o.load;)await o.next();k()}}};export{Y as c,Z as u};

View File

@ -1 +1 @@
import{d as E,bg as $,v as f,s as M,_ as T,a as c,a1 as W,h as g,c as v,P as z}from"./index-423bec18.js";var G=["prefixCls","name","id","type","disabled","readonly","tabindex","autofocus","value","required"],H={prefixCls:String,name:String,id:String,type:String,defaultChecked:{type:[Boolean,Number],default:void 0},checked:{type:[Boolean,Number],default:void 0},disabled:Boolean,tabindex:{type:[Number,String]},readonly:Boolean,autofocus:Boolean,value:z.any,required:Boolean};const L=E({compatConfig:{MODE:3},name:"Checkbox",inheritAttrs:!1,props:$(H,{prefixCls:"rc-checkbox",type:"checkbox",defaultChecked:!1}),emits:["click","change"],setup:function(a,d){var t=d.attrs,h=d.emit,x=d.expose,o=f(a.checked===void 0?a.defaultChecked:a.checked),i=f();M(function(){return a.checked},function(){o.value=a.checked}),x({focus:function(){var e;(e=i.value)===null||e===void 0||e.focus()},blur:function(){var e;(e=i.value)===null||e===void 0||e.blur()}});var l=f(),m=function(e){if(!a.disabled){a.checked===void 0&&(o.value=e.target.checked),e.shiftKey=l.value;var r={target:c(c({},a),{},{checked:e.target.checked}),stopPropagation:function(){e.stopPropagation()},preventDefault:function(){e.preventDefault()},nativeEvent:e};a.checked!==void 0&&(i.value.checked=!!a.checked),h("change",r),l.value=!1}},C=function(e){h("click",e),l.value=e.shiftKey};return function(){var n,e=a.prefixCls,r=a.name,s=a.id,p=a.type,b=a.disabled,K=a.readonly,P=a.tabindex,B=a.autofocus,S=a.value,N=a.required,_=T(a,G),q=t.class,D=t.onFocus,j=t.onBlur,w=t.onKeydown,A=t.onKeypress,F=t.onKeyup,y=c(c({},_),t),O=Object.keys(y).reduce(function(k,u){return(u.substr(0,5)==="aria-"||u.substr(0,5)==="data-"||u==="role")&&(k[u]=y[u]),k},{}),R=W(e,q,(n={},g(n,"".concat(e,"-checked"),o.value),g(n,"".concat(e,"-disabled"),b),n)),V=c(c({name:r,id:s,type:p,readonly:K,disabled:b,tabindex:P,class:"".concat(e,"-input"),checked:!!o.value,autofocus:B,value:S},O),{},{onChange:m,onClick:C,onFocus:D,onBlur:j,onKeydown:w,onKeypress:A,onKeyup:F,required:N});return v("span",{class:R},[v("input",c({ref:i},V),null),v("span",{class:"".concat(e,"-inner")},null)])}}});export{L as V}; import{d as E,bg as $,v as f,s as M,_ as T,a as c,a1 as W,h as g,c as v,P as z}from"./index-50eccecb.js";var G=["prefixCls","name","id","type","disabled","readonly","tabindex","autofocus","value","required"],H={prefixCls:String,name:String,id:String,type:String,defaultChecked:{type:[Boolean,Number],default:void 0},checked:{type:[Boolean,Number],default:void 0},disabled:Boolean,tabindex:{type:[Number,String]},readonly:Boolean,autofocus:Boolean,value:z.any,required:Boolean};const L=E({compatConfig:{MODE:3},name:"Checkbox",inheritAttrs:!1,props:$(H,{prefixCls:"rc-checkbox",type:"checkbox",defaultChecked:!1}),emits:["click","change"],setup:function(a,d){var t=d.attrs,h=d.emit,x=d.expose,o=f(a.checked===void 0?a.defaultChecked:a.checked),i=f();M(function(){return a.checked},function(){o.value=a.checked}),x({focus:function(){var e;(e=i.value)===null||e===void 0||e.focus()},blur:function(){var e;(e=i.value)===null||e===void 0||e.blur()}});var l=f(),m=function(e){if(!a.disabled){a.checked===void 0&&(o.value=e.target.checked),e.shiftKey=l.value;var r={target:c(c({},a),{},{checked:e.target.checked}),stopPropagation:function(){e.stopPropagation()},preventDefault:function(){e.preventDefault()},nativeEvent:e};a.checked!==void 0&&(i.value.checked=!!a.checked),h("change",r),l.value=!1}},C=function(e){h("click",e),l.value=e.shiftKey};return function(){var n,e=a.prefixCls,r=a.name,s=a.id,p=a.type,b=a.disabled,K=a.readonly,P=a.tabindex,B=a.autofocus,S=a.value,N=a.required,_=T(a,G),q=t.class,D=t.onFocus,j=t.onBlur,w=t.onKeydown,A=t.onKeypress,F=t.onKeyup,y=c(c({},_),t),O=Object.keys(y).reduce(function(k,u){return(u.substr(0,5)==="aria-"||u.substr(0,5)==="data-"||u==="role")&&(k[u]=y[u]),k},{}),R=W(e,q,(n={},g(n,"".concat(e,"-checked"),o.value),g(n,"".concat(e,"-disabled"),b),n)),V=c(c({name:r,id:s,type:p,readonly:K,disabled:b,tabindex:P,class:"".concat(e,"-input"),checked:!!o.value,autofocus:B,value:S},O),{},{onChange:m,onClick:C,onFocus:D,onBlur:j,onKeydown:w,onKeypress:A,onKeyup:F,required:N});return v("span",{class:R},[v("input",c({ref:i},V),null),v("span",{class:"".concat(e,"-inner")},null)])}}});export{L as V};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
vue/dist/assets/stackView-c75169c6.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
.ant-breadcrumb{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";color:#00000073;font-size:14px}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb a{color:#00000073;transition:color .3s}.ant-breadcrumb a:hover{color:#de632f}.ant-breadcrumb>span:last-child{color:#000000d9}.ant-breadcrumb>span:last-child a{color:#000000d9}.ant-breadcrumb>span:last-child .ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:#00000073}.ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-link>.anticon+a{margin-left:4px}.ant-breadcrumb-overlay-link>.anticon{margin-left:4px}.ant-breadcrumb-rtl{direction:rtl}.ant-breadcrumb-rtl:before{display:table;content:""}.ant-breadcrumb-rtl:after{display:table;clear:both;content:""}.ant-breadcrumb-rtl>span{float:right}.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+a{margin-right:4px;margin-left:0}.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link>.anticon{margin-right:4px;margin-left:0}.nprogress{pointer-events:none}.nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}.nprogress .peg{display:block;position:absolute;right:0px;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translateY(-4px)}.nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}.nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent .nprogress .spinner,.nprogress-custom-parent .nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.base-info[data-v-afd25667]{position:absolute;padding:4px;font-size:.8em;background:var(--zp-primary-background);color:var(--zp-primary);left:0;bottom:0;border-top-right-radius:4px}.preview-switch[data-v-f2221f9e]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-f2221f9e]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-f2221f9e]{opacity:0;pointer-events:none;cursor:none}.location-act[data-v-f2221f9e]{margin-left:8px}.location-act .copy[data-v-f2221f9e]{margin-right:4px}@media (max-width: 768px){.location-act[data-v-f2221f9e]{display:flex;flex-direction:column}.location-act>*[data-v-f2221f9e],.location-act .copy[data-v-f2221f9e]{margin:2px}}.breadcrumb[data-v-f2221f9e]{display:flex;align-items:center}.breadcrumb>*[data-v-f2221f9e]{margin-right:4px}@media (max-width: 768px){.breadcrumb[data-v-f2221f9e]{width:100%}.breadcrumb .ant-breadcrumb>*[data-v-f2221f9e]{display:inline-block}}.container[data-v-f2221f9e]{background:var(--zp-secondary-background);height:var(--pane-max-height)}.location-bar[data-v-f2221f9e]{padding:4px 16px;background:var(--zp-primary-background);border-bottom:1px solid var(--zp-border);display:flex;align-items:center;justify-content:space-between}@media (max-width: 768px){.location-bar[data-v-f2221f9e]{flex-direction:column}.location-bar[data-v-f2221f9e] ::-webkit-scrollbar{height:2px;background-color:var(--zp-secondary-variant-background)}.location-bar .actions[data-v-f2221f9e]{padding:4px 0;width:100%;overflow:auto;display:flex;align-items:center}.location-bar .actions>*[data-v-f2221f9e]{flex-shrink:0}}.location-bar .actions[data-v-f2221f9e]{display:flex;align-items:center;flex-shrink:0}.location-bar a.opt[data-v-f2221f9e]{margin-left:8px}.view[data-v-f2221f9e]{padding:8px;height:calc(100vh - 48px)}.view .file-list[data-v-f2221f9e]{list-style:none;padding:8px;height:100%;overflow:auto}.hint[data-v-f2221f9e]{padding:4px;border:4px;background:var(--zp-secondary-background);border:1px solid var(--zp-border)} .ant-breadcrumb{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";color:#00000073;font-size:14px}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb a{color:#00000073;transition:color .3s}.ant-breadcrumb a:hover{color:#de632f}.ant-breadcrumb>span:last-child{color:#000000d9}.ant-breadcrumb>span:last-child a{color:#000000d9}.ant-breadcrumb>span:last-child .ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:#00000073}.ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-link>.anticon+a{margin-left:4px}.ant-breadcrumb-overlay-link>.anticon{margin-left:4px}.ant-breadcrumb-rtl{direction:rtl}.ant-breadcrumb-rtl:before{display:table;content:""}.ant-breadcrumb-rtl:after{display:table;clear:both;content:""}.ant-breadcrumb-rtl>span{float:right}.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+a{margin-right:4px;margin-left:0}.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link>.anticon{margin-right:4px;margin-left:0}.nprogress{pointer-events:none}.nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}.nprogress .peg{display:block;position:absolute;right:0px;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translateY(-4px)}.nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}.nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent .nprogress .spinner,.nprogress-custom-parent .nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.base-info[data-v-afd25667]{position:absolute;padding:4px;font-size:.8em;background:var(--zp-primary-background);color:var(--zp-primary);left:0;bottom:0;border-top-right-radius:4px}.preview-switch[data-v-e49f51b8]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-e49f51b8]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-e49f51b8]{opacity:0;pointer-events:none;cursor:none}.location-act[data-v-e49f51b8]{margin-left:8px}.location-act .copy[data-v-e49f51b8]{margin-right:4px}@media (max-width: 768px){.location-act[data-v-e49f51b8]{display:flex;flex-direction:column}.location-act>*[data-v-e49f51b8],.location-act .copy[data-v-e49f51b8]{margin:2px}}.breadcrumb[data-v-e49f51b8]{display:flex;align-items:center}.breadcrumb>*[data-v-e49f51b8]{margin-right:4px}@media (max-width: 768px){.breadcrumb[data-v-e49f51b8]{width:100%}.breadcrumb .ant-breadcrumb>*[data-v-e49f51b8]{display:inline-block}}.container[data-v-e49f51b8]{background:var(--zp-secondary-background);height:var(--pane-max-height)}.location-bar[data-v-e49f51b8]{padding:4px 16px;background:var(--zp-primary-background);border-bottom:1px solid var(--zp-border);display:flex;align-items:center;justify-content:space-between}@media (max-width: 768px){.location-bar[data-v-e49f51b8]{flex-direction:column}.location-bar[data-v-e49f51b8] ::-webkit-scrollbar{height:2px;background-color:var(--zp-secondary-variant-background)}.location-bar .actions[data-v-e49f51b8]{padding:4px 0;width:100%;overflow:auto;display:flex;align-items:center}.location-bar .actions>*[data-v-e49f51b8]{flex-shrink:0}}.location-bar .actions[data-v-e49f51b8]{display:flex;align-items:center;flex-shrink:0}.location-bar a.opt[data-v-e49f51b8]{margin-left:8px}.view[data-v-e49f51b8]{padding:8px;height:calc(100vh - 48px)}.view .file-list[data-v-e49f51b8]{list-style:none;padding:8px;height:100%;overflow:auto}.hint[data-v-e49f51b8]{padding:4px;border:4px;background:var(--zp-secondary-background);border:1px solid var(--zp-border)}

2
vue/dist/index.html vendored
View File

@ -7,7 +7,7 @@
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Infinite Image Browsing</title> <title>Infinite Image Browsing</title>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-423bec18.js"></script> <script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-50eccecb.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-4ed4b1ce.css"> <link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-4ed4b1ce.css">
</head> </head>

View File

@ -0,0 +1,51 @@
<script setup lang="ts">
import { useGlobalStore } from '@/store/useGlobalStore'
defineProps<{
show: boolean
}>()
const emit = defineEmits<{
selectAll: [],
reverseSelect: [],
clearAllSelected: []
}>()
const g = useGlobalStore()
const onExit = () => {
emit('clearAllSelected')
g.keepMultiSelect = false
}
const onKeepClick = () => {
g.keepMultiSelect = true
}
</script>
<template>
<div class="float-panel" v-if="show">
<div v-if="g.keepMultiSelect" class="select-actions">
<a-button size="small" @click="emit('selectAll')">{{ $t('select-all') }}</a-button>
<a-button size="small" @click="emit('reverseSelect')">{{ $t('rerverse-select') }}</a-button>
<a-button size="small" @click="emit('clearAllSelected')">{{ $t('clear-all-selected') }}</a-button>
<a-button size="small" @click="onExit">{{ $t('exit') }}</a-button>
</div>
<div v-else>
<a-button size="small" type="primary" @click="onKeepClick">{{ $t('keep-multi-selected') }}</a-button>
</div>
</div>
</template>
<style lang="scss" scoped>
.select-actions > :not(:last-child) {
margin-right: 4px;
}
.float-panel {
position: absolute;
bottom: 32px;
right: 32px;
background: white;
border-radius: 4px;
z-index: 1000;
padding: 8px;
box-shadow: 0px 0px 4px var(--zp-secondary);
}
</style>

View File

@ -1,6 +1,11 @@
import type { IIBI18nMap } from '.' import type { IIBI18nMap } from '.'
export const en: IIBI18nMap = { export const en: IIBI18nMap = {
exit: 'Exit',
'select-all': 'Select All',
'rerverse-select': 'Reverse Select',
'clear-all-selected': 'Clear All Selected',
'keep-multi-selected': 'Keep Multi-selected',
'Source Identifier': 'Source', 'Source Identifier': 'Source',
openWithDefaultApp: 'Open with default app', openWithDefaultApp: 'Open with default app',
saveSelectedAsJson: 'Save selected image info', saveSelectedAsJson: 'Save selected image info',
@ -8,7 +13,7 @@ export const en: IIBI18nMap = {
saveLoadedImageAsJson: 'Save loaded image info', saveLoadedImageAsJson: 'Save loaded image info',
selectedItems: ' {0} selected', selectedItems: ' {0} selected',
items: '{0} items', items: '{0} items',
scrollDownToComparePrompt: "Scroll down to compare prompts", scrollDownToComparePrompt: 'Scroll down to compare prompts',
sourceText: 'Source Text', sourceText: 'Source Text',
structuredData: 'Structured Data', structuredData: 'Structured Data',
searchScope: 'Search Scope', searchScope: 'Search Scope',
@ -31,14 +36,14 @@ export const en: IIBI18nMap = {
archive: 'Archive', archive: 'Archive',
zipDownload: 'Download as ZIP', zipDownload: 'Download as ZIP',
batchDownloaDDragAndDropHint: batchDownloaDDragAndDropHint:
"Use drag and drop or the 'Send to Batch Download' option in the right-click menu to add images from other pages here. Multiple selections are supported.", 'Use drag and drop or the \'Send to Batch Download\' option in the right-click menu to add images from other pages here. Multiple selections are supported.',
lyco: 'LyCORIS', lyco: 'LyCORIS',
sendToThirdPartyExtension: 'Send to third-party extension', sendToThirdPartyExtension: 'Send to third-party extension',
createFolder: 'Create Folder', createFolder: 'Create Folder',
inputFolderName: 'Input Folder Name', inputFolderName: 'Input Folder Name',
desktop: 'Desktop', desktop: 'Desktop',
move: 'Move', move: 'Move',
majorUpdateCustomCellSizeTips: `Major Update: You can now customize the size of the grid image. Adjust it in the global settings page or in the "More" menu in the upper right corner.`, majorUpdateCustomCellSizeTips: 'Major Update: You can now customize the size of the grid image. Adjust it in the global settings page or in the "More" menu in the upper right corner.',
ImageBrowsingSettings: 'Image Browsing Settings', ImageBrowsingSettings: 'Image Browsing Settings',
other: 'Other', other: 'Other',
livePreview: 'Live Preview', livePreview: 'Live Preview',
@ -89,7 +94,7 @@ export const en: IIBI18nMap = {
defaultSortingMethod: 'Default Sorting Method', defaultSortingMethod: 'Default Sorting Method',
defaultViewMode: 'Default View Mode', defaultViewMode: 'Default View Mode',
showPreviewImage: 'Show Preview Image', showPreviewImage: 'Show Preview Image',
dontShowAgain: "Don't show again", dontShowAgain: 'Don\'t show again',
accessControlModeTips: accessControlModeTips:
'To ensure data security, you are currently running in access control mode, which only allows access to authorized folders. You can adjust the access permissions settings (IIB_ACCESS_CONTROL) by editing the .env file in the root directory of this extension. If the .env file does not exist, you can copy the .env.example file and rename it to .env.', 'To ensure data security, you are currently running in access control mode, which only allows access to authorized folders. You can adjust the access permissions settings (IIB_ACCESS_CONTROL) by editing the .env file in the root directory of this extension. If the .env file does not exist, you can copy the .env.example file and rename it to .env.',
changlog: 'Change log', changlog: 'Change log',
@ -121,7 +126,7 @@ export const en: IIBI18nMap = {
'index.expired': 'Index expired, updating automatically', 'index.expired': 'Index expired, updating automatically',
manualExitFullScreen: manualExitFullScreen:
'You have deleted the last image and may need to manually exit Full-screen view', 'You have deleted the last image and may need to manually exit Full-screen view',
'walk-mode-move-message': "Moving position is only allowed using 'Quick Move' in walk mode", 'walk-mode-move-message': 'Moving position is only allowed using \'Quick Move\' in walk mode',
refreshCompleted: 'Refresh completed', refreshCompleted: 'Refresh completed',
//! MissingTranslations //! MissingTranslations
addedTagToImage: 'Tag "{tag}" has been added to this image', addedTagToImage: 'Tag "{tag}" has been added to this image',
@ -148,7 +153,7 @@ export const en: IIBI18nMap = {
lora: 'LoRA', lora: 'LoRA',
size: 'Size', size: 'Size',
pos: 'Positive Prompt', pos: 'Positive Prompt',
unknownSavedDir: `Cannot find the saved folder (outdir_save field in the config)`, unknownSavedDir: 'Cannot find the saved folder (outdir_save field in the config)',
errorOccurred: 'An error occurred', errorOccurred: 'An error occurred',
useThumbnailPreview: 'Use thumbnail preview', useThumbnailPreview: 'Use thumbnail preview',
gridThumbnailWidth: 'Grid thumbnail width', gridThumbnailWidth: 'Grid thumbnail width',

View File

@ -1,12 +1,17 @@
export const zhHans = { export const zhHans = {
exit: '退出',
'select-all': '全选',
'rerverse-select': '反选',
'clear-all-selected': '清除所有选择',
'keep-multi-selected': '保留多选',
'Source Identifier': '来源', 'Source Identifier': '来源',
openWithDefaultApp: '使用默认应用打开', openWithDefaultApp: '使用默认应用打开',
saveSelectedAsJson: '保存选中图像信息', saveSelectedAsJson: '保存选中图像信息',
saveAllAsJson: '保存所有图像信息', saveAllAsJson: '保存所有图像信息',
saveLoadedImageAsJson: '保存已加载的图像信息', saveLoadedImageAsJson: '保存已加载的图像信息',
items: "{0}个项目", items: '{0}个项目',
selectedItems: "已选择{0}个项目", selectedItems: '已选择{0}个项目',
scrollDownToComparePrompt: "向下滚查看Prompt比较", scrollDownToComparePrompt: '向下滚查看Prompt比较',
sourceText: '源文本', sourceText: '源文本',
structuredData: '结构化数据', structuredData: '结构化数据',
searchScope: '搜索范围', searchScope: '搜索范围',
@ -185,7 +190,7 @@ export const zhHans = {
livePreview: '实时预览', livePreview: '实时预览',
other: '其他', other: '其他',
ImageBrowsingSettings: '图像浏览设置', ImageBrowsingSettings: '图像浏览设置',
majorUpdateCustomCellSizeTips: `重大更新:你可以自定义网格图像的大小了,在全局设置页或者右上角的“更多”里面进行调整`, majorUpdateCustomCellSizeTips: '重大更新:你可以自定义网格图像的大小了,在全局设置页或者右上角的“更多”里面进行调整',
desktop: '桌面', desktop: '桌面',
move: '移动', move: '移动',
inputFolderName: '输入文件夹名', inputFolderName: '输入文件夹名',

View File

@ -1,13 +1,18 @@
import type { IIBI18nMap } from '.' import type { IIBI18nMap } from '.'
export const zhHant: Partial<IIBI18nMap> = { export const zhHant: Partial<IIBI18nMap> = {
exit: '退出',
'select-all': '全選',
'rerverse-select': '反選',
'clear-all-selected': '清除所有選擇',
'keep-multi-selected': '保留多選',
'Source Identifier': '來源', 'Source Identifier': '來源',
openWithDefaultApp: '使用預設應用程式開啟', openWithDefaultApp: '使用預設應用程式開啟',
saveSelectedAsJson: '儲存選取的圖像資訊', saveSelectedAsJson: '儲存選取的圖像資訊',
saveAllAsJson: '儲存所有圖像資訊', saveAllAsJson: '儲存所有圖像資訊',
saveLoadedImageAsJson: '儲存已載入的圖像資訊', saveLoadedImageAsJson: '儲存已載入的圖像資訊',
showChangeIndicators: '顯示變更指示器', showChangeIndicators: '顯示變更指示器',
scrollDownToComparePrompt: "向下滾查看Prompt比較", scrollDownToComparePrompt: '向下滾查看Prompt比較',
sourceText: '源文本', sourceText: '源文本',
structuredData: '結構化數據', structuredData: '結構化數據',
searchScope: '搜尋範圍', searchScope: '搜尋範圍',

View File

@ -11,6 +11,8 @@ import fullScreenContextMenu from '@/page/fileTransfer/fullScreenContextMenu.vue
import { LeftCircleOutlined, RightCircleOutlined } from '@/icon' import { LeftCircleOutlined, RightCircleOutlined } from '@/icon'
import { useImageSearch, createImageSearchIter } from './hook' import { useImageSearch, createImageSearchIter } from './hook'
import { openRebuildImageIndexModal } from '@/components/functionalCallableComp' import { openRebuildImageIndexModal } from '@/components/functionalCallableComp'
import { useGlobalStore } from '@/store/useGlobalStore'
import { useKeepMultiSelect } from '../fileTransfer/hook'
const props = defineProps<{ const props = defineProps<{
tabIdx: number tabIdx: number
@ -57,9 +59,15 @@ watch(
}, },
{ immediate: true } { immediate: true }
) )
const g = useGlobalStore()
const { onClearAllSelected, onSelectAll, onReverseSelect } = useKeepMultiSelect()
</script> </script>
<template> <template>
<div class="container" ref="stackViewEl"> <div class="container" ref="stackViewEl">
<MultiSelectKeep :show="!!multiSelectedIdxs.length || g.keepMultiSelect"
@clear-all-selected="onClearAllSelected" @select-all="onSelectAll" @reverse-select="onReverseSelect"/>
<ASpin size="large" :spinning="!queue.isIdle"> <ASpin size="large" :spinning="!queue.isIdle">
<AModal v-model:visible="showGenInfo" width="70vw" mask-closable @ok="showGenInfo = false"> <AModal v-model:visible="showGenInfo" width="70vw" mask-closable @ok="showGenInfo = false">
<template #cancelText /> <template #cancelText />
@ -95,6 +103,9 @@ watch(
:gridItems="gridItems" :gridItems="gridItems"
@scroll="onScroll" @scroll="onScroll"
> >
<template #after>
<div style="padding: 16px 0 512px;"/>
</template>
<template v-slot="{ item: file, index: idx }"> <template v-slot="{ item: file, index: idx }">
<file-item-cell <file-item-cell
:idx="idx" :idx="idx"
@ -169,6 +180,7 @@ watch(
.container { .container {
background: var(--zp-secondary-background); background: var(--zp-secondary-background);
position: relative;
.action-bar { .action-bar {
display: flex; display: flex;
align-items: center; align-items: center;

View File

@ -12,6 +12,9 @@ import { LeftCircleOutlined, RightCircleOutlined, regex } from '@/icon'
import { message } from 'ant-design-vue' import { message } from 'ant-design-vue'
import { t } from '@/i18n' import { t } from '@/i18n'
import { createImageSearchIter, useImageSearch } from './hook' import { createImageSearchIter, useImageSearch } from './hook'
import { useKeepMultiSelect } from '../fileTransfer/hook'
import MultiSelectKeep from '@/components/MultiSelectKeep.vue'
import { useGlobalStore } from '@/store/useGlobalStore'
const props = defineProps<{ tabIdx: number; paneIdx: number, searchScope?: string }>() const props = defineProps<{ tabIdx: number; paneIdx: number, searchScope?: string }>()
const isRegex = ref(false) const isRegex = ref(false)
@ -53,6 +56,7 @@ const {
saveLoadedFileAsJson saveLoadedFileAsJson
} = useImageSearch(iter) } = useImageSearch(iter)
const info = ref<DataBaseBasicInfo>() const info = ref<DataBaseBasicInfo>()
onMounted(async () => { onMounted(async () => {
@ -93,10 +97,14 @@ useGlobalEventListen('searchIndexExpired', () => info.value && (info.value.expir
const onRegexpClick = () => { const onRegexpClick = () => {
isRegex.value = !isRegex.value isRegex.value = !isRegex.value
} }
const g = useGlobalStore()
const { onClearAllSelected, onSelectAll, onReverseSelect } = useKeepMultiSelect()
</script> </script>
<template> <template>
<div class="container" ref="stackViewEl"> <div class="container" ref="stackViewEl">
<MultiSelectKeep :show="!!multiSelectedIdxs.length || g.keepMultiSelect"
@clear-all-selected="onClearAllSelected" @select-all="onSelectAll" @reverse-select="onReverseSelect"/>
<div class="search-bar" v-if="info" @keydown.stop> <div class="search-bar" v-if="info" @keydown.stop>
<a-input v-model:value="substr" :placeholder="$t('fuzzy-search-placeholder') + ' ' + $t('regexSearchEnabledHint')" <a-input v-model:value="substr" :placeholder="$t('fuzzy-search-placeholder') + ' ' + $t('regexSearchEnabledHint')"
:disabled="!queue.isIdle" @keydown.enter="query" allow-clear /> :disabled="!queue.isIdle" @keydown.enter="query" allow-clear />
@ -134,6 +142,9 @@ const onRegexpClick = () => {
</AModal> </AModal>
<RecycleScroller ref="scroller" class="file-list" v-if="images" :items="images" :item-size="itemSize.first" <RecycleScroller ref="scroller" class="file-list" v-if="images" :items="images" :item-size="itemSize.first"
key-field="fullpath" :item-secondary-size="itemSize.second" :gridItems="gridItems" @scroll="onScroll"> key-field="fullpath" :item-secondary-size="itemSize.second" :gridItems="gridItems" @scroll="onScroll">
<template #after>
<div style="padding: 16px 0 512px;"/>
</template>
<template v-slot="{ item: file, index: idx }"> <template v-slot="{ item: file, index: idx }">
<!-- idx 和file有可能丢失 --> <!-- idx 和file有可能丢失 -->
<file-item-cell :idx="idx" :file="file" v-model:show-menu-idx="showMenuIdx" @file-item-click="onFileItemClick" <file-item-cell :idx="idx" :file="file" v-model:show-menu-idx="showMenuIdx" @file-item-click="onFileItemClick"
@ -153,6 +164,11 @@ const onRegexpClick = () => {
</div> </div>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
::v-deep {
.float-panel {
position: fixed;
}
}
.regex-icon { .regex-icon {
img { img {
height: 1.5em; height: 1.5em;
@ -220,6 +236,8 @@ const onRegexpClick = () => {
.container { .container {
background: var(--zp-secondary-background); background: var(--zp-secondary-background);
position: relative;
.file-list { .file-list {
list-style: none; list-style: none;
padding: 8px; padding: 8px;

View File

@ -267,6 +267,23 @@ export function usePreview () {
} }
} }
export function useKeepMultiSelect () {
const { eventEmitter, multiSelectedIdxs, sortedFiles } = useHookShareState().toRefs()
const onSelectAll = () => eventEmitter.value.emit('selectAll')
const onReverseSelect = () => {
multiSelectedIdxs.value = sortedFiles.value.map((_, idx) => idx)
.filter(v => !multiSelectedIdxs.value.includes(v))
}
const onClearAllSelected = () => {
multiSelectedIdxs.value = []
}
return {
onSelectAll,
onReverseSelect,
onClearAllSelected
}
}
/** /**
* *
*/ */
@ -716,8 +733,16 @@ export function useFileTransfer () {
const recover = () => { const recover = () => {
multiSelectedIdxs.value = [] multiSelectedIdxs.value = []
} }
useWatchDocument('click', recover) useWatchDocument('click', () => {
useWatchDocument('blur', recover) if (!global.keepMultiSelect) {
recover()
}
})
useWatchDocument('blur', () => {
if (!global.keepMultiSelect) {
recover()
}
})
watch(currPage, recover) watch(currPage, recover)
const onFileDragStart = (e: DragEvent, idx: number) => { const onFileDragStart = (e: DragEvent, idx: number) => {

View File

@ -9,7 +9,8 @@ import {
usePreview, usePreview,
useFileItemActions, useFileItemActions,
useMobileOptimization, useMobileOptimization,
stackCache stackCache,
useKeepMultiSelect
} from './hook' } from './hook'
import { SearchSelect } from 'vue3-ts-util' import { SearchSelect } from 'vue3-ts-util'
import { toRawFileUrl } from '@/util/file' import { toRawFileUrl } from '@/util/file'
@ -29,6 +30,7 @@ import { isTauri } from '@/util/env'
import { parse } from 'stable-diffusion-image-metadata' import { parse } from 'stable-diffusion-image-metadata'
import { ref } from 'vue' import { ref } from 'vue'
import type { FileNodeInfo, GenDiffInfo } from '@/api/files' import type { FileNodeInfo, GenDiffInfo } from '@/api/files'
import MultiSelectKeep from '@/components/MultiSelectKeep.vue'
const global = useGlobalStore() const global = useGlobalStore()
const props = defineProps<{ const props = defineProps<{
@ -73,6 +75,7 @@ const { onDrop, onFileDragStart, onFileDragEnd } = useFileTransfer()
const { onFileItemClick, onContextMenuClick, showGenInfo, imageGenInfo, q } = useFileItemActions({ openNext }) const { onFileItemClick, onContextMenuClick, showGenInfo, imageGenInfo, q } = useFileItemActions({ openNext })
const { previewIdx, onPreviewVisibleChange, previewing, previewImgMove, canPreview } = usePreview() const { previewIdx, onPreviewVisibleChange, previewing, previewImgMove, canPreview } = usePreview()
const { showMenuIdx } = useMobileOptimization() const { showMenuIdx } = useMobileOptimization()
const { onClearAllSelected, onReverseSelect, onSelectAll } = useKeepMultiSelect()
watch( watch(
() => props, () => props,
@ -93,15 +96,15 @@ watch(sortedFiles, async (newList, oldList) => {
} }
}) })
const changeIndchecked = ref<boolean>(true); const changeIndchecked = ref<boolean>(true)
const seedChangeChecked = ref<boolean>(false); const seedChangeChecked = ref<boolean>(false)
function getRawGenParams () { function getRawGenParams () {
//extract fullpaths of all files from sortedfiles to array, but only if it's an actual file (not a folder or something else) //extract fullpaths of all files from sortedfiles to array, but only if it's an actual file (not a folder or something else)
let paths: string[] = [] let paths: string[] = []
const allowedExtensions = [".png", ".jpg", ".jpeg"] const allowedExtensions = ['.png', '.jpg', '.jpeg']
for (let f in sortedFiles.value) { for (let f in sortedFiles.value) {
if (sortedFiles.value[f].type == "file" && allowedExtensions.includes(sortedFiles.value[f].fullpath.slice(-4).toLowerCase())) { if (sortedFiles.value[f].type == 'file' && allowedExtensions.includes(sortedFiles.value[f].fullpath.slice(-4).toLowerCase())) {
paths.push(sortedFiles.value[f].fullpath) paths.push(sortedFiles.value[f].fullpath)
} }
} }
@ -119,8 +122,8 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
let result: GenDiffInfo = { let result: GenDiffInfo = {
diff: {}, diff: {},
empty: true, empty: true,
ownFile: "", ownFile: '',
otherFile: "" otherFile: ''
} }
//check for out of bounds //check for out of bounds
@ -130,8 +133,8 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
return result return result
} }
//check for gen_info_obj existence //check for gen_info_obj existence
if(!("gen_info_obj" in sortedFiles.value[idx]) if (!('gen_info_obj' in sortedFiles.value[idx])
|| !("gen_info_obj" in sortedFiles.value[idx + increment])) { || !('gen_info_obj' in sortedFiles.value[idx + increment])) {
return result return result
} }
@ -143,14 +146,14 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
} }
//further vars //further vars
let skip = ["hashes", "resources"] let skip = ['hashes', 'resources']
result.diff = {} result.diff = {}
result.ownFile = ownFile.name, result.ownFile = ownFile.name,
result.otherFile = sortedFiles.value[idx + increment].name, result.otherFile = sortedFiles.value[idx + increment].name,
result.empty = false result.empty = false
if (!seedChangeChecked.value) { if (!seedChangeChecked.value) {
skip.push("seed") skip.push('seed')
} }
//actual per property diff //actual per property diff
@ -162,15 +165,15 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
//for all non-identical values, compare type based //for all non-identical values, compare type based
//existence test //existence test
if (!(k in gen_b)) { if (!(k in gen_b)) {
result.diff[k] = "+" result.diff[k] = '+'
continue continue
} }
//content test //content test
if (gen_a[k] != gen_b[k]) { if (gen_a[k] != gen_b[k]) {
if(k.includes("rompt") && gen_a[k] != "" && gen_b[k] != "") { if (k.includes('rompt') && gen_a[k] != '' && gen_b[k] != '') {
//prompt values are comma separated, handle them differently //prompt values are comma separated, handle them differently
let tokenize_a = gen_a[k].split(",") let tokenize_a = gen_a[k].split(',')
let tokenize_b = gen_b[k].split(",") let tokenize_b = gen_b[k].split(',')
//count how many tokens are different or at a different place //count how many tokens are different or at a different place
let diff_count = 0 let diff_count = 0
for (let i in tokenize_a) { for (let i in tokenize_a) {
@ -178,7 +181,7 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
diff_count++ diff_count++
} }
} }
result.diff[k] = diff_count; result.diff[k] = diff_count
} else { } else {
//all others //all others
result.diff[k] = [gen_a[k], gen_b[k]] result.diff[k] = [gen_a[k], gen_b[k]]
@ -193,6 +196,9 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
</script> </script>
<template> <template>
<ASpin :spinning="spinning" size="large"> <ASpin :spinning="spinning" size="large">
<MultiSelectKeep :show="global.keepMultiSelect || !!multiSelectedIdxs.length"
@clear-all-selected="onClearAllSelected" @select-all="onSelectAll"
@reverse-select="onReverseSelect" />
<ASelect style="display: none"></ASelect> <ASelect style="display: none"></ASelect>
<div ref="stackViewEl" @dragover.prevent @drop.prevent="onDrop($event)" class="container"> <div ref="stackViewEl" @dragover.prevent @drop.prevent="onDrop($event)" class="container">
@ -294,7 +300,8 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
<numInput v-model="cellWidth" :max="1024" :min="64" :step="64" /> <numInput v-model="cellWidth" :max="1024" :min="64" :step="64" />
</a-form-item> </a-form-item>
<a-form-item :label="$t('sortingMethod')"> <a-form-item :label="$t('sortingMethod')">
<search-select v-model:value="sortMethod" @click.stop :conv="sortMethodConv" :options="sortMethods" /> <search-select v-model:value="sortMethod" @click.stop :conv="sortMethodConv"
:options="sortMethods" />
</a-form-item> </a-form-item>
<a-form-item :label="$t('showChangeIndicators')"> <a-form-item :label="$t('showChangeIndicators')">
<a-switch v-model:checked="changeIndchecked" @click="getRawGenParams" /> <a-switch v-model:checked="changeIndchecked" @click="getRawGenParams" />
@ -322,8 +329,8 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
</div> </div>
<div v-if="currPage" class="view"> <div v-if="currPage" class="view">
<RecycleScroller class="file-list" :items="sortedFiles" ref="scroller" @scroll="onScroll" <RecycleScroller class="file-list" :items="sortedFiles" ref="scroller" @scroll="onScroll"
:item-size="itemSize.first" key-field="fullpath" :item-size="itemSize.first" key-field="fullpath" :item-secondary-size="itemSize.second"
:item-secondary-size="itemSize.second" :gridItems="gridItems"> :gridItems="gridItems">
<template v-slot="{ item: file, index: idx }"> <template v-slot="{ item: file, index: idx }">
<!-- idx 和file有可能丢失 --> <!-- idx 和file有可能丢失 -->
<file-item :idx="parseInt(idx)" :file="file" <file-item :idx="parseInt(idx)" :file="file"
@ -334,13 +341,12 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
:is-selected-mutil-files="multiSelectedIdxs.length > 1" :is-selected-mutil-files="multiSelectedIdxs.length > 1"
:gen-diff-to-next="getGenDiff(file.gen_info_obj, idx, 1, file)" :gen-diff-to-next="getGenDiff(file.gen_info_obj, idx, 1, file)"
:gen-diff-to-previous="getGenDiff(file.gen_info_obj, idx, -1, file)" :gen-diff-to-previous="getGenDiff(file.gen_info_obj, idx, -1, file)"
:enable-change-indicator="changeIndchecked" :enable-change-indicator="changeIndchecked" />
/>
</template> </template>
<template #after> <template #after>
<div style="padding: 16px 0 64px;"> <div style="padding: 16px 0 512px;">
<AButton v-if="props.walkModePath" @click="loadNextDir" :loading="loadNextDirLoading" block type="primary" :disabled="!canLoadNext" <AButton v-if="props.walkModePath" @click="loadNextDir" :loading="loadNextDirLoading" block type="primary"
ghost> :disabled="!canLoadNext" ghost>
{{ $t('loadNextPage') }}</AButton> {{ $t('loadNextPage') }}</AButton>
</div> </div>
</template> </template>
@ -396,7 +402,8 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
display: flex; display: flex;
flex-direction: column; flex-direction: column;
&>*, .copy { &>*,
.copy {
margin: 2px; margin: 2px;
} }
} }
@ -412,6 +419,7 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
@media (max-width: 768px) { @media (max-width: 768px) {
width: 100%; width: 100%;
.ant-breadcrumb>* { .ant-breadcrumb>* {
display: inline-block; display: inline-block;
} }
@ -480,4 +488,5 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
border: 4px; border: 4px;
background: var(--zp-secondary-background); background: var(--zp-secondary-background);
border: 1px solid var(--zp-border); border: 1px solid var(--zp-border);
}</style> }
</style>

View File

@ -268,6 +268,7 @@ export const useGlobalStore = defineStore(
longPressOpenContextMenu, longPressOpenContextMenu,
openTagSearchMatchedImageGridInRight, openTagSearchMatchedImageGridInRight,
onlyFoldersAndImages: ref(true), onlyFoldersAndImages: ref(true),
keepMultiSelect: ref(false),
fullscreenPreviewInitialUrl: ref(''), fullscreenPreviewInitialUrl: ref(''),
shortcut, shortcut,
pageFuncExportMap, pageFuncExportMap,