# components/factions_deities.py import gradio as gr from image_utils import generate_faction_image, generate_deity_image from datetime import datetime import json import os def save_to_gallery(content_type: str, data: dict, image_path: str): timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") os.makedirs("gallery", exist_ok=True) filename = f"gallery/{content_type}_{timestamp}.json" with open(filename, "w") as f: json.dump({"type": content_type, "data": data, "image": image_path}, f, indent=2) def faction_deity_tab(): with gr.TabItem("🛡️ Faction & Deity Generator"): with gr.Row(): with gr.Column(): entity_type = gr.Radio(label="Generate", choices=["Faction", "Deity"], value="Faction") entity_name = gr.Textbox(label="Name", placeholder="The Silver Flame") domain_or_type = gr.Textbox(label="Domain or Type", placeholder="War / Guild") alignment = gr.Dropdown(label="Alignment", choices=["Lawful Good", "Neutral Good", "Chaotic Good", "Lawful Neutral", "True Neutral", "Chaotic Neutral", "Lawful Evil", "Neutral Evil", "Chaotic Evil"], value="Lawful Neutral") power_level = gr.Dropdown(label="Power Level (Deity Only)", choices=["Lesser", "Intermediate", "Greater", "Overgod"], value="Intermediate") deity_sex = gr.Radio(label="Deity Sex (if applicable)", choices=["Male", "Female", "Nonbinary"], value="Nonbinary") gen_btn = gr.Button("🎨 Generate Image") image_out = gr.Image(label="Image", height=512) export_btn = gr.Button("💾 Save to Gallery") export_status = gr.Textbox(label="Export Status") def build_and_generate(entity_type, name, domain_or_type, alignment, power_level, deity_sex): data = { "name": name or f"Unnamed {entity_type}", "alignment": alignment } if entity_type == "Faction": data["faction_type"] = domain_or_type or "Guild" return generate_faction_image(data, art_style="Concept Art") else: data.update({ "domain": domain_or_type or "War", "power_level": power_level, "pantheon": "Generic", "sex": deity_sex }) return generate_deity_image(data, art_style="Concept Art") gen_btn.click( build_and_generate, inputs=[entity_type, entity_name, domain_or_type, alignment, power_level, deity_sex], outputs=image_out ) export_btn.click( lambda et, n, dt, a, pl, ds, img: save_to_gallery( et.lower(), { "name": n, "domain_or_type": dt, "alignment": a, "power_level": pl if et == "Deity" else None, "sex": ds if et == "Deity" else None }, img ) or "✅ Saved!", inputs=[entity_type, entity_name, domain_or_type, alignment, power_level, deity_sex, image_out], outputs=export_status )