Simulator: Use SIM_WORKBOOK in place of wxAuiNotebook

SIM_WORKBOOK is now a subclass of wxAuiNotebook, removing the problem of
having to maintain two separate workbook states.
This commit is contained in:
Mikolaj Wielgus
2021-07-04 14:04:03 +00:00
committed by Jon Evans
parent cd0c8a5676
commit 28531a982d
10 changed files with 141 additions and 189 deletions
+30 -54
View File
@@ -206,7 +206,7 @@ SIM_PLOT_FRAME::SIM_PLOT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
#ifndef wxHAS_NATIVE_TABART
// Non-native default tab art has ulgy gradients we don't want
m_plotNotebook->SetArtProvider( new wxAuiSimpleTabArt() );
m_workbook->SetArtProvider( new wxAuiSimpleTabArt() );
#endif
// Ensure new items are taken in account by sizers:
@@ -304,7 +304,7 @@ WINDOW_SETTINGS* SIM_PLOT_FRAME::GetWindowSettings( APP_SETTINGS_BASE* aCfg )
void SIM_PLOT_FRAME::initWorkbook()
{
m_workbook = std::make_unique<SIM_WORKBOOK>();
m_workbook->DeleteAllPages();
if( !m_simulator->Settings()->GetWorkbookFilename().IsEmpty() )
{
@@ -352,15 +352,6 @@ void SIM_PLOT_FRAME::updateTitle()
}
void SIM_PLOT_FRAME::updateWorkbook()
{
// We need to keep track of the plot panel positions
for( unsigned int i = 0; i < m_plotNotebook->GetPageCount(); i++ )
m_workbook->SetPlotPanelPosition(
dynamic_cast<SIM_PANEL_BASE*>( m_plotNotebook->GetPage( i ) ), i );
}
void SIM_PLOT_FRAME::updateFrame()
{
updateTitle();
@@ -471,7 +462,7 @@ void SIM_PLOT_FRAME::StartSimulation( const wxString& aSimCommand )
{
SIM_PANEL_BASE* plotPanel = currentPlotWindow();
if( plotPanel && m_workbook->HasPlotPanel( plotPanel ) )
if( plotPanel && m_workbook->GetPageIndex( plotPanel ) != wxNOT_FOUND )
m_exporter->SetSimCommand( m_workbook->GetSimCommand( plotPanel ) );
}
else
@@ -518,7 +509,7 @@ SIM_PANEL_BASE* SIM_PLOT_FRAME::NewPlotPanel( wxString aSimCommand )
if( SIM_PANEL_BASE::IsPlottable( simType ) )
{
SIM_PLOT_PANEL* panel;
panel = new SIM_PLOT_PANEL( aSimCommand, m_plotNotebook, this, wxID_ANY );
panel = new SIM_PLOT_PANEL( aSimCommand, m_workbook, this, wxID_ANY );
panel->GetPlotWin()->EnableMouseWheelPan(
Pgm().GetCommonSettings()->m_Input.scroll_modifier_zoom != 0 );
@@ -528,16 +519,14 @@ SIM_PANEL_BASE* SIM_PLOT_FRAME::NewPlotPanel( wxString aSimCommand )
else
{
SIM_NOPLOT_PANEL* panel;
panel = new SIM_NOPLOT_PANEL( aSimCommand, m_plotNotebook, wxID_ANY );
panel = new SIM_NOPLOT_PANEL( aSimCommand, m_workbook, wxID_ANY );
plotPanel = dynamic_cast<SIM_PANEL_BASE*>( panel );
}
wxString pageTitle( m_simulator->TypeToName( simType, true ) );
pageTitle.Prepend( wxString::Format( _( "Plot%u - " ), (unsigned int) ++m_plotNumber ) );
m_workbook->AddPlotPanel( plotPanel );
m_plotNotebook->AddPage( dynamic_cast<wxWindow*>( plotPanel ), pageTitle, true );
m_workbook->AddPage( dynamic_cast<wxWindow*>( plotPanel ), pageTitle, true );
updateFrame();
return plotPanel;
@@ -687,18 +676,15 @@ void SIM_PLOT_FRAME::addPlot( const wxString& aName, SIM_PLOT_TYPE aType, const
}
void SIM_PLOT_FRAME::removePlot( const wxString& aPlotName, bool aErase )
void SIM_PLOT_FRAME::removePlot( const wxString& aPlotName )
{
SIM_PLOT_PANEL* plotPanel = CurrentPlot();
if( !plotPanel )
return;
if( aErase )
m_workbook->RemoveTrace( plotPanel, aPlotName );
wxASSERT( plotPanel->TraceShown( aPlotName ) );
plotPanel->DeleteTrace( aPlotName );
m_workbook->DeleteTrace( plotPanel, aPlotName );
plotPanel->GetPlotWin()->Fit();
updateSignalList();
@@ -718,7 +704,7 @@ void SIM_PLOT_FRAME::updateNetlistExporter()
bool SIM_PLOT_FRAME::updatePlot( const wxString& aName, SIM_PLOT_TYPE aType, const wxString& aParam,
SIM_PLOT_PANEL* aPanel )
SIM_PLOT_PANEL* aPlotPanel )
{
SIM_TYPE simType = m_exporter->GetSimType();
wxString spiceVector = m_exporter->ComponentToVector( aName, aType, aParam );
@@ -803,8 +789,9 @@ bool SIM_PLOT_FRAME::updatePlot( const wxString& aName, SIM_PLOT_TYPE aType, con
std::vector<double> sub_y( data_y.begin() + offset,
data_y.begin() + offset + inner );
if( aPanel->AddTrace( name, inner, sub_x.data(), sub_y.data(), aType, aParam ) )
m_workbook->AddTrace( aPanel, name );
//if( aPlotPanel->AddTrace( name, inner, sub_x.data(), sub_y.data(), aType, aParam ) )
m_workbook->AddTrace( aPlotPanel, name, inner, sub_x.data(), sub_y.data(), aType,
aParam );
v = v + source2.m_vincrement;
offset += inner;
@@ -814,9 +801,8 @@ bool SIM_PLOT_FRAME::updatePlot( const wxString& aName, SIM_PLOT_TYPE aType, con
return true;
}
}
if( aPanel->AddTrace( aName, size, data_x.data(), data_y.data(), aType, aParam ) )
m_workbook->AddTrace( aPanel, aName );
m_workbook->AddTrace( aPlotPanel, aName, size, data_x.data(), data_y.data(), aType, aParam );
updateFrame();
return true;
@@ -930,8 +916,7 @@ void SIM_PLOT_FRAME::applyTuners()
bool SIM_PLOT_FRAME::loadWorkbook( const wxString& aPath )
{
m_workbook->Clear();
m_plotNotebook->DeleteAllPages();
m_workbook->DeleteAllPages();
wxTextFile file( aPath );
@@ -1034,26 +1019,26 @@ bool SIM_PLOT_FRAME::saveWorkbook( const wxString& aPath )
file.Create();
}
std::vector<const SIM_PANEL_BASE*> plotPanels = m_workbook->GetSortedPlotPanels();
file.AddLine( wxString::Format( "%llu", m_workbook->GetPageCount() ) );
file.AddLine( wxString::Format( "%llu", plotPanels.size() ) );
for( const SIM_PANEL_BASE*& plotPanel : plotPanels )
for( size_t i = 0; i < m_workbook->GetPageCount(); i++ )
{
file.AddLine( wxString::Format( "%d", plotPanel->GetType() ) );
file.AddLine( m_workbook->GetSimCommand( plotPanel ) );
const SIM_PANEL_BASE* basePanel = dynamic_cast<const SIM_PANEL_BASE*>( m_workbook->GetPage( i ) );
const SIM_PLOT_PANEL* panel = dynamic_cast<const SIM_PLOT_PANEL*>( plotPanel );
file.AddLine( wxString::Format( "%d", basePanel->GetType() ) );
file.AddLine( m_workbook->GetSimCommand( basePanel ) );
if( !panel )
const SIM_PLOT_PANEL* plotPanel = dynamic_cast<const SIM_PLOT_PANEL*>( basePanel );
if( !plotPanel )
{
file.AddLine( wxString::Format( "%llu", 0ull ) );
}
else
{
file.AddLine( wxString::Format( "%llu", panel->GetTraces().size() ) );
file.AddLine( wxString::Format( "%llu", plotPanel->GetTraces().size() ) );
for( const auto& trace : panel->GetTraces() )
for( const auto& trace : plotPanel->GetTraces() )
{
file.AddLine( wxString::Format( "%d", trace.second->GetType() ) );
file.AddLine( trace.second->GetName() );
@@ -1293,9 +1278,9 @@ void SIM_PLOT_FRAME::menuWhiteBackground( wxCommandEvent& event )
SIM_PLOT_COLORS::FillDefaultColorList( GetPlotBgOpt() );
// Now send changes to all SIM_PLOT_PANEL
for( size_t page = 0; page < m_plotNotebook->GetPageCount(); page++ )
for( size_t page = 0; page < m_workbook->GetPageCount(); page++ )
{
wxWindow* curPage = m_plotNotebook->GetPage( page );
wxWindow* curPage = m_workbook->GetPage( page );
// ensure it is truly a plot panel and not the (zero plots) placeholder
// which is only SIM_PLOT_PANEL_BASE
@@ -1314,9 +1299,6 @@ void SIM_PLOT_FRAME::onPlotClose( wxAuiNotebookEvent& event )
if( idx == wxNOT_FOUND )
return;
SIM_PANEL_BASE* plotPanel = dynamic_cast<SIM_PANEL_BASE*>( m_plotNotebook->GetPage( idx ) );
m_workbook->RemovePlotPanel( plotPanel );
wxCommandEvent dummy;
onCursorUpdate( dummy );
}
@@ -1324,7 +1306,6 @@ void SIM_PLOT_FRAME::onPlotClose( wxAuiNotebookEvent& event )
void SIM_PLOT_FRAME::onPlotClosed( wxAuiNotebookEvent& event )
{
updateWorkbook();
updateFrame();
}
@@ -1335,14 +1316,12 @@ void SIM_PLOT_FRAME::onPlotChanged( wxAuiNotebookEvent& event )
wxCommandEvent dummy;
onCursorUpdate( dummy );
updateWorkbook();
updateFrame();
}
void SIM_PLOT_FRAME::onPlotDragged( wxAuiNotebookEvent& event )
{
updateWorkbook();
updateFrame();
}
@@ -1400,14 +1379,14 @@ void SIM_PLOT_FRAME::onSettings( wxCommandEvent& event )
return;
}
if( m_workbook->HasPlotPanel( plotPanelWindow ) )
if( m_workbook->GetPageIndex( plotPanelWindow ) != wxNOT_FOUND )
m_settingsDlg->SetSimCommand( m_workbook->GetSimCommand( plotPanelWindow ) );
if( m_settingsDlg->ShowModal() == wxID_OK )
{
wxString oldCommand;
if( m_workbook->HasPlotPanel( plotPanelWindow ) )
if( m_workbook->GetPageIndex( plotPanelWindow ) != wxNOT_FOUND )
oldCommand = m_workbook->GetSimCommand( plotPanelWindow );
else
oldCommand = wxString();
@@ -1681,10 +1660,7 @@ void SIM_PLOT_FRAME::onSimFinished( wxCommandEvent& aEvent )
for( auto& trace : traceInfo )
{
if( !updatePlot( trace.m_name, trace.m_type, trace.m_param, plotPanel ) )
{
removePlot( trace.m_name, false );
m_workbook->RemoveTrace( plotPanel, trace.m_name );
}
removePlot( trace.m_name );
}
updateSignalList();