""" 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()