feat: support Keep Multi-selected
parent
d70aebd1c0
commit
d2124e9291
|
|
@ -45,6 +45,7 @@ declare module '@vue/runtime-core' {
|
|||
ChangeIndicator: typeof import('./src/components/ChangeIndicator.vue')['default']
|
||||
ContextMenu: typeof import('./src/components/ContextMenu.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']
|
||||
RouterLink: typeof import('vue-router')['RouterLink']
|
||||
RouterView: typeof import('vue-router')['RouterView']
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -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};
|
||||
|
|
@ -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}
|
||||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
File diff suppressed because one or more lines are too long
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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
File diff suppressed because one or more lines are too long
|
|
@ -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)}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
<link rel="icon" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<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">
|
||||
</head>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -1,6 +1,11 @@
|
|||
import type { IIBI18nMap } from '.'
|
||||
|
||||
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',
|
||||
openWithDefaultApp: 'Open with default app',
|
||||
saveSelectedAsJson: 'Save selected image info',
|
||||
|
|
@ -8,7 +13,7 @@ export const en: IIBI18nMap = {
|
|||
saveLoadedImageAsJson: 'Save loaded image info',
|
||||
selectedItems: ' {0} selected',
|
||||
items: '{0} items',
|
||||
scrollDownToComparePrompt: "Scroll down to compare prompts",
|
||||
scrollDownToComparePrompt: 'Scroll down to compare prompts',
|
||||
sourceText: 'Source Text',
|
||||
structuredData: 'Structured Data',
|
||||
searchScope: 'Search Scope',
|
||||
|
|
@ -31,14 +36,14 @@ export const en: IIBI18nMap = {
|
|||
archive: 'Archive',
|
||||
zipDownload: 'Download as ZIP',
|
||||
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',
|
||||
sendToThirdPartyExtension: 'Send to third-party extension',
|
||||
createFolder: 'Create Folder',
|
||||
inputFolderName: 'Input Folder Name',
|
||||
desktop: 'Desktop',
|
||||
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',
|
||||
other: 'Other',
|
||||
livePreview: 'Live Preview',
|
||||
|
|
@ -89,7 +94,7 @@ export const en: IIBI18nMap = {
|
|||
defaultSortingMethod: 'Default Sorting Method',
|
||||
defaultViewMode: 'Default View Mode',
|
||||
showPreviewImage: 'Show Preview Image',
|
||||
dontShowAgain: "Don't show again",
|
||||
dontShowAgain: 'Don\'t show again',
|
||||
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.',
|
||||
changlog: 'Change log',
|
||||
|
|
@ -121,7 +126,7 @@ export const en: IIBI18nMap = {
|
|||
'index.expired': 'Index expired, updating automatically',
|
||||
manualExitFullScreen:
|
||||
'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',
|
||||
//! MissingTranslations
|
||||
addedTagToImage: 'Tag "{tag}" has been added to this image',
|
||||
|
|
@ -148,7 +153,7 @@ export const en: IIBI18nMap = {
|
|||
lora: 'LoRA',
|
||||
size: 'Size',
|
||||
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',
|
||||
useThumbnailPreview: 'Use thumbnail preview',
|
||||
gridThumbnailWidth: 'Grid thumbnail width',
|
||||
|
|
|
|||
|
|
@ -1,12 +1,17 @@
|
|||
export const zhHans = {
|
||||
exit: '退出',
|
||||
'select-all': '全选',
|
||||
'rerverse-select': '反选',
|
||||
'clear-all-selected': '清除所有选择',
|
||||
'keep-multi-selected': '保留多选',
|
||||
'Source Identifier': '来源',
|
||||
openWithDefaultApp: '使用默认应用打开',
|
||||
saveSelectedAsJson: '保存选中图像信息',
|
||||
saveAllAsJson: '保存所有图像信息',
|
||||
saveLoadedImageAsJson: '保存已加载的图像信息',
|
||||
items: "{0}个项目",
|
||||
selectedItems: "已选择{0}个项目",
|
||||
scrollDownToComparePrompt: "向下滚查看Prompt比较",
|
||||
items: '{0}个项目',
|
||||
selectedItems: '已选择{0}个项目',
|
||||
scrollDownToComparePrompt: '向下滚查看Prompt比较',
|
||||
sourceText: '源文本',
|
||||
structuredData: '结构化数据',
|
||||
searchScope: '搜索范围',
|
||||
|
|
@ -185,7 +190,7 @@ export const zhHans = {
|
|||
livePreview: '实时预览',
|
||||
other: '其他',
|
||||
ImageBrowsingSettings: '图像浏览设置',
|
||||
majorUpdateCustomCellSizeTips: `重大更新:你可以自定义网格图像的大小了,在全局设置页或者右上角的“更多”里面进行调整`,
|
||||
majorUpdateCustomCellSizeTips: '重大更新:你可以自定义网格图像的大小了,在全局设置页或者右上角的“更多”里面进行调整',
|
||||
desktop: '桌面',
|
||||
move: '移动',
|
||||
inputFolderName: '输入文件夹名',
|
||||
|
|
|
|||
|
|
@ -1,13 +1,18 @@
|
|||
import type { IIBI18nMap } from '.'
|
||||
|
||||
export const zhHant: Partial<IIBI18nMap> = {
|
||||
exit: '退出',
|
||||
'select-all': '全選',
|
||||
'rerverse-select': '反選',
|
||||
'clear-all-selected': '清除所有選擇',
|
||||
'keep-multi-selected': '保留多選',
|
||||
'Source Identifier': '來源',
|
||||
openWithDefaultApp: '使用預設應用程式開啟',
|
||||
saveSelectedAsJson: '儲存選取的圖像資訊',
|
||||
saveAllAsJson: '儲存所有圖像資訊',
|
||||
saveLoadedImageAsJson: '儲存已載入的圖像資訊',
|
||||
showChangeIndicators: '顯示變更指示器',
|
||||
scrollDownToComparePrompt: "向下滾查看Prompt比較",
|
||||
scrollDownToComparePrompt: '向下滾查看Prompt比較',
|
||||
sourceText: '源文本',
|
||||
structuredData: '結構化數據',
|
||||
searchScope: '搜尋範圍',
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ import fullScreenContextMenu from '@/page/fileTransfer/fullScreenContextMenu.vue
|
|||
import { LeftCircleOutlined, RightCircleOutlined } from '@/icon'
|
||||
import { useImageSearch, createImageSearchIter } from './hook'
|
||||
import { openRebuildImageIndexModal } from '@/components/functionalCallableComp'
|
||||
import { useGlobalStore } from '@/store/useGlobalStore'
|
||||
import { useKeepMultiSelect } from '../fileTransfer/hook'
|
||||
|
||||
const props = defineProps<{
|
||||
tabIdx: number
|
||||
|
|
@ -57,9 +59,15 @@ watch(
|
|||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
const g = useGlobalStore()
|
||||
const { onClearAllSelected, onSelectAll, onReverseSelect } = useKeepMultiSelect()
|
||||
</script>
|
||||
<template>
|
||||
<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">
|
||||
<AModal v-model:visible="showGenInfo" width="70vw" mask-closable @ok="showGenInfo = false">
|
||||
<template #cancelText />
|
||||
|
|
@ -95,6 +103,9 @@ watch(
|
|||
:gridItems="gridItems"
|
||||
@scroll="onScroll"
|
||||
>
|
||||
<template #after>
|
||||
<div style="padding: 16px 0 512px;"/>
|
||||
</template>
|
||||
<template v-slot="{ item: file, index: idx }">
|
||||
<file-item-cell
|
||||
:idx="idx"
|
||||
|
|
@ -169,6 +180,7 @@ watch(
|
|||
|
||||
.container {
|
||||
background: var(--zp-secondary-background);
|
||||
position: relative;
|
||||
.action-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@ import { LeftCircleOutlined, RightCircleOutlined, regex } from '@/icon'
|
|||
import { message } from 'ant-design-vue'
|
||||
import { t } from '@/i18n'
|
||||
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 isRegex = ref(false)
|
||||
|
|
@ -53,6 +56,7 @@ const {
|
|||
saveLoadedFileAsJson
|
||||
} = useImageSearch(iter)
|
||||
|
||||
|
||||
const info = ref<DataBaseBasicInfo>()
|
||||
|
||||
onMounted(async () => {
|
||||
|
|
@ -93,10 +97,14 @@ useGlobalEventListen('searchIndexExpired', () => info.value && (info.value.expir
|
|||
const onRegexpClick = () => {
|
||||
isRegex.value = !isRegex.value
|
||||
}
|
||||
const g = useGlobalStore()
|
||||
|
||||
const { onClearAllSelected, onSelectAll, onReverseSelect } = useKeepMultiSelect()
|
||||
</script>
|
||||
<template>
|
||||
<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>
|
||||
<a-input v-model:value="substr" :placeholder="$t('fuzzy-search-placeholder') + ' ' + $t('regexSearchEnabledHint')"
|
||||
:disabled="!queue.isIdle" @keydown.enter="query" allow-clear />
|
||||
|
|
@ -134,6 +142,9 @@ const onRegexpClick = () => {
|
|||
</AModal>
|
||||
<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">
|
||||
<template #after>
|
||||
<div style="padding: 16px 0 512px;"/>
|
||||
</template>
|
||||
<template v-slot="{ item: file, index: idx }">
|
||||
<!-- idx 和file有可能丢失 -->
|
||||
<file-item-cell :idx="idx" :file="file" v-model:show-menu-idx="showMenuIdx" @file-item-click="onFileItemClick"
|
||||
|
|
@ -153,6 +164,11 @@ const onRegexpClick = () => {
|
|||
</div>
|
||||
</template>
|
||||
<style scoped lang="scss">
|
||||
::v-deep {
|
||||
.float-panel {
|
||||
position: fixed;
|
||||
}
|
||||
}
|
||||
.regex-icon {
|
||||
img {
|
||||
height: 1.5em;
|
||||
|
|
@ -219,6 +235,8 @@ const onRegexpClick = () => {
|
|||
|
||||
.container {
|
||||
background: var(--zp-secondary-background);
|
||||
|
||||
position: relative;
|
||||
|
||||
.file-list {
|
||||
list-style: none;
|
||||
|
|
|
|||
|
|
@ -249,11 +249,11 @@ export function usePreview () {
|
|||
if (previewing.value && !state.sortedFiles[previewIdx.value]) {
|
||||
message.info(t('manualExitFullScreen'), 5)
|
||||
await delay(500)
|
||||
; (
|
||||
document.querySelector(
|
||||
'.ant-image-preview-operations-operation .anticon-close'
|
||||
) as HTMLDivElement
|
||||
)?.click()
|
||||
; (
|
||||
document.querySelector(
|
||||
'.ant-image-preview-operations-operation .anticon-close'
|
||||
) as HTMLDivElement
|
||||
)?.click()
|
||||
previewIdx.value = -1
|
||||
}
|
||||
})
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 路径栏相关
|
||||
*/
|
||||
|
|
@ -649,7 +666,7 @@ export function useFilesDisplay ({ fetchNext }: {fetchNext?: () => Promise<any>}
|
|||
}
|
||||
}
|
||||
|
||||
// 填充够一页,直到不行为止
|
||||
// 填充够一页,直到不行为止
|
||||
const fetchDataUntilViewFilled = async (isFullScreenPreview = false) => {
|
||||
const s = scroller.value
|
||||
const currIdx = () => (isFullScreenPreview ? previewIdx.value : s?.$_endIndex ?? 0)
|
||||
|
|
@ -716,8 +733,16 @@ export function useFileTransfer () {
|
|||
const recover = () => {
|
||||
multiSelectedIdxs.value = []
|
||||
}
|
||||
useWatchDocument('click', recover)
|
||||
useWatchDocument('blur', recover)
|
||||
useWatchDocument('click', () => {
|
||||
if (!global.keepMultiSelect) {
|
||||
recover()
|
||||
}
|
||||
})
|
||||
useWatchDocument('blur', () => {
|
||||
if (!global.keepMultiSelect) {
|
||||
recover()
|
||||
}
|
||||
})
|
||||
watch(currPage, recover)
|
||||
|
||||
const onFileDragStart = (e: DragEvent, idx: number) => {
|
||||
|
|
@ -1055,10 +1080,10 @@ export function useFileItemActions (
|
|||
case 'deleteFiles': {
|
||||
const selectedFiles = getSelectedImg()
|
||||
const removeFile = async () => {
|
||||
const paths = selectedFiles.map((v) => v.fullpath)
|
||||
await deleteFiles(paths)
|
||||
message.success(t('deleteSuccess'))
|
||||
events.emit('removeFiles', { paths: paths, loc: currLocation.value })
|
||||
const paths = selectedFiles.map((v) => v.fullpath)
|
||||
await deleteFiles(paths)
|
||||
message.success(t('deleteSuccess'))
|
||||
events.emit('removeFiles', { paths: paths, loc: currLocation.value })
|
||||
}
|
||||
if (selectedFiles.length === 1 && global.ignoredConfirmActions.deleteOneOnly) {
|
||||
return removeFile()
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ import {
|
|||
usePreview,
|
||||
useFileItemActions,
|
||||
useMobileOptimization,
|
||||
stackCache
|
||||
stackCache,
|
||||
useKeepMultiSelect
|
||||
} from './hook'
|
||||
import { SearchSelect } from 'vue3-ts-util'
|
||||
import { toRawFileUrl } from '@/util/file'
|
||||
|
|
@ -29,6 +30,7 @@ import { isTauri } from '@/util/env'
|
|||
import { parse } from 'stable-diffusion-image-metadata'
|
||||
import { ref } from 'vue'
|
||||
import type { FileNodeInfo, GenDiffInfo } from '@/api/files'
|
||||
import MultiSelectKeep from '@/components/MultiSelectKeep.vue'
|
||||
|
||||
const global = useGlobalStore()
|
||||
const props = defineProps<{
|
||||
|
|
@ -73,6 +75,7 @@ const { onDrop, onFileDragStart, onFileDragEnd } = useFileTransfer()
|
|||
const { onFileItemClick, onContextMenuClick, showGenInfo, imageGenInfo, q } = useFileItemActions({ openNext })
|
||||
const { previewIdx, onPreviewVisibleChange, previewing, previewImgMove, canPreview } = usePreview()
|
||||
const { showMenuIdx } = useMobileOptimization()
|
||||
const { onClearAllSelected, onReverseSelect, onSelectAll } = useKeepMultiSelect()
|
||||
|
||||
watch(
|
||||
() => props,
|
||||
|
|
@ -81,7 +84,7 @@ watch(
|
|||
const stackC = stackCache.get(props.stackKey ?? '')
|
||||
if (stackC) {
|
||||
stack.value = stackC.slice() // 浅拷贝
|
||||
}
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
|
@ -93,64 +96,64 @@ watch(sortedFiles, async (newList, oldList) => {
|
|||
}
|
||||
})
|
||||
|
||||
const changeIndchecked = ref<boolean>(true);
|
||||
const seedChangeChecked = ref<boolean>(false);
|
||||
const changeIndchecked = ref<boolean>(true)
|
||||
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)
|
||||
let paths: string[] = []
|
||||
const allowedExtensions = [".png", ".jpg", ".jpeg"]
|
||||
const allowedExtensions = ['.png', '.jpg', '.jpeg']
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
q.pushAction(() => getImageGenerationInfoBatch(paths)).res.then((v) => {
|
||||
//result is a json object with fullpath as key and gen_info_raw as value
|
||||
for (let f in sortedFiles.value) {
|
||||
sortedFiles.value[f].gen_info_raw = v[sortedFiles.value[f].fullpath]
|
||||
sortedFiles.value[f].gen_info_obj = parse(v[sortedFiles.value[f].fullpath])
|
||||
}
|
||||
//result is a json object with fullpath as key and gen_info_raw as value
|
||||
for (let f in sortedFiles.value) {
|
||||
sortedFiles.value[f].gen_info_raw = v[sortedFiles.value[f].fullpath]
|
||||
sortedFiles.value[f].gen_info_obj = parse(v[sortedFiles.value[f].fullpath])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNodeInfo) {
|
||||
function getGenDiff (ownGenInfo: any, idx: any, increment: any, ownFile: FileNodeInfo) {
|
||||
//init result obj
|
||||
let result: GenDiffInfo = {
|
||||
diff: {},
|
||||
empty: true,
|
||||
ownFile: "",
|
||||
otherFile: ""
|
||||
ownFile: '',
|
||||
otherFile: ''
|
||||
}
|
||||
|
||||
//check for out of bounds
|
||||
if(idx + increment < 0
|
||||
if (idx + increment < 0
|
||||
|| idx + increment >= sortedFiles.value.length
|
||||
|| sortedFiles.value[idx] == undefined) {
|
||||
return result
|
||||
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
|
||||
if (!('gen_info_obj' in sortedFiles.value[idx])
|
||||
|| !('gen_info_obj' in sortedFiles.value[idx + increment])) {
|
||||
return result
|
||||
}
|
||||
|
||||
//diff vars init
|
||||
let gen_a = ownGenInfo
|
||||
let gen_b :any = sortedFiles.value[idx + increment].gen_info_obj
|
||||
if(gen_b == undefined) {
|
||||
let gen_b: any = sortedFiles.value[idx + increment].gen_info_obj
|
||||
if (gen_b == undefined) {
|
||||
return result
|
||||
}
|
||||
|
||||
//further vars
|
||||
let skip = ["hashes", "resources"]
|
||||
let 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")
|
||||
if (!seedChangeChecked.value) {
|
||||
skip.push('seed')
|
||||
}
|
||||
|
||||
//actual per property diff
|
||||
|
|
@ -162,26 +165,26 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
//for all non-identical values, compare type based
|
||||
//existence test
|
||||
if (!(k in gen_b)) {
|
||||
result.diff[k] = "+"
|
||||
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
|
||||
let tokenize_a = gen_a[k].split(",")
|
||||
let tokenize_b = gen_b[k].split(",")
|
||||
//count how many tokens are different or at a different place
|
||||
let diff_count = 0
|
||||
for (let i in tokenize_a) {
|
||||
if(tokenize_a[i] != tokenize_b[i]) {
|
||||
diff_count++
|
||||
}
|
||||
if (k.includes('rompt') && gen_a[k] != '' && gen_b[k] != '') {
|
||||
//prompt values are comma separated, handle them differently
|
||||
let tokenize_a = gen_a[k].split(',')
|
||||
let tokenize_b = gen_b[k].split(',')
|
||||
//count how many tokens are different or at a different place
|
||||
let diff_count = 0
|
||||
for (let i in tokenize_a) {
|
||||
if (tokenize_a[i] != tokenize_b[i]) {
|
||||
diff_count++
|
||||
}
|
||||
result.diff[k] = diff_count;
|
||||
}
|
||||
result.diff[k] = diff_count
|
||||
} else {
|
||||
//all others
|
||||
result.diff[k] = [gen_a[k],gen_b[k]]
|
||||
//all others
|
||||
result.diff[k] = [gen_a[k], gen_b[k]]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -193,6 +196,9 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
</script>
|
||||
<template>
|
||||
<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>
|
||||
|
||||
<div ref="stackViewEl" @dragover.prevent @drop.prevent="onDrop($event)" class="container">
|
||||
|
|
@ -228,7 +234,7 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
<a-breadcrumb style="flex: 1" v-else>
|
||||
<a-breadcrumb-item v-for="(item, idx) in stack" :key="idx">
|
||||
<a @click.prevent="back(idx)">{{ item.curr === '/' ? $t('root') : item.curr.replace(/:\/$/, $t('drive'))
|
||||
}}</a>
|
||||
}}</a>
|
||||
</a-breadcrumb-item>
|
||||
</a-breadcrumb>
|
||||
|
||||
|
|
@ -294,19 +300,20 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
<numInput v-model="cellWidth" :max="1024" :min="64" :step="64" />
|
||||
</a-form-item>
|
||||
<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 :label="$t('showChangeIndicators')">
|
||||
<a-switch v-model:checked="changeIndchecked" @click="getRawGenParams"/>
|
||||
<a-switch v-model:checked="changeIndchecked" @click="getRawGenParams" />
|
||||
</a-form-item>
|
||||
<a-form-item :label="$t('seedAsChange')">
|
||||
<a-switch v-model:checked="seedChangeChecked" :disabled="!changeIndchecked"/>
|
||||
<a-switch v-model:checked="seedChangeChecked" :disabled="!changeIndchecked" />
|
||||
</a-form-item>
|
||||
<div style="padding: 4px;">
|
||||
<a @click.prevent="addToSearchScanPathAndQuickMove" v-if="!searchPathInfo">{{
|
||||
$t('addToSearchScanPathAndQuickMove') }}</a>
|
||||
$t('addToSearchScanPathAndQuickMove') }}</a>
|
||||
<a @click.prevent="addToSearchScanPathAndQuickMove" v-else-if="searchPathInfo.can_delete">{{
|
||||
$t('removeFromSearchScanPathAndQuickMove') }}</a>
|
||||
$t('removeFromSearchScanPathAndQuickMove') }}</a>
|
||||
</div>
|
||||
<div style="padding: 4px;">
|
||||
<a @click.prevent="openFolder(currLocation + '/')">{{ $t('openWithLocalFileBrowser') }}</a>
|
||||
|
|
@ -322,8 +329,8 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
</div>
|
||||
<div v-if="currPage" class="view">
|
||||
<RecycleScroller class="file-list" :items="sortedFiles" ref="scroller" @scroll="onScroll"
|
||||
:item-size="itemSize.first" key-field="fullpath"
|
||||
:item-secondary-size="itemSize.second" :gridItems="gridItems">
|
||||
:item-size="itemSize.first" key-field="fullpath" :item-secondary-size="itemSize.second"
|
||||
:gridItems="gridItems">
|
||||
<template v-slot="{ item: file, index: idx }">
|
||||
<!-- idx 和file有可能丢失 -->
|
||||
<file-item :idx="parseInt(idx)" :file="file"
|
||||
|
|
@ -332,15 +339,14 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
@file-item-click="onFileItemClick" @dragstart="onFileDragStart" @dragend="onFileDragEnd"
|
||||
@preview-visible-change="onPreviewVisibleChange" @context-menu-click="onContextMenuClick"
|
||||
: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)"
|
||||
:enable-change-indicator="changeIndchecked"
|
||||
/>
|
||||
:enable-change-indicator="changeIndchecked" />
|
||||
</template>
|
||||
<template #after>
|
||||
<div style="padding: 16px 0 64px;">
|
||||
<AButton v-if="props.walkModePath" @click="loadNextDir" :loading="loadNextDirLoading" block type="primary" :disabled="!canLoadNext"
|
||||
ghost>
|
||||
<template #after>
|
||||
<div style="padding: 16px 0 512px;">
|
||||
<AButton v-if="props.walkModePath" @click="loadNextDir" :loading="loadNextDirLoading" block type="primary"
|
||||
:disabled="!canLoadNext" ghost>
|
||||
{{ $t('loadNextPage') }}</AButton>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -354,7 +360,7 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
</div>
|
||||
<fullScreenContextMenu v-if="previewing" :file="sortedFiles[previewIdx]" :idx="previewIdx"
|
||||
@context-menu-click="onContextMenuClick" />
|
||||
<BaseFileListInfo :file-num="sortedFiles.length" :selected-file-num="multiSelectedIdxs.length"/>
|
||||
<BaseFileListInfo :file-num="sortedFiles.length" :selected-file-num="multiSelectedIdxs.length" />
|
||||
</ASpin>
|
||||
</template>
|
||||
<style lang="scss" scoped>
|
||||
|
|
@ -396,7 +402,8 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
&>*, .copy {
|
||||
&>*,
|
||||
.copy {
|
||||
margin: 2px;
|
||||
}
|
||||
}
|
||||
|
|
@ -412,6 +419,7 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
|
||||
@media (max-width: 768px) {
|
||||
width: 100%;
|
||||
|
||||
.ant-breadcrumb>* {
|
||||
display: inline-block;
|
||||
}
|
||||
|
|
@ -480,4 +488,5 @@ function getGenDiff(ownGenInfo: any, idx: any, increment: any, ownFile: FileNode
|
|||
border: 4px;
|
||||
background: var(--zp-secondary-background);
|
||||
border: 1px solid var(--zp-border);
|
||||
}</style>
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -268,6 +268,7 @@ export const useGlobalStore = defineStore(
|
|||
longPressOpenContextMenu,
|
||||
openTagSearchMatchedImageGridInRight,
|
||||
onlyFoldersAndImages: ref(true),
|
||||
keepMultiSelect: ref(false),
|
||||
fullscreenPreviewInitialUrl: ref(''),
|
||||
shortcut,
|
||||
pageFuncExportMap,
|
||||
|
|
|
|||
Loading…
Reference in New Issue