implemented events that can be registered from the ./plugins/ directory

This commit is contained in:
Faraphel 2022-06-08 10:18:14 +02:00
parent 404111948d
commit 2f7f0ad5bf
3 changed files with 82 additions and 2 deletions

10
plugins/_test.py Normal file
View file

@ -0,0 +1,10 @@
from source import event
import tkinter
@event.on("source.gui.install.Window.__init__")
def test_button(master):
tkinter.Button(master, text="test des plugins", command=lambda: print("test")).grid(
row=10, column=1, sticky="nsew"
)
print("I have been called")

55
source/event.py Normal file
View file

@ -0,0 +1,55 @@
from types import FunctionType
from pathlib import Path
import sys
self = sys.modules[__name__]
self.events = {}
# register the function to the event
def on(event_name: str):
"""
Register the function to be called when the event is called.
:param event_name: name of the event
:return: decorator
"""
def decorator(func: FunctionType):
if event_name not in self.events: self.events[event_name] = []
self.events[event_name].append(func)
return func
return decorator
# register all the events at the end of the function
def register(func: FunctionType):
"""
Register the function as an event.
:param func: function to register
:return: function with event call at the end
"""
def wrapper(*args, **kwargs) -> any:
return_values = func(*args, **kwargs)
call_event(f"{func.__module__}.{func.__qualname__}", return_values)
return return_values
return wrapper
# call all the events of the event_name
def call_event(event_name: str, *args, **kwargs) -> None:
"""
Call all the events associated with the event_name.
:param event_name: name of the event
:return:
"""
for func in self.events.get(event_name, []):
func(*args, **kwargs)
# execute all scripts in the ./plugins/ directory that don't start with an underscore
for file in Path("./plugins/").rglob("[!_]*.py"):
exec(file.read_text(encoding="utf8"), globals())

View file

