Add pinned library support to CvPCB.

This commit is contained in:
Jeff Young 2022-07-09 18:15:36 -06:00
parent 190fb23e88
commit a9e18c68a7
3 changed files with 40 additions and 29 deletions

View File

@ -30,8 +30,10 @@
#include <kiface_base.h> #include <kiface_base.h>
#include <kiplatform/app.h> #include <kiplatform/app.h>
#include <kiway_express.h> #include <kiway_express.h>
#include <project/project_file.h>
#include <macros.h> #include <macros.h>
#include <netlist_reader/netlist_reader.h> #include <netlist_reader/netlist_reader.h>
#include <lib_tree_model_adapter.h>
#include <numeric> #include <numeric>
#include <tool/action_manager.h> #include <tool/action_manager.h>
#include <tool/action_toolbar.h> #include <tool/action_toolbar.h>
@ -93,7 +95,9 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
// Create list of available footprints and symbols of the schematic // Create list of available footprints and symbols of the schematic
BuildSymbolsListBox(); BuildSymbolsListBox();
BuildFootprintsListBox(); BuildFootprintsListBox();
BuildLibrariesListBox();
m_librariesListBox = new LIBRARY_LISTBOX( this, ID_CVPCB_LIBRARY_LIST );
m_librariesListBox->SetFont( KIUI::GetMonospacedUIFont() );
m_auimgr.SetManagedWindow( this ); m_auimgr.SetManagedWindow( this );
@ -957,15 +961,20 @@ void CVPCB_MAINFRAME::BuildSymbolsListBox()
void CVPCB_MAINFRAME::BuildLibrariesListBox() void CVPCB_MAINFRAME::BuildLibrariesListBox()
{ {
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); PROJECT_FILE& project = Kiway().Prj().GetProjectFile();
FP_LIB_TABLE* tbl = Prj().PcbFootprintLibs();
std::set<wxString> pinnedMatches;
std::set<wxString> otherMatches;
if( m_librariesListBox == nullptr ) auto process =
{ [&]( const wxString& aNickname )
m_librariesListBox = new LIBRARY_LISTBOX( this, ID_CVPCB_LIBRARY_LIST ); {
m_librariesListBox->SetFont( KIUI::GetMonospacedUIFont() ); if( alg::contains( project.m_PinnedFootprintLibs, aNickname ) )
} pinnedMatches.insert( aNickname );
else
otherMatches.insert( aNickname );
};
FP_LIB_TABLE* tbl = Prj().PcbFootprintLibs();
if( tbl ) if( tbl )
{ {
@ -974,10 +983,16 @@ void CVPCB_MAINFRAME::BuildLibrariesListBox()
std::vector< wxString > libNickNames = tbl->GetLogicalLibs(); std::vector< wxString > libNickNames = tbl->GetLogicalLibs();
for( const wxString& libNickName : libNickNames ) for( const wxString& libNickName : libNickNames )
libNames.Add( libNickName ); process( libNickName );
m_librariesListBox->SetLibraryList( libNames );
} }
for( const wxString& nickname : pinnedMatches )
m_librariesListBox->AppendLine( LIB_TREE_MODEL_ADAPTER::GetPinningSymbol() + nickname );
for( const wxString& nickname : otherMatches )
m_librariesListBox->AppendLine( nickname );
m_librariesListBox->Finish();
} }

View File

@ -32,6 +32,7 @@
#include <listboxes.h> #include <listboxes.h>
#include <cvpcb_id.h> #include <cvpcb_id.h>
#include <wx/log.h> #include <wx/log.h>
#include "lib_tree_model_adapter.h"
/***************************************/ /***************************************/
@ -62,6 +63,7 @@ void LIBRARY_LISTBOX::SetString( unsigned linecount, const wxString& text )
{ {
if( linecount >= count ) if( linecount >= count )
linecount = count - 1; linecount = count - 1;
m_libraryList[linecount] = text; m_libraryList[linecount] = text;
UpdateWidth( linecount ); UpdateWidth( linecount );
} }
@ -70,24 +72,27 @@ void LIBRARY_LISTBOX::SetString( unsigned linecount, const wxString& text )
wxString LIBRARY_LISTBOX::GetSelectedLibrary() wxString LIBRARY_LISTBOX::GetSelectedLibrary()
{ {
wxString libraryName; wxString libName;
int ii = GetFirstSelected(); int ii = GetFirstSelected();
if( ii >= 0 ) if( ii >= 0 )
{ {
libraryName = m_libraryList[ii]; libName = m_libraryList[ii];
libName.Trim( false );
if( libName.StartsWith( LIB_TREE_MODEL_ADAPTER::GetPinningSymbol() ) )
libName = libName.substr( LIB_TREE_MODEL_ADAPTER::GetPinningSymbol().length() );
} }
return libraryName; return libName;
} }
void LIBRARY_LISTBOX::AppendLine( const wxString& text ) void LIBRARY_LISTBOX::AppendLine( const wxString& text )
{ {
m_libraryList.Add( text ); m_libraryList.Add( wxT( " " ) + text );
int lines = m_libraryList.Count(); int lines = m_libraryList.Count();
SetItemCount( lines ); SetItemCount( lines );
UpdateWidth( lines - 1 );
} }
@ -115,17 +120,8 @@ void LIBRARY_LISTBOX::SetSelection( int index, bool State )
} }
void LIBRARY_LISTBOX::SetLibraryList( const wxArrayString& aList ) void LIBRARY_LISTBOX::Finish()
{ {
int oldSelection = GetSelection();
m_libraryList = aList;
SetItemCount( m_libraryList.GetCount() );
if( GetCount() == 0 || oldSelection < 0 || oldSelection >= GetCount() )
SetSelection( 0, true );
if( m_libraryList.Count() ) if( m_libraryList.Count() )
{ {
RefreshItems( 0L, m_libraryList.Count()-1 ); RefreshItems( 0L, m_libraryList.Count()-1 );
@ -201,8 +197,8 @@ void LIBRARY_LISTBOX::OnChar( wxKeyEvent& event )
void LIBRARY_LISTBOX::OnSelectLibrary( wxListEvent& event ) void LIBRARY_LISTBOX::OnSelectLibrary( wxListEvent& event )
{ {
// Apply the filter // Apply the filter
GetParent()->SetFootprintFilter( GetParent()->SetFootprintFilter( FOOTPRINTS_LISTBOX::FILTERING_BY_LIBRARY,
FOOTPRINTS_LISTBOX::FILTERING_BY_LIBRARY, CVPCB_MAINFRAME::FILTER_ENABLE ); CVPCB_MAINFRAME::FILTER_ENABLE );
SetFocus(); SetFocus();
GetParent()->OnSelectComponent( event ); GetParent()->OnSelectComponent( event );

View File

@ -149,7 +149,7 @@ public:
void SetSelection( int index, bool State = true ); void SetSelection( int index, bool State = true );
void SetString( unsigned linecount, const wxString& text ); void SetString( unsigned linecount, const wxString& text );
void AppendLine( const wxString& text ); void AppendLine( const wxString& text );
void SetLibraryList( const wxArrayString& aList ); void Finish();
wxString GetSelectedLibrary(); wxString GetSelectedLibrary();
wxString OnGetItemText( long item, long column ) const override; wxString OnGetItemText( long item, long column ) const override;