kicad/pcbnew/footprint_wizard_frame_func...

284 lines
7.2 KiB
C++
Raw Normal View History

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 Miguel Angel Ajo Pelayo, miguelangel@nbee.es
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
2021-07-19 23:56:05 +00:00
* Copyright (C) 2004-2021 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
*/
2018-01-29 20:58:58 +00:00
#include <pcb_edit_frame.h>
#include <dialog_helpers.h>
#include <board.h>
#include <footprint.h>
#include <pcbnew.h>
#include <pcbnew_id.h>
#include "footprint_wizard_frame.h"
#include <wildcards_and_files_ext.h>
#include <dialogs/dialog_footprint_wizard_list.h>
#include <base_units.h>
#include <widgets/wx_grid.h>
2021-06-03 11:49:49 +00:00
#include <wx/listbox.h>
2021-06-06 12:41:16 +00:00
#include <wx/msgdlg.h>
#include <tool/tool_manager.h>
2021-07-19 23:56:05 +00:00
void FOOTPRINT_WIZARD_FRAME::Process_Special_Functions( wxCommandEvent& event )
{
wxString msg;
int page;
switch( event.GetId() )
{
case ID_FOOTPRINT_WIZARD_NEXT:
page = m_pageList->GetSelection() + 1;
if( (int)m_pageList->GetCount() <= page )
page = m_pageList->GetCount() - 1;
m_pageList->SetSelection( page, true );
ClickOnPageList( event );
break;
case ID_FOOTPRINT_WIZARD_PREVIOUS:
page = m_pageList->GetSelection() - 1;
if( page < 0 )
page = 0;
m_pageList->SetSelection( page, true );
ClickOnPageList( event );
break;
default:
wxFAIL_MSG( wxString::Format(
2021-07-19 23:56:05 +00:00
"FOOTPRINT_WIZARD_FRAME::Process_Special_Functions error: id = %d",
event.GetId() ) );
break;
}
}
/* Displays the name of the current opened library in the caption */
void FOOTPRINT_WIZARD_FRAME::DisplayWizardInfos()
{
wxString msg;
msg = _( "Footprint Wizard" );
msg << wxT( " [" );
if( !m_wizardName.IsEmpty() )
msg << m_wizardName;
else
msg += _( "no wizard selected" );
msg << wxT( "]" );
SetTitle( msg );
}
void FOOTPRINT_WIZARD_FRAME::ReloadFootprint()
{
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();
if( !footprintWizard )
return;
2019-05-27 16:16:54 +00:00
m_toolManager->ResetTools( TOOL_BASE::MODEL_RELOAD );
// Delete the current footprint
2020-11-13 15:15:52 +00:00
GetBoard()->DeleteAllFootprints();
2020-11-13 11:17:15 +00:00
// Creates the footprint
2020-11-13 15:15:52 +00:00
wxString msg;
FOOTPRINT* footprint = footprintWizard->GetFootprint( &msg );
DisplayBuildMessage( msg );
2020-11-13 02:57:11 +00:00
if( footprint )
{
// Add the object to board
2020-11-13 02:57:11 +00:00
GetBoard()->Add( footprint, ADD_MODE::APPEND );
footprint->SetPosition( wxPoint( 0, 0 ) );
}
updateView();
GetCanvas()->Refresh();
}
void FOOTPRINT_WIZARD_FRAME::DisplayBuildMessage( wxString& aMessage )
{
m_buildMessageBox->SetValue( aMessage );
}
FOOTPRINT_WIZARD* FOOTPRINT_WIZARD_FRAME::GetMyWizard()
{
if( m_wizardName.Length() == 0 )
2021-07-19 23:56:05 +00:00
return nullptr;
FOOTPRINT_WIZARD* footprintWizard = FOOTPRINT_WIZARD_LIST::GetWizard( m_wizardName );
if( !footprintWizard )
{
wxMessageBox( _( "Couldn't reload footprint wizard" ) );
2021-07-19 23:56:05 +00:00
return nullptr;
}
return footprintWizard;
}
2020-11-13 15:15:52 +00:00
FOOTPRINT* FOOTPRINT_WIZARD_FRAME::GetBuiltFootprint()
{
FOOTPRINT_WIZARD* footprintWizard = FOOTPRINT_WIZARD_LIST::GetWizard( m_wizardName );
Modular-Kicad milestone B), major portions: *) Rework the set language support, simplify it by using KIWAY. Now any major frame with a "change language" menu can change the language for all KIWAY_PLAYERs in the whole KIWAY. Multiple KIWAYs are not supported yet. *) Simplify "modal wxFrame" support, and add that support exclusively to KIWAY_PLAYER where it is inherited by all derivatives. The function KIWAY_PLAYER::ShowModal() is in the vtable and so is cross module capable. *) Remove the requirements and assumptions that the wxFrame hierarchy always had PCB_EDIT_FRAME and SCH_EDIT_FRAME as immediate parents of their viewers and editors. This is no longer the case, nor required. *) Use KIWAY::Player() everywhere to make KIWAY_PLAYERs, this registers the KIWAY_PLAYER within the KIWAY and makes it very easy to find an open frame quickly. It also gives control to the KIWAY as to frame hierarchical relationships. *) Change single_top to use the KIWAY for loading a KIFACE and instantiating the single KIWAY_PLAYER, see bullet immediately above. *) Add KIWAY::OnKiwayEnd() and call it from PGM_BASE at program termination, this gives the KIFACEs a chance to save their final configuration dope to disk. *) Add dedicated FRAME_T's for the modal frames, so m_Ident can be tested and these modal frames are distinctly different than their non-modal equivalents. KIWAY_PLAYER::IsModal() is !not! a valid test during the wxFrame's constructor, so this is another important reason for having a dedicated FRAME_T for each modal wxFrame. On balance, more lines were deleted than were added to achieve all this.
2014-05-03 17:40:19 +00:00
if( footprintWizard && m_modal_ret_val )
{
2020-11-13 15:15:52 +00:00
wxString msg;
FOOTPRINT* footprint = footprintWizard->GetFootprint( &msg );
DisplayBuildMessage( msg );
return footprint;
}
2021-07-19 23:56:05 +00:00
return nullptr;
}
void FOOTPRINT_WIZARD_FRAME::SelectFootprintWizard()
{
DIALOG_FOOTPRINT_WIZARD_LIST wizardSelector( this );
if( wizardSelector.ShowModal() != wxID_OK )
return;
FOOTPRINT_WIZARD* footprintWizard = wizardSelector.GetWizard();
if( footprintWizard )
{
m_wizardName = footprintWizard->GetName();
m_wizardDescription = footprintWizard->GetDescription();
footprintWizard->ResetParameters();
}
else
{
m_wizardName.Empty();
m_wizardDescription.Empty();
}
ReloadFootprint();
Zoom_Automatique( false );
DisplayWizardInfos();
ReCreatePageList();
ReCreateParameterList();
}
void FOOTPRINT_WIZARD_FRAME::SelectCurrentWizard( wxCommandEvent& event )
{
SelectFootprintWizard();
updateView();
}
2017-01-03 15:01:47 +00:00
void FOOTPRINT_WIZARD_FRAME::DefaultParameters( wxCommandEvent& event )
{
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();
2021-07-19 23:56:05 +00:00
if ( footprintWizard == nullptr )
2017-01-03 15:01:47 +00:00
return;
footprintWizard->ResetParameters();
// Reload
ReCreateParameterList();
ReloadFootprint();
DisplayWizardInfos();
}
2021-07-19 23:56:05 +00:00
// This is a flag to avoid reentering of ParametersUpdated
// that can happen in some cases
static bool lock_update_prms = false;
2021-07-19 23:56:05 +00:00
2012-05-16 09:35:18 +00:00
void FOOTPRINT_WIZARD_FRAME::ParametersUpdated( wxGridEvent& event )
{
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();
if( !footprintWizard )
return;
if( m_parameterGridPage < 0 )
2012-05-16 09:35:18 +00:00
return;
if( lock_update_prms )
return;
wxArrayString prmValues = footprintWizard->GetParameterValues( m_parameterGridPage );
wxArrayString ptList = footprintWizard->GetParameterTypes( m_parameterGridPage );
bool has_changed = false;
int count = m_parameterGrid->GetNumberRows();
for( int prm_id = 0; prm_id < count; ++prm_id )
{
2017-01-03 17:04:35 +00:00
wxString value = m_parameterGrid->GetCellValue( prm_id, WIZ_COL_VALUE );
if( prmValues[prm_id] != value )
{
has_changed = true;
prmValues[prm_id] = value;
}
2012-05-16 09:35:18 +00:00
}
if( has_changed )
{
wxString res = footprintWizard->SetParameterValues( m_parameterGridPage, prmValues );
if( !res.IsEmpty() )
wxMessageBox( res );
ReloadFootprint();
DisplayWizardInfos();
// The python script can have modified some other parameters.
// So rebuild the current parameter list with new values, just in case.
//
// On wxWidgets 3.0.5, ReCreateParameterList() generates a EVT_GRID_CMD_CELL_CHANGED
// that call ParametersUpdated() and creating an infinite loop
// Note also it happens **only for languages using a comma** instead of a point
// for floating point separator
// It does not happen on wxWidgets 3.1.4
//
// So lock the next call.
lock_update_prms = true;
ReCreateParameterList();
}
// unlock ParametersUpdated() now the update is finished
lock_update_prms = false;
}