File size: 7,256 Bytes
71b378e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ddf162a
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
"""
Main Application Orchestrator for D'n'D Campaign Manager
Assembles all modular tabs into the complete Gradio interface
"""

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
from src.ui.tabs import (
    AboutTab,
    CharacterCreateTab,
    CharacterLoadTab,
    CharacterManageTab,
    CharacterPortraitTab,
    CharacterExportTab,
    CampaignCreateTab,
    CampaignManageTab,
    CampaignAddCharsTab,
    CampaignSynthesizeTab,
    SessionTrackingTab,
)


class DnDCampaignManagerApp:
    """Main application class that orchestrates all UI components"""

    def __init__(self):
        # Initialize agents
        self.character_agent = CharacterAgent()
        self.campaign_agent = CampaignAgent()

        # Initialize dropdown manager
        self.dropdown_manager = DropdownManager(
            character_agent=self.character_agent,
            campaign_agent=self.campaign_agent
        )

        # Initialize tabs
        self.about_tab = AboutTab()
        self.character_create_tab = CharacterCreateTab(
            character_agent=self.character_agent
        )
        self.character_load_tab = CharacterLoadTab(
            character_agent=self.character_agent,
            dropdown_manager=self.dropdown_manager
        )
        self.character_manage_tab = CharacterManageTab(
            character_agent=self.character_agent,
            dropdown_manager=self.dropdown_manager
        )
        self.character_portrait_tab = CharacterPortraitTab(
            character_agent=self.character_agent,
            dropdown_manager=self.dropdown_manager
        )
        self.character_export_tab = CharacterExportTab(
            character_agent=self.character_agent,
            dropdown_manager=self.dropdown_manager
        )
        self.campaign_create_tab = CampaignCreateTab(
            campaign_agent=self.campaign_agent
        )
        self.campaign_manage_tab = CampaignManageTab(
            campaign_agent=self.campaign_agent,
            dropdown_manager=self.dropdown_manager
        )
        self.campaign_add_chars_tab = CampaignAddCharsTab(
            character_agent=self.character_agent,
            campaign_agent=self.campaign_agent,
            dropdown_manager=self.dropdown_manager
        )
        self.campaign_synthesize_tab = CampaignSynthesizeTab(
            character_agent=self.character_agent,
            campaign_agent=self.campaign_agent,
            dropdown_manager=self.dropdown_manager
        )
        self.session_tracking_tab = SessionTrackingTab(
            campaign_agent=self.campaign_agent,
            dropdown_manager=self.dropdown_manager
        )

    def create_interface(self) -> gr.Blocks:
        """Create and assemble the complete Gradio interface"""
        with gr.Blocks(title="D'n'D Campaign Manager - Character Creator") as interface:
            gr.Markdown("""
            # 🎲 D'n'D Campaign Manager
            ## Complete D&D Character Creator

            Create and manage complete D&D 5e characters for your campaigns!
            """)

            with gr.Tabs():
                # Character tabs
                self.character_create_tab.create()

                character_dropdown = self.character_load_tab.create()
                delete_character_dropdown = self.character_manage_tab.create()
                portrait_character_dropdown = self.character_portrait_tab.create()
                export_character_dropdown = self.character_export_tab.create()

                # Campaign Management tab with sub-tabs
                with gr.Tab("Campaign Management"):
                    gr.Markdown("""
                    ### 🎲 Campaign Management
                    Create and manage your D&D campaigns, track sessions, and record events!
                    """)

                    with gr.Tabs():
                        self.campaign_synthesize_tab.create()
                        self.campaign_create_tab.create()
                        manage_campaign_dropdown = self.campaign_manage_tab.create()
                        add_char_campaign_dropdown, add_char_character_dropdown = self.campaign_add_chars_tab.create()
                        session_campaign_dropdown, auto_session_campaign_dropdown, notes_campaign_dropdown, event_campaign_dropdown = self.session_tracking_tab.create()

                # About tab
                self.about_tab.create()

            gr.Markdown("""
            ---
            ### Tips
            - Enable "Use AI" options for more creative and detailed characters
            - Use Standard Array for balanced characters
            - Use Roll for random variation
            - Save your character ID to load it later
            - Check the character list to find previously created characters
            """)

            # Auto-populate dropdowns on interface load
            def populate_all_dropdowns():
                """Populate all dropdowns when interface loads"""
                campaign_choices = self.dropdown_manager.get_campaign_dropdown_choices()
                character_choices = self.dropdown_manager.get_character_dropdown_choices()

                return [
                    gr.update(choices=character_choices),  # character_dropdown
                    gr.update(choices=character_choices),  # delete_character_dropdown
                    gr.update(choices=character_choices),  # portrait_character_dropdown
                    gr.update(choices=character_choices),  # export_character_dropdown
                    gr.update(choices=campaign_choices),   # manage_campaign_dropdown
                    gr.update(choices=campaign_choices),   # add_char_campaign_dropdown
                    gr.update(choices=character_choices),  # add_char_character_dropdown
                    gr.update(choices=campaign_choices),   # session_campaign_dropdown
                    gr.update(choices=campaign_choices),   # auto_session_campaign_dropdown
                    gr.update(choices=campaign_choices),   # notes_campaign_dropdown
                    gr.update(choices=campaign_choices),   # event_campaign_dropdown
                ]

            interface.load(
                fn=populate_all_dropdowns,
                inputs=[],
                outputs=[
                    character_dropdown,
                    delete_character_dropdown,
                    portrait_character_dropdown,
                    export_character_dropdown,
                    manage_campaign_dropdown,
                    add_char_campaign_dropdown,
                    add_char_character_dropdown,
                    session_campaign_dropdown,
                    auto_session_campaign_dropdown,
                    notes_campaign_dropdown,
                    event_campaign_dropdown,
                ]
            )

        return interface


def launch_ui():
    """Launch the Gradio interface"""
    app = DnDCampaignManagerApp()
    interface = app.create_interface()

    interface.launch(
        server_name="0.0.0.0",
        server_port=7860,
        share=False,
        show_error=True
    )


if __name__ == "__main__":
    launch_ui()