File size: 4,157 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
"""
Campaign Add Characters Tab for D'n'D Campaign Manager
"""

import gradio as gr
from src.agents.character_agent import CharacterAgent
from src.agents.campaign_agent import CampaignAgent
from src.ui.components.dropdown_manager import DropdownManager


class CampaignAddCharsTab:
    """Add Characters to Campaign tab"""

    def __init__(
        self,
        character_agent: CharacterAgent,
        campaign_agent: CampaignAgent,
        dropdown_manager: DropdownManager
    ):
        self.character_agent = character_agent
        self.campaign_agent = campaign_agent
        self.dropdown_manager = dropdown_manager

    def add_character_to_campaign_ui(self, campaign_id: str, character_id: str) -> str:
        """Add a character to a campaign"""
        try:
            if not campaign_id.strip() or not character_id.strip():
                return "❌ Error: Please provide both campaign ID and character ID"

            # Verify character exists
            character = self.character_agent.load_character(character_id)
            if not character:
                return f"❌ Character not found: {character_id}"

            # Add to campaign
            success = self.campaign_agent.add_character_to_campaign(campaign_id, character_id)

            if success:
                return f"βœ… Added {character.name} to campaign!"
            else:
                return f"❌ Campaign not found: {campaign_id}"

        except Exception as e:
            return f"❌ Error: {str(e)}"

    def create(self) -> tuple:
        """Create and return the Add Characters to Campaign tab component"""
        with gr.Tab("Add Characters"):
            gr.Markdown("### Add Characters to Campaign")

            add_char_refresh_btn = gr.Button("πŸ”„ Refresh Lists", variant="secondary")

            with gr.Row():
                add_char_campaign_dropdown = gr.Dropdown(
                    choices=[],
                    label="Select Campaign",
                    info="Choose the campaign to add characters to (type to search)",
                    allow_custom_value=False,
                    interactive=True
                )

                add_char_character_dropdown = gr.Dropdown(
                    choices=[],
                    label="Select Character",
                    info="Choose the character to add (type to search)",
                    allow_custom_value=False,
                    interactive=True
                )

            add_char_btn = gr.Button("βž• Add Character to Campaign", variant="primary")

            add_char_status = gr.Textbox(label="Status", lines=4)

            # Refresh both dropdowns
            def refresh_add_char_dropdowns():
                campaign_choices = self.dropdown_manager.get_campaign_dropdown_choices()
                character_choices = self.dropdown_manager.get_character_dropdown_choices()
                return (
                    gr.update(choices=campaign_choices, value=None),
                    gr.update(choices=character_choices, value=None)
                )

            add_char_refresh_btn.click(
                fn=refresh_add_char_dropdowns,
                inputs=[],
                outputs=[add_char_campaign_dropdown, add_char_character_dropdown]
            )

            # Add character - convert dropdown labels to IDs
            def add_char_from_dropdowns(campaign_label, character_label):
                campaign_id = self.dropdown_manager.get_campaign_id_from_label(campaign_label)
                character_id = self.dropdown_manager.get_character_id_from_label(character_label)
                return self.add_character_to_campaign_ui(campaign_id, character_id)

            add_char_btn.click(
                fn=add_char_from_dropdowns,
                inputs=[add_char_campaign_dropdown, add_char_character_dropdown],
                outputs=[add_char_status]
            )

            gr.Markdown("""
            **Tip:** Click "Refresh Lists" to load your campaigns and characters.
            """)

        # Return both dropdowns for auto-population
        return add_char_campaign_dropdown, add_char_character_dropdown