diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 302ab5a025..74cefcb463 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -258,12 +258,6 @@ bool MainFrame::can_delete_all() const void MainFrame::on_dpi_changed(const wxRect &suggested_rect) { -// const float old_sc_factor = prev_scale_factor(); -// const float new_sc_factor = scale_factor(); -// -// printf("old_sc_factor: %.2f \n", old_sc_factor); -// printf("new_sc_factor: %.2f\n\n", new_sc_factor); - wxGetApp().update_fonts(); // _strange_ workaround for correct em_unit calculation @@ -281,6 +275,13 @@ void MainFrame::on_dpi_changed(const wxRect &suggested_rect) // update Tabs for (auto tab : wxGetApp().tabs_list) tab->rescale(); + + /* To correct window rendering (especially redraw of a status bar) + * we should imitate window resizing. + */ + const wxSize& sz = this->GetSize(); + this->SetSize(sz.x + 1, sz.y + 1); + this->SetSize(sz); } void MainFrame::init_menubar() diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 771599b8e8..1de0baff7a 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -25,12 +25,14 @@ namespace GUI { MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &headline, wxWindowID button_id, wxBitmap bitmap) : wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) - , boldfont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)) + , boldfont(wxGetApp().normal_font()/*wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)*/) , content_sizer(new wxBoxSizer(wxVERTICAL)) , btn_sizer(new wxBoxSizer(wxHORIZONTAL)) { boldfont.SetWeight(wxFONTWEIGHT_BOLD); + this->SetFont(wxGetApp().normal_font()); + auto *topsizer = new wxBoxSizer(wxHORIZONTAL); auto *rightsizer = new wxBoxSizer(wxVERTICAL); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 377c547e2a..1bf8b07ce6 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -235,7 +235,8 @@ void SlicedInfo::SetTextAndShow(SlisedInfoIdx idx, const wxString& text, const w PresetComboBox::PresetComboBox(wxWindow *parent, Preset::Type preset_type) : wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * wxGetApp().em_unit(), -1), 0, nullptr, wxCB_READONLY), preset_type(preset_type), - last_selected(wxNOT_FOUND) + last_selected(wxNOT_FOUND), + m_em_unit(wxGetApp().em_unit()) { Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) { auto selected_item = this->GetSelection(); @@ -280,7 +281,7 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * cfg.set_key_value("extruder_colour", colors); wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg); - wxGetApp().preset_bundle->update_platter_filament_ui(extruder_idx, this, wxGetApp().em_unit()); + wxGetApp().preset_bundle->update_platter_filament_ui(extruder_idx, this); wxGetApp().plater()->on_config_change(cfg); } dialog->Destroy(); @@ -340,8 +341,7 @@ void PresetComboBox::check_selection() void PresetComboBox::rescale() { - // update min control's height from new scaled size - this->SetMinSize(wxSize(20*wxGetApp().em_unit(), this->GetSize().GetHeight())); + m_em_unit = wxGetApp().em_unit(); edit_btn->rescale(); } @@ -798,8 +798,6 @@ void Sidebar::update_all_preset_comboboxes() PresetBundle &preset_bundle = *wxGetApp().preset_bundle; const auto print_tech = preset_bundle.printers.get_edited_preset().printer_technology(); -// wxWindowUpdateLocker noUpdates_scrolled(p->scrolled); - // Update the print choosers to only contain the compatible presets, update the dirty flags. if (print_tech == ptFFF) preset_bundle.prints.update_platter_ui(p->combo_print); @@ -813,9 +811,8 @@ void Sidebar::update_all_preset_comboboxes() // update the dirty flags. if (print_tech == ptFFF) { for (size_t i = 0; i < p->combos_filament.size(); ++i) - preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit()); + preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]); } - p->show_preset_comboboxes(); } void Sidebar::update_presets(Preset::Type preset_type) @@ -837,7 +834,7 @@ void Sidebar::update_presets(Preset::Type preset_type) } for (size_t i = 0; i < filament_cnt; i++) { - preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit()); + preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]); } break; @@ -874,8 +871,8 @@ void Sidebar::update_presets(Preset::Type preset_type) // for (size_t i = 0; i < p->combos_filament.size(); ++ i) // preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit()); // } -// p->show_preset_comboboxes(); update_all_preset_comboboxes(); + p->show_preset_comboboxes(); break; } @@ -905,19 +902,18 @@ void Sidebar::rescale() p->mode_sizer->rescale(); - // first of all : recreate preset comboboxes, because of - // in AddBitmap() function autonaticaly set the size of controll - update_all_preset_comboboxes(); - // then rescale them to current min size to correct layout of the sidebar + // Rescale preset comboboxes in respect to the current em_unit ... for (PresetComboBox* combo : std::vector { p->combo_print, p->combo_sla_print, p->combo_sla_material, p->combo_printer } ) combo->rescale(); - for (PresetComboBox* combo : p->combos_filament) combo->rescale(); + // ... then refill them and set min size to correct layout of the sidebar + update_all_preset_comboboxes(); + p->frequently_changed_parameters->get_og(true)->rescale(); p->frequently_changed_parameters->get_og(false)->rescale(); @@ -2669,7 +2665,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) // TODO: ? if (preset_type == Preset::TYPE_FILAMENT && sidebar->is_multifilament()) { // Only update the platter UI for the 2nd and other filaments. - wxGetApp().preset_bundle->update_platter_filament_ui(idx, combo, wxGetApp().em_unit()); + wxGetApp().preset_bundle->update_platter_filament_ui(idx, combo); } else { wxWindowUpdateLocker noUpdates(sidebar->presets_panel()); @@ -3650,7 +3646,7 @@ void Plater::on_extruders_change(int num_extruders) choices.push_back(choice); // initialize selection - wxGetApp().preset_bundle->update_platter_filament_ui(i, choice, wxGetApp().em_unit()); + wxGetApp().preset_bundle->update_platter_filament_ui(i, choice); ++i; } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index d2ae72f629..c39256f50c 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -57,6 +57,7 @@ public: void set_label_marker(int item, LabelItemType label_item_type = LABEL_ITEM_MARKER); void set_extruder_idx(const int extr_idx) { extruder_idx = extr_idx; } int get_extruder_idx() const { return extruder_idx; } + int em_unit() const { return m_em_unit; } void check_selection(); void rescale(); @@ -67,6 +68,7 @@ private: Preset::Type preset_type; int last_selected; int extruder_idx = -1; + int m_em_unit; }; class Sidebar : public wxPanel diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 01a74e15b1..9875586ed4 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -914,6 +914,16 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) // and draw a red flag in front of the selected preset. bool wide_icons = ! selected_preset.is_compatible && m_bitmap_incompatible != nullptr; + /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display. + * So set sizes for solid_colored icons used for filament preset + * and scale them in respect to em_unit value + */ + const float scale_f = ui->em_unit() * 0.1f; + const int icon_height = 16 * scale_f + 0.5f; + const int icon_width = 16 * scale_f + 0.5f; + const int thin_space_icon_width = 4 * scale_f + 0.5f; + const int wide_space_icon_width = 6 * scale_f + 0.5f; + std::map nonsys_presets; wxString selected = ""; if (!this->m_presets.front().is_visible) @@ -934,13 +944,13 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) std::vector bmps; if (wide_icons) // Paint a red flag for incompatible presets. - bmps.emplace_back(preset.is_compatible ? m_bitmap_cache->mkclear(16, 16) : *m_bitmap_incompatible); + bmps.emplace_back(preset.is_compatible ? m_bitmap_cache->mkclear(icon_width, icon_height) : *m_bitmap_incompatible); // Paint the color bars. - bmps.emplace_back(m_bitmap_cache->mkclear(4, 16)); + bmps.emplace_back(m_bitmap_cache->mkclear(thin_space_icon_width, icon_height)); bmps.emplace_back(*m_bitmap_main_frame); // Paint a lock at the system presets. - bmps.emplace_back(m_bitmap_cache->mkclear(6, 16)); - bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(16, 16)); + bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height)); + bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height)); bmp = m_bitmap_cache->insert(bitmap_key, bmps); } @@ -981,12 +991,12 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) std::vector bmps; if (wide_icons) // Paint a red flag for incompatible presets. - bmps.emplace_back(m_bitmap_cache->mkclear(16, 16)); + bmps.emplace_back(m_bitmap_cache->mkclear(icon_width, icon_height)); // Paint the color bars. - bmps.emplace_back(m_bitmap_cache->mkclear(4, 16)); + bmps.emplace_back(m_bitmap_cache->mkclear(thin_space_icon_width, icon_height)); bmps.emplace_back(*m_bitmap_main_frame); // Paint a lock at the system presets. - bmps.emplace_back(m_bitmap_cache->mkclear(6, 16)); + bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height)); bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); bmp = m_bitmap_cache->insert(bitmap_key, bmps); } @@ -996,10 +1006,14 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); ui->check_selection(); - ui->Thaw(); + ui->Thaw(); + + // Update control min size after rescale (changed Display DPI under MSW) + if (ui->GetMinWidth() != 20 * ui->em_unit()) + ui->SetMinSize(wxSize(20 * ui->em_unit(), ui->GetSize().GetHeight())); } -size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible) +size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible, const int em/* = 10*/) { if (ui == nullptr) return 0; @@ -1007,6 +1021,14 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati ui->Clear(); size_t selected_preset_item = 0; + /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display. + * So set sizes for solid_colored(empty) icons used for preset + * and scale them in respect to em_unit value + */ + const float scale_f = em * 0.1f; + const int icon_height = 16 * scale_f + 0.5f; + const int icon_width = 16 * scale_f + 0.5f; + std::map nonsys_presets; wxString selected = ""; if (!this->m_presets.front().is_visible) @@ -1025,7 +1047,7 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati const wxBitmap* tmp_bmp = preset.is_compatible ? m_bitmap_compatible : m_bitmap_incompatible; bmps.emplace_back((tmp_bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *tmp_bmp); // Paint a lock at the system presets. - bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(16, 16)); + bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height)); bmp = m_bitmap_cache->insert(bitmap_key, bmps); } diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index 6174af623d..051a55f66b 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -394,7 +394,7 @@ public: // Update the choice UI from the list of presets. // If show_incompatible, all presets are shown, otherwise only the compatible presets are shown. // If an incompatible preset is selected, it is shown as well. - size_t update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible); + size_t update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible, const int em = 10); // Update the choice UI from the list of presets. // Only the compatible presets are shown. // If an incompatible preset is selected, it is shown as well. diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 7de8c99aa9..b2fa0a8571 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1451,7 +1451,7 @@ void PresetBundle::load_default_preset_bitmaps(wxWindow *window) this->load_compatible_bitmaps(window); } -void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui, const int em/* = 10*/) +void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui) { if (ui == nullptr || this->printers.get_edited_preset().printer_technology() == ptSLA || this->filament_presets.size() <= idx_extruder ) @@ -1479,9 +1479,9 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display. * So set sizes for solid_colored icons used for filament preset - * and scale then in respect to em_unit value + * and scale them in respect to em_unit value */ - const float scale_f = em * 0.1f; + const float scale_f = ui->em_unit() * 0.1f; const int icon_height = 16 * scale_f + 0.5f; const int normal_icon_width = 16 * scale_f + 0.5f; const int space_icon_width = 2 * scale_f + 0.5f; @@ -1556,6 +1556,10 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr ui->SetToolTip(ui->GetString(selected_preset_item)); ui->check_selection(); ui->Thaw(); + + // Update control min size after rescale (changed Display DPI under MSW) + if (ui->GetMinWidth() != 20 * ui->em_unit()) + ui->SetMinSize(wxSize(20 * ui->em_unit(), ui->GetSize().GetHeight())); } void PresetBundle::set_default_suppressed(bool default_suppressed) diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/slic3r/GUI/PresetBundle.hpp index 2309ceecda..069ebd784f 100644 --- a/src/slic3r/GUI/PresetBundle.hpp +++ b/src/slic3r/GUI/PresetBundle.hpp @@ -107,7 +107,7 @@ public: void export_configbundle(const std::string &path, bool export_system_settings = false); // Update a filament selection combo box on the platter for an idx_extruder. - void update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui, const int em = 10); + void update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui); // Enable / disable the "- default -" preset. void set_default_suppressed(bool default_suppressed); diff --git a/src/slic3r/GUI/PrintHostDialogs.cpp b/src/slic3r/GUI/PrintHostDialogs.cpp index 76185b1bae..4fb03594b2 100644 --- a/src/slic3r/GUI/PrintHostDialogs.cpp +++ b/src/slic3r/GUI/PrintHostDialogs.cpp @@ -131,7 +131,7 @@ wxEvent *PrintHostQueueDialog::Event::Clone() const } PrintHostQueueDialog::PrintHostQueueDialog(wxWindow *parent) - : wxDialog(parent, wxID_ANY, _(L("Print host upload queue")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + : DPIDialog(parent, wxID_ANY, _(L("Print host upload queue")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) , on_progress_evt(this, EVT_PRINTHOST_PROGRESS, &PrintHostQueueDialog::on_progress, this) , on_error_evt(this, EVT_PRINTHOST_ERROR, &PrintHostQueueDialog::on_error, this) , on_cancel_evt(this, EVT_PRINTHOST_CANCEL, &PrintHostQueueDialog::on_cancel, this) diff --git a/src/slic3r/GUI/PrintHostDialogs.hpp b/src/slic3r/GUI/PrintHostDialogs.hpp index 105899cf06..e6c46aae6a 100644 --- a/src/slic3r/GUI/PrintHostDialogs.hpp +++ b/src/slic3r/GUI/PrintHostDialogs.hpp @@ -41,7 +41,7 @@ private: }; -class PrintHostQueueDialog : public wxDialog +class PrintHostQueueDialog : public DPIDialog { public: class Event : public wxEvent @@ -62,6 +62,10 @@ public: PrintHostQueueDialog(wxWindow *parent); void append_job(const PrintHostJob &job); + +protected: + void on_dpi_changed(const wxRect &suggested_rect) override { Refresh(); } + private: enum Column { COL_ID, diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 4db7817063..ddff9ec49f 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -713,7 +713,7 @@ void Tab::update_dirty() void Tab::update_tab_ui() { - m_selected_preset_item = m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets); + m_selected_preset_item = m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets, m_em_unit); } // Load a provied DynamicConfig into the tab, modifying the active preset.