#include "externals.hh" #include "globals.hh" #include "ui.hh" #include "ui-actions.hh" #include "ui-overrides.hh" #include "ui-sync.hh" #include "ui-utilities.hh" #include "window.hh" /*= T_UISync =================================================================*/ T_UISync::T_UISync( ) { UI::Window( ).newAction( "Save curves" , []() { if ( Globals::Sync( ).curvesFileChanged( ) ) { UI::Window( ).msgbox( "Curves file changed" , "The file containing the curves has been modified " "on the disk. These changes will be overwritten. " "Do you want to continue?" , []( auto b ) { if ( b == T_MessageBox::BT_YES ) { Globals::Sync( ).saveCurves( ); } } , { T_MessageBox::BT_YES , T_MessageBox::BT_NO } ); } else { Globals::Sync( ).saveCurves( ); } } ).setEnabledCheck( []() { return Globals::Sync( ).curvesModified( ); } ).setIcon( ICON_FA_FLOPPY_O ) .setShortcut( T_KeyboardShortcut{ 's' , E_KeyboardModifier::CTRL } ); //----------------------------------------------------------------------------- UI::Window( ).newAction( "Reload curves" , []() { UI::Window( ).msgbox( "Reload curves?" , "Changes you made to the curves will be lost. Do you " "want to continue?" , []( auto b ) { if ( b == T_MessageBox::BT_YES ) { Globals::Sync( ).loadCurves( ); } } , { T_MessageBox::BT_YES , T_MessageBox::BT_NO } ); } ).setEnabledCheck( []() { return Globals::Sync( ).curvesModified( ); } ).setIcon( ICON_FA_DOWNLOAD ) .setShortcut( T_KeyboardShortcut{ 'r' , { E_KeyboardModifier::CTRL , E_KeyboardModifier::SHIFT } } ); //----------------------------------------------------------------------------- const auto addui{ [this]( char const* type , F_Override ov ) { const bool ok{ sovuis_.add( T_String{ type } , std::move( ov ) ) }; assert( ok ); (void)ok; } }; addui( "float" , sov::UIFloat ); addui( "float2" , sov::UIFloat2 ); addui( "float3" , sov::UIFloat3 ); addui( "float4" , sov::UIFloat4 ); addui( "int" , sov::UIInteger ); addui( "int2" , sov::UIInteger2 ); addui( "int3" , sov::UIInteger3 ); addui( "int4" , sov::UIInteger4 ); addui( "cg" , sov::UIColorGrading ); addui( "cam" , sov::UICamera ); } /*----------------------------------------------------------------------------*/ namespace { bool HandleOverrideSection_( T_SyncOverrideSection& sos , bool exit , T_AutoArray< bool , 32 >& stack ) { if ( exit ) { assert( !stack.empty( ) ); if ( stack.last( ) && stack.size( ) > 1 ) { ImGui::TreePop( ); } stack.removeLast( ); return true; } const bool display( stack.empty( ) ? ImGui::CollapsingHeader( &sos.cTitle[ 0 ] ) : ImGui::TreeNode( &sos.cTitle[ 0 ] ) ); stack.add( display ); return display; } void HandleOverride_( A_SyncOverride& ov , uint32_t& counter , T_StringBuilder& sb ) noexcept { using namespace ImGui; bool& enabled{ ov.enabled( ) }; if ( Checkbox( &ov.title( )[ 0 ] , &enabled ) ) { auto const& ipos( ov.inputPositions( ) ); Globals::Sync( ).setOverridesActive( ov.enabled( ) , ipos.size( ) , &ipos[ 0 ] ); } if ( !enabled ) { PushDisabled( ); } Indent( ); PushItemWidth( -1 ); (UI::Sync( ).uiFor( ov ))( ov , counter , sb ); PopItemWidth( ); Unindent( ); if ( !enabled ) { PopDisabled( ); } } } // namespace T_UISync::F_Override T_UISync::uiFor( A_SyncOverride& target ) const noexcept { auto const* const rv{ sovuis_.get( target.type( ) ) }; return rv ? *rv : []( A_SyncOverride& , uint32_t& , T_StringBuilder& ) { ImGui::Text( "(missing UI)" ); }; } void T_UISync::makeOverridesWindow( ) { if ( !ovWindow_ ) { return; } using namespace ImGui; auto const& dspSize( GetIO( ).DisplaySize ); SetNextWindowSize( ImVec2( dspSize.x * .25f , dspSize.y * .66f - 20 ) , ImGuiSetCond_Appearing ); SetNextWindowPos( ImVec2( 0 , 20 ) , ImGuiSetCond_Appearing ); Begin( "Input overrides" , &ovWindow_ , ImGuiWindowFlags_NoCollapse ); T_StringBuilder temp; uint32_t counter{ 0 }; T_AutoArray< bool , 32 > stack; bool found{ false }; using T_Ove_ = T_SyncOverrideVisitor::T_Element; Globals::Sync( ).visitOverrides( [&]( T_Ove_ element , bool exit ) { // Display sections if ( element.hasType< T_SyncOverrideSection* >( ) ) { auto& sos( *element.value< T_SyncOverrideSection* >( ) ); if ( sos.title == "*root*" ) { return true; } return HandleOverrideSection_( sos , exit , stack ); } if ( exit ) { HandleOverride_( *element.value< A_SyncOverride* >( ) , counter , temp ); found = true; } return true; } ); if ( !found ) { Text( "No overrides have been defined." ); } End( ); } /*----------------------------------------------------------------------------*/ void T_UISync::handleDragAndDrop( ImVec2 const& move , T_KeyboardModifiers modifiers , T_MouseButtons buttons ) noexcept { if ( mouseDelegate_ ) { mouseDelegate_->handleDragAndDrop( move , modifiers , buttons ); } } void T_UISync::handleWheel( const float wheel , T_KeyboardModifiers modifiers , T_MouseButtons buttons ) noexcept { if ( mouseDelegate_ ) { mouseDelegate_->handleWheel( wheel , modifiers , buttons ); } }