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 wxFileName templateToSelect = defaultTemplate;
234 if( lastUsed.DirExists() )
235 templateToSelect = lastUsed;
239 titleDirList, templateToSelect );
247 if(
result == wxID_APPLY )
251 if( !projectToEdit.IsEmpty() && wxFileExists( projectToEdit ) )
253 m_frame->LoadProject( wxFileName( projectToEdit ) );
263 if( !selectedTemplate )
266 if( !selectedTemplate )
268 wxMessageBox(
_(
"No project template was selected. Cannot generate new project." ),
_(
"Error" ),
269 wxOK | wxICON_ERROR,
m_frame );
274 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
275 wxString title =
_(
"New Project Folder" );
277 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
282 dlg.SetCustomizeHook( newProjectHook );
284 if( dlg.ShowModal() == wxID_CANCEL )
287 wxFileName fn( dlg.GetPath() );
290 fn.SetName( fn.GetName() + wxT(
"." ) + fn.GetExt() );
294 if( !fn.IsAbsolute() )
297 bool createNewDir =
false;
301 fn.AppendDir( fn.GetName() );
303 if( !fn.DirExists() && !fn.Mkdir() )
306 "Make sure you have write permissions and try again." ),
311 if( !fn.IsDirWritable() )
318 std::vector< wxFileName > destFiles;
322 std::vector<wxFileName> overwrittenFiles;
324 for(
const wxFileName& file : destFiles )
326 if( file.FileExists() )
327 overwrittenFiles.push_back( file );
330 if( !overwrittenFiles.empty() )
332 wxString extendedMsg =
_(
"Overwriting files:" ) +
"\n";
334 for(
const wxFileName& file : overwrittenFiles )
335 extendedMsg +=
"\n" + file.GetFullName();
337 KIDIALOG msgDlg(
m_frame,
_(
"Similar files already exist in the destination folder." ),
338 _(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
339 msgDlg.SetExtendedMessage( extendedMsg );
340 msgDlg.SetOKLabel(
_(
"Overwrite" ) );
357 wxFileName templateDir = selectedTemplate->
GetHtmlFile();
358 templateDir.RemoveLastDir();
361 m_frame->CreateNewProject( fn.GetFullPath() );
371 dlg.SetTitle(
_(
"Clone Project from Git Repository" ) );
406 if( projects.empty() )
414 wxString dest = pro.GetPath() + wxFileName::GetPathSeparator() + projects.front();
434 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
436 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
438 if( dlg.ShowModal() == wxID_CANCEL )
441 wxFileName jobsetFn( dlg.GetPath() );
444 bool fileExists = wxFileExists( jobsetFn.GetFullPath() );
449 if( !wxRemoveFile( jobsetFn.GetFullPath() ) )
455 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
469 wxFileDialog dlg(
m_frame,
_(
"Open Existing Project" ), aDefaultDir, wxEmptyString, wildcard,
470 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
474 if( dlg.ShowModal() == wxID_CANCEL )
477 wxFileName pro( dlg.GetPath() );
479 if( !pro.IsAbsolute() )
510 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
512 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
514 if( dlg.ShowModal() == wxID_CANCEL )
517 wxFileName jobsetFn( dlg.GetPath() );
519 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
542 wxFileName fileName =
m_frame->GetProjectFileName();
546 wxFileDialog dlg(
m_frame,
_(
"Archive Project Files" ), fileName.GetPath(), fileName.GetFullName(),
549 if( dlg.ShowModal() == wxID_CANCEL )
552 wxFileName zipFile = dlg.GetPath();
554 wxString currdirname = fileName.GetPathWithSep();
555 wxDir dir( currdirname );
557 if( !dir.IsOpened() )
563 archiver.
Archive( currdirname, zipFile.GetFullPath(), reporter,
true,
true );
584 m_frame->RestoreLocalHistory();
599 wxExecute( *aEvent.
Parameter<wxString*>(), wxEXEC_ASYNC );
610 wxFileName currentProjectFile(
Prj().GetProjectFullName() );
611 wxString currentProjectDirPath = currentProjectFile.GetPath();
614 wxString default_dir =
m_frame->GetMruPath();
619 if( default_dir == currentProjectDirPath
620 || default_dir == currentProjectDirPath + wxFileName::GetPathSeparator() )
623 wxFileName default_dir_fn( default_dir );
624 default_dir_fn.RemoveLastDir();
625 default_dir = default_dir_fn.GetPath();
628 wxFileDialog dlg(
m_frame,
_(
"Save Project To" ), default_dir, wxEmptyString, wxEmptyString, wxFD_SAVE );
632 if( dlg.ShowModal() == wxID_CANCEL )
635 wxFileName newProjectDir( dlg.GetPath(), wxEmptyString );
637 if( !newProjectDir.IsAbsolute() )
638 newProjectDir.MakeAbsolute();
640 if( wxDirExists( newProjectDir.GetFullPath() ) )
642 msg.Printf(
_(
"'%s' already exists." ), newProjectDir.GetFullPath() );
647 if( !wxMkdir( newProjectDir.GetFullPath() ) )
650 "Please make sure you have sufficient permissions." ),
651 newProjectDir.GetPath() ) );
655 if( !newProjectDir.IsDirWritable() )
658 newProjectDir.GetFullPath() ) );
662 const wxString& newProjectDirPath = newProjectDir.GetFullPath();
663 const wxString& newProjectName = newProjectDir.GetDirs().Last();
664 wxDir currentProjectDir( currentProjectDirPath );
667 newProjectDirPath, newProjectName );
669 currentProjectDir.Traverse( traverser );
696 if( conditionalMenu )
697 conditionalMenu->Evaluate( dummySel );
729 player =
m_frame->Kiway().Player( playerType,
true );
733 wxLogError(
_(
"Application failed to load:\n" ) + err.
What() );
739 wxLogError(
_(
"Application cannot start." ) );
743 if( !player->IsVisible() )
749 wxFileName kicad_schematic(
m_frame->SchFileName() );
750 wxFileName legacy_schematic(
m_frame->SchLegacyFileName() );
752 if( !legacy_schematic.FileExists() || kicad_schematic.FileExists() )
753 filepath = kicad_schematic.GetFullPath();
755 filepath = legacy_schematic.GetFullPath();
759 wxFileName kicad_board(
m_frame->PcbFileName() );
760 wxFileName legacy_board(
m_frame->PcbLegacyFileName() );
762 if( !legacy_board.FileExists() || kicad_board.FileExists() )
763 filepath = kicad_board.GetFullPath();
765 filepath = legacy_board.GetFullPath();
768 if( !filepath.IsEmpty() )
770 std::vector<wxString> file_list{ filepath };
772 if( !player->OpenProjectFiles( file_list ) )
780 player->Show(
true );
784 if( player->IsIconized() )
785 player->Iconize(
false );
791 if( wxWindow::FindFocus() != player )
795 if(
Pgm().GetCommonSettings()->m_Session.remember_open_files
796 && !player->GetCurrentFileName().IsEmpty()
797 &&
Prj().GetLocalSettings().ShouldAutoSave() )
799 wxFileName rfn( player->GetCurrentFileName() );
800 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
803 player->SaveWindowSettings( &windowSettings );
833 wxFAIL_MSG(
"Execute(): unexpected request" );
835 if( execFile.IsEmpty() )
841 param =
m_frame->Prj().GetProjectPath();
844 return commonControl->
Execute( execFile, param );
872 std::string payload =
"";
891 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
wxString m_LastUsedTemplate
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.
wxFileName GetHtmlFile()
Get the full Html filename for the project template.
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 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.