40#include <wx/clipbrd.h>
43#include <wx/splitter.h>
54 std::vector<PICKED_SYMBOL>& aHistoryList,
55 std::vector<PICKED_SYMBOL>& aAlreadyPlaced,
56 bool aAllowFieldEdits,
bool aShowFootprints,
57 std::function<
void()> aAcceptHandler,
58 std::function<
void()> aEscapeHandler ) :
59 wxPanel( aParent, wxID_ANY, wxDefaultPosition, wxDefaultSize ),
60 m_symbol_preview( nullptr ),
61 m_hsplitter( nullptr ),
62 m_vsplitter( nullptr ),
63 m_fp_sel_ctrl( nullptr ),
64 m_fp_preview( nullptr ),
68 m_acceptHandler(
std::
move( aAcceptHandler ) ),
69 m_escapeHandler(
std::
move( aEscapeHandler ) ),
71 m_allow_field_edits( aAllowFieldEdits ),
72 m_show_footprints( aShowFootprints )
90 for(
const wxString& nickname : liblist )
123 std::vector<LIB_SYMBOL> history_list_storage;
124 std::vector<LIB_TREE_ITEM*> history_list;
125 std::vector<LIB_SYMBOL> already_placed_storage;
126 std::vector<LIB_TREE_ITEM*> already_placed;
130 [&](
const std::vector<PICKED_SYMBOL>& inputList,
131 std::vector<LIB_SYMBOL>& storageList,
132 std::vector<LIB_TREE_ITEM*>& resultList )
134 storageList.reserve( inputList.size() );
142 storageList.emplace_back( *symbol );
144 for(
const std::pair<int, wxString>& fieldDef : i.Fields )
146 SCH_FIELD* field = storageList.back().GetFieldById( fieldDef.first );
149 field->
SetText( fieldDef.second );
152 resultList.push_back( &storageList.back() );
159 std::sort( aAlreadyPlaced.begin(), aAlreadyPlaced.end(),
162 return a.LibId.GetLibItemName() < b.LibId.GetLibItemName();
165 processList( aHistoryList, history_list_storage, history_list );
166 processList( aAlreadyPlaced, already_placed_storage, already_placed );
168 adapter->
DoAddLibrary( wxT(
"-- " ) +
_(
"Recently Used" ) + wxT(
" --" ), wxEmptyString,
169 history_list,
false,
true );
171 if( !aHistoryList.empty() )
174 adapter->
DoAddLibrary( wxT(
"-- " ) +
_(
"Already Placed" ) + wxT(
" --" ), wxEmptyString,
175 already_placed,
false,
true );
177 const std::vector< wxString > libNicknames = libs->
GetLogicalLibs();
192 wxBoxSizer* sizer =
new wxBoxSizer( wxVERTICAL );
198 m_hsplitter =
new wxSplitterWindow(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
199 wxSP_LIVE_UPDATE | wxSP_NOBORDER | wxSP_3DSASH );
208 m_vsplitter =
new wxSplitterWindow(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
209 wxSP_LIVE_UPDATE | wxSP_NOBORDER | wxSP_3DSASH );
212 wxSP_LIVE_UPDATE | wxSP_NOBORDER | wxSP_3DSASH );
218 wxPanel* detailsPanel =
new wxPanel(
m_vsplitter );
219 wxBoxSizer* detailsSizer =
new wxBoxSizer( wxVERTICAL );
220 detailsPanel->SetSizer( detailsSizer );
223 detailsSizer->Add(
m_details, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
224 detailsPanel->Layout();
225 detailsSizer->Fit( detailsPanel );
231 sizer->Add(
m_vsplitter, 1, wxEXPAND | wxBOTTOM, 5 );
235 wxBoxSizer* treeSizer =
new wxBoxSizer( wxVERTICAL );
236 treePanel->SetSizer( treeSizer );
241 treeSizer->Add(
m_tree, 1, wxALL | wxEXPAND, 5 );
243 treeSizer->Fit( treePanel );
325 cfg->m_SymChooserPanel.width = GetParent()->GetSize().x;
326 cfg->m_SymChooserPanel.height = GetParent()->GetSize().y;
328 cfg->m_SymChooserPanel.sash_pos_h =
m_hsplitter->GetSashPosition();
331 cfg->m_SymChooserPanel.sash_pos_v =
m_vsplitter->GetSashPosition();
340 if( aEvent.GetKeyCode() == WXK_ESCAPE )
342 wxObject* eventSource = aEvent.GetEventObject();
344 if( wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( eventSource ) )
378 wxPanel* panel =
new wxPanel( aParent );
379 wxBoxSizer* sizer =
new wxBoxSizer( wxVERTICAL );
400 sizer->Add(
m_fp_sel_ctrl, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
403 sizer->Add(
m_fp_preview, 10, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
410 panel->SetSizer( sizer );
422 auto horizPixelsFromDU =
426 return GetParent()->ConvertDialogToPixels( sz ).x;
431 int w = panelCfg.
width > 40 ? panelCfg.
width : horizPixelsFromDU( 440 );
432 int h = panelCfg.
height > 40 ? panelCfg.
height : horizPixelsFromDU( 340 );
434 GetParent()->SetSize( wxSize( w, h ) );
435 GetParent()->Layout();
441 panelCfg.
sash_pos_h = horizPixelsFromDU( 220 );
444 panelCfg.
sash_pos_v = horizPixelsFromDU( 230 );
467 if(
m_details && e.GetKeyCode() ==
'C' && e.ControlDown() &&
468 !e.AltDown() && !e.ShiftDown() && !e.MetaDown() )
470 wxString txt =
m_details->SelectionToText();
473 if( wxTheClipboard->Open() )
475 wxTheClipboard->SetData(
new wxTextDataObject( txt ) );
476 wxTheClipboard->Flush();
477 wxTheClipboard->Close();
489 m_adapter->SetPreselectNode( aPreselect, 0 );
504 wxMouseState state = wxGetMouseState();
506 if( state.LeftIsDown() )
522 m_adapter->OpenLibs( cfg->m_LibTree.open_libs );
539 wxLogError(
_(
"Error loading symbol %s from library '%s'." ) + wxS(
"\n%s" ),
549 wxString fp_name = fp_field ? fp_field->
GetFullText() : wxString(
"" );
560 if( aFootprint == wxEmptyString )
568 if( lib_id.
Parse( aFootprint ) == -1 && lib_id.
IsValid() )
598 wxLogError(
_(
"Error loading symbol %s from library '%s'." ) + wxS(
"\n%s" ),
605 if( symbol !=
nullptr )
607 int pinCount = symbol->
GetPins( 0 , 1 ).size();
609 wxString fp_name = fp_field ? fp_field->
GetFullText() : wxString(
"" );
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
Add dark theme support to wxHtmlWindow.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
A logical library item identifier and consists of various portions much like a URI.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
bool IsValid() const
Check if this LID_ID is valid.
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Define a library symbol object.
std::vector< SCH_PIN * > GetPins(int aUnit=0, int aBodyStyle=0) const
Return a list of pin object pointers from the draw item list.
SCH_FIELD * GetFieldById(int aId) const
Return pointer to the requested field.
wxArrayString GetFPFilters() const
bool GetIsVisible() const
std::vector< wxString > GetLogicalLibs()
Return the logical library names, all of them that are pertinent to a look up done on this LIB_TABLE.
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
void SetPreselectNode(const LIB_ID &aLibId, int aUnit)
Set the symbol name to be selected if there are no search results.
void DoAddLibrary(const wxString &aNodeName, const wxString &aDesc, const std::vector< LIB_TREE_ITEM * > &aItemList, bool pinned, bool presorted)
Add the given list of symbols by alias.
void AssignIntrinsicRanks()
Sort the tree and assign ranks after adding libraries.
void SetFilter(std::function< bool(LIB_TREE_NODE &aNode)> *aFilter)
Set the symbol filter type.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
Widget displaying a tree of symbols with optional search text control and description panel....
LIB_TREE_NODE * GetCurrentTreeNode() const
LIB_TREE_MODEL_ADAPTER::SORT_MODE GetSortMode() const
wxString GetSearchString() const
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
For multi-unit symbols, if the user selects the symbol itself rather than picking an individual unit,...
void SetSearchString(const wxString &aSearchString)
Save/restore search string.
PANEL_SYMBOL_CHOOSER(SCH_BASE_FRAME *aFrame, wxWindow *aParent, const SYMBOL_LIBRARY_FILTER *aFilter, std::vector< PICKED_SYMBOL > &aHistoryList, std::vector< PICKED_SYMBOL > &aAlreadyPlaced, bool aAllowFieldEdits, bool aShowFootprints, std::function< void()> aAcceptHandler, std::function< void()> aEscapeHandler)
Create dialog to choose symbol.
wxTimer * m_dbl_click_timer
SYMBOL_PREVIEW_WIDGET * m_symbol_preview
void onSymbolSelected(wxCommandEvent &aEvent)
void showFootprintFor(const LIB_ID &aLibId)
Look up the footprint for a given symbol specified in the LIB_ID and display it.
wxSplitterWindow * m_hsplitter
FOOTPRINT_SELECT_WIDGET * m_fp_sel_ctrl
std::function< void()> m_escapeHandler
void OnDetailsCharHook(wxKeyEvent &aEvt)
static wxString g_symbolSearchString
void onCloseTimer(wxTimerEvent &aEvent)
wxSplitterWindow * m_vsplitter
std::vector< std::pair< int, wxString > > m_field_edits
wxTimer * m_open_libs_timer
void showFootprint(const wxString &aFootprint)
Display the given footprint by name.
void populateFootprintSelector(const LIB_ID &aLibId)
Populate the footprint selector for a given alias.
void onOpenLibsTimer(wxTimerEvent &aEvent)
void onFootprintSelected(wxCommandEvent &aEvent)
static wxString g_powerSearchString
void OnChar(wxKeyEvent &aEvent)
void SetPreselect(const LIB_ID &aPreselect)
std::function< void()> m_acceptHandler
static constexpr int DBLCLICK_DELAY
FOOTPRINT_PREVIEW_WIDGET * m_fp_preview
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > m_adapter
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
To be called after this dialog returns from ShowModal().
void onSymbolChosen(wxCommandEvent &aEvent)
Handle the selection of an item.
wxPanel * constructRightPanel(wxWindow *aParent)
virtual COMMON_SETTINGS * GetCommonSettings() const
virtual SETTINGS_MANAGER & GetSettingsManager() const
The backing store for a PROJECT, in JSON format.
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
virtual PROJECT_FILE & GetProjectFile() const
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
LIB_SYMBOL * GetLibSymbol(const LIB_ID &aLibId, bool aUseCacheLib=false, bool aShowErrorMsg=false)
Load symbol from symbol library table.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
wxString GetFullText(int unit=1) const
Return the text of a field.
void SetText(const wxString &aText) override
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
Helper object to filter a list of libraries.
bool GetFilterPowerSymbols() const
const wxArrayString & GetAllowedLibList() const
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
SYMBOL_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an SYMBOL_LIB_TABLE_ROW if aNickName is found in this table or in any chained fallBack table f...
static wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > Create(EDA_BASE_FRAME *aParent, LIB_TABLE *aLibs)
Factory function: create a model adapter in a reference-counting container.
bool AddLibraries(const std::vector< wxString > &aNicknames, SCH_BASE_FRAME *aFrame)
Add all the libraries in a SYMBOL_LIB_TABLE to the model.
void AddLibrary(wxString const &aLibNickname, bool pinned)
EDA_UNITS GetUserUnits() const
void delete_if(_Container &__c, _Function &&__f)
Deletes all values from __c for which __f returns true.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
PGM_BASE & Pgm()
The global Program "get" accessor.
std::vector< wxString > pinned_symbol_libs
Definition for symbol library class.
@ FOOTPRINT_FIELD
Field Name Module PCB, i.e. "16DIP300".