Allow ERC/DRC markers to be deleted without deleting exclusions.
Fixes https://gitlab.com/kicad/code/kicad/issues/4953
This commit is contained in:
parent
16c645bfd9
commit
c56599ab07
|
@ -387,18 +387,30 @@ void RC_TREE_MODEL::ValueChanged( RC_TREE_NODE* aNode )
|
|||
|
||||
void RC_TREE_MODEL::DeleteCurrentItem( bool aDeep )
|
||||
{
|
||||
RC_TREE_NODE* tree_node = ToNode( m_view->GetCurrentItem() );
|
||||
const RC_ITEM* drc_item = tree_node ? tree_node->m_RcItem : nullptr;
|
||||
DeleteItems( true, false, false, aDeep );
|
||||
}
|
||||
|
||||
if( !drc_item )
|
||||
|
||||
void RC_TREE_MODEL::DeleteItems( bool aCurrent, bool aWarningsAndErrors, bool aExclusions,
|
||||
bool aDeep )
|
||||
{
|
||||
RC_TREE_NODE* current_node = ToNode( m_view->GetCurrentItem() );
|
||||
const RC_ITEM* current_item = current_node ? current_node->m_RcItem : nullptr;
|
||||
|
||||
if( !current_item && !aWarningsAndErrors && !aExclusions )
|
||||
{
|
||||
wxBell();
|
||||
return;
|
||||
}
|
||||
|
||||
for( int i = 0; i < m_rcItemsProvider->GetCount(); ++i )
|
||||
for( int i = m_rcItemsProvider->GetCount() - 1; i >= 0; --i )
|
||||
{
|
||||
if( m_rcItemsProvider->GetItem( i ) == drc_item )
|
||||
RC_ITEM* rcItem = m_rcItemsProvider->GetItem( i );
|
||||
MARKER_BASE* marker = rcItem->GetParent();
|
||||
|
||||
if( ( aCurrent && rcItem == current_item )
|
||||
|| ( aWarningsAndErrors && marker && !marker->IsExcluded() )
|
||||
|| ( aExclusions && marker && marker->IsExcluded() ) )
|
||||
{
|
||||
wxDataViewItem markerItem = ToItem( m_tree[i] );
|
||||
wxDataViewItemArray childItems;
|
||||
|
@ -418,24 +430,14 @@ void RC_TREE_MODEL::DeleteCurrentItem( bool aDeep )
|
|||
ItemDeleted( parentItem, markerItem );
|
||||
|
||||
m_rcItemsProvider->DeleteItem( i, aDeep );
|
||||
break;
|
||||
|
||||
if( !aWarningsAndErrors && !aExclusions )
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RC_TREE_MODEL::DeleteAllItems()
|
||||
{
|
||||
if( m_rcItemsProvider )
|
||||
{
|
||||
m_rcItemsProvider->DeleteAllItems();
|
||||
|
||||
m_tree.clear();
|
||||
Cleared();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RC_TREE_MODEL::onSizeView( wxSizeEvent& aEvent )
|
||||
{
|
||||
int width = m_view->GetMainWindow()->GetRect().GetWidth() - WX_DATAVIEW_WINDOW_PADDING;
|
||||
|
|
|
@ -59,12 +59,6 @@ public:
|
|||
*/
|
||||
virtual void DeleteItem( int aIndex, bool aDeep ) = 0;
|
||||
|
||||
/**
|
||||
* Function DeleteAllItems
|
||||
* removes and deletes all the items in the list.
|
||||
*/
|
||||
virtual void DeleteAllItems() = 0;
|
||||
|
||||
virtual ~RC_ITEMS_PROVIDER() { }
|
||||
};
|
||||
|
||||
|
@ -278,7 +272,7 @@ public:
|
|||
void ValueChanged( RC_TREE_NODE* aNode );
|
||||
|
||||
void DeleteCurrentItem( bool aDeep );
|
||||
void DeleteAllItems();
|
||||
void DeleteItems( bool aCurrent, bool aWarningsAndErrors, bool aExclusions, bool aDeep );
|
||||
|
||||
private:
|
||||
void rebuildModel( RC_ITEMS_PROVIDER* aProvider, int aSeverities );
|
||||
|
@ -291,8 +285,6 @@ private:
|
|||
RC_ITEMS_PROVIDER* m_rcItemsProvider; // I own this, but not its contents
|
||||
|
||||
std::vector<RC_TREE_NODE*> m_tree; // I own this
|
||||
mutable const RC_ITEM* m_lastQueried; // Used as a massive hack to restore the
|
||||
// widget's scroll position.
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -120,7 +120,27 @@ void DIALOG_ERC::updateDisplayedCounts()
|
|||
*/
|
||||
void DIALOG_ERC::OnEraseDrcMarkersClick( wxCommandEvent& event )
|
||||
{
|
||||
deleteAllMarkers();
|
||||
bool includeExclusions = false;
|
||||
int numExcluded = 0;
|
||||
|
||||
if( m_markerProvider )
|
||||
numExcluded += m_markerProvider->GetCount( RPT_SEVERITY_EXCLUSION );
|
||||
|
||||
if( numExcluded > 0 )
|
||||
{
|
||||
wxMessageDialog dlg( this, _( "Delete exclusions too?" ), _( "Delete All Markers" ),
|
||||
wxYES_NO | wxCANCEL | wxCENTER | wxICON_QUESTION );
|
||||
dlg.SetYesNoLabels( _( "Errors and Warnings Only" ) , _( "Errors, Warnings and Exclusions" ) );
|
||||
|
||||
int ret = dlg.ShowModal();
|
||||
|
||||
if( ret == wxID_CANCEL )
|
||||
return;
|
||||
else if( ret == wxID_NO )
|
||||
includeExclusions = true;
|
||||
}
|
||||
|
||||
deleteAllMarkers( includeExclusions );
|
||||
|
||||
updateDisplayedCounts();
|
||||
m_parent->GetCanvas()->Refresh();
|
||||
|
@ -159,7 +179,7 @@ void DIALOG_ERC::syncCheckboxes()
|
|||
void DIALOG_ERC::OnRunERCClick( wxCommandEvent& event )
|
||||
{
|
||||
wxBusyCursor busy;
|
||||
deleteAllMarkers();
|
||||
deleteAllMarkers( true );
|
||||
|
||||
m_MessagesList->Clear();
|
||||
wxSafeYield(); // m_MarkersList must be redraw
|
||||
|
@ -557,12 +577,12 @@ void DIALOG_ERC::OnSeverity( wxCommandEvent& aEvent )
|
|||
}
|
||||
|
||||
|
||||
void DIALOG_ERC::deleteAllMarkers()
|
||||
void DIALOG_ERC::deleteAllMarkers( bool aIncludeExclusions )
|
||||
{
|
||||
// Clear current selection list to avoid selection of deleted items
|
||||
m_parent->GetToolManager()->RunAction( EE_ACTIONS::clearSelection, true );
|
||||
|
||||
m_markerTreeModel->DeleteAllItems();
|
||||
m_markerTreeModel->DeleteItems( false, true, aIncludeExclusions, true );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ private:
|
|||
|
||||
bool writeReport( const wxString& aFullFileName );
|
||||
|
||||
void deleteAllMarkers();
|
||||
void deleteAllMarkers( bool aIncludeExclusions );
|
||||
|
||||
void syncCheckboxes();
|
||||
void updateDisplayedCounts();
|
||||
|
|
|
@ -315,11 +315,3 @@ void SHEETLIST_ERC_ITEMS_PROVIDER::DeleteItem( int aIndex, bool aDeep )
|
|||
screens.DeleteMarker( marker );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SHEETLIST_ERC_ITEMS_PROVIDER::DeleteAllItems()
|
||||
{
|
||||
SCH_SCREENS screens( m_schematic->Root() );
|
||||
screens.DeleteAllMarkers( MARKER_BASE::MARKER_ERC );
|
||||
m_filteredMarkers.clear();
|
||||
}
|
||||
|
|
|
@ -190,8 +190,6 @@ public:
|
|||
ERC_ITEM* GetItem( int aIndex ) override;
|
||||
|
||||
void DeleteItem( int aIndex, bool aDeep ) override;
|
||||
|
||||
void DeleteAllItems() override;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1311,7 +1311,8 @@ void SCH_SCREENS::DeleteMarker( SCH_MARKER* aMarker )
|
|||
}
|
||||
|
||||
|
||||
void SCH_SCREENS::DeleteMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType, int aErrorCode )
|
||||
void SCH_SCREENS::DeleteMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType, int aErrorCode,
|
||||
bool aIncludeExclusions )
|
||||
{
|
||||
for( SCH_SCREEN* screen = GetFirst(); screen; screen = GetNext() )
|
||||
{
|
||||
|
@ -1322,8 +1323,9 @@ void SCH_SCREENS::DeleteMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType, int a
|
|||
SCH_MARKER* marker = static_cast<SCH_MARKER*>( item );
|
||||
RC_ITEM* rcItem = marker->GetRCItem();
|
||||
|
||||
if( marker->GetMarkerType() == aMarkerType &&
|
||||
( aErrorCode == ERCE_UNSPECIFIED || rcItem->GetErrorCode() == aErrorCode ) )
|
||||
if( marker->GetMarkerType() == aMarkerType
|
||||
&& ( aErrorCode == ERCE_UNSPECIFIED || rcItem->GetErrorCode() == aErrorCode )
|
||||
&& ( !marker->IsExcluded() || aIncludeExclusions ) )
|
||||
{
|
||||
markers.push_back( item );
|
||||
}
|
||||
|
@ -1335,9 +1337,10 @@ void SCH_SCREENS::DeleteMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType, int a
|
|||
}
|
||||
|
||||
|
||||
void SCH_SCREENS::DeleteAllMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType )
|
||||
void SCH_SCREENS::DeleteAllMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType,
|
||||
bool aIncludeExclusions )
|
||||
{
|
||||
DeleteMarkers( aMarkerType, ERCE_UNSPECIFIED );
|
||||
DeleteMarkers( aMarkerType, ERCE_UNSPECIFIED, aIncludeExclusions );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -566,12 +566,13 @@ public:
|
|||
* the list.
|
||||
* @param aMarkerType Type of markers to be deleted.
|
||||
*/
|
||||
void DeleteAllMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType );
|
||||
void DeleteAllMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType, bool aIncludeExclusions );
|
||||
|
||||
/**
|
||||
* Delete all markers of a particular type and error code.
|
||||
*/
|
||||
void DeleteMarkers( enum MARKER_BASE::TYPEMARKER aMarkerTyp, int aErrorCode );
|
||||
void DeleteMarkers( enum MARKER_BASE::TYPEMARKER aMarkerTyp, int aErrorCode,
|
||||
bool aIncludeExclusions = true );
|
||||
|
||||
/**
|
||||
* Delete a specific marker.
|
||||
|
|
|
@ -106,17 +106,6 @@ public:
|
|||
m_sourceVector->erase( m_sourceVector->begin() + aIndex );
|
||||
}
|
||||
}
|
||||
|
||||
void DeleteAllItems() override
|
||||
{
|
||||
if( m_sourceVector )
|
||||
{
|
||||
for( CLEANUP_ITEM* item : *m_sourceVector )
|
||||
delete item;
|
||||
|
||||
m_sourceVector->clear();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -188,7 +188,7 @@ void DIALOG_DRC::OnRunDRCClick( wxCommandEvent& aEvent )
|
|||
m_tester->m_testFootprints = m_cbTestFootprints->GetValue();
|
||||
|
||||
m_brdEditor->RecordDRCExclusions();
|
||||
deleteAllMarkers();
|
||||
deleteAllMarkers( true );
|
||||
|
||||
wxBeginBusyCursor();
|
||||
wxWindowDisabler disabler;
|
||||
|
@ -508,13 +508,12 @@ void DIALOG_DRC::refreshBoardEditor()
|
|||
}
|
||||
|
||||
|
||||
void DIALOG_DRC::deleteAllMarkers()
|
||||
void DIALOG_DRC::deleteAllMarkers( bool aIncludeExclusions )
|
||||
{
|
||||
// Clear current selection list to avoid selection of deleted items
|
||||
m_brdEditor->GetToolManager()->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||
|
||||
m_markerTreeModel->DeleteAllItems();
|
||||
m_unconnectedTreeModel->DeleteAllItems();
|
||||
m_markerTreeModel->DeleteItems( false, true, aIncludeExclusions, true );
|
||||
}
|
||||
|
||||
|
||||
|
@ -594,7 +593,33 @@ void DIALOG_DRC::OnDeleteOneClick( wxCommandEvent& aEvent )
|
|||
|
||||
void DIALOG_DRC::OnDeleteAllClick( wxCommandEvent& aEvent )
|
||||
{
|
||||
deleteAllMarkers();
|
||||
bool includeExclusions = false;
|
||||
int numExcluded = 0;
|
||||
|
||||
if( m_markersProvider )
|
||||
numExcluded += m_markersProvider->GetCount( RPT_SEVERITY_EXCLUSION );
|
||||
|
||||
if( m_unconnectedItemsProvider )
|
||||
numExcluded += m_unconnectedItemsProvider->GetCount( RPT_SEVERITY_EXCLUSION );
|
||||
|
||||
if( m_footprintWarningsProvider )
|
||||
numExcluded += m_footprintWarningsProvider->GetCount( RPT_SEVERITY_EXCLUSION );
|
||||
|
||||
if( numExcluded > 0 )
|
||||
{
|
||||
wxMessageDialog dlg( this, _( "Delete exclusions too?" ), _( "Delete All Markers" ),
|
||||
wxYES_NO | wxCANCEL | wxCENTER | wxICON_QUESTION );
|
||||
dlg.SetYesNoLabels( _( "Errors and Warnings Only" ) , _( "Errors, Warnings and Exclusions" ) );
|
||||
|
||||
int ret = dlg.ShowModal();
|
||||
|
||||
if( ret == wxID_CANCEL )
|
||||
return;
|
||||
else if( ret == wxID_NO )
|
||||
includeExclusions = true;
|
||||
}
|
||||
|
||||
deleteAllMarkers( includeExclusions );
|
||||
|
||||
refreshBoardEditor();
|
||||
updateDisplayedCounts();
|
||||
|
|
|
@ -89,7 +89,7 @@ private:
|
|||
|
||||
void OnChangingNotebookPage( wxNotebookEvent& aEvent ) override;
|
||||
|
||||
void deleteAllMarkers();
|
||||
void deleteAllMarkers( bool aIncludeExclusions );
|
||||
void refreshBoardEditor();
|
||||
|
||||
BOARD_DESIGN_SETTINGS& bds() { return m_currentBoard->GetDesignSettings(); }
|
||||
|
|
|
@ -159,12 +159,6 @@ public:
|
|||
if( aDeep )
|
||||
m_board->Delete( marker );
|
||||
}
|
||||
|
||||
void DeleteAllItems() override
|
||||
{
|
||||
m_board->DeleteMARKERs();
|
||||
m_filteredMarkers.clear();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -252,19 +246,6 @@ public:
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DeleteAllItems() override
|
||||
{
|
||||
if( m_sourceVector )
|
||||
{
|
||||
for( DRC_ITEM* item : *m_sourceVector )
|
||||
delete item;
|
||||
|
||||
m_sourceVector->clear();
|
||||
}
|
||||
|
||||
m_filteredVector.clear(); // no ownership of DRC_ITEM pointers
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue