From d845966cbbcadc80e4054019d0ff049b83557f49 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 22 May 2019 13:51:02 +0200 Subject: [PATCH 1/3] Implemented a possibility to set a custom toolbars icon size (related to #2247 and same others) --- src/slic3r/GUI/AppConfig.cpp | 6 +++ src/slic3r/GUI/GLCanvas3D.cpp | 27 +++++++++----- src/slic3r/GUI/GLToolbar.cpp | 2 +- src/slic3r/GUI/GUI_App.cpp | 21 +++++++++++ src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/Preferences.cpp | 68 +++++++++++++++++++++++++++++++--- src/slic3r/GUI/Preferences.hpp | 3 ++ 7 files changed, 112 insertions(+), 16 deletions(-) diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/slic3r/GUI/AppConfig.cpp index 4b7f5d863..d4970880b 100644 --- a/src/slic3r/GUI/AppConfig.cpp +++ b/src/slic3r/GUI/AppConfig.cpp @@ -67,6 +67,12 @@ void AppConfig::set_defaults() if (get("remember_output_path").empty()) set("remember_output_path", "1"); + if (get("use_custom_toolbar_size").empty()) + set("use_custom_toolbar_size", "0"); + + if (get("custom_toolbar_size").empty()) + set("custom_toolbar_size", "100"); + // Remove legacy window positions/sizes erase("", "main_frame_maximized"); erase("", "main_frame_pos"); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 26d205055..8bdf6de15 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3418,9 +3418,6 @@ bool GLCanvas3D::_init_toolbar() return true; } -#if ENABLE_SVG_ICONS - m_toolbar.set_icons_size(40); -#endif // ENABLE_SVG_ICONS // m_toolbar.set_layout_type(GLToolbar::Layout::Vertical); m_toolbar.set_layout_type(GLToolbar::Layout::Horizontal); m_toolbar.set_layout_orientation(GLToolbar::Layout::Top); @@ -4097,10 +4094,14 @@ void GLCanvas3D::_render_current_gizmo() const void GLCanvas3D::_render_gizmos_overlay() const { #if ENABLE_RETINA_GL - m_gizmos.set_overlay_scale(m_retina_helper->get_scale_factor()); +// m_gizmos.set_overlay_scale(m_retina_helper->get_scale_factor()); + const float scale = m_retina_helper->get_scale_factor()*wxGetApp().toolbar_icon_scale(); + m_gizmos.set_overlay_scale(scale); //! #ys_FIXME_experiment #else // m_gizmos.set_overlay_scale(m_canvas->GetContentScaleFactor()); - m_gizmos.set_overlay_scale(wxGetApp().em_unit()*0.1f);//! #ys_FIXME_experiment +// m_gizmos.set_overlay_scale(wxGetApp().em_unit()*0.1f); + const float size = int(GLGizmosManager::Default_Icons_Size*wxGetApp().toolbar_icon_scale()); + m_gizmos.set_overlay_icon_size(size); //! #ys_FIXME_experiment #endif /* __WXMSW__ */ m_gizmos.render_overlay(*this, m_selection); @@ -4110,10 +4111,14 @@ void GLCanvas3D::_render_toolbar() const { #if ENABLE_SVG_ICONS #if ENABLE_RETINA_GL - m_toolbar.set_scale(m_retina_helper->get_scale_factor()); +// m_toolbar.set_scale(m_retina_helper->get_scale_factor()); + const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(true); + m_toolbar.set_scale(scale); //! #ys_FIXME_experiment #else // m_toolbar.set_scale(m_canvas->GetContentScaleFactor()); - m_toolbar.set_scale(wxGetApp().em_unit()*0.1f);//! #ys_FIXME_experiment +// m_toolbar.set_scale(wxGetApp().em_unit()*0.1f); + const float size = int(GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale(true)); + m_toolbar.set_icons_size(size); //! #ys_FIXME_experiment #endif // ENABLE_RETINA_GL Size cnv_size = get_canvas_size(); @@ -4174,10 +4179,14 @@ void GLCanvas3D::_render_view_toolbar() const { #if ENABLE_SVG_ICONS #if ENABLE_RETINA_GL - m_view_toolbar.set_scale(m_retina_helper->get_scale_factor()); +// m_view_toolbar.set_scale(m_retina_helper->get_scale_factor()); + const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(); + m_view_toolbar.set_scale(scale); //! #ys_FIXME_experiment #else // m_view_toolbar.set_scale(m_canvas->GetContentScaleFactor()); - m_view_toolbar.set_scale(wxGetApp().em_unit()*0.1f); //! #ys_FIXME_experiment +// m_view_toolbar.set_scale(wxGetApp().em_unit()*0.1f); + const float size = int(GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale()); + m_view_toolbar.set_icons_size(size); //! #ys_FIXME_experiment #endif // ENABLE_RETINA_GL Size cnv_size = get_canvas_size(); diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 842700aef..00cbdfec7 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -123,7 +123,7 @@ BackgroundTexture::Metadata::Metadata() } #if ENABLE_SVG_ICONS -const float GLToolbar::Default_Icons_Size = 64.0f; +const float GLToolbar::Default_Icons_Size = 40.0f; #endif // ENABLE_SVG_ICONS GLToolbar::Layout::Layout() diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 472abd6dc..6773dbd30 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -390,6 +390,27 @@ void GUI_App::set_label_clr_sys(const wxColour& clr) { app_config->save(); } +float GUI_App::toolbar_icon_scale(const bool is_limited/* = false*/) const +{ +#ifdef __APPLE__ + const float icon_sc = 1.0f; // for Retina display will be used its own scale +#else + const float icon_sc = m_em_unit*0.1f; +#endif // __APPLE__ + + const std::string& use_val = app_config->get("use_custom_toolbar_size"); + const std::string& val = app_config->get("custom_toolbar_size"); + + if (val.empty() || use_val.empty() || use_val == "0") + return icon_sc; + + int int_val = atoi(val.c_str()); + if (is_limited && int_val < 50) + int_val = 50; + + return 0.01f * int_val * icon_sc; +} + void GUI_App::recreate_GUI() { // Weird things happen as the Paint messages are floating around the windows being destructed. diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 1c9a462c6..b70f0dc16 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -115,6 +115,7 @@ public: const wxFont& normal_font() { return m_normal_font; } size_t em_unit() const { return m_em_unit; } void set_em_unit(const size_t em_unit) { m_em_unit = em_unit; } + float toolbar_icon_scale(const bool is_limited = false) const; void recreate_GUI(); void system_info(); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index a29ba5c91..82c3c39e2 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -18,8 +18,13 @@ void PreferencesDialog::build() auto app_config = get_app_config(); m_optgroup = std::make_shared(this, _(L("General"))); m_optgroup->label_width = 40; - m_optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value){ + m_optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) { m_values[opt_key] = boost::any_cast(value) ? "1" : "0"; + + if (opt_key == "use_custom_toolbar_size") { + m_icon_size_sizer->ShowItems(boost::any_cast(value)); + this->layout(); + } }; // TODO @@ -109,6 +114,16 @@ void PreferencesDialog::build() m_optgroup->append_single_option_line(option); #endif + def.label = L("Use custom size for toolbar icons"); + def.type = coBool; + def.tooltip = L("If enabled, you can change size of toolbar icons manually."); + def.set_default_value(new ConfigOptionBool{ app_config->get("use_custom_toolbar_size") == "1" }); + option = Option (def,"use_custom_toolbar_size"); + m_optgroup->append_single_option_line(option); + + create_icon_size_slider(); + m_icon_size_sizer->ShowItems(app_config->get("use_custom_toolbar_size") == "1"); + auto sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(m_optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10); @@ -145,17 +160,58 @@ void PreferencesDialog::on_dpi_changed(const wxRect &suggested_rect) { m_optgroup->msw_rescale(); + msw_buttons_rescale(this, em_unit(), { wxID_OK, wxID_CANCEL }); + + layout(); +} + +void PreferencesDialog::layout() +{ const int em = em_unit(); - msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL }); - - const wxSize& size = wxSize(47 * em, 28 * em); - - SetMinSize(size); + SetMinSize(wxSize(47 * em, 28 * em)); Fit(); Refresh(); } +void PreferencesDialog::create_icon_size_slider() +{ + const auto app_config = get_app_config(); + + const int em = em_unit(); + + m_icon_size_sizer = new wxBoxSizer(wxHORIZONTAL); + + auto label = new wxStaticText(this, wxID_ANY, _(L("Icon size in a respect to the default size")) + " (%) :"); + label->SetFont(wxGetApp().normal_font()); + label->SetBackgroundStyle(wxBG_STYLE_PAINT); + + m_icon_size_sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL| wxRIGHT | wxLEFT, em); + + const int def_val = atoi(app_config->get("custom_toolbar_size").c_str()); + + auto slider = new wxSlider(this, wxID_ANY, def_val, 25, 100, wxDefaultPosition, wxDefaultSize, + wxSL_LABELS | wxSL_AUTOTICKS); + + slider->SetFont(wxGetApp().normal_font()); + slider->SetBackgroundStyle(wxBG_STYLE_PAINT); + + slider->SetTickFreq(25); + slider->SetPageSize(25); + + slider->SetToolTip(_(L("Select toolbar icon size in respect to the default one."))); + + slider->Bind(wxEVT_SLIDER, ([this, slider](wxCommandEvent e) { + auto val = slider->GetValue(); + m_values["custom_toolbar_size"] = (boost::format("%d") % val).str(); + return; + }), slider->GetId()); + + m_icon_size_sizer->Add(slider, 1, wxEXPAND); + + m_optgroup->sizer->Add(m_icon_size_sizer, 0, wxEXPAND | wxALL, em); +} + } // GUI } // Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp index 096a2c906..43a353482 100644 --- a/src/slic3r/GUI/Preferences.hpp +++ b/src/slic3r/GUI/Preferences.hpp @@ -16,6 +16,7 @@ class PreferencesDialog : public DPIDialog { std::map m_values; std::shared_ptr m_optgroup; + wxSizer* m_icon_size_sizer; public: PreferencesDialog(wxWindow* parent); ~PreferencesDialog() {} @@ -25,6 +26,8 @@ public: protected: void on_dpi_changed(const wxRect &suggested_rect) override; + void layout(); + void create_icon_size_slider(); }; } // GUI From a1e09c3db3104a9e01ebe69d11e67a6bc13beb4a Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 22 May 2019 17:08:02 +0200 Subject: [PATCH 2/3] Fix of an icon size slider under OSX and GTK --- src/slic3r/GUI/GLCanvas3D.cpp | 2 ++ src/slic3r/GUI/Preferences.cpp | 46 +++++++++++++++++++++++++--------- src/slic3r/GUI/Preferences.hpp | 1 + 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8bdf6de15..161cdea0c 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1252,6 +1252,8 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar m_timer.SetOwner(m_canvas); #if ENABLE_RETINA_GL m_retina_helper.reset(new RetinaHelper(canvas)); + // set default view_toolbar icons size equal to GLGizmosManager::Default_Icons_Size + m_view_toolbar.set_icons_size(GLGizmosManager::Default_Icons_Size); #endif } diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 82c3c39e2..bbd2585d1 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -10,6 +10,9 @@ PreferencesDialog::PreferencesDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _(L("Preferences")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) { +#ifdef __WXOSX__ + isOSX = true; +#endif build(); } @@ -183,32 +186,51 @@ void PreferencesDialog::create_icon_size_slider() m_icon_size_sizer = new wxBoxSizer(wxHORIZONTAL); - auto label = new wxStaticText(this, wxID_ANY, _(L("Icon size in a respect to the default size")) + " (%) :"); - label->SetFont(wxGetApp().normal_font()); - label->SetBackgroundStyle(wxBG_STYLE_PAINT); + wxWindow* parent = m_optgroup->ctrl_parent(); - m_icon_size_sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL| wxRIGHT | wxLEFT, em); + if (isOSX) + parent->SetBackgroundStyle(wxBG_STYLE_ERASE); + + auto label = new wxStaticText(parent, wxID_ANY, _(L("Icon size in a respect to the default size")) + " (%) :"); + + m_icon_size_sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL| wxRIGHT | (isOSX ? 0 : wxLEFT), em); const int def_val = atoi(app_config->get("custom_toolbar_size").c_str()); - auto slider = new wxSlider(this, wxID_ANY, def_val, 25, 100, wxDefaultPosition, wxDefaultSize, - wxSL_LABELS | wxSL_AUTOTICKS); + long style = wxSL_HORIZONTAL; + if (!isOSX) + style |= wxSL_LABELS | wxSL_AUTOTICKS; - slider->SetFont(wxGetApp().normal_font()); - slider->SetBackgroundStyle(wxBG_STYLE_PAINT); + auto slider = new wxSlider(parent, wxID_ANY, def_val, 25, 100, + wxDefaultPosition, wxDefaultSize, style); slider->SetTickFreq(25); slider->SetPageSize(25); - slider->SetToolTip(_(L("Select toolbar icon size in respect to the default one."))); - slider->Bind(wxEVT_SLIDER, ([this, slider](wxCommandEvent e) { + m_icon_size_sizer->Add(slider, 1, wxEXPAND); + + wxStaticText* val_label{ nullptr }; + if (isOSX) { + val_label = new wxStaticText(parent, wxID_ANY, wxString::Format("%d", def_val)); + m_icon_size_sizer->Add(val_label, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, em); + } + + slider->Bind(wxEVT_SLIDER, ([this, slider, val_label](wxCommandEvent e) { auto val = slider->GetValue(); m_values["custom_toolbar_size"] = (boost::format("%d") % val).str(); - return; + + if (val_label) + val_label->SetLabelText(wxString::Format("%d", val)); }), slider->GetId()); - m_icon_size_sizer->Add(slider, 1, wxEXPAND); + for (wxWindow* win : std::vector{ slider, label, val_label }) { + if (!win) continue; + win->SetFont(wxGetApp().normal_font()); + + if (isOSX) continue; + win->SetBackgroundStyle(wxBG_STYLE_PAINT); + } m_optgroup->sizer->Add(m_icon_size_sizer, 0, wxEXPAND | wxALL, em); } diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp index 43a353482..9fffe6a7f 100644 --- a/src/slic3r/GUI/Preferences.hpp +++ b/src/slic3r/GUI/Preferences.hpp @@ -17,6 +17,7 @@ class PreferencesDialog : public DPIDialog std::map m_values; std::shared_ptr m_optgroup; wxSizer* m_icon_size_sizer; + bool isOSX {false}; public: PreferencesDialog(wxWindow* parent); ~PreferencesDialog() {} From 1721a7db5bc7c3f9dae9eb38ca27f76b71d9bab8 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 23 May 2019 08:58:42 +0200 Subject: [PATCH 3/3] Added comments and some changes of input parameters for slider --- src/slic3r/GUI/Preferences.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index bbd2585d1..52cbdbb1d 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -189,6 +189,8 @@ void PreferencesDialog::create_icon_size_slider() wxWindow* parent = m_optgroup->ctrl_parent(); if (isOSX) + // For correct rendering of the slider and value label under OSX + // we should use system default background parent->SetBackgroundStyle(wxBG_STYLE_ERASE); auto label = new wxStaticText(parent, wxID_ANY, _(L("Icon size in a respect to the default size")) + " (%) :"); @@ -201,11 +203,11 @@ void PreferencesDialog::create_icon_size_slider() if (!isOSX) style |= wxSL_LABELS | wxSL_AUTOTICKS; - auto slider = new wxSlider(parent, wxID_ANY, def_val, 25, 100, + auto slider = new wxSlider(parent, wxID_ANY, def_val, 30, 100, wxDefaultPosition, wxDefaultSize, style); - slider->SetTickFreq(25); - slider->SetPageSize(25); + slider->SetTickFreq(10); + slider->SetPageSize(10); slider->SetToolTip(_(L("Select toolbar icon size in respect to the default one."))); m_icon_size_sizer->Add(slider, 1, wxEXPAND); @@ -228,7 +230,7 @@ void PreferencesDialog::create_icon_size_slider() if (!win) continue; win->SetFont(wxGetApp().normal_font()); - if (isOSX) continue; + if (isOSX) continue; // under OSX we use wxBG_STYLE_ERASE win->SetBackgroundStyle(wxBG_STYLE_PAINT); }