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