mirror of
https://github.com/Faraphel/Atlas-Install.git
synced 2025-07-03 03:08:29 +02:00
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
This commit is contained in:
parent
5dcb0d4343
commit
4ebd01e924
2 changed files with 50 additions and 30 deletions
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
))
|
||||
|
||||
|
@ -93,16 +95,18 @@ class Window(tkinter.Toplevel):
|
|||
"""
|
||||
|
||||
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()
|
||||
|
|
Loading…
Reference in a new issue