42#include <wx/filedlg.h>
43#include <wx/filename.h>
95 auto libSelectedCondition =
105 auto libInferredCondition =
112 auto fpSelectedCondition =
119 auto fpExportCondition =
123 return fp !=
nullptr;
126 auto canOpenExternally =
131 bool ret = !
m_frame->IsContentModified();
139 ctxMenu.AddSeparator( 10 );
141 ctxMenu.AddItem(
ACTIONS::saveAs, libSelectedCondition || fpSelectedCondition, 10 );
142 ctxMenu.AddItem(
ACTIONS::revert, libSelectedCondition || libInferredCondition, 10 );
144 ctxMenu.AddSeparator( 10 );
153 ctxMenu.AddSeparator( 100 );
159 ctxMenu.AddSeparator( 200 );
165 ctxMenu.AddSeparator( 200 );
166 ctxMenu.AddItem(
ACTIONS::openDirectory, canOpenExternally && ( libSelectedCondition || fpSelectedCondition ), 200 );
169 ctxMenu.AddSeparator( 300 );
184 const LIB_ID& aTargetLib )
202 _(
"The footprint could not be added to the selected library ('%s'). "
203 "This library is read-only." ),
217 if(
m_frame->SaveFootprint( &aFootprint ) )
229 if( !
m_frame->BeginNewFootprint( libraryName ) )
232 FOOTPRINT* newFootprint =
m_frame->CreateNewFootprint( wxEmptyString, libraryName );
239 if( !libraryName.IsEmpty() )
246 m_frame->CreateUnsavedFootprintTab();
250 m_frame->AddFootprintToBoard( newFootprint );
258 m_frame->Zoom_Automatique(
false );
259 m_frame->GetScreen()->SetContentModified();
265 m_frame->GetCanvas()->ForceRefresh();
266 m_frame->Update3DView(
true,
true );
268 m_frame->SyncLibraryTree(
false );
296 m_frame->CreateUnsavedFootprintTab();
300 m_frame->AddFootprintToBoard( newFootprint );
308 m_frame->Zoom_Automatique(
false );
309 m_frame->GetScreen()->SetContentModified();
316 m_frame->Update3DView(
true,
true );
318 m_frame->SyncLibraryTree(
false );
356 if(
m_frame->GetTargetFPID().GetLibItemName().empty() )
361 const wxString& src_libNickname =
m_frame->GetTargetFPID().GetLibNickname();
363 wxCHECK( optUri, 0 );
365 if(
m_frame->SaveLibraryAs( *optUri ) )
366 m_frame->SyncLibraryTree(
true );
383 m_frame->SyncLibraryTree(
true );
393 m_frame->SyncLibraryTree(
true );
414 if( fpID ==
m_frame->GetLoadedFPID() )
435 wxString newLib =
m_frame->GetLibTree()->GetSelectedLibId().GetLibNickname();
439 newName +=
_(
"_copy" );
444 m_frame->SyncLibraryTree(
true );
459 if( fpID ==
m_frame->GetLoadedFPID() )
466 m_frame->SyncLibraryTree(
true );
487 if( !libTool->
RenameLibrary(
_(
"Change Footprint Name" ), oldName,
488 [&](
const wxString& aNewName )
492 if( newName.IsEmpty() )
494 wxMessageBox(
_(
"Footprint must have a name." ) );
499 if( oldName != newName && adapter->FootprintExists( libraryName, newName ) )
501 msg = wxString::Format(
_(
"Footprint '%s' already exists in library '%s'." ),
502 newName, libraryName );
505 wxOK | wxCANCEL | wxICON_WARNING );
506 errorDlg.SetOKLabel(
_(
"Overwrite" ) );
517 if( newName == oldName )
522 if( fpID ==
m_frame->GetLoadedFPID() )
551 adapter->DeleteFootprint( libraryName, oldName );
567 m_frame->RenameFootprintTab( fpID,
LIB_ID( libraryName, newName ) );
569 wxDataViewItem treeItem =
m_frame->GetLibTreeAdapter()->FindItem( fpID );
586 if(
frame->DeleteFootprintFromLibrary( fpID,
true ) )
589 frame->CloseFootprintTab( fpID );
591 frame->SyncLibraryTree(
true );
600 bool is_last_fp_from_brd =
m_frame->IsCurrentFPFromBoard();
605 if( !
m_frame->ImportFootprint() )
608 if(
m_frame->GetBoard()->GetFirstFootprint() )
609 m_frame->GetBoard()->GetFirstFootprint()->ClearFlags();
611 frame()->ClearUndoRedoList();
614 if( is_last_fp_from_brd )
629 m_frame->ExportFootprint( fp );
641 wxMessageBox(
_(
"No footprint to export" ) );
648 wxString pro_dir = wxPathOnly(
m_frame->Prj().GetProjectFullName() );
653 if( !fullFileName.IsEmpty() )
674 const wxString libNickname =
m_frame->GetTargetFPID().GetUniStringLibNickname();
676 if( libNickname.IsEmpty() )
678 m_frame->ShowInfoBarError(
_(
"Select a library to compare against another." ) );
684 wxCHECK( adapter, 0 );
686 std::optional<LIBRARY_TABLE_ROW*> row = adapter->
GetRow( libNickname );
690 m_frame->ShowInfoBarError( wxString::Format(
_(
"Library '%s' is not in the footprint "
698 wxFileName currentFn = wxFileName::DirName(
700 currentFn.MakeAbsolute();
701 const wxString currentPath = currentFn.GetPath();
703 wxDirDialog dlg(
m_frame,
_(
"Choose .pretty Folder to Compare With" ), wxEmptyString,
704 wxDD_DIR_MUST_EXIST );
706 if( dlg.ShowModal() != wxID_OK )
709 wxFileName otherFn = wxFileName::DirName( dlg.GetPath() );
710 otherFn.MakeAbsolute();
712 if( otherFn.GetDirs().IsEmpty()
713 || !otherFn.GetDirs().Last().EndsWith( wxS(
".pretty" ) ) )
716 _(
"Select a KiCad footprint library folder (ends with .pretty)." ) );
720 if( otherFn.SameAs( currentFn ) )
723 _(
"Select a different .pretty folder than the active library." ) );
727 const wxString otherPath = otherFn.GetPath();
729 std::vector<std::unique_ptr<FOOTPRINT>> beforeStorage;
730 std::vector<std::unique_ptr<FOOTPRINT>> afterStorage;
735 [&](
const wxString& aPath,
736 std::vector<std::unique_ptr<FOOTPRINT>>& aOwners,
742 aOwners = std::move( loaded.first );
743 aMap = std::move( loaded.second );
749 wxString::Format(
_(
"Failed to load %s: %s" ), aPath, ioe.
What() ) );
751 catch(
const std::exception& e )
754 wxString::Format(
_(
"Failed to load %s: %s" ), aPath,
755 wxString::FromUTF8( e.what() ) ) );
761 if( !load( currentPath, beforeStorage, beforeMap ) )
764 if( !load( otherPath, afterStorage, afterMap ) )
784 wxString
path = wxEmptyString;
794 wxString fileExt = wxEmptyString;
797 if( !libItemName.IsEmpty() )
800 wxFileName fileName(
path, libItemName, fileExt );
801 wxString explorerCommand;
804 explorerCommand = cfg->m_System.file_explorer;
806 if( explorerCommand.IsEmpty() )
808 path = fileName.GetFullPath().BeforeLast( wxFileName::GetPathSeparator() );
810 if( !
path.IsEmpty() && wxDirExists(
path ) )
816 if( !explorerCommand.EndsWith(
"%F" ) )
818 wxMessageBox(
_(
"Missing/malformed file explorer argument '%F' in common settings." ) );
822 wxString escapedFilePath = fileName.GetFullPath();
823 escapedFilePath.Replace( wxS(
"\"" ), wxS(
"_" ) );
825 wxString fileArg = wxEmptyString;
826 fileArg <<
'"' << escapedFilePath <<
'"';
828 explorerCommand.Replace( wxT(
"%F" ), fileArg );
830 if( !explorerCommand.IsEmpty() )
831 wxExecute( explorerCommand );
841 if( fullEditorName.IsEmpty() )
843 wxMessageBox(
_(
"No text editor selected in KiCad. Please choose one." ) );
853 wxString libItemName = wxEmptyString;
860 libItemName = *optUri;
861 libItemName << wxFileName::GetPathSeparator();
865 if( !wxFileName::FileExists( libItemName ) )
868 ExecuteFile( fullEditorName, libItemName.wc_str(),
nullptr,
false );
880 if( !url.has_value() )
882 frame()->ShowInfoBarMsg(
_(
"No datasheet found in the footprint." ) );
889 { m_frame->GetBoard(), footprint } );
898 m_frame->LoadFootprintFromLibrary(
m_frame->GetLibTree()->GetSelectedLibId() );
915 if( !
m_frame->IsLibraryTreeShown() )
924 m_frame->ToggleLayersManager();
941 LIB_ID treeLibId =
m_frame->GetLibTree()->GetSelectedLibId();
945 && ( !
m_frame->GetBoard()->GetFirstFootprint()
946 ||
m_frame->GetBoard()->GetFirstFootprint()->GetFPID() != treeLibId ) )
957 m_frame->GetCanvas()->Refresh();
969 if( !libraryFootprint )
973 std::unique_ptr<BOARD> tempBoard(
new BOARD() );
977 tempBoard->SetDesignSettings(
m_frame->GetBoard()->GetDesignSettings() );
978 tempBoard->SetProject( &
m_frame->Prj(),
true );
980 tempBoard->SynchronizeProperties();
984 delete libraryFootprint;
986 tempBoard->Add( tempFootprint );
987 tempFootprint->
SetParent( tempBoard.get() );
998 tempBoard->Remove( tempFootprint );
1009 wxDataViewItem treeItem =
m_frame->GetLibTreeAdapter()->FindItem( oldFPID );
1010 m_frame->UpdateLibraryTree( treeItem, tempFootprint );
1011 m_frame->SyncLibraryTree(
true );
1014 delete tempFootprint;
1018 delete tempFootprint;
1099 if( ids.count( aItem->m_Uuid ) )
1103 boardItem->ResetUuid();
1106 ids.insert( aItem->m_Uuid );
1125 processItem( item );
1128 processItem( zone );
1131 processItem(
group );
1135 errors += duplicates;
1136 details += wxString::Format(
_(
"%d duplicate IDs replaced.\n" ), duplicates );
1143 wxString msg = wxString::Format(
_(
"%d potential problems repaired." ), errors );
1163 for( wxWindow* focus = wxWindow::FindFocus(); focus; focus = focus->GetParent() )
1165 if( focus == appearance )
1178 m_frame->AdvanceFootprintTab(
true );
1188 m_frame->AdvanceFootprintTab(
false );
1195 m_frame->CloseActiveFootprintTab();
1202 if(
m_frame->GetTargetFPID().GetLibNickname().empty() )
1205 if(
m_frame->HasModifiedFootprintTabs() )
1208 "the Footprint Fields Table." ) );
static TOOL_ACTION openWithTextEditor
static TOOL_ACTION revert
static TOOL_ACTION saveAs
static TOOL_ACTION openDirectory
static TOOL_ACTION showDatasheet
static TOOL_ACTION zoomFitScreen
static TOOL_ACTION showProperties
static TOOL_ACTION refreshPreview
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
const FOOTPRINTS & Footprints() const
File-compare dialog (Phase 7).
void SelectToolbarAction(const TOOL_ACTION &aAction) override
Select the given action in the toolbar group which contains it, if any.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the KIGFX::VIEW_CONTROLS instance used in the panel.
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
A base class for most all the KiCad significant classes used in schematics and boards.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual void SetParent(EDA_ITEM *aParent)
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()
Diff two .pretty footprint library directories.
static std::pair< std::vector< std::unique_ptr< FOOTPRINT > >, FOOTPRINT_MAP > LoadLibrary(const wxString &aPrettyPath)
Load a .pretty directory into a FOOTPRINT_MAP.
DOCUMENT_DIFF Diff() override
Produce a DOCUMENT_DIFF of the inputs the concrete differ was constructed with.
std::map< wxString, const FOOTPRINT * > FOOTPRINT_MAP
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
virtual void SetCrossHairCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true)=0
Move the graphic crosshair cursor to the requested position expressed in world coordinates.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
virtual bool ShowModal(wxString *aResult=nullptr, wxWindow *aResultantFocusWindow=nullptr)
Show this wxFrame as if it were a modal dialog, with all other instantiated wxFrames disabled until t...
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
Module editor specific tools.
bool RenameLibrary(const wxString &aTitle, const wxString &aName, std::function< bool(const wxString &aNewName)> aValidator)
void AddContextMenuItems(CONDITIONAL_MENU *aMenu)
std::optional< LIBRARY_TABLE_ROW * > GetRow(const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::GetRow but filtered to the LIBRARY_TABLE_TYPE of this adapter.
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false)
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
A logical library item identifier and consists of various portions much like a URI.
bool IsValid() const
Check if this LID_ID is valid.
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
const wxString GetUniStringLibNickname() const
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSEQ SeqStackupForPlotting() const
Return the sequence that is typical for a bottom-to-top stack-up.
static const LSET & AllLayersMask()
static TOOL_ACTION lineModeFree
Unconstrained angle mode (icon lines_any)
static TOOL_ACTION deleteFootprint
static TOOL_ACTION renameFootprint
static TOOL_ACTION showFootprintUsers
static TOOL_ACTION showLayersManager
static TOOL_ACTION createFootprint
static TOOL_ACTION editFootprint
static TOOL_ACTION exportFootprint
static TOOL_ACTION editTextAndGraphics
static TOOL_ACTION lineMode45
45-degree-or-orthogonal mode (icon hv45mode)
static TOOL_ACTION angleSnapModeChanged
Notification event when angle mode changes.
static TOOL_ACTION newFootprint
static TOOL_ACTION prevFootprintTab
static TOOL_ACTION importFootprint
static TOOL_ACTION pasteFootprint
static TOOL_ACTION footprintProperties
static TOOL_ACTION lineMode90
90-degree-only mode (icon lines90)
static TOOL_ACTION closeFootprintTab
static TOOL_ACTION nextFootprintTab
static TOOL_ACTION showLibFootprintFieldsTable
static TOOL_ACTION checkFootprint
static TOOL_ACTION editLibFpInFpEditor
static TOOL_ACTION duplicateFootprint
static TOOL_ACTION cutFootprint
static TOOL_ACTION repairFootprint
static TOOL_ACTION exportFootprintAsSVG
static TOOL_ACTION compareFpLibraryWithFile
static TOOL_ACTION copyFootprint
static TOOL_ACTION cleanupGraphics
APPEARANCE_CONTROLS * GetAppearancePanel()
A set of BOARD_ITEMs (i.e., without duplicates).
Parameters and options when plotting/printing a board.
void SetAutoScale(bool aFlag)
void SetScale(double aVal)
void SetColorSettings(COLOR_SETTINGS *aSettings)
void SetFormat(PLOT_FORMAT aFormat)
virtual const wxString & GetTextEditor(bool aCanShowFileChooser=true)
Return the path to the preferred text editor application.
virtual LIBRARY_MANAGER & GetLibraryManager() const
static FOOTPRINT_LIBRARY_ADAPTER * FootprintLibAdapter(PROJECT *aProject)
Look for files in a number of paths.
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
A modified version of the wxInfoBar class that allows us to:
bool HasCloseButton() const
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
Handle a list of polygons defining a copper zone.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
bool GetAssociatedDocument(wxWindow *aParent, const wxString &aDocName, PROJECT *aProject, SEARCH_STACK *aPaths, std::vector< EMBEDDED_FILES * > aFilesStack)
Open a document (file) with the suitable browser.
This file is part of the common library.
LEADER_MODE
The kind of the leader line.
@ DIRECT
Unconstrained point-to-point.
int ExecuteFile(const wxString &aEditorName, const wxString &aFileName, wxProcess *aCallback, bool aFileForKicad)
Call the executable file aEditorName with the parameter aFileName.
static const std::string SVGFileExtension
static const std::string KiCadFootprintFileExtension
static wxString SVGFileWildcard()
bool LaunchExternal(const wxString &aPath)
Launches the given file or folder in the host OS.
Class to handle a set of BOARD_ITEMs.
bool PlotFootprintToSVG(const FOOTPRINT &aFootprint, PROJECT &aProject, const std::map< wxString, wxString > *aVarOverrides, PCB_PLOT_PARAMS &aPlotOpts, const LSEQ &aLayersToPlot, const LSEQ &aLayersOnAll, const wxString &aFileName, REPORTER *aReporter)
Plot a footprint to an SVG file, with the footprint origin at the SVG origin and the page/viewBox siz...
PGM_BASE & Pgm()
The global program "get" accessor.
T * GetAppSettings(const char *aFilename)
The full set of changes between two parsed documents of one type.
wxString result
Test unit parsing edge cases and error handling.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D
Definition of file extensions used in Kicad.