51#include <wx/filedlg.h>
78 wxString default_filename = aFileName ? *aFileName : wxString();
80 wxString default_dir =
m_frame->GetMruPath();
81 wxFileDialog dlg(
m_frame,
_(
"Create New Project" ), default_dir, default_filename,
83 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
89 dlg.SetCustomizeHook( newProjectHook );
93 if( dlg.ShowModal() == wxID_CANCEL )
96 wxFileName pro( dlg.GetPath() );
101 pro.SetName( pro.GetName() + wxT(
"." ) + pro.GetExt() );
105 if( !pro.IsAbsolute() )
109 bool createNewDir =
false;
114 pro.AppendDir( pro.GetName() );
119 if( !pro.DirExists() )
124 msg.Printf(
_(
"Folder '%s' could not be created.\n\n"
125 "Make sure you have write permissions and try again." ),
133 wxString msg =
_(
"The selected folder is not empty. It is recommended that you "
134 "create projects in their own empty folder.\n\n"
135 "Do you want to continue?" );
149 if( it ==
Pgm().GetLocalEnvVariables().
end() || it->second.GetValue() == wxEmptyString )
152 wxFileName templatePath;
153 templatePath.AssignDir( it->second.GetValue() );
154 templatePath.AppendDir(
"default" );
156 if( templatePath.DirExists() )
159 if( !templatePath.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL ) )
162 wxFileName metaDir = templatePath;
165 if( !metaDir.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL ) )
168 wxFileName infoFile = metaDir;
170 wxFFile
info( infoFile.GetFullPath(), wxT(
"w" ) );
172 if( !
info.IsOpened() )
175 info.Write( wxT(
"<html><head><title>Default</title></head><body></body></html>" ) );
178 wxFileName proFile = templatePath;
179 proFile.SetFullName( wxT(
"default.kicad_pro" ) );
180 wxFFile proj( proFile.GetFullPath(), wxT(
"w" ) );
182 if( !proj.IsOpened() )
185 proj.Write( wxT(
"{}" ) );
195 if( !defaultTemplate.IsOk() )
202 m_frame->CreateNewProject( pro );
210 wxString userTemplatesPath;
211 wxString systemTemplatesPath;
215 if( itUser !=
Pgm().GetLocalEnvVariables().
end() && itUser->second.GetValue() != wxEmptyString )
217 wxFileName templatePath;
218 templatePath.AssignDir( itUser->second.GetValue() );
220 userTemplatesPath = templatePath.GetFullPath();
224 wxT(
"TEMPLATE_DIR" ) );
226 if( v && !v->IsEmpty() )
228 wxFileName templatePath;
229 templatePath.AssignDir( *v );
231 systemTemplatesPath = templatePath.GetFullPath();
238 wxString selectedTemplatePath;
239 wxPoint templateWindowPos;
240 wxSize templateWindowSize;
241 wxString projectToEdit;
251 templateWindowPos = ps.GetPosition();
252 templateWindowSize = ps.GetSize();
260 htmlFile.RemoveLastDir();
261 selectedTemplatePath = htmlFile.GetPath();
269 if(
result == wxID_APPLY )
271 if( !projectToEdit.IsEmpty() && wxFileExists( projectToEdit ) )
273 m_frame->LoadProject( wxFileName( projectToEdit ) );
281 if( selectedTemplatePath.IsEmpty() )
283 wxMessageBox(
_(
"No project template was selected. Cannot generate new project." ),
_(
"Error" ),
284 wxOK | wxICON_ERROR,
m_frame );
292 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
293 wxString title =
_(
"New Project Folder" );
295 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
300 dlg.SetCustomizeHook( newProjectHook );
304 if( dlg.ShowModal() == wxID_CANCEL )
307 wxFileName fn( dlg.GetPath() );
310 fn.SetName( fn.GetName() + wxT(
"." ) + fn.GetExt() );
314 if( !fn.IsAbsolute() )
317 bool createNewDir =
false;
321 fn.AppendDir( fn.GetName() );
323 if( !fn.DirExists() && !fn.Mkdir() )
326 "Make sure you have write permissions and try again." ),
331 if( !fn.IsDirWritable() )
338 std::vector< wxFileName > destFiles;
342 std::vector<wxFileName> overwrittenFiles;
344 for(
const wxFileName& file : destFiles )
346 if( file.FileExists() )
347 overwrittenFiles.push_back( file );
350 if( !overwrittenFiles.empty() )
352 wxString extendedMsg =
_(
"Overwriting files:" ) +
"\n";
354 for(
const wxFileName& file : overwrittenFiles )
355 extendedMsg +=
"\n" + file.GetFullName();
357 KIDIALOG msgDlg(
m_frame,
_(
"Similar files already exist in the destination folder." ),
358 _(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
359 msgDlg.SetExtendedMessage( extendedMsg );
360 msgDlg.SetOKLabel(
_(
"Overwrite" ) );
377 wxFileName templateDir = selectedTemplate.
GetHtmlFile();
378 templateDir.RemoveLastDir();
379 wxString templatePath = templateDir.GetPath();
385 recentTemplates.erase( std::remove( recentTemplates.begin(), recentTemplates.end(), templatePath ),
386 recentTemplates.end() );
387 recentTemplates.insert( recentTemplates.begin(), templatePath );
389 if( recentTemplates.size() > 5 )
390 recentTemplates.resize( 5 );
392 m_frame->CreateNewProject( fn.GetFullPath() );
402 dlg.SetTitle(
_(
"Clone Project from Git Repository" ) );
437 if( projects.empty() )
445 wxString dest = pro.GetPath() + wxFileName::GetPathSeparator() + projects.front();
465 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
467 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
471 if( dlg.ShowModal() == wxID_CANCEL )
474 wxFileName jobsetFn( dlg.GetPath() );
477 bool fileExists = wxFileExists( jobsetFn.GetFullPath() );
482 if( !wxRemoveFile( jobsetFn.GetFullPath() ) )
488 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
502 wxFileDialog dlg(
m_frame,
_(
"Open Existing Project" ), aDefaultDir, wxEmptyString, wildcard,
503 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
509 if( dlg.ShowModal() == wxID_CANCEL )
512 wxFileName pro( dlg.GetPath() );
514 if( !pro.IsAbsolute() )
545 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
547 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
551 if( dlg.ShowModal() == wxID_CANCEL )
554 wxFileName jobsetFn( dlg.GetPath() );
556 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
579 wxFileName fileName =
m_frame->GetProjectFileName();
583 wxFileDialog dlg(
m_frame,
_(
"Archive Project Files" ), fileName.GetPath(), fileName.GetFullName(),
588 if( dlg.ShowModal() == wxID_CANCEL )
591 wxFileName zipFile = dlg.GetPath();
593 wxString currdirname = fileName.GetPathWithSep();
594 wxDir dir( currdirname );
596 if( !dir.IsOpened() )
602 archiver.
Archive( currdirname, zipFile.GetFullPath(), reporter,
true,
true );
623 m_frame->RestoreLocalHistory();
638 wxExecute( *aEvent.
Parameter<wxString*>(), wxEXEC_ASYNC );
649 wxFileName currentProjectFile(
Prj().GetProjectFullName() );
650 wxString currentProjectDirPath = currentProjectFile.GetPath();
653 wxString default_dir =
m_frame->GetMruPath();
658 if( default_dir == currentProjectDirPath
659 || default_dir == currentProjectDirPath + wxFileName::GetPathSeparator() )
662 wxFileName default_dir_fn( default_dir );
663 default_dir_fn.RemoveLastDir();
664 default_dir = default_dir_fn.GetPath();
667 wxFileDialog dlg(
m_frame,
_(
"Save Project To" ), default_dir, wxEmptyString, wxEmptyString, wxFD_SAVE );
673 if( dlg.ShowModal() == wxID_CANCEL )
676 wxFileName newProjectDir( dlg.GetPath(), wxEmptyString );
678 if( !newProjectDir.IsAbsolute() )
679 newProjectDir.MakeAbsolute();
681 if( wxDirExists( newProjectDir.GetFullPath() ) )
683 msg.Printf(
_(
"'%s' already exists." ), newProjectDir.GetFullPath() );
688 if( !wxMkdir( newProjectDir.GetFullPath() ) )
691 "Please make sure you have sufficient permissions." ),
692 newProjectDir.GetPath() ) );
696 if( !newProjectDir.IsDirWritable() )
699 newProjectDir.GetFullPath() ) );
703 const wxString& newProjectDirPath = newProjectDir.GetFullPath();
704 const wxString& newProjectName = newProjectDir.GetDirs().Last();
705 wxDir currentProjectDir( currentProjectDirPath );
708 newProjectDirPath, newProjectName );
710 currentProjectDir.Traverse( traverser );
737 if( conditionalMenu )
738 conditionalMenu->Evaluate( dummySel );
770 player =
m_frame->Kiway().Player( playerType,
true );
774 wxLogError(
_(
"Application failed to load:\n" ) + err.
What() );
780 wxLogError(
_(
"Application cannot start." ) );
784 if( !player->IsVisible() )
790 wxFileName kicad_schematic(
m_frame->SchFileName() );
791 wxFileName legacy_schematic(
m_frame->SchLegacyFileName() );
793 if( !legacy_schematic.FileExists() || kicad_schematic.FileExists() )
794 filepath = kicad_schematic.GetFullPath();
796 filepath = legacy_schematic.GetFullPath();
800 wxFileName kicad_board(
m_frame->PcbFileName() );
801 wxFileName legacy_board(
m_frame->PcbLegacyFileName() );
803 if( !legacy_board.FileExists() || kicad_board.FileExists() )
804 filepath = kicad_board.GetFullPath();
806 filepath = legacy_board.GetFullPath();
809 if( !filepath.IsEmpty() )
811 std::vector<wxString> file_list{ filepath };
813 if( !player->OpenProjectFiles( file_list ) )
821 player->Show(
true );
825 if( player->IsIconized() )
826 player->Iconize(
false );
832 if( wxWindow::FindFocus() != player )
836 if(
Pgm().GetCommonSettings()->m_Session.remember_open_files
837 && !player->GetCurrentFileName().IsEmpty()
838 &&
Prj().GetLocalSettings().ShouldAutoSave() )
840 wxFileName rfn( player->GetCurrentFileName() );
841 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
844 player->SaveWindowSettings( &windowSettings );
874 wxFAIL_MSG(
"Execute(): unexpected request" );
876 if( execFile.IsEmpty() )
882 param =
m_frame->Prj().GetProjectPath();
885 return commonControl->
Execute( execFile, param );
913 std::string payload =
"";
932 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().