#pragma once #include "ui-dialogs.hh" #include "ui-mousectrl.hh" #include "ui-actions.hh" #include /*= WINDOW MANAGEMENT ========================================================*/ struct T_UIApp { T_UIApp( ); ~T_UIApp( ); //---------------------------------------------------------------------- void pushDialog( P_ModalDialog dialog ) noexcept { modals_.add( std::move( dialog ) ); } void msgbox( char const* title , char const* text , T_MessageBox::F_Handler handler = { } , T_MessageBox::T_Buttons buttons = T_MessageBox::BT_OK ) { pushDialog( NewOwned< T_MessageBox >( title , text , handler , buttons ) ); } void msgbox( T_String const& title , T_String const& text , T_MessageBox::F_Handler handler = { } , T_MessageBox::T_Buttons buttons = T_MessageBox::BT_OK ) { pushDialog( NewOwned< T_MessageBox >( title , text , handler , buttons ) ); } //---------------------------------------------------------------------- void addAction( T_UIAction action ) noexcept; void actionMenu( T_String const& id ) const noexcept; void actionButton( T_String const& id ) const noexcept; //---------------------------------------------------------------------- ImFont* defaultFont( ) const noexcept { return defaultFont_; } ImFont* smallFont( ) const noexcept { return smallFont_; } //---------------------------------------------------------------------- void handleEvents( ) noexcept; void setMouseDelegate( A_MouseCtrl* const delegate ) noexcept { mDelegate_ = delegate; } void clearMouseDelegate( ) noexcept { mDelegate_ = nullptr; } bool exiting( ) const noexcept { return exiting_; } //---------------------------------------------------------------------- void render( ) noexcept; void swap( ) const noexcept; private: // Window and GL context SDL_Window* window_; SDL_GLContext gl_; // Fonts ImFont* defaultFont_; ImFont* smallFont_; // Do we need to quit? bool exiting_{ false }; // Keyboard events / state T_KeyboardModifiers kbMods_; T_AutoArray< char , 32 > kbKeys_; // Mouse capture bool mCapture_{ false }; ImVec2 mInitial_{ 0 , 0 }; ImVec2 mMove_{ 0 , 0 }; A_MouseCtrl* mDelegate_; // Stack of modal dialogs T_AutoArray< P_ModalDialog , 8 > modals_; // Actions and keyboard shortcuts T_ObjectTable< T_String , T_UIAction > actions_{ []( T_UIAction const& a ) -> T_String { return a.id; } }; T_KeyValueTable< T_KeyboardShortcut , ebcl::T_Set< T_String > > shortcuts_; // Event handling void handleMouseCapture( ) noexcept; void handleKeyboardShortcuts( ) noexcept; // Modals void handleDialogs( ) noexcept; };