Add feature to add current folder to scan path and open local folder in default browser
parent
4720b15126
commit
db0a3ed04b
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
113
scripts/api.py
113
scripts/api.py
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)"""
|
||||
)
|
||||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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
|
|
@ -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};
|
||||
|
|
@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
|||
import{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
File diff suppressed because one or more lines are too long
|
|
@ -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
|
|
@ -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};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
|||
import{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};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
|||
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
|
|
@ -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)}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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 } })
|
||||
}
|
||||
|
|
@ -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 })
|
||||
}
|
||||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 />
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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[])
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
|
|
|
|||
Loading…
Reference in New Issue