From 7003c0639efb6e84e41a3a4318096274e1c7cb53 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Sat, 20 Sep 2025 19:51:45 +0100 Subject: [PATCH] Make sure exclusion hotkey works when dialog has focus. (Potentially only required on MSW. Not required on MacOS, unknown on GTK.) Fixes https://gitlab.com/kicad/code/kicad/-/issues/21761 --- eeschema/dialogs/dialog_erc.cpp | 22 ++++++++++++++ eeschema/dialogs/dialog_erc.h | 9 ++---- pcbnew/dialogs/dialog_drc.cpp | 52 ++++++++++++++++++++++++--------- pcbnew/dialogs/dialog_drc.h | 1 + 4 files changed, 64 insertions(+), 20 deletions(-) diff --git a/eeschema/dialogs/dialog_erc.cpp b/eeschema/dialogs/dialog_erc.cpp index 5ecfa3535a..f28ab5266e 100644 --- a/eeschema/dialogs/dialog_erc.cpp +++ b/eeschema/dialogs/dialog_erc.cpp @@ -242,6 +242,28 @@ void DIALOG_ERC::OnMenu( wxCommandEvent& event ) } +void DIALOG_ERC::OnCharHook( wxKeyEvent& aEvt ) +{ + if( int hotkey = aEvt.GetKeyCode() ) + { + if( aEvt.ControlDown() ) + hotkey |= MD_CTRL; + if( aEvt.ShiftDown() ) + hotkey |= MD_SHIFT; + if( aEvt.AltDown() ) + hotkey |= MD_ALT; + + if( hotkey == ACTIONS::excludeMarker.GetHotKey() ) + { + ExcludeMarker(); + return; + } + } + + DIALOG_SHIM::OnCharHook( aEvt ); +} + + bool DIALOG_ERC::TransferDataToWindow() { UpdateData(); diff --git a/eeschema/dialogs/dialog_erc.h b/eeschema/dialogs/dialog_erc.h index 1269d6f4ed..b87fbfd1a1 100644 --- a/eeschema/dialogs/dialog_erc.h +++ b/eeschema/dialogs/dialog_erc.h @@ -22,8 +22,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef _DIALOG_ERC_H_ -#define _DIALOG_ERC_H_ +#pragma once #include @@ -76,6 +75,7 @@ private: // from DIALOG_ERC_BASE: void OnMenu( wxCommandEvent& aEvent ) override; + void OnCharHook( wxKeyEvent& aEvt ) override; void OnCloseErcDialog( wxCloseEvent& event ) override; void OnRunERCClick( wxCommandEvent& event ) override; void OnDeleteOneClick( wxCommandEvent& event ) override; @@ -121,8 +121,3 @@ private: bool m_crossprobe; bool m_scroll_on_crossprobe; }; - - -#endif - -// _DIALOG_ERC_H_ diff --git a/pcbnew/dialogs/dialog_drc.cpp b/pcbnew/dialogs/dialog_drc.cpp index 5eda931b93..8a61716edf 100644 --- a/pcbnew/dialogs/dialog_drc.cpp +++ b/pcbnew/dialogs/dialog_drc.cpp @@ -307,6 +307,28 @@ void DIALOG_DRC::OnErrorLinkClicked( wxHtmlLinkEvent& event ) } +void DIALOG_DRC::OnCharHook( wxKeyEvent& aEvt ) +{ + if( int hotkey = aEvt.GetKeyCode() ) + { + if( aEvt.ControlDown() ) + hotkey |= MD_CTRL; + if( aEvt.ShiftDown() ) + hotkey |= MD_SHIFT; + if( aEvt.AltDown() ) + hotkey |= MD_ALT; + + if( hotkey == ACTIONS::excludeMarker.GetHotKey() ) + { + ExcludeMarker(); + return; + } + } + + DIALOG_SHIM::OnCharHook( aEvt ); +} + + void DIALOG_DRC::OnRunDRCClick( wxCommandEvent& aEvent ) { TOOL_MANAGER* toolMgr = m_frame->GetToolManager(); @@ -1192,23 +1214,27 @@ void DIALOG_DRC::ExcludeMarker() return; RC_TREE_NODE* node = RC_TREE_MODEL::ToNode( m_markerDataView->GetCurrentItem() ); - PCB_MARKER* marker = dynamic_cast( node->m_RcItem->GetParent() ); - if( marker && marker->GetSeverity() != RPT_SEVERITY_EXCLUSION ) + if( node && node->m_RcItem ) { - marker->SetExcluded( true ); - bds().m_DrcExclusions.insert( marker->SerializeToString() ); - m_frame->GetCanvas()->GetView()->Update( marker ); + PCB_MARKER* marker = dynamic_cast( node->m_RcItem->GetParent() ); - // Update view - if( m_showExclusions->GetValue() ) - m_markersTreeModel->ValueChanged( node ); - else - m_markersTreeModel->DeleteCurrentItem( false ); + if( marker && marker->GetSeverity() != RPT_SEVERITY_EXCLUSION ) + { + marker->SetExcluded( true ); + bds().m_DrcExclusions.insert( marker->SerializeToString() ); + m_frame->GetCanvas()->GetView()->Update( marker ); - updateDisplayedCounts(); - refreshEditor(); - m_frame->OnModify(); + // Update view + if( m_showExclusions->GetValue() ) + m_markersTreeModel->ValueChanged( node ); + else + m_markersTreeModel->DeleteCurrentItem( false ); + + updateDisplayedCounts(); + refreshEditor(); + m_frame->OnModify(); + } } } diff --git a/pcbnew/dialogs/dialog_drc.h b/pcbnew/dialogs/dialog_drc.h index eef114da39..5df4517f53 100644 --- a/pcbnew/dialogs/dialog_drc.h +++ b/pcbnew/dialogs/dialog_drc.h @@ -78,6 +78,7 @@ private: bool TransferDataToWindow() override; void OnMenu( wxCommandEvent& aEvent ) override; + void OnCharHook( wxKeyEvent& aEvt ) override; void OnDRCItemSelected( wxDataViewEvent& aEvent ) override; void OnDRCItemDClick( wxDataViewEvent& aEvent ) override; void OnDRCItemRClick( wxDataViewEvent& aEvent ) override;