|  |  | @ -183,6 +183,16 @@ void PROPERTY_MANAGER::InheritsAfter( TYPE_ID aDerived, TYPE_ID aBase ) | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | void PROPERTY_MANAGER::Mask( TYPE_ID aDerived, TYPE_ID aBase, const wxString& aName ) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |     wxASSERT_MSG( aDerived != aBase, "Class cannot mask from itself" ); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     CLASS_DESC& derived = getClass( aDerived ); | 
			
		
	
		
			
				
					|  |  |  |     derived.m_maskedBaseProperties.insert( std::make_pair( aBase, aName ) ); | 
			
		
	
		
			
				
					|  |  |  |     m_dirty = true; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | bool PROPERTY_MANAGER::IsOfType( TYPE_ID aDerived, TYPE_ID aBase ) const | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |     if( aDerived == aBase ) | 
			
		
	
	
		
			
				
					|  |  | @ -226,7 +236,7 @@ void PROPERTY_MANAGER::CLASS_DESC::rebuild() | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |     PROPERTY_SET replaced( m_replaced ); | 
			
		
	
		
			
				
					|  |  |  |     m_allProperties.clear(); | 
			
		
	
		
			
				
					|  |  |  |     collectPropsRecur( m_allProperties, replaced, m_displayOrder ); | 
			
		
	
		
			
				
					|  |  |  |     collectPropsRecur( m_allProperties, replaced, m_displayOrder, m_maskedBaseProperties ); | 
			
		
	
		
			
				
					|  |  |  |     // We need to keep properties sorted to be able to use std::set_* functions
 | 
			
		
	
		
			
				
					|  |  |  |     sort( m_allProperties.begin(), m_allProperties.end() ); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -234,7 +244,8 @@ void PROPERTY_MANAGER::CLASS_DESC::rebuild() | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | void PROPERTY_MANAGER::CLASS_DESC::collectPropsRecur( PROPERTY_LIST& aResult, | 
			
		
	
		
			
				
					|  |  |  |                                                       PROPERTY_SET& aReplaced, | 
			
		
	
		
			
				
					|  |  |  |                                                       PROPERTY_DISPLAY_ORDER& aDisplayOrder ) const | 
			
		
	
		
			
				
					|  |  |  |                                                       PROPERTY_DISPLAY_ORDER& aDisplayOrder, | 
			
		
	
		
			
				
					|  |  |  |                                                       const PROPERTY_SET& aMasked ) const | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |     for( const std::pair<size_t, wxString>& replacedEntry : m_replaced ) | 
			
		
	
		
			
				
					|  |  |  |         aReplaced.emplace( replacedEntry ); | 
			
		
	
	
		
			
				
					|  |  | @ -250,17 +261,22 @@ void PROPERTY_MANAGER::CLASS_DESC::collectPropsRecur( PROPERTY_LIST& aResult, | 
			
		
	
		
			
				
					|  |  |  |     for( const std::pair<const wxString, std::unique_ptr<PROPERTY_BASE>>& prop : m_ownProperties ) | 
			
		
	
		
			
				
					|  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |         PROPERTY_BASE* property = prop.second.get(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         PROPERTY_SET::key_type propertyKey = std::make_pair( property->OwnerHash(), | 
			
		
	
		
			
				
					|  |  |  |                                                              property->Name() ); | 
			
		
	
		
			
				
					|  |  |  |         // Do not store replaced properties
 | 
			
		
	
		
			
				
					|  |  |  |         if( aReplaced.count( std::make_pair( property->OwnerHash(), property->Name() ) ) == 0 ) | 
			
		
	
		
			
				
					|  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |             aDisplayOrder[property] = displayOrderStart + idx++; | 
			
		
	
		
			
				
					|  |  |  |             aResult.push_back( property ); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         if( aReplaced.count( propertyKey ) ) | 
			
		
	
		
			
				
					|  |  |  |             continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // Do not store masked properties
 | 
			
		
	
		
			
				
					|  |  |  |         if( aMasked.count( propertyKey ) ) | 
			
		
	
		
			
				
					|  |  |  |             continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         aDisplayOrder[property] = displayOrderStart + idx++; | 
			
		
	
		
			
				
					|  |  |  |         aResult.push_back( property ); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     for( const std::reference_wrapper<CLASS_DESC>& base : m_bases ) | 
			
		
	
		
			
				
					|  |  |  |         base.get().collectPropsRecur( aResult, aReplaced, aDisplayOrder ); | 
			
		
	
		
			
				
					|  |  |  |         base.get().collectPropsRecur( aResult, aReplaced, aDisplayOrder, aMasked ); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 |