Simulator: Use last workbook path stored in .kicad_pro as initial path in dialogs

Previously this was done using a static variable, which was not loaded
from .kicad_pro on simulator launch, causing unexpected behavior

Fixes https://gitlab.com/kicad/code/kicad/issues/8799
This commit is contained in:
Mikolaj Wielgus 2021-08-14 17:54:20 +02:00 committed by Jon Evans
parent 499dcbb37c
commit 44ea3a75f2
2 changed files with 57 additions and 38 deletions

View File

@ -110,10 +110,6 @@ private:
};
// Store the path of saved workbooks during the session
wxString SIM_PLOT_FRAME::m_savedWorkbooksPath;
SIM_PLOT_FRAME::SIM_PLOT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
SIM_PLOT_FRAME_BASE( aParent ),
m_lastSimPlot( nullptr ),
@ -152,9 +148,6 @@ SIM_PLOT_FRAME::SIM_PLOT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_simulator->Init();
if( m_savedWorkbooksPath.IsEmpty() )
m_savedWorkbooksPath = Prj().GetProjectPath();
m_reporter = new SIM_THREAD_REPORTER( this );
m_simulator->SetReporter( m_reporter );
@ -964,8 +957,7 @@ bool SIM_PLOT_FRAME::loadWorkbook( const wxString& aPath )
if( !file.GetNextLine().ToLong( &traceType ) )
{
DISPLAY_LOAD_ERROR( "Error loading workbook: Line %d is not an integer."
);
DISPLAY_LOAD_ERROR( "Error loading workbook: Line %d is not an integer." );
file.Close();
return false;
@ -997,6 +989,12 @@ bool SIM_PLOT_FRAME::loadWorkbook( const wxString& aPath )
file.Close();
wxFileName filename( aPath );
filename.MakeRelativeTo( Prj().GetProjectPath() );
// Remember the loaded workbook filename.
m_simulator->Settings()->SetWorkbookFilename( filename.GetFullPath() );
// Successfully loading a workbook does not count as modifying it.
m_workbook->ClrModified();
return true;
@ -1058,16 +1056,49 @@ bool SIM_PLOT_FRAME::saveWorkbook( const wxString& aPath )
bool res = file.Write();
file.Close();
// Store the filename of the last saved workbook. It will be used to restore the simulation if
// the frame is closed and then opened again.
// Store the filename of the last saved workbook.
if( res )
m_simulator->Settings()->SetWorkbookFilename( filename.GetFullName() );
{
filename.MakeRelativeTo( Prj().GetProjectPath() );
m_simulator->Settings()->SetWorkbookFilename( filename.GetFullPath() );
}
m_workbook->ClrModified();
return res;
}
wxString SIM_PLOT_FRAME::getDefaultFilename()
{
wxFileName filename = m_simulator->Settings()->GetWorkbookFilename();
if( filename.GetName().IsEmpty() )
{
if( Prj().GetProjectName().IsEmpty() )
{
filename.SetName( _( "noname" ) );
filename.SetExt( WorkbookFileExtension );
}
else
{
filename.SetName( Prj().GetProjectName() );
filename.SetExt( WorkbookFileExtension );
}
}
return filename.GetFullName();
}
wxString SIM_PLOT_FRAME::getDefaultPath()
{
wxFileName path = m_simulator->Settings()->GetWorkbookFilename();
path.Normalize( wxPATH_NORM_ALL, Prj().GetProjectPath() );
return path.GetPath();
}
SIM_PLOT_TYPE SIM_PLOT_FRAME::getXAxisType( SIM_TYPE aType ) const
{
switch( aType )
@ -1094,13 +1125,12 @@ void SIM_PLOT_FRAME::menuNewPlot( wxCommandEvent& aEvent )
void SIM_PLOT_FRAME::menuOpenWorkbook( wxCommandEvent& event )
{
wxFileDialog openDlg( this, _( "Open simulation workbook" ), m_savedWorkbooksPath, "",
wxFileDialog openDlg( this, _( "Open simulation workbook" ), getDefaultPath(), "",
WorkbookFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST );
if( openDlg.ShowModal() == wxID_CANCEL )
return;
m_savedWorkbooksPath = openDlg.GetDirectory();
loadWorkbook( openDlg.GetPath() );
}
@ -1124,32 +1154,14 @@ void SIM_PLOT_FRAME::menuSaveWorkbook( wxCommandEvent& event )
void SIM_PLOT_FRAME::menuSaveWorkbookAs( wxCommandEvent& event )
{
wxFileName defaultFilename = m_simulator->Settings()->GetWorkbookFilename();
if( defaultFilename.GetName().IsEmpty() )
{
if( Prj().GetProjectName().IsEmpty() )
{
defaultFilename.SetName( _( "noname" ) );
defaultFilename.SetExt( WorkbookFileExtension );
}
else
{
defaultFilename.SetName( Prj().GetProjectName() );
defaultFilename.SetExt( WorkbookFileExtension );
}
}
wxFileDialog saveAsDlg( this, _( "Save Simulation Workbook As" ), m_savedWorkbooksPath,
defaultFilename.GetFullPath(), WorkbookFileWildcard(),
wxFileDialog saveAsDlg( this, _( "Save Simulation Workbook As" ), getDefaultPath(),
getDefaultFilename(), WorkbookFileWildcard(),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
if( saveAsDlg.ShowModal() == wxID_CANCEL )
return;
m_savedWorkbooksPath = saveAsDlg.GetDirectory();
saveWorkbook( saveAsDlg.GetPath() );
saveWorkbook( Prj().AbsolutePath( saveAsDlg.GetPath() ) );
}

View File

@ -218,6 +218,16 @@ private:
*/
bool saveWorkbook( const wxString& aPath );
/**
* Return the default filename (with extension) to be used in file browser dialog.
*/
wxString getDefaultFilename();
/**
* Return the default path to be used in file browser dialog.
*/
wxString getDefaultPath();
/**
* Return the currently opened plot panel (or NULL if there is none).
*/
@ -357,9 +367,6 @@ private:
///< and cursors name, the same color as the corresponding signal traces
wxImageList* m_signalsIconColorList;
///< A string to store the path of saved workbooks during a session
static wxString m_savedWorkbooksPath;
// Variables for temporary storage:
int m_splitterLeftRightSashPosition;
int m_splitterPlotAndConsoleSashPosition;