class LogViewerWidget:
"""
Editable textbox with numbers at side and key bindings for Python
"""
def __init__(self, root: tk.Misc, log_tabs: dict[str, list[str]]):
self.root = root
self.search_box = tk.StringVar(self.root, '')
self.search_matchcase = tk.BooleanVar(self.root, False)
self.search_all_dates = tk.BooleanVar(self.root, True)
self.search_number = tk.StringVar(self.root, '')
main = ttk.Frame(root)
main.pack(side=tk.TOP, expand=tk.YES, fill=tk.BOTH)
self.ini_search(main)
frm = ttk.Frame(main)
frm.pack(side=tk.TOP, expand=tk.YES, fill=tk.BOTH)
# Tabs
self.view_tabs = ttk.Notebook(frm)
self.tab_texts = []
for title, log in log_tabs.items():
tab = ttk.Frame(self.view_tabs)
self.view_tabs.add(tab, text=title)
self.tab_texts.append(log_tab(tab, '\n'.join(log)))
self.view_tabs.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)
def ini_search(self, frame: tk.Misc):
frm = ttk.Frame(frame)
frm.pack(side=tk.TOP, anchor=tk.E)
var = ttk.Entry(frm, textvariable=self.search_box, width=40)
var.pack(side=tk.LEFT)
# var.bind('<KeyRelease>', self.fun_search)
var.bind('<Return>', self.fun_search)
var.bind('<KP_Enter>', self.fun_search)
var = ttk.Button(frm, text='Search', command=self.fun_search, width=10)
var.pack(side=tk.LEFT)
ttk.Checkbutton(frm, variable=self.search_matchcase, text='Case').pack(side=tk.LEFT)
ttk.Checkbutton(frm, variable=self.search_all_dates, text='All Dates').pack(side=tk.LEFT)
ttk.Label(frm, textvariable=self.search_number).pack(side=tk.LEFT)
def fun_search(self, event=None):
"""Search currently active tab"""
found = 0
if self.search_all_dates.get():
# search all tabs
first_tab = False
for tab_index, tab_text in enumerate(self.tab_texts):
found += search_text(tab_text, self.search_box.get(), self.search_matchcase.get(), Colours.highlight)
if not first_tab and found > 0:
self.view_tabs.select(tab_index)
first_tab = True
else:
tab_index = self.view_tabs.index(self.view_tabs.select())
tab_text = self.tab_texts[tab_index]
found += search_text(tab_text, self.search_box.get(), self.search_matchcase.get(), Colours.highlight)
self.search_number.set(f"{found} found")