From 2edb82939c3187f47976a7b1e47791b3eca4726e Mon Sep 17 00:00:00 2001 From: Faraphel Date: Sun, 21 Aug 2022 23:12:50 +0200 Subject: [PATCH] added a developer mode enabling a testing frame in the ModSettings --- assets/language/en.json | 4 +++- assets/language/fr.json | 4 +++- source/gui/install.py | 16 +++++++++++++--- source/gui/mod_settings.py | 30 +++++++++++++++++++++++++++++- source/mkw/ModSettings/Boolean.py | 4 ++-- source/mkw/ModSettings/Choices.py | 2 +- source/mkw/ModSettings/String.py | 2 +- source/mkw/ModSettings/__init__.py | 9 +++++++-- source/option.py | 1 + 9 files changed, 60 insertions(+), 12 deletions(-) diff --git a/assets/language/en.json b/assets/language/en.json index 74cbfcb..cb42289 100644 --- a/assets/language/en.json +++ b/assets/language/en.json @@ -103,6 +103,8 @@ "COPY_FUNCTION_FORBIDDEN": "Copying functions is forbidden", "GET_METHOD_FORBIDDEN": "Using getattr on a method is forbidden", "CAN_ONLY_CALL_METHOD_OF_CONSTANT": "You can only call methods on constant", - "CAN_ONLY_CALL_FUNCTION_IN_ENV": "You can only call function from the environment" + "CAN_ONLY_CALL_FUNCTION_IN_ENV": "You can only call function from the environment", + "ENABLE_DEVELOPER_MODE": "Enable the developer mode", + "TESTING_MOD_SETTINGS": "Test mod settings" } } \ No newline at end of file diff --git a/assets/language/fr.json b/assets/language/fr.json index 641b19a..5c658c3 100644 --- a/assets/language/fr.json +++ b/assets/language/fr.json @@ -104,6 +104,8 @@ "COPY_FUNCTION_FORBIDDEN": "Impossible de copier une fonction", "GET_METHOD_FORBIDDEN": "Impossible d'utiliser getattr sur une méthode", "CAN_ONLY_CALL_METHOD_OF_CONSTANT": "Vous ne pouvez appeler que des méthodes sur des constantes", - "CAN_ONLY_CALL_FUNCTION_IN_ENV": "Vous ne pouvez appeler que des fonctions dans l'environnement" + "CAN_ONLY_CALL_FUNCTION_IN_ENV": "Vous ne pouvez appeler que des fonctions dans l'environnement", + "ENABLE_DEVELOPER_MODE": "Activer le mode développeur", + "TESTING_MOD_SETTINGS": "Paramètre de test" } } \ No newline at end of file diff --git a/source/gui/install.py b/source/gui/install.py index a685b5f..0424b01 100644 --- a/source/gui/install.py +++ b/source/gui/install.py @@ -173,11 +173,21 @@ class Menu(tkinter.Menu): self.root = master.root master.add_cascade(label=_("ADVANCED_CONFIGURATION"), menu=self) - self.add_command(label=_("OPEN_MYSTUFF_SETTINGS"), - command=lambda: mystuff.Window(self.root.mod_config, self.root.options)) - + self.add_command( + label=_("OPEN_MYSTUFF_SETTINGS"), + command=lambda: mystuff.Window(self.root.mod_config, self.root.options) + ) self.threads_used = self.ThreadsUsed(self) + self.add_separator() + + self.variable_developer_mode = tkinter.BooleanVar(value=self.root.options.developer_mode.get()) + self.add_checkbutton( + label=_("ENABLE_DEVELOPER_MODE"), + variable=self.variable_developer_mode, + command=lambda: self.root.options.developer_mode.set(self.variable_developer_mode.get()) + ) + class ThreadsUsed(tkinter.Menu): def __init__(self, master: tkinter.Menu): super().__init__(master, tearoff=False) diff --git a/source/gui/mod_settings.py b/source/gui/mod_settings.py index 86b8a87..c511bc3 100644 --- a/source/gui/mod_settings.py +++ b/source/gui/mod_settings.py @@ -3,6 +3,7 @@ from tkinter import ttk from typing import TYPE_CHECKING from source.translation import translate as _, translate_external +from source.mkw import ModSettings if TYPE_CHECKING: from source.mkw.ModConfig import ModConfig @@ -37,6 +38,12 @@ class Window(tkinter.Toplevel): self.mod_config.specific_settings ) + if self.options.developer_mode.get(): + self.frame_testing_settings = FrameTesting( + self.panel_window, + _("TESTING_MOD_SETTINGS") + ) + # add at the end a message from the mod creator where he can put some additional note about the settings. if text := translate_external( self.mod_config, @@ -68,7 +75,6 @@ class FrameSettings(ttk.Frame): self.columnconfigure(1, weight=1) language = self.root.options.language.get() - index: int = 0 for index, (settings_name, settings_data) in enumerate(settings.items()): text = translate_external(self.root.mod_config, language, settings_data.text) description = translate_external(self.root.mod_config, language, settings_data.description) @@ -90,3 +96,25 @@ class FrameSettings(ttk.Frame): foreground="gray", justify=tkinter.CENTER) description_label.grid(row=2, column=1) + +class FrameTesting(ttk.Frame): + def __init__(self, master, text: str): + super().__init__(master) + master.add(self, text=text) + self.root = self.master.root + + self.columnconfigure(1, weight=1) + + for index, (settings_name, settings_data) in enumerate({ + "TEST_PREVIEW_FORMATTING": ModSettings.String.String(preview="track_formatting"), + "TEST_PREVIEW_SELECTING": ModSettings.String.String(preview="track_selecting"), + "TEST_PREVIEW_SORTING": ModSettings.String.String(preview="track_sorting"), + + "TEST_STRING": ModSettings.String.String(), + "TEST_CHOICES": ModSettings.Choices.Choices(["test1", "test2", "test3"]), + "TEST_BOOLEAN": ModSettings.Boolean.Boolean(), + }.items()): + frame = ttk.LabelFrame(self, text=settings_name) + frame.root = self.root + frame.grid(row=index, column=1, sticky="NEWS") + settings_data.tkinter_show(frame) diff --git a/source/mkw/ModSettings/Boolean.py b/source/mkw/ModSettings/Boolean.py index c4653ae..be5eb26 100644 --- a/source/mkw/ModSettings/Boolean.py +++ b/source/mkw/ModSettings/Boolean.py @@ -2,7 +2,7 @@ from source.mkw.ModSettings import AbstractModSettings from source.translation import translate as _ -class Choices(AbstractModSettings): +class Boolean(AbstractModSettings): """ This setting type allow you to input a string text. You can optionally add a "preview" to allow the user to use a window to select the value. @@ -10,7 +10,7 @@ class Choices(AbstractModSettings): type = "boolean" - def tkinter_show(self, master, checkbox) -> None: + def tkinter_show(self, master, checkbox=None) -> None: import tkinter from tkinter import ttk diff --git a/source/mkw/ModSettings/Choices.py b/source/mkw/ModSettings/Choices.py index e0da289..e12eca0 100644 --- a/source/mkw/ModSettings/Choices.py +++ b/source/mkw/ModSettings/Choices.py @@ -14,7 +14,7 @@ class Choices(AbstractModSettings): self.choices = choices if self.default is None: self.default = self.choices[0] - def tkinter_show(self, master, checkbox) -> None: + def tkinter_show(self, master, checkbox=None) -> None: import tkinter from tkinter import ttk diff --git a/source/mkw/ModSettings/String.py b/source/mkw/ModSettings/String.py index 606985c..f04de8f 100644 --- a/source/mkw/ModSettings/String.py +++ b/source/mkw/ModSettings/String.py @@ -14,7 +14,7 @@ class String(AbstractModSettings): super().__init__(**kwargs) self.preview = preview - def tkinter_show(self, master, checkbox) -> None: + def tkinter_show(self, master, checkbox=None) -> None: import tkinter from tkinter import ttk diff --git a/source/mkw/ModSettings/__init__.py b/source/mkw/ModSettings/__init__.py index d2d9bf8..d643d7f 100644 --- a/source/mkw/ModSettings/__init__.py +++ b/source/mkw/ModSettings/__init__.py @@ -45,12 +45,15 @@ class AbstractModSettings(ABC): return self.value == self.default @abstractmethod - def tkinter_show(self, master, enabled_variable: "tkinter.BooleanVar") -> None: + def tkinter_show(self, master, enabled_variable: "tkinter.BooleanVar" = None) -> None: """ Show the option inside a tkinter widget :master: master widget :checkbox: checkbox inside the labelframe allowing to enable or disable the setting """ + import tkinter + if enabled_variable is None: enabled_variable = tkinter.BooleanVar() + enabled_variable.set(self.enabled) enabled_variable.trace_add("write", lambda *_: setattr(self, "enabled", enabled_variable.get())) ... @@ -66,13 +69,15 @@ class AbstractModSettings(ABC): return variable @staticmethod - def tkinter_bind(master, enabled_variable: "tkinter.BooleanVar") -> None: + def tkinter_bind(master, enabled_variable: "tkinter.BooleanVar" = None) -> None: """ Bind all widget of the master so that clicking on the frame enable automatically the option :param master: the frame containing the elements :param enabled_variable: the variable associated with the enable state :return: """ + if enabled_variable is None: return + for child in master.winfo_children(): child.bind("", lambda e: enabled_variable.set(True)) diff --git a/source/option.py b/source/option.py index 3741fc6..5cffef6 100644 --- a/source/option.py +++ b/source/option.py @@ -54,6 +54,7 @@ class Options: "mystuff_pack_selected": Option(self, value=None), "mystuff_packs": Option(self, value={}), "extension": Option(self, value="WBFS"), + "developer_mode": Option(self, value=False), } for option_name, option_value in options.items():