File size: 3,986 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
"""
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