Add feature to add current folder to scan path and open local folder in default browser

pull/162/head
zanllp 2023-05-21 01:12:13 +08:00
parent 4720b15126
commit db0a3ed04b
44 changed files with 478 additions and 254 deletions

View File

@ -12,7 +12,7 @@
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-a5687a52.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-47599eb5.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-050489b7.css">
</head>

View File

@ -1,6 +1,7 @@
from datetime import datetime, timedelta
import os
import shutil
import sqlite3
from scripts.tool import (
human_readable_size,
is_valid_image_path,
@ -13,7 +14,8 @@ from scripts.tool import (
get_windows_drives,
get_sd_webui_conf,
get_valid_img_dirs,
get_created_date
get_created_date,
open_folder
)
from fastapi import FastAPI, HTTPException
from fastapi.staticfiles import StaticFiles
@ -24,7 +26,14 @@ from fastapi.responses import FileResponse, RedirectResponse
from PIL import Image
import hashlib
from urllib.parse import urlencode
from scripts.db.datamodel import DataBase, Image as DbImg, Tag, Floder, ImageTag
from scripts.db.datamodel import (
DataBase,
Image as DbImg,
Tag,
Floder,
ImageTag,
ExtraPath,
)
from scripts.db.update_image_data import update_image_data
from scripts.logger import logger
@ -47,8 +56,12 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
@app.get(f"{pre}/global_setting")
async def global_setting():
all_custom_tags = []
extra_paths = []
try:
all_custom_tags = Tag.get_all_custom_tag(DataBase.get_conn())
conn = DataBase.get_conn()
all_custom_tags = Tag.get_all_custom_tag(conn)
extra_paths = ExtraPath.get_extra_paths(conn)
except Exception as e:
print(e)
return {
@ -58,6 +71,7 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
"home": os.environ.get("USERPROFILE") if is_win else os.environ.get("HOME"),
"sd_cwd": os.getcwd(),
"all_custom_tags": all_custom_tags,
"extra_paths": extra_paths
}
class DeleteFilesReq(BaseModel):
@ -116,9 +130,7 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
raise HTTPException(400, detail=error_msg)
@app.get(pre + "/files")
async def get_target_floder_files(
folder_path: str
):
async def get_target_floder_files(folder_path: str):
files = []
try:
if is_win and folder_path == "/":
@ -169,14 +181,14 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
return {"files": files}
@app.get(pre + "/image-thumbnail")
async def thumbnail(path: str, t: str , size: str = "256x256"):
async def thumbnail(path: str, t: str, size: str = "256x256"):
if not temp_path:
encoded_params = urlencode({"filename": path, "t" : t })
encoded_params = urlencode({"filename": path, "t": t})
return RedirectResponse(url=f"{pre}/file?{encoded_params}")
# 生成缓存文件的路径
hash_dir = hashlib.md5((path + t).encode("utf-8")).hexdigest()
hash = hash_dir + size
cache_dir = os.path.join(temp_path, 'iib_cache', hash_dir)
cache_dir = os.path.join(temp_path, "iib_cache", hash_dir)
cache_path = os.path.join(cache_dir, f"{size}.webp")
# 如果缓存文件存在,则直接返回该文件
@ -201,29 +213,31 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
headers={"Cache-Control": "max-age=31536000", "ETag": hash},
)
forever_cache_path = []
img_search_dirs = []
try:
forever_cache_path = get_valid_img_dirs(get_sd_webui_conf(**kwargs))
img_search_dirs = forever_cache_path
img_search_dirs = get_valid_img_dirs(get_sd_webui_conf(**kwargs))
except:
pass
def need_cache(path, parent_paths=forever_cache_path):
def need_cache(path, parent_paths=img_search_dirs):
"""
判断 path 是否是 parent_paths 中某个路径的子路径
"""
try:
for parent_path in parent_paths:
if os.path.commonpath([os.path.normpath(path), parent_path]) == parent_path:
if (
os.path.commonpath([os.path.normpath(path), parent_path])
== parent_path
):
return True
except:
pass
return False
@app.get(pre + "/file")
async def get_file(filename: str, t: str , disposition: Optional[str] = None):
async def get_file(filename: str, t: str, disposition: Optional[str] = None):
import mimetypes
if not os.path.exists(filename):
raise HTTPException(status_code=404)
if not os.path.isfile(filename):
@ -234,7 +248,9 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
if disposition:
headers["Content-Disposition"] = f'attachment; filename="{disposition}"'
if need_cache(filename) and is_valid_image_path(filename): # 认为永远不变,不要协商缓存了试试
headers["Cache-Control"] = "public, max-age=31536000" # 针对同样名字文件但实际上不同内容的文件要求必须传入创建时间来避免浏览器缓存
headers[
"Cache-Control"
] = "public, max-age=31536000" # 针对同样名字文件但实际上不同内容的文件要求必须传入创建时间来避免浏览器缓存
headers["Expires"] = (datetime.now() + timedelta(days=365)).strftime(
"%a, %d %b %Y %H:%M:%S GMT"
)
@ -278,6 +294,14 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
@app.get(pre)
def index_bd():
return FileResponse(os.path.join(cwd, "vue/dist/index.html"))
class OpenFolderReq(BaseModel):
path: str
@app.post(pre + "/open_folder")
def open_folder_using_explore(req: OpenFolderReq):
open_folder(*os.path.split(req.path))
db_pre = pre + "/db"
@ -294,7 +318,7 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
"expired_dirs": expired_dirs,
}
@app.get(db_pre+"/expired_dirs")
@app.get(db_pre + "/expired_dirs")
async def get_db_expired():
conn = DataBase.get_conn()
expired_dirs = Floder.get_expired_dirs(conn)
@ -302,6 +326,10 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
"expired": len(expired_dirs) != 0,
"expired_dirs": expired_dirs,
}
def get_extra_paths(conn: sqlite3.Connection):
r = ExtraPath.get_extra_paths(conn, "scanned")
return [x.path for x in r]
@app.post(db_pre + "/update_image_data")
async def update_image_db_data():
@ -309,9 +337,10 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
DataBase._initing = True
conn = DataBase.get_conn()
img_count = DbImg.count(conn)
update_image_data(
dirs = (
img_search_dirs if img_count == 0 else Floder.get_expired_dirs(conn)
)
) + get_extra_paths(conn)
update_image_data(dirs)
finally:
DataBase._initing = False
@ -324,19 +353,18 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
async def match_image_by_tags(req: MatchImagesByTagsReq):
conn = DataBase.get_conn()
return [
x.to_file_info() for x in ImageTag.get_images_by_tags(conn, {
"and": req.and_tags,
"or": req.or_tags,
"not": req.not_tags
})
x.to_file_info()
for x in ImageTag.get_images_by_tags(
conn, {"and": req.and_tags, "or": req.or_tags, "not": req.not_tags}
)
]
@app.get(db_pre + "/img_selected_custom_tag")
async def get_img_selected_custom_tag(path: str):
path = os.path.normpath(path)
if not need_cache(path):
return []
conn = DataBase.get_conn()
if not need_cache(path, img_search_dirs + get_extra_paths(conn)):
return []
img = DbImg.get(conn, path)
if not img:
if DbImg.count(conn) == 0:
@ -355,12 +383,12 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
async def toggle_custom_tag_to_img(req: ToggleCustomTagToImgReq):
conn = DataBase.get_conn()
path = os.path.normpath(req.img_path)
if not need_cache(path):
if not need_cache(path, img_search_dirs + get_extra_paths(conn)):
raise HTTPException(
400,
"非 Stable Diffusion webui 文件夹下不支持切换 tag如果有需要请提 Issue"
"当前文件不在搜索路径内,你可以将它添加到扫描路径再尝试。"
if locale == "zh"
else "Tag toggleing is not supported outside the Stable Diffusion webui folder. Please open an issue if you have any questions.",
else "The current file is not within the scan path. You can add it to the scan path and try again.",
)
img = DbImg.get(conn, path)
if not img:
@ -413,6 +441,27 @@ def infinite_image_browsing_api(_: Any, app: FastAPI, **kwargs):
async def search_by_substr(substr: str):
conn = DataBase.get_conn()
imgs = DbImg.find_by_substring(conn=conn, substring=substr)
return [
x.to_file_info() for x in imgs
]
return [x.to_file_info() for x in imgs]
class ScannedPathModel(BaseModel):
path: str
@app.post(f"{db_pre}/scanned_paths", status_code=201)
async def create_scanned_path(scanned_path: ScannedPathModel):
conn = DataBase.get_conn()
path = ExtraPath(scanned_path.path)
try:
path.save(conn)
finally:
conn.commit()
@app.get(f"{db_pre}/scanned_paths", response_model=List[ScannedPathModel])
async def read_scanned_paths():
conn = DataBase.get_conn()
paths = ExtraPath.get_extra_paths(conn, "scanned")
return [{"path": path.path} for path in paths]
@app.delete(f"{db_pre}/scanned_paths")
async def delete_scanned_path(scanned_path: ScannedPathModel):
conn = DataBase.get_conn()
ExtraPath.remove(conn, scanned_path.path)

