Schematic net navigator improvements.

Arrange connectivity items by sheet.  Complex nets which span many
sheets make finding objects difficult.  It also provides a higher
level of sheet view granularity.
This commit is contained in:
Wayne Stambaugh 2023-06-01 12:49:12 -04:00
parent 707b0becee
commit d854e2bfe8
2 changed files with 53 additions and 63 deletions

View File

@ -33,20 +33,20 @@
class NET_NAVIGATOR_ITEM_DATA : public wxTreeItemData class NET_NAVIGATOR_ITEM_DATA : public wxTreeItemData
{ {
public: public:
NET_NAVIGATOR_ITEM_DATA( const SCH_SHEET_PATH& aSheetPath, const VECTOR2I& aItemCenterPos ) : NET_NAVIGATOR_ITEM_DATA( const SCH_SHEET_PATH& aSheetPath, const SCH_ITEM* aItem ) :
m_sheetPath( aSheetPath ), m_sheetPath( aSheetPath ),
m_itemCenterPos( aItemCenterPos ) m_item( aItem )
{ {
} }
NET_NAVIGATOR_ITEM_DATA() {} NET_NAVIGATOR_ITEM_DATA() {}
SCH_SHEET_PATH& GetSheetPath() { return m_sheetPath; } SCH_SHEET_PATH& GetSheetPath() { return m_sheetPath; }
VECTOR2I& GetItemCenterPos() { return m_itemCenterPos; } const SCH_ITEM* GetItem() const { return m_item; }
bool operator==( const NET_NAVIGATOR_ITEM_DATA& aRhs ) const bool operator==( const NET_NAVIGATOR_ITEM_DATA& aRhs ) const
{ {
return ( m_sheetPath == aRhs.m_sheetPath ) && ( m_itemCenterPos == aRhs.m_itemCenterPos ); return ( m_sheetPath == aRhs.m_sheetPath ) && ( m_item == aRhs.m_item );
} }
NET_NAVIGATOR_ITEM_DATA& operator=( const NET_NAVIGATOR_ITEM_DATA& aItemData ) NET_NAVIGATOR_ITEM_DATA& operator=( const NET_NAVIGATOR_ITEM_DATA& aItemData )
@ -55,23 +55,25 @@ public:
return *this; return *this;
m_sheetPath = aItemData.m_sheetPath; m_sheetPath = aItemData.m_sheetPath;
m_itemCenterPos = aItemData.m_itemCenterPos; m_item = aItemData.m_item;
return *this; return *this;
} }
private: private:
SCH_SHEET_PATH m_sheetPath; SCH_SHEET_PATH m_sheetPath;
VECTOR2I m_itemCenterPos; const SCH_ITEM* m_item;
}; };
void SCH_EDIT_FRAME::MakeNetNavigatorNode( const wxString& aNetName, wxTreeItemId aParentId ) void SCH_EDIT_FRAME::MakeNetNavigatorNode( const wxString& aNetName, wxTreeItemId aParentId,
const NET_NAVIGATOR_ITEM_DATA* aSelection )
{ {
wxCHECK( !aNetName.IsEmpty(), /* void */ ); wxCHECK( !aNetName.IsEmpty(), /* void */ );
wxCHECK( m_schematic, /* void */ ); wxCHECK( m_schematic, /* void */ );
wxCHECK( m_netNavigator, /* void */ ); wxCHECK( m_netNavigator, /* void */ );
wxTreeItemId expandId = aParentId;
CONNECTION_GRAPH* connectionGraph = m_schematic->ConnectionGraph(); CONNECTION_GRAPH* connectionGraph = m_schematic->ConnectionGraph();
wxCHECK( connectionGraph, /* void */ ); wxCHECK( connectionGraph, /* void */ );
@ -82,20 +84,42 @@ void SCH_EDIT_FRAME::MakeNetNavigatorNode( const wxString& aNetName, wxTreeItemI
for( const CONNECTION_SUBGRAPH* subGraph : subgraphs ) for( const CONNECTION_SUBGRAPH* subGraph : subgraphs )
{ {
NET_NAVIGATOR_ITEM_DATA* itemData = nullptr;
SCH_SHEET_PATH sheetPath = subGraph->GetSheet(); SCH_SHEET_PATH sheetPath = subGraph->GetSheet();
// if( subgraphs.size() > 1 ) wxCHECK2( sheetPath.Last(), continue );
sheetPathPrefix = _( "Sheet: " ) + sheetPath.PathHumanReadable() + wxS( ", " );
itemData = new NET_NAVIGATOR_ITEM_DATA( sheetPath, nullptr );
bool stripTrailingSeparator = !sheetPath.Last()->IsRootSheet();
wxString txt = sheetPath.PathHumanReadable( true, stripTrailingSeparator );
wxTreeItemId sheetId = m_netNavigator->AppendItem( aParentId, txt, -1, -1, itemData );
if( aSelection && *aSelection == *itemData )
m_netNavigator->SelectItem( sheetId );
// If there is only one sheet in the schematic, always expand the sheet tree.
if( Schematic().GetSheets().size() == 1 )
expandId = sheetId;
for( const SCH_ITEM* item : subGraph->GetItems() ) for( const SCH_ITEM* item : subGraph->GetItems() )
{ {
VECTOR2I itemCenterPos = item->GetBoundingBox().Centre(); itemData = new NET_NAVIGATOR_ITEM_DATA( sheetPath, item );
m_netNavigator->AppendItem( aParentId, wxTreeItemId id = m_netNavigator->AppendItem( sheetId, item->GetItemDescription( this ),
sheetPathPrefix + item->GetItemDescription( this ), -1, -1, itemData );
-1, -1,
new NET_NAVIGATOR_ITEM_DATA( sheetPath, itemCenterPos ) ); if( aSelection && *aSelection == *itemData )
{
expandId = sheetId;
m_netNavigator->SelectItem( id );
}
} }
} }
if( expandId != m_netNavigator->GetRootItem() )
m_netNavigator->Expand( aParentId );
m_netNavigator->Expand( expandId );
} }
@ -123,59 +147,20 @@ void SCH_EDIT_FRAME::RefreshNetNavigator()
wxTreeItemId rootId = m_netNavigator->AddRoot( m_highlightedConn, 0 ); wxTreeItemId rootId = m_netNavigator->AddRoot( m_highlightedConn, 0 );
MakeNetNavigatorNode( m_highlightedConn, rootId ); MakeNetNavigatorNode( m_highlightedConn, rootId );
m_netNavigator->Expand( rootId );
} }
else else
{ {
// If it's the same net, we have to manually check to make sure the net has NET_NAVIGATOR_ITEM_DATA* itemData = nullptr;
// not changed. This is an ugly hack because we have no way to track a
// single connection object change in the connection graph code.
wxTreeItemData* treeItemData = nullptr;
NET_NAVIGATOR_ITEM_DATA* tmp = nullptr;
wxTreeItemId selectedId = m_netNavigator->GetSelection();
wxString selectedText; wxTreeItemId selection = m_netNavigator->GetSelection();
NET_NAVIGATOR_ITEM_DATA selectedItemData;
if( ( selectedId != m_netNavigator->GetRootItem() ) && selectedId.IsOk() ) if( selection.IsOk() )
{ itemData = dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( selection ) );
selectedText = m_netNavigator->GetItemText( selectedId );
treeItemData = m_netNavigator->GetItemData( selectedId );
tmp = static_cast<NET_NAVIGATOR_ITEM_DATA*>( treeItemData );
if( tmp )
selectedItemData = *tmp;
}
m_netNavigator->DeleteAllItems(); m_netNavigator->DeleteAllItems();
wxTreeItemId rootId = m_netNavigator->AddRoot( m_highlightedConn, 0 ); wxTreeItemId rootId = m_netNavigator->AddRoot( m_highlightedConn, 0 );
MakeNetNavigatorNode( m_highlightedConn, rootId ); MakeNetNavigatorNode( m_highlightedConn, rootId, itemData );
m_netNavigator->Expand( rootId );
if( ( selectedId != m_netNavigator->GetRootItem() ) && !selectedText.IsEmpty() )
{
wxTreeItemIdValue cookie;
wxTreeItemId id = m_netNavigator->GetFirstChild( rootId, cookie );
while( id.IsOk() )
{
wxString treeItemText = m_netNavigator->GetItemText( id );
treeItemData = m_netNavigator->GetItemData( id );
tmp = static_cast<NET_NAVIGATOR_ITEM_DATA*>( treeItemData );
if( ( treeItemText == selectedText )
&& ( tmp && ( *tmp == selectedItemData ) ) )
{
m_netNavigator->SetFocusedItem( id );
break;
}
id = m_netNavigator->GetNextChild( rootId, cookie );
}
}
} }
} }
else else
@ -183,7 +168,6 @@ void SCH_EDIT_FRAME::RefreshNetNavigator()
wxTreeItemId rootId = m_netNavigator->AddRoot( m_highlightedConn, 0 ); wxTreeItemId rootId = m_netNavigator->AddRoot( m_highlightedConn, 0 );
MakeNetNavigatorNode( m_highlightedConn, rootId ); MakeNetNavigatorNode( m_highlightedConn, rootId );
m_netNavigator->Expand( rootId );
} }
} }
@ -205,13 +189,17 @@ void SCH_EDIT_FRAME::onNetNavigatorSelection( wxTreeEvent& aEvent )
if( GetCurrentSheet() != itemData->GetSheetPath() ) if( GetCurrentSheet() != itemData->GetSheetPath() )
{ {
// GetToolManager()->RunAction( ACTIONS::cancelInteractive, true );
// GetToolManager()->RunAction( EE_ACTIONS::clearSelection, true );
Schematic().SetCurrentSheet( itemData->GetSheetPath() ); Schematic().SetCurrentSheet( itemData->GetSheetPath() );
DisplayCurrentSheet(); DisplayCurrentSheet();
} }
FocusOnLocation( itemData->GetItemCenterPos() ); // Do not focus on item when a sheet tree node is selected.
if( m_netNavigator->GetItemParent( id ) != m_netNavigator->GetRootItem()
&& itemData->GetItem() )
{
FocusOnLocation( itemData->GetItem()->GetBoundingBox().Centre() );
}
GetCanvas()->Refresh(); GetCanvas()->Refresh();
} }

View File

@ -61,6 +61,7 @@ class DIALOG_SCH_FIND;
class wxFindReplaceData; class wxFindReplaceData;
class RESCUER; class RESCUER;
class HIERARCHY_PANE; class HIERARCHY_PANE;
class NET_NAVIGATOR_ITEM_DATA;
// @todo Move this to transform alone with all of the transform manipulation code. // @todo Move this to transform alone with all of the transform manipulation code.
/// enum used in RotationMiroir() /// enum used in RotationMiroir()
@ -865,7 +866,8 @@ public:
void RefreshNetNavigator(); void RefreshNetNavigator();
void MakeNetNavigatorNode( const wxString& aNetName, wxTreeItemId aParentId ); void MakeNetNavigatorNode( const wxString& aNetName, wxTreeItemId aParentId,
const NET_NAVIGATOR_ITEM_DATA* aSelection = nullptr );
void ToggleNetNavigator(); void ToggleNetNavigator();