Performance enhancements for cross-probing.
While found when profiling cross-probing, many of these will also improve other things.
This commit is contained in:
parent
25dee38f70
commit
4bf2b6a9f7
|
@ -92,7 +92,9 @@ EDA_TEXT::EDA_TEXT( const wxString& text ) :
|
||||||
{
|
{
|
||||||
int sz = Mils2iu( DEFAULT_SIZE_TEXT );
|
int sz = Mils2iu( DEFAULT_SIZE_TEXT );
|
||||||
SetTextSize( wxSize( sz, sz ) );
|
SetTextSize( wxSize( sz, sz ) );
|
||||||
m_shown_text = UnescapeString( text );
|
|
||||||
|
if( !text.IsEmpty() )
|
||||||
|
m_shown_text = UnescapeString( text );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -116,6 +118,13 @@ void EDA_TEXT::SetText( const wxString& aText )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EDA_TEXT::CopyText( const EDA_TEXT& aSrc )
|
||||||
|
{
|
||||||
|
m_text = aSrc.m_text;
|
||||||
|
m_shown_text = aSrc.m_shown_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_TEXT::SetEffects( const EDA_TEXT& aSrc )
|
void EDA_TEXT::SetEffects( const EDA_TEXT& aSrc )
|
||||||
{
|
{
|
||||||
m_e = aSrc.m_e;
|
m_e = aSrc.m_e;
|
||||||
|
|
|
@ -98,7 +98,6 @@ void LIB_FIELD::Init( int id )
|
||||||
// template fieldsnames' initial visibility is controlled by the template fieldname config.
|
// template fieldsnames' initial visibility is controlled by the template fieldname config.
|
||||||
if( id == DATASHEET || id == FOOTPRINT )
|
if( id == DATASHEET || id == FOOTPRINT )
|
||||||
SetVisible( false );
|
SetVisible( false );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -179,7 +178,7 @@ void LIB_FIELD::Copy( LIB_FIELD* aTarget ) const
|
||||||
{
|
{
|
||||||
aTarget->m_name = m_name;
|
aTarget->m_name = m_name;
|
||||||
|
|
||||||
aTarget->SetText( GetText() );
|
aTarget->CopyText( *this );
|
||||||
aTarget->SetEffects( *this );
|
aTarget->SetEffects( *this );
|
||||||
aTarget->SetParent( m_Parent );
|
aTarget->SetParent( m_Parent );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1925,6 +1925,18 @@ void SCH_COMPONENT::ClearHighlightedPins()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_COMPONENT::HasHighlightedPins()
|
||||||
|
{
|
||||||
|
for( const SCH_PIN& pin : m_pins )
|
||||||
|
{
|
||||||
|
if( pin.IsHighlighted() )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_COMPONENT::HighlightPin( LIB_PIN* aPin )
|
void SCH_COMPONENT::HighlightPin( LIB_PIN* aPin )
|
||||||
{
|
{
|
||||||
if( m_pinMap.count( aPin ) )
|
if( m_pinMap.count( aPin ) )
|
||||||
|
@ -1932,14 +1944,32 @@ void SCH_COMPONENT::HighlightPin( LIB_PIN* aPin )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_COMPONENT::ClearAllHighlightFlags()
|
bool SCH_COMPONENT::ClearAllHighlightFlags()
|
||||||
{
|
{
|
||||||
ClearFlags( HIGHLIGHTED );
|
bool retVal = false;
|
||||||
|
|
||||||
|
if( IsHighlighted() )
|
||||||
|
{
|
||||||
|
ClearFlags( HIGHLIGHTED );
|
||||||
|
retVal = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Clear the HIGHLIGHTED flag of pins
|
// Clear the HIGHLIGHTED flag of pins
|
||||||
ClearHighlightedPins();
|
if( HasHighlightedPins() )
|
||||||
|
{
|
||||||
|
ClearHighlightedPins();
|
||||||
|
retVal = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Clear the HIGHLIGHTED flag of other items, currently only fields
|
// Clear the HIGHLIGHTED flag of other items, currently only fields
|
||||||
for( SCH_FIELD& each_field : m_Fields )
|
for( SCH_FIELD& each_field : m_Fields )
|
||||||
each_field.ClearFlags( HIGHLIGHTED );
|
{
|
||||||
|
if( each_field.IsHighlighted() )
|
||||||
|
{
|
||||||
|
each_field.ClearFlags( HIGHLIGHTED );
|
||||||
|
retVal = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
|
@ -325,10 +325,9 @@ public:
|
||||||
void SetTimeStamp( timestamp_t aNewTimeStamp );
|
void SetTimeStamp( timestamp_t aNewTimeStamp );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear the HIGHLIGHTED flag of all items of the component
|
* Clear the HIGHLIGHTED flag of all items of the component (fields, pins ...)
|
||||||
* (fields, pins ...)
|
|
||||||
*/
|
*/
|
||||||
void ClearAllHighlightFlags();
|
bool ClearAllHighlightFlags();
|
||||||
|
|
||||||
const EDA_RECT GetBoundingBox() const override;
|
const EDA_RECT GetBoundingBox() const override;
|
||||||
|
|
||||||
|
@ -640,6 +639,8 @@ public:
|
||||||
|
|
||||||
void ClearHighlightedPins();
|
void ClearHighlightedPins();
|
||||||
|
|
||||||
|
bool HasHighlightedPins();
|
||||||
|
|
||||||
void HighlightPin( LIB_PIN* aPin );
|
void HighlightPin( LIB_PIN* aPin );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -189,10 +189,12 @@ void SCH_VIEW::HighlightItem( EDA_ITEM *aItem, LIB_PIN* aPin )
|
||||||
if( aItem && aItem->Type() == SCH_COMPONENT_T && aPin )
|
if( aItem && aItem->Type() == SCH_COMPONENT_T && aPin )
|
||||||
{
|
{
|
||||||
static_cast<SCH_COMPONENT*>( aItem )->HighlightPin( aPin );
|
static_cast<SCH_COMPONENT*>( aItem )->HighlightPin( aPin );
|
||||||
|
Update( aItem, REPAINT );
|
||||||
}
|
}
|
||||||
else if( aItem )
|
else if( aItem )
|
||||||
{
|
{
|
||||||
aItem->SetFlags( HIGHLIGHTED );
|
aItem->SetFlags( HIGHLIGHTED );
|
||||||
|
Update( aItem, REPAINT );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -204,7 +206,11 @@ void SCH_VIEW::HighlightItem( EDA_ITEM *aItem, LIB_PIN* aPin )
|
||||||
|
|
||||||
if( eitem )
|
if( eitem )
|
||||||
{
|
{
|
||||||
eitem->ClearFlags( HIGHLIGHTED );
|
if( eitem->IsHighlighted() )
|
||||||
|
{
|
||||||
|
eitem->ClearFlags( HIGHLIGHTED );
|
||||||
|
Update( eitem, REPAINT );
|
||||||
|
}
|
||||||
|
|
||||||
if( eitem->Type() == SCH_COMPONENT_T )
|
if( eitem->Type() == SCH_COMPONENT_T )
|
||||||
{
|
{
|
||||||
|
@ -214,9 +220,6 @@ void SCH_VIEW::HighlightItem( EDA_ITEM *aItem, LIB_PIN* aPin )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ugly but I guess OK for the moment...
|
|
||||||
UpdateAllItems( ALL );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}; // namespace KIGFX
|
}; // namespace KIGFX
|
||||||
|
|
|
@ -205,6 +205,8 @@ public:
|
||||||
|
|
||||||
void SwapText( EDA_TEXT& aTradingPartner );
|
void SwapText( EDA_TEXT& aTradingPartner );
|
||||||
|
|
||||||
|
void CopyText( const EDA_TEXT& aSrc );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function used in search and replace dialog
|
* Helper function used in search and replace dialog
|
||||||
* performs a text replace using the find and replace criteria in \a aSearchData.
|
* performs a text replace using the find and replace criteria in \a aSearchData.
|
||||||
|
|
|
@ -307,6 +307,7 @@ PCBNEW_SELECTION& SELECTION_TOOL::RequestSelection( CLIENT_SELECTION_FILTER aCli
|
||||||
if ( aConfirmLockedItems && CheckLock() == SELECTION_LOCKED )
|
if ( aConfirmLockedItems && CheckLock() == SELECTION_LOCKED )
|
||||||
{
|
{
|
||||||
ClearSelection();
|
ClearSelection();
|
||||||
|
return m_selection;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( aClientFilter )
|
if( aClientFilter )
|
||||||
|
@ -387,9 +388,10 @@ bool SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag,
|
||||||
bool* aSelectionCancelledFlag,
|
bool* aSelectionCancelledFlag,
|
||||||
CLIENT_SELECTION_FILTER aClientFilter )
|
CLIENT_SELECTION_FILTER aClientFilter )
|
||||||
{
|
{
|
||||||
auto guide = getCollectorsGuide();
|
GENERAL_COLLECTORS_GUIDE guide = getCollectorsGuide();
|
||||||
GENERAL_COLLECTOR collector;
|
GENERAL_COLLECTOR collector;
|
||||||
auto displayOpts = (PCB_DISPLAY_OPTIONS*)m_frame->GetDisplayOptions();
|
PCB_DISPLAY_OPTIONS* displayOpts = (PCB_DISPLAY_OPTIONS*) m_frame->GetDisplayOptions();
|
||||||
|
bool cleared = false;
|
||||||
|
|
||||||
guide.SetIgnoreZoneFills( displayOpts->m_DisplayZonesMode != 0 );
|
guide.SetIgnoreZoneFills( displayOpts->m_DisplayZonesMode != 0 );
|
||||||
|
|
||||||
|
@ -433,7 +435,15 @@ bool SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag,
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !m_additive && !m_subtractive && !m_exclusive_or )
|
if( !m_additive && !m_subtractive && !m_exclusive_or )
|
||||||
ClearSelection();
|
{
|
||||||
|
if( m_selection.GetSize() > 0 )
|
||||||
|
{
|
||||||
|
// Don't fire an event now as it will end up redundant if we fire a SelectedEvent
|
||||||
|
// or an UnselectedEvent.
|
||||||
|
cleared = true;
|
||||||
|
ClearSelection( true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( collector.GetCount() == 1 )
|
if( collector.GetCount() == 1 )
|
||||||
{
|
{
|
||||||
|
@ -453,6 +463,9 @@ bool SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( cleared )
|
||||||
|
m_toolMgr->ProcessEvent( EVENTS::ClearedEvent );
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -461,7 +474,7 @@ bool SELECTION_TOOL::selectCursor( bool aForceSelect, CLIENT_SELECTION_FILTER aC
|
||||||
{
|
{
|
||||||
if( aForceSelect || m_selection.Empty() )
|
if( aForceSelect || m_selection.Empty() )
|
||||||
{
|
{
|
||||||
ClearSelection();
|
ClearSelection( true /*quiet mode*/ );
|
||||||
selectPoint( getViewControls()->GetCursorPosition( false ), false, NULL, aClientFilter );
|
selectPoint( getViewControls()->GetCursorPosition( false ), false, NULL, aClientFilter );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -478,6 +491,9 @@ bool SELECTION_TOOL::selectMultiple()
|
||||||
KIGFX::PREVIEW::SELECTION_AREA area;
|
KIGFX::PREVIEW::SELECTION_AREA area;
|
||||||
view->Add( &area );
|
view->Add( &area );
|
||||||
|
|
||||||
|
bool anyAdded = false;
|
||||||
|
bool anySubtracted = false;
|
||||||
|
|
||||||
while( TOOL_EVENT* evt = Wait() )
|
while( TOOL_EVENT* evt = Wait() )
|
||||||
{
|
{
|
||||||
if( evt->IsCancelInteractive() || evt->IsActivate() )
|
if( evt->IsCancelInteractive() || evt->IsActivate() )
|
||||||
|
@ -489,7 +505,13 @@ bool SELECTION_TOOL::selectMultiple()
|
||||||
if( evt->IsDrag( BUT_LEFT ) )
|
if( evt->IsDrag( BUT_LEFT ) )
|
||||||
{
|
{
|
||||||
if( !m_additive && !m_subtractive && !m_exclusive_or )
|
if( !m_additive && !m_subtractive && !m_exclusive_or )
|
||||||
ClearSelection();
|
{
|
||||||
|
if( m_selection.GetSize() > 0 )
|
||||||
|
{
|
||||||
|
anySubtracted = true;
|
||||||
|
ClearSelection( true /*quiet mode*/ );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Start drawing a selection box
|
// Start drawing a selection box
|
||||||
area.SetOrigin( evt->DragOrigin() );
|
area.SetOrigin( evt->DragOrigin() );
|
||||||
|
@ -527,8 +549,6 @@ bool SELECTION_TOOL::selectMultiple()
|
||||||
* Right > Left : Select objects that are crossed by selection
|
* Right > Left : Select objects that are crossed by selection
|
||||||
*/
|
*/
|
||||||
bool windowSelection = width >= 0 ? true : false;
|
bool windowSelection = width >= 0 ? true : false;
|
||||||
bool anyAdded = false;
|
|
||||||
bool anySubtracted = false;
|
|
||||||
|
|
||||||
if( view->IsMirroredX() )
|
if( view->IsMirroredX() )
|
||||||
windowSelection = !windowSelection;
|
windowSelection = !windowSelection;
|
||||||
|
@ -565,8 +585,7 @@ bool SELECTION_TOOL::selectMultiple()
|
||||||
// Inform other potentially interested tools
|
// Inform other potentially interested tools
|
||||||
if( anyAdded )
|
if( anyAdded )
|
||||||
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
|
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
|
||||||
|
else if( anySubtracted )
|
||||||
if( anySubtracted )
|
|
||||||
m_toolMgr->ProcessEvent( EVENTS::UnselectedEvent );
|
m_toolMgr->ProcessEvent( EVENTS::UnselectedEvent );
|
||||||
|
|
||||||
break; // Stop waiting for events
|
break; // Stop waiting for events
|
||||||
|
@ -732,9 +751,8 @@ void SELECTION_TOOL::UnbrightenItem( BOARD_ITEM* aItem )
|
||||||
|
|
||||||
void connectedTrackFilter( const VECTOR2I& aPt, GENERAL_COLLECTOR& aCollector )
|
void connectedTrackFilter( const VECTOR2I& aPt, GENERAL_COLLECTOR& aCollector )
|
||||||
{
|
{
|
||||||
/* Narrow the collection down to a single TRACK item for a trivial
|
// Narrow the collection down to a single TRACK item for a trivial connection, or
|
||||||
* connection, or multiple TRACK items for non-trivial connections.
|
// multiple TRACK items for non-trivial connections.
|
||||||
*/
|
|
||||||
for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
|
for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
|
||||||
{
|
{
|
||||||
if( !dynamic_cast<TRACK*>( aCollector[i] ) )
|
if( !dynamic_cast<TRACK*>( aCollector[i] ) )
|
||||||
|
@ -792,9 +810,8 @@ int SELECTION_TOOL::expandConnection( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
void connectedItemFilter( const VECTOR2I&, GENERAL_COLLECTOR& aCollector )
|
void connectedItemFilter( const VECTOR2I&, GENERAL_COLLECTOR& aCollector )
|
||||||
{
|
{
|
||||||
/* Narrow the collection down to a single BOARD_CONNECTED_ITEM for each
|
// Narrow the collection down to a single BOARD_CONNECTED_ITEM for each represented net.
|
||||||
* represented net. All other items types are removed.
|
// All other items types are removed.
|
||||||
*/
|
|
||||||
std::set<int> representedNets;
|
std::set<int> representedNets;
|
||||||
|
|
||||||
for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
|
for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
|
||||||
|
@ -1032,7 +1049,7 @@ void SELECTION_TOOL::zoomFitSelection()
|
||||||
|
|
||||||
int SELECTION_TOOL::selectSheetContents( const TOOL_EVENT& aEvent )
|
int SELECTION_TOOL::selectSheetContents( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
ClearSelection();
|
ClearSelection( true /*quiet mode*/ );
|
||||||
wxString* sheetpath = aEvent.Parameter<wxString*>();
|
wxString* sheetpath = aEvent.Parameter<wxString*>();
|
||||||
|
|
||||||
selectAllItemsOnSheet( *sheetpath );
|
selectAllItemsOnSheet( *sheetpath );
|
||||||
|
@ -1063,7 +1080,7 @@ int SELECTION_TOOL::selectSameSheet( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
auto mod = dynamic_cast<MODULE*>( item );
|
auto mod = dynamic_cast<MODULE*>( item );
|
||||||
|
|
||||||
ClearSelection();
|
ClearSelection( true /*quiet mode*/ );
|
||||||
|
|
||||||
// get the lowest subsheet name for this.
|
// get the lowest subsheet name for this.
|
||||||
wxString sheetPath = mod->GetPath();
|
wxString sheetPath = mod->GetPath();
|
||||||
|
@ -1082,7 +1099,15 @@ int SELECTION_TOOL::selectSameSheet( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
void SELECTION_TOOL::findCallback( BOARD_ITEM* aItem )
|
void SELECTION_TOOL::findCallback( BOARD_ITEM* aItem )
|
||||||
{
|
{
|
||||||
ClearSelection();
|
bool cleared = false;
|
||||||
|
|
||||||
|
if( m_selection.GetSize() > 0 )
|
||||||
|
{
|
||||||
|
// Don't fire an event now; most of the time it will be redundant as we're about to
|
||||||
|
// fire a SelectedEvent.
|
||||||
|
cleared = true;
|
||||||
|
ClearSelection( true /*quiet mode*/ );
|
||||||
|
}
|
||||||
|
|
||||||
if( aItem )
|
if( aItem )
|
||||||
{
|
{
|
||||||
|
@ -1092,6 +1117,10 @@ void SELECTION_TOOL::findCallback( BOARD_ITEM* aItem )
|
||||||
// Inform other potentially interested tools
|
// Inform other potentially interested tools
|
||||||
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
|
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
|
||||||
}
|
}
|
||||||
|
else if( cleared )
|
||||||
|
{
|
||||||
|
m_toolMgr->ProcessEvent( EVENTS::ClearedEvent );
|
||||||
|
}
|
||||||
|
|
||||||
m_frame->GetCanvas()->ForceRefresh();
|
m_frame->GetCanvas()->ForceRefresh();
|
||||||
}
|
}
|
||||||
|
@ -1192,34 +1221,32 @@ static bool itemIsIncludedByFilter( const BOARD_ITEM& aItem,
|
||||||
|
|
||||||
int SELECTION_TOOL::filterSelection( const TOOL_EVENT& aEvent )
|
int SELECTION_TOOL::filterSelection( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
auto& opts = m_priv->m_filterOpts;
|
const BOARD& board = *getModel<BOARD>();
|
||||||
DIALOG_BLOCK_OPTIONS dlg( m_frame, opts, false, _( "Filter selection" ) );
|
DIALOG_BLOCK_OPTIONS::OPTIONS& opts = m_priv->m_filterOpts;
|
||||||
|
DIALOG_BLOCK_OPTIONS dlg( m_frame, opts, false, _( "Filter selection" ) );
|
||||||
|
|
||||||
const int cmd = dlg.ShowModal();
|
const int cmd = dlg.ShowModal();
|
||||||
|
|
||||||
if( cmd != wxID_OK )
|
if( cmd != wxID_OK )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
const auto& board = *getModel<BOARD>();
|
|
||||||
|
|
||||||
// copy current selection
|
// copy current selection
|
||||||
auto selection = m_selection.GetItems();
|
std::deque<EDA_ITEM*> selection = m_selection.GetItems();
|
||||||
|
|
||||||
// clear current selection
|
ClearSelection( true /*quiet mode*/ );
|
||||||
ClearSelection();
|
|
||||||
|
|
||||||
// copy selection items from the saved selection
|
// re-select items from the saved selection according to the dialog options
|
||||||
// according to the dialog options
|
for( EDA_ITEM* i : selection )
|
||||||
for( auto i : selection )
|
|
||||||
{
|
{
|
||||||
auto item = static_cast<BOARD_ITEM*>( i );
|
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( i );
|
||||||
bool include = itemIsIncludedByFilter( *item, board, opts );
|
bool include = itemIsIncludedByFilter( *item, board, opts );
|
||||||
|
|
||||||
if( include )
|
if( include )
|
||||||
{
|
|
||||||
select( item );
|
select( item );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1642,14 +1669,12 @@ void SELECTION_TOOL::select( BOARD_ITEM* aItem )
|
||||||
}
|
}
|
||||||
|
|
||||||
highlight( aItem, SELECTED, &m_selection );
|
highlight( aItem, SELECTED, &m_selection );
|
||||||
view()->Update( &m_selection );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SELECTION_TOOL::unselect( BOARD_ITEM* aItem )
|
void SELECTION_TOOL::unselect( BOARD_ITEM* aItem )
|
||||||
{
|
{
|
||||||
unhighlight( aItem, SELECTED, &m_selection );
|
unhighlight( aItem, SELECTED, &m_selection );
|
||||||
view()->Update( &m_selection );
|
|
||||||
|
|
||||||
if( m_selection.Empty() )
|
if( m_selection.Empty() )
|
||||||
m_locked = true;
|
m_locked = true;
|
||||||
|
|
Loading…
Reference in New Issue