Spaces:
Sleeping
Sleeping
File size: 4,332 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 108 109 110 111 112 113 |
"""
Character Manage 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 CharacterManageTab:
"""Manage Characters tab for deleting and viewing characters"""
def __init__(self, character_agent: CharacterAgent, dropdown_manager: DropdownManager):
self.character_agent = character_agent
self.dropdown_manager = dropdown_manager
def delete_character_ui(self, character_id: str) -> str:
"""Delete character by ID"""
try:
if not character_id.strip():
return "β Error: Please provide a character ID"
# Check if exists
character = self.character_agent.load_character(character_id)
if not character:
return f"β Character not found: {character_id}"
# Delete
self.character_agent.delete_character(character_id)
return f"β
Deleted character: {character.name} ({character_id})"
except Exception as e:
return f"β Error deleting 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 Manage Characters tab component"""
with gr.Tab("Manage Characters"):
gr.Markdown("### Character Management")
delete_refresh_btn = gr.Button("π Refresh Character List", variant="secondary")
delete_character_dropdown = gr.Dropdown(
choices=[],
label="Select Character to Delete",
info="β οΈ Warning: This action cannot be undone! (type to search)",
allow_custom_value=False,
interactive=True
)
delete_btn = gr.Button("ποΈ Delete Character", variant="stop")
delete_status_output = gr.Textbox(label="Status", lines=3)
# Refresh delete character dropdown
delete_refresh_btn.click(
fn=self.dropdown_manager.refresh_character_dropdown,
inputs=[],
outputs=[delete_character_dropdown]
)
# Delete character action - convert dropdown label to ID and refresh list
def delete_character_from_dropdown(label):
char_id = self.dropdown_manager.get_character_id_from_label(label)
status = self.delete_character_ui(char_id)
# Refresh dropdown choices after deletion
updated_choices = self.dropdown_manager.refresh_character_dropdown()
return status, updated_choices
delete_btn.click(
fn=delete_character_from_dropdown,
inputs=[delete_character_dropdown],
outputs=[delete_status_output, delete_character_dropdown]
)
gr.Markdown("---")
with gr.Accordion("Quick Actions", open=False):
quick_list_btn = gr.Button("π List All Characters")
quick_list_output = gr.Markdown(label="Character List")
quick_status = gr.Textbox(label="Status", lines=2)
quick_list_btn.click(
fn=self.list_characters_ui,
inputs=[],
outputs=[quick_list_output, quick_status]
)
# Return the dropdown for auto-population
return delete_character_dropdown
|