52#include <wx/filedlg.h>
79 wxString default_filename = aFileName ? *aFileName : wxString();
81 wxString default_dir =
m_frame->GetMruPath();
82 wxFileDialog dlg(
m_frame,
_(
"Create New Project" ), default_dir, default_filename,
84 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
90 dlg.SetCustomizeHook( newProjectHook );
94 if( dlg.ShowModal() == wxID_CANCEL )
97 wxFileName pro( dlg.GetPath() );
102 pro.SetName( pro.GetName() + wxT(
"." ) + pro.GetExt() );
106 if( !pro.IsAbsolute() )
110 bool createNewDir =
false;
115 pro.AppendDir( pro.GetName() );
120 if( !pro.DirExists() )
125 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
126 "Make sure you have write permissions and try again." ),
134 wxString msg =
_(
"The selected folder is not empty. It is recommended that you "
135 "create projects in their own empty folder.\n\n"
136 "Do you want to continue?" );
150 if( it ==
Pgm().GetLocalEnvVariables().
end() || it->second.GetValue() == wxEmptyString )
153 wxFileName templatePath;
154 templatePath.AssignDir( it->second.GetValue() );
155 templatePath.AppendDir(
"default" );
157 if( !templatePath.DirExists() && !templatePath.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL ) )
160 wxFileName metaDir = templatePath;
163 if( !metaDir.DirExists() && !metaDir.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL ) )
166 wxFileName infoFile = metaDir;
169 if( !infoFile.FileExists() )
171 wxFFile
info( infoFile.GetFullPath(), wxT(
"w" ) );
173 if( !
info.IsOpened() )
176 info.Write( wxT(
"<html><head><title>Default</title></head><body><h3>Default KiCad project template.</h3></body></html>" ) );
180 wxFileName proFile = templatePath;
181 proFile.SetFullName( wxT(
"default.kicad_pro" ) );
183 if( !proFile.FileExists() )
185 wxFFile proj( proFile.GetFullPath(), wxT(
"w" ) );
187 if( !proj.IsOpened() )
190 proj.Write( wxT(
"{}" ) );
194 if( infoFile.FileExists() && proFile.FileExists() )
204 if( !defaultTemplate.IsOk() )
211 m_frame->CreateNewProject( pro );
219 wxString userTemplatesPath;
220 wxString systemTemplatesPath;
224 if( itUser !=
Pgm().GetLocalEnvVariables().
end() && itUser->second.GetValue() != wxEmptyString )
226 wxFileName templatePath;
227 templatePath.AssignDir( itUser->second.GetValue() );
229 userTemplatesPath = templatePath.GetFullPath();
233 wxT(
"TEMPLATE_DIR" ) );
235 if( v && !v->IsEmpty() )
237 wxFileName templatePath;
238 templatePath.AssignDir( *v );
240 systemTemplatesPath = templatePath.GetFullPath();
247 wxString selectedTemplatePath;
248 wxPoint templateWindowPos;
249 wxSize templateWindowSize;
250 wxString projectToEdit;
260 templateWindowPos = ps.GetPosition();
261 templateWindowSize = ps.GetSize();
269 htmlFile.RemoveLastDir();
270 selectedTemplatePath = htmlFile.GetPath();
278 if(
result == wxID_APPLY )
280 if( !projectToEdit.IsEmpty() && wxFileExists( projectToEdit ) )
282 m_frame->LoadProject( wxFileName( projectToEdit ) );
290 if( selectedTemplatePath.IsEmpty() )
292 wxMessageBox(
_(
"No project template was selected. Cannot generate new project." ),
_(
"Error" ),
293 wxOK | wxICON_ERROR,
m_frame );
301 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
302 wxString title =
_(
"New Project Folder" );
304 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
309 dlg.SetCustomizeHook( newProjectHook );
313 if( dlg.ShowModal() == wxID_CANCEL )
316 wxFileName fn( dlg.GetPath() );
319 fn.SetName( fn.GetName() + wxT(
"." ) + fn.GetExt() );
323 if( !fn.IsAbsolute() )
326 bool createNewDir =
false;
330 fn.AppendDir( fn.GetName() );
332 if( !fn.DirExists() && !fn.Mkdir() )
335 "Make sure you have write permissions and try again." ),
340 if( !fn.IsDirWritable() )
347 std::vector< wxFileName > destFiles;
351 std::vector<wxFileName> overwrittenFiles;
353 for(
const wxFileName& file : destFiles )
355 if( file.FileExists() )
356 overwrittenFiles.push_back( file );
359 if( !overwrittenFiles.empty() )
361 wxString extendedMsg =
_(
"Overwriting files:" ) +
"\n";
363 for(
const wxFileName& file : overwrittenFiles )
364 extendedMsg +=
"\n" + file.GetFullName();
366 KIDIALOG msgDlg(
m_frame,
_(
"Similar files already exist in the destination folder." ),
367 _(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
368 msgDlg.SetExtendedMessage( extendedMsg );
369 msgDlg.SetOKLabel(
_(
"Overwrite" ) );
386 wxFileName templateDir = selectedTemplate.
GetHtmlFile();
387 templateDir.RemoveLastDir();
388 wxString templatePath = templateDir.GetPath();
394 recentTemplates.erase( std::remove( recentTemplates.begin(), recentTemplates.end(), templatePath ),
395 recentTemplates.end() );
396 recentTemplates.insert( recentTemplates.begin(), templatePath );
398 if( recentTemplates.size() > 5 )
399 recentTemplates.resize( 5 );
401 m_frame->CreateNewProject( fn.GetFullPath() );
411 dlg.SetTitle(
_(
"Clone Project from Git Repository" ) );
446 if( projects.empty() )
454 wxString dest = pro.GetPath() + wxFileName::GetPathSeparator() + projects.front();
474 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
476 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
480 if( dlg.ShowModal() == wxID_CANCEL )
483 wxFileName jobsetFn( dlg.GetPath() );
486 bool fileExists = wxFileExists( jobsetFn.GetFullPath() );
491 if( !wxRemoveFile( jobsetFn.GetFullPath() ) )
497 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
511 wxFileDialog dlg(
m_frame,
_(
"Open Existing Project" ), aDefaultDir, wxEmptyString, wildcard,
512 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
518 if( dlg.ShowModal() == wxID_CANCEL )
521 wxFileName pro( dlg.GetPath() );
523 if( !pro.IsAbsolute() )
554 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
556 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
560 if( dlg.ShowModal() == wxID_CANCEL )
563 wxFileName jobsetFn( dlg.GetPath() );
565 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
588 wxFileName fileName =
m_frame->GetProjectFileName();
592 wxFileDialog dlg(
m_frame,
_(
"Archive Project Files" ), fileName.GetPath(), fileName.GetFullName(),
597 if( dlg.ShowModal() == wxID_CANCEL )
600 wxFileName zipFile = dlg.GetPath();
602 wxString currdirname = fileName.GetPathWithSep();
603 wxDir dir( currdirname );
605 if( !dir.IsOpened() )
611 archiver.
Archive( currdirname, zipFile.GetFullPath(), reporter,
true,
true );
632 m_frame->RestoreLocalHistory();
647 wxExecute( *aEvent.
Parameter<wxString*>(), wxEXEC_ASYNC );
658 wxFileName currentProjectFile(
Prj().GetProjectFullName() );
659 wxString currentProjectDirPath = currentProjectFile.GetPath();
662 wxString default_dir =
m_frame->GetMruPath();
667 if( default_dir == currentProjectDirPath
668 || default_dir == currentProjectDirPath + wxFileName::GetPathSeparator() )
671 wxFileName default_dir_fn( default_dir );
672 default_dir_fn.RemoveLastDir();
673 default_dir = default_dir_fn.GetPath();
676 wxFileDialog dlg(
m_frame,
_(
"Save Project To" ), default_dir, wxEmptyString, wxEmptyString, wxFD_SAVE );
682 if( dlg.ShowModal() == wxID_CANCEL )
685 wxFileName newProjectDir( dlg.GetPath(), wxEmptyString );
687 if( !newProjectDir.IsAbsolute() )
688 newProjectDir.MakeAbsolute();
690 if( wxDirExists( newProjectDir.GetFullPath() ) )
692 msg.Printf(
_(
"'%s' already exists." ), newProjectDir.GetFullPath() );
697 if( !wxMkdir( newProjectDir.GetFullPath() ) )
700 "Please make sure you have sufficient permissions." ),
701 newProjectDir.GetPath() ) );
705 if( !newProjectDir.IsDirWritable() )
708 newProjectDir.GetFullPath() ) );
712 const wxString& newProjectDirPath = newProjectDir.GetFullPath();
713 const wxString& newProjectName = newProjectDir.GetDirs().Last();
714 wxDir currentProjectDir( currentProjectDirPath );
717 newProjectDirPath, newProjectName );
719 currentProjectDir.Traverse( traverser );
746 if( conditionalMenu )
747 conditionalMenu->Evaluate( dummySel );
779 player =
m_frame->Kiway().Player( playerType,
true );
783 wxLogError(
_(
"Application failed to load:\n" ) + err.
What() );
789 wxLogError(
_(
"Application cannot start." ) );
793 if( !player->IsVisible() )
799 wxFileName kicad_schematic(
m_frame->SchFileName() );
800 wxFileName legacy_schematic(
m_frame->SchLegacyFileName() );
802 if( !legacy_schematic.FileExists() || kicad_schematic.FileExists() )
803 filepath = kicad_schematic.GetFullPath();
805 filepath = legacy_schematic.GetFullPath();
809 wxFileName kicad_board(
m_frame->PcbFileName() );
810 wxFileName legacy_board(
m_frame->PcbLegacyFileName() );
812 if( !legacy_board.FileExists() || kicad_board.FileExists() )
813 filepath = kicad_board.GetFullPath();
815 filepath = legacy_board.GetFullPath();
818 if( !filepath.IsEmpty() )
820 std::vector<wxString> file_list{ filepath };
822 if( !player->OpenProjectFiles( file_list ) )
830 player->Show(
true );
834 if( player->IsIconized() )
835 player->Iconize(
false );
841 if( wxWindow::FindFocus() != player )
845 if(
Pgm().GetCommonSettings()->m_Session.remember_open_files
846 && !player->GetCurrentFileName().IsEmpty()
847 &&
Prj().GetLocalSettings().ShouldAutoSave() )
849 wxFileName rfn( player->GetCurrentFileName() );
850 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
853 player->SaveWindowSettings( &windowSettings );
883 wxFAIL_MSG(
"Execute(): unexpected request" );
885 if( execFile.IsEmpty() )
891 param =
m_frame->Prj().GetProjectPath();
894 return commonControl->
Execute( execFile, param );
922 std::string payload =
"";
941 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 * 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)
std::vector< wxString > m_RecentTemplates
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.
#define FN_NORMALIZE_FLAGS
Default flags to pass to wxFileName::Normalize().