From 15924958d989c2161012d2075d64bfe02a20fc13 Mon Sep 17 00:00:00 2001
From: John Beard <john.j.beard@gmail.com>
Date: Wed, 31 Jul 2024 01:48:19 +0800
Subject: [PATCH] Add wxGrid autosizer helper

This moves a fiddly little bit of logic used by a few UI
classes into a central location.

Also means that the paths dialog learns to expand the
first cell when it needs to (like the text variable
panel).
---
 common/CMakeLists.txt                         |   1 +
 common/dialogs/dialog_configure_paths.cpp     |  38 +-
 .../dialogs/dialog_configure_paths_base.cpp   |   4 +-
 .../dialogs/dialog_configure_paths_base.fbp   | 709 +++++++++---------
 common/dialogs/dialog_configure_paths_base.h  |   3 +-
 common/dialogs/panel_text_variables.cpp       |  48 +-
 common/dialogs/panel_text_variables_base.cpp  |   6 +-
 common/dialogs/panel_text_variables_base.fbp  | 658 ++++++++--------
 common/dialogs/panel_text_variables_base.h    |   4 +-
 common/widgets/wx_grid_autosizer.cpp          | 113 +++
 include/dialogs/dialog_configure_paths.h      |  10 +-
 include/panel_text_variables.h                |   7 +-
 include/widgets/wx_grid_autosizer.h           |  70 ++
 13 files changed, 908 insertions(+), 763 deletions(-)
 create mode 100644 common/widgets/wx_grid_autosizer.cpp
 create mode 100644 include/widgets/wx_grid_autosizer.h

diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 2c2b16ef97..7be37ffcae 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -415,6 +415,7 @@ set( COMMON_WIDGET_SRCS
     widgets/wx_dataviewctrl.cpp
     widgets/wx_ellipsized_static_text.cpp
     widgets/wx_grid.cpp
+    widgets/wx_grid_autosizer.cpp
     widgets/wx_html_report_box.cpp
     widgets/wx_html_report_panel.cpp
     widgets/wx_html_report_panel_base.cpp
diff --git a/common/dialogs/dialog_configure_paths.cpp b/common/dialogs/dialog_configure_paths.cpp
index 642489cbe3..1d7c602863 100644
--- a/common/dialogs/dialog_configure_paths.cpp
+++ b/common/dialogs/dialog_configure_paths.cpp
@@ -24,6 +24,8 @@
 
 #include <dialogs/dialog_configure_paths.h>
 
+#include <algorithm>
+
 #include <bitmaps.h>
 #include <confirm.h>
 #include <kidialog.h>
@@ -34,14 +36,15 @@
 #include <env_vars.h>
 #include <grid_tricks.h>
 #include <pgm_base.h>
-#include <widgets/wx_grid.h>
 #include <widgets/grid_text_button_helpers.h>
 #include <widgets/grid_text_helpers.h>
 #include <widgets/std_bitmap_button.h>
+#include <widgets/wx_grid.h>
+#include <widgets/wx_grid_autosizer.h>
 
-#include <algorithm>
 #include <wx/dirdlg.h>
 
+
 enum TEXT_VAR_GRID_COLUMNS
 {
     TV_NAME_COL = 0,
@@ -62,8 +65,6 @@ DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS( wxWindow* aParent ) :
     m_errorGrid( nullptr ),
     m_errorRow( -1 ),
     m_errorCol( -1 ),
-    m_gridWidth( 0 ),
-    m_gridWidthsDirty( true ),
     m_helpBox( nullptr ),
     m_heightBeforeHelp( 400 )
 {
@@ -98,6 +99,13 @@ DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS( wxWindow* aParent ) :
                         wxGridEventHandler( DIALOG_CONFIGURE_PATHS::OnGridCellChanging ),
                         nullptr, this );
 
+    m_gridAutosizer = std::make_unique<WX_GRID_AUTOSIZER>( *m_EnvVars,
+                                                           WX_GRID_AUTOSIZER::COL_MIN_WIDTHS{
+                                                                   { TV_NAME_COL, 72 },
+                                                                   { TV_VALUE_COL, 120 },
+                                                           },
+                                                           TV_VALUE_COL );
+
     GetSizer()->SetSizeHints( this );
     Centre();
 }
@@ -346,19 +354,6 @@ void DIALOG_CONFIGURE_PATHS::OnRemoveEnvVar( wxCommandEvent& event )
 
 void DIALOG_CONFIGURE_PATHS::OnUpdateUI( wxUpdateUIEvent& event )
 {
-    if( m_gridWidthsDirty )
-    {
-        int width = m_EnvVars->GetClientRect().GetWidth();
-
-        m_EnvVars->AutoSizeColumn( TV_NAME_COL );
-        m_EnvVars->SetColSize( TV_NAME_COL, std::max( 72, m_EnvVars->GetColSize( TV_NAME_COL ) ) );
-
-        m_EnvVars->SetColSize( TV_VALUE_COL, std::max( 120, width - m_EnvVars->GetColSize( TV_NAME_COL ) ) );
-
-        m_gridWidth = m_EnvVars->GetSize().GetX();
-        m_gridWidthsDirty = false;
-    }
-
     // Handle a grid error.  This is delayed to OnUpdateUI so that we can change focus even when
     // the original validation was triggered from a killFocus event.
     if( m_errorGrid )
@@ -380,15 +375,6 @@ void DIALOG_CONFIGURE_PATHS::OnUpdateUI( wxUpdateUIEvent& event )
 }
 
 
-void DIALOG_CONFIGURE_PATHS::OnGridSize( wxSizeEvent& event )
-{
-    if( event.GetSize().GetX() != m_gridWidth )
-        m_gridWidthsDirty = true;
-
-    event.Skip();
-}
-
-
 void DIALOG_CONFIGURE_PATHS::OnHelp( wxCommandEvent& event )
 {
     wxSizer* sizerMain = GetSizer();
diff --git a/common/dialogs/dialog_configure_paths_base.cpp b/common/dialogs/dialog_configure_paths_base.cpp
index 4da4409291..149f1a7bc4 100644
--- a/common/dialogs/dialog_configure_paths_base.cpp
+++ b/common/dialogs/dialog_configure_paths_base.cpp
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
+// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -92,7 +92,6 @@ DIALOG_CONFIGURE_PATHS_BASE::DIALOG_CONFIGURE_PATHS_BASE( wxWindow* parent, wxWi
 
 	// Connect Events
 	this->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnUpdateUI ) );
-	m_EnvVars->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridSize ), NULL, this );
 	m_btnAddEnvVar->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnAddEnvVar ), NULL, this );
 	m_btnDeleteEnvVar->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnRemoveEnvVar ), NULL, this );
 	m_sdbSizerHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnHelp ), NULL, this );
@@ -102,7 +101,6 @@ DIALOG_CONFIGURE_PATHS_BASE::~DIALOG_CONFIGURE_PATHS_BASE()
 {
 	// Disconnect Events
 	this->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnUpdateUI ) );
-	m_EnvVars->Disconnect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnGridSize ), NULL, this );
 	m_btnAddEnvVar->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnAddEnvVar ), NULL, this );
 	m_btnDeleteEnvVar->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnRemoveEnvVar ), NULL, this );
 	m_sdbSizerHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CONFIGURE_PATHS_BASE::OnHelp ), NULL, this );
