From 28d7a2d7c90dc7264d3cbedd57266a1fcfc9f46a Mon Sep 17 00:00:00 2001
From: Mikolaj Wielgus <wielgusmikolaj@gmail.com>
Date: Thu, 21 Oct 2021 01:33:30 +0200
Subject: [PATCH] Sim: Update tuner dialog values when focus is lost

Fixes https://gitlab.com/kicad/code/kicad/issues/7841
---
 eeschema/widgets/tuner_slider.cpp      | 86 ++++++++++++++++++--------
 eeschema/widgets/tuner_slider.h        |  8 +++
 eeschema/widgets/tuner_slider_base.cpp |  8 ++-
 eeschema/widgets/tuner_slider_base.fbp | 10 ++-
 eeschema/widgets/tuner_slider_base.h   | 10 ++-
 5 files changed, 92 insertions(+), 30 deletions(-)

diff --git a/eeschema/widgets/tuner_slider.cpp b/eeschema/widgets/tuner_slider.cpp
index 15927b5f05e..774809f89fc 100644
--- a/eeschema/widgets/tuner_slider.cpp
+++ b/eeschema/widgets/tuner_slider.cpp
@@ -131,29 +131,7 @@ void TUNER_SLIDER::updateValueText()
 }
 
 
-void TUNER_SLIDER::onClose( wxCommandEvent& event )
-{
-    m_frame->RemoveTuner( this );
-}
-
-
-void TUNER_SLIDER::onSave( wxCommandEvent& event )
-{
-    /// @todo it will crash when component is removed; completely remove m_symbol
-    m_symbol->GetField( VALUE_FIELD )->SetText( m_value.ToOrigString() );
-}
-
-
-void TUNER_SLIDER::onSliderChanged( wxScrollEvent& event )
-{
-    m_value = m_min + ( m_max - m_min ) * SPICE_VALUE( m_slider->GetValue() / 100.0 );
-    updateValueText();
-    updateComponentValue();
-    m_changed = true;
-}
-
-
-void TUNER_SLIDER::onMaxTextEnter( wxCommandEvent& event )
+void TUNER_SLIDER::updateMax()
 {
     try
     {
@@ -168,7 +146,7 @@ void TUNER_SLIDER::onMaxTextEnter( wxCommandEvent& event )
 }
 
 
-void TUNER_SLIDER::onValueTextEnter( wxCommandEvent& event )
+void TUNER_SLIDER::updateValue()
 {
     try
     {
@@ -184,7 +162,7 @@ void TUNER_SLIDER::onValueTextEnter( wxCommandEvent& event )
 }
 
 
-void TUNER_SLIDER::onMinTextEnter( wxCommandEvent& event )
+void TUNER_SLIDER::updateMin()
 {
     try
     {
@@ -199,6 +177,64 @@ void TUNER_SLIDER::onMinTextEnter( wxCommandEvent& event )
 }
 
 
+void TUNER_SLIDER::onClose( wxCommandEvent& event )
+{
+    m_frame->RemoveTuner( this );
+}
+
+
+void TUNER_SLIDER::onSave( wxCommandEvent& event )
+{
+    /// @todo it will crash when component is removed; completely remove m_symbol
+    m_symbol->GetField( VALUE_FIELD )->SetText( m_value.ToOrigString() );
+}
+
+
+void TUNER_SLIDER::onSliderChanged( wxScrollEvent& event )
+{
+    m_value = m_min + ( m_max - m_min ) * SPICE_VALUE( m_slider->GetValue() / 100.0 );
+    updateValueText();
+    updateComponentValue();
+    m_changed = true;
+}
+
+
+void TUNER_SLIDER::onMaxKillFocus( wxFocusEvent& event )
+{
+    updateMax();
+}
+
+
+void TUNER_SLIDER::onValueKillFocus( wxFocusEvent& event )
+{
+    updateValue();
+}
+
+
+void TUNER_SLIDER::onMinKillFocus( wxFocusEvent& event )
+{
+    updateMin();
+}
+
+
+void TUNER_SLIDER::onMaxTextEnter( wxCommandEvent& event )
+{
+    updateMax();
+}
+
+
+void TUNER_SLIDER::onValueTextEnter( wxCommandEvent& event )
+{
+    updateValue();
+}
+
+
+void TUNER_SLIDER::onMinTextEnter( wxCommandEvent& event )
+{
+    updateMin();
+}
+
+
 void TUNER_SLIDER::onSimTimer( wxTimerEvent& event )
 {
     if( m_changed )
diff --git a/eeschema/widgets/tuner_slider.h b/eeschema/widgets/tuner_slider.h
index a8e43671d7e..13b300d72ec 100644
--- a/eeschema/widgets/tuner_slider.h
+++ b/eeschema/widgets/tuner_slider.h
@@ -78,10 +78,18 @@ private:
     void updateSlider();
     void updateValueText();
 
+    void updateMax();
+    void updateValue();
+    void updateMin();
+
     void onClose( wxCommandEvent& event ) override;
     void onSave( wxCommandEvent& event ) override;
     void onSliderChanged( wxScrollEvent& event ) override;
 
+    void onMaxKillFocus( wxFocusEvent& event ) override;
+    void onValueKillFocus( wxFocusEvent& event ) override;
+    void onMinKillFocus( wxFocusEvent& event ) override;
+
     void onMaxTextEnter( wxCommandEvent& event ) override;
     void onValueTextEnter( wxCommandEvent& event ) override;
     void onMinTextEnter( wxCommandEvent& event ) override;
diff --git a/eeschema/widgets/tuner_slider_base.cpp b/eeschema/widgets/tuner_slider_base.cpp
index a4a2bc38151..5ceed887738 100644
--- a/eeschema/widgets/tuner_slider_base.cpp
+++ b/eeschema/widgets/tuner_slider_base.cpp
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Oct 26 2018)
+// C++ code generated with wxFormBuilder (version 3.10.0)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -81,8 +81,11 @@ TUNER_SLIDER_BASE::TUNER_SLIDER_BASE( wxWindow* parent, wxWindowID id, const wxP
 	m_slider->Connect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
 	m_slider->Connect( wxEVT_SCROLL_THUMBRELEASE, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
 	m_slider->Connect( wxEVT_SCROLL_CHANGED, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
+	m_maxText->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( TUNER_SLIDER_BASE::onMaxKillFocus ), NULL, this );
 	m_maxText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMaxTextEnter ), NULL, this );
+	m_valueText->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( TUNER_SLIDER_BASE::onValueKillFocus ), NULL, this );
 	m_valueText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onValueTextEnter ), NULL, this );
