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']
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

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" />
<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>

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 '.'
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',

View File

@ -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: '输入文件夹名',

View File

@ -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: '搜尋範圍',

View File

@ -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;

View File

@ -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;

View File

@ -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()

View File

@ -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>

View File

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