Sequencer - Overrides selector

This commit is contained in:
Emmanuel BENOîT 2017-11-22 07:38:27 +01:00
parent 6f2faed149
commit f9a0b94055
3 changed files with 106 additions and 10 deletions

19
sync.cc
View file

@ -381,13 +381,19 @@ void A_SyncOverride::setup( ) noexcept
assert( ni != 0 ); assert( ni != 0 );
assert( inputPos_.size( ) == 0 ); assert( inputPos_.size( ) == 0 );
T_StringBuilder sb;
inputPos_.ensureCapacity( ni ); inputPos_.ensureCapacity( ni );
for ( auto i = 0u ; i < ni ; i ++ ) { for ( auto i = 0u ; i < ni ; i ++ ) {
// FIXME: insufficient; the manager should be made aware of // FIXME: insufficient; the manager should be made aware of
// the presence of an override for that value (and it should // the presence of an override for that value (and it should
// fail for missing values). // fail for missing values).
inputPos_.add( Globals::Sync( ).inputPos( inputs_[ i ] ) ); inputPos_.add( Globals::Sync( ).inputPos( inputs_[ i ] ) );
if ( sb.size( ) ) {
sb << ';';
} }
sb << inputs_[ i ];
}
id_ = std::move( sb );
} }
char const* A_SyncOverride::buildLabel( char const* A_SyncOverride::buildLabel(
@ -676,6 +682,7 @@ void T_SyncManager::clearOverrides( ) noexcept
mouseDelegate_ = nullptr; mouseDelegate_ = nullptr;
soRoot_.subsections.clear( ); soRoot_.subsections.clear( );
soRoot_.overrides.clear( ); soRoot_.overrides.clear( );
soTable_.clear( );
} }
void T_SyncManager::mergeOverrides( void T_SyncManager::mergeOverrides(
@ -684,14 +691,14 @@ void T_SyncManager::mergeOverrides(
assert( overrides.overrides.empty( ) ); assert( overrides.overrides.empty( ) );
soRoot_.merge( overrides ); soRoot_.merge( overrides );
T_SyncOverrideVisitor v; soVisitor_.visitor.visit( &soRoot_ ,
v.visitor.visit( &soRoot_ , [this]( T_SyncOverrideVisitor::T_Element node , bool exit ) -> bool {
[]( T_SyncOverrideVisitor::T_Element node , bool exit ) -> bool {
if ( exit || node.hasType< T_SyncOverrideSection* >( ) ) { if ( exit || node.hasType< T_SyncOverrideSection* >( ) ) {
return true; return true;
} }
auto& ovr( *node.value< A_SyncOverride* >( ) ); auto& ovr( *node.value< A_SyncOverride* >( ) );
ovr.setup( ); ovr.setup( );
soTable_.add( ovr.id( ) , &ovr );
return false; return false;
} }
); );
@ -717,6 +724,12 @@ void T_SyncManager::setOverridesActive(
} }
} }
void T_SyncManager::visitOverrides(
T_SyncOverrideVisitor::F_NodeAction visitor )
{
soVisitor_.visitor.visit( &soRoot_ , visitor );
}
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
void T_SyncManager::makeOverridesWindow( ) void T_SyncManager::makeOverridesWindow( )

20
sync.hh
View file

