mirror of
https://github.com/Faraphel/Atlas-Install.git
synced 2025-07-03 03:08:29 +02:00
implemented events that can be registered from the ./plugins/ directory
This commit is contained in:
parent
404111948d
commit
2f7f0ad5bf
3 changed files with 82 additions and 2 deletions
10
plugins/_test.py
Normal file
10
plugins/_test.py
Normal 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
55
source/event.py
Normal 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())
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue