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                                 titleDirList, defaultTemplate );
 
  235    if( 
result == wxID_APPLY )
 
  239        if( !projectToEdit.IsEmpty() && wxFileExists( projectToEdit ) )
 
  241            m_frame->LoadProject( wxFileName( projectToEdit ) );
 
  251    if( !selectedTemplate )
 
  254    if( !selectedTemplate )
 
  256        wxMessageBox( 
_( 
"No project template was selected.  Cannot generate new project." ), 
_( 
"Error" ),
 
  257                      wxOK | wxICON_ERROR, 
m_frame );
 
  262    wxString        default_dir = wxFileName( 
Prj().GetProjectFullName() ).GetPathWithSep();
 
  263    wxString        title = 
_( 
"New Project Folder" );
 
  265                         wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
  270    dlg.SetCustomizeHook( newProjectHook );
 
  272    if( dlg.ShowModal() == wxID_CANCEL )
 
  275    wxFileName fn( dlg.GetPath() );
 
  278        fn.SetName( fn.GetName() + wxT( 
"." ) + fn.GetExt() );
 
  282    if( !fn.IsAbsolute() )
 
  285    bool createNewDir = 
false;
 
  289        fn.AppendDir( fn.GetName() );
 
  291    if( !fn.DirExists() && !fn.Mkdir() )
 
  294                                                           "Make sure you have write permissions and try again." ),
 
  299    if( !fn.IsDirWritable() )
 
  306    std::vector< wxFileName > destFiles;
 
  310        std::vector<wxFileName> overwrittenFiles;
 
  312        for( 
const wxFileName& file : destFiles )
 
  314            if( file.FileExists() )
 
  315                overwrittenFiles.push_back( file );
 
  318        if( !overwrittenFiles.empty() )
 
  320            wxString extendedMsg = 
_( 
"Overwriting files:" ) + 
"\n";
 
  322            for( 
const wxFileName& file : overwrittenFiles )
 
  323                extendedMsg += 
"\n" + file.GetFullName();
 
  325            KIDIALOG msgDlg( 
m_frame, 
_( 
"Similar files already exist in the destination folder." ),
 
  326                             _( 
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
 
  327            msgDlg.SetExtendedMessage( extendedMsg );
 
  328            msgDlg.SetOKLabel( 
_( 
"Overwrite" ) );
 
  344    m_frame->CreateNewProject( fn.GetFullPath() );
 
 
  354    dlg.SetTitle( 
_( 
"Clone Project from Git Repository" ) );
 
  389    if( projects.empty() )
 
  397    wxString dest = pro.GetPath() + wxFileName::GetPathSeparator() + projects.front();
 
 
  417    wxString     default_dir = wxFileName( 
Prj().GetProjectFullName() ).GetPathWithSep();
 
  419                      wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
  421    if( dlg.ShowModal() == wxID_CANCEL )
 
  424    wxFileName jobsetFn( dlg.GetPath() );
 
  427    bool fileExists = wxFileExists( jobsetFn.GetFullPath() );
 
  432        if( !wxRemoveFile( jobsetFn.GetFullPath() ) )
 
  438    m_frame->OpenJobsFile( jobsetFn.GetFullPath(), 
true );
 
 
  452    wxFileDialog dlg( 
m_frame, 
_( 
"Open Existing Project" ), aDefaultDir, wxEmptyString, wildcard,
 
  453                      wxFD_OPEN | wxFD_FILE_MUST_EXIST );
 
  457    if( dlg.ShowModal() == wxID_CANCEL )
 
  460    wxFileName pro( dlg.GetPath() );
 
  462    if( !pro.IsAbsolute() )
 
 
  493    wxString     default_dir = wxFileName( 
Prj().GetProjectFullName() ).GetPathWithSep();
 
  495                      wxFD_OPEN | wxFD_FILE_MUST_EXIST );
 
  497    if( dlg.ShowModal() == wxID_CANCEL )
 
  500    wxFileName jobsetFn( dlg.GetPath() );
 
  502    m_frame->OpenJobsFile( jobsetFn.GetFullPath(), 
true );
 
 
  525    wxFileName fileName = 
m_frame->GetProjectFileName();
 
  529    wxFileDialog dlg( 
m_frame, 
_( 
"Archive Project Files" ), fileName.GetPath(), fileName.GetFullName(),
 
  532    if( dlg.ShowModal() == wxID_CANCEL )
 
  535    wxFileName zipFile = dlg.GetPath();
 
  537    wxString currdirname = fileName.GetPathWithSep();
 
  538    wxDir dir( currdirname );
 
  540    if( !dir.IsOpened() )   
 
  546    archiver.
Archive( currdirname, zipFile.GetFullPath(), reporter, 
true, 
true );
 
 
  567    m_frame->RestoreLocalHistory();
 
 
  582        wxExecute( *aEvent.
Parameter<wxString*>(), wxEXEC_ASYNC );
 
 
  593    wxFileName   currentProjectFile( 
Prj().GetProjectFullName() );
 
  594    wxString     currentProjectDirPath = currentProjectFile.GetPath();
 
  597    wxString     default_dir = 
m_frame->GetMruPath();
 
  602    if( default_dir == currentProjectDirPath
 
  603            || default_dir == currentProjectDirPath + wxFileName::GetPathSeparator() )
 
  606        wxFileName default_dir_fn( default_dir );
 
  607        default_dir_fn.RemoveLastDir();
 
  608        default_dir = default_dir_fn.GetPath();
 
  611    wxFileDialog dlg( 
m_frame, 
_( 
"Save Project To" ), default_dir, wxEmptyString, wxEmptyString, wxFD_SAVE );
 
  615    if( dlg.ShowModal() == wxID_CANCEL )
 
  618    wxFileName newProjectDir( dlg.GetPath(), wxEmptyString );
 
  620    if( !newProjectDir.IsAbsolute() )
 
  621        newProjectDir.MakeAbsolute();
 
  623    if( wxDirExists( newProjectDir.GetFullPath() ) )
 
  625        msg.Printf( 
_( 
"'%s' already exists." ), newProjectDir.GetFullPath() );
 
  630    if( !wxMkdir( newProjectDir.GetFullPath() ) )
 
  633                                                           "Please make sure you have sufficient permissions." ),
 
  634                                                        newProjectDir.GetPath() ) );
 
  638    if( !newProjectDir.IsDirWritable() )
 
  641                                                        newProjectDir.GetFullPath() ) );
 
  645    const wxString&   newProjectDirPath = newProjectDir.GetFullPath();
 
  646    const wxString&   newProjectName = newProjectDir.GetDirs().Last();
 
  647    wxDir             currentProjectDir( currentProjectDirPath );
 
  650                                     newProjectDirPath, newProjectName );
 
  652    currentProjectDir.Traverse( traverser );
 
 
  679    if( conditionalMenu )
 
  680        conditionalMenu->Evaluate( dummySel );
 
 
  712        player = 
m_frame->Kiway().Player( playerType, 
true );
 
  716        wxLogError( 
_( 
"Application failed to load:\n" ) + err.
What() );
 
  722        wxLogError( 
_( 
"Application cannot start." ) );
 
  726    if( !player->IsVisible() )   
 
  732            wxFileName  kicad_schematic( 
m_frame->SchFileName() );
 
  733            wxFileName  legacy_schematic( 
m_frame->SchLegacyFileName() );
 
  735            if( !legacy_schematic.FileExists() || kicad_schematic.FileExists() )
 
  736                filepath = kicad_schematic.GetFullPath();
 
  738                filepath = legacy_schematic.GetFullPath();
 
  742            wxFileName  kicad_board( 
m_frame->PcbFileName() );
 
  743            wxFileName  legacy_board( 
m_frame->PcbLegacyFileName() );
 
  745            if( !legacy_board.FileExists() || kicad_board.FileExists() )
 
  746                filepath = kicad_board.GetFullPath();
 
  748                filepath = legacy_board.GetFullPath();
 
  751        if( !filepath.IsEmpty() )
 
  753            std::vector<wxString> file_list{ filepath };
 
  755            if( !player->OpenProjectFiles( file_list ) )
 
  763        player->Show( 
true );
 
  767    if( player->IsIconized() )
 
  768        player->Iconize( 
false );
 
  774    if( wxWindow::FindFocus() != player )
 
  778    if( 
Pgm().GetCommonSettings()->m_Session.remember_open_files
 
  779            && !player->GetCurrentFileName().IsEmpty()
 
  780            && 
Prj().GetLocalSettings().ShouldAutoSave() )
 
  782        wxFileName rfn( player->GetCurrentFileName() );
 
  783        rfn.MakeRelativeTo( 
Prj().GetProjectPath() );
 
  786        player->SaveWindowSettings( &windowSettings );
 
 
  816        wxFAIL_MSG( 
"Execute(): unexpected request" );
 
  818    if( execFile.IsEmpty() )
 
  824        param = 
m_frame->Prj().GetProjectPath();
 
  827    return commonControl->
Execute( execFile, param );
 
 
  855        std::string payload = 
"";
 
  879        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
 
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.
 
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 void SetElem(PROJECT::ELEM aIndex, _ELEM *aElem)
 
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.