66#include <wx/filedlg.h>
68#include <wx/process.h>
73#include <../pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.h>
78#include <ApplicationServices/ApplicationServices.h>
85#define SEP() wxFileName::GetPathSeparator()
124#include <wx/xml/xml.h>
127 const wxPoint& pos,
const wxSize& size ) :
130 m_leftWin( nullptr ),
131 m_launcher( nullptr ),
132 m_mainToolBar( nullptr ),
133 m_lastToolbarIconSize( 0 )
135 const int defaultLeftWinWidth = FromDIP( 250 );
154 CreateStatusBar( 1 );
161 wxIconBundle icon_bundle;
165 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad_nightly, 48 ) );
166 icon_bundle.AddIcon( icon );
167 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad_nightly, 128 ) );
168 icon_bundle.AddIcon( icon );
169 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad_nightly, 256 ) );
170 icon_bundle.AddIcon( icon );
171 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad_nightly_32 ) );
172 icon_bundle.AddIcon( icon );
173 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad_nightly_16 ) );
174 icon_bundle.AddIcon( icon );
178 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad, 48 ) );
179 icon_bundle.AddIcon( icon );
180 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad, 128 ) );
181 icon_bundle.AddIcon( icon );
182 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad, 256 ) );
183 icon_bundle.AddIcon( icon );
184 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad_32 ) );
185 icon_bundle.AddIcon( icon );
186 icon.CopyFromBitmap(
KiBitmap( BITMAPS::icon_kicad_16 ) );
187 icon_bundle.AddIcon( icon );
190 SetIcons( icon_bundle );
208 m_auimgr.SetFlags( wxAUI_MGR_LIVE_RESIZE );
219 .Caption(
_(
"Project Files" ) ).PaneBorder(
false )
222 wxSize client_size = GetClientSize();
223 m_notebook =
new wxAuiNotebook(
this, wxID_ANY, wxPoint( client_size.x, client_size.y ),
224 FromDIP( wxSize( 430, 200 ) ),
225 wxAUI_NB_TOP | wxAUI_NB_CLOSE_ON_ALL_TABS | wxAUI_NB_TAB_MOVE
226 | wxAUI_NB_SCROLL_BUTTONS | wxNO_BORDER );
229 wxEVT_AUINOTEBOOK_PAGE_CLOSE,
243 .Caption(
_(
"Editors" ) )
252 wxSizer* mainSizer = GetSizer();
255 if( mainSizer &&
config()->m_Window.state.size_x == 0 &&
config()->m_Window.state.size_y == 0 )
256 mainSizer->Fit(
this );
259 SetTitle( wxT(
"KiCad" ) );
276 DragAcceptFiles(
true );
289 wxEVT_AUINOTEBOOK_PAGE_CLOSE,
301 m_pcm->StopBackgroundUpdate();
313 wxAuiNotebook* ctrl = (wxAuiNotebook*) evt.GetEventObject();
315 wxWindow* pageWindow = ctrl->GetPage( evt.GetSelection() );
337 const wxString&
name )
349 m_pcm = std::make_shared<PLUGIN_CONTENT_MANAGER>(
350 [
this](
int aUpdateCount )
354 if( aUpdateCount > 0 )
358 _(
"PCM Updates Available" ),
359 wxString::Format(
_(
"%d package update(s) avaliable" ), aUpdateCount ),
412#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
415 activeProjectCond.
Enable( activeProject );
458 wxString( wxEmptyString );
467 return fn.GetFullPath();
476 return fn.GetFullPath();
484 fn.SetExt( FILEEXT::PcbFileExtension );
485 return fn.GetFullPath();
494 return fn.GetFullPath();
539 wxString ext = fileName.GetExt();
543 wxString fn = fileName.GetFullPath();
551 wxString gerberFiles;
556 wxString ext = fileName.GetExt();
561 gerberFiles += wxT(
'\"' );
562 gerberFiles += fileName.GetFullPath() + wxT(
'\"' );
563 gerberFiles = gerberFiles.Pad( 1 );
567 wxString fn = fileName.GetFullPath();
573 if( !gerberFiles.IsEmpty() )
577 if( wxFileExists( fullEditorName ) )
579 wxString command = fullEditorName +
" " + gerberFiles;
592 for(
size_t i = 0; i <
m_notebook->GetPageCount(); i++ )
609 aEvent.StopPropagation();
615 if( aEvent.CanVeto() )
633 static std::atomic<unsigned int> lock_close_event( 0 );
635 if( ++lock_close_event > 1 )
641 for(
size_t i = 0; i <
m_notebook->GetPageCount(); i++ )
658 lock_close_event = 0;
671 if( !
Kiway().PlayersClose(
false ) )
690 for(
size_t i = 0; i <
m_notebook->GetPageCount(); i++ )
719 std::unique_ptr<JOBSET> jobsFile =
720 std::make_unique<JOBSET>( aFileName.GetFullPath().ToStdString() );
722 jobsFile->LoadFromFile();
727 m_notebook->AddPage( jobPanel, aFileName.GetFullName(),
739 if( !aProjectFileName.Exists() )
754 if( aProjectFileName.IsDirWritable() )
769 wxPostEvent(
this, cmd );
779 bool aCreateStubFiles )
781 wxCHECK_RET( aProjectFileName.DirExists() && aProjectFileName.IsDirWritable(),
782 "Project folder must exist and be writable to create a new project." );
785 if( !aProjectFileName.FileExists() )
787 wxFileName legacyPro( aProjectFileName );
790 if( legacyPro.FileExists() )
795 wxRemoveFile( legacyPro.GetFullPath() );
800 wxString srcFileName =
sys_search().FindValidPath(
"kicad.kicad_pro" );
802 wxFileName destFileName( aProjectFileName );
806 if( !wxFileName::FileExists( srcFileName )
807 || !wxCopyFile( srcFileName, destFileName.GetFullPath() ) )
809 wxFFile file( destFileName.GetFullPath(),
"wb" );
811 if( file.IsOpened() )
812 file.Write( wxT(
"{\n}\n") );
822 if( aCreateStubFiles )
824 wxFileName fn( aProjectFileName.GetFullPath() );
829 if( !fn.FileExists() )
831 wxFFile file( fn.GetFullPath(),
"wb" );
833 if( file.IsOpened() )
834 file.Write( wxString::Format(
"(kicad_sch (version %d) (generator \"eeschema\") (generator_version \"%s\")\n"
835 " (paper \"A4\")\n (lib_symbols)\n"
836 " (symbol_instances)\n)\n",
845 wxFileName leg_fn( fn );
848 if( !fn.FileExists() && !leg_fn.FileExists() )
850 wxFFile file( fn.GetFullPath(),
"wb" );
852 if( file.IsOpened() )
854 file.Write( wxString::Format(
"(kicad_pcb (version %d) (generator \"pcbnew\") (generator_version \"%s\")\n)",
877 wxFileDialog dlg(
this,
_(
"Edit File in Text Editor" ), default_dir, wxEmptyString, wildcard,
880 if( dlg.ShowModal() == wxID_CANCEL )
883 wxString filename = dlg.GetPath();
885 if( !dlg.GetPath().IsEmpty() && !
Pgm().GetTextEditor().IsEmpty() )
905 int id =
event.GetId();
927 if(
m_pcm && aEnvVarsChanged )
948 if( !file.IsEmpty() )
950 wxFileName fn( file );
952 title = fn.GetName();
954 if( !fn.IsDirWritable() )
955 title += wxS(
" " ) +
_(
"[Read Only]" );
959 title =
_(
"[no project loaded]" );
963 title += wxT(
" \u2014 " ) + wxString( wxS(
"KiCad" ) );
977 wxCHECK( settings, );
989 wxCHECK( settings, );
991 settings->m_LeftWinWidth =
m_leftWin->GetSize().x;
1002 wxString status = wxString::Format(
_(
"Project: %s" ),
Prj().GetProjectFullName() );
1026 if(
Pgm().GetCommonSettings()->m_Session.remember_open_files )
1028 int previousOpenCount =
1029 std::count_if(
Prj().GetLocalSettings().m_files.begin(),
1030 Prj().GetLocalSettings().m_files.end(),
1033 return !f.fileName.EndsWith( FILEEXT::ProjectFileExtension ) && f.open;
1036 if( previousOpenCount > 0 )
1039 previousOpenCount,
this );
1042 std::set<wxString> openedFiles;
1048 if( file.open && !openedFiles.count( file.fileName ) )
1050 progressReporter.
Update( i++,
1051 wxString::Format(
_(
"Restoring '%s'" ), file.fileName ) );
1053 openedFiles.insert( file.fileName );
1054 wxFileName fn( file.fileName );
1078 if( !
Pgm().GetCommonSettings()->m_DoNotShowAgain.update_check_prompt )
1081 prompt->ShowModal();
1092 m_pcm->RunBackgroundUpdate();
1095#ifdef KICAD_UPDATE_CHECK
constexpr EDA_IU_SCALE unityScale
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
wxString GetMajorMinorVersion()
Get only the major and minor version in a string major.minor.
bool IsNightlyVersion()
Check if the build is meant to be nightly.
static TOOL_ACTION saveAs
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
wxProgressDialog with the option to also update the application progress on the taskbar
virtual bool Update(int aValue, const wxString &aNewMsg=wxEmptyString, bool *aSkip=nullptr) override
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
void UnregisterStatusBar(KISTATUSBAR *aStatusBar)
Removes status bar from handling.
void RegisterStatusBar(KISTATUSBAR *aStatusBar)
Add a status bar for handling.
Handle actions that are shared between different applications.
DO_NOT_SHOW_AGAIN m_DoNotShowAgain
The base frame for deriving all KiCad main window classes.
void LoadWindowState(const wxString &aFileName)
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
std::vector< wxFileName > m_AcceptedFiles
SETTINGS_MANAGER * GetSettingsManager() const
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
std::map< const wxString, TOOL_ACTION * > m_acceptedExts
Associates files extensions with action to execute.
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Save common frame parameters to a configuration data file.
void SetMruPath(const wxString &aPath)
virtual void RegisterUIUpdateHandler(int aID, const ACTION_CONDITIONS &aConditions) override
Register a UI update handler for the control with ID aID.
bool m_isClosing
Set by NonUserClose() to indicate that the user did not request the current close.
void ReCreateMenuBar()
Recreates the menu bar.
Specialization of the wxAuiPaneInfo class for KiCad panels.
virtual bool SaveToFile(const wxString &aDirectory="", bool aForce=false)
Calls Store() and then writes the contents of the JSON document to a file.
static TOOL_ACTION viewDroppedGerbers
static TOOL_ACTION editPCB
static TOOL_ACTION loadProject
static TOOL_ACTION editSchematic
static TOOL_ACTION openTextEditor
static TOOL_ACTION closeProject
Handle actions in the kicad manager frame.
The main KiCad project manager frame.
std::shared_ptr< PLUGIN_CONTENT_MANAGER > m_pcm
void language_change(wxCommandEvent &event)
void SetPcmButton(BITMAP_BUTTON *aButton)
void doCloseWindow() override
void CreateNewProject(const wxFileName &aProjectFileName, bool aCreateStubFiles=true)
Creates a new project by setting up and initial project, schematic, and board files.
void OnUnarchiveFiles(wxCommandEvent &event)
wxString m_FileWatcherInfo
const SEARCH_STACK & sys_search() override
Return a SEARCH_STACK pertaining to entire program.
void OnImportEasyEdaProFiles(wxCommandEvent &event)
Open dialog to import EasyEDA Pro schematic and board files.
void ProjectChanged() override
Notification event that the project has changed.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
const wxString SchLegacyFileName()
void OpenJobsFile(const wxFileName &aFileName, bool aCreate=false)
void RecreateBaseLeftToolbar()
(Re)Create the left vertical toolbar
wxWindow * GetToolCanvas() const override
Canvas access.
void OnImportEasyEdaFiles(wxCommandEvent &event)
Open dialog to import EasyEDA Std schematic and board files.
PROJECT_TREE_PANE * m_leftWin
const wxString GetProjectFileName() const
void updatePcmButtonBadge()
void OnBrowseInFileExplorer(wxCommandEvent &event)
KICAD_SETTINGS * kicadSettings() const
const wxString SchFileName()
void OnImportEagleFiles(wxCommandEvent &event)
Open dialog to import Eagle schematic and board files.
wxStatusBar * OnCreateStatusBar(int number, long style, wxWindowID id, const wxString &name) override
Create the status line (like a wxStatusBar).
void OnExit(wxCommandEvent &event)
void LoadProject(const wxFileName &aProjectFileName)
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
void OnSize(wxSizeEvent &event) override
virtual void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
void DoWithAcceptedFiles() override
Execute action on accepted dropped file.
void OnOpenFileInTextEditor(wxCommandEvent &event)
APP_SETTINGS_BASE * config() const override
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
int m_lastToolbarIconSize
const wxString PcbLegacyFileName()
KICAD_MANAGER_FRAME(wxWindow *parent, const wxString &title, const wxPoint &pos, const wxSize &size)
bool CloseProject(bool aSave)
Closes the project, and saves it if aSave is true;.
void onNotebookPageCloseRequest(wxAuiNotebookEvent &evt)
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
void OnIdle(wxIdleEvent &event)
void onToolbarSizeChanged()
void PrintPrjInfo()
Prints the current working directory name and the project name on the text panel.
ACTION_TOOLBAR * m_mainToolBar
void OnArchiveFiles(wxCommandEvent &event)
void OnImportCadstarArchiveFiles(wxCommandEvent &event)
Open dialog to import CADSTAR Schematic and PCB Archive files.
void RefreshProjectTree()
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
BITMAP_BUTTON * m_pcmButton
PANEL_KICAD_LAUNCHER * m_launcher
wxString help_name() override
const wxString PcbFileName()
std::unique_ptr< UPDATE_MANAGER > m_updateManager
wxAuiNotebook * m_notebook
std::vector< wxString > m_OpenProjects
std::vector< std::pair< wxString, wxString > > m_PcmRepositories
KISTATUSBAR is a wxStatusBar suitable for Kicad manager.
void SetEllipsedTextField(const wxString &aText, int aFieldId)
Set the text in a field using wxELLIPSIZE_MIDDLE option to adjust the text size to the field size (un...
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
virtual void SetLanguage(int aLanguage)
Change the language and then calls ShowChangedLanguage() on all #KIWAY_PLAYERs.
void RegisterStatusBar(KISTATUSBAR *aStatusBar)
Add a status bar for handling.
void CreateOrUpdate(const wxString &aKey, const wxString &aTitle, const wxString &aDescription, const wxString &aHref=wxEmptyString)
Creates a notification with the given parameters or updates an existing one with the same key.
void Remove(const wxString &aKey)
Remove a notification by key.
void UnregisterStatusBar(KISTATUSBAR *aStatusBar)
Removes status bar from handling.
static REPORTER & GetInstance()
void SetClosable(bool aYes)
virtual bool GetCanClose()
void SetProjectTied(bool aYes)
virtual COMMON_SETTINGS * GetCommonSettings() const
virtual BACKGROUND_JOBS_MONITOR & GetBackgroundJobMonitor() const
virtual NOTIFICATIONS_MANAGER & GetNotificationsManager() const
virtual SETTINGS_MANAGER & GetSettingsManager() const
wxString GetHelpFileName()
SEARCH_STACK & SysSearch()
APP_SETTINGS_BASE * PgmSettings()
PROJECT_TREE_PANE Window to display the tree files.
void EmptyTreePrj()
Delete all m_TreeProject entries.
void ReCreateTreePrj()
Create or modify the tree showing project file names.
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
Look for files in a number of paths.
static bool ShowNever(const SELECTION &aSelection)
Always returns false.
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Saves a loaded project.
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads a project or sets up a new project with a specified path.
bool IsProjectOpen() const
Helper for checking if we have a project open TODO: This should be deprecated along with Prj() once w...
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Saves, unloads and unregisters the given PROJECT.
std::vector< wxString > GetOpenProjects() const
bool TriggerBackupIfNeeded(REPORTER &aReporter) const
Calls BackupProject if a new backup is needed according to the current backup policy.
Base window classes and related definitions.
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define KICAD_MANAGER_FRAME_NAME
const wxString GERBVIEW_EXE
wxString FindKicadFile(const wxString &shortname)
Search the executable file shortname in KiCad binary path and return full file name if found or short...
static const std::string LegacySchematicFileExtension
static const std::string GerberJobFileExtension
static const std::string GerberFileExtension
static const std::string ProjectFileExtension
static const std::string LegacyPcbFileExtension
static const std::string LegacyProjectFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string DrillFileExtension
static const std::string KiCadPcbFileExtension
static wxString AllFilesWildcard()
static bool IsGerberFileExtension(const wxString &ext)
IDs used in KiCad main frame foe menuitems and tools.
@ ID_IMPORT_EAGLE_PROJECT
@ ID_IMPORT_EASYEDAPRO_PROJECT
@ ID_IMPORT_CADSTAR_ARCHIVE_PROJECT
@ ID_EDIT_LOCAL_FILE_IN_TEXT_EDITOR
@ ID_IMPORT_EASYEDA_PROJECT
@ ID_BROWSE_IN_FILE_EXPLORER
EVT_MENU_RANGE(ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, KICAD_MANAGER_FRAME::language_change) static JOBSET *test
bool LaunchExternal(const wxString &aPath)
Launches the given file or folder in the host OS.
KICOMMON_API wxFont GetStatusFont(wxWindow *aWindow)
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
PGM_BASE & Pgm()
The global Program "get" accessor.
#define SEXPR_SCHEMATIC_FILE_VERSION
Schematic file version.
KIWAY Kiway(KFCTL_STANDALONE)
std::vector< FAB_LAYER_COLOR > dummy
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
ACTION_CONDITIONS & Enable(const SELECTION_CONDITION &aCondition)
Definition of file extensions used in Kicad.