Spaces:
Sleeping
Sleeping
| """ | |
| 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 | |