View File

@ -33,11 +33,14 @@ class DataBase:
def init(clz):
# 创建连接并打开数据库
conn = connect(os.path.join(cwd, "iib.db"))
Floder.create_table(conn)
ImageTag.create_table(conn)
Tag.create_table(conn)
Image.create_table(conn)
conn.commit()
try:
Floder.create_table(conn)
ImageTag.create_table(conn)
Tag.create_table(conn)
Image.create_table(conn)
ExtraPath.create_table(conn)
finally:
conn.commit()
clz.num += 1
if is_dev:
print(f"当前连接数{clz.num}")
@ -472,3 +475,58 @@ class Floder:
):
dirs.append(folder_path)
return dirs
@classmethod
def remove_folder(cls, conn: Connection, folder_path: str):
folder_path = os.path.normpath(folder_path)
with closing(conn.cursor()) as cur:
cur.execute("DELETE FROM folders WHERE path = ?", (folder_path,))
# Define the ScannedPath class
class ExtraPath:
def __init__(self, path: str, type: str = "scanned"):
self.path = os.path.normpath(path)
self.type = type
def save(self, conn):
with closing(conn.cursor()) as cur:
cur.execute(
"INSERT INTO extra_path (path, type) VALUES (?, ?) ON CONFLICT (path) DO UPDATE SET type = ?",
(self.path, self.type, self.type),
)
@classmethod
def get_extra_paths(cls, conn, type: str = "scanned"):
query = "SELECT * FROM extra_path"
params = ()
if type:
query += " WHERE type = ?"
params = (type,)
with closing(conn.cursor()) as cur:
cur.execute(query, params)
rows = cur.fetchall()
paths: List[ExtraPath] = []
for row in rows:
paths.append(ExtraPath(row[0], row[1]))
return paths
@classmethod
def remove(cls, conn, path: str):
with closing(conn.cursor()) as cur:
cur.execute(
"DELETE FROM extra_path WHERE path = ?",
(os.path.normpath(path),),
)
Floder.remove_folder(conn, path)
conn.commit()
@classmethod
def create_table(cls, conn):
with closing(conn.cursor()) as cur:
cur.execute(
"""CREATE TABLE IF NOT EXISTS extra_path (
path TEXT PRIMARY KEY,
type TEXT NOT NULL
)"""
)

View File

@ -4,6 +4,7 @@ import platform
import re
import tempfile
import imghdr
import subprocess
from typing import Dict
import piexif
import piexif.helper
@ -327,3 +328,22 @@ try:
tags_translate[en.strip()] = mapping.strip()
except Exception as e:
pass
def open_folder(folder_path, file_path=None):
folder = os.path.realpath(folder_path)
if file_path:
file = os.path.join(folder, file_path)
if os.name == 'nt':
subprocess.run(['explorer', '/select,', file])
elif os.name == 'posix':
subprocess.run(['xdg-open', file])
elif os.name == 'mac':
subprocess.run(['open', '-R', file])
else:
if os.name == 'nt':
subprocess.run(['explorer', folder])
elif os.name == 'posix':
subprocess.run(['xdg-open', folder])
elif os.name == 'mac':
subprocess.run(['open', folder])

View File

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

View File

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

View File

