41#include <wx/checkbox.h>
43#include <wx/filedlg.h>
61 m_frame = getEditFrame<KICAD_MANAGER_FRAME>();
68 wxFileDialog dlg(
m_frame,
_(
"Create New Project" ), default_dir, wxEmptyString,
73 dlg.SetCustomizeHook( newProjectHook );
75 if( dlg.ShowModal() == wxID_CANCEL )
78 wxFileName pro( dlg.GetPath() );
83 pro.SetName( pro.GetName() + wxT(
"." ) + pro.GetExt() );
87 if( !pro.IsAbsolute() )
91 bool createNewDir =
false;
96 pro.AppendDir( pro.GetName() );
101 if( !pro.DirExists() )
106 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
107 "Make sure you have write permissions and try again." ),
115 wxString msg =
_(
"The selected folder is not empty. It is recommended that you "
116 "create projects in their own empty folder.\n\n"
117 "Do you want to continue?" );
134 wxFileName templatePath;
139 if( it !=
Pgm().GetLocalEnvVariables().end() && it->second.GetValue() != wxEmptyString )
141 templatePath.AssignDir( it->second.GetValue() );
146 it =
Pgm().GetLocalEnvVariables().find(
"KICAD_USER_TEMPLATE_DIR" );
148 if( it !=
Pgm().GetLocalEnvVariables().end() && it->second.GetValue() != wxEmptyString )
150 templatePath.AssignDir( it->second.GetValue() );
155 if( ps->ShowModal() != wxID_OK )
160 wxMessageBox(
_(
"No project template was selected. Cannot generate new project." ),
161 _(
"Error" ), wxOK | wxICON_ERROR,
m_frame );
167 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
168 wxString title =
_(
"New Project Folder" );
170 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
174 dlg.SetCustomizeHook( newProjectHook );
176 if( dlg.ShowModal() == wxID_CANCEL )
179 wxFileName fn( dlg.GetPath() );
184 fn.SetName( fn.GetName() + wxT(
"." ) + fn.GetExt() );
188 if( !fn.IsAbsolute() )
191 bool createNewDir =
false;
196 fn.AppendDir( fn.GetName() );
200 if( !fn.DirExists() )
205 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
206 "Make sure you have write permissions and try again." ),
213 if( !fn.IsDirWritable() )
217 msg.Printf(
_(
"Insufficient permissions to write to folder '%s'." ), fn.GetPath() );
218 wxMessageDialog msgDlg(
m_frame, msg,
_(
"Error" ), wxICON_ERROR | wxOK | wxCENTER );
224 std::vector< wxFileName > destFiles;
228 std::vector<wxFileName> overwrittenFiles;
230 for(
const wxFileName& file : destFiles )
232 if( file.FileExists() )
233 overwrittenFiles.push_back( file );
236 if( !overwrittenFiles.empty() )
238 wxString extendedMsg =
_(
"Overwriting files:" ) +
"\n";
240 for(
const wxFileName& file : overwrittenFiles )
241 extendedMsg +=
"\n" + file.GetFullName();
244 _(
"Similar files already exist in the destination folder." ),
246 wxOK | wxCANCEL | wxICON_WARNING );
247 msgDlg.SetExtendedMessage( extendedMsg );
248 msgDlg.SetOKLabel(
_(
"Overwrite" ) );
262 wxMessageDialog createDlg(
m_frame,
263 _(
"A problem occurred creating new project from template." ),
265 wxOK | wxICON_ERROR );
267 if( !errorMsg.empty() )
268 createDlg.SetExtendedMessage( errorMsg );
270 createDlg.ShowModal();
286 wxFileDialog dlg(
m_frame,
_(
"Open Existing Project" ), aDefaultDir, wxEmptyString, wildcard,
287 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
289 if( dlg.ShowModal() == wxID_CANCEL )
292 wxFileName pro( dlg.GetPath() );
294 if( !pro.IsAbsolute() )
297 if( !pro.FileExists() )
335 wxExecute( *aEvent.
Parameter<wxString*>(), wxEXEC_ASYNC );
343 const wxString& aSrcProjectDirPath,
344 const wxString& aSrcProjectName,
345 const wxString& aNewProjectDirPath,
346 const wxString& aNewProjectName ) :
355 virtual wxDirTraverseResult
OnFile(
const wxString& aSrcFilePath )
override
359 return wxDIR_CONTINUE;
361 wxFileName destFile( aSrcFilePath );
362 wxString ext = destFile.GetExt();
369 wxString destPath = destFile.GetPath();
374 destFile.SetPath( destPath );
394 projectFile.
SaveAs( destFile.GetPath(), destFile.GetName() );
400 projectLocalSettings.
SaveAs( destFile.GetPath(), destFile.GetName() );
412 || destFile.GetName() ==
"sym-lib-table" )
424 || destFile.GetName() ==
"fp-lib-table" )
451 wxString destPath = destFile.GetPathWithSep();
452 wxString destName = destFile.GetName();
453 wxUniChar pathSep = wxFileName::GetPathSeparator();
455 wxString srcProjectFootprintLib = pathSep +
m_projectName +
".pretty" + pathSep;
456 wxString newProjectFootprintLib = pathSep +
m_newProjectName +
".pretty" + pathSep;
461 destPath.Replace( srcProjectFootprintLib, newProjectFootprintLib,
true );
466 destFile.SetPath( destPath );
471 return wxDIR_CONTINUE;
474 virtual wxDirTraverseResult
OnDir(
const wxString& aSrcDirPath )
override
478 return wxDIR_CONTINUE;
480 wxFileName destDir( aSrcDirPath );
481 wxString destDirPath = destDir.GetPathWithSep();
482 wxUniChar pathSep = wxFileName::GetPathSeparator();
488 destDir.SetPath( destDirPath );
493 if( destDir.GetExt() ==
"pretty" )
498 else if( destDir.GetExt() ==
"sym_lib_dir_extension" )
503 if( !wxMkdir( destDir.GetFullPath() ) )
510 msg.Printf(
_(
"Cannot copy folder '%s'." ), destDir.GetFullPath() );
514 return wxDIR_CONTINUE;
538 wxFileName currentProjectFile(
Prj().GetProjectFullName() );
539 wxString currentProjectDirPath = currentProjectFile.GetPath();
547 if( default_dir == currentProjectDirPath
548 || default_dir == currentProjectDirPath + wxFileName::GetPathSeparator() )
551 wxFileName default_dir_fn( default_dir );
552 default_dir_fn.RemoveLastDir();
553 default_dir = default_dir_fn.GetPath();
556 wxFileDialog dlg(
m_frame,
_(
"Save Project To" ), default_dir, wxEmptyString, wxEmptyString,
559 if( dlg.ShowModal() == wxID_CANCEL )
562 wxFileName newProjectDir( dlg.GetPath(), wxEmptyString );
564 if( !newProjectDir.IsAbsolute() )
565 newProjectDir.MakeAbsolute();
567 if( wxDirExists( newProjectDir.GetFullPath() ) )
569 msg.Printf(
_(
"'%s' already exists." ), newProjectDir.GetFullPath() );
574 if( !wxMkdir( newProjectDir.GetFullPath() ) )
576 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
577 "Please make sure you have write permissions and try again." ),
578 newProjectDir.GetPath() );
583 if( !newProjectDir.IsDirWritable() )
585 msg.Printf(
_(
"Insufficient permissions to write to folder '%s'." ),
586 newProjectDir.GetFullPath() );
587 wxMessageDialog msgDlg(
m_frame, msg,
_(
"Error!" ), wxICON_ERROR | wxOK | wxCENTER );
592 const wxString& newProjectDirPath = newProjectDir.GetFullPath();
593 const wxString& newProjectName = newProjectDir.GetDirs().Last();
594 wxDir currentProjectDir( currentProjectDirPath );
597 newProjectDirPath, newProjectName );
599 currentProjectDir.Traverse( traverser );
626 if( conditionalMenu )
627 conditionalMenu->Evaluate( dummySel );
658 const std::lock_guard<std::mutex> lock(
m_loading, std::adopt_lock );
666 wxLogError(
_(
"Application failed to load:\n" ) + err.
What() );
672 wxLogError(
_(
"Application cannot start." ) );
676 if( !player->IsVisible() )
685 if( !legacy_schematic.FileExists() || kicad_schematic.FileExists() )
686 filepath = kicad_schematic.GetFullPath();
688 filepath = legacy_schematic.GetFullPath();
695 if( !legacy_board.FileExists() || kicad_board.FileExists() )
696 filepath = kicad_board.GetFullPath();
698 filepath = legacy_board.GetFullPath();
701 if( !filepath.IsEmpty() )
703 std::vector<wxString> file_list{ filepath };
705 if( !player->OpenProjectFiles( file_list ) )
713 player->Show(
true );
717 if( player->IsIconized() )
718 player->Iconize(
false );
724 if( wxWindow::FindFocus() != player )
728 if(
Pgm().GetCommonSettings()->m_Session.remember_open_files
729 && !player->GetCurrentFileName().IsEmpty() )
731 wxFileName rfn( player->GetCurrentFileName() );
732 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
735 player->SaveWindowSettings( &windowSettings );
772 execFile =
Pgm().GetTextEditor();
778 wxFAIL_MSG(
"Execute(): unexpected request" );
780 if( execFile.IsEmpty() )
790 long pid =
ExecuteFile( execFile, param, callback );
797 wxExecute(
"osascript -e 'activate application \"" + execFile +
"\"'" );
832 if( changed.count( PCM_PACKAGE_TYPE::PT_PLUGIN ) )
834 std::string payload =
"";
840 if( changed.count( PCM_PACKAGE_TYPE::PT_LIBRARY )
857 std::string payload =
"";
866 if( changed.count( PCM_PACKAGE_TYPE::PT_COLORTHEME ) )
867 Pgm().GetSettingsManager().ReloadColorSettings();
static TOOL_ACTION zoomRedraw
static TOOL_ACTION saveAs
static TOOL_ACTION updateMenu
Implementing pcm main dialog.
const std::unordered_set< PCM_PACKAGE_TYPE > & GetChangedPackageTypes() const
void AddTemplatesPage(const wxString &aTitle, wxFileName &aPath)
Add a new page with aTitle, populated with templates from aPath.
PROJECT_TEMPLATE * GetSelectedTemplate()
wxString GetMruPath() const
bool GetCreateNewDir() 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 bool LoadFromFile(const wxString &aDirectory="")
Loads the backing file from disk and then calls Load()
static TOOL_ACTION viewDroppedGerbers
static TOOL_ACTION openDemoProject
static TOOL_ACTION editPCB
static TOOL_ACTION loadProject
static TOOL_ACTION editOtherPCB
static TOOL_ACTION newProject
static TOOL_ACTION editOtherSch
static TOOL_ACTION editSchematic
static TOOL_ACTION openTextEditor
static TOOL_ACTION openProject
static TOOL_ACTION closeProject
static TOOL_ACTION convertImage
static TOOL_ACTION editDrawingSheet
static TOOL_ACTION editFootprints
static TOOL_ACTION showPluginManager
static TOOL_ACTION showCalculator
static TOOL_ACTION viewGerbers
static TOOL_ACTION newFromTemplate
static TOOL_ACTION editSymbols
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
int OpenProject(const TOOL_EVENT &aEvent)
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
int OpenDemoProject(const TOOL_EVENT &aEvent)
int CloseProject(const TOOL_EVENT &aEvent)
int SaveProjectAs(const TOOL_EVENT &aEvent)
int NewProject(const TOOL_EVENT &aEvent)
int ViewDroppedViewers(const TOOL_EVENT &aEvent)
Imports a non kicad project from a sch/pcb dropped file.
int NewFromTemplate(const TOOL_EVENT &aEvent)
int ShowPluginManager(const TOOL_EVENT &aEvent)
Set up handlers for various events.
int UpdateMenu(const TOOL_EVENT &aEvent)
int LoadProject(const TOOL_EVENT &aEvent)
KICAD_MANAGER_FRAME * m_frame
< Pointer to the currently used edit/draw frame.
int ShowPlayer(const TOOL_EVENT &aEvent)
int Refresh(const TOOL_EVENT &aEvent)
int openProject(const wxString &aDefaultDir)
int Execute(const TOOL_EVENT &aEvent)
The main KiCad project manager frame.
void CreateNewProject(const wxFileName &aProjectFileName, bool aCreateStubFiles=true)
Creates a new project by setting up and initial project, schematic, and board files.
const wxString SchLegacyFileName()
const wxString SchFileName()
void LoadProject(const wxFileName &aProjectFileName)
std::shared_ptr< PLUGIN_CONTENT_MANAGER > GetPcm()
const wxString PcbLegacyFileName()
bool CloseProject(bool aSave)
Closes the project, and saves it if aSave is true;.
void RefreshProjectTree()
const wxString PcbFileName()
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
void DoNotShowCheckbox(wxString file, int line)
Checks the 'do not show again' setting for the dialog.
virtual void Reset() override
Reloads global state.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
static wxString GetStockDemosPath()
Gets the stock (install) demos path.
The backing store for a PROJECT, in JSON format.
bool SaveAs(const wxString &aDirectory, const wxString &aFile)
bool SaveToFile(const wxString &aDirectory="", bool aForce=false) override
The project local settings are things that are attached to a particular project, but also might be pa...
bool SaveAs(const wxString &aDirectory, const wxString &aFile)
bool SaveToFile(const wxString &aDirectory="", bool aForce=false) override
void SaveFileState(const wxString &aFileName, const WINDOW_SETTINGS *aWindowCfg, bool aOpen)
size_t GetDestinationFiles(const wxFileName &aNewProjectPath, std::vector< wxFileName > &aDestFiles)
Fetch the list of destination files to be copied when the new project is created.
bool CreateProject(wxFileName &aNewProjectPath, wxString *aErrorMsg=nullptr)
Copies and renames all template files to create a new project.
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual const wxString GetProjectName() const
Return the short name of the project.
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
virtual PROJECT_FILE & GetProjectFile() const
virtual void SetElem(ELEM_T aIndex, _ELEM *aElem)
wxString m_newProjectName
KICAD_MANAGER_FRAME * m_frame
virtual wxDirTraverseResult OnFile(const wxString &aSrcFilePath) override
SAVE_AS_TRAVERSER(KICAD_MANAGER_FRAME *aFrame, const wxString &aSrcProjectDirPath, const wxString &aSrcProjectName, const wxString &aNewProjectDirPath, const wxString &aNewProjectName)
virtual wxDirTraverseResult OnDir(const wxString &aSrcDirPath) override
wxString m_projectDirPath
wxFileName GetNewProjectFile()
wxString m_newProjectDirPath
wxFileName m_newProjectFile
void OnTerminate(int pid, int status) override
TERMINATE_HANDLER(const wxString &appName)
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
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.
This file is part of the common library.
const wxString EESCHEMA_EXE
const wxString GERBVIEW_EXE
const wxString PL_EDITOR_EXE
const wxString BITMAPCONVERTER_EXE
const wxString PCBNEW_EXE
const wxString PCB_CALCULATOR_EXE
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
@ FRAME_SCH_SYMBOL_EDITOR
void KiCopyFile(const wxString &aSrcPath, const wxString &aDestPath, wxString &aErrors)
int ExecuteFile(const wxString &aEditorName, const wxString &aFileName, wxProcess *aCallback)
Call the executable file aEditorName with the parameter aFileName.
const std::string LegacyPcbFileExtension
const std::string BackupFileSuffix
const std::string KiCadSymbolLibFileExtension
const std::string LegacySchematicFileExtension
const std::string FootprintAssignmentFileExtension
const std::string GerberJobFileExtension
const std::string LegacySymbolDocumentFileExtension
const std::string DrillFileExtension
const std::string LockFilePrefix
const std::string KiCadFootprintFileExtension
const std::string LegacyProjectFileExtension
const std::string KiCadPcbFileExtension
bool IsGerberFileExtension(const wxString &ext)
const std::string LegacyFootprintLibPathExtension
const std::string ProjectLocalSettingsFileExtension
const std::string ProjectFileExtension
const std::string NetlistFileExtension
const std::string LockFileExtension
const std::string KiCadSchematicFileExtension
const std::string DrawingSheetFileExtension
const std::string SchematicSymbolFileExtension
const std::string LegacySymbolLibFileExtension
wxString AllProjectFilesWildcard()
wxString LegacyProjectFileWildcard()
wxString ProjectFileWildcard()
std::map< wxString, ENV_VAR_ITEM >::const_iterator ENV_VAR_MAP_CITER
This file contains miscellaneous commonly used macros and functions.
#define PROJECT_BACKUPS_DIR_SUFFIX
Project settings path will be <projectname> + this.
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Implement a participant in the KIWAY alchemy.
virtual void SaveFileAs(const wxString &srcProjectBasePath, const wxString &srcProjectName, const wxString &newProjectBasePath, const wxString &newProjectName, const wxString &srcFilePath, wxString &aErrors)
Saving a file under a different name is delegated to the various KIFACEs because the project doesn't ...
Stores the common settings that are saved and loaded for each window / frame.
IFACE KIFACE_BASE kiface("pcb_test_frame", KIWAY::FACE_PCB)
Definition of file extensions used in Kicad.