all repos — m12-patcher @ e3c37d39bb278f21f24f2661ccddd39d5175ca23

patcher.py (view raw)

  1#!/usr/bin/python3
  2import os, tkinter, Constants
  3from tkinter.filedialog import askopenfilename
  4from Functions import check_rom, show_warning, start_patching, apply_preset, set_progress
  5from pathlib import Path
  6from pygubu import Builder
  7
  8PROJECT_PATH = Path(__file__).parent
  9PROJECT_UI = PROJECT_PATH / "patcher.ui"
 10
 11
 12
 13class PatcherApp:
 14    def __init__(self, master=None):
 15        self.builder = builder = Builder()
 16        builder.add_resource_path(PROJECT_PATH)
 17        builder.add_from_file(PROJECT_UI)
 18        # Main widget
 19        self.mainwindow = builder.get_object("main_frame", master)
 20        self.apply_button = builder.get_object("apply_button")
 21        
 22        self.browse_path = None
 23        self.preset = None
 24        self.font = None
 25        self.places = None
 26        self.sprites = None
 27        self.palette = None
 28        self.skip_m1 = None
 29        self.progress = None
 30        self.status_text = None
 31        builder.import_variables(
 32            self,
 33            [
 34                "browse_path",
 35                "preset",
 36                "font",
 37                "places",
 38                "sprites",
 39                "palette",
 40                "skip_m1",
 41                "progress",
 42                "status_text",
 43            ],
 44        )
 45
 46        self.preset.trace('w', self.on_change_preset)
 47        self.preset.set(next(iter(Constants.PRESETS.keys())))
 48        self.status_text.set(Constants.STATUS_START)
 49        
 50        baserom = None
 51        for file in os.listdir('.'):
 52            if file.lower().endswith('.gba'):
 53                filename = os.path.join('.', file)
 54                baserom = filename if check_rom(filename) else baserom
 55        if baserom is not None:
 56            self.browse_path.set(baserom)
 57        
 58        builder.connect_callbacks(self)
 59    
 60    def run(self):
 61        self.mainwindow.mainloop()
 62
 63    def on_browse_button(self):
 64        fn = askopenfilename(filetypes=[(Constants.VAR_FILEPICKER, '*.gba')])
 65        self.browse_path.set(fn)
 66
 67    def trace_f(self, var, index, mode):
 68        preset = var.get()
 69        if apply_preset(self, preset):
 70            set_progress(self, 0, Constants.STATUS_PRESET)
 71    
 72    def on_change_preset(self, *arg):
 73        preset = self.preset.get()
 74        if apply_preset(self, preset):
 75            set_progress(self, 0, f'{Constants.STATUS_PRESET}: {preset}.')
 76
 77    def on_apply_button(self):
 78        self.apply_button['state'] = 'disabled'
 79        
 80        baserom_temp = self.browse_path.get()
 81        
 82        if not check_rom(baserom_temp):
 83            show_warning(Constants.WARNING_MD5_MISMATCH)
 84            self.apply_button['state'] = 'normal'
 85            return
 86        self.baserom = baserom_temp
 87        start_patching(self)
 88        self.apply_button['state'] = 'enabled'
 89        set_progress(self, 0, Constants.STATUS_START)
 90
 91def main():
 92    if not os.path.isdir(Constants.PATH_TOOLS):
 93        show_warning(Constants.WARNING_EXTRACT)
 94        return
 95    
 96    root = tkinter.Tk()
 97    root.title(Constants.VAR_WINDOW_TITLE)
 98    root.resizable(False, False)
 99    app = PatcherApp(root)
100    app.run()
101
102if __name__ == "__main__":
103    main()