From cd6463066174fb6bbd4b693970fa9a531478b2fb Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Wed, 24 Apr 2024 23:51:09 +0100 Subject: [PATCH] Remember shown columns in netclass setup. Fixes https://gitlab.com/kicad/code/kicad/-/issues/17852 --- common/dialogs/panel_setup_netclasses.cpp | 231 +++++++++++----------- common/settings/common_settings.cpp | 6 + include/dialogs/panel_setup_netclasses.h | 1 + include/settings/common_settings.h | 2 + 4 files changed, 123 insertions(+), 117 deletions(-) diff --git a/common/dialogs/panel_setup_netclasses.cpp b/common/dialogs/panel_setup_netclasses.cpp index e810c4df07..7dfc9f9347 100644 --- a/common/dialogs/panel_setup_netclasses.cpp +++ b/common/dialogs/panel_setup_netclasses.cpp @@ -119,6 +119,8 @@ PANEL_SETUP_NETCLASSES::PANEL_SETUP_NETCLASSES( wxWindow* aParentWindow, EDA_DRA m_splitter->SetMinimumPaneSize( FromDIP( m_splitter->GetMinimumPaneSize() ) ); + wxASSERT( m_netclassGrid->GetNumberCols() == GRID_END ); + // Calculate a min best size to handle longest usual numeric values: int const min_best_width = m_netclassGrid->GetTextExtent( "555,555555 mils" ).x; @@ -131,37 +133,25 @@ PANEL_SETUP_NETCLASSES::PANEL_SETUP_NETCLASSES( wxWindow* aParentWindow, EDA_DRA int const weighted_min_best_width = ( i == GRID_LINESTYLE ) ? min_best_width * 3 / 2 : min_best_width; - m_netclassGrid->SetColMinimalWidth( i, min_width ); - // We use a "best size" >= min_best_width m_originalColWidths[ i ] = std::max( min_width, weighted_min_best_width ); m_netclassGrid->SetColSize( i, m_originalColWidths[ i ] ); - } - for( int i = GRID_FIRST_PCBNEW; i < GRID_END; ++i ) - { if( i >= GRID_FIRST_EESCHEMA ) - { m_netclassGrid->SetUnitsProvider( m_schUnitsProvider.get(), i ); - - if( !m_isEEschema ) - { - m_netclassGrid->HideCol( i ); - m_originalColWidths[ i ] = 0; - } - } else - { m_netclassGrid->SetUnitsProvider( m_pcbUnitsProvider.get(), i ); - - if( m_isEEschema ) - { - m_netclassGrid->HideCol( i ); - m_originalColWidths[ i ] = 0; - } - } } + COMMON_SETTINGS* cfg = Pgm().GetCommonSettings(); + + if( m_isEEschema ) + m_netclassGrid->ShowHideColumns( cfg->m_NetclassPanel.eeschema_visible_columns ); + else + m_netclassGrid->ShowHideColumns( cfg->m_NetclassPanel.pcbnew_visible_columns ); + + m_shownColumns = m_netclassGrid->GetShownColumns(); + wxGridCellAttr* attr = new wxGridCellAttr; attr->SetRenderer( new GRID_CELL_COLOR_RENDERER( PAGED_DIALOG::GetDialog( this ) ) ); attr->SetEditor( new GRID_CELL_COLOR_SELECTOR( PAGED_DIALOG::GetDialog( this ), @@ -170,8 +160,8 @@ PANEL_SETUP_NETCLASSES::PANEL_SETUP_NETCLASSES( wxWindow* aParentWindow, EDA_DRA attr = new wxGridCellAttr; attr->SetRenderer( new GRID_CELL_COLOR_RENDERER( PAGED_DIALOG::GetDialog( this ) ) ); - attr->SetEditor( - new GRID_CELL_COLOR_SELECTOR( PAGED_DIALOG::GetDialog( this ), m_netclassGrid ) ); + attr->SetEditor( new GRID_CELL_COLOR_SELECTOR( PAGED_DIALOG::GetDialog( this ), + m_netclassGrid ) ); m_netclassGrid->SetColAttr( GRID_PCB_COLOR, attr ); attr = new wxGridCellAttr; @@ -218,7 +208,6 @@ PANEL_SETUP_NETCLASSES::PANEL_SETUP_NETCLASSES( wxWindow* aParentWindow, EDA_DRA m_netclassGrid->SetSelectionMode( wxGrid::wxGridSelectRows ); m_assignmentGrid->SetSelectionMode( wxGrid::wxGridSelectRows ); - COMMON_SETTINGS* cfg = Pgm().GetCommonSettings(); m_splitter->SetSashPosition( cfg->m_NetclassPanel.sash_pos ); m_addButton->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) ); @@ -267,6 +256,11 @@ PANEL_SETUP_NETCLASSES::~PANEL_SETUP_NETCLASSES() COMMON_SETTINGS* cfg = Pgm().GetCommonSettings(); cfg->m_NetclassPanel.sash_pos = m_splitter->GetSashPosition(); + if( m_isEEschema ) + cfg->m_NetclassPanel.eeschema_visible_columns = m_netclassGrid->GetShownColumnsAsString(); + else + cfg->m_NetclassPanel.pcbnew_visible_columns = m_netclassGrid->GetShownColumnsAsString(); + // Delete the GRID_TRICKS. m_netclassGrid->PopEventHandler( true ); m_assignmentGrid->PopEventHandler( true ); @@ -282,6 +276,7 @@ PANEL_SETUP_NETCLASSES::~PANEL_SETUP_NETCLASSES() void PANEL_SETUP_NETCLASSES::loadNetclasses() { KIGFX::PCB_RENDER_SETTINGS* rs = nullptr; + if( !m_isEEschema ) { rs = static_cast( @@ -290,55 +285,53 @@ void PANEL_SETUP_NETCLASSES::loadNetclasses() int row = 0; - auto netclassToGridRow = [&]( int aRow, const std::shared_ptr& nc, bool isDefault ) - { - m_netclassGrid->SetCellValue( aRow, GRID_NAME, nc->GetName() ); - - m_netclassGrid->SetUnitValue( aRow, GRID_WIREWIDTH, nc->GetWireWidth() ); - m_netclassGrid->SetUnitValue( aRow, GRID_BUSWIDTH, nc->GetBusWidth() ); - - wxString colorAsString = nc->GetSchematicColor().ToCSSString(); - m_netclassGrid->SetCellValue( aRow, GRID_SCHEMATIC_COLOR, colorAsString ); - - int lineStyleIdx = std::max( 0, nc->GetLineStyle() ); - - if( lineStyleIdx >= (int) g_lineStyleNames.size() ) - lineStyleIdx = 0; - - m_netclassGrid->SetCellValue( aRow, GRID_LINESTYLE, g_lineStyleNames[lineStyleIdx] ); - m_netclassGrid->SetUnitValue( aRow, GRID_CLEARANCE, nc->GetClearance() ); - m_netclassGrid->SetUnitValue( aRow, GRID_TRACKSIZE, nc->GetTrackWidth() ); - m_netclassGrid->SetUnitValue( aRow, GRID_VIASIZE, nc->GetViaDiameter() ); - m_netclassGrid->SetUnitValue( aRow, GRID_VIADRILL, nc->GetViaDrill() ); - m_netclassGrid->SetUnitValue( aRow, GRID_uVIASIZE, nc->GetuViaDiameter() ); - m_netclassGrid->SetUnitValue( aRow, GRID_uVIADRILL, nc->GetuViaDrill() ); - m_netclassGrid->SetUnitValue( aRow, GRID_DIFF_PAIR_WIDTH, nc->GetDiffPairWidth() ); - m_netclassGrid->SetUnitValue( aRow, GRID_DIFF_PAIR_GAP, nc->GetDiffPairGap() ); - - colorAsString = KIGFX::COLOR4D( 0.0, 0.0, 0.0, 0.0 ).ToCSSString(); - - if( m_isEEschema ) - { - colorAsString = nc->GetPcbColor().ToCSSString(); - } - - if( rs ) - { - std::map& netclassColors = rs->GetNetclassColorMap(); - if( netclassColors.find( nc->GetName() ) != netclassColors.end() ) + auto netclassToGridRow = + [&]( int aRow, const std::shared_ptr& nc, bool isDefault ) { - colorAsString = netclassColors[nc->GetName()].ToCSSString(); - } - } + m_netclassGrid->SetCellValue( aRow, GRID_NAME, nc->GetName() ); - if( isDefault ) - { - colorAsString = KIGFX::COLOR4D( 0.0, 0.0, 0.0, 0.0 ).ToCSSString(); - m_netclassGrid->SetReadOnly( aRow, GRID_PCB_COLOR ); - } + m_netclassGrid->SetUnitValue( aRow, GRID_WIREWIDTH, nc->GetWireWidth() ); + m_netclassGrid->SetUnitValue( aRow, GRID_BUSWIDTH, nc->GetBusWidth() ); - m_netclassGrid->SetCellValue( aRow, GRID_PCB_COLOR, colorAsString ); - }; + wxString colorAsString = nc->GetSchematicColor().ToCSSString(); + m_netclassGrid->SetCellValue( aRow, GRID_SCHEMATIC_COLOR, colorAsString ); + + int lineStyleIdx = std::max( 0, nc->GetLineStyle() ); + + if( lineStyleIdx >= (int) g_lineStyleNames.size() ) + lineStyleIdx = 0; + + m_netclassGrid->SetCellValue( aRow, GRID_LINESTYLE, g_lineStyleNames[lineStyleIdx] ); + m_netclassGrid->SetUnitValue( aRow, GRID_CLEARANCE, nc->GetClearance() ); + m_netclassGrid->SetUnitValue( aRow, GRID_TRACKSIZE, nc->GetTrackWidth() ); + m_netclassGrid->SetUnitValue( aRow, GRID_VIASIZE, nc->GetViaDiameter() ); + m_netclassGrid->SetUnitValue( aRow, GRID_VIADRILL, nc->GetViaDrill() ); + m_netclassGrid->SetUnitValue( aRow, GRID_uVIASIZE, nc->GetuViaDiameter() ); + m_netclassGrid->SetUnitValue( aRow, GRID_uVIADRILL, nc->GetuViaDrill() ); + m_netclassGrid->SetUnitValue( aRow, GRID_DIFF_PAIR_WIDTH, nc->GetDiffPairWidth() ); + m_netclassGrid->SetUnitValue( aRow, GRID_DIFF_PAIR_GAP, nc->GetDiffPairGap() ); + + colorAsString = KIGFX::COLOR4D( 0.0, 0.0, 0.0, 0.0 ).ToCSSString(); + + if( m_isEEschema ) + colorAsString = nc->GetPcbColor().ToCSSString(); + + if( rs ) + { + std::map& netclassColors = rs->GetNetclassColorMap(); + + if( netclassColors.find( nc->GetName() ) != netclassColors.end() ) + colorAsString = netclassColors[nc->GetName()].ToCSSString(); + } + + if( isDefault ) + { + colorAsString = KIGFX::COLOR4D( 0.0, 0.0, 0.0, 0.0 ).ToCSSString(); + m_netclassGrid->SetReadOnly( aRow, GRID_PCB_COLOR ); + } + + m_netclassGrid->SetCellValue( aRow, GRID_PCB_COLOR, colorAsString ); + }; m_netclassGrid->ClearRows(); @@ -444,56 +437,51 @@ bool PANEL_SETUP_NETCLASSES::TransferDataFromWindow() int row = 0; - auto gridRowToNetclass = [&]( int aRow, const std::shared_ptr& nc, bool isDefault ) - { - nc->SetName( m_netclassGrid->GetCellValue( aRow, GRID_NAME ) ); - - nc->SetWireWidth( m_netclassGrid->GetUnitValue( aRow, GRID_WIREWIDTH ) ); - nc->SetBusWidth( m_netclassGrid->GetUnitValue( aRow, GRID_BUSWIDTH ) ); - - wxString color = m_netclassGrid->GetCellValue( aRow, GRID_SCHEMATIC_COLOR ); - nc->SetSchematicColor( wxColour( color ) ); - - wxString lineStyle = m_netclassGrid->GetCellValue( aRow, GRID_LINESTYLE ); - nc->SetLineStyle( g_lineStyleNames.Index( lineStyle ) ); - wxASSERT_MSG( nc->GetLineStyle() >= 0, "Line style name not found." ); - - nc->SetClearance( m_netclassGrid->GetUnitValue( aRow, GRID_CLEARANCE ) ); - nc->SetTrackWidth( m_netclassGrid->GetUnitValue( aRow, GRID_TRACKSIZE ) ); - nc->SetViaDiameter( m_netclassGrid->GetUnitValue( aRow, GRID_VIASIZE ) ); - nc->SetViaDrill( m_netclassGrid->GetUnitValue( aRow, GRID_VIADRILL ) ); - nc->SetuViaDiameter( m_netclassGrid->GetUnitValue( aRow, GRID_uVIASIZE ) ); - nc->SetuViaDrill( m_netclassGrid->GetUnitValue( aRow, GRID_uVIADRILL ) ); - nc->SetDiffPairWidth( m_netclassGrid->GetUnitValue( aRow, GRID_DIFF_PAIR_WIDTH ) ); - nc->SetDiffPairGap( m_netclassGrid->GetUnitValue( aRow, GRID_DIFF_PAIR_GAP ) ); - - if( !isDefault ) - { - color = m_netclassGrid->GetCellValue( aRow, GRID_PCB_COLOR ); - KIGFX::COLOR4D newPcbColor( color ); - - if( newPcbColor != KIGFX::COLOR4D::UNSPECIFIED ) + auto gridRowToNetclass = + [&]( int aRow, const std::shared_ptr& nc, bool isDefault ) { - nc->SetPcbColor( newPcbColor ); - } + nc->SetName( m_netclassGrid->GetCellValue( aRow, GRID_NAME ) ); - if( !m_isEEschema ) - { - KIGFX::PCB_RENDER_SETTINGS* rs = static_cast( - m_frame->GetCanvas()->GetView()->GetPainter()->GetSettings() ); - std::map& netclassColors = rs->GetNetclassColorMap(); + nc->SetWireWidth( m_netclassGrid->GetUnitValue( aRow, GRID_WIREWIDTH ) ); + nc->SetBusWidth( m_netclassGrid->GetUnitValue( aRow, GRID_BUSWIDTH ) ); - if( newPcbColor != COLOR4D::UNSPECIFIED ) + wxString color = m_netclassGrid->GetCellValue( aRow, GRID_SCHEMATIC_COLOR ); + nc->SetSchematicColor( wxColour( color ) ); + + wxString lineStyle = m_netclassGrid->GetCellValue( aRow, GRID_LINESTYLE ); + nc->SetLineStyle( g_lineStyleNames.Index( lineStyle ) ); + wxASSERT_MSG( nc->GetLineStyle() >= 0, "Line style name not found." ); + + nc->SetClearance( m_netclassGrid->GetUnitValue( aRow, GRID_CLEARANCE ) ); + nc->SetTrackWidth( m_netclassGrid->GetUnitValue( aRow, GRID_TRACKSIZE ) ); + nc->SetViaDiameter( m_netclassGrid->GetUnitValue( aRow, GRID_VIASIZE ) ); + nc->SetViaDrill( m_netclassGrid->GetUnitValue( aRow, GRID_VIADRILL ) ); + nc->SetuViaDiameter( m_netclassGrid->GetUnitValue( aRow, GRID_uVIASIZE ) ); + nc->SetuViaDrill( m_netclassGrid->GetUnitValue( aRow, GRID_uVIADRILL ) ); + nc->SetDiffPairWidth( m_netclassGrid->GetUnitValue( aRow, GRID_DIFF_PAIR_WIDTH ) ); + nc->SetDiffPairGap( m_netclassGrid->GetUnitValue( aRow, GRID_DIFF_PAIR_GAP ) ); + + if( !isDefault ) { - netclassColors[nc->GetName()] = newPcbColor; + color = m_netclassGrid->GetCellValue( aRow, GRID_PCB_COLOR ); + KIGFX::COLOR4D newPcbColor( color ); + + if( newPcbColor != KIGFX::COLOR4D::UNSPECIFIED ) + nc->SetPcbColor( newPcbColor ); + + if( !m_isEEschema ) + { + KIGFX::PCB_RENDER_SETTINGS* rs = static_cast( + m_frame->GetCanvas()->GetView()->GetPainter()->GetSettings() ); + std::map& netclassColors = rs->GetNetclassColorMap(); + + if( newPcbColor != COLOR4D::UNSPECIFIED ) + netclassColors[nc->GetName()] = newPcbColor; + else + netclassColors.erase( nc->GetName() ); + } } - else - { - netclassColors.erase( nc->GetName() ); - } - } - } - }; + }; m_netSettings->m_NetClasses.clear(); @@ -707,8 +695,11 @@ void PANEL_SETUP_NETCLASSES::AdjustNetclassGridColumns( int aWidth ) for( int i = 1; i < m_netclassGrid->GetNumberCols(); i++ ) { - m_netclassGrid->SetColSize( i, m_originalColWidths[ i ] ); - aWidth -= m_originalColWidths[ i ]; + if( m_netclassGrid->GetColSize( i ) > 0 ) + { + m_netclassGrid->SetColSize( i, m_originalColWidths[ i ] ); + aWidth -= m_originalColWidths[ i ]; + } } m_netclassGrid->SetColSize( 0, std::max( aWidth - 2, m_originalColWidths[ 0 ] ) ); @@ -806,6 +797,12 @@ void PANEL_SETUP_NETCLASSES::OnUpdateUI( wxUpdateUIEvent& event ) m_netclassesDirty = false; } + if( m_shownColumns != m_netclassGrid->GetShownColumns() ) + { + AdjustNetclassGridColumns( GetSize().x - 1 ); + m_shownColumns = m_netclassGrid->GetShownColumns(); + } + if( m_assignmentGrid->GetNumberRows() == 0 ) return; diff --git a/common/settings/common_settings.cpp b/common/settings/common_settings.cpp index 49920717a1..171c53f376 100644 --- a/common/settings/common_settings.cpp +++ b/common/settings/common_settings.cpp @@ -341,6 +341,12 @@ COMMON_SETTINGS::COMMON_SETTINGS() : m_params.emplace_back( new PARAM( "netclass_panel.sash_pos", &m_NetclassPanel.sash_pos, 160 ) ); + m_params.emplace_back( new PARAM( "netclass_panel.eeschema_shown_columns", + &m_NetclassPanel.eeschema_visible_columns, "0 10 11 12 13" ) ); + + m_params.emplace_back( new PARAM( "netclass_panel.pcbnew_shown_columns", + &m_NetclassPanel.pcbnew_visible_columns, "0 1 2 3 4 5 6 7 8 9" ) ); + m_params.emplace_back( new PARAM( "package_manager.sash_pos", &m_PackageManager.sash_pos, 380 ) ); diff --git a/include/dialogs/panel_setup_netclasses.h b/include/dialogs/panel_setup_netclasses.h index fe17b5be40..4c39563465 100644 --- a/include/dialogs/panel_setup_netclasses.h +++ b/include/dialogs/panel_setup_netclasses.h @@ -89,6 +89,7 @@ private: int m_hoveredCol; // Column being hovered over, for tooltips wxString m_lastPattern; + std::bitset<64> m_shownColumns; int m_lastNetclassGridWidth; }; diff --git a/include/settings/common_settings.h b/include/settings/common_settings.h index 438bae7ac5..2bba06b5ad 100644 --- a/include/settings/common_settings.h +++ b/include/settings/common_settings.h @@ -140,6 +140,8 @@ public: struct NETCLASS_PANEL { int sash_pos; + wxString eeschema_visible_columns; + wxString pcbnew_visible_columns; }; struct PACKAGE_MANAGER