Allow embedded files to come from components

as well as parent containers.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20530
This commit is contained in:
Jeff Young 2025-04-23 15:11:13 +01:00
parent a590d28c8e
commit be4a851186
18 changed files with 94 additions and 71 deletions

View File

@ -60,7 +60,7 @@ static const wxFileTypeInfo EDAfallbacks[] =
bool GetAssociatedDocument( wxWindow* aParent, const wxString& aDocName, PROJECT* aProject,
SEARCH_STACK* aPaths, EMBEDDED_FILES* aFiles )
SEARCH_STACK* aPaths, std::vector<EMBEDDED_FILES*> aFilesStack )
{
wxString docname;
wxString fullfilename;
@ -87,7 +87,7 @@ bool GetAssociatedDocument( wxWindow* aParent, const wxString& aDocName, PROJECT
}
else
{
if( !aFiles )
if( aFilesStack.empty() )
{
wxLogTrace( wxT( "KICAD_EMBED" ),
wxT( "No EMBEDDED_FILES object provided for kicad_embed URI" ) );
@ -101,9 +101,13 @@ bool GetAssociatedDocument( wxWindow* aParent, const wxString& aDocName, PROJECT
return false;
}
docname = docname.Mid( 14 );
docname = docname.Mid( wxString( FILEEXT::KiCadUriPrefix + "://" ).length() );
wxFileName temp_file = aFiles->GetTemporaryFileName( docname );
wxFileName temp_file = aFilesStack[0]->GetTemporaryFileName( docname );
int ii = 1;
while( !temp_file.IsOk() && ii < (int) aFilesStack.size() )
temp_file = aFilesStack[ii++]->GetTemporaryFileName( docname );
if( !temp_file.IsOk() )
{
@ -114,7 +118,8 @@ bool GetAssociatedDocument( wxWindow* aParent, const wxString& aDocName, PROJECT
wxLogTrace( wxT( "KICAD_EMBED" ),
wxT( "Opening embedded file '%s' as '%s'" ),
docname, temp_file.GetFullPath() );
docname,
temp_file.GetFullPath() );
docname = temp_file.GetFullPath();
}
}

View File

@ -331,12 +331,12 @@ class TEXT_BUTTON_URL : public wxComboCtrl
{
public:
TEXT_BUTTON_URL( wxWindow* aParent, DIALOG_SHIM* aParentDlg, SEARCH_STACK* aSearchStack,
EMBEDDED_FILES* aFiles ) :
std::vector<EMBEDDED_FILES*> aFilesStack ) :
wxComboCtrl( aParent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 0, 0 ),
wxTE_PROCESS_ENTER | wxBORDER_NONE ),
m_dlg( aParentDlg ),
m_searchStack( aSearchStack ),
m_files( aFiles )
m_filesStack( aFilesStack )
{
UpdateButtonBitmaps();
@ -381,7 +381,7 @@ protected:
if( customize.GetEmbed() )
{
EMBEDDED_FILES::EMBEDDED_FILE* result = m_files->AddFile( fn, false );
EMBEDDED_FILES::EMBEDDED_FILE* result = m_filesStack[0]->AddFile( fn, false );
SetValue( result->GetLink() );
}
else
@ -392,7 +392,7 @@ protected:
}
else
{
GetAssociatedDocument( m_dlg, GetValue(), &m_dlg->Prj(), m_searchStack, m_files );
GetAssociatedDocument( m_dlg, GetValue(), &m_dlg->Prj(), m_searchStack, m_filesStack );
}
m_dlg->CleanupAfterModalSubDialog();
@ -413,15 +413,15 @@ protected:
}
protected:
DIALOG_SHIM* m_dlg;
SEARCH_STACK* m_searchStack;
EMBEDDED_FILES* m_files;
DIALOG_SHIM* m_dlg;
SEARCH_STACK* m_searchStack;
std::vector<EMBEDDED_FILES*> m_filesStack;
};
void GRID_CELL_URL_EDITOR::Create( wxWindow* aParent, wxWindowID aId, wxEvtHandler* aEventHandler )
{
m_control = new TEXT_BUTTON_URL( aParent, m_dlg, m_searchStack, m_files );
m_control = new TEXT_BUTTON_URL( aParent, m_dlg, m_searchStack, m_filesStack );
WX_GRID::CellEditorSetMargins( Combo() );
#if wxUSE_VALIDATORS

View File

@ -146,7 +146,7 @@ DIALOG_LABEL_PROPERTIES::DIALOG_LABEL_PROPERTIES( SCH_EDIT_FRAME* aParent,
m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
m_grid->SetTable( m_fields );
m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this, nullptr,
m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this, {},
[&]( wxCommandEvent& aEvent )
{
OnAddField( aEvent );

View File

@ -75,9 +75,9 @@ DIALOG_LIB_SYMBOL_PROPERTIES::DIALOG_LIB_SYMBOL_PROPERTIES( SYMBOL_EDIT_FRAME* a
// Give a bit more room for combobox editors
m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
m_fields = new FIELDS_GRID_TABLE( this, aParent, m_grid, m_libEntry,
m_embeddedFiles->GetLocalFiles() );
{ m_embeddedFiles->GetLocalFiles() } );
m_grid->SetTable( m_fields );
m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this, aLibEntry,
m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this, { m_embeddedFiles->GetLocalFiles() },
[&]( wxCommandEvent& aEvent )
{
OnAddField( aEvent );

View File

@ -72,7 +72,7 @@ DIALOG_SHEET_PROPERTIES::DIALOG_SHEET_PROPERTIES( SCH_EDIT_FRAME* aParent, SCH_S
m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
m_grid->SetTable( m_fields );
m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this, &aParent->Schematic(),
m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this, { &aParent->Schematic() },
[&]( wxCommandEvent& aEvent )
{
OnAddField( aEvent );

View File

@ -78,13 +78,13 @@ enum
class FIELDS_EDITOR_GRID_TRICKS : public GRID_TRICKS
{
public:
FIELDS_EDITOR_GRID_TRICKS( DIALOG_SHIM* aParent, WX_GRID* aGrid,
wxDataViewListCtrl* aFieldsCtrl,
FIELDS_EDITOR_GRID_DATA_MODEL* aDataModel ) :
FIELDS_EDITOR_GRID_TRICKS( DIALOG_SHIM* aParent, WX_GRID* aGrid, wxDataViewListCtrl* aFieldsCtrl,
FIELDS_EDITOR_GRID_DATA_MODEL* aDataModel, EMBEDDED_FILES* aFiles ) :
GRID_TRICKS( aGrid ),
m_dlg( aParent ),
m_fieldsCtrl( aFieldsCtrl ),
m_dataModel( aDataModel )
m_dataModel( aDataModel ),
m_files( aFiles )
{}
protected:
@ -118,8 +118,7 @@ protected:
// pick a footprint using the footprint picker.
wxString fpid = m_grid->GetCellValue( row, col );
if( KIWAY_PLAYER* frame = m_dlg->Kiway().Player( FRAME_FOOTPRINT_CHOOSER, true,
m_dlg ) )
if( KIWAY_PLAYER* frame = m_dlg->Kiway().Player( FRAME_FOOTPRINT_CHOOSER, true, m_dlg ) )
{
if( frame->ShowModal( &fpid, m_dlg ) )
m_grid->SetCellValue( row, col, fpid );
@ -131,7 +130,7 @@ protected:
{
wxString datasheet_uri = m_grid->GetCellValue( row, col );
GetAssociatedDocument( m_dlg, datasheet_uri, &m_dlg->Prj(),
PROJECT_SCH::SchSearchS( &m_dlg->Prj() ) );
PROJECT_SCH::SchSearchS( &m_dlg->Prj() ), { m_files } );
}
else
{
@ -168,9 +167,11 @@ protected:
}
}
DIALOG_SHIM* m_dlg;
wxDataViewListCtrl* m_fieldsCtrl;
private:
DIALOG_SHIM* m_dlg;
wxDataViewListCtrl* m_fieldsCtrl;
FIELDS_EDITOR_GRID_DATA_MODEL* m_dataModel;
EMBEDDED_FILES* m_files;
};
@ -244,7 +245,7 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent,
wxGridCellAttr* attr = new wxGridCellAttr;
attr->SetEditor( new GRID_CELL_URL_EDITOR( this, PROJECT_SCH::SchSearchS( &Prj() ),
&m_parent->Schematic() ) );
{ &m_parent->Schematic() } ) );
m_dataModel = new FIELDS_EDITOR_GRID_DATA_MODEL( m_symbolsList, attr );
LoadFieldNames(); // loads rows into m_fieldsCtrl and columns into m_dataModel
@ -284,7 +285,7 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent,
// add Cut, Copy, and Paste to wxGrid
m_grid->PushEventHandler( new FIELDS_EDITOR_GRID_TRICKS( this, m_grid, m_fieldsCtrl,
m_dataModel ) );
m_dataModel, &m_parent->Schematic() ) );
// give a bit more room for comboboxes
m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
@ -443,7 +444,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::SetupColumnProperties( int aCol )
{
// set datasheet column viewer button
attr->SetEditor( new GRID_CELL_URL_EDITOR( this, PROJECT_SCH::SchSearchS( &Prj() ),
&m_parent->Schematic() ) );
{ &m_parent->Schematic() } ) );
m_dataModel->SetColAttr( attr, aCol );
}
else if( m_dataModel->ColIsQuantity( aCol ) || m_dataModel->ColIsItemNumber( aCol ) )