+	m_minText->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( TUNER_SLIDER_BASE::onMinKillFocus ), NULL, this );
 	m_minText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMinTextEnter ), NULL, this );
 	m_saveBtn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onSave ), NULL, this );
 }
@@ -100,8 +103,11 @@ TUNER_SLIDER_BASE::~TUNER_SLIDER_BASE()
 	m_slider->Disconnect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
 	m_slider->Disconnect( wxEVT_SCROLL_THUMBRELEASE, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
 	m_slider->Disconnect( wxEVT_SCROLL_CHANGED, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
+	m_maxText->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( TUNER_SLIDER_BASE::onMaxKillFocus ), NULL, this );
 	m_maxText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMaxTextEnter ), NULL, this );
+	m_valueText->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( TUNER_SLIDER_BASE::onValueKillFocus ), NULL, this );
 	m_valueText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onValueTextEnter ), NULL, this );
+	m_minText->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( TUNER_SLIDER_BASE::onMinKillFocus ), NULL, this );
 	m_minText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMinTextEnter ), NULL, this );
 	m_saveBtn->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onSave ), NULL, this );
 
diff --git a/eeschema/widgets/tuner_slider_base.fbp b/eeschema/widgets/tuner_slider_base.fbp
index 532aa6c13f3..e8fcae89e5b 100644
--- a/eeschema/widgets/tuner_slider_base.fbp
+++ b/eeschema/widgets/tuner_slider_base.fbp
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <wxFormBuilder_Project>
-    <FileVersion major="1" minor="15" />
+    <FileVersion major="1" minor="16" />
     <object class="Project" expanded="1">
         <property name="class_decoration"></property>
         <property name="code_generation">C++</property>
@@ -14,6 +14,7 @@
         <property name="file">tuner_slider_base</property>
         <property name="first_id">1000</property>
         <property name="help_provider">none</property>
+        <property name="image_path_wrapper_function_name"></property>
         <property name="indent_with_spaces"></property>
         <property name="internationalize">1</property>
         <property name="name">TUNER_SLIDER_BASE</property>