diff --git a/common/dialogs/dialog_configure_paths_base.fbp b/common/dialogs/dialog_configure_paths_base.fbp
index 1ab415c75d..0fa00ce88a 100644
--- a/common/dialogs/dialog_configure_paths_base.fbp
+++ b/common/dialogs/dialog_configure_paths_base.fbp
@@ -1,359 +1,362 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <wxFormBuilder_Project>
-    <FileVersion major="1" minor="16" />
-    <object class="Project" expanded="1">
-        <property name="class_decoration"></property>
-        <property name="code_generation">C++</property>
-        <property name="disconnect_events">1</property>
-        <property name="disconnect_mode">source_name</property>
-        <property name="disconnect_php_events">0</property>
-        <property name="disconnect_python_events">0</property>
-        <property name="embedded_files_path">res</property>
-        <property name="encoding">UTF-8</property>
-        <property name="event_generation">connect</property>
-        <property name="file">dialog_configure_paths_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">DIALOG_CONFIGURE_PATHS_BASE</property>
-        <property name="namespace"></property>
-        <property name="path">.</property>
-        <property name="precompiled_header"></property>
-        <property name="relative_path">1</property>
-        <property name="skip_lua_events">1</property>
-        <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="Dialog" expanded="1">
-            <property name="aui_managed">0</property>
-            <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
-            <property name="bg"></property>
-            <property name="center">wxBOTH</property>
-            <property name="context_help"></property>
-            <property name="context_menu">1</property>
-            <property name="enabled">1</property>
-            <property name="event_handler">impl_virtual</property>
-            <property name="extra_style"></property>
-            <property name="fg"></property>
-            <property name="font"></property>
-            <property name="hidden">0</property>
+  <FileVersion major="1" minor="17"/>
+  <object class="Project" expanded="true">
+    <property name="class_decoration"></property>
+    <property name="code_generation">C++</property>
+    <property name="disconnect_events">1</property>
+    <property name="disconnect_mode">source_name</property>
+    <property name="disconnect_php_events">0</property>
+    <property name="disconnect_python_events">0</property>
+    <property name="embedded_files_path">res</property>
+    <property name="encoding">UTF-8</property>
+    <property name="event_generation">connect</property>
+    <property name="file">dialog_configure_paths_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">DIALOG_CONFIGURE_PATHS_BASE</property>
+    <property name="namespace"></property>
+    <property name="path">.</property>
+    <property name="precompiled_header"></property>
+    <property name="relative_path">1</property>
+    <property name="skip_lua_events">1</property>
+    <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="Dialog" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg"></property>
+      <property name="center">wxBOTH</property>
+      <property name="context_help"></property>
+      <property name="context_menu">1</property>
+      <property name="drag_accept_files">0</property>
+      <property name="enabled">1</property>
+      <property name="event_handler">impl_virtual</property>
+      <property name="extra_style"></property>
+      <property name="fg"></property>
+      <property name="font"></property>
+      <property name="hidden">0</property>
+      <property name="id">wxID_ANY</property>
+      <property name="maximum_size"></property>
+      <property name="minimum_size">-1,-1</property>
+      <property name="name">DIALOG_CONFIGURE_PATHS_BASE</property>
+      <property name="pos"></property>
+      <property name="size">-1,-1</property>
+      <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
+      <property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
+      <property name="title">Configure Paths</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"></property>
+      <event name="OnUpdateUI">OnUpdateUI</event>
+      <object class="wxBoxSizer" expanded="true">
+        <property name="minimum_size"></property>
+        <property name="name">bSizerMain</property>
+        <property name="orient">wxVERTICAL</property>
+        <property name="permission">none</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALL|wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="wxStaticBoxSizer" expanded="true">
             <property name="id">wxID_ANY</property>
-            <property name="maximum_size"></property>
-            <property name="minimum_size">-1,-1</property>
-            <property name="name">DIALOG_CONFIGURE_PATHS_BASE</property>
-            <property name="pos"></property>
-            <property name="size">-1,-1</property>
-            <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
-            <property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
-            <property name="title">Configure Paths</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"></property>
-            <event name="OnUpdateUI">OnUpdateUI</event>
-            <object class="wxBoxSizer" expanded="1">
-                <property name="minimum_size"></property>
-                <property name="name">bSizerMain</property>
-                <property name="orient">wxVERTICAL</property>
-                <property name="permission">none</property>
-                <object class="sizeritem" expanded="1">
-                    <property name="border">5</property>
-                    <property name="flag">wxALL|wxEXPAND</property>
-                    <property name="proportion">1</property>
-                    <object class="wxStaticBoxSizer" expanded="1">
-                        <property name="id">wxID_ANY</property>
-                        <property name="label">Environment Variables</property>
-                        <property name="minimum_size"></property>
-                        <property name="name">sbEnvVars</property>
-                        <property name="orient">wxVERTICAL</property>
-                        <property name="parent">1</property>
-                        <property name="permission">none</property>
-                        <object class="sizeritem" expanded="1">
-                            <property name="border">5</property>
-                            <property name="flag">wxALL|wxEXPAND</property>
-                            <property name="proportion">1</property>
-                            <object class="wxGrid" expanded="1">
-                                <property name="BottomDockable">1</property>
-                                <property name="LeftDockable">1</property>
-                                <property name="RightDockable">1</property>
-                                <property name="TopDockable">1</property>
-                                <property name="aui_layer"></property>
-                                <property name="aui_name"></property>
-                                <property name="aui_position"></property>
-                                <property name="aui_row"></property>
-                                <property name="autosize_cols">0</property>
-                                <property name="autosize_rows">0</property>
-                                <property name="best_size"></property>
-                                <property name="bg"></property>
-                                <property name="caption"></property>
-                                <property name="caption_visible">1</property>
-                                <property name="cell_bg"></property>
-                                <property name="cell_font"></property>
-                                <property name="cell_horiz_alignment">wxALIGN_LEFT</property>
-                                <property name="cell_text"></property>
-                                <property name="cell_vert_alignment">wxALIGN_CENTER</property>
-                                <property name="center_pane">0</property>
-                                <property name="close_button">1</property>
-                                <property name="col_label_horiz_alignment">wxALIGN_CENTER</property>
-                                <property name="col_label_size">wxGRID_AUTOSIZE</property>
-                                <property name="col_label_values">&quot;Name&quot; &quot;Path&quot;</property>
-                                <property name="col_label_vert_alignment">wxALIGN_CENTER</property>
-                                <property name="cols">2</property>
-                                <property name="column_sizes">150,454</property>
-                                <property name="context_help"></property>
-                                <property name="context_menu">1</property>
-                                <property name="default_pane">0</property>
-                                <property name="dock">Dock</property>
-                                <property name="dock_fixed">0</property>
-                                <property name="docking">Left</property>
-                                <property name="drag_col_move">0</property>
-                                <property name="drag_col_size">1</property>
-                                <property name="drag_grid_size">0</property>
-                                <property name="drag_row_size">1</property>
-                                <property name="editing">1</property>
-                                <property name="enabled">1</property>
-                                <property name="fg"></property>
-                                <property name="floatable">1</property>
-                                <property name="font"></property>
-                                <property name="grid_line_color"></property>
-                                <property name="grid_lines">1</property>
-                                <property name="gripper">0</property>
-                                <property name="hidden">0</property>
-                                <property name="id">wxID_ANY</property>
-                                <property name="label_bg"></property>
-                                <property name="label_font"></property>
-                                <property name="label_text"></property>
-                                <property name="margin_height">0</property>
-                                <property name="margin_width">0</property>
-                                <property name="max_size"></property>
-                                <property name="maximize_button">0</property>
-                                <property name="maximum_size"></property>
-                                <property name="min_size"></property>
-                                <property name="minimize_button">0</property>
-                                <property name="minimum_size">604,170</property>
-                                <property name="moveable">1</property>
-                                <property name="name">m_EnvVars</property>
-                                <property name="pane_border">1</property>
-                                <property name="pane_position"></property>
-                                <property name="pane_size"></property>
-                                <property name="permission">protected</property>
-                                <property name="pin_button">1</property>
-                                <property name="pos"></property>
-                                <property name="resize">Resizable</property>
-                                <property name="row_label_horiz_alignment">wxALIGN_CENTER</property>
-                                <property name="row_label_size">0</property>
-                                <property name="row_label_values"></property>
-                                <property name="row_label_vert_alignment">wxALIGN_CENTER</property>
-                                <property name="row_sizes"></property>
-                                <property name="rows">1</property>
-                                <property name="show">1</property>
-                                <property name="size"></property>
-                                <property name="subclass">WX_GRID; widgets/wx_grid.h; forward_declare</property>
-                                <property name="toolbar_pane">0</property>
-                                <property name="tooltip"></property>
-                                <property name="window_extra_style"></property>
-                                <property name="window_name"></property>
-                                <property name="window_style"></property>
-                                <event name="OnSize">OnGridSize</event>
-                            </object>
-                        </object>
-                        <object class="sizeritem" expanded="1">
-                            <property name="border">5</property>
-                            <property name="flag">wxEXPAND</property>
-                            <property name="proportion">0</property>
-                            <object class="wxBoxSizer" expanded="1">
-                                <property name="minimum_size"></property>
-                                <property name="name">bSizerEnvVarBtns</property>
-                                <property name="orient">wxHORIZONTAL</property>
-                                <property name="permission">none</property>
-                                <object class="sizeritem" expanded="1">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxBitmapButton" expanded="1">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <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>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="current"></property>
-                                        <property name="default">0</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="disabled"></property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="focus"></property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Add Environment Variable</property>
-                                        <property name="margins"></property>
-                                        <property name="markup">0</property>
-                                        <property name="max_size"></property>
-                                        <property name="maximize_button">0</property>
-                                        <property name="maximum_size"></property>
-                                        <property name="min_size"></property>
-                                        <property name="minimize_button">0</property>
-                                        <property name="minimum_size">-1,-1</property>
-                                        <property name="moveable">1</property>
-                                        <property name="name">m_btnAddEnvVar</property>
-                                        <property name="pane_border">1</property>
-                                        <property name="pane_position"></property>
-                                        <property name="pane_size"></property>
-                                        <property name="permission">protected</property>
-                                        <property name="pin_button">1</property>
-                                        <property name="pos"></property>
-                                        <property name="position"></property>
-                                        <property name="pressed"></property>
-                                        <property name="resize">Resizable</property>
-                                        <property name="show">1</property>
-                                        <property name="size"></property>
-                                        <property name="style"></property>
-                                        <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
-                                        <property name="toolbar_pane">0</property>
-                                        <property name="tooltip"></property>
-                                        <property name="validator_data_type"></property>
-                                        <property name="validator_style">wxFILTER_NONE</property>
-                                        <property name="validator_type">wxDefaultValidator</property>
-                                        <property name="validator_variable"></property>
-                                        <property name="window_extra_style"></property>
-                                        <property name="window_name"></property>
-                                        <property name="window_style"></property>
-                                        <event name="OnButtonClick">OnAddEnvVar</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="1">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="spacer" expanded="1">
-                                        <property name="height">0</property>
-                                        <property name="permission">protected</property>
-                                        <property name="width">0</property>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="1">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxBitmapButton" expanded="1">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <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>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="current"></property>
-                                        <property name="default">0</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="disabled"></property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="focus"></property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Delete Environment Variable</property>
-                                        <property name="margins"></property>
-                                        <property name="markup">0</property>
-                                        <property name="max_size"></property>
-                                        <property name="maximize_button">0</property>
-                                        <property name="maximum_size"></property>
-                                        <property name="min_size"></property>
-                                        <property name="minimize_button">0</property>
-                                        <property name="minimum_size">-1,-1</property>
-                                        <property name="moveable">1</property>
-                                        <property name="name">m_btnDeleteEnvVar</property>
-                                        <property name="pane_border">1</property>
-                                        <property name="pane_position"></property>
-                                        <property name="pane_size"></property>
-                                        <property name="permission">protected</property>
-                                        <property name="pin_button">1</property>
-                                        <property name="pos"></property>
-                                        <property name="position"></property>
-                                        <property name="pressed"></property>
-                                        <property name="resize">Resizable</property>
-                                        <property name="show">1</property>
-                                        <property name="size"></property>
-                                        <property name="style"></property>
-                                        <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
-                                        <property name="toolbar_pane">0</property>
-                                        <property name="tooltip"></property>
-                                        <property name="validator_data_type"></property>
-                                        <property name="validator_style">wxFILTER_NONE</property>
-                                        <property name="validator_type">wxDefaultValidator</property>
-                                        <property name="validator_variable"></property>
-                                        <property name="window_extra_style"></property>
-                                        <property name="window_name"></property>
-                                        <property name="window_style"></property>
-                                        <event name="OnButtonClick">OnRemoveEnvVar</event>
-                                    </object>
-                                </object>
-                            </object>
-                        </object>
-                    </object>
-                </object>
-                <object class="sizeritem" expanded="1">
-                    <property name="border">5</property>
-                    <property name="flag">wxALL|wxEXPAND</property>
-                    <property name="proportion">0</property>
-                    <object class="wxStdDialogButtonSizer" expanded="1">
-                        <property name="Apply">0</property>
-                        <property name="Cancel">1</property>
-                        <property name="ContextHelp">0</property>
-                        <property name="Help">1</property>
-                        <property name="No">0</property>
-                        <property name="OK">1</property>
-                        <property name="Save">0</property>
-                        <property name="Yes">0</property>
-                        <property name="minimum_size"></property>
-                        <property name="name">m_sdbSizer</property>
-                        <property name="permission">protected</property>
-                        <event name="OnHelpButtonClick">OnHelp</event>
-                    </object>
-                </object>
+            <property name="label">Environment Variables</property>
+            <property name="minimum_size"></property>
+            <property name="name">sbEnvVars</property>
+            <property name="orient">wxVERTICAL</property>
+            <property name="parent">1</property>
+            <property name="permission">none</property>
+            <object class="sizeritem" expanded="true">
+              <property name="border">5</property>
+              <property name="flag">wxALL|wxEXPAND</property>
+              <property name="proportion">1</property>
+              <object class="wxGrid" expanded="true">
+                <property name="BottomDockable">1</property>
+                <property name="LeftDockable">1</property>
+                <property name="RightDockable">1</property>
+                <property name="TopDockable">1</property>
+                <property name="aui_layer"></property>
+                <property name="aui_name"></property>
+                <property name="aui_position"></property>
+                <property name="aui_row"></property>
+                <property name="autosize_cols">0</property>
+                <property name="autosize_rows">0</property>
+                <property name="best_size"></property>
+                <property name="bg"></property>
+                <property name="caption"></property>
+                <property name="caption_visible">1</property>
+                <property name="cell_bg"></property>
+                <property name="cell_font"></property>
+                <property name="cell_horiz_alignment">wxALIGN_LEFT</property>
+                <property name="cell_text"></property>
+                <property name="cell_vert_alignment">wxALIGN_CENTER</property>
+                <property name="center_pane">0</property>
+                <property name="close_button">1</property>
+                <property name="col_label_horiz_alignment">wxALIGN_CENTER</property>
+                <property name="col_label_size">wxGRID_AUTOSIZE</property>
+                <property name="col_label_values">&quot;Name&quot; &quot;Path&quot;</property>
+                <property name="col_label_vert_alignment">wxALIGN_CENTER</property>
+                <property name="cols">2</property>
+                <property name="column_sizes">150,454</property>
+                <property name="context_help"></property>
+                <property name="context_menu">1</property>
+                <property name="default_pane">0</property>
+                <property name="dock">Dock</property>
+                <property name="dock_fixed">0</property>
+                <property name="docking">Left</property>
+                <property name="drag_accept_files">0</property>
+                <property name="drag_col_move">0</property>
+                <property name="drag_col_size">1</property>
+                <property name="drag_grid_size">0</property>
+                <property name="drag_row_size">1</property>
+                <property name="editing">1</property>
+                <property name="enabled">1</property>
+                <property name="fg"></property>
+                <property name="floatable">1</property>
+                <property name="font"></property>
+                <property name="grid_line_color"></property>
+                <property name="grid_lines">1</property>
+                <property name="gripper">0</property>
+                <property name="hidden">0</property>
+                <property name="id">wxID_ANY</property>
+                <property name="label_bg"></property>
+                <property name="label_font"></property>
+                <property name="label_text"></property>
+                <property name="margin_height">0</property>
+                <property name="margin_width">0</property>
+                <property name="max_size"></property>
+                <property name="maximize_button">0</property>
+                <property name="maximum_size"></property>
+                <property name="min_size"></property>
+                <property name="minimize_button">0</property>
+                <property name="minimum_size">604,170</property>
+                <property name="moveable">1</property>
+                <property name="name">m_EnvVars</property>
+                <property name="pane_border">1</property>
+                <property name="pane_position"></property>
+                <property name="pane_size"></property>
+                <property name="permission">protected</property>
+                <property name="pin_button">1</property>
+                <property name="pos"></property>
+                <property name="resize">Resizable</property>
+                <property name="row_label_horiz_alignment">wxALIGN_CENTER</property>
+                <property name="row_label_size">0</property>
+                <property name="row_label_values"></property>
+                <property name="row_label_vert_alignment">wxALIGN_CENTER</property>
+                <property name="row_sizes"></property>
+                <property name="rows">1</property>
+                <property name="show">1</property>
+                <property name="size"></property>
+                <property name="subclass">WX_GRID; widgets/wx_grid.h; forward_declare</property>
+                <property name="toolbar_pane">0</property>
+                <property name="tooltip"></property>
+                <property name="window_extra_style"></property>
+                <property name="window_name"></property>
+                <property name="window_style"></property>
+              </object>
             </object>
