""" Character Load Tab for D'n'D Campaign Manager """ import gradio as gr from typing import Tuple from src.agents.character_agent import CharacterAgent from src.ui.components.dropdown_manager import DropdownManager class CharacterLoadTab: """Load Character tab for viewing saved characters""" def __init__(self, character_agent: CharacterAgent, dropdown_manager: DropdownManager): self.character_agent = character_agent self.dropdown_manager = dropdown_manager def load_character_ui(self, character_id: str) -> Tuple[str, str]: """Load character by ID""" try: if not character_id.strip(): return "", "❌ Error: Please provide a character ID" character = self.character_agent.load_character(character_id) if character: markdown = character.to_markdown() status = f"✅ Loaded character: {character.name}" return markdown, status else: return "", f"❌ Character not found: {character_id}" except Exception as e: return "", f"❌ Error loading character: {e}" def list_characters_ui(self) -> Tuple[str, str]: """List all saved characters""" try: characters = self.character_agent.list_characters() if not characters: return "", "No characters found in database." # Create table markdown = "# Saved Characters\n\n" markdown += "| Name | Race | Class | Level | ID |\n" markdown += "|------|------|-------|-------|----|\n" for char in characters[-20:]: # Last 20 characters markdown += f"| {char.name} | {char.race.value} | {char.character_class.value} | {char.level} | `{char.id}` |\n" status = f"✅ Found {len(characters)} character(s)" return markdown, status except Exception as e: return "", f"❌ Error listing characters: {e}" def create(self) -> gr.Dropdown: """Create and return the Load Character tab component""" with gr.Tab("Load Character"): gr.Markdown("### Load Saved Character") load_char_refresh_btn = gr.Button("🔄 Refresh Character List", variant="secondary") character_dropdown = gr.Dropdown( choices=[], label="Select Character", info="Choose a character from the list (type to search)", allow_custom_value=False, interactive=True ) with gr.Row(): load_btn = gr.Button("📂 Load Character", variant="primary") list_btn = gr.Button("📋 List All Characters") gr.Markdown("---") with gr.Row(): loaded_character_output = gr.Markdown(label="Character Sheet") load_status_output = gr.Textbox(label="Status", lines=6) # Refresh character dropdown load_char_refresh_btn.click( fn=self.dropdown_manager.refresh_character_dropdown, inputs=[], outputs=[character_dropdown] ) # Load character action - convert dropdown label to ID def load_character_from_dropdown(label): char_id = self.dropdown_manager.get_character_id_from_label(label) return self.load_character_ui(char_id) load_btn.click( fn=load_character_from_dropdown, inputs=[character_dropdown], outputs=[loaded_character_output, load_status_output] ) # List characters action list_btn.click( fn=self.list_characters_ui, inputs=[], outputs=[loaded_character_output, load_status_output] ) # Return the dropdown for auto-population return character_dropdown