26#include <nlohmann/json.hpp>
74#include <wx/display.h>
75#include <wx/stdpaths.h>
78#include <wx/wupdlock.h>
83#include <nlohmann/json.hpp>
96 return wxWindow::FromDIP( wxSize( 406, 354 ), aWindow );
99 return wxWindow::FromDIP( wxSize( 500, 400 ), aWindow );
109 return wxWindow::FromDIP( wxSize( 850, 540 ), aWindow );
112 return wxWindow::FromDIP( wxSize( 1280, 720 ), aWindow );
181 const wxPoint& aPos,
const wxSize& aSize,
long aStyle,
182 const wxString& aFrameName,
KIWAY* aKiway,
184 wxFrame( aParent, wxID_ANY, aTitle, aPos, aSize, aStyle, aFrameName ),
197 Bind( wxEVT_DPI_CHANGED,
198 [&]( wxDPIChangedEvent& aEvent )
204 wxAuiPaneInfoArray& panes =
m_auimgr.GetAllPanes();
206 for(
size_t ii = 0; ii < panes.GetCount(); ii++ )
208 wxAuiPaneInfo& pinfo = panes.Item( ii );
209 pinfo.best_size = pinfo.window->GetSize();
212 pinfo.best_size.IncTo( pinfo.window->GetBestSize() );
213 pinfo.best_size.IncTo( pinfo.min_size );
227 for( wxWindow* child : aParent->GetChildren() )
231 if( dlg->IsQuasiModal() )
252 wxWindow* cvpcb = wxWindow::FindWindowByName( wxS(
"CvpcbFrame" ) );
282 if( event.CanVeto() )
298 if( event.CanVeto() )
305 if( event.GetId() == wxEVT_QUERY_END_SESSION || event.GetId() == wxEVT_END_SESSION )
334 if( event.CanVeto() )
361 if( !IsEnabled() && IsActive() )
375 if( aEvent.GetEventType() == wxEVT_DPI_CHANGED )
377 wxFrame::ProcessEvent( aEvent );
382 if( !wxFrame::ProcessEvent( aEvent ) )
385 if(
Pgm().m_Quitting )
394 wxLogTrace(
traceAutoSave, wxT(
"Starting auto save timer." ) );
405 wxLogTrace(
traceAutoSave, wxT(
"Stopping auto save timer." ) );
452 wxString stamp = aStamp.IsValid() ? aStamp.Format( wxS(
"%Y-%m-%d_%H%M%S" ) ) : wxString( wxS(
"unknown-time" ) );
454 wxFileName recovered( aSrcFn );
455 recovered.SetName( aSrcFn.GetName() + wxS(
".recovered." ) + stamp );
459 while( recovered.FileExists() )
460 recovered.SetName( aSrcFn.GetName() + wxS(
".recovered." ) + stamp + wxString::Format( wxS(
".%d" ), seq++ ) );
462 return recovered.GetFullPath();
481 for(
const auto& [autosavePath, srcPath] : selected )
483 if( !wxCopyFile( autosavePath, srcPath,
true ) )
485 wxLogError(
_(
"Failed to recover auto-saved file '%s'." ), srcPath );
489 wxRemoveFile( autosavePath );
494 for(
const auto& [autosavePath, srcPath] : selected )
496 if( wxFileExists( autosavePath ) )
497 wxRemoveFile( autosavePath );
502 for(
const auto& [autosavePath, srcPath] : selected )
504 wxFileName autosaveFn( autosavePath );
505 wxFileName srcFn( srcPath );
506 wxDateTime stamp = autosaveFn.FileExists() ? autosaveFn.GetModificationTime() : wxDateTime::Now();
510 if( !wxCopyFile( autosavePath, target,
true ) )
512 wxLogError(
_(
"Failed to write recovered file '%s'." ), target );
516 wxRemoveFile( autosavePath );
536 wxDateTime now = wxDateTime::Now();
541 wxTimeSpan maxDeferral = wxTimeSpan::Seconds( std::max( 60,
GetAutoSaveInterval() * 12 ) );
545 wxLogTrace(
traceAutoSave, wxT(
"Deferring auto save; an interactive operation is in progress." ) );
549 wxLogTrace(
traceAutoSave, wxT(
"Auto save deferral exceeded; saving despite interactive operation." ) );
609 std::placeholders::_1,
626 it->second( aEvent );
635 bool checkRes =
false;
636 bool enableRes =
true;
649 catch( std::exception& )
658 wxString msg =
_(
"Undo" );
663 aEvent.SetText( msg );
665 else if( showRes && aEvent.GetId() ==
ACTIONS::redo.GetUIId() )
667 wxString msg =
_(
"Redo" );
672 aEvent.SetText( msg );
675 if( isCut || isCopy || isPaste )
677 wxWindow* focus = wxWindow::FindFocus();
678 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>( focus );
680 if( textEntry && isCut && textEntry->CanCut() )
682 else if( textEntry && isCopy && textEntry->CanCopy() )
684 else if( textEntry && isPaste && textEntry->CanPaste() )
686 else if(
dynamic_cast<WX_GRID*
>( focus ) )
690 aEvent.Enable( enableRes );
691 aEvent.Show( showRes );
693 if( aEvent.IsCheckable() )
694 aEvent.Check( checkRes );
702 [] (
const SELECTION& aSel,
int aLangIdentifier )
707 for(
unsigned ii = 0;
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
710 cond.
Check( std::bind( isCurrentLang, std::placeholders::_1,
728 if( control.first == aName )
729 return &control.second;
759 wxWindowUpdateLocker
dummy(
this );
775 std::optional<TOOLBAR_CONFIGURATION> tbConfig;
780 if( tbConfig.has_value() )
786 | wxAUI_TB_OVERFLOW );
790 m_tbRight->ApplyConfiguration( tbConfig.value() );
796 if( tbConfig.has_value() )
805 m_tbLeft->ApplyConfiguration( tbConfig.value() );
811 if( tbConfig.has_value() )
817 | wxAUI_TB_TEXT | wxAUI_TB_OVERFLOW );
821 m_tbTopMain->ApplyConfiguration( tbConfig.value() );
827 if( tbConfig.has_value() )
833 | wxAUI_TB_TEXT | wxAUI_TB_OVERFLOW );
837 m_tbTopAux->ApplyConfiguration( tbConfig.value() );
908 helpMenu->AppendSeparator();
911 aMenuBar->Append( helpMenu,
_(
"&Help" ) );
919 wxMenuBar* menuBar = GetMenuBar();
921 for(
size_t ii = 0; ii < menuBar->GetMenuCount(); ++ii )
923 for( wxMenuItem* menuItem : menuBar->GetMenu( ii )->GetMenuItems() )
925 if( menuItem->GetItemLabelText() == menuItemLabel )
927 wxString menuTitleLabel = menuBar->GetMenuLabelText( ii );
929 menuTitleLabel.Replace( wxS(
"&" ), wxS(
"&&" ) );
930 menuItemLabel.Replace( wxS(
"&" ), wxS(
"&&" ) );
932 return wxString::Format(
_(
"Run: %s > %s" ),
950 GetMenuBar()->Refresh();
976 m_fileHistory->SetMaxFiles( (
unsigned) std::max( 0, historySize ) );
979 if(
Pgm().GetCommonSettings()->AutosaveUsesLocalHistory() )
989 GetMenuBar()->Refresh();
1002 wxAuiPaneInfoArray panes =
m_auimgr.GetAllPanes();
1004 for(
size_t i = 0; i < panes.GetCount(); ++i )
1007 toolbar->RefreshBitmaps();
1015 int currentDisplay = wxDisplay::GetFromWindow(
this );
1032 if( !
Pgm().GetCommonSettings()->m_Session.remember_open_files )
1042 bool wasDefault =
false;
1065 if( aState.
display >= wxDisplay::GetCount() )
1071 const unsigned int index = 0;
1072 wxDisplay display(
index );
1073 wxRect clientSize = display.GetGeometry();
1089 wxDisplay display( aState.
display );
1090 wxRect clientSize = display.GetClientArea();
1092 int yLimTop = clientSize.y;
1093 int yLimBottom = clientSize.y + clientSize.height;
1094 int xLimLeft = clientSize.x;
1095 int xLimRight = clientSize.x + clientSize.width;
1097 if( upperLeft.x > xLimRight ||
1098 upperRight.x < xLimLeft ||
1099 upperLeft.y < yLimTop ||
1100 upperLeft.y > yLimBottom )
1153 wxDisplay display( wxDisplay::GetFromWindow(
this ) );
1154 wxRect clientSize = display.GetClientArea();
1155 wxPoint pos = GetPosition();
1158 wxLogTrace(
traceDisplayLocation, wxS(
"ensureWindowIsOnScreen: clientArea (%d, %d) w %d h %d" ),
1159 clientSize.x, clientSize.y,
1160 clientSize.width, clientSize.height );
1162 if( pos.y < clientSize.y )
1164 wxLogTrace(
traceDisplayLocation, wxS(
"ensureWindowIsOnScreen: y pos %d below minimum, setting to %d" ),
1165 pos.y, clientSize.y );
1166 pos.y = clientSize.y;
1169 if( pos.x < clientSize.x )
1171 wxLogTrace(
traceDisplayLocation, wxS(
"ensureWindowIsOnScreen: x pos %d below minimum, setting to %d" ),
1172 pos.x, clientSize.x );
1173 pos.x = clientSize.x;
1176 if( pos.x + size.x - clientSize.x > clientSize.width )
1178 int newWidth = clientSize.width - ( pos.x - clientSize.x );
1179 wxLogTrace(
traceDisplayLocation, wxS(
"ensureWindowIsOnScreen: width %d above available %d, setting to %d" ),
1180 pos.x + size.x, clientSize.width, newWidth );
1184 if( pos.y + size.y - clientSize.y > clientSize.height )
1186 int newHeight = clientSize.height - ( pos.y - clientSize.y );
1187 wxLogTrace(
traceDisplayLocation, wxS(
"ensureWindowIsOnScreen: height %d above available %d, setting to %d" ),
1188 pos.y + size.y, clientSize.height, newHeight );
1192 wxLogTrace(
traceDisplayLocation, wxS(
"Updating window position (%d, %d) with size (%d, %d)" ),
1193 pos.x, pos.y, size.x, size.y );
1195 SetSize( pos.x, pos.y, size.x, size.y );
1233 aCfg->
state.
display = wxDisplay::GetFromWindow(
this );
1236 IsMaximized() ? wxS(
"true" ) : wxS(
"false" ) );
1243#if wxCHECK_VERSION( 3, 3, 0 )
1246 nlohmann::json state = serializer.
Serialize();
1248 if( state.is_null() || state.empty() )
1287 if(
Pgm().GetCommonSettings()->m_Session.remember_open_files && !currentlyOpenedFile.IsEmpty() )
1289 wxFileName rfn( currentlyOpenedFile );
1290 rfn.MakeRelativeTo(
Prj().GetProjectPath() );
1298 if( !currentlyOpenedFile.IsEmpty() )
1333 SetStatusText(
text );
1358 bool restored =
false;
1360#if wxCHECK_VERSION( 3, 3, 0 )
1383 wxAuiPaneInfoArray& panes =
m_auimgr.GetAllPanes();
1385 for(
size_t i = 0; i < panes.GetCount(); ++i )
1387 if( panes.Item( i ).IsToolbar() )
1388 panes.Item( i ).Show(
true );
1400 if( aShowCloseButton )
1408 std::function<
void(
void)> aCallback )
1414 if( aShowCloseButton )
1430 if( aShowCloseButton )
1443 if( aShowCloseButton )
1455 wxASSERT( aFileHistory );
1463 GetMenuBar()->Refresh();
1473 wxASSERT( aFileHistory );
1475 int baseId = aFileHistory->GetBaseId();
1477 wxASSERT( cmdId >= baseId && cmdId < baseId + (
int) aFileHistory->GetCount() );
1478 int i = cmdId - baseId;
1480 wxString fn = aFileHistory->GetHistoryFile( i );
1482 if( !wxFileName::FileExists( fn ) )
1485 wxYES_NO | wxYES_DEFAULT | wxICON_ERROR | wxCENTER );
1487 dlg.SetExtendedMessage(
_(
"Do you want to remove it from list of recently opened files?" ) );
1488 dlg.SetYesNoLabels( KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Remove" ) ),
1489 KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Keep" ) ) );
1491 if( dlg.ShowModal() == wxID_YES )
1492 aFileHistory->RemoveFileFromHistory( i );
1501 GetMenuBar()->Refresh();
1518 GetMenuBar()->Refresh();
1538 PAGED_DIALOG dlg(
this,
_(
"Preferences" ),
true,
true, wxEmptyString,
1539 wxWindow::FromDIP( wxSize( 980, 560 ),
nullptr ) );
1541 dlg.SetEvtHandlerEnabled(
false );
1548 std::vector<int> expand;
1554 ACTION_MANAGER* actionMgr = kicadMgr->GetToolManager()->GetActionManager();
1561 []( wxWindow* aParent ) -> wxWindow*
1568 []( wxWindow* aParent ) -> wxWindow*
1571 },
_(
"Mouse and Touchpad" ) );
1573#if defined(__linux__) || defined(__FreeBSD__)
1575 [] ( wxWindow* aParent ) -> wxWindow*
1578 },
_(
"SpaceMouse" ) );
1581 book->AddPage( hotkeysPanel,
_(
"Hotkeys" ) );
1584 []( wxWindow* aParent ) -> wxWindow*
1587 },
_(
"Version Control" ) );
1589#ifdef KICAD_USE_SENTRY
1591 []( wxWindow* aParent ) -> wxWindow*
1594 },
_(
"Data Collection" ) );
1597#define LAZY_CTOR( key ) \
1598 [this, kiface]( wxWindow* aParent ) \
1600 return kiface->CreateKiWindow( aParent, key, &Kiway() ); \
1612 expand.push_back( (
int) book->GetPageCount() );
1614 book->AddPage(
new wxPanel( book ),
_(
"Symbol Editor" ) );
1623 expand.push_back( (
int) book->GetPageCount() );
1625 book->AddPage(
new wxPanel( book ),
_(
"Schematic Editor" ) );
1648 expand.push_back( (
int) book->GetPageCount() );
1650 book->AddPage(
new wxPanel( book ),
_(
"Footprint Editor" ) );
1663 expand.push_back( (
int) book->GetPageCount() );
1665 book->AddPage(
new wxPanel( book ),
_(
"PCB Editor" ) );
1676 expand.push_back( (
int) book->GetPageCount() );
1678 book->AddPage(
new wxPanel( book ),
_(
"3D Viewer" ) );
1696 expand.push_back( (
int) book->GetPageCount() );
1698 book->AddPage(
new wxPanel( book ),
_(
"Gerber Viewer" ) );
1718 expand.push_back( (
int) book->GetPageCount() );
1720 book->AddPage(
new wxPanel( book ),
_(
"Drawing Sheet Editor" ) );
1728 []( wxWindow* aParent ) -> wxWindow*
1731 },
_(
"Packages and Updates" ) );
1746 for(
size_t i = 0; i < book->GetPageCount(); ++i )
1747 book->GetPage( i )->Layout();
1749 for(
int page : expand )
1750 book->ExpandNode( page );
1752 if( !aStartPage.IsEmpty() )
1755 dlg.SetEvtHandlerEnabled(
true );
1774 wxString* files = aEvent.GetFiles();
1776 for(
int nb = 0; nb < aEvent.GetNumberOfFiles(); nb++ )
1778 const wxFileName fn = wxFileName( files[nb] );
1779 wxString ext = fn.GetExt();
1798 wxString fn = file.GetFullPath();
1807 wxFileName fn = aFileName;
1813 if( fn.GetPath().IsEmpty() && fn.HasName() )
1816 wxCHECK_MSG( fn.IsOk(),
false, wxT(
"File name object is invalid. Bad programmer!" ) );
1817 wxCHECK_MSG( !fn.GetPath().IsEmpty(),
false,
1818 wxT(
"File name object path <" ) + fn.GetFullPath() + wxT(
"> is not set. Bad programmer!" ) );
1820 if( fn.IsDir() && !fn.IsDirWritable() )
1822 msg.Printf(
_(
"Insufficient permissions to folder '%s'." ), fn.GetPath() );
1824 else if( !fn.FileExists() && !fn.IsDirWritable() )
1826 msg.Printf(
_(
"Insufficient permissions to save file '%s'." ), fn.GetFullPath() );
1828 else if( fn.FileExists() && !fn.IsFileWritable() )
1830 msg.Printf(
_(
"Insufficient permissions to save file '%s'." ), fn.GetFullPath() );
1833 if( !msg.IsEmpty() )
1854 wxAcceleratorEntry entries[1];
1855 entries[0].Set( wxACCEL_CTRL,
int(
'Q' ), wxID_EXIT );
1856 wxAcceleratorTable accel( 1, entries );
1857 SetAcceleratorTable( accel );
1877 if( extraitems > 0 )
1892 if( extraitems > 0 )
1913 return m_undoList.m_CommandsList.back()->GetDescription();
1915 return wxEmptyString;
1922 return m_redoList.m_CommandsList.back()->GetDescription();
1924 return wxEmptyString;
1939 wxCommandEvent e( EDA_EVT_UNITS_CHANGED );
1940 e.SetInt(
static_cast<int>( aUnits ) );
1941 e.SetClientData(
this );
1942 ProcessEventLocally( e );
1954 if( !IsMaximized() )
1959 wxLogTrace(
traceDisplayLocation,
"Maximizing window - Saving position (%d, %d) with size (%d, %d)",
1971#if defined( __WXGTK__ ) && !wxCHECK_VERSION( 3, 2, 9 )
1972 wxSize winSize = GetSize();
1981 GTKDoGetSize( &width, &height );
1983 winSize.Set( width, height );
1986 wxSize winSize = GetSize();
2004 GetMenuBar()->Refresh();
2030WXLRESULT EDA_BASE_FRAME::MSWWindowProc( WXUINT
message, WXWPARAM wParam, WXLPARAM lParam )
2034 if(
message == WM_SYSCOMMAND )
2036 if( wParam == SC_KEYMENU && ( lParam >> 16 ) <= 0 )
2040 return wxFrame::MSWWindowProc(
message, wParam, lParam );
2048 langsMenu->
SetTitle(
_(
"Set Language" ) );
2053 for(
unsigned ii = 0;
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
2062 wxMenuItem* item =
new wxMenuItem( langsMenu,
LanguagesList[ii].m_KI_Lang_Identifier,
2063 label, tooltip, wxITEM_CHECK );
2065 langsMenu->Append( item );
2069 aMasterMenu->
Add( langsMenu );
2075 int id =
event.GetId();
void ShowAboutDialog(EDA_BASE_FRAME *aParent)
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
void ClearScaledBitmapCache()
Wipes out the scaled bitmap cache so that the icon theme can be changed.
BITMAP_STORE * GetBitmapStore()
static TOOL_ACTION reportBug
static TOOL_ACTION donate
static TOOL_ACTION listHotKeys
static TOOL_ACTION getInvolved
static TOOL_ACTION gettingStarted
Manage TOOL_ACTION objects.
const std::map< std::string, TOOL_ACTION * > & GetActions() const
Get a list of currently-registered actions mapped by their name.
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
void ReloadPlugins(std::optional< wxString > aDirectoryToScan=std::nullopt, std::shared_ptr< REPORTER > aReporter=nullptr)
Clears the loaded plugins and actions and re-scans the filesystem to register new ones.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
void ThemeChanged()
Notifies the store that the icon theme has been changed by the user, so caches must be invalidated.
Handle actions that are shared between different applications.
bool AutosaveUsesLocalHistory() const
The backup format is the single switch that selects the autosave mechanism: the incremental format re...
std::vector< std::pair< wxString, wxString > > GetSelectedStale() const
AUTOSAVE_RECOVERY_CHOICE GetChoice() const
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
The base frame for deriving all KiCad main window classes.
void SelectToolbarAction(const TOOL_ACTION &aAction) override
Select the given action in the toolbar group which contains it, if any.
virtual wxString help_name()
virtual bool doAutoSave()
This should be overridden by the derived class to handle the auto save feature.
void LoadWindowState(const wxString &aFileName)
FRAME_T GetFrameType() const
virtual void UnregisterUIUpdateHandler(int aID) override
Unregister a UI handler for a given ID that was registered using RegisterUIUpdateHandler.
virtual bool isAutoSaveRequired() const
Return the auto save status of the application.
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual void handleIconizeEvent(wxIconizeEvent &aEvent)
Handle a window iconize event.
virtual void PushCommandToUndoList(PICKED_ITEMS_LIST *aItem)
Add a command to undo in the undo list.
void ShowPreferences(const wxString &aStartPage, const wxString &aStartParentPage)
Display the preferences and settings of all opened editors paged dialog, starting with a particular p...
void windowClosing(wxCloseEvent &event)
(with its unexpected name so it does not collide with the real OnWindowClose() function provided in d...
virtual void OnCharHook(wxKeyEvent &aKeyEvent)
Capture the key event before it is sent to the GUI.
virtual int GetRedoCommandCount() const
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
UNDO_REDO_CONTAINER m_undoList
virtual void OnMove(wxMoveEvent &aEvent)
virtual WINDOW_SETTINGS * GetWindowSettings(APP_SETTINGS_BASE *aCfg)
Return a pointer to the window settings for this frame.
virtual void doCloseWindow()
void OnToolbarSizeChanged()
Update toolbars if desired toolbar icon changed.
void OnMenuEvent(wxMenuEvent &event)
The TOOL_DISPATCHER needs these to work around some issues in wxWidgets where the menu events aren't ...
virtual bool IsModal() const
Return true if the frame is shown in our modal mode and false if the frame is shown as an usual frame...
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void HandleSystemColorChange()
Update the UI in response to a change in the system colors.
virtual void syncToolbarSelections()
Called after the toolbars are rebuilt so a frame can select the group entries that reflect its saved ...
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
void ensureWindowIsOnScreen()
bool m_isNonUserClose
Set by NonUserClose() to indicate that the user did not request the current close.
void CheckForAutosaveFiles(const wxString &aProjectPath, const std::vector< wxString > &aExtensions)
Check for autosave files newer than their source files for the given project.
void LoadWindowSettings(const WINDOW_SETTINGS *aCfg)
Load window settings from the given settings object.
std::vector< wxFileName > m_AcceptedFiles
bool m_uiUpdateHandlerBound
True once the single wxID_ANY UPDATE_UI handler has been bound.
bool m_autoSavePermissionError
void OnKicadAbout(wxCommandEvent &event)
virtual void UpdateToolbarControlSizes()
Update the sizes of any controls in the toolbars of the frame.
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
virtual void DoWithAcceptedFiles()
Execute action on accepted dropped file.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
wxWindow * findQuasiModalDialog()
wxDateTime m_autoSaveDeferredSince
virtual void ClearUndoORRedoList(UNDO_REDO_LIST aList, int aItemCount=-1)
Remove the aItemCount of old commands from aList and delete commands, pickers and picked items if nee...
virtual void ThemeChanged()
Process light/dark theme change.
EDA_BASE_FRAME(wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, KIWAY *aKiway, const EDA_IU_SCALE &aIuScale)
static constexpr int KICAD_AUI_TB_STYLE
Default style flags used for wxAUI toolbars.
bool m_closeInProgress
Set while windowClosing() is deciding whether the frame may close.
ACTION_TOOLBAR * m_tbRight
void initExitKey()
Set the common key-pair for exiting the application (Ctrl-Q) and ties it to the wxID_EXIT event id.
void OnPreferences(wxCommandEvent &event)
virtual const SEARCH_STACK & sys_search()
Return a SEARCH_STACK pertaining to entire program.
void onAutoSaveTimer(wxTimerEvent &aEvent)
Handle the auto save timer event.
void SaveWindowSettings(WINDOW_SETTINGS *aCfg)
Save window settings to the given settings object.
virtual wxString GetRedoActionDescription() const
TOOLBAR_SETTINGS * m_toolbarSettings
void FinishAUIInitialization()
virtual wxString GetCurrentFileName() const
Get the full filename + path of the currently opened file in the frame.
void ChangeUserUnits(EDA_UNITS aUnits)
void AddMenuLanguageList(ACTION_MENU *aMasterMenu, TOOL_INTERACTIVE *aControlTool)
Create a menu list for language choice, and add it as submenu to MasterMenu.
virtual bool canRunAutoSave() const
Return true when it is safe to run an autosave snapshot right now.
void RegisterCustomToolbarControlFactory(const ACTION_TOOLBAR_CONTROL &aControlDesc, const ACTION_TOOLBAR_CONTROL_FACTORY &aControlFactory)
Register a creation factory for toolbar controls that are present in this frame.
void ShowInfoBarMsg(const wxString &aMsg, bool aShowCloseButton=false)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an info icon on the left of...
virtual void configureToolbars()
wxTimer * m_autoSaveTimer
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, INFOBAR_MESSAGE_TYPE aType=INFOBAR_MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
void PrintMsg(const wxString &text)
void onUpdateUI(wxUpdateUIEvent &aEvent)
void commonInit(FRAME_T aFrameType)
Collect common initialization functions used in all CTORs.
virtual bool IsContentModified() const
Get if the contents of the frame have been modified since the last save.
void ShowInfoBarWarning(const wxString &aWarningMsg, bool aShowCloseButton=false)
Show the WX_INFOBAR displayed on the top of the canvas with a message and a warning icon on the left ...
virtual PICKED_ITEMS_LIST * PopCommandFromRedoList()
Return the last command to undo and remove it from list, nothing is deleted.
virtual void RecreateToolbars()
std::map< int, UIUpdateHandler > m_uiUpdateMap
Map containing the UI update handlers registered with wx for each action.
std::map< std::string, ACTION_TOOLBAR_CONTROL_FACTORY > m_toolbarControlFactories
ACTION_TOOLBAR_CONTROL_FACTORY * GetCustomToolbarControlFactory(const std::string &aName)
static void HandleUpdateUIEvent(wxUpdateUIEvent &aEvent, EDA_BASE_FRAME *aFrame, ACTION_CONDITIONS &aCond)
Handle events generated when the UI is trying to figure out the current state of the UI controls rela...
UNDO_REDO_CONTAINER m_redoList
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
FILE_HISTORY * m_fileHistory
ACTION_TOOLBAR * m_tbLeft
SETTINGS_MANAGER * m_settingsManager
virtual void OnSize(wxSizeEvent &aEvent)
virtual wxString GetUndoActionDescription() const
virtual PICKED_ITEMS_LIST * PopCommandFromUndoList()
Return the last command to undo and remove it from list, nothing is deleted.
void OnLanguageSelectionEvent(wxCommandEvent &aEvent)
An event handler called on a language menu selection.
wxString GetRunMenuCommandDescription(const TOOL_ACTION &aAction)
virtual bool canCloseWindow(wxCloseEvent &aCloseEvent)
bool ProcessEvent(wxEvent &aEvent) override
Override the default process event handler to implement the auto save feature.
bool IsWritable(const wxFileName &aFileName, bool aVerbose=true)
Check if aFileName can be written.
void OnMaximize(wxMaximizeEvent &aEvent)
std::unique_ptr< nlohmann::json > m_auiLayoutState
virtual void ClearFileHistory()
Remove all files from the file history.
ACTION_TOOLBAR * m_tbTopAux
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handle event fired when a file is dropped to the window.
std::map< const wxString, TOOL_ACTION * > m_acceptedExts
Associate file extensions with action to execute.
void onIconize(wxIconizeEvent &aEvent)
virtual void unitsChangeRefresh()
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
wxString GetFileFromHistory(int cmdId, const wxString &type, FILE_HISTORY *aFileHistory=nullptr)
Fetch the file name from the file history list.
wxSize GetWindowSize()
Get the undecorated window size that can be used for restoring the window size.
int GetAutoSaveInterval() const
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Save common frame parameters to a configuration data file.
void onSystemColorChange(wxSysColourChangedEvent &aEvent)
virtual int GetUndoCommandCount() const
virtual void RegisterUIUpdateHandler(int aID, const ACTION_CONDITIONS &aConditions) override
Register a UI update handler for the control with ID aID.
ACTION_TOOLBAR * m_tbTopMain
virtual void PushCommandToRedoList(PICKED_ITEMS_LIST *aItem)
Add a command to redo in the redo list.
bool m_isClosing
Set by the close window event handler after frames are asked if they can close.
void AddStandardHelpMenu(wxMenuBar *aMenuBar)
Add the standard KiCad help menu to the menubar.
void ReCreateMenuBar()
Recreate the menu bar.
virtual void doReCreateMenuBar()
WX_INFOBAR * GetInfoBar()
This class implements a file history object to store a list of files, that can then be added to a men...
void AddFileToHistory(const wxString &aFile) override
Adds a file to the history.
The main KiCad project manager frame.
SEARCH_STACK & KifaceSearch()
Only for DSO specific 'non-library' files.
APP_SETTINGS_BASE * KifaceSettings() const
const wxString & GetHelpFileName() const
Return just the basename portion of the current help file.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY_HOLDER(KIWAY *aKiway, HOLDER_TYPE aType)
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
virtual void SetLanguage(int aLanguage)
Change the language and then calls ShowChangedLanguage() on all KIWAY_PLAYER objects.
LOCAL_HISTORY & LocalHistory()
Return the LOCAL_HISTORY associated with this KIWAY.
virtual void CommonSettingsChanged(int aFlags=0)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
bool RunRegisteredSaversAndCommit(const wxString &aProjectPath, const wxString &aTitle, const wxString &aTagFileType=wxEmptyString)
Run all registered savers and, if any staged changes differ from HEAD, create a commit.
std::vector< std::pair< wxString, wxString > > FindStaleAutosaveFiles(const wxString &aProjectPath, const std::vector< wxString > &aExtensions) const
Enumerate autosave files newer than their corresponding source files for the project at aProjectPath,...
bool Init(const wxString &aProjectPath)
Initialize the local history repository for the given project path.
bool RunRegisteredSaversAsAutosaveFiles(const wxString &aProjectPath)
Run all registered savers and write their output to autosave files instead of committing to the local...
WX_TREEBOOK * GetTreebook()
void SetInitialPage(const wxString &aPage, const wxString &aParentPage=wxEmptyString)
std::vector< TOOL_ACTION * > & ActionsList()
static wxString GetDefaultUserProjectsPath()
Gets the default path we point users to create projects.
virtual COMMON_SETTINGS * GetCommonSettings() const
virtual API_PLUGIN_MANAGER & GetPluginManager() const
virtual int GetSelectedLanguageIdentifier() const
KICAD_API_SERVER & GetApiServer()
virtual SETTINGS_MANAGER & GetSettingsManager() const
A holder to handle information on schematic or board items.
void SaveFileState(const wxString &aFileName, const WINDOW_SETTINGS *aWindowCfg, bool aOpen)
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
RAII class that sets an value at construction and resets it to the original value at destruction.
Look for files in a number of paths.
UNITS_PROVIDER(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits)
void SetUserUnits(EDA_UNITS aUnits)
bool Deserialize(const nlohmann::json &aState) const
nlohmann::json Serialize() const
Simple wrapper around wxBusyCursor for used with the generic BUSY_INDICATOR interface.
A modified version of the wxInfoBar class that allows us to:
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
bool AddLazyPage(std::function< wxWindow *(wxWindow *aParent)> aLazyCtor, const wxString &text, bool bSelect=false, int imageId=NO_IMAGE)
bool AddLazySubPage(std::function< wxWindow *(wxWindow *aParent)> aLazyCtor, const wxString &text, bool bSelect=false, int imageId=NO_IMAGE)
@ PROJECT_DIR
Inside the project directory (default)
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
#define KICAD_MESSAGE_DIALOG
const int minSize
Push and Shove router track width and via size dialog.
static wxString buildRecoveredFileName(const wxFileName &aSrcFn, const wxDateTime &aStamp)
static const wxSize minSizeLookup(FRAME_T aFrameType, wxWindow *aWindow)
static const wxSize defaultSize(FRAME_T aFrameType, wxWindow *aWindow)
wxWindow * findQuasiModalDialog(wxWindow *aParent)
Base window classes and related definitions.
#define KICAD_MANAGER_FRAME_NAME
std::function< void(ACTION_TOOLBAR *)> ACTION_TOOLBAR_CONTROL_FACTORY
#define DEFAULT_MAX_UNDO_ITEMS
EVT_MENU_RANGE(ID_GERBVIEW_DRILL_FILE1, ID_GERBVIEW_DRILL_FILEMAX, GERBVIEW_FRAME::OnDrlFileHistory) EVT_MENU_RANGE(ID_GERBVIEW_ZIP_FILE1
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
@ FRAME_SCH_SYMBOL_EDITOR
@ PANEL_SCH_FIELD_NAME_TEMPLATES
@ PANEL_GBR_DISPLAY_OPTIONS
@ PANEL_FP_DEFAULT_GRAPHICS_VALUES
@ PANEL_FP_DISPLAY_OPTIONS
@ PANEL_FP_DEFAULT_FIELDS
@ PANEL_PCB_ACTION_PLUGINS
@ PANEL_3DV_DISPLAY_OPTIONS
@ PANEL_DS_DISPLAY_OPTIONS
@ PANEL_GBR_EXCELLON_OPTIONS
static const std::string GerberFileExtension
static bool IsGerberFileExtension(const wxString &ext)
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
const wxChar *const kicadTraceKeyEvent
Flag to enable wxKeyEvent debug tracing.
const wxChar *const traceDisplayLocation
Flag to enable debug output of display positioning logic.
void ReadHotKeyConfigIntoActions(const wxString &aFileName, std::vector< TOOL_ACTION * > &aActions)
Read a hotkey config file into a list of actions.
EVT_MENU(ID_COMPARE_PROJECT_BRANCHES, KICAD_MANAGER_FRAME::OnCompareProjectBranches) KICAD_MANAGER_FRAME
PGM_BASE & Pgm()
The global program "get" accessor.
LANGUAGE_DESCR LanguagesList[]
An array containing all the languages that KiCad supports.
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 ...
SELECTION_CONDITION enableCondition
Returns true if the UI control should be enabled.
SELECTION_CONDITION checkCondition
Returns true if the UI control should be checked.
SELECTION_CONDITION showCondition
Returns true if the UI control should be shown.
ACTION_CONDITIONS & Check(const SELECTION_CONDITION &aCondition)
BACKUP_LOCATION location
Where backups, history, and autosave files live.
int local_history_debounce
Implement a participant in the KIWAY alchemy.
Store the common settings that are saved and loaded for each window / frame.
Store the window positioning/state.
IFACE KIFACE_BASE kiface("pcb_test_frame", KIWAY::FACE_PCB)
static const long long MM
wxString dump(const wxArrayString &aArray)
Debug helper for printing wxArrayString contents.
wxLogTrace helper definitions.
INFOBAR_MESSAGE_TYPE
Sets the type of message for special handling if needed.