+            <object class="sizeritem" expanded="true">
+              <property name="border">5</property>
+              <property name="flag">wxEXPAND</property>
+              <property name="proportion">0</property>
+              <object class="wxBoxSizer" expanded="true">
+                <property name="minimum_size"></property>
+                <property name="name">bSizerEnvVarBtns</property>
+                <property name="orient">wxHORIZONTAL</property>
+                <property name="permission">none</property>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxBitmapButton" expanded="true">
+                    <property name="BottomDockable">1</property>
+                    <property name="LeftDockable">1</property>
+                    <property name="RightDockable">1</property>
+                    <property name="TopDockable">1</property>
+                    <property name="aui_layer"></property>
+                    <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>
+                    <property name="caption"></property>
+                    <property name="caption_visible">1</property>
+                    <property name="center_pane">0</property>
+                    <property name="close_button">1</property>
+                    <property name="context_help"></property>
+                    <property name="context_menu">1</property>
+                    <property name="current"></property>
+                    <property name="default">0</property>
+                    <property name="default_pane">0</property>
+                    <property name="disabled"></property>
+                    <property name="dock">Dock</property>
+                    <property name="dock_fixed">0</property>
+                    <property name="docking">Left</property>
+                    <property name="drag_accept_files">0</property>
+                    <property name="enabled">1</property>
+                    <property name="fg"></property>
+                    <property name="floatable">1</property>
+                    <property name="focus"></property>
+                    <property name="font"></property>
+                    <property name="gripper">0</property>
+                    <property name="hidden">0</property>
+                    <property name="id">wxID_ANY</property>
+                    <property name="label">Add Environment Variable</property>
+                    <property name="margins"></property>
+                    <property name="markup">0</property>
+                    <property name="max_size"></property>
+                    <property name="maximize_button">0</property>
+                    <property name="maximum_size"></property>
+                    <property name="min_size"></property>
+                    <property name="minimize_button">0</property>
+                    <property name="minimum_size">-1,-1</property>
+                    <property name="moveable">1</property>
+                    <property name="name">m_btnAddEnvVar</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">protected</property>
+                    <property name="pin_button">1</property>
+                    <property name="pos"></property>
+                    <property name="position"></property>
+                    <property name="pressed"></property>
+                    <property name="resize">Resizable</property>
+                    <property name="show">1</property>
+                    <property name="size"></property>
+                    <property name="style"></property>
+                    <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
+                    <property name="toolbar_pane">0</property>
+                    <property name="tooltip"></property>
+                    <property name="validator_data_type"></property>
+                    <property name="validator_style">wxFILTER_NONE</property>
+                    <property name="validator_type">wxDefaultValidator</property>
+                    <property name="validator_variable"></property>
+                    <property name="window_extra_style"></property>
+                    <property name="window_name"></property>
+                    <property name="window_style"></property>
+                    <event name="OnButtonClick">OnAddEnvVar</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="spacer" expanded="true">
+                    <property name="height">0</property>
+                    <property name="permission">protected</property>
+                    <property name="width">0</property>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM</property>
+                  <property name="proportion">0</property>
+                  <object class="wxBitmapButton" expanded="true">
+                    <property name="BottomDockable">1</property>
+                    <property name="LeftDockable">1</property>
+                    <property name="RightDockable">1</property>
+                    <property name="TopDockable">1</property>
+                    <property name="aui_layer"></property>
+                    <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>
+                    <property name="caption"></property>
+                    <property name="caption_visible">1</property>
+                    <property name="center_pane">0</property>
+                    <property name="close_button">1</property>
+                    <property name="context_help"></property>
+                    <property name="context_menu">1</property>
+                    <property name="current"></property>
+                    <property name="default">0</property>
+                    <property name="default_pane">0</property>
+                    <property name="disabled"></property>
+                    <property name="dock">Dock</property>
+                    <property name="dock_fixed">0</property>
+                    <property name="docking">Left</property>
+                    <property name="drag_accept_files">0</property>
+                    <property name="enabled">1</property>
+                    <property name="fg"></property>
+                    <property name="floatable">1</property>
+                    <property name="focus"></property>
+                    <property name="font"></property>
+                    <property name="gripper">0</property>
+                    <property name="hidden">0</property>
+                    <property name="id">wxID_ANY</property>
+                    <property name="label">Delete Environment Variable</property>
+                    <property name="margins"></property>
+                    <property name="markup">0</property>
+                    <property name="max_size"></property>
+                    <property name="maximize_button">0</property>
+                    <property name="maximum_size"></property>
+                    <property name="min_size"></property>
+                    <property name="minimize_button">0</property>
+                    <property name="minimum_size">-1,-1</property>
+                    <property name="moveable">1</property>
+                    <property name="name">m_btnDeleteEnvVar</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">protected</property>
+                    <property name="pin_button">1</property>
+                    <property name="pos"></property>
+                    <property name="position"></property>
+                    <property name="pressed"></property>
+                    <property name="resize">Resizable</property>
+                    <property name="show">1</property>
+                    <property name="size"></property>
+                    <property name="style"></property>
+                    <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
+                    <property name="toolbar_pane">0</property>
+                    <property name="tooltip"></property>
+                    <property name="validator_data_type"></property>
+                    <property name="validator_style">wxFILTER_NONE</property>
+                    <property name="validator_type">wxDefaultValidator</property>
+                    <property name="validator_variable"></property>
+                    <property name="window_extra_style"></property>
+                    <property name="window_name"></property>
+                    <property name="window_style"></property>
+                    <event name="OnButtonClick">OnRemoveEnvVar</event>
+                  </object>
+                </object>
+              </object>
+            </object>
+          </object>
         </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALL|wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxStdDialogButtonSizer" expanded="true">
+            <property name="Apply">0</property>
+            <property name="Cancel">1</property>
+            <property name="ContextHelp">0</property>
+            <property name="Help">1</property>
+            <property name="No">0</property>
+            <property name="OK">1</property>
+            <property name="Save">0</property>
+            <property name="Yes">0</property>
+            <property name="minimum_size"></property>
+            <property name="name">m_sdbSizer</property>
+            <property name="permission">protected</property>
+            <event name="OnHelpButtonClick">OnHelp</event>
+          </object>
+        </object>
+      </object>
     </object>
+  </object>
 </wxFormBuilder_Project>
diff --git a/common/dialogs/dialog_configure_paths_base.h b/common/dialogs/dialog_configure_paths_base.h
index 7828bc293e..0753750a5f 100644
--- a/common/dialogs/dialog_configure_paths_base.h
+++ b/common/dialogs/dialog_configure_paths_base.h
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
+// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -50,7 +50,6 @@ class DIALOG_CONFIGURE_PATHS_BASE : public DIALOG_SHIM
 
 		// Virtual event handlers, override them in your derived class
 		virtual void OnUpdateUI( wxUpdateUIEvent& event ) { event.Skip(); }
-		virtual void OnGridSize( wxSizeEvent& event ) { event.Skip(); }
 		virtual void OnAddEnvVar( wxCommandEvent& event ) { event.Skip(); }
 		virtual void OnRemoveEnvVar( wxCommandEvent& event ) { event.Skip(); }
 		virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); }
diff --git a/common/dialogs/panel_text_variables.cpp b/common/dialogs/panel_text_variables.cpp
index c58eae4e82..8bd7cb0496 100644
--- a/common/dialogs/panel_text_variables.cpp
+++ b/common/dialogs/panel_text_variables.cpp
@@ -23,6 +23,8 @@
 
 #include <panel_text_variables.h>
 
+#include <algorithm>
+
 #include <bitmaps.h>
 #include <confirm.h>
 #include <validators.h>
@@ -30,8 +32,8 @@
 #include <grid_tricks.h>
 #include <widgets/std_bitmap_button.h>
 #include <widgets/grid_text_helpers.h>
+#include <widgets/wx_grid_autosizer.h>
 
-#include <algorithm>
 
 enum TEXT_VAR_GRID_COLUMNS
 {
@@ -41,11 +43,8 @@ enum TEXT_VAR_GRID_COLUMNS
 
 
 PANEL_TEXT_VARIABLES::PANEL_TEXT_VARIABLES( wxWindow* aParent, PROJECT* aProject ) :
-    PANEL_TEXT_VARIABLES_BASE( aParent ),
-    m_project( aProject ),
-    m_lastCheckedTicker( 0 ),
-    m_errorRow( -1 ), m_errorCol( -1 ),
-    m_gridWidthsDirty( true )
+        PANEL_TEXT_VARIABLES_BASE( aParent ), m_project( aProject ), m_lastCheckedTicker( 0 ),
+        m_errorRow( -1 ), m_errorCol( -1 )
 {
     m_btnAddTextVar->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
     m_btnDeleteTextVar->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
@@ -82,6 +81,13 @@ PANEL_TEXT_VARIABLES::PANEL_TEXT_VARIABLES( wxWindow* aParent, PROJECT* aProject
                       checkReload();
               }
           } );
+
+    m_autoSizer = std::make_unique<WX_GRID_AUTOSIZER>( *m_TextVars,
+                                                       WX_GRID_AUTOSIZER::COL_MIN_WIDTHS{
+                                                               { TV_NAME_COL, 72 },
+                                                               { TV_VALUE_COL, 120 },
+                                                       },
+                                                       TV_VALUE_COL );
 }
 
 
@@ -223,29 +229,8 @@ void PANEL_TEXT_VARIABLES::OnRemoveTextVar( wxCommandEvent& event )
 }
 
 
-void PANEL_TEXT_VARIABLES::OnGridCellChange( wxGridEvent& aEvent )
-{
-    m_gridWidthsDirty = true;
-
-    aEvent.Skip();
-}
-
-
 void PANEL_TEXT_VARIABLES::OnUpdateUI( wxUpdateUIEvent& event )
 {
-    if( m_gridWidthsDirty )
-    {
-        int width = m_TextVars->GetClientRect().GetWidth();
-
-        m_TextVars->AutoSizeColumn( TV_NAME_COL );
-        m_TextVars->SetColSize( TV_NAME_COL,
-                                std::max( 72, m_TextVars->GetColSize( TV_NAME_COL ) ) );
-
-        m_TextVars->SetColSize( TV_VALUE_COL,
-                                std::max( 120, width - m_TextVars->GetColSize( TV_NAME_COL ) ) );
-        m_gridWidthsDirty = false;
-    }
-
     // Handle a grid error.  This is delayed to OnUpdateUI so that we can change focus
     // even when the original validation was triggered from a killFocus event (and for
     // dialog with notebooks, so that the corresponding notebook page can be shown in
@@ -269,12 +254,3 @@ void PANEL_TEXT_VARIABLES::OnUpdateUI( wxUpdateUIEvent& event )
         m_TextVars->ShowCellEditControl();
     }
 }
-
-
-void PANEL_TEXT_VARIABLES::OnGridSize( wxSizeEvent& event )
-{
-    m_gridWidthsDirty = true;
-
-    event.Skip();
-}
-
diff --git a/common/dialogs/panel_text_variables_base.cpp b/common/dialogs/panel_text_variables_base.cpp
index 0b00a2bbec..44d00c1e7b 100644
--- a/common/dialogs/panel_text_variables_base.cpp
+++ b/common/dialogs/panel_text_variables_base.cpp
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
+// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -77,8 +77,6 @@ PANEL_TEXT_VARIABLES_BASE::PANEL_TEXT_VARIABLES_BASE( wxWindow* parent, wxWindow
 
 	// Connect Events
 	this->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PANEL_TEXT_VARIABLES_BASE::OnUpdateUI ) );
-	m_TextVars->Connect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( PANEL_TEXT_VARIABLES_BASE::OnGridCellChange ), NULL, this );
-	m_TextVars->Connect( wxEVT_SIZE, wxSizeEventHandler( PANEL_TEXT_VARIABLES_BASE::OnGridSize ), NULL, this );
 	m_btnAddTextVar->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_TEXT_VARIABLES_BASE::OnAddTextVar ), NULL, this );
 	m_btnDeleteTextVar->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_TEXT_VARIABLES_BASE::OnRemoveTextVar ), NULL, this );
 }
@@ -87,8 +85,6 @@ PANEL_TEXT_VARIABLES_BASE::~PANEL_TEXT_VARIABLES_BASE()
 {
 	// Disconnect Events
 	this->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PANEL_TEXT_VARIABLES_BASE::OnUpdateUI ) );
-	m_TextVars->Disconnect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( PANEL_TEXT_VARIABLES_BASE::OnGridCellChange ), NULL, this );
-	m_TextVars->Disconnect( wxEVT_SIZE, wxSizeEventHandler( PANEL_TEXT_VARIABLES_BASE::OnGridSize ), NULL, this );
 	m_btnAddTextVar->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_TEXT_VARIABLES_BASE::OnAddTextVar ), NULL, this );
 	m_btnDeleteTextVar->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_TEXT_VARIABLES_BASE::OnRemoveTextVar ), NULL, this );
 
diff --git a/common/dialogs/panel_text_variables_base.fbp b/common/dialogs/panel_text_variables_base.fbp
index d408207c05..d3ea807c24 100644
--- a/common/dialogs/panel_text_variables_base.fbp
+++ b/common/dialogs/panel_text_variables_base.fbp
@@ -1,334 +1,336 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <wxFormBuilder_Project>
-    <FileVersion major="1" minor="16" />
-    <object class="Project" expanded="1">
-        <property name="class_decoration"></property>
-        <property name="code_generation">C++</property>
-        <property name="disconnect_events">1</property>
-        <property name="disconnect_mode">source_name</property>
-        <property name="disconnect_php_events">0</property>
-        <property name="disconnect_python_events">0</property>
-        <property name="embedded_files_path">res</property>
-        <property name="encoding">UTF-8</property>
-        <property name="event_generation">connect</property>
-        <property name="file">panel_text_variables_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">PanelTextVariables</property>
-        <property name="namespace"></property>
-        <property name="path">.</property>
-        <property name="precompiled_header"></property>
-        <property name="relative_path">1</property>
-        <property name="skip_lua_events">1</property>
-        <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">1</property>
-        <property name="use_microsoft_bom">0</property>
-        <object class="Panel" expanded="1">
-            <property name="aui_managed">0</property>
-            <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
-            <property name="bg"></property>
-            <property name="context_help"></property>
-            <property name="context_menu">1</property>
-            <property name="enabled">1</property>
-            <property name="event_handler">impl_virtual</property>
-            <property name="fg"></property>
-            <property name="font"></property>
-            <property name="hidden">0</property>
-            <property name="id">wxID_ANY</property>
-            <property name="maximum_size"></property>
+  <FileVersion major="1" minor="17"/>
+  <object class="Project" expanded="true">
+    <property name="class_decoration"></property>
+    <property name="code_generation">C++</property>
+    <property name="disconnect_events">1</property>
+    <property name="disconnect_mode">source_name</property>
+    <property name="disconnect_php_events">0</property>
+    <property name="disconnect_python_events">0</property>
+    <property name="embedded_files_path">res</property>
+    <property name="encoding">UTF-8</property>
+    <property name="event_generation">connect</property>
+    <property name="file">panel_text_variables_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">PanelTextVariables</property>
+    <property name="namespace"></property>
+    <property name="path">.</property>
+    <property name="precompiled_header"></property>
+    <property name="relative_path">1</property>
+    <property name="skip_lua_events">1</property>
+    <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">1</property>
+    <property name="use_microsoft_bom">0</property>
+    <object class="Panel" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg"></property>
+      <property name="context_help"></property>
+      <property name="context_menu">1</property>
+      <property name="drag_accept_files">0</property>
+      <property name="enabled">1</property>
+      <property name="event_handler">impl_virtual</property>
+      <property name="fg"></property>
+      <property name="font"></property>
+      <property name="hidden">0</property>
+      <property name="id">wxID_ANY</property>
+      <property name="maximum_size"></property>
+      <property name="minimum_size"></property>
+      <property name="name">PANEL_TEXT_VARIABLES_BASE</property>
+      <property name="pos"></property>
+      <property name="size">-1,-1</property>
+      <property name="subclass">; forward_declare</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>
+      <event name="OnUpdateUI">OnUpdateUI</event>
+      <object class="wxBoxSizer" expanded="true">
+        <property name="minimum_size"></property>
+        <property name="name">bPanelSizer</property>
+        <property name="orient">wxVERTICAL</property>
+        <property name="permission">none</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="wxBoxSizer" expanded="true">
             <property name="minimum_size"></property>
