import json import os from turtle import bgcolor from magictk import mtk, color_tmpl from magictk import fontconfig from ui.lang import l from lib import open_ventoy from lib import get_disk from lib import install_pkg from lib import downloader from logger.logger import * now_frame = None master: mtk.Frame = None def show_first_page(): global now_frame, master first_page = mtk.Frame(master,) mtk.Frame(first_page, w=10000).pack(fill="both", expand=True) mtk.Label(first_page, text=l("InstallWelcome"), anchor='center', font=(fontconfig.getfont(), 22), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["primary_text"]).pack(fill='x') mtk.Label(first_page, text="\n"+l("InstallInfo"), anchor='center', font=(fontconfig.getfont(), 12), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["secondary_text"]).pack(fill='x') mtk.Frame(first_page, height=30).pack() buttonlist = mtk.Frame(first_page) def install_callback(*args): change_page_download() mtk.ButtonFill(buttonlist, text=l("StartInstall"), w=110, color_type="primary", func=install_callback).pack(side="left") mtk.Frame(buttonlist, height=10).pack(side="left") buttonlist.pack() mtk.Frame(first_page, w=10000).pack(fill="both", expand=True) first_page.pack(fill="both", expand=True) now_frame = first_page def change_page_download(): global now_frame, master now_frame.pack_forget() instvtoy_page = mtk.Frame(master,) mtk.Frame(instvtoy_page, w=10000).pack(fill="both", expand=True) mtk.Label(instvtoy_page, text="0/3 "+l("DownloadInstallTitle"), anchor='center', font=(fontconfig.getfont(), 22), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["primary_text"]).pack(fill='x') mtk.Label(instvtoy_page, text="\n"+l("DownloadInstall"), anchor='center', font=(fontconfig.getfont(), 12), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["secondary_text"]).pack(fill='x') mtk.Frame(instvtoy_page, height=30).pack() prog_frame = mtk.Frame(instvtoy_page) with open("res/installer_file.json", 'r') as file: files = json.load(file) download_l = [] if not (os.path.exists("software")): os.mkdir("software") if not (os.path.exists("software"+os.sep+"cache")): os.mkdir("software"+os.sep+"cache") funclst = [] for i in files: def runf(): sframe = mtk.Frame(prog_frame, height=10) progps = mtk.Label( sframe, background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["secondary_text"], text=" 0%", width=6, font=(fontconfig.getfont(), 10)) progps.pack(side="left") progbar = mtk.ProgressBar(sframe, w=300) progbar.pack(side="left", anchor='w') proglabel = mtk.Label( sframe, background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["secondary_text"], text=" "+i["name"], width=18, font=(fontconfig.getfont(), 10)) proglabel.pack(side="left") sframe.pack(side="top") def progcallback(prog): progbar.set_progress(prog) progstr = str(int(prog*100)) outstr = " "*(3-len(progstr))+progstr+"%" def setproganim(*args): progps.configure(text=outstr) return -1 prog_frame.root.anim.append(setproganim) funclst.append(progcallback) download_l.append({ "from": i["source"], "to": "software"+os.sep+"cache"+os.sep+i["name"]+".7z", "progbar": funclst[-1] }) runf() def nextpage_callback(*args): change_page_installvtoy() open_ventoy.run() buttonlist = mtk.Frame(instvtoy_page, height=30) btns = mtk.ButtonFill(buttonlist, text=l("InstallVtoy"), w=120, color_type="primary", func=nextpage_callback) def callbacks(): btns.pack(side="left") downloader.download_files(download_l, callbacks, prog_frame.root) prog_frame.pack(fill='x', anchor="center") mtk.Frame(instvtoy_page, height=30).pack() buttonlist.pack() mtk.Frame(instvtoy_page, w=10000).pack(fill="both", expand=True) instvtoy_page.pack(fill="both", expand=True) now_frame = instvtoy_page def change_page_installvtoy(): global now_frame, master now_frame.pack_forget() instvtoy_page = mtk.Frame(master,) mtk.Frame(instvtoy_page, w=10000).pack(fill="both", expand=True) mtk.Label(instvtoy_page, text="1/3 "+l("InstallVtoyTitle"), anchor='center', font=(fontconfig.getfont(), 22), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["primary_text"]).pack(fill='x') mtk.Label(instvtoy_page, text="\n"+l("InstallVtoyInfo"), anchor='center', font=(fontconfig.getfont(), 12), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["secondary_text"]).pack(fill='x') mtk.Frame(instvtoy_page, height=30).pack() buttonlist = mtk.Frame(instvtoy_page) scan_obj_list = mtk.Frame(instvtoy_page, height=30) added_list = False selects = mtk.Select(scan_obj_list, text=l( "ChooseVtoyDevice"), items=[], w=380) devmenu = [] def finishvtoy_callback(*args): if (selects.get() == -1): return info(f"[installer]choose disk info:{str(devmenu[selects.get()])}") global devinfo devinfo = devmenu[selects.get()] change_page_installing() def install_callback(*args): nonlocal added_list, selects, devmenu def show_all_dev(*args): nonlocal devmenu devmenu = get_disk.find_all_disk() selects.change_menu([f"{i[0]} [{i[1]}]" for i in devmenu]) if (added_list == False): mtk.ButtonLight(scan_obj_list, func=show_all_dev, text=l("ShowAllDevices"), w=100, color_type="info").pack( side="left") selects.pack(side="left") mtk.Button(scan_obj_list, func=finishvtoy_callback, iconname="circle-check", iconsize=16, w=32).pack( side="left") added_list = True devmenu = get_disk.find_vtoy_disk() selects.change_menu([f"{i[0]} [{i[1]}]" for i in devmenu]) def restart_callback(*args): open_ventoy.run() mtk.ButtonFill(buttonlist, text=l("ScanVtoy"), w=80, color_type="primary", func=install_callback).pack(side="left") mtk.ButtonLight(buttonlist, text=l("RestartVtoy"), w=120, color_type="primary", func=restart_callback).pack(side="left") mtk.Frame(buttonlist, height=10).pack(side="left") buttonlist.pack() scan_obj_list.pack() mtk.Frame(instvtoy_page, w=10000).pack(fill="both", expand=True) instvtoy_page.pack(fill="both", expand=True) now_frame = instvtoy_page def change_page_installing(): global now_frame, master, devinfo devpath = devinfo[1] now_frame.pack_forget() installinjector_page = mtk.Frame(master,) mtk.Frame(installinjector_page, w=10000).pack(fill="both", expand=True) mtk.Label(installinjector_page, text="2/3 "+l("InstallIjTitle"), anchor='center', font=(fontconfig.getfont(), 22), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["primary_text"]).pack(fill='x') mtk.Label(installinjector_page, text="\n"+l("InstallIjInfo"), anchor='center', font=(fontconfig.getfont(), 12), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["secondary_text"]).pack(fill='x') mtk.Frame(installinjector_page, height=30).pack() prog_frame = mtk.Frame(installinjector_page, height=10) progbar = mtk.ProgressBar(prog_frame, w=300) progbar.pack() prog_frame.pack(fill='x') def barcallback(prog): progbar.set_progress(prog) finishbutton_frame = mtk.Frame(installinjector_page, height=30) def finishbtncallback(*args): change_page_finish() finishbtn = mtk.ButtonFill(finishbutton_frame, text=l( "FinishInstall"), w=120, color_type="success", func=finishbtncallback) closeid = False def anim_pick(*args): nonlocal closeid if (closeid == True): closeid = False finishbtn.pack() return -1 prog_frame.root.anim.append(anim_pick) def finishcallback(): nonlocal closeid closeid = True finishbutton_frame.pack(fill="both", expand=True) mtk.Frame(installinjector_page, w=10000).pack(fill="both", expand=True) installinjector_page.pack(fill="both", expand=True) theards = install_pkg.PKG_Theard(devpath, barcallback, finishcallback) theards.start() now_frame = installinjector_page def change_page_installing(): global now_frame, master, devinfo devpath = devinfo[1] now_frame.pack_forget() installinjector_page = mtk.Frame(master,) mtk.Frame(installinjector_page, w=10000).pack(fill="both", expand=True) mtk.Label(installinjector_page, text="2/3 "+l("InstallIjTitle"), anchor='center', font=(fontconfig.getfont(), 22), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["primary_text"]).pack(fill='x') mtk.Label(installinjector_page, text="\n"+l("InstallIjInfo"), anchor='center', font=(fontconfig.getfont(), 12), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["secondary_text"]).pack(fill='x') mtk.Frame(installinjector_page, height=30).pack() prog_frame = mtk.Frame(installinjector_page, height=10) progbar = mtk.ProgressBar(prog_frame, w=300) progbar.pack() prog_frame.pack(fill='x') def barcallback(prog): progbar.set_progress(prog) finishbutton_frame = mtk.Frame(installinjector_page, height=30) def finishbtncallback(*args): change_page_finish() finishbtn = mtk.ButtonFill(finishbutton_frame, text=l( "FinishInstall"), w=120, color_type="success", func=finishbtncallback) closeid = False def anim_pick(*args): nonlocal closeid if (closeid == True): closeid = False finishbtn.pack() return -1 prog_frame.root.anim.append(anim_pick) def finishcallback(): nonlocal closeid closeid = True mtk.Frame(installinjector_page, height=30).pack() finishbutton_frame.pack(fill="both", expand=True) mtk.Frame(installinjector_page, w=10000).pack(fill="both", expand=True) installinjector_page.pack(fill="both", expand=True) theards = install_pkg.PKG_Theard(devpath, barcallback, finishcallback) theards.start() now_frame = installinjector_page def change_page_finish(): global now_frame, master now_frame.pack_forget() finish_page = mtk.Frame(master,) mtk.Frame(finish_page, w=10000).pack(fill="both", expand=True) mtk.Label(finish_page, text="3/3 "+l("InstallFinishTitle"), anchor='center', font=(fontconfig.getfont(), 22), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["primary_text"]).pack(fill='x') mtk.Label(finish_page, text="\n"+l("InstallFinishInfo"), anchor='center', font=(fontconfig.getfont(), 12), background=color_tmpl.default_color["background"], foreground=color_tmpl.default_color["secondary_text"]).pack(fill='x') def closecallback(*args): info("close from installer") finish_page.root.quit() btnframe = mtk.Frame(finish_page, height=30) mtk.ButtonFill(finish_page, text=l( "InstallFinishBtn"), func=closecallback, color_type="danger").pack() btnframe.pack() mtk.Frame(finish_page, height=30).pack() mtk.Frame(finish_page, w=10000).pack(fill="both", expand=True) finish_page.pack(fill="both", expand=True) now_frame = finish_page def installer_ui(root: mtk.Frame): global master install_root_frame = mtk.Frame(root) master = install_root_frame show_first_page() install_root_frame.pack(fill="both", expand=True)