View File

@ -327,7 +327,7 @@ DIALOG_SYMBOL_PROPERTIES::DIALOG_SYMBOL_PROPERTIES( SCH_EDIT_FRAME* aParent,
// so we need to handle m_part == nullptr
// wxASSERT( m_part );
m_fields = new FIELDS_GRID_TABLE( this, aParent, m_fieldsGrid, m_symbol, &aParent->Schematic() );
m_fields = new FIELDS_GRID_TABLE( this, aParent, m_fieldsGrid, m_symbol );
// Give a bit more room for combobox editors
m_fieldsGrid->SetDefaultRowSize( m_fieldsGrid->GetDefaultRowSize() + 4 );
@ -335,7 +335,7 @@ DIALOG_SYMBOL_PROPERTIES::DIALOG_SYMBOL_PROPERTIES( SCH_EDIT_FRAME* aParent,
m_fieldsGrid->SetTable( m_fields );
m_fieldsGrid->PushEventHandler( new FIELDS_GRID_TRICKS( m_fieldsGrid, this,
&aParent->Schematic(),
{ &aParent->Schematic(), m_part },
[&]( wxCommandEvent& aEvent )
{
OnAddField( aEvent );

View File

@ -131,12 +131,12 @@ static wxString netList( LIB_SYMBOL* aSymbol )
FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_BASE_FRAME* aFrame, WX_GRID* aGrid,
LIB_SYMBOL* aSymbol, EMBEDDED_FILES* aFiles ) :
LIB_SYMBOL* aSymbol, std::vector<EMBEDDED_FILES*> aFilesStack ) :
m_frame( aFrame ),
m_dialog( aDialog ),
m_parentType( SCH_SYMBOL_T ),
m_part( aSymbol ),
m_files( aFiles ),
m_filesStack( aFilesStack ),
m_symbolNetlist( netList( aSymbol ) ),
m_fieldNameValidator( FIELD_T::USER ),
m_referenceValidator( FIELD_T::REFERENCE ),
@ -150,12 +150,11 @@ FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_BASE_FRAME* aFra
FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFrame, WX_GRID* aGrid,
SCH_SYMBOL* aSymbol, EMBEDDED_FILES* aFiles ) :
SCH_SYMBOL* aSymbol ) :
m_frame( aFrame ),
m_dialog( aDialog ),
m_parentType( SCH_SYMBOL_T ),
m_part( aSymbol->GetLibSymbolRef().get() ),
m_files( aFiles ),
m_symbolNetlist( netList( aSymbol, aFrame->GetCurrentSheet() ) ),
m_fieldNameValidator( FIELD_T::USER ),
m_referenceValidator( FIELD_T::REFERENCE ),
@ -164,6 +163,11 @@ FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFra
m_nonUrlValidator( FIELD_T::USER ),
m_filepathValidator( FIELD_T::SHEET_FILENAME )
{
m_filesStack.push_back( aSymbol->Schematic() );
if( m_part )
m_filesStack.push_back( m_part );
initGrid( aGrid );
}
@ -174,7 +178,6 @@ FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFra
m_dialog( aDialog ),
m_parentType( SCH_SHEET_T ),
m_part( nullptr ),
m_files( nullptr ),
m_fieldNameValidator( FIELD_T::USER ),
m_referenceValidator( FIELD_T::SHEET_NAME ),
m_valueValidator( FIELD_T::VALUE ),
@ -182,6 +185,8 @@ FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFra
m_nonUrlValidator( FIELD_T::USER ),
m_filepathValidator( FIELD_T::SHEET_FILENAME )
{
m_filesStack.push_back( aSheet->Schematic() );
initGrid( aGrid );
}
@ -199,6 +204,8 @@ FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFra
m_nonUrlValidator( FIELD_T::USER ),
m_filepathValidator( FIELD_T::USER )
{
m_filesStack.push_back( aLabel->Schematic() );
initGrid( aGrid );
}
@ -263,7 +270,7 @@ void FIELDS_GRID_TABLE::initGrid( WX_GRID* aGrid )
m_urlAttr = new wxGridCellAttr;
SEARCH_STACK* prjSearchStack = PROJECT_SCH::SchSearchS( &m_frame->Prj() );
GRID_CELL_URL_EDITOR* urlEditor = new GRID_CELL_URL_EDITOR( m_dialog, prjSearchStack, m_files );
GRID_CELL_URL_EDITOR* urlEditor = new GRID_CELL_URL_EDITOR( m_dialog, prjSearchStack, m_filesStack );
urlEditor->SetValidator( m_urlValidator );
m_urlAttr->SetEditor( urlEditor );
@ -1106,8 +1113,8 @@ void FIELDS_GRID_TRICKS::doPopupSelection( wxCommandEvent& event )
{
wxString datasheet_uri = m_grid->GetCellValue( getFieldRow( FIELD_T::DATASHEET ), FDC_VALUE );
GetAssociatedDocument( m_dlg, datasheet_uri, &m_dlg->Prj(),
PROJECT_SCH::SchSearchS( &m_dlg->Prj() ), m_files );
GetAssociatedDocument( m_dlg, datasheet_uri, &m_dlg->Prj(), PROJECT_SCH::SchSearchS( &m_dlg->Prj() ),
m_filesStack );
}
else
{

View File

@ -38,11 +38,12 @@ class SCH_LABEL_BASE;
class FIELDS_GRID_TRICKS : public GRID_TRICKS
{
public:
FIELDS_GRID_TRICKS( WX_GRID* aGrid, DIALOG_SHIM* aDialog, EMBEDDED_FILES* aFiles,
FIELDS_GRID_TRICKS( WX_GRID* aGrid, DIALOG_SHIM* aDialog,
std::vector<EMBEDDED_FILES*> aFilesStack,
std::function<void( wxCommandEvent& )> aAddHandler ) :
GRID_TRICKS( aGrid, std::move( aAddHandler ) ),
m_dlg( aDialog ),
m_files( aFiles )
m_filesStack( aFilesStack )
{}
protected:
@ -52,8 +53,8 @@ protected:
void doPopupSelection( wxCommandEvent& event ) override;
protected:
DIALOG_SHIM* m_dlg;
EMBEDDED_FILES* m_files;
DIALOG_SHIM* m_dlg;
std::vector<EMBEDDED_FILES*> m_filesStack;
};
@ -87,9 +88,9 @@ class FIELDS_GRID_TABLE : public WX_GRID_TABLE_BASE, public std::vector<SCH_FIEL
{
public:
FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_BASE_FRAME* aFrame, WX_GRID* aGrid,
LIB_SYMBOL* aSymbol, EMBEDDED_FILES* aFiles = nullptr );
LIB_SYMBOL* aSymbol, std::vector<EMBEDDED_FILES*> aFilesStack = {} );
FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFrame, WX_GRID* aGrid,
SCH_SYMBOL* aSymbol, EMBEDDED_FILES* aFiles = nullptr );
SCH_SYMBOL* aSymbol );
FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFrame, WX_GRID* aGrid,
SCH_SHEET* aSheet );
FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFrame, WX_GRID* aGrid,
@ -137,13 +138,13 @@ protected:
SCH_FIELD& getField( int aRow );
private:
SCH_BASE_FRAME* m_frame;
DIALOG_SHIM* m_dialog;
KICAD_T m_parentType;
LIB_SYMBOL* m_part;
EMBEDDED_FILES* m_files;
wxString m_symbolNetlist;
wxString m_curdir;
SCH_BASE_FRAME* m_frame;
DIALOG_SHIM* m_dialog;
KICAD_T m_parentType;
LIB_SYMBOL* m_part;
std::vector<EMBEDDED_FILES*> m_filesStack;
wxString m_symbolNetlist;
wxString m_curdir;
FIELD_VALIDATOR m_fieldNameValidator;
FIELD_VALIDATOR m_referenceValidator;