@ -173,6 +173,7 @@ class A_SyncOverride
const T_String type_; const T_String type_;
bool enabled_{ false }; bool enabled_{ false };
ebcl::T_SRDLocation location_; ebcl::T_SRDLocation location_;
T_String id_;
protected: protected:
ebcl::T_Buffer< char > title_; ebcl::T_Buffer< char > title_;
@ -208,6 +209,11 @@ class A_SyncOverride
bool enabled( ) const noexcept bool enabled( ) const noexcept
{ return enabled_; } { return enabled_; }
T_String const& id( ) const noexcept
{ return id_; }
char const* title( ) const noexcept
{ return &title_[ 0 ]; }
ebcl::T_SRDLocation& location( ) noexcept ebcl::T_SRDLocation& location( ) noexcept
{ return location_; } { return location_; }
ebcl::T_SRDLocation const& location( ) const noexcept ebcl::T_SRDLocation const& location( ) const noexcept
@ -265,10 +271,12 @@ struct T_SyncOverrideVisitor
T_SyncOverrideSection* , T_SyncOverrideSection* ,
A_SyncOverride* >; A_SyncOverride* >;
using T_OpElement = T_Optional< T_Element >; using T_OpElement = T_Optional< T_Element >;
using T_Visitor = ebcl::T_Visitor< T_Element , T_Element >;
using F_NodeAction = T_Visitor::F_NodeAction;
static T_OpElement nodeBrowser( T_Element element , uint32_t child ); static T_OpElement nodeBrowser( T_Element element , uint32_t child );
ebcl::T_Visitor< T_Element , T_Element > visitor{ nodeBrowser }; T_Visitor visitor{ nodeBrowser };
}; };
/*============================================================================*/ /*============================================================================*/
@ -352,6 +360,9 @@ struct T_SyncManager : public virtual A_MouseCtrl
uint32_t n , uint32_t n ,
uint32_t const* pos ); uint32_t const* pos );
// Visit the overrides tree
void visitOverrides( T_SyncOverrideVisitor::F_NodeAction visitor );
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Update // Update
@ -389,14 +400,21 @@ struct T_SyncManager : public virtual A_MouseCtrl
private: private:
ebcl::T_SRDParserConfig pConfig_; // Parser config for curves ebcl::T_SRDParserConfig pConfig_; // Parser config for curves
P_WatchedFiles watcher_; // Curves file watcher P_WatchedFiles watcher_; // Curves file watcher
T_SyncTime time_; // Duration/time information T_SyncTime time_; // Duration/time information
bool playing_{ false }; // Is it playing? bool playing_{ false }; // Is it playing?
bool playingPrevious_{ false }; // Was it playing before? bool playingPrevious_{ false }; // Was it playing before?
float lastFrame_{ 0 }; // Time of last frame float lastFrame_{ 0 }; // Time of last frame
T_SyncValues values_; // Value storage T_SyncValues values_; // Value storage
T_SyncCurves curves_; // Curves storage T_SyncCurves curves_; // Curves storage
T_Array< P_SyncCurveCache > curveCaches_; // Cache for curve segments T_Array< P_SyncCurveCache > curveCaches_; // Cache for curve segments
bool ovWindow_{ false }; // Overrides window bool ovWindow_{ false }; // Overrides window
T_SyncOverrideSection soRoot_; // Root for overrides T_SyncOverrideSection soRoot_; // Root for overrides
T_SyncOverrideVisitor soVisitor_;
T_KeyValueTable< T_String , A_SyncOverride* > soTable_;
// Table of sync overrides, by ID
A_MouseCtrl* mouseDelegate_{ nullptr }; // Delegate for mouse actions A_MouseCtrl* mouseDelegate_{ nullptr }; // Delegate for mouse actions
}; };

View file

