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