-            <property name="name">PANEL_TEXT_VARIABLES_BASE</property>
-            <property name="pos"></property>
-            <property name="size">-1,-1</property>
-            <property name="subclass">; forward_declare</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>
-            <event name="OnUpdateUI">OnUpdateUI</event>
-            <object class="wxBoxSizer" expanded="1">
-                <property name="minimum_size"></property>
-                <property name="name">bPanelSizer</property>
-                <property name="orient">wxVERTICAL</property>
-                <property name="permission">none</property>
-                <object class="sizeritem" expanded="1">
-                    <property name="border">5</property>
-                    <property name="flag">wxEXPAND</property>
-                    <property name="proportion">1</property>
-                    <object class="wxBoxSizer" expanded="1">
-                        <property name="minimum_size"></property>
-                        <property name="name">bSizer3</property>
-                        <property name="orient">wxVERTICAL</property>
-                        <property name="permission">none</property>
-                        <object class="sizeritem" expanded="1">
-                            <property name="border">5</property>
-                            <property name="flag">wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP</property>
-                            <property name="proportion">1</property>
-                            <object class="wxGrid" expanded="1">
-                                <property name="BottomDockable">1</property>
-                                <property name="LeftDockable">1</property>
-                                <property name="RightDockable">1</property>
-                                <property name="TopDockable">1</property>
-                                <property name="aui_layer"></property>
-                                <property name="aui_name"></property>
-                                <property name="aui_position"></property>
-                                <property name="aui_row"></property>
-                                <property name="autosize_cols">0</property>
-                                <property name="autosize_rows">0</property>
-                                <property name="best_size"></property>
-                                <property name="bg"></property>
-                                <property name="caption"></property>
-                                <property name="caption_visible">1</property>
-                                <property name="cell_bg"></property>
-                                <property name="cell_font"></property>
-                                <property name="cell_horiz_alignment">wxALIGN_LEFT</property>
-                                <property name="cell_text"></property>
-                                <property name="cell_vert_alignment">wxALIGN_CENTER</property>
-                                <property name="center_pane">0</property>
-                                <property name="close_button">1</property>
-                                <property name="col_label_horiz_alignment">wxALIGN_CENTER</property>
-                                <property name="col_label_size">wxGRID_AUTOSIZE</property>
-                                <property name="col_label_values">&quot;Variable Name&quot; &quot;Text Substitution&quot;</property>
-                                <property name="col_label_vert_alignment">wxALIGN_CENTER</property>
-                                <property name="cols">2</property>
-                                <property name="column_sizes">150,454</property>
-                                <property name="context_help"></property>
-                                <property name="context_menu">1</property>
-                                <property name="default_pane">0</property>
-                                <property name="dock">Dock</property>
-                                <property name="dock_fixed">0</property>
-                                <property name="docking">Left</property>
-                                <property name="drag_col_move">0</property>
-                                <property name="drag_col_size">1</property>
-                                <property name="drag_grid_size">0</property>
-                                <property name="drag_row_size">1</property>
-                                <property name="editing">1</property>
-                                <property name="enabled">1</property>
-                                <property name="fg"></property>
-                                <property name="floatable">1</property>
-                                <property name="font"></property>
-                                <property name="grid_line_color"></property>
-                                <property name="grid_lines">1</property>
-                                <property name="gripper">0</property>
-                                <property name="hidden">0</property>
-                                <property name="id">wxID_ANY</property>
-                                <property name="label_bg"></property>
-                                <property name="label_font"></property>
-                                <property name="label_text"></property>
-                                <property name="margin_height">0</property>
-                                <property name="margin_width">0</property>
-                                <property name="max_size"></property>
-                                <property name="maximize_button">0</property>
-                                <property name="maximum_size"></property>
-                                <property name="min_size"></property>
-                                <property name="minimize_button">0</property>
-                                <property name="minimum_size">604,170</property>
-                                <property name="moveable">1</property>
-                                <property name="name">m_TextVars</property>
-                                <property name="pane_border">1</property>
-                                <property name="pane_position"></property>
-                                <property name="pane_size"></property>
-                                <property name="permission">protected</property>
-                                <property name="pin_button">1</property>
-                                <property name="pos"></property>
-                                <property name="resize">Resizable</property>
-                                <property name="row_label_horiz_alignment">wxALIGN_CENTER</property>
-                                <property name="row_label_size">0</property>
-                                <property name="row_label_values"></property>
-                                <property name="row_label_vert_alignment">wxALIGN_CENTER</property>
-                                <property name="row_sizes"></property>
-                                <property name="rows">1</property>
-                                <property name="show">1</property>
-                                <property name="size"></property>
-                                <property name="subclass">WX_GRID; widgets/wx_grid.h; forward_declare</property>
-                                <property name="toolbar_pane">0</property>
-                                <property name="tooltip"></property>
-                                <property name="window_extra_style"></property>
-                                <property name="window_name"></property>
-                                <property name="window_style"></property>
-                                <event name="OnGridCellChange">OnGridCellChange</event>
-                                <event name="OnSize">OnGridSize</event>
-                            </object>
-                        </object>
-                        <object class="sizeritem" expanded="1">
-                            <property name="border">5</property>
-                            <property name="flag">wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP</property>
-                            <property name="proportion">0</property>
-                            <object class="wxBoxSizer" expanded="1">
-                                <property name="minimum_size"></property>
-                                <property name="name">bSizerEnvVarBtns</property>
-                                <property name="orient">wxHORIZONTAL</property>
-                                <property name="permission">none</property>
-                                <object class="sizeritem" expanded="1">
-                                    <property name="border">5</property>
-                                    <property name="flag"></property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxBitmapButton" expanded="1">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <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>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="current"></property>
-                                        <property name="default">0</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="disabled"></property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="focus"></property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Add Text Variable</property>
-                                        <property name="margins"></property>
-                                        <property name="markup">0</property>
-                                        <property name="max_size"></property>
-                                        <property name="maximize_button">0</property>
-                                        <property name="maximum_size"></property>
-                                        <property name="min_size"></property>
-                                        <property name="minimize_button">0</property>
-                                        <property name="minimum_size">-1,-1</property>
-                                        <property name="moveable">1</property>
-                                        <property name="name">m_btnAddTextVar</property>
-                                        <property name="pane_border">1</property>
-                                        <property name="pane_position"></property>
-                                        <property name="pane_size"></property>
-                                        <property name="permission">protected</property>
-                                        <property name="pin_button">1</property>
-                                        <property name="pos"></property>
-                                        <property name="position"></property>
-                                        <property name="pressed"></property>
-                                        <property name="resize">Resizable</property>
-                                        <property name="show">1</property>
-                                        <property name="size"></property>
-                                        <property name="style"></property>
-                                        <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
-                                        <property name="toolbar_pane">0</property>
-                                        <property name="tooltip"></property>
-                                        <property name="validator_data_type"></property>
-                                        <property name="validator_style">wxFILTER_NONE</property>
-                                        <property name="validator_type">wxDefaultValidator</property>
-                                        <property name="validator_variable"></property>
-                                        <property name="window_extra_style"></property>
-                                        <property name="window_name"></property>
-                                        <property name="window_style"></property>
-                                        <event name="OnButtonClick">OnAddTextVar</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="1">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxEXPAND</property>
-                                    <property name="proportion">0</property>
-                                    <object class="spacer" expanded="1">
-                                        <property name="height">0</property>
-                                        <property name="permission">protected</property>
-                                        <property name="width">20</property>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="1">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxBitmapButton" expanded="1">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <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>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="current"></property>
-                                        <property name="default">0</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="disabled"></property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="focus"></property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Delete Text Variable</property>
-                                        <property name="margins"></property>
-                                        <property name="markup">0</property>
-                                        <property name="max_size"></property>
-                                        <property name="maximize_button">0</property>
-                                        <property name="maximum_size"></property>
-                                        <property name="min_size"></property>
-                                        <property name="minimize_button">0</property>
-                                        <property name="minimum_size">-1,-1</property>
-                                        <property name="moveable">1</property>
-                                        <property name="name">m_btnDeleteTextVar</property>
-                                        <property name="pane_border">1</property>
-                                        <property name="pane_position"></property>
-                                        <property name="pane_size"></property>
-                                        <property name="permission">protected</property>
-                                        <property name="pin_button">1</property>
-                                        <property name="pos"></property>
-                                        <property name="position"></property>
-                                        <property name="pressed"></property>
-                                        <property name="resize">Resizable</property>
-                                        <property name="show">1</property>
-                                        <property name="size"></property>
-                                        <property name="style"></property>
-                                        <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
-                                        <property name="toolbar_pane">0</property>
-                                        <property name="tooltip"></property>
-                                        <property name="validator_data_type"></property>
-                                        <property name="validator_style">wxFILTER_NONE</property>
-                                        <property name="validator_type">wxDefaultValidator</property>
-                                        <property name="validator_variable"></property>
-                                        <property name="window_extra_style"></property>
-                                        <property name="window_name"></property>
-                                        <property name="window_style"></property>
-                                        <event name="OnButtonClick">OnRemoveTextVar</event>
-                                    </object>
-                                </object>
-                            </object>
-                        </object>
-                    </object>
-                </object>
+            <property name="name">bSizer3</property>
+            <property name="orient">wxVERTICAL</property>
+            <property name="permission">none</property>
+            <object class="sizeritem" expanded="true">
+              <property name="border">5</property>
+              <property name="flag">wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP</property>
+              <property name="proportion">1</property>
+              <object class="wxGrid" expanded="true">
+                <property name="BottomDockable">1</property>
+                <property name="LeftDockable">1</property>
+                <property name="RightDockable">1</property>
+                <property name="TopDockable">1</property>
+                <property name="aui_layer"></property>
+                <property name="aui_name"></property>
+                <property name="aui_position"></property>
+                <property name="aui_row"></property>
+                <property name="autosize_cols">0</property>
+                <property name="autosize_rows">0</property>
+                <property name="best_size"></property>
+                <property name="bg"></property>
+                <property name="caption"></property>
+                <property name="caption_visible">1</property>
+                <property name="cell_bg"></property>
+                <property name="cell_font"></property>
+                <property name="cell_horiz_alignment">wxALIGN_LEFT</property>
+                <property name="cell_text"></property>
+                <property name="cell_vert_alignment">wxALIGN_CENTER</property>
+                <property name="center_pane">0</property>
+                <property name="close_button">1</property>
+                <property name="col_label_horiz_alignment">wxALIGN_CENTER</property>
+                <property name="col_label_size">wxGRID_AUTOSIZE</property>
+                <property name="col_label_values">&quot;Variable Name&quot; &quot;Text Substitution&quot;</property>
+                <property name="col_label_vert_alignment">wxALIGN_CENTER</property>
+                <property name="cols">2</property>
+                <property name="column_sizes">150,454</property>
+                <property name="context_help"></property>
+                <property name="context_menu">1</property>
+                <property name="default_pane">0</property>
+                <property name="dock">Dock</property>
+                <property name="dock_fixed">0</property>
+                <property name="docking">Left</property>
+                <property name="drag_accept_files">0</property>
+                <property name="drag_col_move">0</property>
+                <property name="drag_col_size">1</property>
+                <property name="drag_grid_size">0</property>
+                <property name="drag_row_size">1</property>
+                <property name="editing">1</property>
+                <property name="enabled">1</property>
+                <property name="fg"></property>
+                <property name="floatable">1</property>
+                <property name="font"></property>
+                <property name="grid_line_color"></property>
+                <property name="grid_lines">1</property>
+                <property name="gripper">0</property>
+                <property name="hidden">0</property>
+                <property name="id">wxID_ANY</property>
+                <property name="label_bg"></property>
+                <property name="label_font"></property>
+                <property name="label_text"></property>
+                <property name="margin_height">0</property>
+                <property name="margin_width">0</property>
+                <property name="max_size"></property>
+                <property name="maximize_button">0</property>
+                <property name="maximum_size"></property>
+                <property name="min_size"></property>
+                <property name="minimize_button">0</property>
+                <property name="minimum_size">604,170</property>
+                <property name="moveable">1</property>
+                <property name="name">m_TextVars</property>
+                <property name="pane_border">1</property>
+                <property name="pane_position"></property>
+                <property name="pane_size"></property>
+                <property name="permission">protected</property>
+                <property name="pin_button">1</property>
+                <property name="pos"></property>
+                <property name="resize">Resizable</property>
+                <property name="row_label_horiz_alignment">wxALIGN_CENTER</property>
+                <property name="row_label_size">0</property>
+                <property name="row_label_values"></property>
+                <property name="row_label_vert_alignment">wxALIGN_CENTER</property>
+                <property name="row_sizes"></property>
+                <property name="rows">1</property>
+                <property name="show">1</property>
+                <property name="size"></property>
+                <property name="subclass">WX_GRID; widgets/wx_grid.h; forward_declare</property>
+                <property name="toolbar_pane">0</property>
+                <property name="tooltip"></property>
+                <property name="window_extra_style"></property>
+                <property name="window_name"></property>
+                <property name="window_style"></property>
+              </object>
             </object>
