diff --git a/source/gui/preview/track_formatting.py b/source/gui/preview/track_formatting.py index 44adabf..ffe87c3 100644 --- a/source/gui/preview/track_formatting.py +++ b/source/gui/preview/track_formatting.py @@ -26,27 +26,27 @@ class Window(AbstractPreviewWindow): self.entry_template_input.grid(row=1, column=1, columnspan=2, sticky="NEWS") self.entry_template_input.bind("", self.preview) - self.text_track_preview = tkinter.Text( + self.text_track_format = tkinter.Text( self, background="black", foreground=MKWColor("off").color_code, state=tkinter.DISABLED ) - self.text_track_preview.grid(row=2, column=1, sticky="NEWS") + self.text_track_format.grid(row=2, column=1, sticky="NEWS") - self.scrollbar_track_preview = ttk.Scrollbar(self, command=self.text_track_preview.yview) + self.scrollbar_track_preview = ttk.Scrollbar(self, command=self.text_track_format.yview) self.scrollbar_track_preview.grid(row=2, column=2, sticky="NEWS") - self.text_track_preview.configure(yscrollcommand=self.scrollbar_track_preview.set) + self.text_track_format.configure(yscrollcommand=self.scrollbar_track_preview.set) for color in MKWColor.get_all_colors(): - self.text_track_preview.tag_configure(color.bmg, foreground=color.color_code) - self.text_track_preview.tag_configure("error", background="red", foreground="white") - + self.text_track_format.tag_configure(color.bmg, foreground=color.color_code) + self.text_track_format.tag_configure("error", background="red", foreground="white") + def preview(self, event: tkinter.Event = None): """ Preview all the tracks name with the track format :return: """ - self.text_track_preview.configure(state=tkinter.NORMAL) - self.text_track_preview.delete(1.0, tkinter.END) + self.text_track_format.configure(state=tkinter.NORMAL) + self.text_track_format.delete(1.0, tkinter.END) # insert all the tracks representation for track in self.mod_config.get_tracks(): @@ -70,14 +70,14 @@ class Window(AbstractPreviewWindow): return "" # remove the tag # insert into the text the track_repr without the tags - self.text_track_preview.insert( + self.text_track_format.insert( tkinter.END, re.sub(r"\\c{(?P.*?)}", tag_format, track_repr) + "\n" ) # color every part of the track_repr with the position and color got in the re.sub for (pos_start, tag_start), (pos_end, tag_end) in zip(tags, tags[1:] + [(None, None)]): - self.text_track_preview.tag_add( + self.text_track_format.tag_add( tag_start, f"end-1c-1l+{pos_start}c", "end-1c" + (f"-1l+{pos_end}c" if pos_end is not None else "") @@ -85,8 +85,8 @@ class Window(AbstractPreviewWindow): except Exception as exc: formatted_exc = str(exc).replace('\n', ' ') - self.text_track_preview.insert(tkinter.END, f"< Error: {formatted_exc} >\n") - self.text_track_preview.tag_add("error", "end-1c-1l", "end-1c") + self.text_track_format.insert(tkinter.END, f"< Error: {formatted_exc} >\n") + self.text_track_format.tag_add("error", "end-1c-1l", "end-1c") - self.text_track_preview.configure(state=tkinter.DISABLED) + self.text_track_format.configure(state=tkinter.DISABLED) diff --git a/source/gui/preview/track_selecting.py b/source/gui/preview/track_selecting.py index e69de29..bf53617 100644 --- a/source/gui/preview/track_selecting.py +++ b/source/gui/preview/track_selecting.py @@ -0,0 +1,87 @@ +import tkinter +from tkinter import ttk +import re + +from source.mkw.MKWColor import MKWColor +from source.gui.preview import AbstractPreviewWindow +from source.gui import better_gui_error + + +ModConfig: any + + +class Window(AbstractPreviewWindow): + + name = "track_selecting" + + def __init__(self, mod_config: "ModConfig", template_variable: tkinter.StringVar = None): + super().__init__(mod_config, template_variable) + self.grid_rowconfigure(2, weight=1) + self.grid_columnconfigure(1, weight=1) + self.grab_set() + + if template_variable is None: template_variable = tkinter.StringVar() + self.mod_config = mod_config + + self.entry_template_input = ttk.Entry(self, width=100, textvariable=template_variable) + self.entry_template_input.grid(row=1, column=1, columnspan=2, sticky="NEWS") + self.entry_template_input.bind("", self.preview) + + self.text_track_format = tkinter.Text(self, width=40, bg="black", fg=MKWColor("off").color_code, state=tkinter.DISABLED) + self.text_track_format.grid(row=2, column=1, sticky="NEWS") + + self.text_track_select = tkinter.Text(self, width=20, bg="black", state=tkinter.DISABLED) + self.text_track_select.grid(row=2, column=2, sticky="NEWS") + + # if a textbox is scrolled, the scrollbar and the other textbox will be affected too + def scroll_textbox(first: int, last: int): + self.scrollbar_track_preview.set(first, last) + self.text_track_format.yview("moveto", first) + self.text_track_select.yview("moveto", first) + + # if the scrollbar is scrolled, then the two textbox are affected + self.scrollbar_track_preview = ttk.Scrollbar(self, + command=lambda *args: ( + self.text_track_format.yview(*args), + self.text_track_select.yview(*args) + ) + ) + self.scrollbar_track_preview.grid(row=2, column=3, sticky="NEWS") + + self.text_track_format.configure(yscrollcommand=scroll_textbox) + self.text_track_select.configure(yscrollcommand=scroll_textbox) + + self.text_track_select.tag_configure("True", foreground="white", background="green") + self.text_track_select.tag_configure("False", foreground="white", background="red") + + self.refresh_tracks_format() + + def refresh_tracks_format(self) -> None: + """ + Preview all the tracks name with the track format + :return: + """ + self.text_track_format.configure(state=tkinter.NORMAL) + self.text_track_format.delete(1.0, tkinter.END) + + # insert all the tracks representation + for track in self.mod_config.get_tracks(): + self.text_track_format.insert(tkinter.END, f"{track}\n") + + self.text_track_format.configure(state=tkinter.DISABLED) + + @better_gui_error + def preview(self, event: tkinter.Event = None) -> None: + """ + Preview all the tracks selection with the given template + """ + self.text_track_select.configure(state=tkinter.NORMAL) + self.text_track_select.delete(1.0, tkinter.END) + + for track in self.mod_config.get_tracks(): + value = self.mod_config.safe_eval(self.entry_template_input.get(), env={"track": track}) == "True" + self.text_track_select.insert(tkinter.END, f"{value}\n") + self.text_track_select.tag_add(str(value), "end-1c-1l", "end-1c") + + self.text_track_select.configure(state=tkinter.DISABLED) + \ No newline at end of file