From 8324c0b0ccb2e7f4026e7482d6a8b7f568b20adb Mon Sep 17 00:00:00 2001
From: Jeff Young <jeff@rokeby.ie>
Date: Sat, 17 Dec 2022 22:33:00 +0000
Subject: [PATCH] Fix event order bugs in Sim Model Editor dialog.

onParamGridChanged was firing before CommitPendingChanges which meant
the edited value didn't get saved if the editor was still open when
OK was clicked.
---
 eeschema/dialogs/dialog_sim_model.cpp      | 9 +++++++--
 eeschema/dialogs/dialog_sim_model.h        | 2 +-
 eeschema/dialogs/dialog_sim_model_base.cpp | 4 ++--
 eeschema/dialogs/dialog_sim_model_base.fbp | 2 +-
 eeschema/dialogs/dialog_sim_model_base.h   | 2 +-
 eeschema/sim/sim_property.cpp              | 3 ---
 6 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/eeschema/dialogs/dialog_sim_model.cpp b/eeschema/dialogs/dialog_sim_model.cpp
index 28d2cb4ae0..b3cc8052e3 100644
--- a/eeschema/dialogs/dialog_sim_model.cpp
+++ b/eeschema/dialogs/dialog_sim_model.cpp
@@ -1199,9 +1199,14 @@ void DIALOG_SIM_MODEL<T_symbol, T_field>::onTypeChoice( wxCommandEvent& aEvent )
 
 
 template <typename T_symbol, typename T_field>
-void DIALOG_SIM_MODEL<T_symbol, T_field>::onParamGridChanged( wxPropertyGridEvent& aEvent )
+void DIALOG_SIM_MODEL<T_symbol, T_field>::onPageChanging( wxBookCtrlEvent& event )
 {
-    updateWidgets();
+    // This should have been done in wxPGTextCtrlEditor::OnTextCtrlEvent(), but something must
+    // be clearing it before we get here, resulting in CommitChangesFromEditor() doing nothing
+    m_paramGrid->GetGrid()->EditorsValueWasModified();
+    m_paramGrid->GetGrid()->CommitChangesFromEditor();
+
+    updateModelCodeTab();
 }
 
 
diff --git a/eeschema/dialogs/dialog_sim_model.h b/eeschema/dialogs/dialog_sim_model.h
index 6504fc8115..bf24dd5fb5 100644
--- a/eeschema/dialogs/dialog_sim_model.h
+++ b/eeschema/dialogs/dialog_sim_model.h
@@ -103,7 +103,7 @@ private:
     void onIbisModelComboboxTextEnter( wxCommandEvent& event ) override;
     void onDeviceTypeChoice( wxCommandEvent& aEvent ) override;
     void onTypeChoice( wxCommandEvent& aEvent ) override;
-    void onParamGridChanged( wxPropertyGridEvent& aEvent ) override;
+    void onPageChanging( wxNotebookEvent& event ) override;
     void onPinAssignmentsGridCellChange( wxGridEvent& aEvent ) override;
     void onPinAssignmentsGridSize( wxSizeEvent& aEvent ) override;
     void onSaveInValueCheckbox( wxCommandEvent& aEvent ) override;
diff --git a/eeschema/dialogs/dialog_sim_model_base.cpp b/eeschema/dialogs/dialog_sim_model_base.cpp
index 2489bc98cd..32c844e866 100644
--- a/eeschema/dialogs/dialog_sim_model_base.cpp
+++ b/eeschema/dialogs/dialog_sim_model_base.cpp
@@ -312,7 +312,7 @@ DIALOG_SIM_MODEL_BASE::DIALOG_SIM_MODEL_BASE( wxWindow* parent, wxWindowID id, c
 	m_deviceTypeChoice->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SIM_MODEL_BASE::onDeviceTypeChoiceUpdate ), NULL, this );
 	m_staticTextSpiceType->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SIM_MODEL_BASE::onTypeLabelUpdate ), NULL, this );
 	m_typeChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_SIM_MODEL_BASE::onTypeChoice ), NULL, this );
-	m_paramGridMgr->Connect( wxEVT_PG_CHANGED, wxPropertyGridEventHandler( DIALOG_SIM_MODEL_BASE::onParamGridChanged ), NULL, this );
+	m_modelNotebook->Connect( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, wxNotebookEventHandler( DIALOG_SIM_MODEL_BASE::onPageChanging ), NULL, this );
 	m_paramGridMgr->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_SIM_MODEL_BASE::onSizeParamGrid ), NULL, this );
 	m_saveInValueCheckbox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_SIM_MODEL_BASE::onSaveInValueCheckbox ), NULL, this );
 	m_pinAssignmentsGrid->Connect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_SIM_MODEL_BASE::onPinAssignmentsGridCellChange ), NULL, this );
