DnD_Campaign_Manager / src /ui /tabs /campaign_add_chars_tab.py
official.ghost.logic
Deploy D&D Campaign Manager v2
71b378e
"""
Campaign Add Characters Tab for D'n'D Campaign Manager
"""
import gradio as gr
from src.agents.character_agent import CharacterAgent
from src.agents.campaign_agent import CampaignAgent
from src.ui.components.dropdown_manager import DropdownManager
class CampaignAddCharsTab:
"""Add Characters to Campaign tab"""
def __init__(
self,
character_agent: CharacterAgent,
campaign_agent: CampaignAgent,
dropdown_manager: DropdownManager
):
self.character_agent = character_agent
self.campaign_agent = campaign_agent
self.dropdown_manager = dropdown_manager
def add_character_to_campaign_ui(self, campaign_id: str, character_id: str) -> str:
"""Add a character to a campaign"""
try:
if not campaign_id.strip() or not character_id.strip():
return "❌ Error: Please provide both campaign ID and character ID"
# Verify character exists
character = self.character_agent.load_character(character_id)
if not character:
return f"❌ Character not found: {character_id}"
# Add to campaign
success = self.campaign_agent.add_character_to_campaign(campaign_id, character_id)
if success:
return f"βœ… Added {character.name} to campaign!"
else:
return f"❌ Campaign not found: {campaign_id}"
except Exception as e:
return f"❌ Error: {str(e)}"
def create(self) -> tuple:
"""Create and return the Add Characters to Campaign tab component"""
with gr.Tab("Add Characters"):
gr.Markdown("### Add Characters to Campaign")
add_char_refresh_btn = gr.Button("πŸ”„ Refresh Lists", variant="secondary")
with gr.Row():
add_char_campaign_dropdown = gr.Dropdown(
choices=[],
label="Select Campaign",
info="Choose the campaign to add characters to (type to search)",
allow_custom_value=False,
interactive=True
)
add_char_character_dropdown = gr.Dropdown(
choices=[],
label="Select Character",
info="Choose the character to add (type to search)",
allow_custom_value=False,
interactive=True
)
add_char_btn = gr.Button("βž• Add Character to Campaign", variant="primary")
add_char_status = gr.Textbox(label="Status", lines=4)
# Refresh both dropdowns
def refresh_add_char_dropdowns():
campaign_choices = self.dropdown_manager.get_campaign_dropdown_choices()
character_choices = self.dropdown_manager.get_character_dropdown_choices()
return (
gr.update(choices=campaign_choices, value=None),
gr.update(choices=character_choices, value=None)
)
add_char_refresh_btn.click(
fn=refresh_add_char_dropdowns,
inputs=[],
outputs=[add_char_campaign_dropdown, add_char_character_dropdown]
)
# Add character - convert dropdown labels to IDs
def add_char_from_dropdowns(campaign_label, character_label):
campaign_id = self.dropdown_manager.get_campaign_id_from_label(campaign_label)
character_id = self.dropdown_manager.get_character_id_from_label(character_label)
return self.add_character_to_campaign_ui(campaign_id, character_id)
add_char_btn.click(
fn=add_char_from_dropdowns,
inputs=[add_char_campaign_dropdown, add_char_character_dropdown],
outputs=[add_char_status]
)
gr.Markdown("""
**Tip:** Click "Refresh Lists" to load your campaigns and characters.
""")
# Return both dropdowns for auto-population
return add_char_campaign_dropdown, add_char_character_dropdown