Spaces:
Sleeping
Sleeping
File size: 4,157 Bytes
71b378e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
"""
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
|