#include "externals.hh" #include "ui-app.hh" #include "ui-imgui-sdl.hh" #include /*= T_UIApp =================================================================*/ namespace { #include "font-awesome.inl" static const ImWchar IconsRanges_[] = { ICON_MIN_FA , ICON_MAX_FA , 0 }; } // namespace T_UIApp::T_UIApp( ) { SDL_Init( SDL_INIT_VIDEO | SDL_INIT_TIMER ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER , 1 ); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE , 24 ); SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE , 8 ); SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION , 2 ); SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION , 2 ); SDL_DisplayMode current; SDL_GetCurrentDisplayMode( 0 , ¤t ); window = SDL_CreateWindow( "DEMO", SDL_WINDOWPOS_CENTERED , SDL_WINDOWPOS_CENTERED , 1280 , 720 , SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE ); gl = SDL_GL_CreateContext( window ); glewInit( ); if ( !GLEW_VERSION_4_5 ) { fprintf( stderr , "OpenGL 4.5 required\n" ); exit( 1 ); } ImGui_ImplSdl_Init( window ); using namespace ImGui; StyleColorsDark( ); ImGuiIO& io{ GetIO( ) }; io.IniFilename = nullptr; { ImFontConfig cfg; cfg.SizePixels = 13.0f; defaultFont_ = io.Fonts->AddFontDefault( &cfg ); ImFontConfig icons; icons.MergeMode = true; icons.PixelSnapH = true; io.Fonts->AddFontFromMemoryCompressedBase85TTF( FontAwesome__compressed_data_base85 , 13.f , &icons , IconsRanges_ ); } { ImFontConfig cfg; cfg.SizePixels = 9.0f; smallFont_ = io.Fonts->AddFontDefault( &cfg ); ImFontConfig icons; icons.MergeMode = true; icons.PixelSnapH = true; icons.DstFont = smallFont_; io.Fonts->AddFontFromMemoryCompressedBase85TTF( FontAwesome__compressed_data_base85 , 9.f , &icons , IconsRanges_ ); } } T_UIApp::~T_UIApp( ) { ImGui_ImplSdl_Shutdown( ); SDL_GL_DeleteContext( gl ); SDL_DestroyWindow( window ); SDL_Quit( ); } void T_UIApp::addAction( T_UIAction action ) noexcept { actions_.set( std::move( action ) ); } void T_UIApp::actionMenu( T_String const& id ) const noexcept { auto const* const a{ actions_.get( id ) }; if ( a ) { a->menuItem( ); } } void T_UIApp::actionButton( T_String const& id ) const noexcept { auto const* const a{ actions_.get( id ) }; if ( a ) { a->tbButton( ); } } void T_UIApp::startFrame( const bool capture , ImVec2 const& mouseInitial ) const { ImGui_ImplSdl_NewFrame( window , capture , mouseInitial ); } void T_UIApp::warpMouse( ImVec2 const& pos ) const { SDL_WarpMouseInWindow( window , pos.x , pos.y ); } void T_UIApp::swap( ) const { SDL_GL_SwapWindow( window ); } void T_UIApp::handleDialogs( ) noexcept { const auto nDialogs{ modals_.size( ) }; for ( auto i = 0u ; i < nDialogs ; i ++ ) { const bool keep{ modals_[ i ]->draw( ) }; assert( keep || i + 1 == nDialogs ); if ( !keep ) { modals_.removeLast( ); } } }