Only update net inspector when panel is shown.

Pcbnew can hang for a long time when undoing operations involving
large numbers of board items. This provides an interim workaround
(and replicated the behaviour of the search panel) by only
computing track statistics updates incrementally if the inspector
is displayed.

Partially fixes https://gitlab.com/kicad/code/kicad/-/issues/17561
(if net inspector is not shown)
This commit is contained in:
JamesJ 2024-03-24 07:56:53 +00:00 committed by Jon Evans
parent f3ce3bc758
commit 67d6e6afdf
4 changed files with 40 additions and 1 deletions

View File

@ -804,6 +804,7 @@ void PCB_EDIT_FRAME::ToggleNetInspector()
{
SetAuiPaneSize( m_auimgr, netInspectorPanel, settings->m_AuiPanels.net_inspector_width,
-1 );
m_netInspectorPanel->OnShowPanel();
}
else
{

View File

@ -60,6 +60,11 @@ public:
*/
virtual void SaveSettings(){};
/**
* Prepare the panel when (re-)shown in the editor
*/
virtual void OnShowPanel() {}
protected:
// User-driven UI events (override in derrived classes as required)
virtual void OnSetFocus( wxFocusEvent& event ) { event.Skip(); }

View File

@ -876,6 +876,9 @@ void PCB_NET_INSPECTOR_PANEL::onBoardChanged( wxCommandEvent& event )
void PCB_NET_INSPECTOR_PANEL::OnBoardItemAdded( BOARD& aBoard, BOARD_ITEM* aBoardItem )
{
if( !IsShownOnScreen() )
return;
if( NETINFO_ITEM* net = dynamic_cast<NETINFO_ITEM*>( aBoardItem ) )
{
// a new net has been added to the board. add it to our list if it
@ -957,6 +960,9 @@ void PCB_NET_INSPECTOR_PANEL::OnBoardItemAdded( BOARD& aBoard, BOARD_ITEM* aBoar
void PCB_NET_INSPECTOR_PANEL::OnBoardItemsAdded( BOARD& aBoard,
std::vector<BOARD_ITEM*>& aBoardItems )
{
if( !IsShownOnScreen() )
return;
for( BOARD_ITEM* item : aBoardItems )
{
OnBoardItemAdded( aBoard, item );
@ -966,6 +972,9 @@ void PCB_NET_INSPECTOR_PANEL::OnBoardItemsAdded( BOARD& aBoar
void PCB_NET_INSPECTOR_PANEL::OnBoardItemRemoved( BOARD& aBoard, BOARD_ITEM* aBoardItem )
{
if( !IsShownOnScreen() )
return;
if( NETINFO_ITEM* net = dynamic_cast<NETINFO_ITEM*>( aBoardItem ) )
{
m_data_model->deleteItem( m_data_model->findItem( net ) );
@ -1025,6 +1034,9 @@ void PCB_NET_INSPECTOR_PANEL::OnBoardItemRemoved( BOARD& aBoard, BOARD_ITEM* aBo
void PCB_NET_INSPECTOR_PANEL::OnBoardItemsRemoved( BOARD& aBoard,
std::vector<BOARD_ITEM*>& aBoardItems )
{
if( !IsShownOnScreen() )
return;
for( BOARD_ITEM* item : aBoardItems )
{
OnBoardItemRemoved( aBoard, item );
@ -1034,6 +1046,9 @@ void PCB_NET_INSPECTOR_PANEL::OnBoardItemsRemoved( BOARD& aBo
void PCB_NET_INSPECTOR_PANEL::OnBoardNetSettingsChanged( BOARD& aBoard )
{
if( !IsShownOnScreen() )
return;
buildNetsList();
m_netsList->Refresh();
}
@ -1041,6 +1056,9 @@ void PCB_NET_INSPECTOR_PANEL::OnBoardNetSettingsChanged( BOARD& aBoard )
void PCB_NET_INSPECTOR_PANEL::OnBoardItemChanged( BOARD& aBoard, BOARD_ITEM* aBoardItem )
{
if( !IsShownOnScreen() )
return;
if( dynamic_cast<BOARD_CONNECTED_ITEM*>( aBoardItem ) != nullptr
|| dynamic_cast<FOOTPRINT*>( aBoardItem ) != nullptr )
{
@ -1053,6 +1071,9 @@ void PCB_NET_INSPECTOR_PANEL::OnBoardItemChanged( BOARD& aBoard, BOARD_ITEM* aBo
void PCB_NET_INSPECTOR_PANEL::OnBoardItemsChanged( BOARD& aBoard,
std::vector<BOARD_ITEM*>& aBoardItems )
{
if( !IsShownOnScreen() )
return;
buildNetsList();
m_netsList->Refresh();
}
@ -1060,7 +1081,7 @@ void PCB_NET_INSPECTOR_PANEL::OnBoardItemsChanged( BOARD& aBo
void PCB_NET_INSPECTOR_PANEL::OnBoardHighlightNetChanged( BOARD& aBoard )
{
if( m_highlighting_nets )
if( m_highlighting_nets || !IsShownOnScreen() )
return;
if( !m_brd->IsHighLightNetON() )
@ -1094,6 +1115,13 @@ void PCB_NET_INSPECTOR_PANEL::OnBoardHighlightNetChanged( BOARD& aBoard )
*
* ***************************************************************************************/
void PCB_NET_INSPECTOR_PANEL::OnShowPanel()
{
buildNetsList();
OnBoardHighlightNetChanged( *m_brd );
}
void PCB_NET_INSPECTOR_PANEL::OnNetsListContextMenu( wxDataViewEvent& event )
{
bool multipleSelections = false;

View File

@ -83,6 +83,11 @@ public:
std::vector<BOARD_ITEM*>& aBoardItems ) override;
virtual void OnBoardHighlightNetChanged( BOARD& aBoard ) override;
/**
* Prepare the panel when shown in the editor
*/
virtual void OnShowPanel() override;
/**
* Persist the net inspector configuration to project / global settings
*/