/* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2015-2018 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, you may find one here: * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * or you may search the http://www.gnu.org website for the version 2 license, * or you may write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ /** * @file viewlibs.cpp */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include void LIB_VIEW_FRAME::OnSelectSymbol( wxCommandEvent& aEvent ) { std::unique_lock dialogLock( DIALOG_CHOOSE_COMPONENT::g_Mutex, std::defer_lock ); // One CHOOSE_COMPONENT dialog at a time. User probaby can't handle more anyway. if( !dialogLock.try_lock() ) return; // Container doing search-as-you-type. SYMBOL_LIB_TABLE* libs = Prj().SchSymbolLibTable(); auto adapterPtr( SYMBOL_TREE_MODEL_ADAPTER::Create( libs ) ); auto adapter = static_cast( adapterPtr.get() ); const auto libNicknames = libs->GetLogicalLibs(); adapter->AddLibraries( libNicknames, this ); LIB_ALIAS *current = getSelectedAlias(); LIB_ID id; int unit = 0; if( current ) { id = current->GetLibId(); adapter->SetPreselectNode( id, unit ); } wxString dialogTitle; dialogTitle.Printf( _( "Choose Symbol (%d items loaded)" ), adapter->GetItemCount() ); DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapterPtr, m_convert, false, false, false ); if( dlg.ShowQuasiModal() == wxID_CANCEL ) return; id = dlg.GetSelectedLibId( &unit ); if( !id.IsValid() ) return; SetSelectedLibrary( id.GetLibNickname() ); SetSelectedComponent( id.GetLibItemName() ); SetUnitAndConvert( unit, 1 ); } void LIB_VIEW_FRAME::onSelectNextSymbol( wxCommandEvent& aEvent ) { wxCommandEvent evt( wxEVT_COMMAND_LISTBOX_SELECTED, ID_LIBVIEW_CMP_LIST ); int ii = m_cmpList->GetSelection(); // Select the next symbol or stop at the end of the list. if( ii != wxNOT_FOUND || ii != (int)m_cmpList->GetCount() - 1 ) ii += 1; m_cmpList->SetSelection( ii ); ProcessEvent( evt ); } void LIB_VIEW_FRAME::onSelectPreviousSymbol( wxCommandEvent& aEvent ) { wxCommandEvent evt( wxEVT_COMMAND_LISTBOX_SELECTED, ID_LIBVIEW_CMP_LIST ); int ii = m_cmpList->GetSelection(); // Select the previous symbol or stop at the beginning of list. if( ii != wxNOT_FOUND && ii != 0 ) ii -= 1; m_cmpList->SetSelection( ii ); ProcessEvent( evt ); } void LIB_VIEW_FRAME::onUpdateDocButton( wxUpdateUIEvent& aEvent ) { LIB_ALIAS* entry = getSelectedAlias(); aEvent.Enable( entry && !entry->GetDocFileName().IsEmpty() ); } void LIB_VIEW_FRAME::onViewSymbolDocument( wxCommandEvent& aEvent ) { LIB_ALIAS* entry = getSelectedAlias(); if( entry && !entry->GetDocFileName().IsEmpty() ) { SEARCH_STACK* lib_search = Prj().SchSearchS(); GetAssociatedDocument( this, entry->GetDocFileName(), lib_search ); } } void LIB_VIEW_FRAME::onSelectSymbolBodyStyle( wxCommandEvent& aEvent ) { int id = aEvent.GetId(); switch( id ) { default: case ID_LIBVIEW_DE_MORGAN_NORMAL_BUTT: m_convert = 1; break; case ID_LIBVIEW_DE_MORGAN_CONVERT_BUTT: m_convert = 2; break; } updatePreviewSymbol(); } void LIB_VIEW_FRAME::onSelectSymbolUnit( wxCommandEvent& aEvent ) { int ii = m_unitChoice->GetSelection(); if( ii < 0 ) return; m_unit = ii + 1; updatePreviewSymbol(); } void LIB_VIEW_FRAME::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) { } bool LIB_VIEW_FRAME::OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ) { return true; } void LIB_VIEW_FRAME::DisplayLibInfos() { if( m_libList && !m_libList->IsEmpty() && !m_libraryName.IsEmpty() ) { const SYMBOL_LIB_TABLE_ROW* row = Prj().SchSymbolLibTable()->FindRow( m_libraryName ); wxString title = wxString::Format( _( "Symbol Library Browser -- %s" ), row ? row->GetFullURI() : _( "no library selected" ) ); SetTitle( title ); } } void LIB_VIEW_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) { DisplayLibInfos(); UpdateStatusBar(); }