@@ -25,6 +26,7 @@
         <property name="skip_php_events">1</property>
         <property name="skip_python_events">1</property>
         <property name="ui_table">UI</property>
+        <property name="use_array_enum">0</property>
         <property name="use_enum">0</property>
         <property name="use_microsoft_bom">0</property>
         <object class="Panel" expanded="1">
@@ -46,6 +48,7 @@
             <property name="size">126,283</property>
             <property name="subclass"></property>
             <property name="tooltip"></property>
+            <property name="two_step_creation">0</property>
             <property name="window_extra_style"></property>
             <property name="window_name"></property>
             <property name="window_style">wxTAB_TRAVERSAL</property>
@@ -137,6 +140,7 @@
                                 <property name="aui_name"></property>
                                 <property name="aui_position"></property>
                                 <property name="aui_row"></property>
+                                <property name="auth_needed">0</property>
                                 <property name="best_size"></property>
                                 <property name="bg"></property>
                                 <property name="bitmap"></property>
@@ -359,6 +363,7 @@
                                         <property name="window_extra_style"></property>
                                         <property name="window_name"></property>
                                         <property name="window_style"></property>
+                                        <event name="OnKillFocus">onMaxKillFocus</event>
                                         <event name="OnTextEnter">onMaxTextEnter</event>
                                     </object>
                                 </object>
@@ -424,6 +429,7 @@
                                         <property name="window_extra_style"></property>
                                         <property name="window_name"></property>
                                         <property name="window_style"></property>
+                                        <event name="OnKillFocus">onValueKillFocus</event>
                                         <event name="OnTextEnter">onValueTextEnter</event>
                                     </object>
                                 </object>
@@ -489,6 +495,7 @@
                                         <property name="window_extra_style"></property>
                                         <property name="window_name"></property>
                                         <property name="window_style"></property>
+                                        <event name="OnKillFocus">onMinKillFocus</event>
                                         <event name="OnTextEnter">onMinTextEnter</event>
                                     </object>
                                 </object>
@@ -509,6 +516,7 @@
                         <property name="aui_name"></property>
                         <property name="aui_position"></property>
                         <property name="aui_row"></property>
+                        <property name="auth_needed">0</property>
                         <property name="best_size"></property>
                         <property name="bg"></property>
                         <property name="bitmap"></property>
diff --git a/eeschema/widgets/tuner_slider_base.h b/eeschema/widgets/tuner_slider_base.h
index 2a01952a06e..fb07dba2a78 100644
--- a/eeschema/widgets/tuner_slider_base.h
+++ b/eeschema/widgets/tuner_slider_base.h
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Oct 26 2018)
+// C++ code generated with wxFormBuilder (version 3.10.0)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -16,10 +16,10 @@
 #include <wx/font.h>
 #include <wx/colour.h>
 #include <wx/settings.h>
+#include <wx/button.h>
 #include <wx/bitmap.h>
 #include <wx/image.h>
 #include <wx/icon.h>
-#include <wx/button.h>
 #include <wx/sizer.h>
 #include <wx/slider.h>
 #include <wx/textctrl.h>
@@ -44,11 +44,14 @@ class TUNER_SLIDER_BASE : public wxPanel
 		wxTextCtrl* m_minText;
 		wxButton* m_saveBtn;
 
-		// Virtual event handlers, overide them in your derived class
+		// Virtual event handlers, override them in your derived class
 		virtual void onClose( wxCommandEvent& event ) { event.Skip(); }
 		virtual void onSliderChanged( wxScrollEvent& event ) { event.Skip(); }
+		virtual void onMaxKillFocus( wxFocusEvent& event ) { event.Skip(); }
 		virtual void onMaxTextEnter( wxCommandEvent& event ) { event.Skip(); }
+		virtual void onValueKillFocus( wxFocusEvent& event ) { event.Skip(); }
 		virtual void onValueTextEnter( wxCommandEvent& event ) { event.Skip(); }
+		virtual void onMinKillFocus( wxFocusEvent& event ) { event.Skip(); }
 		virtual void onMinTextEnter( wxCommandEvent& event ) { event.Skip(); }
 		virtual void onSave( wxCommandEvent& event ) { event.Skip(); }
 
@@ -56,6 +59,7 @@ class TUNER_SLIDER_BASE : public wxPanel
 	public:
 
 		TUNER_SLIDER_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 126,283 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
 		~TUNER_SLIDER_BASE();
 
 };
-- 
GitLab