From 86c11e5343b5e62342cf2c766d694b88d5897d38 Mon Sep 17 00:00:00 2001
From: Hayden <48267247+hayden-fr@users.noreply.github.com>
Date: Tue, 18 Feb 2025 16:03:07 +0800
Subject: [PATCH] [New Feature] sub directories support (#135)
* feat: add close all dialog
* feat: add new ui toggle setting
* feat: add tree display ui
* feat: add search and sort
* feat: change model data structure
* pref: Optimize model data structure
* feat: set sub folder by choose
---
py/manager.py | 30 +--
src/App.vue | 5 +-
src/components/DialogExplorer.vue | 258 ++++++++++++++++++++++++++
src/components/DialogManager.vue | 76 +++++++-
src/components/DialogModelDetail.vue | 21 ++-
src/components/ModelBaseInfo.vue | 178 ++++++++++++++++--
src/components/ModelCard.vue | 161 ++++++----------
src/components/ResponseBreadcrumb.vue | 163 ++++++++++++++++
src/components/ResponseDialog.vue | 2 +-
src/components/ResponseInput.vue | 25 ++-
src/components/ResponseScroll.vue | 6 +-
src/components/ResponseSelect.vue | 13 +-
src/hooks/config.ts | 15 ++
src/hooks/dialog.ts | 6 +-
src/hooks/explorer.ts | 147 +++++++++++++++
src/hooks/model.ts | 219 ++++++++++++++++------
src/i18n.ts | 6 +-
src/types/typings.d.ts | 3 +-
src/utils/model.ts | 2 +-
tailwind.config.js | 3 +
20 files changed, 1123 insertions(+), 216 deletions(-)
create mode 100644 src/components/DialogExplorer.vue
create mode 100644 src/components/ResponseBreadcrumb.vue
create mode 100644 src/hooks/explorer.ts
diff --git a/py/manager.py b/py/manager.py
index 0325105..2d7db27 100644
--- a/py/manager.py
+++ b/py/manager.py
@@ -124,41 +124,43 @@ class ModelManager:
if not prefix_path.endswith("/"):
prefix_path = f"{prefix_path}/"
- fullname = utils.normalize_path(entry.path).replace(prefix_path, "")
- basename = os.path.splitext(fullname)[0]
- extension = os.path.splitext(fullname)[1]
+ relative_path = utils.normalize_path(entry.path).replace(prefix_path, "")
+ sub_folder = os.path.dirname(relative_path)
+ filename = os.path.basename(relative_path)
+ basename = os.path.splitext(filename)[0]
+ extension = os.path.splitext(filename)[1]
- if extension not in folder_paths.supported_pt_extensions:
+ is_file = entry.is_file()
+ if is_file and extension not in folder_paths.supported_pt_extensions:
return None
- model_preview = f"/model-manager/preview/{folder}/{path_index}/{basename}.webp"
+ model_preview = f"/model-manager/preview/{folder}/{path_index}/{relative_path.replace(extension, '.webp')}"
stat = entry.stat()
return {
- "fullname": fullname,
+ "type": folder if is_file else "folder",
+ "subFolder": sub_folder,
"basename": basename,
"extension": extension,
- "type": folder,
"pathIndex": path_index,
- "sizeBytes": stat.st_size,
- "preview": model_preview,
+ "sizeBytes": stat.st_size if is_file else 0,
+ "preview": model_preview if is_file else None,
"createdAt": round(stat.st_ctime_ns / 1000000),
"updatedAt": round(stat.st_mtime_ns / 1000000),
}
def get_all_files_entry(directory: str):
- files = []
+ entries: list[os.DirEntry[str]] = []
with os.scandir(directory) as it:
for entry in it:
# Skip hidden files
if not include_hidden_files:
if entry.name.startswith("."):
continue
+ entries.append(entry)
if entry.is_dir():
- files.extend(get_all_files_entry(entry.path))
- elif entry.is_file():
- files.append(entry)
- return files
+ entries.extend(get_all_files_entry(entry.path))
+ return entries
for path_index, base_path in enumerate(folders):
if not os.path.exists(base_path):
diff --git a/src/App.vue b/src/App.vue
index 4d0c8c9..2954a21 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -7,6 +7,7 @@
diff --git a/src/components/DialogManager.vue b/src/components/DialogManager.vue
index dfd39db..e0942ba 100644
--- a/src/components/DialogManager.vue
+++ b/src/components/DialogManager.vue
@@ -49,7 +49,56 @@
v-for="model in item.row"
:key="genModelKey(model)"
:model="model"
- >
+ :style="{
+ width: `${cardSize.width}px`,
+ height: `${cardSize.height}px`,
+ }"
+ class="group/card cursor-pointer !p-0"
+ @click="openModelDetail(model)"
+ v-tooltip.top="{ value: model.basename, disabled: showModelName }"
+ >
+
+