From 32fe612045a3a881ce1a2efecb0ef0c1af814e39 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Sun, 24 Dec 2023 16:18:06 +0000 Subject: [PATCH] Handle units switch in board stackup. Fixes https://gitlab.com/kicad/code/kicad/-/issues/16361 (cherry picked from commit c051e66830a05eeb14feef2703d997bc829b6492) --- .../panel_board_stackup.cpp | 42 +++++++++++++++++-- .../panel_board_stackup.h | 3 ++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/pcbnew/board_stackup_manager/panel_board_stackup.cpp b/pcbnew/board_stackup_manager/panel_board_stackup.cpp index 63896cf67e..ffeaa5059e 100644 --- a/pcbnew/board_stackup_manager/panel_board_stackup.cpp +++ b/pcbnew/board_stackup_manager/panel_board_stackup.cpp @@ -77,11 +77,12 @@ PANEL_SETUP_BOARD_STACKUP::PANEL_SETUP_BOARD_STACKUP( wxWindow* aParentWindow, PANEL_SETUP_BOARD_STACKUP_BASE( aParentWindow ), m_delectricMatList( DIELECTRIC_SUBSTRATE_LIST::DL_MATERIAL_DIELECTRIC ), m_solderMaskMatList( DIELECTRIC_SUBSTRATE_LIST::DL_MATERIAL_SOLDERMASK ), - m_silkscreenMatList( DIELECTRIC_SUBSTRATE_LIST::DL_MATERIAL_SILKSCREEN ) + m_silkscreenMatList( DIELECTRIC_SUBSTRATE_LIST::DL_MATERIAL_SILKSCREEN ), + m_board( aFrame->GetBoard() ), + m_frame( aFrame ), + m_lastUnits( aFrame->GetUserUnits() ) { - m_frame = aFrame; m_panelLayers = aPanelLayers; - m_board = m_frame->GetBoard(); m_brdSettings = &m_board->GetDesignSettings(); m_panel1->SetBorders( false, false, true, true ); @@ -118,6 +119,8 @@ PANEL_SETUP_BOARD_STACKUP::PANEL_SETUP_BOARD_STACKUP( wxWindow* aParentWindow, buildLayerStackPanel( true ); synchronizeWithBoard( true ); computeBoardThickness(); + + m_frame->Bind( EDA_EVT_UNITS_CHANGED, &PANEL_SETUP_BOARD_STACKUP::onUnitsChanged, this ); } @@ -127,6 +130,39 @@ PANEL_SETUP_BOARD_STACKUP::~PANEL_SETUP_BOARD_STACKUP() } +void PANEL_SETUP_BOARD_STACKUP::onUnitsChanged( wxCommandEvent& event ) +{ + EDA_UNITS newUnits = m_frame->GetUserUnits(); + EDA_IU_SCALE scale = m_frame->GetIuScale(); + + auto convert = + [&]( wxTextCtrl* aTextCtrl ) + { + wxString str = aTextCtrl->GetValue(); + long long int temp = EDA_UNIT_UTILS::UI::ValueFromString( scale, m_lastUnits, str ); + str = EDA_UNIT_UTILS::UI::StringFromValue( scale, newUnits, temp, true ); + + // Don't use SetValue(); we don't want a bunch of event propagation as the actual + // value hasn't changed, only its presentation. + aTextCtrl->ChangeValue( str ); + }; + + for( BOARD_STACKUP_ROW_UI_ITEM& ui_item : m_rowUiItemsList ) + { + BOARD_STACKUP_ITEM* item = ui_item.m_Item; + + if( item->IsThicknessEditable() && item->IsEnabled() ) + convert( static_cast( ui_item.m_ThicknessCtrl ) ); + } + + convert( m_tcCTValue ); + + m_lastUnits = newUnits; + + event.Skip(); +} + + void PANEL_SETUP_BOARD_STACKUP::onCopperLayersSelCount( wxCommandEvent& event ) { int oldBoardWidth = static_cast( m_frame->ValueFromString( m_tcCTValue->GetValue() ) ); diff --git a/pcbnew/board_stackup_manager/panel_board_stackup.h b/pcbnew/board_stackup_manager/panel_board_stackup.h index 03ace65e61..b7c8ccee9a 100644 --- a/pcbnew/board_stackup_manager/panel_board_stackup.h +++ b/pcbnew/board_stackup_manager/panel_board_stackup.h @@ -228,6 +228,8 @@ private: */ wxBitmapComboBox* createColorBox( BOARD_STACKUP_ITEM* aStackupItem, int aRow ); + void onUnitsChanged( wxCommandEvent& event ); + /** * disconnect event handlers connected to wxControl items found in list m_controlItemsList */ @@ -253,6 +255,7 @@ private: BOARD* m_board; BOARD_DESIGN_SETTINGS* m_brdSettings; PCB_EDIT_FRAME* m_frame; + EDA_UNITS m_lastUnits; wxSize m_numericTextCtrlSize; // Best size for wxTextCtrls with units wxSize m_numericFieldsSize; // Best size for wxTextCtrls without units wxArrayString m_core_prepreg_choice; // Used to display the option list in dialog