+            <object class="sizeritem" expanded="true">
+              <property name="border">5</property>
+              <property name="flag">wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP</property>
+              <property name="proportion">0</property>
+              <object class="wxBoxSizer" expanded="true">
+                <property name="minimum_size"></property>
+                <property name="name">bSizerEnvVarBtns</property>
+                <property name="orient">wxHORIZONTAL</property>
+                <property name="permission">none</property>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag"></property>
+                  <property name="proportion">0</property>
+                  <object class="wxBitmapButton" expanded="true">
+                    <property name="BottomDockable">1</property>
+                    <property name="LeftDockable">1</property>
+                    <property name="RightDockable">1</property>
+                    <property name="TopDockable">1</property>
+                    <property name="aui_layer"></property>
+                    <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>
+                    <property name="caption"></property>
+                    <property name="caption_visible">1</property>
+                    <property name="center_pane">0</property>
+                    <property name="close_button">1</property>
+                    <property name="context_help"></property>
+                    <property name="context_menu">1</property>
+                    <property name="current"></property>
+                    <property name="default">0</property>
+                    <property name="default_pane">0</property>
+                    <property name="disabled"></property>
+                    <property name="dock">Dock</property>
+                    <property name="dock_fixed">0</property>
+                    <property name="docking">Left</property>
+                    <property name="drag_accept_files">0</property>
+                    <property name="enabled">1</property>
+                    <property name="fg"></property>
+                    <property name="floatable">1</property>
+                    <property name="focus"></property>
+                    <property name="font"></property>
+                    <property name="gripper">0</property>
+                    <property name="hidden">0</property>
+                    <property name="id">wxID_ANY</property>
+                    <property name="label">Add Text Variable</property>
+                    <property name="margins"></property>
+                    <property name="markup">0</property>
+                    <property name="max_size"></property>
+                    <property name="maximize_button">0</property>
+                    <property name="maximum_size"></property>
+                    <property name="min_size"></property>
+                    <property name="minimize_button">0</property>
+                    <property name="minimum_size">-1,-1</property>
+                    <property name="moveable">1</property>
+                    <property name="name">m_btnAddTextVar</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">protected</property>
+                    <property name="pin_button">1</property>
+                    <property name="pos"></property>
+                    <property name="position"></property>
+                    <property name="pressed"></property>
+                    <property name="resize">Resizable</property>
+                    <property name="show">1</property>
+                    <property name="size"></property>
+                    <property name="style"></property>
+                    <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
+                    <property name="toolbar_pane">0</property>
+                    <property name="tooltip"></property>
+                    <property name="validator_data_type"></property>
+                    <property name="validator_style">wxFILTER_NONE</property>
+                    <property name="validator_type">wxDefaultValidator</property>
+                    <property name="validator_variable"></property>
+                    <property name="window_extra_style"></property>
+                    <property name="window_name"></property>
+                    <property name="window_style"></property>
+                    <event name="OnButtonClick">OnAddTextVar</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag">wxEXPAND</property>
+                  <property name="proportion">0</property>
+                  <object class="spacer" expanded="true">
+                    <property name="height">0</property>
+                    <property name="permission">protected</property>
+                    <property name="width">20</property>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag">wxRIGHT|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxBitmapButton" expanded="true">
+                    <property name="BottomDockable">1</property>
+                    <property name="LeftDockable">1</property>
+                    <property name="RightDockable">1</property>
+                    <property name="TopDockable">1</property>
+                    <property name="aui_layer"></property>
+                    <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>
+                    <property name="caption"></property>
+                    <property name="caption_visible">1</property>
+                    <property name="center_pane">0</property>
+                    <property name="close_button">1</property>
+                    <property name="context_help"></property>
+                    <property name="context_menu">1</property>
+                    <property name="current"></property>
+                    <property name="default">0</property>
+                    <property name="default_pane">0</property>
+                    <property name="disabled"></property>
+                    <property name="dock">Dock</property>
+                    <property name="dock_fixed">0</property>
+                    <property name="docking">Left</property>
+                    <property name="drag_accept_files">0</property>
+                    <property name="enabled">1</property>
+                    <property name="fg"></property>
+                    <property name="floatable">1</property>
+                    <property name="focus"></property>
+                    <property name="font"></property>
+                    <property name="gripper">0</property>
+                    <property name="hidden">0</property>
+                    <property name="id">wxID_ANY</property>
+                    <property name="label">Delete Text Variable</property>
+                    <property name="margins"></property>
+                    <property name="markup">0</property>
+                    <property name="max_size"></property>
+                    <property name="maximize_button">0</property>
+                    <property name="maximum_size"></property>
+                    <property name="min_size"></property>
+                    <property name="minimize_button">0</property>
+                    <property name="minimum_size">-1,-1</property>
+                    <property name="moveable">1</property>
+                    <property name="name">m_btnDeleteTextVar</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">protected</property>
+                    <property name="pin_button">1</property>
+                    <property name="pos"></property>
+                    <property name="position"></property>
+                    <property name="pressed"></property>
+                    <property name="resize">Resizable</property>
+                    <property name="show">1</property>
+                    <property name="size"></property>
+                    <property name="style"></property>
+                    <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; forward_declare</property>
+                    <property name="toolbar_pane">0</property>
+                    <property name="tooltip"></property>
+                    <property name="validator_data_type"></property>
+                    <property name="validator_style">wxFILTER_NONE</property>
+                    <property name="validator_type">wxDefaultValidator</property>
+                    <property name="validator_variable"></property>
+                    <property name="window_extra_style"></property>
+                    <property name="window_name"></property>
+                    <property name="window_style"></property>
+                    <event name="OnButtonClick">OnRemoveTextVar</event>
+                  </object>
+                </object>
+              </object>
+            </object>
+          </object>
         </object>
+      </object>
     </object>
+  </object>
 </wxFormBuilder_Project>
diff --git a/common/dialogs/panel_text_variables_base.h b/common/dialogs/panel_text_variables_base.h
index 99f9428ea7..a74dc019cd 100644
--- a/common/dialogs/panel_text_variables_base.h
+++ b/common/dialogs/panel_text_variables_base.h
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
+// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -43,8 +43,6 @@ class PANEL_TEXT_VARIABLES_BASE : public wxPanel
 
 		// Virtual event handlers, override them in your derived class
 		virtual void OnUpdateUI( wxUpdateUIEvent& event ) { event.Skip(); }