@@ -349,7 +349,7 @@ DIALOG_SIM_MODEL_BASE::~DIALOG_SIM_MODEL_BASE()
 	m_deviceTypeChoice->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SIM_MODEL_BASE::onDeviceTypeChoiceUpdate ), NULL, this );
 	m_staticTextSpiceType->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SIM_MODEL_BASE::onTypeLabelUpdate ), NULL, this );
 	m_typeChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_SIM_MODEL_BASE::onTypeChoice ), NULL, this );
-	m_paramGridMgr->Disconnect( wxEVT_PG_CHANGED, wxPropertyGridEventHandler( DIALOG_SIM_MODEL_BASE::onParamGridChanged ), NULL, this );
+	m_modelNotebook->Disconnect( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, wxNotebookEventHandler( DIALOG_SIM_MODEL_BASE::onPageChanging ), NULL, this );
 	m_paramGridMgr->Disconnect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_SIM_MODEL_BASE::onSizeParamGrid ), NULL, this );
 	m_saveInValueCheckbox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_SIM_MODEL_BASE::onSaveInValueCheckbox ), NULL, this );
 	m_pinAssignmentsGrid->Disconnect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_SIM_MODEL_BASE::onPinAssignmentsGridCellChange ), NULL, this );
diff --git a/eeschema/dialogs/dialog_sim_model_base.fbp b/eeschema/dialogs/dialog_sim_model_base.fbp
index 2d2cc7f2a1..62b0289890 100644
--- a/eeschema/dialogs/dialog_sim_model_base.fbp
+++ b/eeschema/dialogs/dialog_sim_model_base.fbp
@@ -1393,6 +1393,7 @@
                                                     <property name="window_extra_style"></property>
                                                     <property name="window_name"></property>
                                                     <property name="window_style"></property>
+                                                    <event name="OnNotebookPageChanging">onPageChanging</event>
                                                     <object class="notebookpage" expanded="1">
                                                         <property name="bitmap"></property>
                                                         <property name="label">Parameters</property>
@@ -1511,7 +1512,6 @@
                                                                         <property name="window_extra_style"></property>
                                                                         <property name="window_name"></property>
                                                                         <property name="window_style"></property>
-                                                                        <event name="OnPropertyGridChanged">onParamGridChanged</event>
                                                                         <event name="OnSize">onSizeParamGrid</event>
                                                                         <object class="propGridPage" expanded="0">
                                                                             <property name="bitmap"></property>
diff --git a/eeschema/dialogs/dialog_sim_model_base.h b/eeschema/dialogs/dialog_sim_model_base.h
index 37861fc36e..17092513ed 100644
--- a/eeschema/dialogs/dialog_sim_model_base.h
+++ b/eeschema/dialogs/dialog_sim_model_base.h
@@ -108,7 +108,7 @@ class DIALOG_SIM_MODEL_BASE : public DIALOG_SHIM
 		virtual void onDeviceTypeChoiceUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
 		virtual void onTypeLabelUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
 		virtual void onTypeChoice( wxCommandEvent& event ) { event.Skip(); }
-		virtual void onParamGridChanged( wxPropertyGridEvent& event ) { event.Skip(); }
+		virtual void onPageChanging( wxNotebookEvent& event ) { event.Skip(); }
 		virtual void onSizeParamGrid( wxSizeEvent& event ) { event.Skip(); }
 		virtual void onSaveInValueCheckbox( wxCommandEvent& event ) { event.Skip(); }
 		virtual void onPinAssignmentsGridCellChange( wxGridEvent& event ) { event.Skip(); }
diff --git a/eeschema/sim/sim_property.cpp b/eeschema/sim/sim_property.cpp
index 38057dbf0b..23e965da23 100644
--- a/eeschema/sim/sim_property.cpp
+++ b/eeschema/sim/sim_property.cpp
@@ -170,9 +170,6 @@ bool SIM_STRING_PROPERTY::StringToValue( wxVariant& aVariant, const wxString& aT
     else
         evaledText = aText;
 
-    wxString baseParamValue = m_model.GetBaseParam( m_paramIndex ).value->ToString();
-    aVariant = evaledText;
-
     m_model.SetParamValue( m_paramIndex, std::string( evaledText.ToUTF8() ) );
     aVariant = GetParam().value->ToString();