Added new post-gen option to change TF Piece GFX
This commit is contained in:
@@ -208,6 +208,7 @@ class CustomSettings(object):
|
||||
|
||||
# rom adjust stuff
|
||||
args.sprite[p] = get_setting(settings['sprite'], args.sprite[p])
|
||||
args.triforce_gfx[p] = get_setting(settings['triforce_gfx'], args.triforce_gfx[p])
|
||||
args.disablemusic[p] = get_setting(settings['disablemusic'], args.disablemusic[p])
|
||||
args.quickswap[p] = get_setting(settings['quickswap'], args.quickswap[p])
|
||||
args.reduce_flashing[p] = get_setting(settings['reduce_flashing'], args.reduce_flashing[p])
|
||||
|
||||
121
source/classes/ItemGfxSelector.py
Normal file
121
source/classes/ItemGfxSelector.py
Normal file
@@ -0,0 +1,121 @@
|
||||
from tkinter import Button, Canvas, Label, LabelFrame, Frame, PhotoImage, Scrollbar, Toplevel, LEFT, BOTTOM, X, RIGHT, TOP
|
||||
import os
|
||||
from GuiUtils import ToolTips, set_icon
|
||||
from Utils import local_path
|
||||
|
||||
|
||||
class ItemGfxSelector(object):
|
||||
def __init__(self, parent, callback, valid_items=None):
|
||||
self.parent = parent
|
||||
self.window = Toplevel(parent)
|
||||
self.window.geometry("800x650")
|
||||
self.callback = callback
|
||||
self.valid_items = valid_items if valid_items else []
|
||||
|
||||
self.window.wm_title("Select Triforce Piece Graphics")
|
||||
self.window['padx'] = 5
|
||||
self.window['pady'] = 5
|
||||
|
||||
def open_itemgfx_dir(_evt):
|
||||
from Utils import open_file
|
||||
itemgfx_dir = local_path(os.path.join("data", "itemgfx"))
|
||||
if not os.path.isdir(itemgfx_dir):
|
||||
os.makedirs(itemgfx_dir)
|
||||
open_file(itemgfx_dir)
|
||||
|
||||
frametitle = Frame(self.window)
|
||||
title_text = Label(frametitle, text="Item Graphics")
|
||||
title_text.pack(side=LEFT)
|
||||
local_title_link = Label(frametitle, text="(open folder)", fg="blue", cursor="hand2")
|
||||
local_title_link.pack(side=LEFT)
|
||||
local_title_link.bind("<Button-1>", open_itemgfx_dir)
|
||||
|
||||
self.icon_section(frametitle)
|
||||
|
||||
frame = Frame(self.window)
|
||||
frame.pack(side=BOTTOM, fill=X, pady=5)
|
||||
|
||||
button = Button(frame, text="Default (Triforce)", command=self.use_default)
|
||||
button.pack(side=LEFT, padx=(0, 5))
|
||||
|
||||
set_icon(self.window)
|
||||
self.window.focus()
|
||||
|
||||
def icon_section(self, frame_label):
|
||||
frame = LabelFrame(self.window, labelwidget=frame_label, padx=5, pady=5)
|
||||
canvas = Canvas(frame, borderwidth=0, width=780)
|
||||
y_scrollbar = Scrollbar(frame, orient="vertical", command=canvas.yview)
|
||||
y_scrollbar.pack(side="right", fill="y")
|
||||
content_frame = Frame(canvas)
|
||||
canvas.pack(side="left", fill="both", expand=True)
|
||||
canvas.create_window((4, 4), window=content_frame, anchor="nw")
|
||||
canvas.configure(yscrollcommand=y_scrollbar.set)
|
||||
|
||||
def onFrameConfigure(canvas):
|
||||
"""Reset the scroll region to encompass the inner frame"""
|
||||
canvas.configure(scrollregion=canvas.bbox("all"))
|
||||
|
||||
content_frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))
|
||||
frame.pack(side=TOP, fill="both", expand=True)
|
||||
|
||||
itemgfx_dir = local_path(os.path.join("data", "itemgfx"))
|
||||
|
||||
if not os.path.exists(itemgfx_dir):
|
||||
label = Label(content_frame, text='No item graphics found in data/itemgfx folder.')
|
||||
label.pack()
|
||||
return
|
||||
|
||||
# Get all GIF files (converted from PNG)
|
||||
gif_files = []
|
||||
for file in os.listdir(itemgfx_dir):
|
||||
if file.lower().endswith('.gif'):
|
||||
item_name = os.path.splitext(file)[0]
|
||||
# Only include if it's in the valid_items list
|
||||
if item_name in self.valid_items:
|
||||
gif_files.append((file, item_name))
|
||||
|
||||
# Sort by name
|
||||
gif_files.sort(key=lambda x: str.lower(x[1]))
|
||||
|
||||
if len(gif_files) == 0:
|
||||
label = Label(content_frame, text='No valid item graphics found. Items must match names from Tables.py.')
|
||||
label.pack()
|
||||
return
|
||||
|
||||
# Calculate how many columns can fit (assuming ~40px per icon with padding)
|
||||
max_columns = 18
|
||||
|
||||
i = 0
|
||||
for filename, item_name in gif_files:
|
||||
filepath = os.path.join(itemgfx_dir, filename)
|
||||
image = self.get_image_for_item(filepath)
|
||||
if image is None:
|
||||
continue
|
||||
|
||||
button = Button(content_frame, image=image, command=lambda name=item_name: self.select_item(name))
|
||||
ToolTips.register(button, item_name)
|
||||
button.image = image
|
||||
button.grid(row=i // max_columns, column=i % max_columns, padx=2, pady=2)
|
||||
i += 1
|
||||
|
||||
if i == 0:
|
||||
label = Label(content_frame, text='No valid item graphics could be loaded.')
|
||||
label.pack()
|
||||
|
||||
def get_image_for_item(self, filepath):
|
||||
"""Load and prepare an item graphic for display"""
|
||||
try:
|
||||
# Load GIF with native Tkinter PhotoImage (no PIL required)
|
||||
photo = PhotoImage(file=filepath)
|
||||
return photo
|
||||
except Exception as e:
|
||||
print(f"Error loading image {filepath}: {e}")
|
||||
return None
|
||||
|
||||
def use_default(self):
|
||||
self.callback("Triforce")
|
||||
self.window.destroy()
|
||||
|
||||
def select_item(self, item_name):
|
||||
self.callback(item_name)
|
||||
self.window.destroy()
|
||||
Reference in New Issue
Block a user