@ -5,9 +5,12 @@ from tkinter import ttk
from source.translation import translate as _ from source.translation import translate as _
from source import event
# Main window for the installer
class Window(tkinter.Tk): class Window(tkinter.Tk):
@event.register
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@ -15,9 +18,11 @@ class Window(tkinter.Tk):
self.resizable(False, False) self.resizable(False, False)
self.iconbitmap("./assets/icon.ico") self.iconbitmap("./assets/icon.ico")
# menu bar
self.menu = Menu(self) self.menu = Menu(self)
self.config(menu=self.menu) self.config(menu=self.menu)
# main frame
self.select_pack = SelectPack(self) self.select_pack = SelectPack(self)
self.select_pack.grid(row=1, column=1, sticky="w") self.select_pack.grid(row=1, column=1, sticky="w")
@ -34,6 +39,7 @@ class Window(tkinter.Tk):
self.progress_bar.grid(row=5, column=1, sticky="nsew") self.progress_bar.grid(row=5, column=1, sticky="nsew")
# Menu bar
class Menu(tkinter.Menu): class Menu(tkinter.Menu):
def __init__(self, master): def __init__(self, master):
super().__init__(master) super().__init__(master)
@ -43,6 +49,7 @@ class Menu(tkinter.Menu):
self.advanced = self.Advanced(self) self.advanced = self.Advanced(self)
self.help = self.Help(self) self.help = self.Help(self)
# Language menu
class Language(tkinter.Menu): class Language(tkinter.Menu):
def __init__(self, master: tkinter.Menu): def __init__(self, master: tkinter.Menu):
super().__init__(master, tearoff=False) super().__init__(master, tearoff=False)
@ -52,6 +59,7 @@ class Menu(tkinter.Menu):
for file in Path("./assets/language/").iterdir(): for file in Path("./assets/language/").iterdir():
self.add_command(label=json.loads(file.read_text(encoding="utf8"))["name"]) self.add_command(label=json.loads(file.read_text(encoding="utf8"))["name"])
# Track configuration menu
class TrackConfiguration(tkinter.Menu): class TrackConfiguration(tkinter.Menu):
def __init__(self, master: tkinter.Menu): def __init__(self, master: tkinter.Menu):
super().__init__(master, tearoff=False) super().__init__(master, tearoff=False)
@ -59,6 +67,7 @@ class Menu(tkinter.Menu):
master.add_cascade(label="Track Configuration", menu=self) master.add_cascade(label="Track Configuration", menu=self)
self.add_command(label="Change configuration") self.add_command(label="Change configuration")
# Advanced menu
class Advanced(tkinter.Menu): class Advanced(tkinter.Menu):
def __init__(self, master: tkinter.Menu): def __init__(self, master: tkinter.Menu):
super().__init__(master, tearoff=False) super().__init__(master, tearoff=False)
@ -66,6 +75,7 @@ class Menu(tkinter.Menu):
master.add_cascade(label="Advanced", menu=self) master.add_cascade(label="Advanced", menu=self)
self.add_command(label="Debug mode") self.add_command(label="Debug mode")
# Help menu
class Help(tkinter.Menu): class Help(tkinter.Menu):
def __init__(self, master: tkinter.Menu): def __init__(self, master: tkinter.Menu):
super().__init__(master, tearoff=False) super().__init__(master, tearoff=False)
@ -75,6 +85,7 @@ class Menu(tkinter.Menu):
self.add_command(label="Github Wiki") self.add_command(label="Github Wiki")
# Select game frame
class SourceGame(ttk.LabelFrame): class SourceGame(ttk.LabelFrame):
def __init__(self, master: tkinter.Tk): def __init__(self, master: tkinter.Tk):
super().__init__(master, text="Original Game") super().__init__(master, text="Original Game")
@ -85,6 +96,7 @@ class SourceGame(ttk.LabelFrame):
ttk.Button(self, text="...", width=2).grid(row=1, column=2, sticky="nsew") ttk.Button(self, text="...", width=2).grid(row=1, column=2, sticky="nsew")
# Select game destination frame
class DestinationGame(ttk.LabelFrame): class DestinationGame(ttk.LabelFrame):
def __init__(self, master: tkinter.Tk): def __init__(self, master: tkinter.Tk):
super().__init__(master, text="Game Destination") super().__init__(master, text="Game Destination")
@ -95,6 +107,7 @@ class DestinationGame(ttk.LabelFrame):
ttk.Button(self, text="...", width=2).grid(row=1, column=2, sticky="nsew") ttk.Button(self, text="...", width=2).grid(row=1, column=2, sticky="nsew")
# Install button
class ButtonInstall(ttk.Button): class ButtonInstall(ttk.Button):
def __init__(self, master: tkinter.Tk): def __init__(self, master: tkinter.Tk):
super().__init__(master, text="Install", command=self.install) super().__init__(master, text="Install", command=self.install)
@ -103,9 +116,10 @@ class ButtonInstall(ttk.Button):
... ...
# Progress bar
class ProgressBar(ttk.Frame): class ProgressBar(ttk.Frame):
def __init__(self, master: tkinter.Tk): def __init__(self, master: tkinter.Tk):
super().__init__() super().__init__(master)
self.progress_bar = ttk.Progressbar(self) self.progress_bar = ttk.Progressbar(self)
self.progress_bar.grid(row=1, column=1, sticky="nsew") self.progress_bar.grid(row=1, column=1, sticky="nsew")
@ -114,9 +128,10 @@ class ProgressBar(ttk.Frame):
self.description.grid(row=2, column=1, sticky="nsew") self.description.grid(row=2, column=1, sticky="nsew")
# Combobox to select the pack
class SelectPack(ttk.Combobox): class SelectPack(ttk.Combobox):
def __init__(self, master: tkinter.Tk): def __init__(self, master: tkinter.Tk):
super().__init__() super().__init__(master)
for pack in Path("./Pack/").iterdir(): for pack in Path("./Pack/").iterdir():
self.insert(tkinter.END, pack.name) self.insert(tkinter.END, pack.name)