diff --git a/cvpcb/cvpcb_mainframe.cpp b/cvpcb/cvpcb_mainframe.cpp index 0464b9e20c..08fff7102c 100644 --- a/cvpcb/cvpcb_mainframe.cpp +++ b/cvpcb/cvpcb_mainframe.cpp @@ -62,7 +62,6 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) : KIWAY_PLAYER( aKiway, aParent, FRAME_CVPCB, _( "Assign Footprints" ), wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, CVPCB_MAINFRAME_NAME ), - m_footprintListPendingUpdate( false ), m_viewerPendingUpdate( false ) { m_symbolsListBox = nullptr; @@ -211,12 +210,17 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) : // Start the main processing loop m_toolManager->InvokeTool( "cvpcb.Control" ); + m_filterTimer->StartOnce( 100 ); + KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Symbol to footprint changes are unsaved" ) ); } CVPCB_MAINFRAME::~CVPCB_MAINFRAME() { + // Stop the timer during destruction early to avoid potential race conditions (that do happen) + m_filterTimer->Stop(); + // Shutdown all running tools if( m_toolManager ) m_toolManager->ShutdownAllTools(); @@ -372,6 +376,9 @@ void CVPCB_MAINFRAME::setupEventHandlers() // Attach the events to the tool dispatcher Bind( wxEVT_CHAR, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher ); Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher ); + + m_filterTimer = new wxTimer( this ); + Bind( wxEVT_TIMER, &CVPCB_MAINFRAME::onTextFilterChangedTimer, this, m_filterTimer->GetId() ); } @@ -422,19 +429,12 @@ void CVPCB_MAINFRAME::OnEnterFilteringText( wxCommandEvent& aEvent ) // If the option FOOTPRINTS_LISTBOX::FILTERING_BY_TEXT_PATTERN is set, update the list // of available footprints which match the filter - if( !m_footprintListPendingUpdate ) - { - Bind( wxEVT_IDLE, &CVPCB_MAINFRAME::updateFootprintListOnIdle, this ); - m_footprintListPendingUpdate = true; - } + m_filterTimer->StartOnce( 200 ); } -void CVPCB_MAINFRAME::updateFootprintListOnIdle( wxIdleEvent& aEvent ) +void CVPCB_MAINFRAME::onTextFilterChangedTimer( wxTimerEvent& aEvent ) { - Unbind( wxEVT_IDLE, &CVPCB_MAINFRAME::updateFootprintListOnIdle, this ); - m_footprintListPendingUpdate = false; - // GTK loses the search-control's focus on a Refresh event, so we record the focus and // insertion point here and then restore them at the end. bool searchCtrlHasFocus = m_tcFilterString->HasFocus(); diff --git a/cvpcb/cvpcb_mainframe.h b/cvpcb/cvpcb_mainframe.h index c81e307352..b2b60b7acf 100644 --- a/cvpcb/cvpcb_mainframe.h +++ b/cvpcb/cvpcb_mainframe.h @@ -357,7 +357,7 @@ private: void updateFootprintViewerOnIdle( wxIdleEvent& aEvent ); - void updateFootprintListOnIdle( wxIdleEvent& aEvent ); + void onTextFilterChangedTimer( wxTimerEvent& aEvent ); /** * Read the .equ files and populate the list of equivalents. @@ -409,7 +409,7 @@ private: CVPCB_UNDO_REDO_LIST m_undoList; CVPCB_UNDO_REDO_LIST m_redoList; - bool m_footprintListPendingUpdate; + wxTimer* m_filterTimer; bool m_viewerPendingUpdate; };