From 4ebd01e92471082904f3faca201b4a7744246505 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Tue, 2 Aug 2022 18:01:25 +0200 Subject: [PATCH] added a root property for all the container with the main window. (self.master.master ... -> self.root). Fixed an issue with mystuff profile not being deleted properly --- source/gui/install.py | 43 +++++++++++++++++++++++++++++-------------- source/gui/mystuff.py | 37 +++++++++++++++++++++---------------- 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/source/gui/install.py b/source/gui/install.py index d1450d9..31809c9 100644 --- a/source/gui/install.py +++ b/source/gui/install.py @@ -40,6 +40,7 @@ class InstallerState(enum.Enum): class Window(tkinter.Tk): def __init__(self, options: Option): super().__init__() + self.root = self self.options: Option = options @@ -140,6 +141,7 @@ class Window(tkinter.Tk): class Menu(tkinter.Menu): def __init__(self, master): super().__init__(master) + self.root = master.root self.language = self.Language(self) self.advanced = self.Advanced(self) @@ -149,12 +151,14 @@ class Menu(tkinter.Menu): class Language(tkinter.Menu): def __init__(self, master: tkinter.Menu): super().__init__(master, tearoff=False) + self.root = master.root + master.add_cascade(label=_("LANGUAGE_SELECTION"), menu=self) - self.variable = tkinter.StringVar(value=self.master.master.options["language"]) + self.variable = tkinter.StringVar(value=self.root.options["language"]) def callback(file: Path): - def func(): self.master.master.options["language"] = file.stem + def func(): self.root.options["language"] = file.stem return func for file in Path("./assets/language/").iterdir(): @@ -170,6 +174,7 @@ class Menu(tkinter.Menu): class Advanced(tkinter.Menu): def __init__(self, master: tkinter.Menu): super().__init__(master, tearoff=False) + self.root = master.root master.add_cascade(label=_("ADVANCED_CONFIGURATION"), menu=self) self.add_command(label=_("OPEN_MYSTUFF_WINDOW"), command= mystuff.Window) @@ -179,12 +184,14 @@ class Menu(tkinter.Menu): class ThreadsUsed(tkinter.Menu): def __init__(self, master: tkinter.Menu): super().__init__(master, tearoff=False) + self.root = master.root + master.add_cascade(label=_("THREADS_USED"), menu=self) - self.variable = tkinter.IntVar(value=master.master.master.options["threads"]) + self.variable = tkinter.IntVar(value=self.root.options["threads"]) def callback(threads_amount: int): - def func(): self.master.master.master.options["threads"] = threads_amount + def func(): self.root.options["threads"] = threads_amount return func for i in [1, 2, 4, 8, 12, 16]: @@ -199,6 +206,7 @@ class Menu(tkinter.Menu): class Help(tkinter.Menu): def __init__(self, master: tkinter.Menu): super().__init__(master, tearoff=False) + self.root = master.root master.add_cascade(label="Help", menu=self) self.menu_id = self.master.index(tkinter.END) @@ -234,6 +242,8 @@ class Menu(tkinter.Menu): class SourceGame(ttk.LabelFrame): def __init__(self, master: tkinter.Tk): super().__init__(master, text="Original Game File") + self.root = master.root + self.columnconfigure(1, weight=1) self.entry = ttk.Entry(self, width=55) @@ -268,7 +278,7 @@ class SourceGame(ttk.LabelFrame): self.entry.insert(0, str(path.absolute())) if path.suffix == ".dol": path = path.parent.parent - self.master.destination_game.set_path(path.parent) + self.root.destination_game.set_path(path.parent) def get_path(self) -> Path: """ @@ -295,6 +305,8 @@ class SourceGame(ttk.LabelFrame): class DestinationGame(ttk.LabelFrame): def __init__(self, master: tkinter.Tk): super().__init__(master, text="Game Directory Destination") + self.root = master.root + self.columnconfigure(1, weight=1) self.entry = ttk.Entry(self) @@ -361,21 +373,22 @@ class DestinationGame(ttk.LabelFrame): class ButtonInstall(ttk.Button): def __init__(self, master: tkinter.Tk): super().__init__(master, text="Install", command=self.install) + self.root = master.root @threaded @better_gui_error def install(self): try: - self.master.set_state(InstallerState.INSTALLING) + self.root.set_state(InstallerState.INSTALLING) # check if the user entered a source path - source_path = self.master.get_source_path() + source_path = self.root.get_source_path() if str(source_path) == ".": messagebox.showerror(_("ERROR"), _("ERROR_INVALID_SOURCE_GAME")) return # check if the user entered a destination path - destination_path = self.master.get_destination_path() + destination_path = self.root.get_destination_path() if str(destination_path) == ".": messagebox.showerror(_("ERROR"), _("ERROR_INVALID_DESTINATION_GAME")) return @@ -391,20 +404,20 @@ class ButtonInstall(ttk.Button): return game = Game(source_path) - mod_config = self.master.get_mod_config() - output_type = self.master.get_output_type() + mod_config = self.root.get_mod_config() + output_type = self.root.get_output_type() - self.master.progress_function( + self.root.progress_function( game.install_mod( dest=destination_path, mod_config=mod_config, output_type=output_type, - options=self.master.options + options=self.root.options ) ) message_texts = mod_config.messages.get("installation_completed", {}).get("text", {}) - message = message_texts.get(self.master.options["language"]) + message = message_texts.get(self.root.options["language"]) if message is None: message = message_texts.get("*") if message is None: message = _('NO_MESSAGE_FROM_AUTHOR') message = mod_config.safe_eval(message, multiple=True) @@ -415,7 +428,7 @@ class ButtonInstall(ttk.Button): ) finally: - self.master.set_state(InstallerState.IDLE) + self.root.set_state(InstallerState.IDLE) def set_state(self, state: InstallerState) -> None: """ @@ -432,6 +445,7 @@ class ButtonInstall(ttk.Button): class ProgressBar(ttk.LabelFrame): def __init__(self, master: tkinter.Tk): super().__init__(master) + self.root = master.root # make the element fill the whole frame self.columnconfigure(1, weight=1) @@ -503,6 +517,7 @@ class ProgressBar(ttk.LabelFrame): class SelectPack(ttk.Frame): def __init__(self, master: tkinter.Tk): super().__init__(master) + self.root = master.root self.combobox = ttk.Combobox(self) self.combobox.grid(row=1, column=1, sticky="NEWS") diff --git a/source/gui/mystuff.py b/source/gui/mystuff.py index 5cd0a55..fdae581 100644 --- a/source/gui/mystuff.py +++ b/source/gui/mystuff.py @@ -13,12 +13,14 @@ class Window(tkinter.Toplevel): def __init__(self): super().__init__() + self.root = self.master.root + self.title(_("CONFIGURE_MYSTUFF_PATCH")) self.resizable(False, False) self.grab_set() # the others window will be disabled, keeping only this one activated self.disabled_text: str = _("<", "DISABLED", ">") - self.master.options["mystuff_pack_selected"] = self.master.options["mystuff_pack_selected"] + self.root.options["mystuff_pack_selected"] = self.root.options["mystuff_pack_selected"] self.frame_profile = ttk.Frame(self) self.frame_profile.grid(row=1, column=1, sticky="NEWS") @@ -79,11 +81,11 @@ class Window(tkinter.Toplevel): Refresh all the profile """ - combobox_values = [self.disabled_text, *self.master.options["mystuff_packs"]] + combobox_values = [self.disabled_text, *self.root.options["mystuff_packs"]] self.combobox_profile.configure(values=combobox_values) self.combobox_profile.current(combobox_values.index( - self.master.options["mystuff_pack_selected"] - if self.master.options["mystuff_pack_selected"] in self.master.options["mystuff_packs"] else + self.root.options["mystuff_pack_selected"] + if self.root.options["mystuff_pack_selected"] in self.root.options["mystuff_packs"] else self.disabled_text )) @@ -91,18 +93,20 @@ class Window(tkinter.Toplevel): """ Select another profile """ - + profile_name = self.combobox_profile.get() if profile_name is None else profile_name + if not profile_name in self.root.options["mystuff_packs"]: profile_name = self.disabled_text + self.combobox_profile.set(profile_name) - self.master.options["mystuff_pack_selected"] = profile_name + self.root.options["mystuff_pack_selected"] = profile_name self.listbox_mystuff_paths.delete(0, tkinter.END) - is_disabled = (profile_name == self.disabled_text) + is_disabled: bool = (profile_name == self.disabled_text) for children in self.frame_mystuff_paths_action.children.values(): children.configure(state=tkinter.DISABLED if is_disabled else tkinter.NORMAL) if is_disabled: return - profile_data = self.master.options["mystuff_packs"][profile_name] + profile_data = self.root.options["mystuff_packs"][profile_name] for path in profile_data["paths"]: self.listbox_mystuff_paths.insert(tkinter.END, path) @@ -111,8 +115,9 @@ class Window(tkinter.Toplevel): """ Save the new profile """ + profile_name: str = self.combobox_profile.get() - if profile_name in self.master.options["mystuff_packs"]: + if profile_name in self.root.options["mystuff_packs"]: messagebox.showerror(_("ERROR"), _("MYSTUFF_PROFILE_ALREADY_EXIST")) return @@ -121,7 +126,7 @@ class Window(tkinter.Toplevel): messagebox.showerror(_("ERROR"), _("MYSTUFF_PROFILE_FORBIDDEN_NAME")) return - self.master.options["mystuff_packs"][profile_name] = {"paths": []} + self.root.options["mystuff_packs"][profile_name] = {"paths": []} self.refresh_profiles() self.select_profile(profile_name=profile_name) @@ -129,9 +134,9 @@ class Window(tkinter.Toplevel): """ Delete the currently selected profile """ - profile_name: str = self.combobox_profile.get() - self.master.options["mystuff_packs"][self.master.options["mystuff_pack_selected"]].pop(profile_name) - + + self.root.options["mystuff_packs"].pop(self.root.options["mystuff_pack_selected"]) + self.refresh_profiles() self.select_profile() def add_mystuff_path(self) -> None: @@ -142,7 +147,7 @@ class Window(tkinter.Toplevel): if (mystuff_path := filedialog.askdirectory(title=_("SELECT_MYSTUFF"), mustexist=True)) is None: return mystuff_path = Path(mystuff_path) - self.master.options["mystuff_packs"][self.master.options["mystuff_pack_selected"]]["paths"].append( + self.root.options["mystuff_packs"][self.root.options["mystuff_pack_selected"]]["paths"].append( str(mystuff_path.resolve()) ) @@ -151,12 +156,12 @@ class Window(tkinter.Toplevel): def remove_mystuff_path(self) -> None: """ Remove the selected MyStuff path from the profile - :return: """ + selections = self.listbox_mystuff_paths.curselection() if not selections: return for selection in selections: - self.master.options["mystuff_packs"][self.master.options["mystuff_pack_selected"]]["paths"].pop(selection) + self.root.options["mystuff_packs"][self.root.options["mystuff_pack_selected"]]["paths"].pop(selection) self.select_profile()