@ -1 +1 @@
import{d as j,r as B,ac as H,b2 as J,b3 as K,o as a,l as k,c as o,y as m,m as r,B as C,t as v,n as e,J as f,p as $,q as A,A as W,I as V,b7 as X,T as Y,L as Z,Q as ee}from"./index-a5687a52.js";import{i as te,j as se,t as ie,L as ne,R as le,k as ae,S as oe}from"./fullScreenContextMenu-7cbc670b.js";import{I as re}from"./index-044e89b1.js";import{a as U,b as ue,d as de,M as ce,u as pe}from"./db-afff9ac2.js";import{u as me}from"./hook-3bd9513c.js";import{B as ve}from"./button-292ccdcf.js";import"./index-fb4448a6.js";import"./_baseIteratee-6fddf15e.js";const fe={key:0,class:"search-bar"},ge={class:"hint"},ke={key:1,class:"preview-switch"},Ce=j({__name:"SubstrSearch",setup(be){const{queue:u,images:n,onContextMenuClickU:b,stackViewEl:D,previewIdx:d,previewing:w,onPreviewVisibleChange:E,previewImgMove:y,canPreview:I,itemSize:_,gridItems:F,showGenInfo:c,imageGenInfo:x,q:R,multiSelectedIdxs:T,onFileItemClick:q,scroller:h,showMenuIdx:g}=me(),p=B(""),s=B();H(async()=>{s.value=await U(),s.value.img_count&&s.value.expired&&S()});const S=J(()=>u.pushAction(async()=>(await pe(),s.value=await U(),s.value)).res),L=async()=>{var i;n.value=await u.pushAction(()=>de(p.value)).res,(i=h.value)==null||i.scrollToItem(0),n.value.length||X.info(Y("fuzzy-search-noResults"))};return K("return-to-iib",async()=>{const i=await u.pushAction(ue).res;s.value.expired=i.expired}),(i,t)=>{const N=re,M=ve,P=Z,G=ce,O=oe;return a(),k("div",{class:"container",ref_key:"stackViewEl",ref:D},[s.value?(a(),k("div",fe,[o(N,{value:p.value,"onUpdate:value":t[0]||(t[0]=l=>p.value=l),placeholder:i.$t("fuzzy-search-placeholder")},null,8,["value","placeholder"]),s.value.expired||!s.value.img_count?(a(),m(M,{key:0,onClick:e(S),loading:!e(u).isIdle,type:"primary"},{default:r(()=>[C(v(s.value.img_count===0?i.$t("generateIndexHint"):i.$t("UpdateIndex")),1)]),_:1},8,["onClick","loading"])):(a(),m(M,{key:1,type:"primary",onClick:L,loading:!e(u).isIdle,disabled:!p.value},{default:r(()=>[C(v(i.$t("search")),1)]),_:1},8,["loading","disabled"]))])):f("",!0),o(O,{size:"large",spinning:!e(u).isIdle},{default:r(()=>[o(G,{visible:e(c),"onUpdate:visible":t[2]||(t[2]=l=>$(c)?c.value=l:null),width:"70vw","mask-closable":"",onOk:t[3]||(t[3]=l=>c.value=!1)},{cancelText:r(()=>[]),default:r(()=>[o(P,{active:"",loading:!e(R).isIdle},{default:r(()=>[A("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[1]||(t[1]=l=>e(W)(e(x)))},[A("div",ge,v(i.$t("doubleClickToCopy")),1),C(" "+v(e(x)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(n)?(a(),m(e(te),{key:0,ref_key:"scroller",ref:h,class:"file-list",items:e(n),"item-size":e(_).first,"key-field":"fullpath","item-secondary-size":e(_).second,gridItems:e(F)},{default:r(({item:l,index:z})=>[o(se,{idx:z,file:l,"show-menu-idx":e(g),"onUpdate:showMenuIdx":t[4]||(t[4]=Q=>$(g)?g.value=Q:null),onFileItemClick:e(q),"full-screen-preview-image-url":e(n)[e(d)]?e(ie)(e(n)[e(d)]):"",selected:e(T).includes(z),onContextMenuClick:e(b),onPreviewVisibleChange:e(E)},null,8,["idx","file","show-menu-idx","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):f("",!0),e(w)?(a(),k("div",ke,[o(e(ne),{onClick:t[5]||(t[5]=l=>e(y)("prev")),class:V({disable:!e(I)("prev")})},null,8,["class"]),o(e(le),{onClick:t[6]||(t[6]=l=>e(y)("next")),class:V({disable:!e(I)("next")})},null,8,["class"])])):f("",!0)]),_:1},8,["spinning"]),e(w)&&e(n)&&e(n)[e(d)]?(a(),m(ae,{key:1,file:e(n)[e(d)],idx:e(d),onContextMenuClick:e(b)},null,8,["file","idx","onContextMenuClick"])):f("",!0)],512)}}});const ze=ee(Ce,[["__scopeId","data-v-2feb1838"]]);export{ze as default};
import{d as j,r as B,ad as K,b3 as Q,b4 as J,o as a,l as k,c as o,y as m,m as r,B as C,t as v,n as e,H as f,p as $,q as A,A as W,K as V,b8 as X,U as Y,N as Z,R as ee}from"./index-47599eb5.js";import{i as te,j as se,t as ie,L as ne,R as le,k as ae,S as oe}from"./fullScreenContextMenu-c0de5f87.js";import{I as re}from"./index-8944a1b1.js";import{a as U,b as ue,d as de,M as ce,u as pe}from"./db-095a569c.js";import{u as me}from"./hook-c12c6e94.js";import{B as ve}from"./button-6ac51d33.js";import"./index-58130b51.js";import"./_baseIteratee-cd3fa87f.js";const fe={key:0,class:"search-bar"},ge={class:"hint"},ke={key:1,class:"preview-switch"},Ce=j({__name:"SubstrSearch",setup(be){const{queue:u,images:n,onContextMenuClickU:b,stackViewEl:R,previewIdx:d,previewing:w,onPreviewVisibleChange:D,previewImgMove:y,canPreview:I,itemSize:_,gridItems:E,showGenInfo:c,imageGenInfo:x,q:F,multiSelectedIdxs:N,onFileItemClick:q,scroller:h,showMenuIdx:g}=me(),p=B(""),s=B();K(async()=>{s.value=await U(),s.value.img_count&&s.value.expired&&S()});const S=Q(()=>u.pushAction(async()=>(await pe(),s.value=await U(),s.value)).res),P=async()=>{var i;n.value=await u.pushAction(()=>de(p.value)).res,(i=h.value)==null||i.scrollToItem(0),n.value.length||X.info(Y("fuzzy-search-noResults"))};return J("return-to-iib",async()=>{const i=await u.pushAction(ue).res;s.value.expired=i.expired}),(i,t)=>{const T=re,M=ve,G=Z,L=ce,O=oe;return a(),k("div",{class:"container",ref_key:"stackViewEl",ref:R},[s.value?(a(),k("div",fe,[o(T,{value:p.value,"onUpdate:value":t[0]||(t[0]=l=>p.value=l),placeholder:i.$t("fuzzy-search-placeholder")},null,8,["value","placeholder"]),s.value.expired||!s.value.img_count?(a(),m(M,{key:0,onClick:e(S),loading:!e(u).isIdle,type:"primary"},{default:r(()=>[C(v(s.value.img_count===0?i.$t("generateIndexHint"):i.$t("UpdateIndex")),1)]),_:1},8,["onClick","loading"])):(a(),m(M,{key:1,type:"primary",onClick:P,loading:!e(u).isIdle,disabled:!p.value},{default:r(()=>[C(v(i.$t("search")),1)]),_:1},8,["loading","disabled"]))])):f("",!0),o(O,{size:"large",spinning:!e(u).isIdle},{default:r(()=>[o(L,{visible:e(c),"onUpdate:visible":t[2]||(t[2]=l=>$(c)?c.value=l:null),width:"70vw","mask-closable":"",onOk:t[3]||(t[3]=l=>c.value=!1)},{cancelText:r(()=>[]),default:r(()=>[o(G,{active:"",loading:!e(F).isIdle},{default:r(()=>[A("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[1]||(t[1]=l=>e(W)(e(x)))},[A("div",ge,v(i.$t("doubleClickToCopy")),1),C(" "+v(e(x)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(n)?(a(),m(e(te),{key:0,ref_key:"scroller",ref:h,class:"file-list",items:e(n),"item-size":e(_).first,"key-field":"fullpath","item-secondary-size":e(_).second,gridItems:e(E)},{default:r(({item:l,index:z})=>[o(se,{idx:z,file:l,"show-menu-idx":e(g),"onUpdate:showMenuIdx":t[4]||(t[4]=H=>$(g)?g.value=H:null),onFileItemClick:e(q),"full-screen-preview-image-url":e(n)[e(d)]?e(ie)(e(n)[e(d)]):"",selected:e(N).includes(z),onContextMenuClick:e(b),onPreviewVisibleChange:e(D)},null,8,["idx","file","show-menu-idx","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):f("",!0),e(w)?(a(),k("div",ke,[o(e(ne),{onClick:t[5]||(t[5]=l=>e(y)("prev")),class:V({disable:!e(I)("prev")})},null,8,["class"]),o(e(le),{onClick:t[6]||(t[6]=l=>e(y)("next")),class:V({disable:!e(I)("next")})},null,8,["class"])])):f("",!0)]),_:1},8,["spinning"]),e(w)&&e(n)&&e(n)[e(d)]?(a(),m(ae,{key:1,file:e(n)[e(d)],idx:e(d),onContextMenuClick:e(b)},null,8,["file","idx","onContextMenuClick"])):f("",!0)],512)}}});const ze=ee(Ce,[["__scopeId","data-v-2feb1838"]]);export{ze as default};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{cc as C,c5 as P,cd as g,ce as m,bB as w,ap as O,aP as h,cf as E,aR as A,cg as R,aN as b,a$ as x}from"./index-a5687a52.js";function y(e,n){for(var r=0;r<n.length;r++){var t=n[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,C(t.key),t)}}function H(e,n,r){return n&&y(e.prototype,n),r&&y(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function J(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function D(e){return function(n){return n==null?void 0:n[e]}}var G=function(){return P()&&window.document.documentElement},u,Q=function(){if(!G())return!1;if(u!==void 0)return u;var n=document.createElement("div");return n.style.display="flex",n.style.flexDirection="column",n.style.rowGap="1px",n.appendChild(document.createElement("div")),n.appendChild(document.createElement("div")),document.body.appendChild(n),u=n.scrollHeight===1,document.body.removeChild(n),u},M=1,F=2;function I(e,n,r,t){var i=r.length,s=i,o=!t;if(e==null)return!s;for(e=Object(e);i--;){var f=r[i];if(o&&f[2]?f[1]!==e[f[0]]:!(f[0]in e))return!1}for(;++i<s;){f=r[i];var a=f[0],l=e[a],c=f[1];if(o&&f[2]){if(l===void 0&&!(a in e))return!1}else{var d=new g;if(t)var p=t(l,c,a,e,n,d);if(!(p===void 0?m(c,l,M|F,t,d):p))return!1}}return!0}function _(e){return e===e&&!w(e)}function L(e){for(var n=O(e),r=n.length;r--;){var t=n[r],i=e[t];n[r]=[t,i,_(i)]}return n}function v(e,n){return function(r){return r==null?!1:r[e]===n&&(n!==void 0||e in Object(r))}}function S(e){var n=L(e);return n.length==1&&n[0][2]?v(n[0][0],n[0][1]):function(r){return r===e||I(r,e,n)}}function U(e,n,r){var t=e==null?void 0:h(e,n);return t===void 0?r:t}var K=1,N=2;function T(e,n){return E(e)&&_(n)?v(A(e),n):function(r){var t=U(r,e);return t===void 0&&t===n?R(r,e):m(n,t,K|N)}}function $(e){return function(n){return h(n,e)}}function q(e){return E(e)?D(A(e)):$(e)}function W(e){return typeof e=="function"?e:e==null?b:typeof e=="object"?x(e)?T(e[0],e[1]):S(e):q(e)}export{H as _,J as a,W as b,G as c,Q as d};

View File

@ -0,0 +1 @@
import{cj as v,cc as O,ck as b,cl as y,bC as w,aq as P,aQ as h,cm as E,aS as A,cn as g,aO as R,b0 as x}from"./index-47599eb5.js";function m(e,n){for(var r=0;r<n.length;r++){var t=n[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,v(t.key),t)}}function Q(e,n,r){return n&&m(e.prototype,n),r&&m(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function k(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function D(e){return function(n){return n==null?void 0:n[e]}}var G=function(){return O()&&window.document.documentElement},u,B=function(){if(!G())return!1;if(u!==void 0)return u;var n=document.createElement("div");return n.style.display="flex",n.style.flexDirection="column",n.style.rowGap="1px",n.appendChild(document.createElement("div")),n.appendChild(document.createElement("div")),document.body.appendChild(n),u=n.scrollHeight===1,document.body.removeChild(n),u},M=1,S=2;function F(e,n,r,t){var i=r.length,s=i,o=!t;if(e==null)return!s;for(e=Object(e);i--;){var f=r[i];if(o&&f[2]?f[1]!==e[f[0]]:!(f[0]in e))return!1}for(;++i<s;){f=r[i];var a=f[0],l=e[a],c=f[1];if(o&&f[2]){if(l===void 0&&!(a in e))return!1}else{var d=new b;if(t)var p=t(l,c,a,e,n,d);if(!(p===void 0?y(c,l,M|S,t,d):p))return!1}}return!0}function C(e){return e===e&&!w(e)}function I(e){for(var n=P(e),r=n.length;r--;){var t=n[r],i=e[t];n[r]=[t,i,C(i)]}return n}function _(e,n){return function(r){return r==null?!1:r[e]===n&&(n!==void 0||e in Object(r))}}function L(e){var n=I(e);return n.length==1&&n[0][2]?_(n[0][0],n[0][1]):function(r){return r===e||F(r,e,n)}}function U(e,n,r){var t=e==null?void 0:h(e,n);return t===void 0?r:t}var K=1,T=2;function q(e,n){return E(e)&&C(n)?_(A(e),n):function(r){var t=U(r,e);return t===void 0&&t===n?g(r,e):y(n,t,K|T)}}function N(e){return function(n){return h(n,e)}}function $(e){return E(e)?D(A(e)):N(e)}function J(e){return typeof e=="function"?e:e==null?R:typeof e=="object"?x(e)?q(e[0],e[1]):L(e):$(e)}export{Q as _,k as a,J as b,G as c,B as d};

File diff suppressed because one or more lines are too long

4
vue/dist/assets/button-6ac51d33.js vendored Normal file

File diff suppressed because one or more lines are too long

1
vue/dist/assets/db-095a569c.js vendored Normal file

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{c as w,R as L,d as x,v as B,T as f,U as O,o,l as c,q as s,t as r,J as h,n as d,z as k,s as v,C as g,m as F,B as M,V as q,W as N,X as V,Y as j,Z as H,Q as P}from"./index-a5687a52.js";import{B as R}from"./button-292ccdcf.js";var E={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M688 312v-48c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8zm-392 88c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296zm376 116c-119.3 0-216 96.7-216 216s96.7 216 216 216 216-96.7 216-216-96.7-216-216-216zm107.5 323.5C750.8 868.2 712.6 884 672 884s-78.8-15.8-107.5-44.5C535.8 810.8 520 772.6 520 732s15.8-78.8 44.5-107.5C593.2 595.8 631.4 580 672 580s78.8 15.8 107.5 44.5C808.2 653.2 824 691.4 824 732s-15.8 78.8-44.5 107.5zM761 656h-44.3c-2.6 0-5 1.2-6.5 3.3l-63.5 87.8-23.1-31.9a7.92 7.92 0 00-6.5-3.3H573c-6.5 0-10.3 7.4-6.5 12.7l73.8 102.1c3.2 4.4 9.7 4.4 12.9 0l114.2-158c3.9-5.3.1-12.7-6.4-12.7zM440 852H208V148h560v344c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h272c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z"}}]},name:"file-done",theme:"outlined"};const T=E;function D(a){for(var l=1;l<arguments.length;l++){var t=arguments[l]!=null?Object(arguments[l]):{},i=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(i=i.concat(Object.getOwnPropertySymbols(t).filter(function(u){return Object.getOwnPropertyDescriptor(t,u).enumerable}))),i.forEach(function(u){W(a,u,t[u])})}return a}function W(a,l,t){return l in a?Object.defineProperty(a,l,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[l]=t,a}var C=function(l,t){var i=D({},l,t.attrs);return w(L,D({},i,{icon:T}),null)};C.displayName="FileDoneOutlined";C.inheritAttrs=!1;const A=C,Q=a=>(j("data-v-4cfb5adf"),a=a(),H(),a),G={class:"container"},J={class:"header"},U=Q(()=>s("div",{"flex-placeholder":""},null,-1)),X={class:"last-record"},Y=["onClick"],Z={href:"https://github.com/zanllp/sd-webui-infinite-image-browsing/issues/90",target:"_blank",class:"last-record"},K={class:"content"},ee={key:0,class:"quick-start"},te={key:1,class:"quick-start"},se=["onClick"],ne={class:"quick-start__text line-clamp-1"},ae={class:"quick-start"},oe=["onClick"],ce={class:"quick-start__text line-clamp-1"},le={key:2,class:"quick-start"},re=["onClick"],ie={class:"quick-start__text line-clamp-1"},ue=x({__name:"emptyStartup",props:{tabIdx:null,paneIdx:null},setup(a){const l=a,t=B(),i={local:f("local"),"tag-search":f("imgSearch"),"fuzzy-search":f("fuzzy-search"),"global-setting":f("globalSettings")},u=(e,_,b=!1)=>{let p;switch(e){case"tag-search-matched-image-grid":return;case"global-setting":case"tag-search":case"fuzzy-search":case"empty":p={type:e,name:i[e],key:Date.now()+q()};break;case"local":p={type:e,name:i[e],key:Date.now()+q(),path:_,walkMode:b}}const n=t.tabList[l.tabIdx];n.panes.splice(l.paneIdx,1,p),n.key=p.key},m=O(()=>{var e;return(e=t.lastTabListRecord)==null?void 0:e[1]});console.log(m.value);const z=O(()=>t.autoCompletedDirList.filter(({key:e})=>e==="outdir_txt2img_samples"||e==="outdir_img2img_samples")),I=window.parent!==window,S=()=>window.parent.open("/infinite_image_browsing"),$=()=>{N(m.value),t.tabList=m.value.tabs.map(e=>V(e,!0)),t.tabList.forEach(e=>{e.panes.forEach(_=>{typeof _.name!="string"&&(_.name="")})})};return(e,_)=>{var p;const b=R;return o(),c("div",G,[s("div",J,[s("h1",null,r(e.$t("welcome")),1),U,I?(o(),c("div",{key:0,class:"last-record",onClick:S},[s("a",null,r(e.$t("openInNewWindow")),1)])):h("",!0),s("div",X,[(p=d(m))!=null&&p.tabs.length?(o(),c("a",{key:0,onClick:k($,["prevent"])},r(e.$t("restoreLastRecord")),9,Y)):h("",!0)]),s("a",Z,r(e.$t("faq")),1)]),s("div",K,[d(z).length?(o(),c("div",ee,[s("h2",null,r(e.$t("walkMode")),1),s("ul",null,[(o(!0),c(v,null,g(d(z),n=>(o(),c("li",{key:n.dir,class:"quick-start__item"},[w(b,{onClick:y=>u("local",n.dir,!0),ghost:"",type:"primary",block:""},{default:F(()=>[M(r(n.zh),1)]),_:2},1032,["onClick"])]))),128))])])):h("",!0),d(t).autoCompletedDirList.length?(o(),c("div",te,[s("h2",null,r(e.$t("launchFromQuickMove")),1),s("ul",null,[(o(!0),c(v,null,g(d(t).autoCompletedDirList,n=>(o(),c("li",{key:n.key,class:"quick-start__item",onClick:k(y=>u("local",n.dir),["prevent"])},[s("span",ne,r(n.zh),1)],8,se))),128))])])):h("",!0),s("div",ae,[s("h2",null,r(e.$t("launch")),1),s("ul",null,[(o(!0),c(v,null,g(Object.keys(i),n=>(o(),c("li",{key:n,class:"quick-start__item",onClick:k(y=>u(n),["prevent"])},[s("span",ce,r(i[n]),1)],8,oe))),128))])]),d(t).recent.length?(o(),c("div",le,[s("h2",null,r(e.$t("recent")),1),s("ul",null,[(o(!0),c(v,null,g(d(t).recent,n=>(o(),c("li",{key:n.key,class:"quick-start__item",onClick:k(y=>u("local",n.path),["prevent"])},[w(d(A),{class:"quick-start__icon"}),s("span",ie,r(n.path),1)],8,re))),128))])])):h("",!0)])])}}});const _e=P(ue,[["__scopeId","data-v-4cfb5adf"]]);export{_e as default};
import{c as w,T as L,d as x,v as B,U as f,V as O,o,l as c,q as s,t as r,H as h,n as d,z as k,s as v,C as g,m as F,B as M,W as q,X as N,Y as V,Z as H,$ as j,R as P}from"./index-47599eb5.js";import{B as R}from"./button-6ac51d33.js";var E={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M688 312v-48c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8zm-392 88c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296zm376 116c-119.3 0-216 96.7-216 216s96.7 216 216 216 216-96.7 216-216-96.7-216-216-216zm107.5 323.5C750.8 868.2 712.6 884 672 884s-78.8-15.8-107.5-44.5C535.8 810.8 520 772.6 520 732s15.8-78.8 44.5-107.5C593.2 595.8 631.4 580 672 580s78.8 15.8 107.5 44.5C808.2 653.2 824 691.4 824 732s-15.8 78.8-44.5 107.5zM761 656h-44.3c-2.6 0-5 1.2-6.5 3.3l-63.5 87.8-23.1-31.9a7.92 7.92 0 00-6.5-3.3H573c-6.5 0-10.3 7.4-6.5 12.7l73.8 102.1c3.2 4.4 9.7 4.4 12.9 0l114.2-158c3.9-5.3.1-12.7-6.4-12.7zM440 852H208V148h560v344c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h272c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z"}}]},name:"file-done",theme:"outlined"};const T=E;function D(a){for(var l=1;l<arguments.length;l++){var t=arguments[l]!=null?Object(arguments[l]):{},i=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(i=i.concat(Object.getOwnPropertySymbols(t).filter(function(u){return Object.getOwnPropertyDescriptor(t,u).enumerable}))),i.forEach(function(u){W(a,u,t[u])})}return a}function W(a,l,t){return l in a?Object.defineProperty(a,l,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[l]=t,a}var C=function(l,t){var i=D({},l,t.attrs);return w(L,D({},i,{icon:T}),null)};C.displayName="FileDoneOutlined";C.inheritAttrs=!1;const A=C,G=a=>(H("data-v-4cfb5adf"),a=a(),j(),a),Q={class:"container"},U={class:"header"},X=G(()=>s("div",{"flex-placeholder":""},null,-1)),Y={class:"last-record"},Z=["onClick"],J={href:"https://github.com/zanllp/sd-webui-infinite-image-browsing/issues/90",target:"_blank",class:"last-record"},K={class:"content"},ee={key:0,class:"quick-start"},te={key:1,class:"quick-start"},se=["onClick"],ne={class:"quick-start__text line-clamp-1"},ae={class:"quick-start"},oe=["onClick"],ce={class:"quick-start__text line-clamp-1"},le={key:2,class:"quick-start"},re=["onClick"],ie={class:"quick-start__text line-clamp-1"},ue=x({__name:"emptyStartup",props:{tabIdx:null,paneIdx:null},setup(a){const l=a,t=B(),i={local:f("local"),"tag-search":f("imgSearch"),"fuzzy-search":f("fuzzy-search"),"global-setting":f("globalSettings")},u=(e,_,b=!1)=>{let p;switch(e){case"tag-search-matched-image-grid":return;case"global-setting":case"tag-search":case"fuzzy-search":case"empty":p={type:e,name:i[e],key:Date.now()+q()};break;case"local":p={type:e,name:i[e],key:Date.now()+q(),path:_,walkMode:b}}const n=t.tabList[l.tabIdx];n.panes.splice(l.paneIdx,1,p),n.key=p.key},m=O(()=>{var e;return(e=t.lastTabListRecord)==null?void 0:e[1]});console.log(m.value);const z=O(()=>t.autoCompletedDirList.filter(({key:e})=>e==="outdir_txt2img_samples"||e==="outdir_img2img_samples")),I=window.parent!==window,S=()=>window.parent.open("/infinite_image_browsing"),$=()=>{N(m.value),t.tabList=m.value.tabs.map(e=>V(e,!0)),t.tabList.forEach(e=>{e.panes.forEach(_=>{typeof _.name!="string"&&(_.name="")})})};return(e,_)=>{var p;const b=R;return o(),c("div",Q,[s("div",U,[s("h1",null,r(e.$t("welcome")),1),X,I?(o(),c("div",{key:0,class:"last-record",onClick:S},[s("a",null,r(e.$t("openInNewWindow")),1)])):h("",!0),s("div",Y,[(p=d(m))!=null&&p.tabs.length?(o(),c("a",{key:0,onClick:k($,["prevent"])},r(e.$t("restoreLastRecord")),9,Z)):h("",!0)]),s("a",J,r(e.$t("faq")),1)]),s("div",K,[d(z).length?(o(),c("div",ee,[s("h2",null,r(e.$t("walkMode")),1),s("ul",null,[(o(!0),c(v,null,g(d(z),n=>(o(),c("li",{key:n.dir,class:"quick-start__item"},[w(b,{onClick:y=>u("local",n.dir,!0),ghost:"",type:"primary",block:""},{default:F(()=>[M(r(n.zh),1)]),_:2},1032,["onClick"])]))),128))])])):h("",!0),d(t).autoCompletedDirList.length?(o(),c("div",te,[s("h2",null,r(e.$t("launchFromQuickMove")),1),s("ul",null,[(o(!0),c(v,null,g(d(t).autoCompletedDirList,n=>(o(),c("li",{key:n.key,class:"quick-start__item",onClick:k(y=>u("local",n.dir),["prevent"])},[s("span",ne,r(n.zh),1)],8,se))),128))])])):h("",!0),s("div",ae,[s("h2",null,r(e.$t("launch")),1),s("ul",null,[(o(!0),c(v,null,g(Object.keys(i),n=>(o(),c("li",{key:n,class:"quick-start__item",onClick:k(y=>u(n),["prevent"])},[s("span",ce,r(i[n]),1)],8,oe))),128))])]),d(t).recent.length?(o(),c("div",le,[s("h2",null,r(e.$t("recent")),1),s("ul",null,[(o(!0),c(v,null,g(d(t).recent,n=>(o(),c("li",{key:n.key,class:"quick-start__item",onClick:k(y=>u("local",n.path),["prevent"])},[w(d(A),{class:"quick-start__icon"}),s("span",ie,r(n.path),1)],8,re))),128))])])):h("",!0)])])}}});const _e=P(ue,[["__scopeId","data-v-4cfb5adf"]]);export{_e as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{r as l,b1 as S,aN as y}from"./index-a5687a52.js";import{u as q,b as P,f as z,c as G,d as N,e as Q}from"./fullScreenContextMenu-7cbc670b.js";const D=()=>{const e=l(),c=S(),o=l(),s={tabIdx:-1,target:"local",paneIdx:-1,walkMode:!1},{stackViewEl:u,multiSelectedIdxs:t,stack:r}=q().toRefs(),{itemSize:f,gridItems:m}=P(s),{showMenuIdx:v}=z();G();const{showGenInfo:I,imageGenInfo:d,q:p,onContextMenuClick:i,onFileItemClick:w}=N(s,{openNext:y}),{previewIdx:k,previewing:g,onPreviewVisibleChange:x,previewImgMove:C,canPreview:M}=Q(s,{scroller:o,files:e});return{scroller:o,queue:c,images:e,onContextMenuClickU:async(a,b,n)=>{r.value=[{curr:"",files:e.value}];const h=t.value.includes(n)?t.value:[n];await i(a,b,n),a.key==="deleteFiles"&&(e.value=e.value.filter((U,F)=>!h.includes(F)))},stackViewEl:u,previewIdx:k,previewing:g,onPreviewVisibleChange:x,previewImgMove:C,canPreview:M,itemSize:f,gridItems:m,showGenInfo:I,imageGenInfo:d,q:p,onContextMenuClick:i,onFileItemClick:w,showMenuIdx:v,multiSelectedIdxs:t}};export{D as u};
import{r as l,b2 as S,aO as y}from"./index-47599eb5.js";import{u as q,b as P,f as z,c as G,d as O,e as Q}from"./fullScreenContextMenu-c0de5f87.js";const D=()=>{const e=l(),c=S(),o=l(),s={tabIdx:-1,target:"local",paneIdx:-1,walkMode:!1},{stackViewEl:u,multiSelectedIdxs:t,stack:r}=q().toRefs(),{itemSize:f,gridItems:m}=P(s),{showMenuIdx:v}=z();G();const{showGenInfo:I,imageGenInfo:d,q:p,onContextMenuClick:i,onFileItemClick:w}=O(s,{openNext:y}),{previewIdx:k,previewing:g,onPreviewVisibleChange:x,previewImgMove:C,canPreview:M}=Q(s,{scroller:o,files:e});return{scroller:o,queue:c,images:e,onContextMenuClickU:async(a,b,n)=>{r.value=[{curr:"",files:e.value}];const h=t.value.includes(n)?t.value:[n];await i(a,b,n),a.key==="deleteFiles"&&(e.value=e.value.filter((U,F)=>!h.includes(F)))},stackViewEl:u,previewIdx:k,previewing:g,onPreviewVisibleChange:x,previewImgMove:C,canPreview:M,itemSize:f,gridItems:m,showGenInfo:I,imageGenInfo:d,q:p,onContextMenuClick:i,onFileItemClick:w,showMenuIdx:v,multiSelectedIdxs:t}};export{D as u};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{aO as n,bd as c,be as a}from"./index-a5687a52.js";var i="[object Object]",s=Function.prototype,b=Object.prototype,e=s.toString,p=b.hasOwnProperty,f=e.call(Object);function j(o){if(!n(o)||c(o)!=i)return!1;var r=a(o);if(r===null)return!0;var t=p.call(r,"constructor")&&r.constructor;return typeof t=="function"&&t instanceof t&&e.call(t)==f}export{j as i};

169
vue/dist/assets/index-47599eb5.js vendored Normal file

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{c2 as i}from"./index-a5687a52.js";var r=1/0,o=17976931348623157e292;function s(n){if(!n)return n===0?n:0;if(n=i(n),n===r||n===-r){var t=n<0?-1:1;return t*o}return n===n?n:0}function c(n){var t=n==null?0:n.length;return t?n[t-1]:void 0}export{c as l,s as t};
import{c9 as i}from"./index-47599eb5.js";var r=1/0,o=17976931348623157e292;function s(n){if(!n)return n===0?n:0;if(n=i(n),n===r||n===-r){var t=n<0?-1:1;return t*o}return n===n?n:0}function c(n){var t=n==null?0:n.length;return t?n[t-1]:void 0}export{c as l,s as t};

1
vue/dist/assets/index-8944a1b1.js vendored Normal file

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/index-efd768cb.js vendored Normal file
View File

@ -0,0 +1 @@
import{aP as n,be as c,bf as a}from"./index-47599eb5.js";var i="[object Object]",s=Function.prototype,b=Object.prototype,e=s.toString,f=b.hasOwnProperty,p=e.call(Object);function j(o){if(!n(o)||c(o)!=i)return!1;var r=a(o);if(r===null)return!0;var t=f.call(r,"constructor")&&r.constructor;return typeof t=="function"&&t instanceof t&&e.call(t)==p}export{j as i};

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)}}.preview-switch[data-v-b55b9483]{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-b55b9483]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-b55b9483]{opacity:0;pointer-events:none;cursor:none}.container[data-v-b55b9483]{height:100%;background:var(--zp-secondary-background)}.location-bar[data-v-b55b9483]{padding:4px 16px;background:var(--zp-primary-background);border-bottom:1px solid var(--zp-border);display:flex;align-items:center;justify-content:space-between}.location-bar .actions[data-v-b55b9483]{display:flex;align-items:center;flex-shrink:0}.location-bar a.opt[data-v-b55b9483]{margin-left:8px}.view[data-v-b55b9483]{padding:8px;height:calc(100vh - 96px)}.view .file-list[data-v-b55b9483]{list-style:none;padding:8px;height:100%;overflow:auto}.hint[data-v-b55b9483]{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)}}.preview-switch[data-v-5878da1d]{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-5878da1d]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-5878da1d]{opacity:0;pointer-events:none;cursor:none}.container[data-v-5878da1d]{height:100%;background:var(--zp-secondary-background)}.location-bar[data-v-5878da1d]{padding:4px 16px;background:var(--zp-primary-background);border-bottom:1px solid var(--zp-border);display:flex;align-items:center;justify-content:space-between}.location-bar .actions[data-v-5878da1d]{display:flex;align-items:center;flex-shrink:0}.location-bar a.opt[data-v-5878da1d]{margin-left:8px}.view[data-v-5878da1d]{padding:8px;height:calc(100vh - 96px)}.view .file-list[data-v-5878da1d]{list-style:none;padding:8px;height:100%;overflow:auto}.hint[data-v-5878da1d]{padding:4px;border:4px;background:var(--zp-secondary-background);border:1px solid var(--zp-border)}

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

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>Vite App</title>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-a5687a52.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-47599eb5.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-050489b7.css">
</head>

View File

@ -5,16 +5,20 @@ import { getGlobalSetting } from './api'
import { useGlobalStore } from './store/useGlobalStore'
import { getAutoCompletedTagList } from '@/page/taskRecord/autoComplete'
import SplitViewTab from '@/page/SplitViewTab/SplitViewTab.vue'
import { createReactiveQueue } from './util'
import { createReactiveQueue, globalEvents, useGlobalEventListen } from './util'
const globalStore = useGlobalStore()
const queue = createReactiveQueue()
useGlobalEventListen('updateGlobalSetting', async () => {
const resp = await getGlobalSetting()
globalStore.conf = resp
const r = await getAutoCompletedTagList(resp)
globalStore.autoCompletedDirList = r.filter((v) => v?.dir?.trim?.())
})
onMounted(async () => {
getGlobalSetting().then(async (resp) => {
globalStore.conf = resp
const r = await getAutoCompletedTagList(resp)
globalStore.autoCompletedDirList = r.filter((v) => v?.dir?.trim?.())
})
globalEvents.emit('updateGlobalSetting')
})
</script>

View File

@ -26,7 +26,6 @@ export const getExpiredDirs = async () => {
return resp.data as Pick<DataBaseBasicInfo, 'expired' | 'expired_dirs'>
}
export const updateImageData = async () => {
await axiosInst.post('/db/update_image_data', {}, { timeout: Infinity })
}
@ -68,4 +67,21 @@ export const getImageSelectedCustomTag = async (path: string) => {
export const getImagesBySubstr = async (substr: string) => {
const resp = await axiosInst.get('/db/search_by_substr', { params: { substr } })
return resp.data as FileNodeInfo[]
}
const scannedPaths = `/db/scanned_paths`
interface ScannedPathModel {
path: string
}
export const getScannedPath = async () => {
const resp = await axiosInst.get(scannedPaths)
return resp.data as ScannedPathModel[]
}
export const addScannedPath = async (path: string) => {
await axiosInst.post(scannedPaths, { path })
}
export const removeScannedPath = async (path: string) => {
await axiosInst.delete(scannedPaths, { data: { path } })
}

View File

@ -29,6 +29,7 @@ export interface GlobalConf {
cwd: string
home: string
sd_cwd: string
extra_paths: { path: string }[]
}
export const getGlobalSetting = async () => {
@ -52,3 +53,8 @@ export const genInfoCompleted = async () => {
export const getImageGenerationInfo = async (path: string) => {
return (await axiosInst.get(`/image_geninfo?path=${encodeURIComponent(path)}`)).data as string
}
export const openFolder = async (path: string) => {
await axiosInst.post('/open_folder', { path })
}

View File

@ -137,10 +137,15 @@ const zh = {
"autoUpdate": "检测到发生改变自动更新",
"fuzzy-search": "模糊搜索",
"fuzzy-search-placeholder": "输入图像信息或者文件名的一部分来进行搜索",
"fuzzy-search-noResults": "什么都没找到"
"fuzzy-search-noResults": "什么都没找到",
"openWithLocalFileBrowser": "使用本地文件浏览器打开",
addToSearchScanPathAndQuickMove: '添加到搜索扫描路径和快速移动',
removeFromSearchScanPathAndQuickMove: '从搜索扫描路径和快速移动中移除',
}
const en: Record<keyof typeof zh, string> = {
removeFromSearchScanPathAndQuickMove: 'Remove from Search Scan Path and Quick Move',
addToSearchScanPathAndQuickMove: 'Add to Search Scan Path and Quick Move',
"openWithLocalFileBrowser": "Open with Local File Browser",
"fuzzy-search-noResults": "Nothing was found",
"fuzzy-search-placeholder": "Enter a part of the image information or filename to search",
"fuzzy-search": "Fuzzy search",

View File

@ -143,6 +143,7 @@ const thumbnailSize = computed(() =>
<a-menu-item key="send2inpaint">{{ $t('sendToInpaint') }}</a-menu-item>
<a-menu-item key="send2extras">{{ $t('sendToExtraFeatures') }}</a-menu-item>
<a-menu-item key="send2savedDir">{{ $t('send2savedDir') }}</a-menu-item>
<a-menu-item key="openWithLocalFileBrowser">{{ $t('openWithLocalFileBrowser') }}</a-menu-item>
<a-sub-menu key="toggle-tag" :title="$t('toggleTag')">
<a-menu-item v-for="tag in tags" :key="tag.id"
>{{ tag.name }} <star-filled v-if="tag.selected" /><star-outlined v-else />

View File

@ -14,5 +14,5 @@ const onOK = () => {
<a-modal v-model:visible="visible" :title="$t('inputAddressAndPressEnter')" @ok="onOK">
<a-input @press-enter="onOK" v-model:value="loc" style="width: 100%" allow-clear></a-input>
</a-modal>
<a style="margin-left: 8px" @click="visible = true">{{ $t('go') }}</a>
<a @click="visible = true">{{ $t('go') }}</a>
</template>

View File

@ -2,7 +2,7 @@ import { useGlobalStore, type FileTransferTabPane } from '@/store/useGlobalStore
import { onLongPress, useElementSize } from '@vueuse/core'
import { ref, computed, watch, onMounted, h, type Ref } from 'vue'
import { genInfoCompleted, getImageGenerationInfo, setImgPath } from '@/api'
import { genInfoCompleted, getImageGenerationInfo, openFolder, setImgPath } from '@/api'
import {
useWatchDocument,
type SearchSelectConv,
@ -12,7 +12,7 @@ import {
typedEventEmitter,
ID
} from 'vue3-ts-util'
import { createReactiveQueue, isImageFile, copy2clipboardI18n, useGlobalEventListen, makeAsyncFunctionSingle } from '@/util'
import { createReactiveQueue, isImageFile, copy2clipboardI18n, useGlobalEventListen, makeAsyncFunctionSingle, globalEvents } from '@/util'
import { getTargetFolderFiles, type FileNodeInfo, deleteFiles, moveFiles } from '@/api/files'
import { sortFiles, sortMethodMap, SortMethod } from './fileSort'
import { cloneDeep, debounce, last, range, uniqBy, uniqueId } from 'lodash-es'
@ -24,7 +24,7 @@ import { Modal, message, notification } from 'ant-design-vue'
import type { MenuInfo } from 'ant-design-vue/lib/menu/src/interface'
import { t } from '@/i18n'
import { DatabaseOutlined } from '@/icon'
import { toggleCustomTagToImg } from '@/api/db'
import { addScannedPath, removeScannedPath, toggleCustomTagToImg } from '@/api/db'
export const stackCache = new Map<string, Page[]>()
@ -431,8 +431,36 @@ export function useLocation (props: Props) {
}
handleWalkModeTo(path)
}
const normalizedScandPath = computed(() => {
return global.autoCompletedDirList.map(v => ({ ...v, path: Path.normalize(v.dir) }))
})
const searchPathInfo = computed(() => {
const c = Path.normalize(currLocation.value)
const path = normalizedScandPath.value.find(v => v.path === c)
return path
})
const addToSearchScanPathAndQuickMove = async () => {
const path = searchPathInfo.value
if (path) {
if (!path.can_delete) {
return
}
await removeScannedPath(currLocation.value)
message.success(t('removeComplete'))
} else {
await addScannedPath(currLocation.value)
message.success(t('addComplete'))
}
await globalEvents.emit('updateGlobalSetting')
}
return {
addToSearchScanPathAndQuickMove,
searchPathInfo,
refresh,
copyLocation,
back,
@ -813,6 +841,10 @@ export function useFileItemActions (
imageGenInfo.value = await q.pushAction(() => getImageGenerationInfo(file.fullpath)).res
break
}
case 'openWithLocalFileBrowser': {
await openFolder(file.fullpath)
break
}
case 'deleteFiles': {
const selectedFiles = getSelectedImg()
await new Promise<void>((resolve) => {

View File

@ -25,6 +25,7 @@ import { watch } from 'vue'
import FileItem from './FileItem.vue'
import fullScreenContextMenu from './fullScreenContextMenu.vue'
import { copy2clipboardI18n } from '@/util'
import { openFolder } from '@/api'
const global = useGlobalStore()
const props = defineProps<{
@ -48,7 +49,7 @@ const {
multiSelectedIdxs,
spinning
} = useHookShareState().toRefs()
const { currLocation, currPage, refresh, copyLocation, back, openNext, stack, to, quickMoveTo } =
const { currLocation, currPage, refresh, copyLocation, back, openNext, stack, to, quickMoveTo, addToSearchScanPathAndQuickMove, searchPathInfo } =
useLocation(props)
const {
gridItems,
@ -62,7 +63,8 @@ const {
loadNextDir,
loadNextDirLoading,
canLoadNext,
onScroll
onScroll,
} = useFilesDisplay(props)
const { onDrop, onFileDragStart } = useFileTransfer()
const { onFileItemClick, onContextMenuClick, showGenInfo, imageGenInfo, q } = useFileItemActions(
@ -167,10 +169,19 @@ watch(
<search-select v-model:value="sortMethod" @click.stop :conv="sortMethodConv"
:options="Object.keys(sortMethodMap)" />
</a-form-item>
<a-form-item>
<div style="padding: 4px;">
<a @click.prevent="copyLocation">{{ $t('copyPath') }}</a>
</div>
<div style="padding: 4px;">
<folder-navigator :loc="currLocation" @to="to" />
</a-form-item>
</div>
<div style="padding: 4px;">
<a @click.prevent="addToSearchScanPathAndQuickMove" v-if="!searchPathInfo ">{{ $t('addToSearchScanPathAndQuickMove') }}</a>
<a @click.prevent="addToSearchScanPathAndQuickMove" v-else-if="searchPathInfo.can_delete">{{ $t('removeFromSearchScanPathAndQuickMove') }}</a>
</div>
<div style="padding: 4px;">
<a @click.prevent="openFolder(currLocation + '/')">{{ $t('openWithLocalFileBrowser') }}</a>
</div>
</a-form>
</div>
</template>

View File

@ -1,11 +1,14 @@
import { checkPathExists, type getGlobalSetting } from '@/api'
import { t } from '@/i18n'
import { pick, type ReturnTypeAsync } from '@/util'
import { normalize } from '@/util/path'
export const getAutoCompletedTagList = async ({
global_setting,
sd_cwd,
home
home,
extra_paths,
cwd
}: ReturnTypeAsync<typeof getGlobalSetting>) => {
const picked = pick(
global_setting,
@ -45,6 +48,23 @@ export const getAutoCompletedTagList = async ({
cwd: t('workingFolder'),
home: 'home'
}
const pathAliasMap = {
home: normalize(home),
[t('workingFolder')]: normalize(cwd),
[t('t2i')]: normalize(picked.outdir_txt2img_samples),
[t('i2i')]: normalize(picked.outdir_img2img_samples)
}
const findshortest = (path: string) => {
path = normalize(path)
const replacedPaths = [] as string[]
for (const [k,v] of Object.entries(pathAliasMap)) {
if (k && v) {
replacedPaths.push(path.replace(v, '$' + k))
}
}
console.log(replacedPaths, picked)
return replacedPaths.sort((a,b) => a.length - b.length)[0]
}
return Object.keys(cnMap)
.filter((k) => exists[pathMap[k as keyof typeof pathMap] as string])
.map((k) => {
@ -52,7 +72,8 @@ export const getAutoCompletedTagList = async ({
return {
key,
zh: cnMap[key],
dir: pathMap[key]
dir: pathMap[key],
can_delete: false
}
})
}).concat(extra_paths.map(v => ({ key: v.path, zh: findshortest(v.path), dir: v.path, can_delete: true })) as any[])
}

View File

@ -71,7 +71,8 @@ export const copy2clipboardI18n = async (text: string) => {
}
export const { useEventListen: useGlobalEventListen, eventEmitter: globalEvents } = typedEventEmitter<{
'return-to-iib'(): void
'return-to-iib'(): void,
updateGlobalSetting(): Promise<void>
}>()
type AsyncFunction<T> = (...args: any[]) => Promise<T>;