Don't copy from a running Pcbnew now that we have settings.

Also fixes an issue where if Pcbnew wasn't run before the symbol
chooser (with the footprint preview active) you'd get no grids (and
a crash on non-OSX platforms).

Fixes https://gitlab.com/kicad/code/kicad/issues/4670
This commit is contained in:
Jeff Young 2020-06-17 19:00:58 +01:00
parent 754f958be2
commit f31139ac48
1 changed files with 57 additions and 25 deletions

View File

@ -388,39 +388,71 @@ wxWindow* FOOTPRINT_PREVIEW_PANEL::GetWindow()
FOOTPRINT_PREVIEW_PANEL* FOOTPRINT_PREVIEW_PANEL::New( KIWAY* aKiway, wxWindow* aParent ) FOOTPRINT_PREVIEW_PANEL* FOOTPRINT_PREVIEW_PANEL::New( KIWAY* aKiway, wxWindow* aParent )
{ {
PCB_EDIT_FRAME* pcbnew =
static_cast<PCB_EDIT_FRAME*>( aKiway->Player( FRAME_PCB_EDITOR, false ) );
PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>(); PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
// Fetch grid & display settings from PCBNew if it's running; otherwise fetch them if( cfg->m_Window.grid.sizes.empty() )
// from PCBNew's config settings. {
// We need a copy with a lifetime that matches the panel cfg->m_Window.grid.sizes = { "1000 mil",
"500 mil",
"250 mil",
"200 mil",
"100 mil",
"50 mil",
"25 mil",
"20 mil",
"10 mil",
"5 mil",
"2 mil",
"1 mil",
"5.0 mm",
"2.5 mm",
"1.0 mm",
"0.5 mm",
"0.25 mm",
"0.2 mm",
"0.1 mm",
"0.05 mm",
"0.025 mm",
"0.01 mm" };
}
if( cfg->m_Window.zoom_factors.empty() )
{
cfg->m_Window.zoom_factors = { 0.035,
0.05,
0.08,
0.13,
0.22,
0.35,
0.6,
1.0,
1.5,
2.2,
3.5,
5.0,
8.0,
13.0,
20.0,
35.0,
50.0,
80.0,
130.0,
220.0,
300.0 };
}
for( double& factor : cfg->m_Window.zoom_factors )
factor = std::min( factor, MAX_ZOOM_FACTOR );
std::unique_ptr<KIGFX::GAL_DISPLAY_OPTIONS> gal_opts; std::unique_ptr<KIGFX::GAL_DISPLAY_OPTIONS> gal_opts;
if( pcbnew ) gal_opts = std::make_unique<KIGFX::GAL_DISPLAY_OPTIONS>();
{ gal_opts->ReadConfig( *Pgm().GetCommonSettings(), cfg->m_Window, aParent );
// Copy the existing Pcbnew options
// REVIEW: This also copies the current subscription list of the options
// to the new options. This is probably not what is intended, but because
// this widget doesn't change the options it should be OK.
gal_opts = std::make_unique<KIGFX::GAL_DISPLAY_OPTIONS>( pcbnew->GetGalDisplayOptions() );
}
else
{
// Make and populate a new one from config
gal_opts = std::make_unique<KIGFX::GAL_DISPLAY_OPTIONS>();
gal_opts->ReadConfig( *Pgm().GetCommonSettings(), cfg->m_Window, aParent );
}
auto canvasType = static_cast<EDA_DRAW_PANEL_GAL::GAL_TYPE>( cfg->m_Graphics.canvas_type ); auto canvasType = static_cast<EDA_DRAW_PANEL_GAL::GAL_TYPE>( cfg->m_Graphics.canvas_type );
auto panel = new FOOTPRINT_PREVIEW_PANEL( aKiway, aParent, std::move( gal_opts ), canvasType ); auto panel = new FOOTPRINT_PREVIEW_PANEL( aKiway, aParent, std::move( gal_opts ), canvasType );
if( pcbnew ) panel->UpdateColors();
panel->GetView()->GetPainter()->GetSettings()->LoadColors( pcbnew->GetColorSettings() );
else
panel->UpdateColors();
const GRID_SETTINGS& gridCfg = cfg->m_Window.grid; const GRID_SETTINGS& gridCfg = cfg->m_Window.grid;