View File

@ -502,7 +502,7 @@ int SCH_INSPECTION_TOOL::RunSimulation( const TOOL_EVENT& aEvent )
int SCH_INSPECTION_TOOL::ShowDatasheet( const TOOL_EVENT& aEvent )
{
wxString datasheet;
EMBEDDED_FILES* files = nullptr;
std::vector<EMBEDDED_FILES*> filesStack;
if( m_frame->IsType( FRAME_SCH_SYMBOL_EDITOR ) )
{
@ -512,7 +512,7 @@ int SCH_INSPECTION_TOOL::ShowDatasheet( const TOOL_EVENT& aEvent )
return 0;
datasheet = symbol->GetDatasheetField().GetText();
files = symbol;
filesStack.push_back( symbol );
}
else if( m_frame->IsType( FRAME_SCH_VIEWER ) )
{
@ -522,7 +522,7 @@ int SCH_INSPECTION_TOOL::ShowDatasheet( const TOOL_EVENT& aEvent )
return 0;
datasheet = entry->GetDatasheetField().GetText();
files = entry;
filesStack.push_back( entry );
}
else if( m_frame->IsType( FRAME_SCH ) )
{
@ -537,7 +537,10 @@ int SCH_INSPECTION_TOOL::ShowDatasheet( const TOOL_EVENT& aEvent )
// Use GetShownText() to resolve any text variables, but don't allow adding extra text
// (ie: the field name)
datasheet = field->GetShownText( &symbol->Schematic()->CurrentSheet(), false );
files = symbol->Schematic();
filesStack.push_back( symbol->Schematic() );
if( symbol->GetLibSymbolRef() )
filesStack.push_back( symbol->GetLibSymbolRef().get() );
}
if( datasheet.IsEmpty() || datasheet == wxS( "~" ) )
@ -547,7 +550,7 @@ int SCH_INSPECTION_TOOL::ShowDatasheet( const TOOL_EVENT& aEvent )
else
{
GetAssociatedDocument( m_frame, datasheet, &m_frame->Prj(),
PROJECT_SCH::SchSearchS( &m_frame->Prj() ), files );
PROJECT_SCH::SchSearchS( &m_frame->Prj() ), filesStack );
}
return 0;

