Add support for using Ctrl+A to select all in all interfaces

pull/300/head
zanllp 2023-07-10 05:22:58 +08:00
parent 16d8c6547b
commit 6c7cce56a1
25 changed files with 101 additions and 79 deletions

View File

@ -15,7 +15,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-e9e01f28.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-b9be3ae5.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-4ed7d1e3.css">
</head>

View File

@ -1 +1 @@
import{d as t,o as a,m as r,cx as n}from"./index-e9e01f28.js";const p=t({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(o){return(e,s)=>(a(),r(n,{left:e.left,right:e.right},null,8,["left","right"]))}});export{p as default};
import{d as t,o as a,m as r,cy as n}from"./index-b9be3ae5.js";const p=t({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(o){return(e,s)=>(a(),r(n,{left:e.left,right:e.right},null,8,["left","right"]))}});export{p as default};

View File

@ -1 +1 @@
import{d as R,l as U,o as r,y as _,c as n,n as a,r as e,s as y,p as b,t as L,v as h,x as q,m as M,K as Q,H as u,L as S,O as H,Q as K,W}from"./index-e9e01f28.js";import{a as j,f as J,L as X,R as Y,b as Z,S as ee}from"./fullScreenContextMenu-a2dc6341.js";import"./hook-4a60d0b1.js";import{g as te}from"./db-f6dd0370.js";import{u as se}from"./hook-afa35719.js";import"./_baseIteratee-0835714e.js";const ie={class:"hint"},ne={key:1,class:"preview-switch"},le=R({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(V){const m=V,{queue:p,images:s,onContextMenuClickU:g,stackViewEl:D,previewIdx:l,previewing:v,onPreviewVisibleChange:T,previewImgMove:f,canPreview:I,itemSize:k,gridItems:z,showGenInfo:o,imageGenInfo:w,q:F,multiSelectedIdxs:$,onFileItemClick:B,scroller:C,showMenuIdx:d,onFileDragStart:G,onFileDragEnd:A}=se();return U(()=>m.selectedTagIds,async()=>{var t;const{res:c}=p.pushAction(()=>te(m.selectedTagIds));s.value=await c,(t=C.value)==null||t.scrollToItem(0)},{immediate:!0}),(c,t)=>{const E=H,N=K,O=ee;return r(),_("div",{class:"container",ref_key:"stackViewEl",ref:D},[n(O,{size:"large",spinning:!e(p).isIdle},{default:a(()=>[n(N,{visible:e(o),"onUpdate:visible":t[1]||(t[1]=i=>y(o)?o.value=i:null),width:"70vw","mask-closable":"",onOk:t[2]||(t[2]=i=>o.value=!1)},{cancelText:a(()=>[]),default:a(()=>[n(E,{active:"",loading:!e(F).isIdle},{default:a(()=>[b("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[0]||(t[0]=i=>e(L)(e(w)))},[b("div",ie,h(c.$t("doubleClickToCopy")),1),q(" "+h(e(w)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(s)?(r(),M(e(j),{key:0,ref_key:"scroller",ref:C,class:"file-list",items:e(s),"item-size":e(k).first,"key-field":"fullpath","item-secondary-size":e(k).second,gridItems:e(z)},{default:a(({item:i,index:x})=>[n(J,{idx:x,file:i,"show-menu-idx":e(d),"onUpdate:showMenuIdx":t[3]||(t[3]=P=>y(d)?d.value=P:null),onDragstart:e(G),onDragend:e(A),onFileItemClick:e(B),"full-screen-preview-image-url":e(s)[e(l)]?e(Q)(e(s)[e(l)]):"",selected:e($).includes(x),onContextMenuClick:e(g),onPreviewVisibleChange:e(T)},null,8,["idx","file","show-menu-idx","onDragstart","onDragend","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):u("",!0),e(v)?(r(),_("div",ne,[n(e(X),{onClick:t[4]||(t[4]=i=>e(f)("prev")),class:S({disable:!e(I)("prev")})},null,8,["class"]),n(e(Y),{onClick:t[5]||(t[5]=i=>e(f)("next")),class:S({disable:!e(I)("next")})},null,8,["class"])])):u("",!0)]),_:1},8,["spinning"]),e(v)&&e(s)&&e(s)[e(l)]?(r(),M(Z,{key:0,file:e(s)[e(l)],idx:e(l),onContextMenuClick:e(g)},null,8,["file","idx","onContextMenuClick"])):u("",!0)],512)}}});const me=W(le,[["__scopeId","data-v-2cae0a95"]]);export{me as default};
import{d as R,l as U,o as r,y as _,c as n,n as a,r as e,s as y,p as b,t as L,v as h,x as q,m as M,K as Q,H as u,L as S,O as H,Q as K,W}from"./index-b9be3ae5.js";import{a as j,f as J,L as X,R as Y,b as Z,S as ee}from"./fullScreenContextMenu-b53275d0.js";import"./hook-5e173375.js";import{g as te}from"./db-78c6385c.js";import{u as se}from"./hook-f6e4bbd3.js";import"./_baseIteratee-9e65704b.js";const ie={class:"hint"},ne={key:1,class:"preview-switch"},le=R({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(V){const m=V,{queue:p,images:s,onContextMenuClickU:g,stackViewEl:D,previewIdx:l,previewing:v,onPreviewVisibleChange:T,previewImgMove:f,canPreview:I,itemSize:k,gridItems:z,showGenInfo:o,imageGenInfo:w,q:F,multiSelectedIdxs:$,onFileItemClick:B,scroller:C,showMenuIdx:d,onFileDragStart:G,onFileDragEnd:A}=se();return U(()=>m.selectedTagIds,async()=>{var t;const{res:c}=p.pushAction(()=>te(m.selectedTagIds));s.value=await c,(t=C.value)==null||t.scrollToItem(0)},{immediate:!0}),(c,t)=>{const E=H,N=K,O=ee;return r(),_("div",{class:"container",ref_key:"stackViewEl",ref:D},[n(O,{size:"large",spinning:!e(p).isIdle},{default:a(()=>[n(N,{visible:e(o),"onUpdate:visible":t[1]||(t[1]=i=>y(o)?o.value=i:null),width:"70vw","mask-closable":"",onOk:t[2]||(t[2]=i=>o.value=!1)},{cancelText:a(()=>[]),default:a(()=>[n(E,{active:"",loading:!e(F).isIdle},{default:a(()=>[b("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[0]||(t[0]=i=>e(L)(e(w)))},[b("div",ie,h(c.$t("doubleClickToCopy")),1),q(" "+h(e(w)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(s)?(r(),M(e(j),{key:0,ref_key:"scroller",ref:C,class:"file-list",items:e(s),"item-size":e(k).first,"key-field":"fullpath","item-secondary-size":e(k).second,gridItems:e(z)},{default:a(({item:i,index:x})=>[n(J,{idx:x,file:i,"show-menu-idx":e(d),"onUpdate:showMenuIdx":t[3]||(t[3]=P=>y(d)?d.value=P:null),onDragstart:e(G),onDragend:e(A),onFileItemClick:e(B),"full-screen-preview-image-url":e(s)[e(l)]?e(Q)(e(s)[e(l)]):"",selected:e($).includes(x),onContextMenuClick:e(g),onPreviewVisibleChange:e(T)},null,8,["idx","file","show-menu-idx","onDragstart","onDragend","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):u("",!0),e(v)?(r(),_("div",ne,[n(e(X),{onClick:t[4]||(t[4]=i=>e(f)("prev")),class:S({disable:!e(I)("prev")})},null,8,["class"]),n(e(Y),{onClick:t[5]||(t[5]=i=>e(f)("next")),class:S({disable:!e(I)("next")})},null,8,["class"])])):u("",!0)]),_:1},8,["spinning"]),e(v)&&e(s)&&e(s)[e(l)]?(r(),M(Z,{key:0,file:e(s)[e(l)],idx:e(l),onContextMenuClick:e(g)},null,8,["file","idx","onContextMenuClick"])):u("",!0)],512)}}});const me=W(le,[["__scopeId","data-v-2cae0a95"]]);export{me as default};

View File

@ -1 +1 @@
import{d as Z,Z as B,aF as j,bD as J,bC as $,o,y as k,c as r,r as e,bG as X,m,n as u,x as w,v,H as f,s as V,p as A,t as Y,K as ee,L as F,aq as ae,ah as ne,T as se,U as te,O as ie,Q as le,W as oe}from"./index-e9e01f28.js";import{a as re,f as ue,L as de,R as ce,b as pe,S as me}from"./fullScreenContextMenu-a2dc6341.js";/* empty css */import"./hook-4a60d0b1.js";import{b as U,c as ve,e as fe,u as ge}from"./db-f6dd0370.js";import{u as ke}from"./hook-afa35719.js";import"./_baseIteratee-0835714e.js";const we={key:0,class:"search-bar"},ye={class:"hint"},Ce={key:1,class:"preview-switch"},Ie=Z({__name:"SubstrSearch",setup(be){const{queue:l,images:t,onContextMenuClickU:y,stackViewEl:E,previewIdx:d,previewing:C,onPreviewVisibleChange:T,previewImgMove:I,canPreview:b,itemSize:x,gridItems:R,showGenInfo:c,imageGenInfo:_,q,multiSelectedIdxs:G,onFileItemClick:K,scroller:h,showMenuIdx:g,onFileDragStart:L,onFileDragEnd:N}=ke(),p=B(""),n=B();j(async()=>{n.value=await U(),n.value.img_count&&n.value.expired&&S()});const S=J(()=>l.pushAction(async()=>(await ge(),n.value=await U(),n.value)).res),D=async()=>{var s;t.value=await l.pushAction(()=>fe(p.value)).res,(s=h.value)==null||s.scrollToItem(0),t.value.length||ae.info(ne("fuzzy-search-noResults"))};return $("returnToIIB",async()=>{const s=await l.pushAction(ve).res;n.value.expired=s.expired}),$("searchIndexExpired",()=>n.value&&(n.value.expired=!0)),(s,a)=>{const O=se,M=te,P=ie,H=le,Q=me;return o(),k("div",{class:"container",ref_key:"stackViewEl",ref:E},[n.value?(o(),k("div",we,[r(O,{value:p.value,"onUpdate:value":a[0]||(a[0]=i=>p.value=i),placeholder:s.$t("fuzzy-search-placeholder"),disabled:!e(l).isIdle,onKeydown:X(D,["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),n.value.expired||!n.value.img_count?(o(),m(M,{key:0,onClick:e(S),loading:!e(l).isIdle,type:"primary"},{default:u(()=>[w(v(n.value.img_count===0?s.$t("generateIndexHint"):s.$t("UpdateIndex")),1)]),_:1},8,["onClick","loading"])):(o(),m(M,{key:1,type:"primary",onClick:D,loading:!e(l).isIdle,disabled:!p.value},{default:u(()=>[w(v(s.$t("search")),1)]),_:1},8,["loading","disabled"]))])):f("",!0),r(Q,{size:"large",spinning:!e(l).isIdle},{default:u(()=>[r(H,{visible:e(c),"onUpdate:visible":a[2]||(a[2]=i=>V(c)?c.value=i:null),width:"70vw","mask-closable":"",onOk:a[3]||(a[3]=i=>c.value=!1)},{cancelText:u(()=>[]),default:u(()=>[r(P,{active:"",loading:!e(q).isIdle},{default:u(()=>[A("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:a[1]||(a[1]=i=>e(Y)(e(_)))},[A("div",ye,v(s.$t("doubleClickToCopy")),1),w(" "+v(e(_)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(t)?(o(),m(e(re),{key:0,ref_key:"scroller",ref:h,class:"file-list",items:e(t),"item-size":e(x).first,"key-field":"fullpath","item-secondary-size":e(x).second,gridItems:e(R)},{default:u(({item:i,index:z})=>[r(ue,{idx:z,file:i,"show-menu-idx":e(g),"onUpdate:showMenuIdx":a[4]||(a[4]=W=>V(g)?g.value=W:null),onFileItemClick:e(K),"full-screen-preview-image-url":e(t)[e(d)]?e(ee)(e(t)[e(d)]):"",selected:e(G).includes(z),onContextMenuClick:e(y),onDragstart:e(L),onDragend:e(N),onPreviewVisibleChange:e(T)},null,8,["idx","file","show-menu-idx","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onDragstart","onDragend","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):f("",!0),e(C)?(o(),k("div",Ce,[r(e(de),{onClick:a[5]||(a[5]=i=>e(I)("prev")),class:F({disable:!e(b)("prev")})},null,8,["class"]),r(e(ce),{onClick:a[6]||(a[6]=i=>e(I)("next")),class:F({disable:!e(b)("next")})},null,8,["class"])])):f("",!0)]),_:1},8,["spinning"]),e(C)&&e(t)&&e(t)[e(d)]?(o(),m(pe,{key:1,file:e(t)[e(d)],idx:e(d),onContextMenuClick:e(y)},null,8,["file","idx","onContextMenuClick"])):f("",!0)],512)}}});const Be=oe(Ie,[["__scopeId","data-v-56ea21ae"]]);export{Be as default};
import{d as Z,Z as B,aF as j,bD as J,bC as $,o,y as k,c as r,r as e,bG as X,m,n as u,x as w,v,H as f,s as V,p as A,t as Y,K as ee,L as F,aq as ae,ah as ne,T as se,U as te,O as ie,Q as le,W as oe}from"./index-b9be3ae5.js";import{a as re,f as ue,L as de,R as ce,b as pe,S as me}from"./fullScreenContextMenu-b53275d0.js";/* empty css */import"./hook-5e173375.js";import{b as U,c as ve,e as fe,u as ge}from"./db-78c6385c.js";import{u as ke}from"./hook-f6e4bbd3.js";import"./_baseIteratee-9e65704b.js";const we={key:0,class:"search-bar"},ye={class:"hint"},Ce={key:1,class:"preview-switch"},Ie=Z({__name:"SubstrSearch",setup(be){const{queue:l,images:t,onContextMenuClickU:y,stackViewEl:E,previewIdx:d,previewing:C,onPreviewVisibleChange:T,previewImgMove:I,canPreview:b,itemSize:x,gridItems:R,showGenInfo:c,imageGenInfo:_,q,multiSelectedIdxs:G,onFileItemClick:K,scroller:h,showMenuIdx:g,onFileDragStart:L,onFileDragEnd:N}=ke(),p=B(""),n=B();j(async()=>{n.value=await U(),n.value.img_count&&n.value.expired&&S()});const S=J(()=>l.pushAction(async()=>(await ge(),n.value=await U(),n.value)).res),D=async()=>{var s;t.value=await l.pushAction(()=>fe(p.value)).res,(s=h.value)==null||s.scrollToItem(0),t.value.length||ae.info(ne("fuzzy-search-noResults"))};return $("returnToIIB",async()=>{const s=await l.pushAction(ve).res;n.value.expired=s.expired}),$("searchIndexExpired",()=>n.value&&(n.value.expired=!0)),(s,a)=>{const O=se,M=te,P=ie,H=le,Q=me;return o(),k("div",{class:"container",ref_key:"stackViewEl",ref:E},[n.value?(o(),k("div",we,[r(O,{value:p.value,"onUpdate:value":a[0]||(a[0]=i=>p.value=i),placeholder:s.$t("fuzzy-search-placeholder"),disabled:!e(l).isIdle,onKeydown:X(D,["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),n.value.expired||!n.value.img_count?(o(),m(M,{key:0,onClick:e(S),loading:!e(l).isIdle,type:"primary"},{default:u(()=>[w(v(n.value.img_count===0?s.$t("generateIndexHint"):s.$t("UpdateIndex")),1)]),_:1},8,["onClick","loading"])):(o(),m(M,{key:1,type:"primary",onClick:D,loading:!e(l).isIdle,disabled:!p.value},{default:u(()=>[w(v(s.$t("search")),1)]),_:1},8,["loading","disabled"]))])):f("",!0),r(Q,{size:"large",spinning:!e(l).isIdle},{default:u(()=>[r(H,{visible:e(c),"onUpdate:visible":a[2]||(a[2]=i=>V(c)?c.value=i:null),width:"70vw","mask-closable":"",onOk:a[3]||(a[3]=i=>c.value=!1)},{cancelText:u(()=>[]),default:u(()=>[r(P,{active:"",loading:!e(q).isIdle},{default:u(()=>[A("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:a[1]||(a[1]=i=>e(Y)(e(_)))},[A("div",ye,v(s.$t("doubleClickToCopy")),1),w(" "+v(e(_)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(t)?(o(),m(e(re),{key:0,ref_key:"scroller",ref:h,class:"file-list",items:e(t),"item-size":e(x).first,"key-field":"fullpath","item-secondary-size":e(x).second,gridItems:e(R)},{default:u(({item:i,index:z})=>[r(ue,{idx:z,file:i,"show-menu-idx":e(g),"onUpdate:showMenuIdx":a[4]||(a[4]=W=>V(g)?g.value=W:null),onFileItemClick:e(K),"full-screen-preview-image-url":e(t)[e(d)]?e(ee)(e(t)[e(d)]):"",selected:e(G).includes(z),onContextMenuClick:e(y),onDragstart:e(L),onDragend:e(N),onPreviewVisibleChange:e(T)},null,8,["idx","file","show-menu-idx","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onDragstart","onDragend","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):f("",!0),e(C)?(o(),k("div",Ce,[r(e(de),{onClick:a[5]||(a[5]=i=>e(I)("prev")),class:F({disable:!e(b)("prev")})},null,8,["class"]),r(e(ce),{onClick:a[6]||(a[6]=i=>e(I)("next")),class:F({disable:!e(b)("next")})},null,8,["class"])])):f("",!0)]),_:1},8,["spinning"]),e(C)&&e(t)&&e(t)[e(d)]?(o(),m(pe,{key:1,file:e(t)[e(d)],idx:e(d),onContextMenuClick:e(y)},null,8,["file","idx","onContextMenuClick"])):f("",!0)],512)}}});const Be=oe(Ie,[["__scopeId","data-v-56ea21ae"]]);export{Be as default};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{ct as M,cu as d,c4 as _,aX as g,bh as h,cv as E,bj as O,cw as p,bf as y,bz as C}from"./index-e9e01f28.js";function I(n){return function(r){return r==null?void 0:r[n]}}var L=1,w=2;function D(n,r,e,t){var i=e.length,A=i,a=!t;if(n==null)return!A;for(n=Object(n);i--;){var f=e[i];if(a&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++i<A;){f=e[i];var u=f[0],s=n[u],o=f[1];if(a&&f[2]){if(s===void 0&&!(u in n))return!1}else{var l=new M;if(t)var R=t(s,o,u,n,r,l);if(!(R===void 0?d(o,s,L|w,t,l):R))return!1}}return!0}function P(n){return n===n&&!_(n)}function G(n){for(var r=g(n),e=r.length;e--;){var t=r[e],i=n[t];r[e]=[t,i,P(i)]}return r}function c(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function b(n){var r=G(n);return r.length==1&&r[0][2]?c(r[0][0],r[0][1]):function(e){return e===n||D(e,n,r)}}function F(n,r,e){var t=n==null?void 0:h(n,r);return t===void 0?e:t}var S=1,m=2;function v(n,r){return E(n)&&P(r)?c(O(n),r):function(e){var t=F(e,n);return t===void 0&&t===r?p(e,n):d(r,t,S|m)}}function x(n){return function(r){return h(r,n)}}function K(n){return E(n)?I(O(n)):x(n)}function T(n){return typeof n=="function"?n:n==null?y:typeof n=="object"?C(n)?v(n[0],n[1]):b(n):K(n)}export{T as b};

View File

@ -0,0 +1 @@
import{cu as M,cv as d,c4 as _,aX as g,bh as h,cw as E,bj as O,cx as p,bf as y,bz as C}from"./index-b9be3ae5.js";function I(n){return function(r){return r==null?void 0:r[n]}}var L=1,w=2;function D(n,r,e,i){var t=e.length,A=t,a=!i;if(n==null)return!A;for(n=Object(n);t--;){var f=e[t];if(a&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++t<A;){f=e[t];var u=f[0],s=n[u],o=f[1];if(a&&f[2]){if(s===void 0&&!(u in n))return!1}else{var l=new M;if(i)var R=i(s,o,u,n,r,l);if(!(R===void 0?d(o,s,L|w,i,l):R))return!1}}return!0}function P(n){return n===n&&!_(n)}function G(n){for(var r=g(n),e=r.length;e--;){var i=r[e],t=n[i];r[e]=[i,t,P(t)]}return r}function c(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function b(n){var r=G(n);return r.length==1&&r[0][2]?c(r[0][0],r[0][1]):function(e){return e===n||D(e,n,r)}}function F(n,r,e){var i=n==null?void 0:h(n,r);return i===void 0?e:i}var x=1,S=2;function m(n,r){return E(n)&&P(r)?c(O(n),r):function(e){var i=F(e,n);return i===void 0&&i===r?p(e,n):d(r,i,x|S)}}function v(n){return function(r){return h(r,n)}}function K(n){return E(n)?I(O(n)):v(n)}function T(n){return typeof n=="function"?n:n==null?y:typeof n=="object"?C(n)?m(n[0],n[1]):b(n):K(n)}export{T as b};

View File

@ -1 +1 @@
import{ca as t}from"./index-e9e01f28.js";const o=async()=>(await t.value.get("/db/basic_info")).data,c=async()=>(await t.value.get("/db/expired_dirs")).data,r=async()=>{await t.value.post("/db/update_image_data",{},{timeout:1/0})},d=async a=>(await t.value.post("/db/match_images_by_tags",a)).data,g=async a=>(await t.value.post("/db/add_custom_tag",a)).data,u=async a=>(await t.value.post("/db/toggle_custom_tag_to_img",a)).data,p=async a=>{await t.value.post("/db/remove_custom_tag",a)},i=async a=>(await t.value.get("/db/img_selected_custom_tag",{params:{path:a}})).data,m=async a=>(await t.value.get("/db/search_by_substr",{params:{substr:a}})).data,e="/db/scanned_paths",_=async a=>{await t.value.post(e,{path:a})},b=async a=>{await t.value.delete(e,{data:{path:a}})};export{_ as a,o as b,c,g as d,m as e,i as f,d as g,b as h,p as r,u as t,r as u};
import{ca as t}from"./index-b9be3ae5.js";const o=async()=>(await t.value.get("/db/basic_info")).data,c=async()=>(await t.value.get("/db/expired_dirs")).data,r=async()=>{await t.value.post("/db/update_image_data",{},{timeout:1/0})},d=async a=>(await t.value.post("/db/match_images_by_tags",a)).data,g=async a=>(await t.value.post("/db/add_custom_tag",a)).data,u=async a=>(await t.value.post("/db/toggle_custom_tag_to_img",a)).data,p=async a=>{await t.value.post("/db/remove_custom_tag",a)},i=async a=>(await t.value.get("/db/img_selected_custom_tag",{params:{path:a}})).data,m=async a=>(await t.value.get("/db/search_by_substr",{params:{substr:a}})).data,e="/db/scanned_paths",_=async a=>{await t.value.post(e,{path:a})},b=async a=>{await t.value.delete(e,{data:{path:a}})};export{_ as a,o as b,c,g as d,m as e,i as f,d as g,b as h,p as r,u as t,r as u};

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

2
vue/dist/assets/hook-5e173375.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{Z as l,bB as y,bf as q}from"./index-e9e01f28.js";import{u as D,b as E,f as P,c as z,d as G,e as Q,g as R}from"./hook-4a60d0b1.js";const B=()=>{const e=l(),c=y(),o=l(),t={tabIdx:-1,target:"local",paneIdx:-1,walkMode:!1},{stackViewEl:r,multiSelectedIdxs:u,stack:f}=D({images:e}).toRefs(),{itemSize:m,gridItems:v}=E(t),{showMenuIdx:p}=P(),{onFileDragStart:I,onFileDragEnd:d}=z(),{showGenInfo:g,imageGenInfo:w,q:x,onContextMenuClick:i,onFileItemClick:k}=G(t,{openNext:q}),{previewIdx:F,previewing:M,onPreviewVisibleChange:b,previewImgMove:h,canPreview:C}=Q(t,{scroller:o,files:e}),S=async(n,s,a)=>{f.value=[{curr:"",files:e.value}],await i(n,s,a)};return R("removeFiles",async({paths:n})=>{var s;e.value=(s=e.value)==null?void 0:s.filter(a=>!n.includes(a.fullpath))}),{scroller:o,queue:c,images:e,onContextMenuClickU:S,stackViewEl:r,previewIdx:F,previewing:M,onPreviewVisibleChange:b,previewImgMove:h,canPreview:C,itemSize:m,gridItems:v,showGenInfo:g,imageGenInfo:w,q:x,onContextMenuClick:i,onFileItemClick:k,showMenuIdx:p,multiSelectedIdxs:u,onFileDragStart:I,onFileDragEnd:d}};export{B as u};

1
vue/dist/assets/hook-f6e4bbd3.js vendored Normal file
View File

@ -0,0 +1 @@
import{Z as c,bB as y,bf as q}from"./index-b9be3ae5.js";import{u as D,b as E,f as P,a as z,c as G,d as L,e as Q,h as R}from"./hook-5e173375.js";const B=()=>{const e=c(),l=y(),o=c(),s={tabIdx:-1,target:"local",paneIdx:-1,walkMode:!1},{stackViewEl:r,multiSelectedIdxs:u,stack:m}=D({images:e}).toRefs(),{itemSize:f,gridItems:v}=E(s),{showMenuIdx:p}=P();z(s);const{onFileDragStart:I,onFileDragEnd:d}=G(),{showGenInfo:g,imageGenInfo:w,q:x,onContextMenuClick:i,onFileItemClick:k}=L(s,{openNext:q}),{previewIdx:h,previewing:F,onPreviewVisibleChange:M,previewImgMove:b,canPreview:C}=Q(s,{scroller:o}),S=async(a,t,n)=>{m.value=[{curr:"",files:e.value}],await i(a,t,n)};return R("removeFiles",async({paths:a})=>{var t;e.value=(t=e.value)==null?void 0:t.filter(n=>!a.includes(n.fullpath))}),{scroller:o,queue:l,images:e,onContextMenuClickU:S,stackViewEl:r,previewIdx:h,previewing:F,onPreviewVisibleChange:M,previewImgMove:b,canPreview:C,itemSize:f,gridItems:v,showGenInfo:g,imageGenInfo:w,q:x,onContextMenuClick:i,onFileItemClick:k,showMenuIdx:p,multiSelectedIdxs:u,onFileDragStart:I,onFileDragEnd:d}};export{B as u};

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

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-e9e01f28.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-b9be3ae5.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-4ed7d1e3.css">
</head>

View File

@ -10,7 +10,8 @@ import {
useFileItemActions,
usePreview,
type Scroller,
useEventListen
useEventListen,
useLocation
} from '../fileTransfer/hook'
export const useImageSearch = () => {
@ -21,6 +22,7 @@ export const useImageSearch = () => {
const { stackViewEl, multiSelectedIdxs, stack } = useHookShareState({ images }).toRefs()
const { itemSize, gridItems } = useFilesDisplay(propsMock)
const { showMenuIdx } = useMobileOptimization()
useLocation(propsMock)
const { onFileDragStart, onFileDragEnd } = useFileTransfer()
const {
showGenInfo,
@ -31,7 +33,7 @@ export const useImageSearch = () => {
} = useFileItemActions(propsMock, { openNext: identity })
const { previewIdx, previewing, onPreviewVisibleChange, previewImgMove, canPreview } = usePreview(
propsMock,
{ scroller, files: images }
{ scroller }
)
const onContextMenuClickU: typeof onContextMenuClick = async (e, file, idx) => {
@ -42,6 +44,7 @@ export const useImageSearch = () => {
useEventListen('removeFiles', async ({ paths }) => {
images.value = images.value?.filter(v => !paths.includes(v.fullpath))
})
return {
scroller,

View File

@ -1,6 +1,6 @@
import { useGlobalStore, type FileTransferTabPane, type Shortcut } from '@/store/useGlobalStore'
import { useImgSliStore } from '@/store/useImgSli'
import { onLongPress, useElementSize } from '@vueuse/core'
import { onLongPress, useElementSize, useMouseInElement } from '@vueuse/core'
import { ref, computed, watch, onMounted, h, type Ref } from 'vue'
import { gradioApp, parentWindow } from '@/util'
import { genInfoCompleted, getImageGenerationInfo, openFolder, setImgPath } from '@/api'
@ -32,6 +32,7 @@ import { t } from '@/i18n'
import { DatabaseOutlined } from '@/icon'
import { addScannedPath, removeScannedPath, toggleCustomTagToImg } from '@/api/db'
import { FileTransferData, isFileTransferData, toRawFileUrl } from './util'
import { getShortcutStrFromEvent } from '@/util/shortcut'
export * from './util'
export const stackCache = new Map<string, Page[]>()
@ -115,6 +116,7 @@ export const { useHookShareState } = createTypedShareStateHook(
...typedEventEmitter<{
loadNextDir(isFullscreenPreview?: boolean): Promise<void>
refresh(): Promise<void>
selectAll(): void
}>()
}
},
@ -143,11 +145,10 @@ export interface Page {
*/
export function usePreview(
props: Props,
custom?: { files: Ref<FileNodeInfo[] | undefined>; scroller: Ref<Scroller | undefined> }
custom?: { scroller: Ref<Scroller | undefined> }
) {
const { previewIdx, eventEmitter, canLoadNext, previewing } = useHookShareState().toRefs()
const { previewIdx, eventEmitter, canLoadNext, previewing, sortedFiles: files } = useHookShareState().toRefs()
const { state } = useHookShareState()
const files = computed(() => custom?.files.value ?? state.sortedFiles)
const scroller = computed(() => custom?.scroller.value ?? state.scroller)
let waitScrollTo = null as number | null
const onPreviewVisibleChange = (v: boolean, lv: boolean) => {
@ -522,10 +523,13 @@ export function useLocation(props: Props) {
}
const selectAll = () => {
multiSelectedIdxs.value = range(0, sortedFiles.value.length)
console.log(`select all 0 -> ${sortedFiles.value.length}`);
multiSelectedIdxs.value = range(0, sortedFiles.value.length)
}
useEventListen.value('selectAll', selectAll)
return {
locInputValue,
isLocationEditing,
@ -694,10 +698,7 @@ export function useFileTransfer() {
nodes: uniqBy(files, 'fullpath'),
__id: 'FileTransferData'
}
e.dataTransfer!.setData(
'text/plain',
JSON.stringify(data)
)
e.dataTransfer!.setData('text/plain', JSON.stringify(data))
}
const onFileDragEnd = () => {
@ -745,8 +746,17 @@ export function useFileItemActions(
) {
const showGenInfo = ref(false)
const imageGenInfo = ref('')
const { sortedFiles, previewIdx, multiSelectedIdxs, stack, currLocation, spinning, previewing } =
useHookShareState().toRefs()
const {
sortedFiles,
previewIdx,
multiSelectedIdxs,
stack,
currLocation,
spinning,
previewing,
stackViewEl,
eventEmitter
} = useHookShareState().toRefs()
const nor = Path.normalize
useEventListen('removeFiles', ({ paths, loc }) => {
if (nor(loc) !== nor(currLocation.value)) {
@ -1002,43 +1012,39 @@ export function useFileItemActions(
return {}
}
const { isOutside } = useMouseInElement(stackViewEl)
useWatchDocument('keydown', (e) => {
const keysStr = getShortcutStrFromEvent(e)
if (previewing.value) {
const keys = [] as string[]
if (e.shiftKey) {
keys.push('Shift')
}
if (e.ctrlKey) {
keys.push('Ctrl')
}
if (e.code.startsWith('Key') || e.code.startsWith('Digit')) {
keys.push(e.code)
const keysStr = keys.join(' + ')
const action = Object.entries(global.shortcut).find(
(v) => v[1] === keysStr
)?.[0] as keyof Shortcut
if (action) {
// message.info(t('shortcutTrigger', { action: t(action) }))
e.stopPropagation()
e.preventDefault()
const idx = previewIdx.value
const file = sortedFiles.value[idx]
switch (action) {
case 'delete': {
if (toRawFileUrl(file) === global.fullscreenPreviewInitialUrl) {
return message.warn(t('fullscreenRestriction'))
}
return onContextMenuClick({ key: 'deleteFiles' } as MenuInfo, file, idx)
}
default: {
const name = /^toggle_tag_(.*)$/.exec(action)?.[1]
const tag = global.conf?.all_custom_tags.find((v) => v.name === name)
if (!tag) return
return onContextMenuClick({ key: `toggle-tag-${tag.id}` } as MenuInfo, file, idx)
const action = Object.entries(global.shortcut).find(
(v) => v[1] === keysStr
)?.[0] as keyof Shortcut
if (action) {
e.stopPropagation()
e.preventDefault()
const idx = previewIdx.value
const file = sortedFiles.value[idx]
switch (action) {
case 'delete': {
if (toRawFileUrl(file) === global.fullscreenPreviewInitialUrl) {
return message.warn(t('fullscreenRestriction'))
}
return onContextMenuClick({ key: 'deleteFiles' } as MenuInfo, file, idx)
}
default: {
const name = /^toggle_tag_(.*)$/.exec(action)?.[1]
const tag = global.conf?.all_custom_tags.find((v) => v.name === name)
if (!tag) return
return onContextMenuClick({ key: `toggle-tag-${tag.id}` } as MenuInfo, file, idx)
}
}
}
} else if (!isOutside.value && ['Ctrl + KeyA', 'Cmd + KeyA'].includes(keysStr)) {
e.preventDefault()
e.stopPropagation()
eventEmitter.value.emit('selectAll')
}
})

View File

@ -8,6 +8,7 @@ import { viewModes } from '../page/fileTransfer/hook'
import { relaunch } from '@tauri-apps/api/process'
import { appConfFilename } from '@/taurilaunchModal'
import { fs, invoke } from '@tauri-apps/api'
import { getShortcutStrFromEvent } from '@/util/shortcut'
const globalStore = useGlobalStore()
@ -17,15 +18,9 @@ const reload = async () => {
}
const langs: { text: string, value: string }[] = [{ value: 'en', text: 'English' }, { value: 'zh', text: '中文' }, { value: 'de', text: 'Deutsch' }]
const onShortcutKeyDown = (e: KeyboardEvent, key: keyof Shortcut) => {
const keys = [] as string[]
if (e.shiftKey) {
keys.push('Shift')
} if (e.ctrlKey) {
keys.push('Ctrl')
}
if (e.code.startsWith('Key') || e.code.startsWith('Digit')) {
keys.push(e.code)
globalStore.shortcut[key] = keys.join(' + ')
const keysStr = getShortcutStrFromEvent(e)
if (keysStr) {
globalStore.shortcut[key] = keysStr
}
}
const isTauri = !!import.meta.env.TAURI_ARCH
@ -47,7 +42,8 @@ const oninitTauriLaunchConf = async () => {
<search-select v-model:value="globalStore.defaultSortingMethod" :conv="sortMethodConv" :options="sortMethods" />
</a-form-item>
<a-form-item :label="$t('defaultViewMode')">
<search-select v-model:value="globalStore.defaultViewMode" :conv="{ value: v => v, text: v => $t(v) }" :options="viewModes" />
<search-select v-model:value="globalStore.defaultViewMode" :conv="{ value: v => v, text: v => $t(v) }"
:options="viewModes" />
</a-form-item>
<a-form-item :label="$t('gridThumbnailWidth')">
<a-input-number v-model:value="globalStore.gridThumbnailSize" :min="256" :max="1024" /> (px)
@ -91,13 +87,13 @@ const oninitTauriLaunchConf = async () => {
</a-form-item>
<template v-if="isTauri">
<h2>{{ t('clientSpecificSettings') }}</h2>
<a-form-item >
<div class="col">
<a-button @click="oninitTauriLaunchConf" class="clear-btn">
{{ $t('initiateSoftwareStartupConfig') }}
</a-button>
</div>
</a-form-item>
<a-form-item>
<div class="col">
<a-button @click="oninitTauriLaunchConf" class="clear-btn">
{{ $t('initiateSoftwareStartupConfig') }}
</a-button>
</div>
</a-form-item>
</template>
</a-form>
</div>

17
vue/src/util/shortcut.ts Normal file
View File

@ -0,0 +1,17 @@
export const getShortcutStrFromEvent = (e: KeyboardEvent) => {
const keys = [] as string[]
if (e.shiftKey) {
keys.push('Shift')
}
if (e.ctrlKey) {
keys.push('Ctrl')
}
if (e.metaKey) {
keys.push('Cmd')
}
if (e.code.startsWith('Key') || e.code.startsWith('Digit')) {
keys.push(e.code)
}
const keysStr = keys.join(' + ')
return keysStr
}