-		virtual void OnGridCellChange( wxGridEvent& event ) { event.Skip(); }
-		virtual void OnGridSize( wxSizeEvent& event ) { event.Skip(); }
 		virtual void OnAddTextVar( wxCommandEvent& event ) { event.Skip(); }
 		virtual void OnRemoveTextVar( wxCommandEvent& event ) { event.Skip(); }
 
diff --git a/common/widgets/wx_grid_autosizer.cpp b/common/widgets/wx_grid_autosizer.cpp
new file mode 100644
index 0000000000..438ef357b0
--- /dev/null
+++ b/common/widgets/wx_grid_autosizer.cpp
@@ -0,0 +1,113 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "widgets/wx_grid_autosizer.h"
+
+#include <optional>
+
+#include <wx/settings.h>
+
+
+WX_GRID_AUTOSIZER::WX_GRID_AUTOSIZER( wxGrid& aGrid, COL_MIN_WIDTHS aAutosizedCols,
+                                      unsigned aFlexibleCol ) :
+        m_grid( aGrid ), m_autosizedCols( std::move( aAutosizedCols ) ),
+        m_flexibleCol( aFlexibleCol )
+{
+    const int colCount = m_grid.GetNumberCols();
+    for( const auto& [colIndex, width] : m_autosizedCols )
+    {
+        wxASSERT_MSG( colIndex < colCount, "Autosized column does not exist in grid" );
+    }
+    wxASSERT_MSG( m_flexibleCol < colCount, "Flexible column index does not exist in grid" );
+
+    m_grid.Bind( wxEVT_UPDATE_UI,
+                 [this]( wxUpdateUIEvent& aEvent )
+                 {
+                     recomputeGridWidths();
+                 } );
+
+    m_grid.Bind( wxEVT_SIZE,
+                 [this]( wxSizeEvent& aEvent )
+                 {
+                     onSizeEvent( aEvent );
+                 } );
+
+    // Handles the case when the user changes the cell content to be longer than the
+    // current column size
+    m_grid.Bind( wxEVT_GRID_CELL_CHANGED,
+                 [this]( wxGridEvent& aEvent )
+                 {
+                     m_gridWidthsDirty = true;
+                     aEvent.Skip();
+                 } );
+}
+
+void WX_GRID_AUTOSIZER::recomputeGridWidths()
+{
+    if( m_gridWidthsDirty )
+    {
+        const int width =
+                m_grid.GetClientRect().GetWidth() - wxSystemSettings::GetMetric( wxSYS_VSCROLL_X );
+
+        std::optional<int> flexibleMinWidth;
+        for( const auto& [colIndex, minWidth] : m_autosizedCols )
+        {
+            m_grid.AutoSizeColumn( colIndex );
+            const int colSize = m_grid.GetColSize( colIndex );
+            m_grid.SetColSize( colIndex, std::max( minWidth, colSize ) );
+
+            if( colIndex == m_flexibleCol )
+            {
+                flexibleMinWidth = minWidth;
+            }
+        }
+
+        // Gather all the widths except the flexi one
+        int nonFlexibleWidth = 0;
+
+        for( int i = 0; i < m_grid.GetNumberCols(); ++i )
+        {
+            if( i != m_flexibleCol )
+            {
+                nonFlexibleWidth += m_grid.GetColSize( i );
+            }
+        }
+
+        m_grid.SetColSize( m_flexibleCol,
+                           std::max( flexibleMinWidth.value_or( 0 ), width - nonFlexibleWidth ) );
+
+        // Store the state for next time
+        m_gridWidth = m_grid.GetSize().GetX();
+        m_gridWidthsDirty = false;
+    }
+}
+
+void WX_GRID_AUTOSIZER::onSizeEvent( wxSizeEvent& aEvent )
+{
+    const int width = aEvent.GetSize().GetX();
+    if( width != m_gridWidth )
+    {
+        m_gridWidthsDirty = true;
+    }
+    aEvent.Skip();
+}
\ No newline at end of file
diff --git a/include/dialogs/dialog_configure_paths.h b/include/dialogs/dialog_configure_paths.h
index 89f52e3592..2f0994f457 100644
--- a/include/dialogs/dialog_configure_paths.h
+++ b/include/dialogs/dialog_configure_paths.h
@@ -25,12 +25,16 @@
 #ifndef _DIALOG_CONFIGURE_PATHS_H_
 #define _DIALOG_CONFIGURE_PATHS_H_
 
-#include <../common/dialogs/dialog_configure_paths_base.h>
+#include <memory>
 
 #include <wx/string.h>
 #include <wx/valtext.h>
 
+#include <../common/dialogs/dialog_configure_paths_base.h>
+
+
 class HTML_WINDOW;
+class WX_GRID_AUTOSIZER;
 
 
 class DIALOG_CONFIGURE_PATHS: public DIALOG_CONFIGURE_PATHS_BASE
@@ -44,7 +48,6 @@ public:
 
 protected:
     // Various button callbacks
-    void OnGridSize( wxSizeEvent& event ) override;
     void OnUpdateUI( wxUpdateUIEvent& event ) override;
     void OnGridCellChanging( wxGridEvent& event );
     void OnAddEnvVar( wxCommandEvent& event ) override;
@@ -63,8 +66,7 @@ private:
     wxString            m_curdir;
     wxTextValidator     m_aliasValidator;
 
-    int                 m_gridWidth;
-    bool                m_gridWidthsDirty;
+    std::unique_ptr<WX_GRID_AUTOSIZER> m_gridAutosizer;
 
     HTML_WINDOW*        m_helpBox;
     int                 m_heightBeforeHelp;
diff --git a/include/panel_text_variables.h b/include/panel_text_variables.h
index 5247aaae7a..27834ec453 100644
--- a/include/panel_text_variables.h
+++ b/include/panel_text_variables.h
@@ -26,9 +26,12 @@
 
 #include <../common/dialogs/panel_text_variables_base.h>
 #include <wx/valtext.h>
+
 #include <map>
+#include <memory>
 
 class PROJECT;
+class WX_GRID_AUTOSIZER;
 
 
 class PANEL_TEXT_VARIABLES: public PANEL_TEXT_VARIABLES_BASE
@@ -42,8 +45,6 @@ public:
 
 protected:
     // Various button callbacks
-    void OnGridCellChange( wxGridEvent& event ) override;
-    void OnGridSize( wxSizeEvent& event ) override;
     void OnUpdateUI( wxUpdateUIEvent& event ) override;
     void OnGridCellChanging( wxGridEvent& event );
     void OnAddTextVar( wxCommandEvent& event ) override;
@@ -65,7 +66,7 @@ private:
 
     wxTextValidator              m_nameValidator;
 
-    bool                         m_gridWidthsDirty;
+    std::unique_ptr<WX_GRID_AUTOSIZER> m_autoSizer;
 };
 
 #endif    // _PANEL_TEXT_VARIABLES_H_
diff --git a/include/widgets/wx_grid_autosizer.h b/include/widgets/wx_grid_autosizer.h
new file mode 100644
index 0000000000..c065b42523
--- /dev/null
+++ b/include/widgets/wx_grid_autosizer.h
@@ -0,0 +1,70 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifndef WX_GRID_AUTOSIZER_H
+#define WX_GRID_AUTOSIZER_H
+
+#include <map>
+
+#include <wx/grid.h>
+
+/**
+ * Class that manages autosizing of columns in a wxGrid.
+ *
+ * The class will automatically resize the columns in the grid to fit the content,
+ * with one column being flexible and taking up the remaining space.
+ */
+class WX_GRID_AUTOSIZER
+{
+public:
+    /**
+     * Map of column indices to minimum widths.
+     *
+     * Use 0 to indicate that a column should be autosized to fit content,
+     * but without a minimum width.
+     */
+    using COL_MIN_WIDTHS = std::map<int, int>;
+
+    /**
+     * @param aGrid The grid to manage.
+     * @param aAutosizedCols A map of columns to autosize: these will sized to fit,
+     *                       but not smaller than the width specified.
+     * @param aFlexibleCol The column that will take up the remaining space,
+     *                     with a minimum width if given in the aAutosizedCols map.
+     */
+    WX_GRID_AUTOSIZER( wxGrid& aGrid, COL_MIN_WIDTHS aAutosizedCols, unsigned aFlexibleCol );
+
+private:
+    void recomputeGridWidths();
+
+    void onSizeEvent( wxSizeEvent& aEvent );
+
+    wxGrid&        m_grid;
+    COL_MIN_WIDTHS m_autosizedCols;
+    int            m_flexibleCol;
+
+    bool m_gridWidthsDirty = true;
+    int  m_gridWidth = 0;
+};
+
+#endif // WX_GRID_AUTOSIZER_H
\ No newline at end of file