View File

@ -105,7 +105,7 @@ void SCH_NAVIGATE_TOOL::HypertextCommand( const wxString& aHref )
menu.Append( 1, wxString::Format( _( "Open %s" ), href ) );
if( m_frame->GetPopupMenuSelectionFromUser( menu ) == 1 )
GetAssociatedDocument( m_frame, href, &m_frame->Prj(), nullptr, &m_frame->Schematic() );
GetAssociatedDocument( m_frame, href, &m_frame->Prj(), nullptr, { &m_frame->Schematic() } );
}
}

View File

@ -45,7 +45,8 @@ class EMBEDDED_FILES;
* @param aPaths Additional paths to search for local disk datasheet files
*/
bool GetAssociatedDocument( wxWindow* aParent, const wxString& aDocName, PROJECT* aProject,
SEARCH_STACK* aPaths = nullptr, EMBEDDED_FILES* aFiles = nullptr );
SEARCH_STACK* aPaths = nullptr,
std::vector<EMBEDDED_FILES*> aFilesStack = {} );
#endif /* __INCLUDE__EDA_DOC_H__ */

View File

@ -120,8 +120,10 @@ class GRID_CELL_URL_EDITOR : public GRID_CELL_TEXT_BUTTON
{
public:
GRID_CELL_URL_EDITOR( DIALOG_SHIM* aParent, SEARCH_STACK* aSearchStack = nullptr,
EMBEDDED_FILES* aFiles = nullptr ) :
m_dlg( aParent ), m_searchStack( aSearchStack ), m_files( aFiles )
std::vector<EMBEDDED_FILES*> aFilesStack = {} ) :
m_dlg( aParent ),
m_searchStack( aSearchStack ),
m_filesStack( aFilesStack )
{ }
wxGridCellEditor* Clone() const override
@ -132,9 +134,9 @@ public:
void Create( wxWindow* aParent, wxWindowID aId, wxEvtHandler* aEventHandler ) override;
protected:
DIALOG_SHIM* m_dlg;
SEARCH_STACK* m_searchStack;
EMBEDDED_FILES* m_files;
DIALOG_SHIM* m_dlg;
SEARCH_STACK* m_searchStack;
std::vector<EMBEDDED_FILES*> m_filesStack;
};

