KiCad PCB EDA Suite
eda_base_frame.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>
6  * Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
32 #include <wx/stdpaths.h>
33 #include <wx/string.h>
34 #include <wx/display.h>
35 
36 #include <dialog_shim.h>
37 #include <eda_doc.h>
38 #include <id.h>
39 #include <kiface_i.h>
40 #include <pgm_base.h>
41 #include <trace_helpers.h>
42 #include <panel_hotkeys_editor.h>
44 #include <widgets/paged_dialog.h>
45 
46 
48 #define DEFAULT_AUTO_SAVE_INTERVAL 600
49 
50 #define URL_GET_INVOLVED "http://kicad-pcb.org/contribute/"
51 
54 
56 static const wxString entryAutoSaveInterval = "AutoSaveInterval";
57 
59 static const wxString entryPerspective = "Perspective";
60 
62 static const wxString entryMruPath = "MostRecentlyUsedPath";
63 
64 static const wxString entryPosY = "Pos_y";
65 static const wxString entryPosX = "Pos_x";
66 static const wxString entrySizeY = "Size_y";
67 static const wxString entrySizeX = "Size_x";
68 static const wxString entryMaximized = "Maximized";
69 
71 EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType,
72  const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
73  long aStyle, const wxString& aFrameName ) :
74  wxFrame( aParent, wxID_ANY, aTitle, aPos, aSize, aStyle, aFrameName )
75 {
76  m_Ident = aFrameType;
77  m_hasAutoSave = false;
78  m_autoSaveState = false;
79  m_autoSaveInterval = -1;
80  m_autoSaveTimer = new wxTimer( this, ID_AUTO_SAVE_TIMER );
81  m_mruPath = wxStandardPaths::Get().GetDocumentsDir();
82 
83  // Gives a reasonable minimal size to the frame:
84  const int minsize_x = 500;
85  const int minsize_y = 400;
86  SetSizeHints( minsize_x, minsize_y, -1, -1, -1, -1 );
87 
88  // Store dimensions of the user area of the main window.
89  GetClientSize( &m_FrameSize.x, &m_FrameSize.y );
90 
91  Connect( ID_AUTO_SAVE_TIMER, wxEVT_TIMER,
92  wxTimerEventHandler( EDA_BASE_FRAME::onAutoSaveTimer ) );
93 
94  // hook wxEVT_CLOSE_WINDOW so we can call SaveSettings(). This function seems
95  // to be called before any other hook for wxCloseEvent, which is necessary.
96  Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( EDA_BASE_FRAME::windowClosing ) );
97 }
98 
99 
101 {
102  for( auto& iter : GetChildren() )
103  {
104  DIALOG_SHIM* dlg = dynamic_cast<DIALOG_SHIM*>( iter );
105  if( dlg && dlg->IsQuasiModal() )
106  return dlg;
107  }
108 
109  // FIXME: CvPcb is currently implemented on top of KIWAY_PLAYER rather than DIALOG_SHIM,
110  // so we have to look for it separately.
111  if( m_Ident == FRAME_SCH )
112  {
113  wxWindow* cvpcb = wxWindow::FindWindowByName( "CvpcbFrame" );
114  if( cvpcb )
115  return cvpcb;
116  }
117 
118  return nullptr;
119 }
120 
121 
122 void EDA_BASE_FRAME::windowClosing( wxCloseEvent& event )
123 {
124  // Don't allow closing when a quasi-modal is open.
125  wxWindow* quasiModal = findQuasiModalDialog();
126 
127  if( quasiModal )
128  {
129  // Raise and notify; don't give the user a warning regarding "quasi-modal dialogs"
130  // when they have no idea what those are.
131  quasiModal->Raise();
132  wxBell();
133 
134  event.Veto();
135  return;
136  }
137 
138  wxConfigBase* cfg = config();
139 
140  if( cfg )
141  SaveSettings( cfg ); // virtual, wxFrame specific
142 
143  event.Skip(); // we did not "handle" the event, only eavesdropped on it.
144 }
145 
146 
148 {
149  delete m_autoSaveTimer;
150 
151  // This is needed for OSX: avoids further OnDraw processing after this
152  // destructor and before the native window is destroyed
153  this->Freeze();
154 }
155 
156 
157 bool EDA_BASE_FRAME::ProcessEvent( wxEvent& aEvent )
158 {
159 #ifdef __WXMAC__
160  // Apple in its infinite wisdom will raise a disabled window before even passing
161  // us the event, so we have no way to stop it. Instead, we have to catch an
162  // improperly ordered disabled window and quasi-modal dialog here and reorder
163  // them.
164  if( !IsEnabled() && IsActive() )
165  {
166  wxWindow* dlg = findQuasiModalDialog();
167  if( dlg )
168  dlg->Raise();
169  }
170 #endif
171 
172  if( !wxFrame::ProcessEvent( aEvent ) )
173  return false;
174 
175  if( IsShown() && m_hasAutoSave && IsActive() &&
177  {
178  if( !m_autoSaveState )
179  {
180  wxLogTrace( traceAutoSave, wxT( "Starting auto save timer." ) );
181  m_autoSaveTimer->Start( m_autoSaveInterval * 1000, wxTIMER_ONE_SHOT );
182  m_autoSaveState = true;
183  }
184  else if( m_autoSaveTimer->IsRunning() )
185  {
186  wxLogTrace( traceAutoSave, wxT( "Stopping auto save timer." ) );
187  m_autoSaveTimer->Stop();
188  m_autoSaveState = false;
189  }
190  }
191 
192  return true;
193 }
194 
195 
197 {
198  m_autoSaveInterval = aInterval;
199 
200  if( m_autoSaveTimer->IsRunning() )
201  {
202  if( m_autoSaveInterval > 0 )
203  {
204  m_autoSaveTimer->Start( m_autoSaveInterval * 1000, wxTIMER_ONE_SHOT );
205  }
206  else
207  {
208  m_autoSaveTimer->Stop();
209  m_autoSaveState = false;
210  }
211  }
212 }
213 
214 
215 void EDA_BASE_FRAME::onAutoSaveTimer( wxTimerEvent& aEvent )
216 {
217  if( !doAutoSave() )
218  m_autoSaveTimer->Start( m_autoSaveInterval * 1000, wxTIMER_ONE_SHOT );
219 }
220 
221 
223 {
224  wxCHECK_MSG( false, true, wxT( "Auto save timer function not overridden. Bad programmer!" ) );
225 }
226 
227 
229 {
230 }
231 
232 
234 {
235  if( GetMenuBar() )
236  {
237  ReCreateMenuBar();
238  GetMenuBar()->Refresh();
239  }
240 }
241 
242 
244 {
245  if( GetMenuBar() )
246  {
247  // For icons in menus, icon scaling & hotkeys
248  ReCreateMenuBar();
249  GetMenuBar()->Refresh();
250  }
251 }
252 
253 
254 void EDA_BASE_FRAME::LoadSettings( wxConfigBase* aCfg )
255 {
256  int maximized = 0;
257 
258  wxString baseCfgName = ConfigBaseName();
259 
260  wxString text = baseCfgName + entryPosX;
261  aCfg->Read( text, &m_FramePos.x, m_FramePos.x );
262 
263  text = baseCfgName + entryPosY;
264  aCfg->Read( text, &m_FramePos.y, m_FramePos.y );
265 
266  text = baseCfgName + entrySizeX;
267  aCfg->Read( text, &m_FrameSize.x, m_FrameSize.x );
268 
269  text = baseCfgName + entrySizeY;
270  aCfg->Read( text, &m_FrameSize.y, m_FrameSize.y );
271 
272  text = baseCfgName + entryMaximized;
273  aCfg->Read( text, &maximized, 0 );
274 
275  if( m_hasAutoSave )
276  {
277  text = baseCfgName + entryAutoSaveInterval;
278  aCfg->Read( text, &m_autoSaveInterval, DEFAULT_AUTO_SAVE_INTERVAL );
279  }
280 
281  // Ensure the window is on a connected display, and is visible.
282  // (at least a corner of the frame must be visible on screen)
283  // Sometimes, if a window was moved on an auxiliary display, and when this
284  // display is no more available, it is not the case.
285  wxRect rect( m_FramePos, m_FrameSize );
286 
287  if( wxDisplay::GetFromPoint( rect.GetTopLeft() ) == wxNOT_FOUND &&
288  wxDisplay::GetFromPoint( rect.GetTopRight() ) == wxNOT_FOUND &&
289  wxDisplay::GetFromPoint( rect.GetBottomLeft() ) == wxNOT_FOUND &&
290  wxDisplay::GetFromPoint( rect.GetBottomRight() ) == wxNOT_FOUND )
291  {
292  m_FramePos = wxDefaultPosition;
293  }
294 
295  // Ensure Window title bar is visible
296 #if defined( __WXMAC__ )
297  // for macOSX, the window must be below system (macOSX) toolbar
298  // Ypos_min = GetMBarHeight(); seems no more exist in new API (subject to change)
299  int Ypos_min = 20;
300 #else
301  int Ypos_min = 0;
302 #endif
303  if( m_FramePos.y < Ypos_min )
304  m_FramePos.y = Ypos_min;
305 
306  if( maximized )
307  Maximize();
308 
309  aCfg->Read( baseCfgName + entryPerspective, &m_perspective );
310  aCfg->Read( baseCfgName + entryMruPath, &m_mruPath );
311 }
312 
313 
314 void EDA_BASE_FRAME::SaveSettings( wxConfigBase* aCfg )
315 {
316  wxString text;
317 
318  if( IsIconized() )
319  return;
320 
321  wxString baseCfgName = ConfigBaseName();
322 
323  m_FrameSize = GetSize();
324  m_FramePos = GetPosition();
325 
326  text = baseCfgName + wxT( "Pos_x" );
327  aCfg->Write( text, (long) m_FramePos.x );
328 
329  text = baseCfgName + wxT( "Pos_y" );
330  aCfg->Write( text, (long) m_FramePos.y );
331 
332  text = baseCfgName + wxT( "Size_x" );
333  aCfg->Write( text, (long) m_FrameSize.x );
334 
335  text = baseCfgName + wxT( "Size_y" );
336  aCfg->Write( text, (long) m_FrameSize.y );
337 
338  text = baseCfgName + wxT( "Maximized" );
339  aCfg->Write( text, IsMaximized() );
340 
341  if( m_hasAutoSave )
342  {
343  text = baseCfgName + entryAutoSaveInterval;
344  aCfg->Write( text, m_autoSaveInterval );
345  }
346 
347  // Once this is fully implemented, wxAuiManager will be used to maintain
348  // the persistance of the main frame and all it's managed windows and
349  // all of the legacy frame persistence position code can be removed.
350  wxString perspective = m_auimgr.SavePerspective();
351 
352  // printf( "perspective(%s): %s\n",
353  // TO_UTF8( m_FrameName + entryPerspective ), TO_UTF8( perspective ) );
354  aCfg->Write( baseCfgName + entryPerspective, perspective );
355  aCfg->Write( baseCfgName + entryMruPath, m_mruPath );
356 }
357 
358 
359 wxConfigBase* EDA_BASE_FRAME::config()
360 {
361  // KICAD_MANAGER_FRAME overrides this
362  wxConfigBase* ret = Kiface().KifaceSettings();
363  //wxASSERT( ret );
364  return ret;
365 }
366 
367 
369 {
370  return Kiface().KifaceSearch();
371 }
372 
373 
375 {
376  return Kiface().GetHelpFileName();
377 }
378 
379 
380 void EDA_BASE_FRAME::PrintMsg( const wxString& text )
381 {
382  SetStatusText( text );
383 }
384 
385 
386 void EDA_BASE_FRAME::UpdateFileHistory( const wxString& FullFileName,
387  wxFileHistory* aFileHistory )
388 {
389  wxFileHistory* fileHistory = aFileHistory;
390 
391  if( !fileHistory )
392  fileHistory = &Kiface().GetFileHistory();
393 
394  fileHistory->AddFileToHistory( FullFileName );
395 }
396 
397 
398 wxString EDA_BASE_FRAME::GetFileFromHistory( int cmdId, const wxString& type,
399  wxFileHistory* aFileHistory )
400 {
401  wxFileHistory* fileHistory = aFileHistory;
402 
403  if( !fileHistory )
404  fileHistory = &Kiface().GetFileHistory();
405 
406  int baseId = fileHistory->GetBaseId();
407 
408  wxASSERT( cmdId >= baseId && cmdId < baseId + (int) fileHistory->GetCount() );
409 
410  unsigned i = cmdId - baseId;
411 
412  if( i < fileHistory->GetCount() )
413  {
414  wxString fn = fileHistory->GetHistoryFile( i );
415 
416  if( wxFileName::FileExists( fn ) )
417  return fn;
418  else
419  {
420  wxString msg = wxString::Format( _( "File \"%s\" was not found." ), fn );
421  wxMessageBox( msg );
422 
423  fileHistory->RemoveFileFromHistory( i );
424  }
425  }
426 
427  return wxEmptyString;
428 }
429 
430 
431 void EDA_BASE_FRAME::GetKicadHelp( wxCommandEvent& event )
432 {
433  const SEARCH_STACK& search = sys_search();
434 
435  /* We have to get document for beginners,
436  * or the full specific doc
437  * if event id is wxID_INDEX, we want the document for beginners.
438  * else the specific doc file (its name is in Kiface().GetHelpFileName())
439  * The document for beginners is the same for all KiCad utilities
440  */
441  if( event.GetId() == wxID_INDEX )
442  {
443  // List of possible names for Getting Started in KiCad
444  const wxChar* names[2] = {
445  wxT( "getting_started_in_kicad" ),
446  wxT( "Getting_Started_in_KiCad" )
447  };
448 
449  wxString helpFile;
450  // Search for "getting_started_in_kicad.html" or "getting_started_in_kicad.pdf"
451  // or "Getting_Started_in_KiCad.html" or "Getting_Started_in_KiCad.pdf"
452  for( unsigned ii = 0; ii < arrayDim( names ); ii++ )
453  {
454  helpFile = SearchHelpFileFullPath( search, names[ii] );
455 
456  if( !helpFile.IsEmpty() )
457  break;
458  }
459 
460  if( !helpFile )
461  {
462  wxString msg = wxString::Format( _(
463  "Html or pdf help file \n\"%s\"\n or\n\"%s\" could not be found." ), names[0], names[1] );
464  wxMessageBox( msg );
465  }
466  else
467  {
468  GetAssociatedDocument( this, helpFile );
469  }
470 
471  return;
472  }
473 
474  wxString base_name = help_name();
475  wxString helpFile = SearchHelpFileFullPath( search, base_name );
476 
477  if( !helpFile )
478  {
479  wxString msg = wxString::Format( _(
480  "Help file \"%s\" could not be found." ),
481  GetChars( base_name )
482  );
483  wxMessageBox( msg );
484  }
485  else
486  {
487  GetAssociatedDocument( this, helpFile );
488  }
489 }
490 
491 
492 void EDA_BASE_FRAME::GetKicadContribute( wxCommandEvent& event )
493 {
494  if( !wxLaunchDefaultBrowser( URL_GET_INVOLVED ) )
495  {
496  wxString msg;
497  msg.Printf( _( "Could not launch the default browser.\n"
498  "For information on how to help the KiCad project, visit %s" ),
500  wxMessageBox( msg, _( "Get involved with KiCad" ), wxOK, this );
501  }
502 }
503 
504 
505 void EDA_BASE_FRAME::GetKicadAbout( wxCommandEvent& event )
506 {
507  void ShowAboutDialog(EDA_BASE_FRAME * aParent); // See AboutDialog_main.cpp
508  ShowAboutDialog( this );
509 }
510 
511 
513  const wxString& aHotkeysNickname )
514 {
515  PAGED_DIALOG dlg( this, _( "Preferences" ) );
516  wxTreebook* book = dlg.GetTreebook();
517 
518  book->AddPage( new PANEL_COMMON_SETTINGS( &dlg, book ), _( "Common" ) );
519  book->AddPage( new PANEL_HOTKEYS_EDITOR( this, book, false,
520  aHotkeys, aShowHotkeys, aHotkeysNickname ), _( "Hotkeys" ) );
521 
522  for( unsigned i = 0; i < KIWAY_PLAYER_COUNT; ++i )
523  {
524  KIWAY_PLAYER* frame = dlg.Kiway().Player( (FRAME_T) i, false );
525 
526  if( frame )
527  frame->InstallPreferences( &dlg );
528  }
529 
530  if( dlg.ShowModal() == wxID_OK )
531  {
533  return true;
534  }
535 
536  return false;
537 }
538 
539 
540 bool EDA_BASE_FRAME::IsWritable( const wxFileName& aFileName )
541 {
542  wxString msg;
543  wxFileName fn = aFileName;
544 
545  // Check for absence of a file path with a file name. Unfortunately KiCad
546  // uses paths relative to the current project path without the ./ part which
547  // confuses wxFileName. Making the file name path absolute may be less than
548  // elegant but it solves the problem.
549  if( fn.GetPath().IsEmpty() && fn.HasName() )
550  fn.MakeAbsolute();
551 
552  wxCHECK_MSG( fn.IsOk(), false,
553  wxT( "File name object is invalid. Bad programmer!" ) );
554  wxCHECK_MSG( !fn.GetPath().IsEmpty(), false,
555  wxT( "File name object path <" ) + fn.GetFullPath() +
556  wxT( "> is not set. Bad programmer!" ) );
557 
558  if( fn.IsDir() && !fn.IsDirWritable() )
559  {
560  msg.Printf( _( "You do not have write permissions to folder \"%s\"." ),
561  GetChars( fn.GetPath() ) );
562  }
563  else if( !fn.FileExists() && !fn.IsDirWritable() )
564  {
565  msg.Printf( _( "You do not have write permissions to save file \"%s\" to folder \"%s\"." ),
566  GetChars( fn.GetFullName() ), GetChars( fn.GetPath() ) );
567  }
568  else if( fn.FileExists() && !fn.IsFileWritable() )
569  {
570  msg.Printf( _( "You do not have write permissions to save file \"%s\"." ),
571  GetChars( fn.GetFullPath() ) );
572  }
573 
574  if( !msg.IsEmpty() )
575  {
576  wxMessageBox( msg );
577  return false;
578  }
579 
580  return true;
581 }
582 
583 
584 void EDA_BASE_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
585 {
586  wxCHECK_RET( aFileName.IsOk(), wxT( "Invalid file name!" ) );
587 
588  wxFileName autoSaveFileName = aFileName;
589 
590  // Check for auto save file.
591  autoSaveFileName.SetName( GetAutoSaveFilePrefix() + aFileName.GetName() );
592 
593  wxLogTrace( traceAutoSave,
594  wxT( "Checking for auto save file " ) + autoSaveFileName.GetFullPath() );
595 
596  if( !autoSaveFileName.FileExists() )
597  return;
598 
599  wxString msg = wxString::Format( _(
600  "Well this is potentially embarrassing!\n"
601  "It appears that the last time you were editing the file\n"
602  "\"%s\"\n"
603  "it was not saved properly. Do you wish to restore the last saved edits you made?" ),
604  GetChars( aFileName.GetFullName() )
605  );
606 
607  int response = wxMessageBox( msg, Pgm().App().GetAppName(), wxYES_NO | wxICON_QUESTION, this );
608 
609  // Make a backup of the current file, delete the file, and rename the auto save file to
610  // the file name.
611  if( response == wxYES )
612  {
613  // Get the backup file name.
614  wxFileName backupFileName = aFileName;
615  backupFileName.SetExt( aFileName.GetExt() + GetBackupSuffix() );
616 
617  // If an old backup file exists, delete it. If an old copy of the file exists, rename
618  // it to the backup file name
619  if( aFileName.FileExists() )
620  {
621  // Rename the old file to the backup file name.
622  if( !wxRenameFile( aFileName.GetFullPath(), backupFileName.GetFullPath(), true ) )
623  {
624  msg.Printf( _( "Could not create backup file \"%s\"" ),
625  GetChars( backupFileName.GetFullPath() ) );
626  wxMessageBox( msg );
627  }
628  }
629 
630  if( !wxRenameFile( autoSaveFileName.GetFullPath(), aFileName.GetFullPath() ) )
631  {
632  wxMessageBox( _( "The auto save file could not be renamed to the board file name." ),
633  Pgm().App().GetAppName(), wxOK | wxICON_EXCLAMATION, this );
634  }
635  }
636  else
637  {
638  wxLogTrace( traceAutoSave,
639  wxT( "Removing auto save file " ) + autoSaveFileName.GetFullPath() );
640 
641  // Remove the auto save file when using the previous file as is.
642  wxRemoveFile( autoSaveFileName.GetFullPath() );
643  }
644 }
645 
646 
648 {
649  if( evt_type != 0 )
650  {
651  wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED );
652  evt.SetEventObject( this );
653  evt.SetId( evt_type );
654  wxPostEvent( this, evt );
655  return true;
656  }
657 
658  return false;
659 }
660 
bool m_autoSaveState
Flag to indicate the last auto save state.
void PrintMsg(const wxString &text)
Class KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a porti...
Definition: kiway_player.h:127
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_player.h:61
Structure EDA_HOTKEY_CONFIG contains the information required to save hot key information to a config...
Definition: hotkeys_basic.h:94
wxString SearchHelpFileFullPath(const SEARCH_STACK &aSearchStack, const wxString &aBaseName)
Return the help file's full path.
wxString m_mruPath
Most recently used path.
virtual bool doAutoSave()
This should be overridden by the derived class to handle the auto save feature.
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
This file is part of the common library.
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
void windowClosing(wxCloseEvent &event)
(with its unexpected name so it does not collide with the real OnWindowClose() function provided in d...
virtual void SaveSettings(wxConfigBase *aCfg)
Saves common frame parameters to a configuration data file.
virtual bool isAutoSaveRequired() const
Return the auto save status of the application.
#define URL_GET_INVOLVED
wxConfigBase * KifaceSettings() const
Definition: kiface_i.h:103
void onAutoSaveTimer(wxTimerEvent &aEvent)
Handle the auto save timer event.
wxString ConfigBaseName()
bool GetAssociatedDocument(wxWindow *aParent, const wxString &aDocName, const wxPathList *aPaths)
Function GetAssociatedDocument open a document (file) with the suitable browser.
Definition: eda_doc.cpp:87
virtual wxConfigBase * config()
Return the wxConfigBase used in SaveSettings().
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: kicad.cpp:66
Class SEARCH_STACK looks for files in a number of places.
Definition: search_stack.h:41
Class DIALOG_SHIM may sit in the inheritance tree between wxDialog and any class written by wxFormBui...
Definition: dialog_shim.h:83
wxAuiManager m_auimgr
bool IsWritable(const wxFileName &aFileName)
Checks if aFileName can be written.
wxTimer * m_autoSaveTimer
The timer used to implement the auto save feature;.
void UpdateFileHistory(const wxString &FullFileName, wxFileHistory *aFileHistory=NULL)
Update the list of recently opened files.
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
Definition: kicad.cpp:52
static const wxString entryPosX
X position of frame, in pixels (suffix)
wxString m_perspective
wxAuiManager perspective.
void GetKicadHelp(wxCommandEvent &event)
wxTreebook * GetTreebook()
Definition: paged_dialog.h:43
SEARCH_STACK & KifaceSearch()
Only for DSO specific 'non-library' files.
Definition: kiface_i.h:127
wxWindow * findQuasiModalDialog()
const wxString & GetHelpFileName() const
Function GetHelpFileName returns just the basename portion of the current help file.
Definition: kiface_i.h:121
void ShowAboutDialog(EDA_BASE_FRAME *aParent)
VTBL_ENTRY void CommonSettingsChanged()
Function CommonSettingsChanged Calls CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition: kiway.cpp:451
void CheckForAutoSaveFile(const wxFileName &aFileName)
Check if an auto save file exists for aFileName and takes the appropriate action depending on the use...
VTBL_ENTRY KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=NULL)
Function Player returns the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:321
static wxString GetBackupSuffix()
virtual const SEARCH_STACK & sys_search()
Return a SEARCH_STACK pertaining to entire program.
FRAME_T m_Ident
Id Type (pcb, schematic, library..)
virtual void LoadSettings(wxConfigBase *aCfg)
Load common frame parameters from a configuration file.
void GetKicadAbout(wxCommandEvent &event)
static const wxString entryPerspective
Configuration file entry for wxAuiManger perspective.
bool IsQuasiModal()
Definition: dialog_shim.h:125
wxLogTrace helper definitions.
#define DEFAULT_AUTO_SAVE_INTERVAL
The default auto save interval is 10 minutes.
bool PostCommandMenuEvent(int evt_type)
Post a menu event to the frame, which can be used to trigger actions bound to menu items.
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Definition: macros.h:107
static wxString GetAutoSaveFilePrefix()
void SetAutoSaveInterval(int aInterval)
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:100
see class PGM_BASE
static const wxString entrySizeX
Width of frame, in pixels (suffix)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
void GetKicadContribute(wxCommandEvent &event)
FILE_HISTORY & GetFileHistory()
Definition: kiface_i.h:123
The base frame for deriving all KiCad main window classes.
size_t i
Definition: json11.cpp:597
static const wxString entrySizeY
Height of frame, in pixels (suffix)
wxString GetFileFromHistory(int cmdId, const wxString &type, wxFileHistory *aFileHistory=NULL)
Fetches the file name from the file history list.
static const wxString entryPosY
Y position of frame, in pixels (suffix)
virtual wxString help_name()
static const wxString entryAutoSaveInterval
Configuration file entry name for auto save interval.
virtual void InstallPreferences(PAGED_DIALOG *aParent)
Allow a frame to load its preference panels (if any) into the preferences dialog.
virtual void CommonSettingsChanged()
Notification event that some of the common (suite-wide) settings have changed.
static const wxString entryMaximized
Nonzero iff frame is maximized (suffix)
bool m_hasAutoSave
Flag to indicate if this frame supports auto save.
bool ShowPreferences(EDA_HOTKEY_CONFIG *aHotkeys, EDA_HOTKEY_CONFIG *aShowHotkeys, const wxString &aHotkeysNickname)
static const wxString entryMruPath
Configuration file entry for most recently used path.
int m_autoSaveInterval
The auto save interval time in seconds.
virtual void ShowChangedLanguage()
Redraw the menus and what not in current language.
bool ProcessEvent(wxEvent &aEvent) override
Override the default process event handler to implement the auto save feature.
virtual void ReCreateMenuBar()
Recreates the menu bar.
EDA_BASE_FRAME(wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName)