fully implemented track_selecting preview

This commit is contained in:
Faraphel 2022-08-02 17:59:37 +02:00
parent 222886e009
commit 5dcb0d4343
2 changed files with 101 additions and 14 deletions

View file

@ -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("<Return>", 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<color_name>.*?)}", 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)

View file

@ -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("<Return>", 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)