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;
230 wxString browsedTemplatesPath;
237 systemTemplatesPath, defaultTemplatesPath,
242 templateWindowPos = ps.GetPosition();
243 templateWindowSize = ps.GetSize();
252 htmlFile.RemoveLastDir();
253 selectedTemplatePath = htmlFile.GetPath();
262 if(
result == wxID_APPLY )
264 if( !projectToEdit.IsEmpty() && wxFileExists( projectToEdit ) )
266 m_frame->LoadProject( wxFileName( projectToEdit ) );
274 if( selectedTemplatePath.IsEmpty() )
276 wxMessageBox(
_(
"No project template was selected. Cannot generate new project." ),
_(
"Error" ),
277 wxOK | wxICON_ERROR,
m_frame );
285 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
286 wxString title =
_(
"New Project Folder" );
288 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
293 dlg.SetCustomizeHook( newProjectHook );
297 if( dlg.ShowModal() == wxID_CANCEL )
300 wxFileName fn( dlg.GetPath() );
303 fn.SetName( fn.GetName() + wxT(
"." ) + fn.GetExt() );
307 if( !fn.IsAbsolute() )
310 bool createNewDir =
false;
314 fn.AppendDir( fn.GetName() );
316 if( !fn.DirExists() && !fn.Mkdir() )
319 "Make sure you have write permissions and try again." ),
324 if( !fn.IsDirWritable() )
331 std::vector< wxFileName > destFiles;
335 std::vector<wxFileName> overwrittenFiles;
337 for(
const wxFileName& file : destFiles )
339 if( file.FileExists() )
340 overwrittenFiles.push_back( file );
343 if( !overwrittenFiles.empty() )
345 wxString extendedMsg =
_(
"Overwriting files:" ) +
"\n";
347 for(
const wxFileName& file : overwrittenFiles )
348 extendedMsg +=
"\n" + file.GetFullName();
350 KIDIALOG msgDlg(
m_frame,
_(
"Similar files already exist in the destination folder." ),
351 _(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
352 msgDlg.SetExtendedMessage( extendedMsg );
353 msgDlg.SetOKLabel(
_(
"Overwrite" ) );
370 wxFileName templateDir = selectedTemplate.
GetHtmlFile();
371 templateDir.RemoveLastDir();
372 wxString templatePath = templateDir.GetPath();
378 recentTemplates.erase( std::remove( recentTemplates.begin(), recentTemplates.end(), templatePath ),
379 recentTemplates.end() );
380 recentTemplates.insert( recentTemplates.begin(), templatePath );
382 if( recentTemplates.size() > 5 )
383 recentTemplates.resize( 5 );
385 m_frame->CreateNewProject( fn.GetFullPath() );
395 dlg.SetTitle(
_(
"Clone Project from Git Repository" ) );
431 if( projects.empty() )
439 wxString dest = pro.GetPath() + wxFileName::GetPathSeparator() + projects.front();
459 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
461 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
465 if( dlg.ShowModal() == wxID_CANCEL )
468 wxFileName jobsetFn( dlg.GetPath() );
471 bool fileExists = wxFileExists( jobsetFn.GetFullPath() );
476 if( !wxRemoveFile( jobsetFn.GetFullPath() ) )
482 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
496 wxFileDialog dlg(
m_frame,
_(
"Open Existing Project" ), aDefaultDir, wxEmptyString, wildcard,
497 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
503 if( dlg.ShowModal() == wxID_CANCEL )
506 wxFileName pro( dlg.GetPath() );
508 if( !pro.IsAbsolute() )
539 wxString default_dir = wxFileName(
Prj().GetProjectFullName() ).GetPathWithSep();
541 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
545 if( dlg.ShowModal() == wxID_CANCEL )
548 wxFileName jobsetFn( dlg.GetPath() );
550 m_frame->OpenJobsFile( jobsetFn.GetFullPath(),
true );
573 wxFileName fileName =
m_frame->GetProjectFileName();
577 wxFileDialog dlg(
m_frame,
_(
"Archive Project Files" ), fileName.GetPath(), fileName.GetFullName(),
582 if( dlg.ShowModal() == wxID_CANCEL )
585 wxFileName zipFile = dlg.GetPath();
587 wxString currdirname = fileName.GetPathWithSep();
588 wxDir dir( currdirname );
590 if( !dir.IsOpened() )
596 archiver.
Archive( currdirname, zipFile.GetFullPath(),
reporter,
true,
true );
617 m_frame->RestoreLocalHistory();
632 wxExecute( *aEvent.
Parameter<wxString*>(), wxEXEC_ASYNC );
643 wxFileName currentProjectFile(
Prj().GetProjectFullName() );
644 wxString currentProjectDirPath = currentProjectFile.GetPath();
647 wxString default_dir =
m_frame->GetMruPath();
652 if( default_dir == currentProjectDirPath
653 || default_dir == currentProjectDirPath + wxFileName::GetPathSeparator() )
656 wxFileName default_dir_fn( default_dir );
657 default_dir_fn.RemoveLastDir();
658 default_dir = default_dir_fn.GetPath();
661 wxFileDialog dlg(
m_frame,
_(
"Save Project To" ), default_dir, wxEmptyString, wxEmptyString, wxFD_SAVE );
667 if( dlg.ShowModal() == wxID_CANCEL )
670 wxFileName newProjectDir( dlg.GetPath(), wxEmptyString );
672 if( !newProjectDir.IsAbsolute() )
673 newProjectDir.MakeAbsolute();
675 if( wxDirExists( newProjectDir.GetFullPath() ) )
677 msg.Printf(
_(
"'%s' already exists." ), newProjectDir.GetFullPath() );
682 if( !wxMkdir( newProjectDir.GetFullPath() ) )
685 "Please make sure you have sufficient permissions." ),
686 newProjectDir.GetPath() ) );
690 if( !newProjectDir.IsDirWritable() )
693 newProjectDir.GetFullPath() ) );
697 const wxString& newProjectDirPath = newProjectDir.GetFullPath();
698 const wxString& newProjectName = newProjectDir.GetDirs().Last();
699 wxDir currentProjectDir( currentProjectDirPath );
702 newProjectDirPath, newProjectName );
704 currentProjectDir.Traverse( traverser );
731 if( conditionalMenu )
732 conditionalMenu->Evaluate( dummySel );
764 player =
m_frame->Kiway().Player( playerType,
true );
768 wxLogError(
_(
"Application failed to load:\n" ) + err.
What() );
774 wxLogError(
_(
"Application cannot start." ) );
778 if( !player->IsVisible() )
784 wxFileName kicad_schematic(
m_frame->SchFileName() );
785 wxFileName legacy_schematic(
m_frame->SchLegacyFileName() );
787 if( !legacy_schematic.FileExists() || kicad_schematic.FileExists() )
788 filepath = kicad_schematic.GetFullPath();
790 filepath = legacy_schematic.GetFullPath();
794 wxFileName kicad_board(
m_frame->PcbFileName() );
795 wxFileName legacy_board(
m_frame->PcbLegacyFileName() );
797 if( !legacy_board.FileExists() || kicad_board.FileExists() )
798 filepath = kicad_board.GetFullPath();
800 filepath = legacy_board.GetFullPath();
803 if( !filepath.IsEmpty() )
805 std::vector<wxString> file_list{ filepath };
807 if( !player->OpenProjectFiles( file_list ) )
815 player->Show(
true );
819 if( player->IsIconized() )
820 player->Iconize(
false );
826 if( wxWindow::FindFocus() != player )
830 if(
Pgm().GetCommonSettings()->m_Session.remember_open_files
831 && !player->GetCurrentFileName().IsEmpty()
832 &&
Prj().GetLocalSettings().ShouldAutoSave() )
834 wxFileName rfn( player->GetCurrentFileName() );
835 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
838 player->SaveWindowSettings( &windowSettings );
868 wxFAIL_MSG(
"Execute(): unexpected request" );
870 if( execFile.IsEmpty() )
876 param =
m_frame->Prj().GetProjectPath();
879 return commonControl->
Execute( execFile, param );
907 std::string payload =
"";
926 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
wxString GetBrowsedTemplatesPath() const
Last directory chosen via the "Browse..." button so the caller can persist it.
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
wxString m_BrowsedTemplatesPath
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().