From 8fe863729759a06c9e29e22f5c204b6febb5ec0c Mon Sep 17 00:00:00 2001
From: Jeff Young <jeff@rokeby.ie>
Date: Wed, 22 Jan 2025 18:17:05 +0000
Subject: [PATCH] Fix yet more assumptions about field IDs and order.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/19710
---
 eeschema/dialogs/dialog_field_properties.cpp |  2 +-
 eeschema/fields_grid_table.cpp               | 23 ++++++++++----------
 pcbnew/pcb_fields_grid_table.cpp             | 10 +++++----
 3 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/eeschema/dialogs/dialog_field_properties.cpp b/eeschema/dialogs/dialog_field_properties.cpp
index d8fc1a4153..bd29761ba6 100644
--- a/eeschema/dialogs/dialog_field_properties.cpp
+++ b/eeschema/dialogs/dialog_field_properties.cpp
@@ -689,7 +689,7 @@ void DIALOG_FIELD_PROPERTIES::UpdateField( SCH_COMMIT* aCommit, SCH_FIELD* aFiel
                     else if( fieldType == FOOTPRINT_FIELD )
                         otherUnit->SetFootprintFieldText( m_text );
                     else
-                        otherUnit->GetField( DATASHEET_FIELD )->SetText( m_text );
+                        otherUnit->GetField( (MANDATORY_FIELD_T) fieldType )->SetText( m_text );
 
                     editFrame->UpdateItem( otherUnit, false, true );
                 }
diff --git a/eeschema/fields_grid_table.cpp b/eeschema/fields_grid_table.cpp
index 1a3eab5515..37e6143e1b 100644
--- a/eeschema/fields_grid_table.cpp
+++ b/eeschema/fields_grid_table.cpp
@@ -556,17 +556,17 @@ wxGridCellAttr* FIELDS_GRID_TABLE::GetAttr( int aRow, int aCol, wxGridCellAttr::
         }
 
     case FDC_VALUE:
-        if( m_parentType == SCH_SYMBOL_T && aRow == REFERENCE_FIELD )
+        if( m_parentType == SCH_SYMBOL_T && field.GetId() == REFERENCE_FIELD )
         {
             m_referenceAttr->IncRef();
             return enhanceAttr( m_referenceAttr, aRow, aCol, aKind );
         }
-        else if( m_parentType == SCH_SYMBOL_T && aRow == VALUE_FIELD )
+        else if( m_parentType == SCH_SYMBOL_T && field.GetId() == VALUE_FIELD )
         {
             m_valueAttr->IncRef();
             return enhanceAttr( m_valueAttr, aRow, aCol, aKind );
         }
-        else if( m_parentType == SCH_SYMBOL_T && aRow == FOOTPRINT_FIELD )
+        else if( m_parentType == SCH_SYMBOL_T && field.GetId() == FOOTPRINT_FIELD )
         {
             // Power symbols have do not appear in the board, so don't allow
             // a footprint (m_part can be nullptr when loading a old schematic
@@ -582,23 +582,23 @@ wxGridCellAttr* FIELDS_GRID_TABLE::GetAttr( int aRow, int aCol, wxGridCellAttr::
                 return enhanceAttr( m_footprintAttr, aRow, aCol, aKind );
             }
         }
-        else if( m_parentType == SCH_SYMBOL_T && aRow == DATASHEET_FIELD )
+        else if( m_parentType == SCH_SYMBOL_T && field.GetId() == DATASHEET_FIELD )
         {
             m_urlAttr->IncRef();
             return enhanceAttr( m_urlAttr, aRow, aCol, aKind );
         }
-        else if( m_parentType == SCH_SHEET_T && aRow == SHEETNAME )
+        else if( m_parentType == SCH_SHEET_T && field.GetId() == SHEETNAME )
         {
             m_referenceAttr->IncRef();
             return enhanceAttr( m_referenceAttr, aRow, aCol, aKind );
         }
