diff --git a/lang/zh_cn.toml b/lang/zh_cn.toml index 7775745..869bf67 100644 --- a/lang/zh_cn.toml +++ b/lang/zh_cn.toml @@ -10,7 +10,7 @@ DownloadInstall = "在开始之前,我们需要下载一些依赖文件\n如 StartInstall = "开始安装" InstallVtoy = "安装 Ventoy" InstallVtoyTitle = "安装 Ventoy" -InstallVtoyInfo = "请在打开的 ventoy 安装程序手动完成安装\n若安装完毕,请点击 “扫描” 按钮并选择您安装完毕的U盘\n若您找不到您的U盘,请尝试点击 “显示所有设备”\n如果你在使用 arm 架构的设备或软件无法打开,请手动运行以下程序:\n Windows: software\\ventoy\\altexe\\你的架构对应程序.exe\n Linux: software/ventoy/altexe/你的架构对应程序\n注:请确保磁盘已经挂载。本版本ventoy已精简,与原版兼容" +InstallVtoyInfo = "请在打开的 ventoy 安装程序手动完成安装\n若安装完毕,请点击 “扫描” 按钮并选择您安装完毕的U盘\n若您找不到您的U盘,请尝试点击 “显示所有设备”\n如果你在使用 arm 架构的设备或软件无法打开,请手动运行以下程序:\n Windows: software\\ventoy\\altexe\\你的架构对应程序.exe\n Linux: software/ventoy/altexe/你的架构对应程序\n注:请确保磁盘已经挂载。本版本ventoy由原版精简文件且未修改其它任何文件" ScanVtoy = "扫描" RestartVtoy = "重启安装程序" ChooseVtoyDevice = "选择设备" @@ -23,3 +23,6 @@ InstallFinishInfo = "PEinjector已经安装到您的设备\n点击下方按钮 InstallFinishBtn = "重启" HomeWelcome = "欢迎使用 PEinjector" HomeInfo = "一个增强 WindowsPE 的一个工具和平台\n点击下方版本号进行更新" +InjectHead = "注入 ISO 镜像文件" +Save = "保存" +DownloadImg = "查找 ISO" diff --git a/lib/sync_disk.py b/lib/sync_disk.py new file mode 100644 index 0000000..44222db --- /dev/null +++ b/lib/sync_disk.py @@ -0,0 +1,79 @@ +import os +import json +from lib import vars +from logger.logger import * + + +isolist = [] + + +def sync_iso(): + global isolist + isolist = [] + + info("[sync_disk]start sync iso") + + searchroot = "" + search_level = 3 + if os.path.exists(vars.DISKMOUNT+f"{os.sep}ventoy{os.sep}ventoy.json"): + with open(vars.DISKMOUNT+f"{os.sep}ventoy{os.sep}ventoy.json", "r") as file: + ventoy_cfg = json.load(file) + + if "control" in ventoy_cfg: + for i in ventoy_cfg["control"]: + if "VTOY_DEFAULT_SEARCH_ROOT" in i: + searchroot = i["VTOY_DEFAULT_SEARCH_ROOT"] + if "VTOY_MAX_SEARCH_LEVEL" in i: + if i["VTOY_MAX_SEARCH_LEVEL"] != "max": + search_level = int(i["VTOY_MAX_SEARCH_LEVEL"]) + + info(f"[sync_disk]sync in \"{searchroot}\" {str(search_level)} levels") + + def dfs(deep, dir, search_levels): + global isolist + if deep > search_levels: + return + lists = os.listdir(vars.DISKMOUNT+dir) + for i in lists: + if os.path.isfile(vars.DISKMOUNT+dir+os.sep+i): + if ".iso" in i.lower(): + isolist.append((dir+os.sep+i).replace(os.sep, "/")) + else: + dfs(deep+1, dir+os.sep+i, search_levels) + + dfs(0, searchroot, search_level) + + info(f"[sync_disk]sync finish, found {str(len(isolist))} iso files") + + +def get_isolist(): + if (len(isolist) == 0): + sync_iso() + return isolist + + +def get_injected_iso(): + global isolist + + info("[sync_disk]get injected iso") + + if os.path.exists(vars.DISKMOUNT+f"{os.sep}ventoy{os.sep}ventoy.json"): + with open(vars.DISKMOUNT+f"{os.sep}ventoy{os.sep}ventoy.json", "r") as file: + ventoy_cfg = json.load(file) + if "injection" in ventoy_cfg: + injected_list = [] + for i in ventoy_cfg["injection"]: + if ("image" not in i or "archive" not in i): + warn(f"[sync_disk]error ventoy config \"{repr(i)}\"") + continue + if ("PEinjector" not in i["archive"]): + continue + if (i["image"] not in isolist): + continue + injected_list.append(i["image"]) + info(f"[sync_disk]found injected iso \"{i['image']}\"") + return injected_list + else: + return [] + else: + return [] diff --git a/lib/vars.py b/lib/vars.py index 9c049b9..a2e89e3 100644 --- a/lib/vars.py +++ b/lib/vars.py @@ -1 +1,2 @@ DISKMOUNT = "" +SHOWALLIMAGE = False diff --git a/ui/injectimg.py b/ui/injectimg.py index fa2f7d1..645ea2d 100644 --- a/ui/injectimg.py +++ b/ui/injectimg.py @@ -5,19 +5,114 @@ from magictk import fontconfig from ui.lang import l from logger.logger import * from lib import vars +from lib import sync_disk from tkinter import Label as tkLabel now_frame = None master: mtk.Frame = None +checkboxlist = [] +img_list = [] +iso_frame = None def show_inject_page(): - global now_frame, master + global now_frame, master, checkboxlist inject_page = mtk.Frame(master) - mtk.Frame(inject_page, w=10000).pack(fill="both", expand=True) - # TODO - mtk.Frame(inject_page, w=10000).pack(fill="both", expand=True) - inject_page.pack(fill="both", expand=True) + mtk.Frame(inject_page, w=10000, height=8).pack(fill="x", expand=True) + head_frame = mtk.Frame(inject_page) + mtk.Frame(head_frame, w=10).pack( + side="left", fill="y", expand=True) + mtk.Frame(inject_page, height=8).pack(fill="x", expand=True, side="left") + + def show_download_list(obj): + posx = obj.root.main_tk.winfo_pointerx()-10 + posy = obj.root.main_tk.winfo_pointery()-10 + menuobjs = mtk.MenuObjs() + menuobjs.addmenu("-- Do not support WIM!--", lambda *args: True) + menuobjs.addmenu("WePE(stable)", lambda *args: __import__("webbrowser").open( + "https://www.wepe.com.cn/")) + menuobjs.addmenu("EdgelessPE(thanks)", lambda *args: __import__("webbrowser").open( + "https://home.edgeless.top/")) + menuobjs.addmenu("FirPE(unstable)", lambda *args: __import__("webbrowser").open( + "https://www.firpe.cn/")) + menuobjs.addmenu("HotPE(unstable)", lambda *args: __import__("webbrowser").open( + "https://www.hotpe.top/")) + menuobjs.addmenu("MicrosoftDoc", lambda *args: __import__("webbrowser").open( + "https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/download-winpe--windows-pe?view=windows-11")) + menuobjs.addmenu("iTellYou", lambda *args: __import__("webbrowser").open( + "https://next.itellyou.cn//")) + mtk.Menu(obj.root, w=200, h=400, x=posx, y=posy, menuobj=menuobjs) + action_btn_frame = mtk.Frame(inject_page) + mtk.Frame(action_btn_frame, w=10).pack(expand=True, side="left") + savebtn = mtk.ButtonFill(action_btn_frame, text=l("Save")) + savebtn.pack(side="left") + mtk.Button(action_btn_frame, text=l("DownloadImg"), + func=show_download_list).pack(side="left") + mtk.Frame(action_btn_frame, w=10000).pack( + fill="x", expand=True, side="left") + + mtk.Frame(inject_page, height=16).pack(fill="x", expand=True, side="left") + head_label = tkLabel( + head_frame, + width=10000, + text=l("InjectHead"), + background=color_tmpl.default_color["background"], + foreground=color_tmpl.default_color["primary_text"], + font=(fontconfig.getfont(), 14), + anchor='w' + ) + head_label.pack(side="left", anchor='w') + head_frame.pack(fill="x", expand=True, anchor='w') + + action_btn_frame.pack(fill="x", expand=True) + + show_all_img = vars.SHOWALLIMAGE + + def updatelist(): + global checkboxlist, iso_frame, img_list + if (iso_frame is not None): + iso_frame.destroy() # 避免内存泄漏 + del iso_frame + iso_frame = None + isolists = sync_disk.get_isolist() + imgsums = 0 + for isopath in isolists: + if show_all_img or ('pe' in isopath.lower() or 'win' in isopath.lower()): + imgsums += 1 + + container_frame = mtk.Frame(inject_page) + mtk.Frame(container_frame, w=10).pack(expand=True, side="left") + iso_frame = mtk.Container(container_frame, w=10000, h=10000, + container_h=imgsums*20) + if (len(checkboxlist) > 0): + for i in checkboxlist: + i.canvas.destroy() # 避免内存泄漏 + del i + checkboxlist = [] + img_list = [] + + for isopath in isolists: + if show_all_img or ('pe' in isopath.lower() or 'win' in isopath.lower()): + isoname = isopath.split(os.sep)[-1] + if (len(isoname) > 40): + isoname = isoname[:37]+"..." + checkboxlist.append(mtk.Checkbox( + iso_frame, text=isoname, h=20, w=400)) + img_list.append(isopath) + checkboxlist[-1].pack(fill="x", expand=True) + + for injectedpath in sync_disk.get_injected_iso(): + checkobj = checkboxlist[img_list.index(injectedpath)] + checkobj.ishover = 1 + checkobj._update_color() + + iso_frame.pack(fill="x", expand=True, side="left") + mtk.Frame(container_frame, w=20).pack(side="left") + container_frame.pack(fill="both", expand=True) + + updatelist() + + inject_page.pack(anchor="nw", side="top") now_frame = inject_page diff --git a/ui/win.py b/ui/win.py index 2e3dc19..f50debc 100644 --- a/ui/win.py +++ b/ui/win.py @@ -45,10 +45,11 @@ Options: --help Show this help info and exit --version, -V Get hub version --lang= Set language - --install, -i Install PEinjector + --install, -I Install PEinjector --upgrade, -U Upgrade PEinjector --device, -D Set device (mount path) --clean Clean download cache + --show-all-img Show all images in inject page Debug Options: --debug Open debug mode (raise all errors) @@ -69,8 +70,10 @@ Debug Options: NOTRACE = 1 elif (check_args(i, "--upgrade") or check_args(i, "-U")): UPGRADE = 1 - elif (check_args(i, "--install") or check_args(i, "-i")): + elif (check_args(i, "--install") or check_args(i, "-I")): UPGRADE = 2 + elif (check_args(i, "--show-all-img")): + vars.SHOWALLIMAGE = True elif (check_args(i, "--device") or check_args(i, "-D")): DEVICE = i.split("=")[-1] elif (check_args(i, "--clean")):