Move timestamp setting where it will alwasy get set.

Also update the rest of the symbol-chooser usage to current
specs, including examining the timestamp to see if the list
needs loading at all.

Partial fix to: lp:1760936
* https://bugs.launchpad.net/kicad/+bug/1760936
This commit is contained in:
Jeff Young 2018-04-04 01:19:20 +01:00
parent 70988271c1
commit 5e36fe8df7
5 changed files with 48 additions and 13 deletions

View File

@ -101,15 +101,17 @@ void FOOTPRINT_SELECT_WIDGET::Load( KIWAY& aKiway, PROJECT& aProject )
try try
{ {
auto fp_lib_table = aProject.PcbFootprintLibs( aKiway ); auto fp_lib_table = aProject.PcbFootprintLibs( aKiway );
m_fp_list = FOOTPRINT_LIST::GetInstance( aKiway );
if( m_fp_loader.GetProgress() == 0 || !m_fp_loader.IsSameTable( fp_lib_table ) ) if( m_fp_list->RequiresLoading( fp_lib_table ) )
{ {
m_fp_list = FOOTPRINT_LIST::GetInstance( aKiway );
m_fp_loader.SetList( &*m_fp_list ); m_fp_loader.SetList( &*m_fp_list );
m_fp_loader.Start( fp_lib_table ); m_fp_loader.Start( fp_lib_table );
}
m_progress_timer->Start( 200 ); m_progress_timer->Start( 200 );
}
else
FootprintsLoaded();
} }
catch( ... ) catch( ... )
{ {
@ -128,18 +130,27 @@ void FOOTPRINT_SELECT_WIDGET::OnProgressTimer( wxTimerEvent& aEvent )
wxBusyCursor busy; wxBusyCursor busy;
m_fp_loader.Join(); m_fp_loader.Join();
m_fp_filter.SetList( *m_fp_list );
m_progress_timer->Stop(); m_progress_timer->Stop();
m_book->SetSelection( PAGE_SELECT ); FootprintsLoaded();
m_finished_loading = true;
if( m_update )
UpdateList();
} }
} }
void FOOTPRINT_SELECT_WIDGET::FootprintsLoaded()
{
m_progress_ctrl->SetValue( 100 );
m_fp_filter.SetList( *m_fp_list );
m_book->SetSelection( PAGE_SELECT );
m_finished_loading = true;
if( m_update )
UpdateList();
}
void FOOTPRINT_SELECT_WIDGET::OnComboBox( wxCommandEvent& aEvent ) void FOOTPRINT_SELECT_WIDGET::OnComboBox( wxCommandEvent& aEvent )
{ {
wxCommandEvent evt( EVT_FOOTPRINT_SELECTED ); wxCommandEvent evt( EVT_FOOTPRINT_SELECTED );

View File

@ -242,6 +242,15 @@ public:
return error; return error;
} }
/**
* Indicates whether or not the table requires loading for the given \a aNickname.
*/
virtual bool RequiresLoading( FP_LIB_TABLE* aTable, const wxString* aNickname = nullptr )
{
return true; // Implementations which support caching should implement this.
}
/** /**
* Read all the footprints provided by the combination of aTable and aNickname. * Read all the footprints provided by the combination of aTable and aNickname.
* *

View File

@ -149,6 +149,7 @@ private:
FOOTPRINT_FILTER m_fp_filter; FOOTPRINT_FILTER m_fp_filter;
bool m_zero_filter; bool m_zero_filter;
void FootprintsLoaded();
void OnProgressTimer( wxTimerEvent& aEvent ); void OnProgressTimer( wxTimerEvent& aEvent );
void OnComboBox( wxCommandEvent& aEvent ); void OnComboBox( wxCommandEvent& aEvent );
void OnComboInteractive( wxCommandEvent& aEvent ); void OnComboInteractive( wxCommandEvent& aEvent );

View File

@ -115,6 +115,12 @@ void FOOTPRINT_LIST_IMPL::loader_job()
} }
bool FOOTPRINT_LIST_IMPL::RequiresLoading( FP_LIB_TABLE* aTable, const wxString* aNickname )
{
return m_list_timestamp != aTable->GenerateTimestamp( aNickname );
}
bool FOOTPRINT_LIST_IMPL::ReadFootprintFiles( FP_LIB_TABLE* aTable, const wxString* aNickname, bool FOOTPRINT_LIST_IMPL::ReadFootprintFiles( FP_LIB_TABLE* aTable, const wxString* aNickname,
WX_PROGRESS_REPORTER* aProgressReporter ) WX_PROGRESS_REPORTER* aProgressReporter )
{ {
@ -166,7 +172,6 @@ bool FOOTPRINT_LIST_IMPL::ReadFootprintFiles( FP_LIB_TABLE* aTable, const wxStri
( _( "Loading incomplete; cancelled by user." ), nullptr, nullptr, 0 ) ); ( _( "Loading incomplete; cancelled by user." ), nullptr, nullptr, 0 ) );
} }
m_list_timestamp = aTable->GenerateTimestamp( aNickname );;
m_progress_reporter = nullptr; m_progress_reporter = nullptr;
return m_errors.empty(); return m_errors.empty();
@ -178,6 +183,7 @@ void FOOTPRINT_LIST_IMPL::StartWorkers( FP_LIB_TABLE* aTable, wxString const* aN
{ {
m_loader = aLoader; m_loader = aLoader;
m_lib_table = aTable; m_lib_table = aTable;
m_library = aNickname;
// Clear data before reading files // Clear data before reading files
m_count_finished.store( 0 ); m_count_finished.store( 0 );
@ -292,6 +298,11 @@ bool FOOTPRINT_LIST_IMPL::JoinWorkers()
[]( std::unique_ptr<FOOTPRINT_INFO> const& lhs, []( std::unique_ptr<FOOTPRINT_INFO> const& lhs,
std::unique_ptr<FOOTPRINT_INFO> const& rhs ) -> bool { return *lhs < *rhs; } ); std::unique_ptr<FOOTPRINT_INFO> const& rhs ) -> bool { return *lhs < *rhs; } );
if( m_cancelled )
m_list_timestamp = 0; // God knows what we got before we were cancelled
else
m_list_timestamp = m_lib_table->GenerateTimestamp( m_library );;
return m_errors.empty(); return m_errors.empty();
} }

View File

@ -58,6 +58,7 @@ protected:
class FOOTPRINT_LIST_IMPL : public FOOTPRINT_LIST class FOOTPRINT_LIST_IMPL : public FOOTPRINT_LIST
{ {
FOOTPRINT_ASYNC_LOADER* m_loader; FOOTPRINT_ASYNC_LOADER* m_loader;
const wxString* m_library;
std::vector<std::thread> m_threads; std::vector<std::thread> m_threads;
SYNC_QUEUE<wxString> m_queue_in; SYNC_QUEUE<wxString> m_queue_in;
SYNC_QUEUE<wxString> m_queue_out; SYNC_QUEUE<wxString> m_queue_out;
@ -89,8 +90,10 @@ public:
FOOTPRINT_LIST_IMPL(); FOOTPRINT_LIST_IMPL();
virtual ~FOOTPRINT_LIST_IMPL(); virtual ~FOOTPRINT_LIST_IMPL();
virtual bool ReadFootprintFiles( FP_LIB_TABLE* aTable, const wxString* aNickname = nullptr, bool RequiresLoading( FP_LIB_TABLE* aTable, const wxString* aNickname = nullptr ) override;
WX_PROGRESS_REPORTER* aProgressReporter = nullptr ) override;
bool ReadFootprintFiles( FP_LIB_TABLE* aTable, const wxString* aNickname = nullptr,
WX_PROGRESS_REPORTER* aProgressReporter = nullptr ) override;
}; };
extern FOOTPRINT_LIST_IMPL GFootprintList; // KIFACE scope. extern FOOTPRINT_LIST_IMPL GFootprintList; // KIFACE scope.