On-the-fly language updates for simulator window.

Fixes https://gitlab.com/kicad/code/kicad/issues/13357
This commit is contained in:
Jeff Young 2023-01-04 18:06:04 +00:00
parent b000d68def
commit a1a1a49729
7 changed files with 154 additions and 41 deletions

View File

@ -1,8 +1,8 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2016 CERN * Copyright (C) 2016-2023 CERN
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2021-2023 KiCad Developers, see AUTHORS.txt for contributors.
* @author Sylwester Kocjan <s.kocjan@o2.pl> * @author Sylwester Kocjan <s.kocjan@o2.pl>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -86,8 +86,8 @@ SIM_NOPLOT_PANEL::SIM_NOPLOT_PANEL( const wxString& aCommand, int aOptions, wxWi
m_textInfo->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, m_textInfo->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT,
wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
m_textInfo->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); m_textInfo->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
m_textInfo->SetLabel( m_textInfo->SetLabel( _( "Simulation provided no plots. Please refer to console window "
_( "Simulation provided no plots. Please refer to console window for results." ) ); "for results." ) );
m_sizer->Add( m_textInfo, 1, wxALL | wxEXPAND, 5 ); m_sizer->Add( m_textInfo, 1, wxALL | wxEXPAND, 5 );
m_sizer->Add( 0, 1, 1, wxEXPAND, 5 ); m_sizer->Add( 0, 1, 1, wxEXPAND, 5 );
@ -99,3 +99,12 @@ SIM_NOPLOT_PANEL::SIM_NOPLOT_PANEL( const wxString& aCommand, int aOptions, wxWi
SIM_NOPLOT_PANEL::~SIM_NOPLOT_PANEL() SIM_NOPLOT_PANEL::~SIM_NOPLOT_PANEL()
{ {
} }
void SIM_NOPLOT_PANEL::OnLanguageChanged()
{
m_textInfo->SetLabel( _( "Simulation provided no plots. Please refer to console window "
"for results." ) );
}

View File

@ -1,8 +1,8 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2016 CERN * Copyright (C) 2016-2023 CERN
* Copyright (C) 2016-2017 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2016-2023 KiCad Developers, see AUTHORS.txt for contributors.
* @author Sylwester Kocjan <s.kocjan@o2.pl> * @author Sylwester Kocjan <s.kocjan@o2.pl>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -46,6 +46,8 @@ public:
static bool IsPlottable( SIM_TYPE aSimType ); static bool IsPlottable( SIM_TYPE aSimType );
virtual void OnLanguageChanged() = 0;
SIM_TYPE GetType() const; SIM_TYPE GetType() const;
protected: protected:
@ -81,6 +83,8 @@ public:
virtual ~SIM_NOPLOT_PANEL(); virtual ~SIM_NOPLOT_PANEL();
void OnLanguageChanged() override;
private: private:
wxSizer* m_sizer; wxSizer* m_sizer;
wxStaticText* m_textInfo; wxStaticText* m_textInfo;

View File

@ -212,6 +212,35 @@ void SIM_PLOT_FRAME::setupTools()
} }
void SIM_PLOT_FRAME::ShowChangedLanguage()
{
EDA_BASE_FRAME::ShowChangedLanguage();
updateTitle();
for( int ii = 0; ii < (int) m_workbook->GetPageCount(); ++ii )
{
SIM_PANEL_BASE* plot = dynamic_cast<SIM_PLOT_PANEL*>( m_workbook->GetPage( ii ) );
plot->OnLanguageChanged();
wxString pageTitle( m_simulator->TypeToName( plot->GetType(), true ) );
pageTitle.Prepend( wxString::Format( _( "Plot%u - " ), ii+1 /* 1-based */ ) );
m_workbook->SetPageText( ii, pageTitle );
}
m_staticTextSignals->SetLabel( _( "Signals" ) );
updateSignalList();
m_staticTextCursors->SetLabel( _( "Cursors" ) );
wxCommandEvent dummy;
onCursorUpdate( dummy );
m_staticTextTune->SetLabel( _( "Tune" ) );
}
void SIM_PLOT_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg ) void SIM_PLOT_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
{ {
EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( aCfg ); EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( aCfg );

View File

@ -134,6 +134,8 @@ public:
*/ */
void ToggleDarkModePlots(); void ToggleDarkModePlots();
void ShowChangedLanguage() override;
void ReCreateHToolbar(); void ReCreateHToolbar();
/** /**

View File

@ -341,16 +341,25 @@ SIM_PLOT_PANEL::~SIM_PLOT_PANEL()
void SIM_PLOT_PANEL::updateAxes() void SIM_PLOT_PANEL::updateAxes()
{ {
bool skipAddToView = false;
if( m_axis_x ) if( m_axis_x )
return; skipAddToView = true;
switch( GetType() ) switch( GetType() )
{ {
case ST_AC: case ST_AC:
m_axis_x = new LOG_SCALE<mpScaleXLog>( _( "Frequency" ), wxT( "Hz" ), mpALIGN_BOTTOM ); if( !m_axis_x )
m_axis_y1 = new LIN_SCALE<mpScaleY>( _( "Gain" ), wxT( "dBV" ), mpALIGN_LEFT ); {
m_axis_y2 = new LIN_SCALE<mpScaleY>( _( "Phase" ), wxT( "°" ), mpALIGN_RIGHT ); m_axis_x = new LOG_SCALE<mpScaleXLog>( wxEmptyString, wxT( "Hz" ), mpALIGN_BOTTOM );
m_axis_y2->SetMasterScale( m_axis_y1 ); m_axis_y1 = new LIN_SCALE<mpScaleY>( wxEmptyString, wxT( "dBV" ), mpALIGN_LEFT );
m_axis_y2 = new LIN_SCALE<mpScaleY>( wxEmptyString, wxT( "°" ), mpALIGN_RIGHT );
m_axis_y2->SetMasterScale( m_axis_y1 );
}
m_axis_x->SetName( _( "Frequency" ) );
m_axis_y1->SetName( _( "Gain" ) );
m_axis_y2->SetName( _( "Phase" ) );
break; break;
case ST_DC: case ST_DC:
@ -358,15 +367,28 @@ void SIM_PLOT_PANEL::updateAxes()
break; break;
case ST_NOISE: case ST_NOISE:
m_axis_x = new LOG_SCALE<mpScaleXLog>( _( "Frequency" ), wxT( "Hz" ), mpALIGN_BOTTOM ); if( !m_axis_x )
m_axis_y1 = new mpScaleY( _( "noise [(V or A)^2/Hz]" ), mpALIGN_LEFT ); {
m_axis_x = new LOG_SCALE<mpScaleXLog>( wxEmptyString, wxT( "Hz" ), mpALIGN_BOTTOM );
m_axis_y1 = new mpScaleY( wxEmptyString, mpALIGN_LEFT );
}
m_axis_x->SetName( _( "Frequency" ) );
m_axis_y1->SetName( _( "noise [(V or A)^2/Hz]" ) );
break; break;
case ST_TRANSIENT: case ST_TRANSIENT:
m_axis_x = new LIN_SCALE<mpScaleX>( _( "Time" ), wxT( "s" ), mpALIGN_BOTTOM ); if( !m_axis_x )
m_axis_y1 = new LIN_SCALE<mpScaleY>( _( "Voltage" ), wxT( "V" ), mpALIGN_LEFT ); {
m_axis_y2 = new LIN_SCALE<mpScaleY>( _( "Current" ), wxT( "A" ), mpALIGN_RIGHT ); m_axis_x = new LIN_SCALE<mpScaleX>( wxEmptyString, wxT( "s" ), mpALIGN_BOTTOM );
m_axis_y2->SetMasterScale( m_axis_y1 ); m_axis_y1 = new LIN_SCALE<mpScaleY>(wxEmptyString, wxT( "V" ), mpALIGN_LEFT );
m_axis_y2 = new LIN_SCALE<mpScaleY>( wxEmptyString, wxT( "A" ), mpALIGN_RIGHT );
m_axis_y2->SetMasterScale( m_axis_y1 );
}
m_axis_x->SetName( _( "Time" ) );
m_axis_y1->SetName( _( "Voltage" ) );
m_axis_y2->SetName( _( "Current" ) );
break; break;
default: default:
@ -374,6 +396,9 @@ void SIM_PLOT_PANEL::updateAxes()
break; break;
} }
if( skipAddToView )
return;
if( m_axis_x ) if( m_axis_x )
{ {
m_axis_x->SetTicks( false ); m_axis_x->SetTicks( false );
@ -413,32 +438,51 @@ void SIM_PLOT_PANEL::prepareDCAxes()
ch = rem.GetChar( 0 ); ch = rem.GetChar( 0 );
} }
catch( ... ) catch( ... )
{;} {
// Best efforts
}
switch( ch ) switch( ch )
{ {
// Make sure that we have a reliable default (even if incorrectly labeled) // Make sure that we have a reliable default (even if incorrectly labeled)
default: default:
case 'v': case 'v':
m_axis_x = new LIN_SCALE<mpScaleX>( _( "Voltage (swept)" ), wxT( "V" ), if( !m_axis_x )
mpALIGN_BOTTOM ); m_axis_x = new LIN_SCALE<mpScaleX>( wxEmptyString, wxT( "V" ), mpALIGN_BOTTOM );
m_axis_x->SetName( _( "Voltage (swept)" ) );
break; break;
case 'i': case 'i':
m_axis_x = new LIN_SCALE<mpScaleX>( _( "Current (swept)" ), wxT( "A" ), if( !m_axis_x )
mpALIGN_BOTTOM ); m_axis_x = new LIN_SCALE<mpScaleX>( wxEmptyString, wxT( "A" ), mpALIGN_BOTTOM );
m_axis_x->SetName( _( "Current (swept)" ) );
break; break;
case 'r': case 'r':
m_axis_x = new LIN_SCALE<mpScaleX>( _( "Resistance (swept)" ), wxT( "" ), if( !m_axis_x )
mpALIGN_BOTTOM ); m_axis_x = new LIN_SCALE<mpScaleX>( wxEmptyString, wxT( "" ), mpALIGN_BOTTOM );
m_axis_x->SetName( _( "Resistance (swept)" ) );
break; break;
case 't': case 't':
m_axis_x = new LIN_SCALE<mpScaleX>( _( "Temperature (swept)" ), wxT( "°C" ), if( !m_axis_x )
mpALIGN_BOTTOM ); m_axis_x = new LIN_SCALE<mpScaleX>( wxEmptyString, wxT( "°C" ), mpALIGN_BOTTOM );
m_axis_x->SetName( _( "Temperature (swept)" ) );
break; break;
} }
m_axis_y1 = new LIN_SCALE<mpScaleY>( _( "Voltage (measured)" ), wxT( "V" ), mpALIGN_LEFT ); if( !m_axis_y1 )
m_axis_y2 = new LIN_SCALE<mpScaleY>( _( "Current" ), wxT( "A" ), mpALIGN_RIGHT ); m_axis_y1 = new LIN_SCALE<mpScaleY>( wxEmptyString, wxT( "V" ), mpALIGN_LEFT );
if( !m_axis_y2 )
m_axis_y2 = new LIN_SCALE<mpScaleY>( wxEmptyString, wxT( "A" ), mpALIGN_RIGHT );
m_axis_y1->SetName( _( "Voltage (measured)" ) );
m_axis_y2->SetName( _( "Current" ) );
} }
} }
@ -461,6 +505,13 @@ void SIM_PLOT_PANEL::UpdatePlotColors()
} }
void SIM_PLOT_PANEL::OnLanguageChanged()
{
updateAxes();
m_plotWin->UpdateAll();
}
void SIM_PLOT_PANEL::UpdateTraceStyle( TRACE* trace ) void SIM_PLOT_PANEL::UpdateTraceStyle( TRACE* trace )
{ {
int type = trace->GetType(); int type = trace->GetType();
@ -509,14 +560,7 @@ bool SIM_PLOT_PANEL::addTrace( const wxString& aTitle, const wxString& aName, in
UpdateTraceStyle( trace ); UpdateTraceStyle( trace );
m_traces[ aTitle ] = trace; m_traces[ aTitle ] = trace;
// It is a trick to keep legend & coords always on the top
for( mpLayer* l : m_topLevel )
m_plotWin->DelLayer( l );
m_plotWin->AddLayer( (mpLayer*) trace ); m_plotWin->AddLayer( (mpLayer*) trace );
for( mpLayer* l : m_topLevel )
m_plotWin->AddLayer( l );
} }
else else
{ {

View File

@ -85,10 +85,11 @@ public:
} }
private: private:
const TRACE* m_trace; const TRACE* m_trace;
bool m_updateRequired, m_updateRef; bool m_updateRequired;
wxRealPoint m_coords; bool m_updateRef;
mpWindow* m_window; wxRealPoint m_coords;
mpWindow* m_window;
static constexpr int DRAG_MARGIN = 10; static constexpr int DRAG_MARGIN = 10;
}; };
@ -279,6 +280,8 @@ public:
///> Update plot colors ///> Update plot colors
void UpdatePlotColors(); void UpdatePlotColors();
void OnLanguageChanged() override;
///< Getter for math plot window ///< Getter for math plot window
mpWindow* GetPlotWin() const mpWindow* GetPlotWin() const
{ {
@ -314,8 +317,6 @@ private:
mpInfoLegend* m_legend; mpInfoLegend* m_legend;
bool m_dotted_cp; bool m_dotted_cp;
std::vector<mpLayer*> m_topLevel;
}; };
wxDECLARE_EVENT( EVT_SIM_CURSOR_UPDATE, wxCommandEvent ); wxDECLARE_EVENT( EVT_SIM_CURSOR_UPDATE, wxCommandEvent );

View File

@ -25,6 +25,7 @@
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <tools/ee_actions.h> #include <tools/ee_actions.h>
#include <widgets/wx_menubar.h> #include <widgets/wx_menubar.h>
#include "menus_helpers.h"
void SIM_PLOT_FRAME::ReCreateHToolbar() void SIM_PLOT_FRAME::ReCreateHToolbar()
@ -79,6 +80,7 @@ void SIM_PLOT_FRAME::doReCreateMenuBar()
wxMenuBar* oldMenuBar = dynamic_cast<EDA_BASE_FRAME*>( this )->GetMenuBar(); wxMenuBar* oldMenuBar = dynamic_cast<EDA_BASE_FRAME*>( this )->GetMenuBar();
WX_MENUBAR* menuBar = new WX_MENUBAR(); WX_MENUBAR* menuBar = new WX_MENUBAR();
//-- File menu ----------------------------------------------------------- //-- File menu -----------------------------------------------------------
// //
ACTION_MENU* fileMenu = new ACTION_MENU( false, tool ); ACTION_MENU* fileMenu = new ACTION_MENU( false, tool );
@ -97,6 +99,7 @@ void SIM_PLOT_FRAME::doReCreateMenuBar()
fileMenu->AppendSeparator(); fileMenu->AppendSeparator();
fileMenu->AddClose( _( "Simulator" ) ); fileMenu->AddClose( _( "Simulator" ) );
//-- View menu ----------------------------------------------------------- //-- View menu -----------------------------------------------------------
// //
ACTION_MENU* viewMenu = new ACTION_MENU( false, tool ); ACTION_MENU* viewMenu = new ACTION_MENU( false, tool );
@ -111,6 +114,7 @@ void SIM_PLOT_FRAME::doReCreateMenuBar()
viewMenu->Add( EE_ACTIONS::toggleDottedSecondary, ACTION_MENU::CHECK ); viewMenu->Add( EE_ACTIONS::toggleDottedSecondary, ACTION_MENU::CHECK );
viewMenu->Add( EE_ACTIONS::toggleDarkModePlots, ACTION_MENU::CHECK ); viewMenu->Add( EE_ACTIONS::toggleDarkModePlots, ACTION_MENU::CHECK );
//-- Simulation menu ----------------------------------------------------------- //-- Simulation menu -----------------------------------------------------------
// //
ACTION_MENU* simulationMenu = new ACTION_MENU( false, tool ); ACTION_MENU* simulationMenu = new ACTION_MENU( false, tool );
@ -126,11 +130,31 @@ void SIM_PLOT_FRAME::doReCreateMenuBar()
simulationMenu->AppendSeparator(); simulationMenu->AppendSeparator();
simulationMenu->Add( EE_ACTIONS::showNetlist ); simulationMenu->Add( EE_ACTIONS::showNetlist );
//-- Preferences menu -----------------------------------------------
//
ACTION_MENU* prefsMenu = new ACTION_MENU( false, tool );
//prefsMenu->Add( ACTIONS::configurePaths );
//prefsMenu->Add( EE_ACTIONS::showSimLibTable );
// We can't use ACTIONS::showPreferences yet because wxWidgets moves this on
// Mac, and it needs the wxID_PREFERENCES id to find it.
prefsMenu->Add( _( "Preferences..." ) + "\tCtrl+,",
_( "Show preferences for all open tools" ),
wxID_PREFERENCES,
BITMAPS::preference );
prefsMenu->AppendSeparator();
AddMenuLanguageList( prefsMenu, tool );
//-- Menubar ------------------------------------------------------------- //-- Menubar -------------------------------------------------------------
// //
menuBar->Append( fileMenu, _( "&File" ) ); menuBar->Append( fileMenu, _( "&File" ) );
menuBar->Append( viewMenu, _( "&View" ) ); menuBar->Append( viewMenu, _( "&View" ) );
menuBar->Append( simulationMenu, _( "&Simulation" ) ); menuBar->Append( simulationMenu, _( "&Simulation" ) );
menuBar->Append( prefsMenu, _( "&Preferences" ) );
dynamic_cast<EDA_BASE_FRAME*>( this )->AddStandardHelpMenu( menuBar ); dynamic_cast<EDA_BASE_FRAME*>( this )->AddStandardHelpMenu( menuBar );
dynamic_cast<EDA_BASE_FRAME*>( this )->SetMenuBar( menuBar ); dynamic_cast<EDA_BASE_FRAME*>( this )->SetMenuBar( menuBar );