Files
alttpr-python/source/gui/randomize/gameoptions.py
Mike A. Trethewey 33d05c1b1f Fix Selectors
2021-02-23 01:38:10 -08:00

119 lines
4.3 KiB
Python

from tkinter import ttk, StringVar, Button, Entry, Frame, Label, E, W, LEFT, RIGHT
from functools import partial
from source.classes.Empty import Empty
from source.classes.SpriteSelector import SpriteSelector
import source.gui.widgets as widgets
import json
import os
def gameoptions_page(top, parent):
# Game Options
self = ttk.Frame(parent)
# Game Options options
self.widgets = {}
# Game Options option sections
self.frames = {}
self.frames["checkboxes"] = Frame(self)
self.frames["checkboxes"].pack(anchor=W)
# Game Options frames
self.frames["leftRomOptionsFrame"] = Frame(self)
self.frames["rightRomOptionsFrame"] = Frame(self)
self.frames["leftRomOptionsFrame"].pack(side=LEFT)
self.frames["rightRomOptionsFrame"].pack(side=RIGHT)
# Load Game Options widgets as defined by JSON file
# Defns include frame name, widget type, widget options, widget placement attributes
# Checkboxes go West
# Everything else goes East
# They also get split left & right
with open(os.path.join("resources","app","gui","randomize","gameoptions","widgets.json")) as widgetDefns:
myDict = json.load(widgetDefns)
for framename,theseWidgets in myDict.items():
dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename])
for key in dictWidgets:
self.widgets[key] = dictWidgets[key]
packAttrs = {"anchor":E}
if self.widgets[key].type == "checkbox":
packAttrs["anchor"] = W
self.widgets[key].pack(packAttrs)
# Sprite Selection
# This one's more-complicated, build it and stuff it
# widget ID
widget = "sprite"
# Empty object
self.widgets[widget] = Empty()
# pieces
self.widgets[widget].pieces = {}
# frame
self.widgets[widget].pieces["frame"] = Frame(self.frames["leftRomOptionsFrame"])
# frame: label
self.widgets[widget].pieces["frame"].label = Label(self.widgets[widget].pieces["frame"], text='Sprite: ')
# spritename: label
self.widgets[widget].pieces["frame"].spritename = Label(self.widgets[widget].pieces["frame"], text='(unchanged)')
# storage var
self.widgets[widget].storageVar = StringVar()
# store sprite
self.sprite = None
def SpriteSetter(spriteObject):
sprite = {}
sprite["object"] = spriteObject
sprite["label"] = {
"show": "(unchanged)",
"store": "(unchanged)"
}
sprite["label"]["store"] = sprite["object"].name
sprite["label"]["show"] = sprite["object"].name if not top.randomSprite.get() else "(random)"
print(top.randomSprite.get(),sprite["label"])
self.sprite = sprite["object"]
self.widgets[widget].pieces["frame"].spritename.config(text=sprite["label"]["show"])
def SpriteSelect():
SpriteSelector(parent, partial(set_sprite, spriteSetter=SpriteSetter,spriteNameVar=self.widgets[widget].storageVar,randomSpriteVar=top.randomSprite))
# dialog button
self.widgets[widget].pieces["button"] = Button(self.widgets[widget].pieces["frame"], text='...', command=SpriteSelect)
# frame label: pack
self.widgets[widget].pieces["frame"].label.pack(side=LEFT)
# spritename: pack
self.widgets[widget].pieces["frame"].spritename.pack(side=LEFT)
# button: pack
self.widgets[widget].pieces["button"].pack(side=LEFT)
# frame: pack
self.widgets[widget].pieces["frame"].pack(anchor=E)
return self
def set_sprite(sprite_param, random_sprite=False, spriteSetter=None, spriteNameVar=None, randomSpriteVar=None):
if randomSpriteVar:
randomSpriteVar.set(random_sprite)
widget = "sprite"
sprite = {}
sprite["object"] = sprite_param
sprite["label"] = {
"show": "(unchanged)",
"store": "(unchanged)"
}
if sprite["object"] is None or not sprite["object"].valid:
if spriteSetter:
spriteSetter(None)
if spriteNameVar is not None:
spriteNameVar.set(sprite["store"])
else:
if spriteSetter:
spriteSetter(sprite["object"])
if spriteNameVar is not None:
spriteNameVar.set(sprite["label"]["store"])
sprite["label"]["store"] = sprite["object"].name
sprite["label"]["show"] = sprite["object"].name if not random_sprite else "(random)"