50#include <wx/filedlg.h>
77 wxString default_filename = aFileName ? *aFileName : wxString();
79 wxString default_dir =
m_frame->GetMruPath();
80 wxFileDialog dlg(
m_frame,
_(
"Create New Project" ), default_dir, default_filename,
82 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
88 dlg.SetCustomizeHook( newProjectHook );
90 if( dlg.ShowModal() == wxID_CANCEL )
93 wxFileName pro( dlg.GetPath() );
98 pro.SetName( pro.GetName() + wxT(
"." ) + pro.GetExt() );
102 if( !pro.IsAbsolute() )
106 bool createNewDir =
false;
111 pro.AppendDir( pro.GetName() );
116 if( !pro.DirExists() )
121 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
122 "Make sure you have write permissions and try again." ),
130 wxString msg =
_(
"The selected folder is not empty. It is recommended that you "
131 "create projects in their own empty folder.\n\n"
132 "Do you want to continue?" );
146 if( it ==
Pgm().GetLocalEnvVariables().
end() || it->second.GetValue() == wxEmptyString )
149 wxFileName templatePath;
150 templatePath.AssignDir( it->second.GetValue() );
151 templatePath.AppendDir(
"default" );
153 if( templatePath.DirExists() )
156 if( !templatePath.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL ) )
159 wxFileName metaDir = templatePath;
162 if( !metaDir.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL ) )
165 wxFileName infoFile = metaDir;
167 wxFFile
info( infoFile.GetFullPath(), wxT(
"w" ) );
169 if( !
info.IsOpened() )
172 info.Write( wxT(
"<html><head><title>Default</title></head><body></body></html>" ) );
175 wxFileName proFile = templatePath;
176 proFile.SetFullName( wxT(
"default.kicad_pro" ) );
177 wxFFile proj( proFile.GetFullPath(), wxT(
"w" ) );
179 if( !proj.IsOpened() )
182 proj.Write( wxT(
"{}" ) );
192 if( !defaultTemplate.IsOk() )
199 m_frame->CreateNewProject( pro );
206 std::vector<std::pair<wxString, wxFileName>> titleDirList;
207 wxFileName templatePath;
211 if( itUser !=
Pgm().GetLocalEnvVariables().
end() && itUser->second.GetValue() != wxEmptyString )
213 templatePath.AssignDir( itUser->second.GetValue() );
214 titleDirList.emplace_back(
_(
"User Templates" ), templatePath );
218 wxT(
"TEMPLATE_DIR" ) );
220 if( v && !v->IsEmpty() )
222 templatePath.AssignDir( *v );
223 titleDirList.emplace_back(
_(
"System Templates" ), templatePath );
227 titleDirList, defaultTemplate );
235 if(
result == wxID_APPLY )
239 if( !projectToEdit.IsEmpty() && wxFileExists( projectToEdit ) )
241 m_frame->LoadProject( wxFileName( projectToEdit ) );
251 if( !selectedTemplate )
254 if( !selectedTemplate )
256 wxMessageBox(
_(
"No project template was selected. Cannot generate new project." ),
_(
"Error" ),
257 wxOK | wxICON_ERROR,
m_frame );
262 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
263 wxString title =
_(
"New Project Folder" );
265 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
270 dlg.SetCustomizeHook( newProjectHook );
272 if( dlg.ShowModal() == wxID_CANCEL )
275 wxFileName fn( dlg.GetPath() );
278 fn.SetName( fn.GetName() + wxT(
"." ) + fn.GetExt() );
282 if( !fn.IsAbsolute() )
285 bool createNewDir =
false;
289 fn.AppendDir( fn.GetName() );
291 if( !fn.DirExists() && !fn.Mkdir() )
294 "Make sure you have write permissions and try again." ),
299 if( !fn.IsDirWritable() )
306 std::vector< wxFileName > destFiles;
310 std::vector<wxFileName> overwrittenFiles;
312 for(
const wxFileName& file : destFiles )
314 if( file.FileExists() )
315 overwrittenFiles.push_back( file );
318 if( !overwrittenFiles.empty() )
320 wxString extendedMsg =
_(
"Overwriting files:" ) +
"\n";
322 for(
const wxFileName& file : overwrittenFiles )
323 extendedMsg +=
"\n" + file.GetFullName();
325 KIDIALOG msgDlg(
m_frame,
_(
"Similar files already exist in the destination folder." ),
326 _(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
327 msgDlg.SetExtendedMessage( extendedMsg );
328 msgDlg.SetOKLabel(
_(
"Overwrite" ) );
344 m_frame->CreateNewProject( fn.GetFullPath() );
354 dlg.SetTitle(
_(
"Clone Project from Git Repository" ) );
389 if( projects.empty() )
397 wxString dest = pro.GetPath() + wxFileName::GetPathSeparator() + projects.front();
417 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
419 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
421 if( dlg.ShowModal() == wxID_CANCEL )
424 wxFileName jobsetFn( dlg.GetPath() );
427 bool fileExists = wxFileExists( jobsetFn.GetFullPath() );
432 if( !wxRemoveFile( jobsetFn.GetFullPath() ) )
438 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
452 wxFileDialog dlg(
m_frame,
_(
"Open Existing Project" ), aDefaultDir, wxEmptyString, wildcard,
453 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
457 if( dlg.ShowModal() == wxID_CANCEL )
460 wxFileName pro( dlg.GetPath() );
462 if( !pro.IsAbsolute() )
493 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
495 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
497 if( dlg.ShowModal() == wxID_CANCEL )
500 wxFileName jobsetFn( dlg.GetPath() );
502 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
525 wxFileName fileName =
m_frame->GetProjectFileName();
529 wxFileDialog dlg(
m_frame,
_(
"Archive Project Files" ), fileName.GetPath(), fileName.GetFullName(),
532 if( dlg.ShowModal() == wxID_CANCEL )
535 wxFileName zipFile = dlg.GetPath();
537 wxString currdirname = fileName.GetPathWithSep();
538 wxDir dir( currdirname );
540 if( !dir.IsOpened() )
546 archiver.
Archive( currdirname, zipFile.GetFullPath(), reporter,
true,
true );
567 m_frame->RestoreLocalHistory();
582 wxExecute( *aEvent.
Parameter<wxString*>(), wxEXEC_ASYNC );
593 wxFileName currentProjectFile(
Prj().GetProjectFullName() );
594 wxString currentProjectDirPath = currentProjectFile.GetPath();
597 wxString default_dir =
m_frame->GetMruPath();
602 if( default_dir == currentProjectDirPath
603 || default_dir == currentProjectDirPath + wxFileName::GetPathSeparator() )
606 wxFileName default_dir_fn( default_dir );
607 default_dir_fn.RemoveLastDir();
608 default_dir = default_dir_fn.GetPath();
611 wxFileDialog dlg(
m_frame,
_(
"Save Project To" ), default_dir, wxEmptyString, wxEmptyString, wxFD_SAVE );
615 if( dlg.ShowModal() == wxID_CANCEL )
618 wxFileName newProjectDir( dlg.GetPath(), wxEmptyString );
620 if( !newProjectDir.IsAbsolute() )
621 newProjectDir.MakeAbsolute();
623 if( wxDirExists( newProjectDir.GetFullPath() ) )
625 msg.Printf(
_(
"'%s' already exists." ), newProjectDir.GetFullPath() );
630 if( !wxMkdir( newProjectDir.GetFullPath() ) )
633 "Please make sure you have sufficient permissions." ),
634 newProjectDir.GetPath() ) );
638 if( !newProjectDir.IsDirWritable() )
641 newProjectDir.GetFullPath() ) );
645 const wxString& newProjectDirPath = newProjectDir.GetFullPath();
646 const wxString& newProjectName = newProjectDir.GetDirs().Last();
647 wxDir currentProjectDir( currentProjectDirPath );
650 newProjectDirPath, newProjectName );
652 currentProjectDir.Traverse( traverser );
679 if( conditionalMenu )
680 conditionalMenu->Evaluate( dummySel );
712 player =
m_frame->Kiway().Player( playerType,
true );
716 wxLogError(
_(
"Application failed to load:\n" ) + err.
What() );
722 wxLogError(
_(
"Application cannot start." ) );
726 if( !player->IsVisible() )
732 wxFileName kicad_schematic(
m_frame->SchFileName() );
733 wxFileName legacy_schematic(
m_frame->SchLegacyFileName() );
735 if( !legacy_schematic.FileExists() || kicad_schematic.FileExists() )
736 filepath = kicad_schematic.GetFullPath();
738 filepath = legacy_schematic.GetFullPath();
742 wxFileName kicad_board(
m_frame->PcbFileName() );
743 wxFileName legacy_board(
m_frame->PcbLegacyFileName() );
745 if( !legacy_board.FileExists() || kicad_board.FileExists() )
746 filepath = kicad_board.GetFullPath();
748 filepath = legacy_board.GetFullPath();
751 if( !filepath.IsEmpty() )
753 std::vector<wxString> file_list{ filepath };
755 if( !player->OpenProjectFiles( file_list ) )
763 player->Show(
true );
767 if( player->IsIconized() )
768 player->Iconize(
false );
774 if( wxWindow::FindFocus() != player )
778 if(
Pgm().GetCommonSettings()->m_Session.remember_open_files
779 && !player->GetCurrentFileName().IsEmpty()
780 &&
Prj().GetLocalSettings().ShouldAutoSave() )
782 wxFileName rfn( player->GetCurrentFileName() );
783 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
786 player->SaveWindowSettings( &windowSettings );
816 wxFAIL_MSG(
"Execute(): unexpected request" );
818 if( execFile.IsEmpty() )
824 param =
m_frame->Prj().GetProjectPath();
827 return commonControl->
Execute( execFile, param );
855 std::string payload =
"";
879 std::string payload =
"";
static TOOL_ACTION zoomRedraw
static TOOL_ACTION saveAs
static TOOL_ACTION updateMenu
Handle actions that are shared between different applications.
int Execute(const TOOL_EVENT &aEvent)
const wxString & GetFullURL() const
KIGIT_COMMON::GIT_CONN_TYPE GetRepoType() const
wxString GetRepoSSHPath() const
wxString GetRepoURL() const
wxString GetUsername() const
wxString GetRepoName() const
wxString GetPassword() const
Implementing pcm main dialog.
const std::unordered_set< PCM_PACKAGE_TYPE > & GetChangedPackageTypes() const
PROJECT_TEMPLATE * GetDefaultTemplate()
PROJECT_TEMPLATE * GetSelectedTemplate()
wxString GetProjectToEdit() const
bool GetCreateNewDir() const
void SetRemote(const wxString &aRemote)
void SetClonePath(const wxString &aPath)
void SetProgressReporter(std::unique_ptr< WX_PROGRESS_REPORTER > aProgressReporter)
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()
static TOOL_ACTION viewDroppedGerbers
static TOOL_ACTION openDemoProject
static TOOL_ACTION editPCB
static TOOL_ACTION unarchiveProject
static TOOL_ACTION loadProject
static TOOL_ACTION editOtherPCB
static TOOL_ACTION restoreLocalHistory
static TOOL_ACTION newProject
static TOOL_ACTION editOtherSch
static TOOL_ACTION showLocalHistory
static TOOL_ACTION editSchematic
static TOOL_ACTION openTextEditor
static TOOL_ACTION archiveProject
static TOOL_ACTION openProject
static TOOL_ACTION closeProject
static TOOL_ACTION convertImage
static TOOL_ACTION editDrawingSheet
static TOOL_ACTION openProjectDirectory
static TOOL_ACTION openJobsetFile
static TOOL_ACTION newJobsetFile
static TOOL_ACTION editFootprints
static TOOL_ACTION showPluginManager
static TOOL_ACTION showCalculator
static TOOL_ACTION viewGerbers
static TOOL_ACTION newFromRepository
static TOOL_ACTION editSymbols
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
int OpenProject(const TOOL_EVENT &aEvent)
int NewJobsetFile(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 ToggleLocalHistory(const TOOL_EVENT &aEvent)
int ArchiveProject(const TOOL_EVENT &aEvent)
bool m_inShowPlayer
Re-entrancy guard.
int SaveProjectAs(const TOOL_EVENT &aEvent)
int NewProject(const TOOL_EVENT &aEvent)
int RestoreLocalHistory(const TOOL_EVENT &aEvent)
int UnarchiveProject(const TOOL_EVENT &aEvent)
int ViewDroppedViewers(const TOOL_EVENT &aEvent)
Imports a non kicad project from a sch/pcb dropped file.
int ShowPluginManager(const TOOL_EVENT &aEvent)
Set up handlers for various events.
int UpdateMenu(const TOOL_EVENT &aEvent)
int OpenJobsetFile(const TOOL_EVENT &aEvent)
wxFileName newProjectDirectory(wxString *aFileName=nullptr, bool isRepo=false)
int NewFromRepository(const TOOL_EVENT &aEvent)
int LoadProject(const TOOL_EVENT &aEvent)
KICAD_MANAGER_FRAME * m_frame
Pointer to the currently used edit/draw frame.
int ExploreProject(const TOOL_EVENT &aEvent)
int ShowPlayer(const TOOL_EVENT &aEvent)
int Refresh(const TOOL_EVENT &aEvent)
int openProject(const wxString &aDefaultDir)
int Execute(const TOOL_EVENT &aEvent)
wxSize m_TemplateWindowSize
wxPoint m_TemplateWindowPos
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
void DoNotShowCheckbox(wxString file, int line)
Shows the 'do not show again' checkbox.
wxString GetErrorString()
void SetPassword(const wxString &aPassword)
Set the password.
std::vector< wxString > GetProjectDirs()
Get a list of project directories.
void SetUsername(const wxString &aUsername)
Set the username.
void SetSSHKey(const wxString &aSSHKey)
Set the SSH key.
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 void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr, bool aFromOtherThread=false)
Send aPayload to aDestination from aSource.
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
static wxString GetDefaultUserProjectsPath()
Gets the default path we point users to create projects.
static wxString GetStockDemosPath()
Gets the stock (install) demos path.
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
virtual const wxString & GetTextEditor(bool aCanShowFileChooser=true)
Return the path to the preferred text editor application.
virtual SETTINGS_MANAGER & GetSettingsManager() const
static bool Archive(const wxString &aSrcDir, const wxString &aDestFile, REPORTER &aReporter, bool aVerbose=true, bool aIncludeExtraFiles=false)
Create an archive of the project.
bool SaveToFile(const wxString &aDirectory="", bool aForce=false) override
Calls Store() and then writes the contents of the JSON document to a file.
bool SaveToFile(const wxString &aDirectory="", bool aForce=false) override
Calls Store() and then writes the contents of the JSON document to a file.
wxString m_GitRepoUsername
void SaveFileState(const wxString &aFileName, const WINDOW_SETTINGS *aWindowCfg, bool aOpen)
A class which provides project template functionality.
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.
PROJECT_TREE_PANE Window to display the tree files.
PROJECT_TREE * m_TreeProject
Traverser class to duplicate/copy project or template files with proper renaming.
wxString GetErrors() const
wxFileName GetNewProjectFile() const
KIGIT_COMMON * GitCommon() const
virtual void SetElem(PROJECT::ELEM aIndex, _ELEM *aElem)
virtual const wxString GetProjectName() const
Return the short name of the project.
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
virtual PROJECT_FILE & GetProjectFile() const
void ReloadColorSettings()
Re-scan the color themes directory, reloading any changes it finds.
A wrapper for reporting to a specific text location in a statusbar.
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.
Functions related to environment variables, including help functions.
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
static const std::string ProjectFileExtension
static const std::string LegacyProjectFileExtension
static const std::string ArchiveFileExtension
static wxString ProjectFileWildcard()
static wxString JobsetFileWildcard()
static wxString LegacyProjectFileWildcard()
static wxString AllProjectFilesWildcard()
static wxString ZipFileWildcard()
std::map< wxString, ENV_VAR_ITEM >::const_iterator ENV_VAR_MAP_CITER
static wxFileName ensureDefaultProjectTemplate()
bool LaunchExternal(const wxString &aPath)
Launches the given file or folder in the host OS.
KICOMMON_API std::optional< wxString > GetVersionedEnvVarValue(const std::map< wxString, ENV_VAR_ITEM > &aMap, const wxString &aBaseName)
Attempt to retrieve the value of a versioned environment variable, such as KICAD8_TEMPLATE_DIR.
PGM_BASE & Pgm()
The global program "get" accessor.
#define METADIR
A directory which contains information about the project template and does not get copied.
#define METAFILE_INFO_HTML
A required html formatted file which contains information about the project template.
T * GetAppSettings(const char *aFilename)
Implement a participant in the KIWAY alchemy.
Store the common settings that are saved and loaded for each window / frame.
IFACE KIFACE_BASE kiface("pcb_test_frame", KIWAY::FACE_PCB)
wxString result
Test unit parsing edge cases and error handling.
Definition of file extensions used in Kicad.