DnD_Campaign_Manager / src /ui /tabs /campaign_create_tab.py
official.ghost.logic
Deploy D&D Campaign Manager v2
71b378e
"""
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]
)