-        else if( m_parentType == SCH_SHEET_T && aRow == SHEETFILENAME )
+        else if( m_parentType == SCH_SHEET_T && field.GetId() == SHEETFILENAME )
         {
             m_filepathAttr->IncRef();
             return enhanceAttr( m_filepathAttr, aRow, aCol, aKind );
         }
         else if( ( m_parentType == SCH_LABEL_LOCATE_ANY_T )
-                && this->at( (size_t) aRow ).GetCanonicalName() == wxT( "Netclass" ) )
+                && field.GetCanonicalName() == wxT( "Netclass" ) )
         {
             m_netclassAttr->IncRef();
             return enhanceAttr( m_netclassAttr, aRow, aCol, aKind );
@@ -696,7 +696,7 @@ wxString FIELDS_GRID_TABLE::GetValue( int aRow, int aCol )
         else if( m_parentType == SCH_SHEET_T )
         {
             if( field.IsMandatory() )
-                return SCH_SHEET::GetDefaultFieldName( aRow, DO_TRANSLATE );
+                return SCH_SHEET::GetDefaultFieldName( field.GetId(), DO_TRANSLATE );
             else
                 return field.GetName( false );
         }
@@ -841,11 +841,11 @@ void FIELDS_GRID_TABLE::SetValue( int aRow, int aCol, const wxString &aValue )
 
     case FDC_VALUE:
     {
-        if( m_parentType == SCH_SHEET_T && aRow == SHEETFILENAME )
+        if( m_parentType == SCH_SHEET_T && field.GetId() == SHEETFILENAME )
         {
             value = EnsureFileExtension( value, FILEEXT::KiCadSchematicFileExtension );
         }
-        else if( m_parentType == LIB_SYMBOL_T && aRow == VALUE_FIELD )
+        else if( m_parentType == LIB_SYMBOL_T && field.GetId() == VALUE_FIELD )
         {
             value = EscapeString( value, CTX_LIBID );
         }
@@ -949,8 +949,7 @@ void FIELDS_GRID_TABLE::SetValue( int aRow, int aCol, const wxString &aValue )
         if( value == DEFAULT_FONT_NAME )
             field.SetFont( nullptr );
         else if( value == KICAD_FONT_NAME )
-            field.SetFont( KIFONT::FONT::GetFont( wxEmptyString, field.IsBold(),
-                                                  field.IsItalic() ) );
+            field.SetFont( KIFONT::FONT::GetFont( wxEmptyString, field.IsBold(), field.IsItalic() ) );
         else
             field.SetFont( KIFONT::FONT::GetFont( aValue, field.IsBold(), field.IsItalic() ) );
 
diff --git a/pcbnew/pcb_fields_grid_table.cpp b/pcbnew/pcb_fields_grid_table.cpp
index 5109db3969..5bdd756399 100644
--- a/pcbnew/pcb_fields_grid_table.cpp
+++ b/pcbnew/pcb_fields_grid_table.cpp
@@ -230,10 +230,12 @@ bool PCB_FIELDS_GRID_TABLE::CanSetValueAs( int aRow, int aCol, const wxString& a
 wxGridCellAttr* PCB_FIELDS_GRID_TABLE::GetAttr( int aRow, int aCol,
                                                 wxGridCellAttr::wxAttrKind aKind  )
 {
+    const PCB_FIELD& field = this->at( (size_t) aRow );
+
     switch( aCol )
     {
     case PFC_NAME:
-        if( aRow < GetMandatoryRowCount() )
+        if( field.IsMandatory() )
         {
             m_readOnlyAttr->IncRef();
             return enhanceAttr( m_readOnlyAttr, aRow, aCol, aKind );
@@ -242,17 +244,17 @@ wxGridCellAttr* PCB_FIELDS_GRID_TABLE::GetAttr( int aRow, int aCol,
         return enhanceAttr( nullptr, aRow, aCol, aKind );
 
     case PFC_VALUE:
-        if( aRow == REFERENCE_FIELD )
+        if( field.GetId() == REFERENCE_FIELD )
         {
             m_referenceAttr->IncRef();
             return enhanceAttr( m_referenceAttr, aRow, aCol, aKind );
         }
-        else if( aRow == VALUE_FIELD )
+        else if( field.GetId() == VALUE_FIELD )
         {
             m_valueAttr->IncRef();
             return enhanceAttr( m_valueAttr, aRow, aCol, aKind );
         }
-        else if( aRow == DATASHEET_FIELD )
+        else if( field.GetId() == DATASHEET_FIELD )
         {
             m_urlAttr->IncRef();
             return enhanceAttr( m_urlAttr, aRow, aCol, aKind );