On-the-fly language updates for simulator window.
Fixes https://gitlab.com/kicad/code/kicad/issues/13357
This commit is contained in:
parent
b000d68def
commit
a1a1a49729
|
@ -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." ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -134,6 +134,8 @@ public:
|
||||||
*/
|
*/
|
||||||
void ToggleDarkModePlots();
|
void ToggleDarkModePlots();
|
||||||
|
|
||||||
|
void ShowChangedLanguage() override;
|
||||||
|
|
||||||
void ReCreateHToolbar();
|
void ReCreateHToolbar();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
Loading…
Reference in New Issue