53#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?" );
156 wxString userTemplatesPath;
157 wxString systemTemplatesPath;
159 auto resolveTemplateDir = [](
const wxString& aValue ) -> wxString
165 if( resolved.Contains( wxT(
"${" ) ) || resolved.Contains( wxT(
"$(" ) ) )
166 return wxEmptyString;
168 wxFileName templatePath;
169 templatePath.AssignDir( resolved );
171 return templatePath.GetFullPath();
176 if( itUser !=
Pgm().GetLocalEnvVariables().
end() && itUser->second.GetValue() != wxEmptyString )
177 userTemplatesPath = resolveTemplateDir( itUser->second.GetValue() );
180 wxT(
"TEMPLATE_DIR" ) );
182 if( v && !v->IsEmpty() )
183 systemTemplatesPath = resolveTemplateDir( *v );
188 wxString defaultTemplatesPath;
190 if( defaultTemplate.IsOk() )
191 defaultTemplatesPath = resolveTemplateDir( defaultTemplate.GetPath() );
197 if( !defaultTemplatesPath.IsEmpty() )
199 wxFileName defaultRootFn = defaultTemplate;
200 defaultRootFn.RemoveLastDir();
201 wxString defaultRoot = resolveTemplateDir( defaultRootFn.GetPath() );
203 if( defaultRoot == userTemplatesPath || defaultRoot == systemTemplatesPath )
204 defaultTemplatesPath = wxEmptyString;
209 if( !defaultTemplate.IsOk() && userTemplatesPath.IsEmpty() && systemTemplatesPath.IsEmpty() )
216 m_frame->CreateNewProject( pro );
226 wxString selectedTemplatePath;
227 wxPoint templateWindowPos;
228 wxSize templateWindowSize;
229 wxString projectToEdit;
236 systemTemplatesPath, defaultTemplatesPath,
240 templateWindowPos = ps.GetPosition();
241 templateWindowSize = ps.GetSize();
249 htmlFile.RemoveLastDir();
250 selectedTemplatePath = htmlFile.GetPath();
258 if(
result == wxID_APPLY )
260 if( !projectToEdit.IsEmpty() && wxFileExists( projectToEdit ) )
262 m_frame->LoadProject( wxFileName( projectToEdit ) );
270 if( selectedTemplatePath.IsEmpty() )
272 wxMessageBox(
_(
"No project template was selected. Cannot generate new project." ),
_(
"Error" ),
273 wxOK | wxICON_ERROR,
m_frame );
281 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
282 wxString title =
_(
"New Project Folder" );
284 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
289 dlg.SetCustomizeHook( newProjectHook );
293 if( dlg.ShowModal() == wxID_CANCEL )
296 wxFileName fn( dlg.GetPath() );
299 fn.SetName( fn.GetName() + wxT(
"." ) + fn.GetExt() );
303 if( !fn.IsAbsolute() )
306 bool createNewDir =
false;
310 fn.AppendDir( fn.GetName() );
312 if( !fn.DirExists() && !fn.Mkdir() )
315 "Make sure you have write permissions and try again." ),
320 if( !fn.IsDirWritable() )
327 std::vector< wxFileName > destFiles;
331 std::vector<wxFileName> overwrittenFiles;
333 for(
const wxFileName& file : destFiles )
335 if( file.FileExists() )
336 overwrittenFiles.push_back( file );
339 if( !overwrittenFiles.empty() )
341 wxString extendedMsg =
_(
"Overwriting files:" ) +
"\n";
343 for(
const wxFileName& file : overwrittenFiles )
344 extendedMsg +=
"\n" + file.GetFullName();
346 KIDIALOG msgDlg(
m_frame,
_(
"Similar files already exist in the destination folder." ),
347 _(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
348 msgDlg.SetExtendedMessage( extendedMsg );
349 msgDlg.SetOKLabel(
_(
"Overwrite" ) );
366 wxFileName templateDir = selectedTemplate.
GetHtmlFile();
367 templateDir.RemoveLastDir();
368 wxString templatePath = templateDir.GetPath();
374 recentTemplates.erase( std::remove( recentTemplates.begin(), recentTemplates.end(), templatePath ),
375 recentTemplates.end() );
376 recentTemplates.insert( recentTemplates.begin(), templatePath );
378 if( recentTemplates.size() > 5 )
379 recentTemplates.resize( 5 );
381 m_frame->CreateNewProject( fn.GetFullPath() );
391 dlg.SetTitle(
_(
"Clone Project from Git Repository" ) );
427 if( projects.empty() )
435 wxString dest = pro.GetPath() + wxFileName::GetPathSeparator() + projects.front();
455 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
457 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
461 if( dlg.ShowModal() == wxID_CANCEL )
464 wxFileName jobsetFn( dlg.GetPath() );
467 bool fileExists = wxFileExists( jobsetFn.GetFullPath() );
472 if( !wxRemoveFile( jobsetFn.GetFullPath() ) )
478 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
492 wxFileDialog dlg(
m_frame,
_(
"Open Existing Project" ), aDefaultDir, wxEmptyString, wildcard,
493 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
499 if( dlg.ShowModal() == wxID_CANCEL )
502 wxFileName pro( dlg.GetPath() );
504 if( !pro.IsAbsolute() )
535 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
537 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
541 if( dlg.ShowModal() == wxID_CANCEL )
544 wxFileName jobsetFn( dlg.GetPath() );
546 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
569 wxFileName fileName =
m_frame->GetProjectFileName();
573 wxFileDialog dlg(
m_frame,
_(
"Archive Project Files" ), fileName.GetPath(), fileName.GetFullName(),
578 if( dlg.ShowModal() == wxID_CANCEL )
581 wxFileName zipFile = dlg.GetPath();
583 wxString currdirname = fileName.GetPathWithSep();
584 wxDir dir( currdirname );
586 if( !dir.IsOpened() )
592 archiver.
Archive( currdirname, zipFile.GetFullPath(),
reporter,
true,
true );
613 m_frame->RestoreLocalHistory();
628 wxExecute( *aEvent.
Parameter<wxString*>(), wxEXEC_ASYNC );
639 wxFileName currentProjectFile(
Prj().GetProjectFullName() );
640 wxString currentProjectDirPath = currentProjectFile.GetPath();
643 wxString default_dir =
m_frame->GetMruPath();
648 if( default_dir == currentProjectDirPath
649 || default_dir == currentProjectDirPath + wxFileName::GetPathSeparator() )
652 wxFileName default_dir_fn( default_dir );
653 default_dir_fn.RemoveLastDir();
654 default_dir = default_dir_fn.GetPath();
657 wxFileDialog dlg(
m_frame,
_(
"Save Project To" ), default_dir, wxEmptyString, wxEmptyString, wxFD_SAVE );
663 if( dlg.ShowModal() == wxID_CANCEL )
666 wxFileName newProjectDir( dlg.GetPath(), wxEmptyString );
668 if( !newProjectDir.IsAbsolute() )
669 newProjectDir.MakeAbsolute();
671 if( wxDirExists( newProjectDir.GetFullPath() ) )
673 msg.Printf(
_(
"'%s' already exists." ), newProjectDir.GetFullPath() );
678 if( !wxMkdir( newProjectDir.GetFullPath() ) )
681 "Please make sure you have sufficient permissions." ),
682 newProjectDir.GetPath() ) );
686 if( !newProjectDir.IsDirWritable() )
689 newProjectDir.GetFullPath() ) );
693 const wxString& newProjectDirPath = newProjectDir.GetFullPath();
694 const wxString& newProjectName = newProjectDir.GetDirs().Last();
695 wxDir currentProjectDir( currentProjectDirPath );
698 newProjectDirPath, newProjectName );
700 currentProjectDir.Traverse( traverser );
727 if( conditionalMenu )
728 conditionalMenu->Evaluate( dummySel );
760 player =
m_frame->Kiway().Player( playerType,
true );
764 wxLogError(
_(
"Application failed to load:\n" ) + err.
What() );
770 wxLogError(
_(
"Application cannot start." ) );
774 if( !player->IsVisible() )
780 wxFileName kicad_schematic(
m_frame->SchFileName() );
781 wxFileName legacy_schematic(
m_frame->SchLegacyFileName() );
783 if( !legacy_schematic.FileExists() || kicad_schematic.FileExists() )
784 filepath = kicad_schematic.GetFullPath();
786 filepath = legacy_schematic.GetFullPath();
790 wxFileName kicad_board(
m_frame->PcbFileName() );
791 wxFileName legacy_board(
m_frame->PcbLegacyFileName() );
793 if( !legacy_board.FileExists() || kicad_board.FileExists() )
794 filepath = kicad_board.GetFullPath();
796 filepath = legacy_board.GetFullPath();
799 if( !filepath.IsEmpty() )
801 std::vector<wxString> file_list{ filepath };
803 if( !player->OpenProjectFiles( file_list ) )
811 player->Show(
true );
815 if( player->IsIconized() )
816 player->Iconize(
false );
822 if( wxWindow::FindFocus() != player )
826 if(
Pgm().GetCommonSettings()->m_Session.remember_open_files
827 && !player->GetCurrentFileName().IsEmpty()
828 &&
Prj().GetLocalSettings().ShouldAutoSave() )
830 wxFileName rfn( player->GetCurrentFileName() );
831 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
834 player->SaveWindowSettings( &windowSettings );
864 wxFAIL_MSG(
"Execute(): unexpected request" );
866 if( execFile.IsEmpty() )
872 param =
m_frame->Prj().GetProjectPath();
875 return commonControl->
Execute( execFile, param );
903 std::string payload =
"";
922 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.
void SetCancelled(bool aCancel)
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 GetUserTemplatesPath()
Gets the user path for custom templates.
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.
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
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
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.
wxFileName EnsureDefaultProjectTemplate(const wxString &aBaseDir)
Seed the built-in "default" project template under aBaseDir, creating the directory tree and minimal ...
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)
IbisParser parser & reporter
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().