Files
alttpr-python/Gui.py
Mike A. Trethewey 03431f0b83 Implement save system
Add to .gitignore
Add to default CLI args
Add to each page that needs it
* Rom Adjuster
* Seed
* Generation attempts
* Enemizer CLI path
* Base ROM
* Multiworld worlds
* Multiworld names
2020-02-08 19:01:15 -08:00

145 lines
5.4 KiB
Python
Executable File

#!/usr/bin/env python3
from argparse import Namespace
from glob import glob
import json
import logging
import random
import os
import shutil
import sys
from tkinter import Checkbutton, OptionMenu, Toplevel, LabelFrame, PhotoImage, Tk, LEFT, RIGHT, BOTTOM, TOP, StringVar, IntVar, Frame, Label, W, E, X, BOTH, Entry, Spinbox, Button, filedialog, messagebox, ttk
from urllib.parse import urlparse
from urllib.request import urlopen
from AdjusterMain import adjust
from CLI import get_working_dirs
from DungeonRandomizer import parse_arguments
from gui.adjust.overview import adjust_page
from gui.custom.overview import custom_page
from gui.loadcliargs import loadcliargs
from gui.randomize.item import item_page
from gui.randomize.entrando import entrando_page
from gui.randomize.enemizer import enemizer_page
from gui.randomize.dungeon import dungeon_page
from gui.randomize.multiworld import multiworld_page
from gui.randomize.gameoptions import gameoptions_page
from gui.randomize.generation import generation_page
from gui.bottom import bottom_frame
from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress
from Main import main, __version__ as ESVersion
from Rom import Sprite
from Utils import is_bundled, local_path, output_path, open_file
def guiMain(args=None):
# save working dirs
def save_working_dirs():
user_resources_path = os.path.join(".","resources","user")
working_dirs_path = os.path.join(user_resources_path)
if not os.path.exists(working_dirs_path):
os.makedirs(working_dirs_path)
with open(os.path.join(working_dirs_path,"working_dirs.json"),"w+") as f:
f.write(json.dumps(self.working_dirs,indent=2))
os.chmod(os.path.join(working_dirs_path,"working_dirs.json"),0o755)
# routine for exiting the app
def guiExit():
save_working_dirs()
sys.exit(0)
# make main window
# add program title & version number
mainWindow = Tk()
self = mainWindow
mainWindow.wm_title("Door Shuffle %s" % ESVersion)
mainWindow.protocol("WM_DELETE_WINDOW",guiExit) # intercept when user clicks the X
# set program icon
set_icon(mainWindow)
# get working dirs
self.working_dirs = get_working_dirs()
notebook = ttk.Notebook(self)
self.randomizerWindow = ttk.Frame(notebook)
self.adjustWindow = ttk.Frame(notebook)
self.customWindow = ttk.Frame(notebook)
notebook.add(self.randomizerWindow, text='Randomize')
notebook.add(self.adjustWindow, text='Adjust')
notebook.add(self.customWindow, text='Custom')
notebook.pack()
# randomizer controls
# Randomize notebook page:
# make notebook pages: Item, Entrances, Enemizer, Dungeon Shuffle, Multiworld, Game Options, Generation Setup
# Item: Item Randomizer settings
# Entrances: Entrance Randomizer settings
# Enemizer: Enemy Randomizer settings
# Dungeon Shuffle: Dungeon Door Randomizer settings
# Multiworld: Multiworld settings
# Game Options: Cosmetic settings that don't affect logic/placement
# Generation Setup: Primarily one&done settings
self.randomizerNotebook = ttk.Notebook(self.randomizerWindow)
# Item Randomizer
self.itemWindow = item_page(self.randomizerNotebook)
self.randomizerNotebook.add(self.itemWindow, text="Items")
# Entrance Randomizer
self.entrandoWindow = entrando_page(self.randomizerNotebook)
self.randomizerNotebook.add(self.entrandoWindow, text="Entrances")
# Enemizer
self.enemizerWindow,self.working_dirs = enemizer_page(self.randomizerNotebook,self.working_dirs)
self.randomizerNotebook.add(self.enemizerWindow, text="Enemizer")
# Dungeon Shuffle
self.dungeonRandoWindow = dungeon_page(self.randomizerNotebook)
self.randomizerNotebook.add(self.dungeonRandoWindow, text="Dungeon Shuffle")
# Multiworld
self.multiworldWindow,self.working_dirs = multiworld_page(self.randomizerNotebook,self.working_dirs)
self.randomizerNotebook.add(self.multiworldWindow, text="Multiworld")
# Game Options
self.gameOptionsWindow = gameoptions_page(self.randomizerNotebook)
self.randomizerNotebook.add(self.gameOptionsWindow, text="Game Options")
# Generation Setup
self.generationSetupWindow,self.working_dirs = generation_page(self.randomizerNotebook,self.working_dirs)
self.randomizerNotebook.add(self.generationSetupWindow, text="Generation Setup")
# add randomizer notebook to main window
self.randomizerNotebook.pack()
# bottom of window: Open Output Directory, Open Documentation (if exists)
self.farBottomFrame = bottom_frame(self,self,None)
# set bottom frame to main window
self.farBottomFrame.pack(side=BOTTOM, fill=X, padx=5, pady=5)
# Adjuster Controls
self.adjustContent,self.working_dirs = adjust_page(self,self.adjustWindow,self.working_dirs)
# self.adjustContent,self.working_dirs = adjust_page(self,self.adjustWindow,self.working_dirs)
self.adjustContent.pack(side=TOP, fill=BOTH, expand=True)
# Custom Controls
self.customContent = custom_page(self,self.customWindow)
self.customContent.pack(side=TOP, pady=(17,0))
def validation(P):
if str.isdigit(P) or P == "":
return True
else:
return False
vcmd=(self.customContent.register(validation), '%P')
# load args from CLI into options
loadcliargs(self,args)
mainWindow.mainloop()
if __name__ == '__main__':
args = parse_arguments(None)
guiMain(args)