View File

@ -84,7 +84,7 @@ DIALOG_FOOTPRINT_PROPERTIES::DIALOG_FOOTPRINT_PROPERTIES( PCB_EDIT_FRAME* aParen
m_posX.SetCoordType( ORIGIN_TRANSFORMS::ABS_X_COORD );
m_posY.SetCoordType( ORIGIN_TRANSFORMS::ABS_Y_COORD );
m_fields = new PCB_FIELDS_GRID_TABLE( m_frame, this, m_embeddedFiles->GetLocalFiles() );
m_fields = new PCB_FIELDS_GRID_TABLE( m_frame, this, { m_embeddedFiles->GetLocalFiles() } );
m_delayedErrorMessage = wxEmptyString;
m_delayedFocusGrid = nullptr;

View File

@ -151,7 +151,7 @@ DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR(
m_NoteBook->AddPage( m_3dPanel, _("3D Models"), false );
m_NoteBook->AddPage( m_embeddedFiles, _( "Embedded Files" ) );
m_fields = new PCB_FIELDS_GRID_TABLE( m_frame, this, m_embeddedFiles->GetLocalFiles() );
m_fields = new PCB_FIELDS_GRID_TABLE( m_frame, this, { m_embeddedFiles->GetLocalFiles() } );
m_privateLayers = new PRIVATE_LAYERS_GRID_TABLE( m_frame );
m_delayedErrorMessage = wxEmptyString;

View File

@ -48,8 +48,9 @@ wxArrayString g_menuOrientations;
PCB_FIELDS_GRID_TABLE::PCB_FIELDS_GRID_TABLE( PCB_BASE_FRAME* aFrame, DIALOG_SHIM* aDialog,
EMBEDDED_FILES* aFiles ) :
m_frame( aFrame ), m_dialog( aDialog ),
std::vector<EMBEDDED_FILES*> aFilesStack ) :
m_frame( aFrame ),
m_dialog( aDialog ),
m_fieldNameValidator( FIELD_T::USER ),
m_referenceValidator( FIELD_T::REFERENCE ),
m_valueValidator( FIELD_T::VALUE ),
@ -92,7 +93,7 @@ PCB_FIELDS_GRID_TABLE::PCB_FIELDS_GRID_TABLE( PCB_BASE_FRAME* aFrame, DIALOG_SHI
m_valueAttr->SetEditor( valueEditor );
m_urlAttr = new wxGridCellAttr;
GRID_CELL_URL_EDITOR* urlEditor = new GRID_CELL_URL_EDITOR( m_dialog, nullptr, aFiles );
GRID_CELL_URL_EDITOR* urlEditor = new GRID_CELL_URL_EDITOR( m_dialog, nullptr, aFilesStack );
urlEditor->SetValidator( m_urlValidator );
m_urlAttr->SetEditor( urlEditor );

View File

@ -57,7 +57,8 @@ enum PCB_FIELDS_COL_ORDER
class PCB_FIELDS_GRID_TABLE : public WX_GRID_TABLE_BASE, public std::vector<PCB_FIELD>
{
public:
PCB_FIELDS_GRID_TABLE( PCB_BASE_FRAME* aFrame, DIALOG_SHIM* aDialog, EMBEDDED_FILES* aFiles );
PCB_FIELDS_GRID_TABLE( PCB_BASE_FRAME* aFrame, DIALOG_SHIM* aDialog,
std::vector<EMBEDDED_FILES*> aFilesStack );
~PCB_FIELDS_GRID_TABLE();
int GetNumberRows() override { return (int) size(); }

View File

@ -729,7 +729,8 @@ int FOOTPRINT_EDITOR_CONTROL::ShowDatasheet( const TOOL_EVENT& aEvent )
{
// Only absolute URLs are supported
SEARCH_STACK* searchStack = nullptr;
GetAssociatedDocument( m_frame, *url, &m_frame->Prj(), searchStack, footprint );
GetAssociatedDocument( m_frame, *url, &m_frame->Prj(), searchStack,
{ m_frame->GetBoard(), footprint } );
}
}
return 0;