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">"Name" "Path"</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">"Name" "Path"</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">"Variable Name" "Text Substitution"</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">"Variable Name" "Text Substitution"</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