Added functions for refreshing the layer set occupied by a VIEW_ITEM.

This commit is contained in:
Maciej Suminski 2013-09-24 15:48:04 +02:00
parent 96d162c907
commit 1de8eba49e
4 changed files with 39 additions and 7 deletions

View File

@ -633,7 +633,7 @@ void VIEW::draw( VIEW_ITEM* aItem, bool aImmediate ) const
{
int layers[VIEW_MAX_LAYERS], layers_count;
aItem->getLayers( layers, layers_count );
aItem->ViewGetLayers( layers, layers_count );
// Sorting is needed for drawing order dependent GALs (like Cairo)
SortLayers( layers, layers_count );
@ -813,19 +813,23 @@ void VIEW::clearGroupCache()
void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags )
{
int layers[VIEW_MAX_LAYERS], layers_count;
aItem->getLayers( layers, layers_count );
if( aUpdateFlags & VIEW_ITEM::GEOMETRY )
// updateLayers updates geometry too, so we do not have to update both of them at the same time
if( aUpdateFlags & VIEW_ITEM::LAYERS )
updateLayers( aItem );
else if( aUpdateFlags & VIEW_ITEM::GEOMETRY )
updateBbox( aItem );
int layers[VIEW_MAX_LAYERS], layers_count;
aItem->ViewGetLayers( layers, layers_count );
// Iterate through layers used by the item and recache it immediately
for( int i = 0; i < layers_count; i++ )
{
int layerId = layers[i];
if( aUpdateFlags & VIEW_ITEM::GEOMETRY )
if( aUpdateFlags & ( VIEW_ITEM::GEOMETRY | VIEW_ITEM::LAYERS ) )
{
// Redraw
if( IsCached( layerId ) )
updateItemGeometry( aItem, layerId );
}
@ -900,6 +904,31 @@ void VIEW::updateBbox( VIEW_ITEM* aItem )
}
void VIEW::updateLayers( VIEW_ITEM* aItem )
{
int layers[VIEW_MAX_LAYERS], layers_count;
// Remove the item from previous layer set
aItem->getLayers( layers, layers_count );
for( int i = 0; i < layers_count; i++ )
{
VIEW_LAYER& l = m_layers[layers[i]];
l.items->Remove( aItem );
MarkTargetDirty( l.target );
}
// Add the item to new layer set
aItem->ViewGetLayers( layers, layers_count );
aItem->saveLayers( layers, layers_count );
for( int i = 0; i < layers_count; i++ )
{
VIEW_LAYER& l = m_layers[layers[i]];
l.items->Insert( aItem );
MarkTargetDirty( l.target );
}
}
bool VIEW::areRequiredLayersEnabled( int aLayerId ) const
{
wxASSERT( (unsigned) aLayerId < m_layers.size() );

View File

@ -73,7 +73,6 @@ void VIEW_ITEM::getLayers( int* aLayers, int& aCount ) const
{
if( m_layers[i] )
*layersPtr++ = i;
}
aCount = m_layers.count();

View File

@ -569,6 +569,9 @@ private:
/// Updates bounding box of an item
void updateBbox( VIEW_ITEM* aItem );
/// Updates set of layers that an item occupies
void updateLayers( VIEW_ITEM* aItem );
/// Determines rendering order of layers. Used in display order sorting function.
static bool compareRenderingOrder( VIEW_LAYER* i, VIEW_LAYER* j )
{

View File

@ -165,6 +165,7 @@ public:
APPEARANCE = 0x01, /// Visibility flag has changed
COLOR = 0x02, /// Color has changed
GEOMETRY = 0x04, /// Position or shape has changed
LAYERS = 0x08, /// Layers have changed
ALL = 0xff
};