""" Campaign Create Tab for D'n'D Campaign Manager """ import gradio as gr import traceback from src.agents.campaign_agent import CampaignAgent from src.models.campaign import CampaignTheme class CampaignCreateTab: """Create Campaign tab for creating new campaigns""" def __init__(self, campaign_agent: CampaignAgent): self.campaign_agent = campaign_agent def create_campaign_ui( self, name: str, theme: str, setting: str, summary: str, main_conflict: str, game_master: str, world_name: str, starting_location: str, level_range: str, party_size: int ) -> str: """Create a new campaign""" try: if not name.strip(): return "❌ Error: Please provide a campaign name" campaign = self.campaign_agent.create_campaign( name=name, theme=theme, setting=setting, summary=summary, main_conflict=main_conflict, game_master=game_master, world_name=world_name, starting_location=starting_location, level_range=level_range, party_size=party_size ) return f"""✅ Campaign Created Successfully! **ID:** {campaign.id} **Name:** {campaign.name} **Theme:** {campaign.theme.value} **Setting:** {campaign.setting} Campaign has been saved to database. Use the campaign ID to manage characters and sessions.""" except Exception as e: return f"❌ Error creating campaign:\n\n{str(e)}\n\n{traceback.format_exc()}" def create(self) -> None: """Create and return the Create Campaign tab component""" with gr.Tab("Create Campaign"): gr.Markdown("### Create New Campaign") with gr.Row(): with gr.Column(): campaign_name = gr.Textbox( label="Campaign Name", placeholder="The Shattered Crown", info="Name of your campaign" ) campaign_theme = gr.Dropdown( choices=[theme.value for theme in CampaignTheme], label="Campaign Theme", value="High Fantasy", info="Select the theme of your campaign" ) campaign_gm = gr.Textbox( label="Game Master Name", placeholder="Your name", info="DM/GM running the campaign" ) campaign_party_size = gr.Slider( minimum=1, maximum=10, value=4, step=1, label="Party Size", info="Expected number of players" ) campaign_level_range = gr.Textbox( label="Level Range", value="1-5", placeholder="1-5", info="Expected level range for the campaign" ) with gr.Column(): campaign_world = gr.Textbox( label="World Name", placeholder="Forgotten Realms", info="Name of your world/realm" ) campaign_starting = gr.Textbox( label="Starting Location", placeholder="Phandalin", info="Where the adventure begins" ) campaign_setting = gr.Textbox( label="Setting Description", placeholder="A war-torn kingdom...", lines=3, info="Describe the campaign setting" ) campaign_summary = gr.Textbox( label="Campaign Summary", placeholder="The adventurers must...", lines=3, info="Brief campaign hook/summary" ) campaign_conflict = gr.Textbox( label="Main Conflict", placeholder="A succession crisis threatens the kingdom", lines=2, info="Central conflict/tension" ) create_campaign_btn = gr.Button("⚔️ Create Campaign", variant="primary", size="lg") campaign_create_status = gr.Textbox(label="Status", lines=8) create_campaign_btn.click( fn=self.create_campaign_ui, inputs=[ campaign_name, campaign_theme, campaign_setting, campaign_summary, campaign_conflict, campaign_gm, campaign_world, campaign_starting, campaign_level_range, campaign_party_size ], outputs=[campaign_create_status] )