From 5ede9711f5972556d0195ed703cf3fdb46fab463 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Tue, 28 Jul 2026 14:32:55 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20GTK3=20dialog=20min=20size:=20SetSizer=20?= =?UTF-8?q?=E2=86=92=20SetSizerAndFit=20for=20dialogs=20without=20explicit?= =?UTF-8?q?=20SetMinSize=20(#14948)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * For dialog without explicitly `SetMinSize`, we should use `SetSizerAndFit` instead, otherwise the dialog will not show correctly on GTK3. (OrcaSlicer/OrcaSlicer#14561) - and if `SetSizer` is called before the full layout has been built, then an extra `SetSizeHints` should be called before layout/fit so the min size can be properly set automatically based on children's min sizes accordingly. * Fix GTK3 dialog min size: SetSizer → SetSizerAndFit for dialogs without explicit SetMinSize Replace SetSizer() with SetSizerAndFit() in 11 dialog constructors that neither call SetMinSize() nor SetSizeHints(), ensuring proper minimum size propagation from child widgets on GTK3. SetSizerAndFit internally calls sizer->SetSizeHints(window), which sets the window's minimum size based on children — the same fix applied to ProjectDropDialog in 8a7662083e. Also drop sizer->Fit(this) calls where present, since they only resize but don't set the min size hint needed by GTK3. Co-Authored-By: Claude * Update code style * Update TroubleshootDialog.hpp * Fix unsaved preset dialog layout * Fix MsgDialog layout * Fix other 3 instances in MsgDialog.cpp * Fix a few more instances * Fix printer option dialog too big on Windows --------- Co-authored-by: Claude Co-authored-by: yw4z --- AGENTS.md | 1 + src/slic3r/GUI/BindDialog.cpp | 6 +++--- src/slic3r/GUI/CaliHistoryDialog.cpp | 6 ++---- src/slic3r/GUI/Calibration.cpp | 2 +- src/slic3r/GUI/CloneDialog.cpp | 3 +-- src/slic3r/GUI/ConnectPrinter.cpp | 3 +-- src/slic3r/GUI/DownloadProgressDialog.cpp | 3 +-- src/slic3r/GUI/ExtrusionCalibration.cpp | 3 +-- src/slic3r/GUI/FilamentPickerDialog.cpp | 3 +-- src/slic3r/GUI/MsgDialog.cpp | 10 +++++----- src/slic3r/GUI/NetworkPluginDialog.cpp | 1 + src/slic3r/GUI/NetworkTestDialog.cpp | 2 +- src/slic3r/GUI/PartSkipDialog.cpp | 3 +-- src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/PrintOptionsDialog.cpp | 13 ++++++------- src/slic3r/GUI/PublishDialog.cpp | 2 +- src/slic3r/GUI/StepMeshDialog.cpp | 3 +-- src/slic3r/GUI/TroubleshootDialog.cpp | 2 +- src/slic3r/GUI/TroubleshootDialog.hpp | 3 +++ src/slic3r/GUI/UnsavedChangesDialog.cpp | 13 +++++++------ src/slic3r/GUI/UpdateDialogs.cpp | 3 +-- 21 files changed, 41 insertions(+), 46 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 59aeed878b..fbc624b958 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -30,6 +30,7 @@ ctest --test-dir ./tests/fff_print - C++17, selective C++20. PascalCase classes, snake_case functions/variables - `#pragma once` for headers. Smart pointers and RAII preferred - Parallelization via TBB — be mindful of shared state +- Always use `SetSizerAndFit(sizer)` instead of `SetSizer(sizer)` on top level window. Unless `SetSizer` must be called before the full layout is built, call `sizer->SetSizeHints(window)` afterwards in this case. ## Key Entry Points diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index 4d3e4fc6d5..a4b568e82d 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -192,7 +192,7 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) - SetSizer(sizer_main); + SetSizerAndFit(sizer_main); Layout(); Fit(); @@ -670,7 +670,7 @@ PingCodeBindDialog::~PingCodeBindDialog() { m_sizer_main->Add(m_sw_bind_failed_info, 0, wxALIGN_CENTER, 0); m_sizer_main->Add(m_simplebook, 0, wxALIGN_RIGHT | wxRIGHT | wxBOTTOM, ButtonProps::ChoiceButtonGap()); - SetSizer(m_sizer_main); + SetSizerAndFit(m_sizer_main); Layout(); Fit(); Centre(wxBOTH); @@ -992,7 +992,7 @@ UnBindMachineDialog::UnBindMachineDialog(Plater *plater /*= nullptr*/) m_sizer_main->Add(m_sizer_button, 0, wxALIGN_RIGHT | wxRIGHT, ButtonProps::ChoiceButtonGap()); m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(20)); - SetSizer(m_sizer_main); + SetSizerAndFit(m_sizer_main); Layout(); Fit(); Centre(wxBOTH); diff --git a/src/slic3r/GUI/CaliHistoryDialog.cpp b/src/slic3r/GUI/CaliHistoryDialog.cpp index 2e7f2caf97..4de90d8b8f 100644 --- a/src/slic3r/GUI/CaliHistoryDialog.cpp +++ b/src/slic3r/GUI/CaliHistoryDialog.cpp @@ -632,9 +632,8 @@ EditCalibrationHistoryDialog::EditCalibrationHistoryDialog(wxWindow main_sizer->Add(top_panel, 1, wxEXPAND | wxALL, FromDIP(20)); - SetSizer(main_sizer); + SetSizerAndFit(main_sizer); Layout(); - Fit(); CenterOnParent(); wxGetApp().UpdateDlgDarkUI(this); @@ -910,9 +909,8 @@ NewCalibrationHistoryDialog::NewCalibrationHistoryDialog(wxWindow *parent, const main_sizer->Add(top_panel, 1, wxEXPAND | wxALL, FromDIP(20)); - SetSizer(main_sizer); + SetSizerAndFit(main_sizer); Layout(); - Fit(); CenterOnParent(); wxGetApp().UpdateDlgDarkUI(this); diff --git a/src/slic3r/GUI/Calibration.cpp b/src/slic3r/GUI/Calibration.cpp index 4b32d10a02..0c2b4f1659 100644 --- a/src/slic3r/GUI/Calibration.cpp +++ b/src/slic3r/GUI/Calibration.cpp @@ -162,7 +162,7 @@ CalibrationDialog::CalibrationDialog(Plater *plater) body_panel->Layout(); m_sizer_main->Add(body_panel, 0, wxEXPAND | wxALL, FromDIP(25)); - SetSizer(m_sizer_main); + SetSizerAndFit(m_sizer_main); Layout(); Fit(); diff --git a/src/slic3r/GUI/CloneDialog.cpp b/src/slic3r/GUI/CloneDialog.cpp index 36243249f8..9024f0cb61 100644 --- a/src/slic3r/GUI/CloneDialog.cpp +++ b/src/slic3r/GUI/CloneDialog.cpp @@ -112,9 +112,8 @@ CloneDialog::CloneDialog(wxWindow *parent) v_sizer->Add(bottom_sizer, 0, wxEXPAND); - this->SetSizer(v_sizer); + this->SetSizerAndFit(v_sizer); this->Layout(); - v_sizer->Fit(this); wxGetApp().UpdateDlgDarkUI(this); diff --git a/src/slic3r/GUI/ConnectPrinter.cpp b/src/slic3r/GUI/ConnectPrinter.cpp index 338e8d3367..b4cd7f4f2f 100644 --- a/src/slic3r/GUI/ConnectPrinter.cpp +++ b/src/slic3r/GUI/ConnectPrinter.cpp @@ -80,9 +80,8 @@ ConnectPrinterDialog::ConnectPrinterDialog(wxWindow *parent, wxWindowID id, cons main_sizer->Add(sizer_top); - this->SetSizer(main_sizer); + this->SetSizerAndFit(main_sizer); this->Layout(); - this->Fit(); CentreOnParent(); m_textCtrl_code->Bind(wxEVT_TEXT, &ConnectPrinterDialog::on_input_enter, this); diff --git a/src/slic3r/GUI/DownloadProgressDialog.cpp b/src/slic3r/GUI/DownloadProgressDialog.cpp index 02d7a285e3..9bc0d90e5e 100644 --- a/src/slic3r/GUI/DownloadProgressDialog.cpp +++ b/src/slic3r/GUI/DownloadProgressDialog.cpp @@ -112,9 +112,8 @@ DownloadProgressDialog::DownloadProgressDialog(wxString title) m_simplebook_status->AddPage(m_panel_download_failed, wxEmptyString, false); m_simplebook_status->AddPage(m_panel_install_failed, wxEmptyString, false); - SetSizer(m_sizer_main); + SetSizerAndFit(m_sizer_main); Layout(); - Fit(); CentreOnParent(); Bind(wxEVT_CLOSE_WINDOW, &DownloadProgressDialog::on_close, this); diff --git a/src/slic3r/GUI/ExtrusionCalibration.cpp b/src/slic3r/GUI/ExtrusionCalibration.cpp index ca953fe482..cd7f5990a7 100644 --- a/src/slic3r/GUI/ExtrusionCalibration.cpp +++ b/src/slic3r/GUI/ExtrusionCalibration.cpp @@ -261,7 +261,7 @@ void ExtrusionCalibration::create() top_sizer->Add(FromDIP(24), 0); top_sizer->Add(sizer_main, 1, wxEXPAND); top_sizer->Add(FromDIP(24), 0); - SetSizer(top_sizer); + SetSizerAndFit(top_sizer); // set default nozzle m_comboBox_nozzle_dia->SetSelection(1); @@ -271,7 +271,6 @@ void ExtrusionCalibration::create() set_step(1); Layout(); - Fit(); m_k_val->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent& e) { input_value_finish(); diff --git a/src/slic3r/GUI/FilamentPickerDialog.cpp b/src/slic3r/GUI/FilamentPickerDialog.cpp index a57e93eea0..98c955fb76 100644 --- a/src/slic3r/GUI/FilamentPickerDialog.cpp +++ b/src/slic3r/GUI/FilamentPickerDialog.cpp @@ -105,9 +105,8 @@ FilamentPickerDialog::FilamentPickerDialog(wxWindow *parent, const wxString& fil container_sizer->Add(main_sizer, 1, wxEXPAND | wxALL, FromDIP(10)); container_sizer->Add(dlg_btns, 0, wxEXPAND); - SetSizer(container_sizer); + SetSizerAndFit(container_sizer); Layout(); - container_sizer->Fit(this); // Position the dialog relative to the parent window if (GetParent()) { diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index d742e5efd9..ebf4db6846 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -65,7 +65,7 @@ MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &he main_sizer->Add(btn_sizer, 0, wxBOTTOM | wxRIGHT | wxEXPAND | wxTOP, FromDIP(10)); apply_style(style); - SetSizerAndFit(main_sizer); + SetSizer(main_sizer); wxGetApp().UpdateDlgDarkUI(this); } @@ -221,6 +221,7 @@ void MsgDialog::apply_style(long style) void MsgDialog::finalize() { + GetSizer()->SetSizeHints(this); Layout(); Fit(); CenterOnParent(); @@ -547,7 +548,7 @@ DeleteConfirmDialog::DeleteConfirmDialog(wxWindow *parent, const wxString &title m_del_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { EndModal(wxID_OK); }); m_cancel_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { EndModal(wxID_CANCEL); }); - SetSizer(m_main_sizer); + SetSizerAndFit(m_main_sizer); Layout(); Fit(); wxGetApp().UpdateDlgDarkUI(this); @@ -582,7 +583,7 @@ Newer3mfVersionDialog::Newer3mfVersionDialog(wxWindow *parent, const Semver *fil main_sizer->Add(content_sizer, 0, wxEXPAND | wxALL, FromDIP(5)); main_sizer->Add(get_btn_sizer(), 0, wxEXPAND | wxALL, FromDIP(5)); - this->SetSizer(main_sizer); + this->SetSizerAndFit(main_sizer); Layout(); Fit(); wxGetApp().UpdateDlgDarkUI(this); @@ -745,9 +746,8 @@ NetworkErrorDialog::NetworkErrorDialog(wxWindow* parent) sizer_main->Add(sizer_button, 1, wxEXPAND | wxLEFT | wxRIGHT, 15); sizer_main->Add(0, 0, 0, wxTOP, 18); - SetSizer(sizer_main); + SetSizerAndFit(sizer_main); Layout(); - sizer_main->Fit(this); Centre(wxBOTH); } diff --git a/src/slic3r/GUI/NetworkPluginDialog.cpp b/src/slic3r/GUI/NetworkPluginDialog.cpp index d018af47ba..bc898d0d24 100644 --- a/src/slic3r/GUI/NetworkPluginDialog.cpp +++ b/src/slic3r/GUI/NetworkPluginDialog.cpp @@ -47,6 +47,7 @@ NetworkPluginDownloadDialog::NetworkPluginDownloadDialog(wxWindow* parent, Mode } else { create_missing_plugin_ui(); } + main_sizer->SetSizeHints(this); Layout(); Fit(); CentreOnParent(); diff --git a/src/slic3r/GUI/NetworkTestDialog.cpp b/src/slic3r/GUI/NetworkTestDialog.cpp index f4cca3ea95..78f395febc 100644 --- a/src/slic3r/GUI/NetworkTestDialog.cpp +++ b/src/slic3r/GUI/NetworkTestDialog.cpp @@ -47,7 +47,7 @@ NetworkTestDialog::NetworkTestDialog(wxWindow* parent, wxWindowID id, const wxSt init_bind(); - this->SetSizer(main_sizer); + this->SetSizerAndFit(main_sizer); this->Layout(); this->Centre(wxBOTH); diff --git a/src/slic3r/GUI/PartSkipDialog.cpp b/src/slic3r/GUI/PartSkipDialog.cpp index 5820a40c66..b9dd7d5007 100644 --- a/src/slic3r/GUI/PartSkipDialog.cpp +++ b/src/slic3r/GUI/PartSkipDialog.cpp @@ -270,7 +270,7 @@ PartSkipDialog::PartSkipDialog(wxWindow *parent) : DPIDialog(parent, wxID_ANY, _ m_simplebook->AddPage(m_book_third_panel, _("dialog page"), false); m_sizer->Add(m_simplebook, 1, wxEXPAND | wxALL, 5); - SetSizer(m_sizer); + SetSizerAndFit(m_sizer); m_zoom_in_btn->Bind(wxEVT_BUTTON, &PartSkipDialog::OnZoomIn, this); m_zoom_out_btn->Bind(wxEVT_BUTTON, &PartSkipDialog::OnZoomOut, this); m_switch_drag_btn->Bind(wxEVT_BUTTON, &PartSkipDialog::OnSwitchDrag, this); @@ -281,7 +281,6 @@ PartSkipDialog::PartSkipDialog(wxWindow *parent) : DPIDialog(parent, wxID_ANY, _ m_all_checkbox->Bind(wxEVT_TOGGLEBUTTON, &PartSkipDialog::OnAllCheckbox, this); Layout(); - Fit(); CentreOnParent(); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d0a28fdf5e..106c142fea 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -15134,7 +15134,7 @@ ProjectDropDialog::ProjectDropDialog(const std::string &filename) m_sizer_main->Add(dlg_btns, 0, wxEXPAND); - SetSizer(m_sizer_main); + SetSizerAndFit(m_sizer_main); Layout(); Fit(); Centre(wxBOTH); diff --git a/src/slic3r/GUI/PrintOptionsDialog.cpp b/src/slic3r/GUI/PrintOptionsDialog.cpp index f86c52e567..349e75fa06 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.cpp +++ b/src/slic3r/GUI/PrintOptionsDialog.cpp @@ -28,7 +28,7 @@ PrintOptionsDialog::PrintOptionsDialog(wxWindow* parent) { this->SetDoubleBuffered(true); SetBackgroundColour(*wxWHITE); - SetSize(FromDIP(480),FromDIP(520)); + // SetMinSize(FromDIP(wxSize{wxDefaultCoord,520})); m_scrollwindow = new wxScrolledWindow(this, wxID_ANY); @@ -50,7 +50,8 @@ PrintOptionsDialog::PrintOptionsDialog(wxWindow* parent) m_scrollwindow->FitInside(); this->Layout(); - // mainSizer->Fit(this); + mainSizer->SetMinSize(wxDefaultCoord, FromDIP(520)); + mainSizer->Fit(this); //this->Fit(); m_cb_ai_monitoring->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &evt) { @@ -1670,12 +1671,9 @@ PrinterPartsDialog::PrinterPartsDialog(wxWindow* parent) /*inset data*/ sizer->Add(single_panel, 0, wxEXPAND, 0); sizer->Add(multiple_panel, 0, wxEXPAND, 0); - SetSizer(sizer); - Layout(); - Fit(); - single_panel->Hide(); - + SetSizerAndFit(sizer); + Layout(); wxGetApp().UpdateDlgDarkUI(this); } @@ -1752,6 +1750,7 @@ bool PrinterPartsDialog::Show(bool show) } } + GetSizer()->SetSizeHints(this); Layout(); Fit(); } diff --git a/src/slic3r/GUI/PublishDialog.cpp b/src/slic3r/GUI/PublishDialog.cpp index 6bcab900f2..e14c4484cd 100644 --- a/src/slic3r/GUI/PublishDialog.cpp +++ b/src/slic3r/GUI/PublishDialog.cpp @@ -119,7 +119,7 @@ PublishDialog::PublishDialog(Plater *plater) top_sizer->Add(m_main_sizer, 1, wxALL | wxEXPAND, 0); top_sizer->Add(FromDIP(30), 0, 0, wxEXPAND, 0); - this->SetSizer(top_sizer); + this->SetSizerAndFit(top_sizer); this->Layout(); this->Centre(wxBOTH); diff --git a/src/slic3r/GUI/StepMeshDialog.cpp b/src/slic3r/GUI/StepMeshDialog.cpp index cd0f4bd423..b1a8e2319a 100644 --- a/src/slic3r/GUI/StepMeshDialog.cpp +++ b/src/slic3r/GUI/StepMeshDialog.cpp @@ -310,10 +310,9 @@ StepMeshDialog::StepMeshDialog(wxWindow* parent, Slic3r::Step& file, double line bSizer->Add(bSizer_button, 1, wxEXPAND); - this->SetSizer(bSizer); + this->SetSizerAndFit(bSizer); update_mesh_number_text(); this->Layout(); - bSizer->Fit(this); this->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { SetFocusIgnoringChildren(); diff --git a/src/slic3r/GUI/TroubleshootDialog.cpp b/src/slic3r/GUI/TroubleshootDialog.cpp index 2ddb136a1c..b0a8f71930 100644 --- a/src/slic3r/GUI/TroubleshootDialog.cpp +++ b/src/slic3r/GUI/TroubleshootDialog.cpp @@ -354,7 +354,7 @@ TroubleshootDialog::TroubleshootDialog() m_sizer->AddSpacer(FromDIP(20)); m_sizer->Add(right_sizer, 0, wxEXPAND | wxTOP | wxBOTTOM | wxRIGHT, FromDIP(15)); - SetSizer(m_sizer); + SetSizerAndFit(m_sizer); Layout(); Fit(); CenterOnParent(); diff --git a/src/slic3r/GUI/TroubleshootDialog.hpp b/src/slic3r/GUI/TroubleshootDialog.hpp index c9214ed06a..ab0fcfbadd 100644 --- a/src/slic3r/GUI/TroubleshootDialog.hpp +++ b/src/slic3r/GUI/TroubleshootDialog.hpp @@ -168,6 +168,9 @@ private: } wxClientDC dc(this); int cWidth = GetClientSize().GetWidth(); + // Don't compute/commit a size based on a not-yet-laid-out width + // Mirrors the guard in OnPaint() so both use the same wrap results + if (cWidth < 50) return; int y = 0; for (size_t i = 0; i < m_lines.size(); ++i) { diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index d4287b9c35..5c69466cfa 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -773,7 +773,7 @@ std::vector DiffViewCtrl::selected_options() static std::string none{"none"}; #define UNSAVE_CHANGE_DIALOG_SCROLL_WINDOW_SIZE wxSize(FromDIP(490), FromDIP(374)) -#define UNSAVE_CHANGE_DIALOG_ACTION_LINE_SIZE wxSize(FromDIP(490), FromDIP(60)) +#define UNSAVE_CHANGE_DIALOG_ACTION_LINE_SIZE wxSize(FromDIP(490), -1) #define UNSAVE_CHANGE_DIALOG_FIRST_VALUE_WIDTH FromDIP(190) #define UNSAVE_CHANGE_DIALOG_VALUE_WIDTH FromDIP(150) #define UNSAVE_CHANGE_DIALOG_ITEM_HEIGHT FromDIP(24) @@ -1075,11 +1075,6 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection *dependent_ m_sizer_main->Add(m_sizer_button, 0, wxEXPAND | wxTOP, 6); m_sizer_main->Add(0, 0, 1, wxTOP, 18); - SetSizer(m_sizer_main); - Layout(); - Fit(); - Centre(wxBOTH); - if (params) { if (params->left_to_right) update_tree(type, params->config, params->from, params->to); @@ -1095,6 +1090,11 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection *dependent_ //topSizer->SetSizeHints(this); show_info_line(Action::Undef); + + SetSizerAndFit(m_sizer_main); + Layout(); + Fit(); + // Centre(wxBOTH); } void UnsavedChangesDialog::show_info_line(Action action, std::string preset_name) @@ -1499,6 +1499,7 @@ void UnsavedChangesDialog::update(Preset::Type type, PresetCollection* dependent } m_action_line->SetLabel(action_msg); + m_action_line->Wrap(UNSAVE_CHANGE_DIALOG_SCROLL_WINDOW_SIZE.x); update_tree(type, presets); update_list(); diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index e45a83b4c3..0710e054f7 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -213,9 +213,8 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_ m_scrollwindw_release_note->Layout(); - SetSizer(m_sizer_main); + SetSizerAndFit(m_sizer_main); Layout(); - m_sizer_main->Fit(this); Centre(wxBOTH); wxGetApp().UpdateDlgDarkUI(this);