70#include <wx/filedlg.h>
72#include <wx/richmsgdlg.h>
73#include <wx/stdpaths.h>
84#include "widgets/filedlg_hook_save_project.h"
97 if( aFileSet.size() != 1 )
99 msg.Printf(
"Eeschema:%s() takes only a single filename.", __WXFUNCTION__ );
104 wxString fullFileName( aFileSet[0] );
105 wxFileName wx_filename( fullFileName );
108 wxASSERT_MSG( wx_filename.IsAbsolute(), wxS(
"Path is not absolute!" ) );
112 msg.Printf(
_(
"Schematic '%s' is already open by '%s' at '%s'." ), fullFileName,
128 wxFileName pro = fullFileName;
131 bool is_new = !wxFileName::IsFileReadable( fullFileName );
137 msg.Printf(
_(
"Schematic '%s' does not exist. Do you wish to create it?" ),
140 if( !
IsOK(
this, msg ) )
144 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGING );
145 ProcessEventLocally( e );
156 SetStatusText( wxEmptyString );
160 :
_(
"Loading Schematic" ), 1 );
164 if( differentProject )
166 if( !
Prj().IsNullProject() )
177 wxFileName legacyPro( pro );
182 if( !pro.Exists() && !legacyPro.Exists() && !( aCtl &
KICTL_CREATE ) )
191 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
221 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
231 if( is_new || schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
237 if( schFileType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
239 msg.Printf(
_(
"'%s' is not a KiCad schematic file.\nUse File -> Import for "
240 "non-KiCad schematic files." ),
243 progressReporter.Hide();
249 wxFileName autoSaveFn = fullFileName;
252 autoSaveFn.ClearExt();
268 pi->SetProgressReporter( &progressReporter );
270 bool failedLoad =
false;
285 if( !pi->GetError().IsEmpty() )
288 "occurred attempting to load hierarchical sheets." ),
294 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName);
295 progressReporter.Hide();
302 msg.Printf(
_(
"Error loading schematic '%s'." ), fullFileName);
303 progressReporter.Hide();
308 catch(
const std::bad_alloc& )
310 msg.Printf(
_(
"Memory exhausted loading schematic '%s'." ), fullFileName );
311 progressReporter.Hide();
329 msg.Printf(
_(
"Failed to load '%s'." ), fullFileName );
342 _(
"An error was found when loading the schematic that has "
343 "been automatically fixed. Please save the schematic to "
344 "repair the broken file or it may not be usable with other "
345 "versions of KiCad." ) );
356 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
361 std::vector<SCH_ITEM*> deleted;
363 for(
SCH_ITEM* item : screen->Items() )
368 std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
372 wire->SetEndPoint( entry->
GetEnd() );
374 screen->Append( wire.release() );
375 deleted.push_back( item );
380 screen->Remove( item );
396 wxArrayString libNames;
400 if( !libNames.IsEmpty() )
402 if(
eeconfig()->m_Appearance.show_illegal_symbol_lib_dialog )
404 wxRichMessageDialog invalidLibDlg(
406 _(
"Illegal entry found in project file symbol library list." ),
407 _(
"Project Load Warning" ),
408 wxOK | wxCENTER | wxICON_EXCLAMATION );
409 invalidLibDlg.ShowDetailedText(
410 _(
"Symbol libraries defined in the project file symbol library "
411 "list are no longer supported and will be removed.\n\n"
412 "This may cause broken symbol library links under certain "
414 invalidLibDlg.ShowCheckBox(
_(
"Do not show this dialog again." ) );
415 invalidLibDlg.ShowModal();
417 !invalidLibDlg.IsCheckBoxChecked();
428 editor->RescueSymbolLibTableProject(
false );
438 wxFileName cacheFn = pro;
440 cacheFn.SetName( cacheFn.GetName() +
"-cache" );
443 msg.Printf(
_(
"The project symbol library cache file '%s' was not found." ),
444 cacheFn.GetFullName() );
445 extMsg =
_(
"This can result in a broken schematic under certain conditions. "
446 "If the schematic does not have any missing symbols upon opening, "
447 "save it immediately before making any changes to prevent data "
448 "loss. If there are missing symbols, either manual recovery of "
449 "the schematic or recovery of the symbol cache library file and "
450 "reloading the schematic is required." );
452 wxMessageDialog dlgMissingCache(
this, msg,
_(
"Warning" ),
453 wxOK | wxCANCEL | wxICON_EXCLAMATION | wxCENTER );
454 dlgMissingCache.SetExtendedMessage( extMsg );
455 dlgMissingCache.SetOKCancelLabels(
456 wxMessageDialog::ButtonLabel(
_(
"Load Without Cache File" ) ),
457 wxMessageDialog::ButtonLabel(
_(
"Abort" ) ) );
459 if( dlgMissingCache.ShowModal() == wxID_CANCEL )
473 "It will be converted to the new format when saved." ),
481 screen->FixLegacyPowerSymbolMismatches();
493 "It will be converted to the new format when saved." ),
498 screen->UpdateLocalLibSymbolLinks();
501 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20221002 )
504 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20221110 )
507 if(
Schematic().RootScreen()->GetFileFormatVersionAtLoad() < 20230221 )
510 screen->FixLegacyPowerSymbolMismatches();
513 screen->MigrateSimModels();
537 if(
Schematic().ConnectionGraph()->GetBusesNeedingMigration().size() > 0 )
551 "and/or trailing white space field names." ),
573 if( schFileType == SCH_IO_MGR::SCH_LEGACY )
583 wxCommandEvent changedEvt( EDA_EVT_SCHEMATIC_CHANGED );
584 ProcessEventLocally( changedEvt );
588 wxCHECK2( listener,
continue );
592 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
595 win->HandleWindowEvent( e );
597 listener->SafelyProcessEvent( e );
605 if( fn.FileExists() && !fn.IsFileWritable() )
628 wxString msg =
_(
"This operation replaces the contents of the current schematic, "
629 "which will be permanently lost.\n\n"
630 "Do you want to proceed?" );
632 if( !
IsOK(
this, msg ) )
638 wxString
path = wxPathOnly(
Prj().GetProjectFullName() );
640 wxString fileFiltersStr;
641 wxString allWildcardsStr;
643 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
645 if(
fileType == SCH_IO_MGR::SCH_KICAD ||
fileType == SCH_IO_MGR::SCH_LEGACY )
658 if( !fileFiltersStr.IsEmpty() )
659 fileFiltersStr += wxChar(
'|' );
667 fileFiltersStr =
_(
"All supported formats" ) + wxS(
"|" ) + allWildcardsStr + wxS(
"|" )
670 wxFileDialog dlg(
this,
_(
"Import Schematic" ),
path, wxEmptyString, fileFiltersStr,
671 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
674 dlg.SetCustomizeHook( importOptions );
676 if( dlg.ShowModal() == wxID_CANCEL )
696 wxFileName projectFn( dlg.GetPath() );
703 wxFileName fn = dlg.GetPath();
705 if( !fn.IsFileReadable() )
707 wxLogError(
_(
"Insufficient permissions to read file '%s'." ), fn.GetFullPath() );
711 SCH_IO_MGR::SCH_FILE_T pluginType = SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN;
713 for(
const SCH_IO_MGR::SCH_FILE_T&
fileType : SCH_IO_MGR::SCH_FILE_T_vector )
720 if( pi->CanReadSchematicFile( fn.GetFullPath() ) )
727 if( pluginType == SCH_IO_MGR::SCH_FILE_T::SCH_FILE_UNKNOWN )
729 wxLogError(
_(
"No loader can read the specified file: '%s'." ), fn.GetFullPath() );
744 wxFileName schematicFileName;
745 wxFileName oldFileName;
750 wxCHECK( screen,
false );
753 if( aSavePath.IsEmpty() )
758 oldFileName = schematicFileName;
763 if( !schematicFileName.DirExists() )
765 if( !wxMkdir( schematicFileName.GetPath() ) )
767 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
768 schematicFileName.GetFullPath(),
769 "Could not create directory: %s" + schematicFileName.GetPath() );
779 wxFileName projectFile( schematicFileName );
783 if( projectFile.FileExists() )
790 wxString tempFile = wxFileName::CreateTempFileName( wxS(
"eeschema" ) );
793 wxLogTrace(
traceAutoSave, wxS(
"Saving file " ) + schematicFileName.GetFullPath() );
799 schematicFileName.GetFullPath() );
801 if( pluginType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
802 pluginType = SCH_IO_MGR::SCH_KICAD;
808 pi->SaveSchematicFile( tempFile, aSheet, &
Schematic() );
813 msg.Printf(
_(
"Error saving schematic file '%s'.\n%s" ),
814 schematicFileName.GetFullPath(),
818 msg.Printf(
_(
"Failed to create temporary file '%s'." ),
823 wxRemoveFile( tempFile );
834 success = wxRenameFile( tempFile, schematicFileName.GetFullPath() );
838 msg.Printf(
_(
"Error saving schematic file '%s'.\n"
839 "Failed to rename temporary file '%s'." ),
840 schematicFileName.GetFullPath(),
844 msg.Printf(
_(
"Failed to rename temporary file '%s'." ),
853 wxFileName autoSaveFileName = schematicFileName;
856 if( autoSaveFileName.FileExists() )
859 wxS(
"Removing auto save file <" ) + autoSaveFileName.GetFullPath() +
862 wxRemoveFile( autoSaveFileName.GetFullPath() );
867 msg.Printf(
_(
"File '%s' saved." ), screen->
GetFileName() );
868 SetStatusText( msg, 0 );
886 bool updateFileHistory =
false;
887 bool createNewProject =
false;
891 wxFileName fn = fileName;
895 std::unordered_map<SCH_SCREEN*, wxString> filenameMap;
898 if(
Prj().IsNullProject() || aSaveAs )
901 wxCHECK(
Kiface().IsSingle() || aSaveAs,
false );
903 wxFileName newFileName;
904 wxFileName savePath(
Prj().GetProjectFullName() );
906 if( !savePath.IsOk() || !savePath.IsDirWritable() )
910 if( !savePath.IsOk() || !savePath.IsDirWritable() )
914 if( savePath.HasExt() )
917 savePath.SetName( wxEmptyString );
919 wxFileDialog dlg(
this,
_(
"Schematic Files" ), savePath.GetPath(), savePath.GetFullName(),
921 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
926 if(
Kiface().IsSingle() || aSaveAs )
928 dlg.SetCustomizeHook( newProjectHook );
931 if( dlg.ShowModal() == wxID_CANCEL )
936 if( ( !newFileName.DirExists() && !newFileName.Mkdir() ) ||
937 !newFileName.IsDirWritable() )
939 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
940 "Make sure you have write permissions and try again." ),
941 newFileName.GetPath() );
943 wxMessageDialog dlgBadPath(
this, msg,
_(
"Error" ),
944 wxOK | wxICON_EXCLAMATION | wxCENTER );
946 dlgBadPath.ShowModal();
957 updateFileHistory =
true;
965 for(
size_t i = 0; i < screens.
GetCount(); i++ )
969 wxCHECK2( screen,
continue );
980 if( tmp.FileExists() )
983 if( tmp.GetPath().IsEmpty() )
985 tmp.SetPath( newFileName.GetPath() );
987 else if( tmp.GetPath() == fn.GetPath() )
989 tmp.SetPath( newFileName.GetPath() );
991 else if( tmp.GetPath().StartsWith( fn.GetPath() ) )
995 wxString newPath = newFileName.GetPath();
996 newPath += tmp.GetPath().Right( fn.GetPath().Length() );
997 tmp.SetPath( newPath );
1001 wxS(
"Moving schematic from '%s' to '%s'." ),
1003 tmp.GetFullPath() );
1005 if( !tmp.DirExists() && !tmp.Mkdir() )
1007 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
1008 "Make sure you have write permissions and try again." ),
1009 newFileName.GetPath() );
1011 wxMessageDialog dlgBadFilePath(
this, msg,
_(
"Error" ),
1012 wxOK | wxICON_EXCLAMATION | wxCENTER );
1014 dlgBadFilePath.ShowModal();
1019 filenameMap[screen] = tmp.GetFullPath();
1027 if( !sheet.Last()->IsRootSheet() )
1028 sheet.MakeFilePathRelativeToParentSheet();
1031 else if( !fn.FileExists() )
1034 updateFileHistory =
true;
1041 if( filenameMap.empty() || !saveCopy )
1043 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1048 wxArrayString overwrittenFiles;
1049 wxArrayString lockedFiles;
1051 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1055 wxCHECK2( screen,
continue );
1058 wxFileName tmpFn = filenameMap[screen];
1063 if( tmpFn.FileExists() && !tmpFn.IsFileWritable() )
1064 lockedFiles.Add( tmpFn.GetFullPath() );
1071 if( tmpFn.FileExists() )
1072 overwrittenFiles.Add( tmpFn.GetFullPath() );
1075 if( !lockedFiles.IsEmpty() )
1077 for(
const wxString& lockedFile : lockedFiles )
1082 msg +=
"\n" + lockedFile;
1085 wxRichMessageDialog dlg(
this, wxString::Format(
_(
"Failed to save %s." ),
1087 _(
"Locked File Warning" ),
1088 wxOK | wxICON_WARNING | wxCENTER );
1089 dlg.SetExtendedMessage(
_(
"You do not have write permissions to:\n\n" ) + msg );
1095 if( !overwrittenFiles.IsEmpty() )
1097 for(
const wxString& overwrittenFile : overwrittenFiles )
1100 msg = overwrittenFile;
1102 msg +=
"\n" + overwrittenFile;
1105 wxRichMessageDialog dlg(
this,
_(
"Saving will overwrite existing files." ),
1106 _(
"Save Warning" ),
1107 wxOK | wxCANCEL | wxCANCEL_DEFAULT | wxCENTER |
1108 wxICON_EXCLAMATION );
1109 dlg.ShowDetailedText(
_(
"The following files will be overwritten:\n\n" ) + msg );
1110 dlg.SetOKCancelLabels( wxMessageDialog::ButtonLabel(
_(
"Overwrite Files" ) ),
1111 wxMessageDialog::ButtonLabel(
_(
"Abort Project Save" ) ) );
1113 if( dlg.ShowModal() == wxID_CANCEL )
1119 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1123 wxCHECK2( screen,
continue );
1126 wxFileName tmpFn = filenameMap[screen];
1130 updateFileHistory =
true;
1138 if( !sheetFileName.IsOk()
1143 sheet->
SetFileName( sheetFileName.GetFullPath() );
1147 filenameMap[screen] = tmpFn.GetFullPath();
1159 if( sheets.size() == 1 )
1165 if( !saveCopy && tmpFn.GetFullPath() != screen->
GetFileName() )
1175 if( !aSaveAs && !success )
1178 if( aSaveAs && success )
1181 if( updateFileHistory )
1192 wxCHECK2( sheet,
continue );
1199 wxCHECK2( screen,
continue );
1201 sheets.emplace_back( std::make_pair( screen->
GetUuid(), sheet->
GetName() ) );
1205 sheets.emplace_back( std::make_pair( sheet->
m_Uuid, sheet->
GetName() ) );
1209 wxASSERT( filenameMap.count(
Schematic().RootScreen() ) );
1210 wxFileName projectPath( filenameMap.at(
Schematic().RootScreen() ) );
1213 if(
Prj().IsNullProject() || ( aSaveAs && !saveCopy ) )
1218 else if( saveCopy && createNewProject )
1228 if( !
Kiface().IsSingle() )
1248 wxFileName fn = tmpFileName;
1256 bool autoSaveOk =
true;
1258 if( fn.GetPath().IsEmpty() )
1259 tmp.AssignDir(
Prj().GetProjectPath() );
1261 tmp.AssignDir( fn.GetPath() );
1269 wxString title = GetTitle();
1271 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1312 const std::map<std::string, UTF8>* aProperties )
1314 wxFileName filename( aFileName );
1315 wxFileName newfilename;
1316 SCH_IO_MGR::SCH_FILE_T
fileType = (SCH_IO_MGR::SCH_FILE_T) aFileType;
1318 wxCommandEvent changingEvt( EDA_EVT_SCHEMATIC_CHANGING );
1319 ProcessEventLocally( changingEvt );
1323 case SCH_IO_MGR::SCH_ALTIUM:
1324 case SCH_IO_MGR::SCH_CADSTAR_ARCHIVE:
1325 case SCH_IO_MGR::SCH_EAGLE:
1326 case SCH_IO_MGR::SCH_LTSPICE:
1327 case SCH_IO_MGR::SCH_EASYEDA:
1328 case SCH_IO_MGR::SCH_EASYEDAPRO:
1331 wxCHECK_MSG( filename.IsAbsolute(),
false,
1332 wxS(
"Import schematic: path is not absolute!" ) );
1343 this, std::placeholders::_1 ) );
1346 if(
eeconfig()->m_System.show_import_issues )
1351 pi->SetProgressReporter( &progressReporter );
1363 errorReporter.ShowModal();
1372 newfilename.SetPath(
Prj().GetProjectPath() );
1373 newfilename.SetName(
Prj().GetProjectName() );
1399 wxString msg = wxString::Format(
_(
"Error loading schematic '%s'." ), aFileName );
1402 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1405 catch(
const std::exception& exc )
1410 wxString msg = wxString::Format(
_(
"Unhandled exception occurred loading schematic "
1411 "'%s'." ), aFileName );
1414 msg.Printf(
_(
"Failed to load '%s'." ), aFileName );
1427 wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGED );
1428 ProcessEventLocally( e );
1432 wxCHECK2( listener,
continue );
1436 wxWindow* win =
dynamic_cast<wxWindow*
>( listener );
1439 win->HandleWindowEvent( e );
1441 listener->SafelyProcessEvent( e );
1467 if( simFrame && !simFrame->Close() )
1470 if( screen->IsContentModified() )
1493 wxLogTrace(
traceAutoSave,
"Creating auto save file %s", autoSaveFileName.GetFullPath() );
1495 wxCHECK( autoSaveFileName.IsDirWritable(),
false );
1499 std::vector< wxString > autoSavedFiles;
1501 for(
size_t i = 0; i < screens.
GetCount(); i++ )
1511 autoSavedFiles.emplace_back( fn.GetFullPath() );
1514 wxTextFile autoSaveFile( autoSaveFileName.GetFullPath() );
1516 if( autoSaveFileName.FileExists() && !wxRemoveFile( autoSaveFileName.GetFullPath() ) )
1518 wxLogTrace(
traceAutoSave,
"Error removing auto save file %s",
1519 autoSaveFileName.GetFullPath() );
1525 if( autoSavedFiles.empty() )
1528 if( !autoSaveFile.Create() )
1531 for(
const wxString& fileName : autoSavedFiles )
1533 wxLogTrace(
traceAutoSave,
"Adding auto save file %s to %s",
1534 fileName, autoSaveFileName.GetName() );
1535 autoSaveFile.AddLine( fileName );
1538 if( !autoSaveFile.Write() )
1541 wxLogTrace(
traceAutoSave,
"Auto save file '%s' written", autoSaveFileName.GetFullName() );
1547void removeFile(
const wxString& aFilename, wxArrayString& aUnremoved )
1549 wxLogTrace(
traceAutoSave, wxS(
"Removing auto save file " ) + aFilename );
1551 if( wxFileExists( aFilename ) && !wxRemoveFile( aFilename ) )
1552 aUnremoved.Add( aFilename );
1558 if( !
Pgm().IsGUI() )
1561 wxCHECK_RET( aFileName.IsOk(), wxS(
"Invalid file name!" ) );
1564 wxS(
"Checking for auto save file " ) + aFileName.GetFullPath() );
1566 if( !aFileName.FileExists() )
1570 "Well this is potentially embarrassing!\n"
1571 "It appears that the last time you were editing one or more of the schematic files\n"
1572 "were not saved properly. Do you wish to restore the last saved edits you made?" );
1574 int response = wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxYES_NO | wxICON_QUESTION,
1577 wxTextFile fileList( aFileName.GetFullPath() );
1579 if( !fileList.Open() )
1581 msg.Printf(
_(
"The file '%s' could not be opened.\n"
1582 "Manual recovery of automatically saved files is required." ),
1583 aFileName.GetFullPath() );
1585 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1589 if( response == wxYES )
1591 wxArrayString unrecoveredFiles;
1593 for( wxString fn = fileList.GetFirstLine(); !fileList.Eof(); fn = fileList.GetNextLine() )
1595 wxFileName recoveredFn = fn;
1596 wxString tmp = recoveredFn.GetName();
1600 recoveredFn.SetName( tmp );
1602 wxFileName backupFn = recoveredFn;
1606 wxLogTrace(
traceAutoSave, wxS(
"Recovering auto save file:\n"
1607 " Original file: '%s'\n"
1608 " Backup file: '%s'\n"
1609 " Auto save file: '%s'" ),
1610 recoveredFn.GetFullPath(), backupFn.GetFullPath(), fn );
1612 if( !wxFileExists( fn ) )
1614 unrecoveredFiles.Add( recoveredFn.GetFullPath() );
1618 else if( recoveredFn.Exists()
1619 && !wxCopyFile( recoveredFn.GetFullPath(), backupFn.GetFullPath() ) )
1621 unrecoveredFiles.Add( recoveredFn.GetFullPath() );
1624 else if( !wxRenameFile( fn, recoveredFn.GetFullPath() ) )
1626 unrecoveredFiles.Add( recoveredFn.GetFullPath() );
1630 if( !unrecoveredFiles.IsEmpty() )
1632 msg =
_(
"The following automatically saved file(s) could not be restored\n" );
1634 for(
size_t i = 0; i < unrecoveredFiles.GetCount(); i++ )
1635 msg += unrecoveredFiles[i] + wxS(
"\n" );
1637 msg +=
_(
"Manual recovery will be required to restore the file(s) above." );
1638 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
1642 wxArrayString unremovedFiles;
1643 removeFile( aFileName.GetFullPath(), unremovedFiles );
1645 if( !unremovedFiles.IsEmpty() )
1647 msg.Printf(
_(
"The autosave file '%s' could not be removed.\n"
1648 "Manual removal will be required." ),
1649 unremovedFiles[0] );
1651 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1663 if( !
Pgm().IsGUI() )
1666 wxCHECK_RET( aFileName.IsOk(), wxS(
"Invalid file name!" ) );
1668 if( !aFileName.FileExists() )
1671 wxTextFile fileList( aFileName.GetFullPath() );
1672 wxArrayString unremovedFiles;
1674 for( wxString fn = fileList.GetFirstLine(); !fileList.Eof(); fn = fileList.GetNextLine() )
1677 removeFile( aFileName.GetFullPath(), unremovedFiles );
1679 if( !unremovedFiles.IsEmpty() )
1681 wxString msg =
_(
"The following automatically saved file(s) could not be removed\n" );
1683 for(
size_t i = 0; i < unremovedFiles.GetCount(); i++ )
1684 msg += unremovedFiles[i] + wxS(
"\n" );
1686 msg +=
_(
"Manual removal will be required for the file(s) above." );
1687 wxMessageBox( msg,
Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
this );
1694 static wxString autoSaveFileName( wxS(
"#auto_saved_files#" ) );
1696 return autoSaveFileName;
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
static TOOL_ACTION zoomFitScreen
bool IsContentModified() const
void SetVirtualPageNumber(int aPageNumber)
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
void SetContentModified(bool aModified=true)
Class DIALOG_HTML_REPORTER.
WX_HTML_REPORT_BOX * m_Reporter
static std::vector< IMPORT_PROJECT_DESC > RunModal(wxWindow *aParent, const std::vector< IMPORT_PROJECT_DESC > &aProjectDesc)
Create and show a dialog (modal) and returns the data from it after completion.
Handle the graphic items list to draw/plot the frame and title block.
static DS_DATA_MODEL & GetTheInstance()
static function: returns the instance of DS_DATA_MODEL used in the application
void LoadWindowState(const wxString &aFileName)
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
SETTINGS_MANAGER * GetSettingsManager() const
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
wxString GetMruPath() const
bool IsWritable(const wxFileName &aFileName, bool aVerbose=true)
Checks if aFileName can be written.
std::unique_ptr< LOCKFILE > m_file_checker
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
void RefreshCanvas() override
bool LockFile(const wxString &aFileName)
Mark a schematic file as being in use.
A base class for most all the KiCad significant classes used in schematics and boards.
EE_TYPE OfType(KICAD_T aType) const
bool GetCreateNewProject() const
Gets if this hook has attached controls to a dialog box.
bool IsAttachedToDialog() const
bool GetShowIssues() const
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()
virtual const wxString Problem() const
what was the problem?
APP_SETTINGS_BASE * KifaceSettings() const
bool IsSingle() const
Is this KIFACE running under single_top?
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
static REPORTER & GetInstance()
static wxString GetDefaultUserProjectsPath()
Gets the default path we point users to create projects.
A small class to help profiling.
void Show(std::ostream &aStream=std::cerr)
Print the elapsed time (in a suitable unit) to a stream.
Plugin class for import plugins that support choosing a project.
std::vector< FILE_INFO_PAIR > & GetSheets()
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
static SYMBOL_LIBS * SchLibs(PROJECT *aProject)
virtual void SetReadOnly(bool aReadOnly=true)
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual void SetElem(PROJECT::ELEM aIndex, _ELEM *aElem)
virtual PROJECT_FILE & GetProjectFile() const
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
void Reset()
Initialize this schematic to a blank one, unloading anything existing.
void ResolveERCExclusionsPostUpdate()
Update markers to match recorded exclusions.
CONNECTION_GRAPH * ConnectionGraph() const override
void FixupJunctions()
Add junctions to this schematic where required.
SCH_SHEET_LIST Hierarchy() const override
Return the full schematic flattened hierarchical sheet list.
void SetRoot(SCH_SHEET *aRootSheet)
Initialize the schematic with a new root sheet.
void SetProject(PROJECT *aPrj)
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void SyncView()
Mark all items for refresh.
EESCHEMA_SETTINGS * eeconfig() const
Class for a bus to bus entry.
VECTOR2I GetPosition() const override
void DisplaySheet(SCH_SCREEN *aScreen)
Handle actions specific to the schematic editor.
bool IsContentModified() const override
Get if the current schematic has been modified but not saved.
const wxString & getAutoSaveFileName() const
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
void SaveProjectLocalSettings() override
Save changes to the project settings to the project (.pro) file.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl=0) override
Open a project or set of files given by aFileList.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
void SetScreen(BASE_SCREEN *aScreen) override
bool AskToSaveChanges()
Check if any of the screens has unsaved changes and asks the user whether to save or drop them.
bool doAutoSave() override
Save the schematic files that have been modified and not yet saved.
void UpdateHierarchyNavigator(bool aRefreshNetNavigator=true)
Update the hierarchy navigation tree and history.
std::vector< wxEvtHandler * > m_schematicChangeListeners
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
void updateTitle()
Set the main window title bar text.
bool saveSchematicFile(SCH_SHEET *aSheet, const wxString &aSavePath)
Save aSheet to a schematic file.
bool LoadProjectSettings()
Load the KiCad project file (*.pro) settings specific to Eeschema.
void RecomputeIntersheetRefs()
Update the schematic's page reference map for all global labels, and refresh the labels so that they ...
bool updateAutoSaveFile()
bool importFile(const wxString &aFileName, int aFileType, const std::map< std::string, UTF8 > *aProperties=nullptr)
Load the given filename but sets the path to the current project path.
void LoadDrawingSheet()
Load the drawing sheet file.
virtual void DeleteAutoSaveFile(const wxFileName &aFileName) override
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
void ClearRepeatItemsList()
Clear the list of items which are to be repeated with the insert key.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags)
Generate the connection data for the entire schematic hierarchy.
void initScreenZoom()
Initialize the zoom value of the current screen and mark the screen as zoom-initialized.
void OnImportProject(wxCommandEvent &event)
virtual void CheckForAutoSaveFile(const wxFileName &aFileName) override
This overloaded version checks if the auto save master file "#auto_saved_files#" exists and recovers ...
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
wxString GetCurrentFileName() const override
Get the full filename + path of the currently opened file in the frame.
void TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
bool SaveProject(bool aSaveAs=false)
Save the currently-open schematic (including its hierarchy) and associated project.
void saveProjectSettings() override
Saves any design-related project settings associated with this frame.
static SCH_FILE_T GuessPluginTypeFromSchPath(const wxString &aSchematicPath, int aCtl=0)
Return a plugin type given a schematic using the file extension of aSchematicPath.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
SCH_SCREEN * GetScreen(unsigned int aIndex) const
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in the full schematic.
void PruneOrphanedSheetInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
void BuildClientSheetPathList()
built the list of sheet paths sharing a screen for each screen in use
bool HasSymbolFieldNamesWithWhiteSpace() const
void PruneOrphanedSymbolInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
bool HasNoFullyDefinedLibIds()
Test all of the schematic symbols to see if all LIB_ID objects library nickname is not set.
SCH_SHEET * GetSheet(unsigned int aIndex) const
int ReplaceDuplicateTimeStamps()
Test all sheet and symbol objects in the schematic for duplicate time stamps and replaces them as nec...
void ClearDrawingState()
Clear the state flags of all the items in the screen.
std::vector< SCH_SHEET_PATH > & GetClientSheetPaths()
Return the number of times this screen is used.
void TestDanglingEnds(const SCH_SHEET_PATH *aPath=nullptr, std::function< void(SCH_ITEM *)> *aChangedHandler=nullptr) const
Test all of the connectable objects in the schematic for unused connection points.
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
const wxString & GetFileName() const
const KIID & GetUuid() const
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
int GetFileFormatVersionAtLoad() const
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void UpdateSheetInstanceData(const std::vector< SCH_SHEET_INSTANCE > &aSheetInstances)
Update all of the sheet instance information using aSheetInstances.
void SetInitialPageNumbers()
Set initial sheet page numbers.
bool AllSheetPageNumbersEmpty() const
Check all of the sheet instance for empty page numbers.
bool IsModified() const
Check the entire hierarchy for any modifications.
void UpdateSymbolInstanceData(const std::vector< SCH_SYMBOL_INSTANCE > &aSymbolInstances)
Update all of the symbol instance information using aSymbolInstances.
void CheckForMissingSymbolInstances(const wxString &aProjectName)
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
void UpdateAllScreenReferences() const
Update all the symbol references for this sheet path.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void SetFileName(const wxString &aFilename)
wxString GetFileName() const
Return the filename corresponding to this sheet.
void SetName(const wxString &aName)
SCH_SCREEN * GetScreen() const
void SaveProjectAs(const wxString &aFullPath, PROJECT *aProject=nullptr)
Sets the currently loaded project path and saves it (pointers remain valid) Note that this will not m...
void SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Saves a copy of the current project under the given path.
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Saves a loaded project.
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads a project or sets up a new project with a specified path.
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Saves, unloads and unregisters the given PROJECT.
bool TriggerBackupIfNeeded(REPORTER &aReporter) const
Calls BackupProject if a new backup is needed according to the current backup policy.
The SIMULATOR_FRAME holds the main user-interface for running simulations.
A collection of SYMBOL_LIB objects.
static void SetLibNamesAndPaths(PROJECT *aProject, const wxString &aPaths, const wxArrayString &aNames)
static void GetLibNamesAndPaths(PROJECT *aProject, wxString *aPaths, wxArrayString *aNames=nullptr)
static void ResolvePossibleSymlinks(wxFileName &aFilename)
void Flush()
Build the HTML messages page.
bool HasMessage() const override
Returns true if the reporter client is non-empty.
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
@ OUTDATED_SAVE
OUTDATED_SAVE Messages that should be cleared on save.
void QueueShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION)
Send the infobar an event telling it to show a message.
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
MESSAGE_TYPE GetMessageType() const
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
A wrapper for reporting to a wxString object.
const wxString & GetMessages() const
wxString EnsureFileExtension(const wxString &aFilename, const wxString &aExtension)
It's annoying to throw up nag dialogs when the extension isn't right.
bool AskOverrideLock(wxWindow *aParent, const wxString &aMessage)
Display a dialog indicating the file is already open, with an option to reset the lock.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
static bool empty(const wxTextEntryBase *aCtrl)
void removeFile(const wxString &aFilename, wxArrayString &aUnremoved)
static const std::string ProjectFileExtension
static const std::string LegacyProjectFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string LegacySymbolLibFileExtension
static const std::string BackupFileSuffix
static const std::string AutoSaveFilePrefix
static wxString KiCadSchematicFileWildcard()
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
const wxChar *const tracePathsAndFiles
Flag to enable path and file name debug output.
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
#define KICTL_CREATE
caller thinks requested project files may not exist.
#define KICTL_REVERT
reverting to a previously-saved (KiCad) file.
#define KICTL_KICAD_ONLY
chosen file is from KiCad according to user
PGM_BASE & Pgm()
The global Program "get" accessor.
#define SEXPR_SCHEMATIC_FILE_VERSION
Schematic file version.
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
KIWAY Kiway(KFCTL_STANDALONE)
std::vector< FAB_LAYER_COLOR > dummy
MODEL3D_FORMAT_TYPE fileType(const char *aFileName)
bool show_import_issues
Stored value for "show import issues" when importing non-KiCad designs to this application.
bool show_illegal_symbol_lib_dialog
Container that describes file type info.
std::vector< std::string > m_FileExtensions
Filter used for file pickers if m_IsFile is true.
bool m_CanRead
Whether the IO can read this file type.
wxString FileFilter() const
Definition for symbol library class.
wxLogTrace helper definitions.
wxString formatWildcardExt(const wxString &aWildcard)
Format wildcard extension to support case sensitive file dialogs.
Definition of file extensions used in Kicad.