Minor UI changes, display workbook in title and some fixes

This commit is contained in:
Mikolaj Wielgus 2021-05-10 01:32:49 +02:00 committed by Wayne Stambaugh
parent 5410510bd4
commit b9fd18d150
8 changed files with 142 additions and 53 deletions

View File

@ -306,21 +306,46 @@ void SIM_PLOT_FRAME::initWorkbook()
{
m_workbook = std::make_unique<SIM_WORKBOOK>();
if( m_simulator->Settings()->GetWorkbookPath().IsEmpty() )
if( !m_simulator->Settings()->GetWorkbookFilename().IsEmpty() )
{
m_simulator->Settings()->SetWorkbookPath( Prj().GetProjectName() + ".wbk" );
}
else
{
wxFileName filename = m_simulator->Settings()->GetWorkbookPath();
wxFileName filename = m_simulator->Settings()->GetWorkbookFilename();
filename.SetPath( Prj().GetProjectPath() );
if( !loadWorkbook( filename.GetFullPath() ) )
DisplayErrorMessage( this, _( "There was an error while opening the workbook file" ) );
{
// Empty the workbook filename to prevent error messages from appearing again
m_simulator->Settings()->SetWorkbookFilename( "" );
}
}
}
void SIM_PLOT_FRAME::updateTitle()
{
wxFileName filename = m_simulator->Settings()->GetWorkbookFilename();
bool readOnly = false;
bool unsaved = false;
if( filename.IsOk() && filename.FileExists() )
readOnly = !filename.IsFileWritable();
else
unsaved = true;
SetTitle( wxString::Format( wxT( "%s%s %s%s\u2014 " ) + _( "Spice Simulator" ),
m_workbook->IsModified() ? "*" : "",
filename.GetName(),
readOnly ? _( "[Read Only]" ) + wxS( " " ) : "",
unsaved ? _( "[Unsaved]" ) + wxS( " " ) : "" ) );
}
void SIM_PLOT_FRAME::onModify()
{
updateTitle();
}
// A small helper struct to handle bitmaps initialisation in menus
struct BM_MENU_INIT_ITEM
{
@ -490,8 +515,10 @@ SIM_PANEL_BASE* SIM_PLOT_FRAME::NewPlotPanel( wxString aSimCommand )
pageTitle.Prepend( wxString::Format( _( "Plot%u - " ), (unsigned int) ++m_plotNumber ) );
m_workbook->AddPlotPanel( plotPanel );
m_plotNotebook->AddPage( dynamic_cast<wxWindow*>( plotPanel ), pageTitle, true );
onModify();
return plotPanel;
}
@ -658,6 +685,7 @@ void SIM_PLOT_FRAME::removePlot( const wxString& aPlotName, bool aErase )
updateSignalList();
wxCommandEvent dummy;
onCursorUpdate( dummy );
onModify();
}
@ -766,6 +794,7 @@ bool SIM_PLOT_FRAME::updatePlot( const TRACE_DESC& aDescriptor, SIM_PLOT_PANEL*
offset += inner;
}
onModify();
return true;
}
}
@ -774,6 +803,7 @@ bool SIM_PLOT_FRAME::updatePlot( const TRACE_DESC& aDescriptor, SIM_PLOT_PANEL*
data_x.data(), data_y.data(), aDescriptor.GetType() ) )
m_workbook->AddTrace( aPanel, aDescriptor.GetTitle(), aDescriptor );
onModify();
return true;
}
@ -891,13 +921,17 @@ bool SIM_PLOT_FRAME::loadWorkbook( const wxString& aPath )
wxTextFile file( aPath );
if( !file.Open() )
{
onModify();
return false;
}
long plotsCount;
if( !file.GetFirstLine().ToLong( &plotsCount ) ) // GetFirstLine instead of GetNextLine
{
file.Close();
onModify();
return false;
}
@ -906,14 +940,15 @@ bool SIM_PLOT_FRAME::loadWorkbook( const wxString& aPath )
long plotType, tracesCount;
if( !file.GetNextLine().ToLong( &plotType ) )
{
onModify();
return false;
}
wxString simCommand = file.GetNextLine();
SIM_PANEL_BASE* plotPanel = NewPlotPanel( simCommand );
m_workbook->SetSimCommand( plotPanel, simCommand );
StartSimulation( m_workbook->GetSimCommand( plotPanel ) );
//m_plots[plotPanel].m_simCommand = simCommand;
//StartSimulation( m_plots[plotPanel].m_simCommand );
// Perform simulation, so plots can be added with values
do
@ -923,7 +958,10 @@ bool SIM_PLOT_FRAME::loadWorkbook( const wxString& aPath )
while( IsSimulationRunning() );
if( !file.GetNextLine().ToLong( &tracesCount ) )
{
onModify();
return false;
}
for( long j = 0; j < tracesCount; ++j )
{
@ -933,6 +971,7 @@ bool SIM_PLOT_FRAME::loadWorkbook( const wxString& aPath )
if( !file.GetNextLine().ToLong( &traceType ) )
{
file.Close();
onModify();
return false;
}
@ -942,6 +981,7 @@ bool SIM_PLOT_FRAME::loadWorkbook( const wxString& aPath )
if( name.IsEmpty() || param.IsEmpty() )
{
file.Close();
onModify();
return false;
}
@ -950,6 +990,11 @@ bool SIM_PLOT_FRAME::loadWorkbook( const wxString& aPath )
}
file.Close();
// Successfully loading a workbook does not count as modyfying it.
m_workbook->ClrModified();
onModify();
return true;
}
@ -1007,9 +1052,11 @@ bool SIM_PLOT_FRAME::saveWorkbook( const wxString& aPath )
bool res = file.Write();
file.Close();
// Store the path of the last saved workbook. It will be used to restore the simulation if
// 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.
m_simulator->Settings()->SetWorkbookPath( savePath );
m_simulator->Settings()->SetWorkbookFilename( wxFileName( savePath ).GetFullName() );
m_workbook->ClrModified();
onModify();
return res;
}
@ -1048,8 +1095,10 @@ void SIM_PLOT_FRAME::menuNewPlot( wxCommandEvent& aEvent )
// If the previous plot had the same type, copy the simulation command
if( prevPlot )
{
m_workbook->SetSimCommand( newPlot, m_workbook->GetSimCommand( prevPlot ) );
//m_plots[newPlot].m_simCommand = m_plots[prevPlot].m_simCommand;
onModify();
}
}
}
@ -1071,21 +1120,31 @@ void SIM_PLOT_FRAME::menuOpenWorkbook( wxCommandEvent& event )
void SIM_PLOT_FRAME::menuSaveWorkbook( wxCommandEvent& event )
{
if( !CurrentPlot() )
if( !m_workbook->IsModified() )
return;
if ( !saveWorkbook( m_simulator->Settings()->GetWorkbookPath() ) )
wxString filename = m_simulator->Settings()->GetWorkbookFilename();
if( filename.IsEmpty() )
{
menuSaveWorkbookAs( event );
return;
}
if ( !saveWorkbook( m_simulator->Settings()->GetWorkbookFilename() ) )
DisplayErrorMessage( this, _( "There was an error while saving the workbook file" ) );
}
void SIM_PLOT_FRAME::menuSaveWorkbookAs( wxCommandEvent& event )
{
if( !CurrentPlot() )
return;
wxString defaultFilename = m_simulator->Settings()->GetWorkbookFilename();
wxFileDialog saveAsDlg( this, _( "Save Simulation Workbook As" ), m_savedWorkbooksPath, "",
WorkbookFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
if( defaultFilename.IsEmpty() )
defaultFilename = Prj().GetProjectName() + wxT( ".wbk" );
wxFileDialog saveAsDlg( this, _( "Save Simulation Workbook As" ), m_savedWorkbooksPath,
defaultFilename, WorkbookFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
if( saveAsDlg.ShowModal() == wxID_CANCEL )
return;
@ -1261,9 +1320,9 @@ void SIM_PLOT_FRAME::onPlotClose( wxAuiNotebookEvent& event )
dynamic_cast<SIM_PANEL_BASE*>( m_plotNotebook->GetPage( idx ) );
m_workbook->RemovePlotPanel( plotPanel );
updateSignalList();
wxCommandEvent dummy;
onCursorUpdate( dummy );
onModify();
}
@ -1356,6 +1415,7 @@ void SIM_PLOT_FRAME::onSettings( wxCommandEvent& event )
m_workbook->SetSimCommand( plotPanelWindow, newCommand );
m_simulator->Init();
onModify();
}
}
@ -1465,6 +1525,25 @@ void SIM_PLOT_FRAME::onShowNetlist( wxCommandEvent& event )
}
bool SIM_PLOT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
{
if( m_workbook->IsModified() )
{
wxFileName filename = m_simulator->Settings()->GetWorkbookFilename();
if( filename.GetName().IsEmpty() )
filename.SetFullName( Prj().GetProjectName() + wxT( ".wbk" ) );
wxString msg = _( "Save changes to \"%s\" before closing?" );
return HandleUnsavedChanges( this, wxString::Format( msg, filename.GetFullName() ),
[&]()->bool { return saveWorkbook( filename.GetFullPath() ); } );
}
return true;
}
void SIM_PLOT_FRAME::doCloseWindow()
{
if( IsSimulationRunning() )
@ -1473,13 +1552,7 @@ void SIM_PLOT_FRAME::doCloseWindow()
// Cancel a running simProbe or simTune tool
m_schematicFrame->GetToolManager()->RunAction( ACTIONS::cancelInteractive );
wxFileName filename = m_simulator->Settings()->GetWorkbookPath();
filename.SetPath( Prj().GetProjectPath() );
saveWorkbook( filename.GetFullPath() );
SaveSettings( config() );
Destroy();
}
@ -1581,6 +1654,7 @@ void SIM_PLOT_FRAME::onSimFinished( wxCommandEvent& aEvent )
updateSignalList();
plotPanel->GetPlotWin()->UpdateAll();
plotPanel->ResetScales();
onModify();
}
else if( simType == ST_OP )
{

View File

@ -145,7 +145,18 @@ private:
void initWorkbook();
/**
* Give icons to menuitems of the main menubar
* Set the main window title bar text.
*/
void updateTitle();
/**
* Update the frame to match the changes to the workbook. Should be always called after the
* workbook was modified.
*/
void onModify();
/**
* Give icons to menuitems of the main menubar.
*/
void setIconsForMenuItems();
@ -269,6 +280,7 @@ private:
void onTune( wxCommandEvent& event );
void onShowNetlist( wxCommandEvent& event );
bool canCloseWindow( wxCloseEvent& aEvent ) override;
void doCloseWindow() override;
void onCursorUpdate( wxCommandEvent& aEvent );

View File

@ -22,15 +22,15 @@ SIM_PLOT_FRAME_BASE::SIM_PLOT_FRAME_BASE( wxWindow* parent, wxWindowID id, const
m_fileMenu->AppendSeparator();
wxMenuItem* m_openWorkbook;
m_openWorkbook = new wxMenuItem( m_fileMenu, wxID_OPEN, wxString( _("Open Workbook") ) , wxEmptyString, wxITEM_NORMAL );
m_openWorkbook = new wxMenuItem( m_fileMenu, wxID_OPEN, wxString( _("Open...") ) , wxEmptyString, wxITEM_NORMAL );
m_fileMenu->Append( m_openWorkbook );
wxMenuItem* m_saveWorkbook;
m_saveWorkbook = new wxMenuItem( m_fileMenu, wxID_SAVE, wxString( _("Save Workbook") ) , wxEmptyString, wxITEM_NORMAL );
m_saveWorkbook = new wxMenuItem( m_fileMenu, wxID_SAVE, wxString( _("Save") ) , wxEmptyString, wxITEM_NORMAL );
m_fileMenu->Append( m_saveWorkbook );
wxMenuItem* m_saveWorkbookAs;
m_saveWorkbookAs = new wxMenuItem( m_fileMenu, wxID_SAVE_AS, wxString( _("Save Workbook As...") ) , wxEmptyString, wxITEM_NORMAL );
m_saveWorkbookAs = new wxMenuItem( m_fileMenu, wxID_SAVE_AS, wxString( _("Save As...") ) , wxEmptyString, wxITEM_NORMAL );
m_fileMenu->Append( m_saveWorkbookAs );
m_fileMenu->AppendSeparator();

View File

@ -27,7 +27,7 @@
<property name="ui_table">UI</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Frame" expanded="1">
<object class="Frame" expanded="0">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
@ -54,7 +54,7 @@
<property name="window_name">SIM_PLOT_FRAME</property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<property name="xrc_skip_sizer">1</property>
<object class="wxMenuBar" expanded="1">
<object class="wxMenuBar" expanded="0">
<property name="bg"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
@ -76,7 +76,7 @@
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<object class="wxMenu" expanded="1">
<object class="wxMenu" expanded="0">
<property name="label">File</property>
<property name="name">m_fileMenu</property>
<property name="permission">protected</property>
@ -105,7 +105,7 @@
<property name="help"></property>
<property name="id">wxID_OPEN</property>
<property name="kind">wxITEM_NORMAL</property>
<property name="label">Open Workbook</property>
<property name="label">Open...</property>
<property name="name">m_openWorkbook</property>
<property name="permission">none</property>
<property name="shortcut"></property>
@ -119,21 +119,21 @@
<property name="help"></property>
<property name="id">wxID_SAVE</property>
<property name="kind">wxITEM_NORMAL</property>
<property name="label">Save Workbook</property>
<property name="label">Save</property>
<property name="name">m_saveWorkbook</property>
<property name="permission">none</property>
<property name="shortcut"></property>
<property name="unchecked_bitmap"></property>
<event name="OnMenuSelection">menuSaveWorkbook</event>
</object>
<object class="wxMenuItem" expanded="1">
<object class="wxMenuItem" expanded="0">
<property name="bitmap"></property>
<property name="checked">0</property>
<property name="enabled">1</property>
<property name="help"></property>
<property name="id">wxID_SAVE_AS</property>
<property name="kind">wxITEM_NORMAL</property>
<property name="label">Save Workbook As...</property>
<property name="label">Save As...</property>
<property name="name">m_saveWorkbookAs</property>
<property name="permission">none</property>
<property name="shortcut"></property>

View File

@ -41,7 +41,7 @@ TRACE_DESC::TRACE_DESC( const NETLIST_EXPORTER_PSPICE_SIM& aExporter, const wxSt
SIM_WORKBOOK::SIM_WORKBOOK() :
m_dirty( false )
m_flagModified( false )
{
}
@ -57,7 +57,7 @@ void SIM_WORKBOOK::AddPlotPanel( SIM_PANEL_BASE* aPlotPanel )
wxASSERT( m_plots.count( aPlotPanel ) == 0 );
m_plots[aPlotPanel] = PLOT_INFO();
m_dirty = true;
m_flagModified = true;
}
@ -66,35 +66,34 @@ void SIM_WORKBOOK::RemovePlotPanel( SIM_PANEL_BASE* aPlotPanel )
wxASSERT( m_plots.count( aPlotPanel ) == 1 );
m_plots.erase( aPlotPanel );
m_dirty = true;
m_flagModified = true;
}
void SIM_WORKBOOK::AddTrace( const SIM_PANEL_BASE* aPlotPanel, const wxString& aName,
const TRACE_DESC& aTrace )
{
// XXX: A plot is created automatically if there is none with this name yet.
m_plots[aPlotPanel].m_traces.insert(
m_plots.at( aPlotPanel ).m_traces.insert(
std::make_pair( aName, aTrace ) );
m_dirty = true;
m_flagModified = true;
}
void SIM_WORKBOOK::RemoveTrace( const SIM_PANEL_BASE* aPlotPanel, const wxString& aName )
{
auto& traceMap = m_plots[aPlotPanel].m_traces;
auto& traceMap = m_plots.at( aPlotPanel ).m_traces;
auto traceIt = traceMap.find( aName );
wxASSERT( traceIt != traceMap.end() );
traceMap.erase( traceIt );
m_dirty = true;
m_flagModified = true;
}
SIM_WORKBOOK::TRACE_MAP::const_iterator SIM_WORKBOOK::RemoveTrace( const SIM_PANEL_BASE* aPlotPanel,
TRACE_MAP::const_iterator aIt )
{
m_dirty = true;
m_flagModified = true;
return m_plots.at( aPlotPanel ).m_traces.erase( aIt );
}

View File

@ -124,8 +124,10 @@ public:
void SetSimCommand( const SIM_PANEL_BASE* aPlotPanel, const wxString& aSimCommand )
{
if( m_plots.at( aPlotPanel ).m_simCommand != aSimCommand )
m_flagModified = true;
m_plots.at( aPlotPanel ).m_simCommand = aSimCommand;
m_dirty = true;
}
const wxString& GetSimCommand( const SIM_PANEL_BASE* aPlotPanel ) const
@ -140,11 +142,13 @@ public:
return m_plots.at( aPlotPanel ).m_traces;
}
bool IsDirty() const { return m_dirty; }
void ClrModified() { m_flagModified = false; }
bool IsModified() const { return m_flagModified; }
private:
///< Dirty bit, indicates something in the workbook has changed
bool m_dirty;
bool m_flagModified;
///< Map of plot panels and associated data
std::map<const SIM_PANEL_BASE*, PLOT_INFO> m_plots;

View File

@ -35,13 +35,13 @@ SPICE_SIMULATOR_SETTINGS::SPICE_SIMULATOR_SETTINGS( JSON_SETTINGS* aParent,
const std::string& aPath ) :
NESTED_SETTINGS( "simulator", spiceSettingsSchemaVersion, aParent, aPath )
{
m_params.emplace_back( new PARAM<wxString>( "workbook_path", &m_workbookPath, "" ) );
m_params.emplace_back( new PARAM<wxString>( "workbook_filename", &m_workbookFilename, "" ) );
}
bool SPICE_SIMULATOR_SETTINGS::operator==( const SPICE_SIMULATOR_SETTINGS &aRhs ) const
{
return m_workbookPath == aRhs.m_workbookPath;
return m_workbookFilename == aRhs.m_workbookFilename;
}

View File

@ -43,11 +43,11 @@ public:
bool operator!=( const SPICE_SIMULATOR_SETTINGS& aRhs ) const { return !( *this == aRhs ); }
wxString GetWorkbookPath() const { return m_workbookPath; }
void SetWorkbookPath( wxString aPath ) { m_workbookPath = aPath; }
wxString GetWorkbookFilename() const { return m_workbookFilename; }
void SetWorkbookFilename( wxString aFilename ) { m_workbookFilename = aFilename; }
private:
wxString m_workbookPath;
wxString m_workbookFilename;
};
/**