@ -60,6 +60,7 @@ struct T_SyncViewImpl_
void displayCurveSelectorWindow( ) noexcept; void displayCurveSelectorWindow( ) noexcept;
void displayCurveSelector( ) noexcept; void displayCurveSelector( ) noexcept;
void displayOverrideSelector( ) noexcept;
// Misc stuff // Misc stuff
T_StringBuilder stringBuffer; // XXX damn this shit to fucking hell T_StringBuilder stringBuffer; // XXX damn this shit to fucking hell
@ -86,7 +87,8 @@ struct T_SyncViewImpl_
SW_OVERRIDE_SELECTOR , SW_OVERRIDE_SELECTOR ,
}; };
E_SubWindow sub{ SW_NONE }; E_SubWindow sub{ SW_NONE };
T_KeyValueTable< T_String , bool > curves; T_KeyValueTable< T_String , bool > sCurves;
T_Set< T_String > sOverrides;
T_String curveFinder; T_String curveFinder;
}; };
@ -463,6 +465,7 @@ void T_SyncViewImpl_::displayCurveSelectorWindow( ) noexcept
displayCurveSelector( ); displayCurveSelector( );
break; break;
case SW_OVERRIDE_SELECTOR: case SW_OVERRIDE_SELECTOR:
displayOverrideSelector( );
break; break;
default: default:
fprintf( stderr , "unexpected bullshit in sync view\n" ); fprintf( stderr , "unexpected bullshit in sync view\n" );
@ -505,8 +508,8 @@ void T_SyncViewImpl_::displayCurveSelector( ) noexcept
// The list // The list
ImGui::BeginChild( "content" ); ImGui::BeginChild( "content" );
for ( auto const& n : names ) { for ( auto const& n : names ) {
const bool present{ curves.contains( n ) }; const bool present{ sCurves.contains( n ) };
const bool overriden{ present && *curves.get( n ) }; const bool overriden{ present && *sCurves.get( n ) };
if ( overriden ) { if ( overriden ) {
PushItemFlag( ImGuiItemFlags_Disabled , true ); PushItemFlag( ImGuiItemFlags_Disabled , true );
@ -518,9 +521,9 @@ void T_SyncViewImpl_::displayCurveSelector( ) noexcept
stringBuffer.clear( ) << n << '\0'; stringBuffer.clear( ) << n << '\0';
if ( Checkbox( stringBuffer.data( ) , &select ) ) { if ( Checkbox( stringBuffer.data( ) , &select ) ) {
if ( select ) { if ( select ) {
curves.add( n , false ); sCurves.add( n , false );
} else { } else {
curves.remove( n ); sCurves.remove( n );
} }
} }
@ -529,7 +532,69 @@ void T_SyncViewImpl_::displayCurveSelector( ) noexcept
PopStyleVar( ); PopStyleVar( );
} }
} }
ImGui::EndChild( ); EndChild( );
}
void T_SyncViewImpl_::displayOverrideSelector( ) noexcept
{
using namespace ImGui;
BeginChild( "content" );
Globals::Sync( ).visitOverrides( [&]( T_SyncOverrideVisitor::T_Element element , const bool exit ) {
if ( element.hasType< T_SyncOverrideSection* >( ) ) {
auto const& sos{ *element.value< T_SyncOverrideSection* >( ) };
if ( sos.title == "*root*" ) {
return true;
}
if ( exit ) {
TreePop( );
} else {
return TreeNodeEx( &sos.cTitle[ 0 ] ,
ImGuiTreeNodeFlags_DefaultOpen );
}
} else if ( exit ) {
auto const& ov{ *element.value< A_SyncOverride* >( ) };
auto const& id{ ov.id( ) };
auto const& in{ ov.inputNames( ) };
const bool present{ sOverrides.contains( id ) };
const bool hasCurves{ !present && [&](){
for ( auto i = 0u ; i < in.size( ) ; i ++ ) {
if ( sCurves.contains( in[ i ] ) ) {
return true;
}
}
return false;
}() };
if ( hasCurves ) {
PushItemFlag( ImGuiItemFlags_Disabled , true );
PushStyleVar( ImGuiStyleVar_Alpha ,
GetStyle( ).Alpha * .5f );
}
bool select{ present };
if ( Checkbox( ov.title( ) , &select ) ) {
if ( select ) {
sOverrides.add( id );
for ( auto i = 0u ; i < in.size( ) ; i ++ ) {
sCurves.add( in[ i ] , true );
}
} else {
sOverrides.remove( id );
for ( auto i = 0u ; i < in.size( ) ; i ++ ) {
sCurves.remove( in[ i ] );
}
}
}
if ( hasCurves ) {
PopItemFlag( );
PopStyleVar( );
}
}
return true;
} );
EndChild( );
} }