Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEnrico Turri <enricoturri@seznam.cz>2019-05-24 09:22:53 +0300
committerEnrico Turri <enricoturri@seznam.cz>2019-05-24 09:22:53 +0300
commit302ac3a849e441191a98ffc91d08c7a3b3e96035 (patch)
treea3541635cd19f39c54f6c44a8e28c5ec81498cd5 /src
parent3aa14bddf519bc86d907421c56012d27c9bc3bb9 (diff)
parent33f25ae98554a69866f18f828a1e24e1881ac2d8 (diff)
Merge branch 'master' of https://github.com/prusa3d/PrusaSlicer into et_experiments
Diffstat (limited to 'src')
-rw-r--r--src/libslic3r/SLAPrint.cpp5
-rw-r--r--src/platform/msw/PrusaSlicer.rc.in4
-rw-r--r--src/slic3r/GUI/AppConfig.cpp6
-rw-r--r--src/slic3r/GUI/GLCanvas3D.cpp29
-rw-r--r--src/slic3r/GUI/GLToolbar.cpp2
-rw-r--r--src/slic3r/GUI/GUI_App.cpp21
-rw-r--r--src/slic3r/GUI/GUI_App.hpp1
-rw-r--r--src/slic3r/GUI/GUI_ObjectList.cpp4
-rw-r--r--src/slic3r/GUI/ImGuiWrapper.cpp49
-rw-r--r--src/slic3r/GUI/ImGuiWrapper.hpp2
-rw-r--r--src/slic3r/GUI/Plater.cpp36
-rw-r--r--src/slic3r/GUI/Preferences.cpp90
-rw-r--r--src/slic3r/GUI/Preferences.hpp4
13 files changed, 218 insertions, 35 deletions
diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp
index f0dfddda0..f6a1c429e 100644
--- a/src/libslic3r/SLAPrint.cpp
+++ b/src/libslic3r/SLAPrint.cpp
@@ -425,7 +425,10 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf
print_object->set_trafo(sla_trafo(*this, model_object), model_object.instances.front()->is_left_handed());
print_object->set_instances(std::move(new_instances));
- print_object->config_apply(config, true);
+
+ SLAPrintObjectConfig new_config = m_default_object_config;
+ normalize_and_apply_config(new_config, model_object.config);
+ print_object->config_apply(new_config, true);
print_objects_new.emplace_back(print_object);
new_objects = true;
}
diff --git a/src/platform/msw/PrusaSlicer.rc.in b/src/platform/msw/PrusaSlicer.rc.in
index a112f3211..2d4186a5d 100644
--- a/src/platform/msw/PrusaSlicer.rc.in
+++ b/src/platform/msw/PrusaSlicer.rc.in
@@ -12,8 +12,8 @@ PRODUCTVERSION @SLIC3R_RC_VERSION@
VALUE "ProductName", "@SLIC3R_APP_NAME@"
VALUE "ProductVersion", "@SLIC3R_BUILD_ID@"
VALUE "InternalName", "@SLIC3R_APP_NAME@"
- VALUE "LegalCopyright", "Copyright \251 2011-2019 Alessandro Ranelucci, \251 2016-2019 Prusa Research"
- VALUE "OriginalFilename", "slic3r.exe"
+ VALUE "LegalCopyright", "Copyright \251 2016-2019 Prusa Research, \251 2011-2018 Alessandro Ranelucci"
+ VALUE "OriginalFilename", "prusa-slicer.exe"
}
}
BLOCK "VarFileInfo"
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 0630e4265..14a89269a 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -1266,6 +1266,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
}
@@ -3443,9 +3445,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);
@@ -4122,10 +4121,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);
@@ -4135,10 +4138,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();
@@ -4199,10 +4206,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 74a574fe3..b75b946e6 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/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index c2160c484..d57842b37 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -355,8 +355,8 @@ DynamicPrintConfig& ObjectList::get_item_config(const wxDataViewItem& item) cons
const int vol_idx = type & itVolume ? m_objects_model->GetVolumeIdByItem(item) : -1;
assert(obj_idx >= 0 || ((type & itVolume) && vol_idx >=0));
- return type & itObject|itInstance ? (*m_objects)[obj_idx]->config :
- (*m_objects)[obj_idx]->volumes[vol_idx]->config;
+ return type & itVolume ?(*m_objects)[obj_idx]->volumes[vol_idx]->config :
+ (*m_objects)[obj_idx]->config;
}
wxDataViewColumn* ObjectList::create_objects_list_extruder_column(int extruders_count)
diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp
index e728cdb04..4010fc8ff 100644
--- a/src/slic3r/GUI/ImGuiWrapper.cpp
+++ b/src/slic3r/GUI/ImGuiWrapper.cpp
@@ -28,6 +28,7 @@ namespace GUI {
ImGuiWrapper::ImGuiWrapper()
: m_glyph_ranges(nullptr)
+ , m_font_cjk(false)
, m_font_size(18.0)
, m_font_texture(0)
, m_style_scaling(1.0)
@@ -68,16 +69,52 @@ void ImGuiWrapper::set_language(const std::string &language)
0x0100, 0x017F, // Latin Extended-A
0,
};
+ static const ImWchar ranges_turkish[] = {
+ 0x0020, 0x01FF, // Basic Latin + Latin Supplement
+ 0x0100, 0x017F, // Latin Extended-A
+ 0x0180, 0x01FF, // Turkish
+ 0,
+ };
+ static const ImWchar ranges_vietnamese[] =
+ {
+ 0x0020, 0x00FF, // Basic Latin
+ 0x0102, 0x0103,
+ 0x0110, 0x0111,
+ 0x0128, 0x0129,
+ 0x0168, 0x0169,
+ 0x01A0, 0x01A1,
+ 0x01AF, 0x01B0,
+ 0x1EA0, 0x1EF9,
+ 0,
+ };
+ m_font_cjk = false;
if (lang == "cs" || lang == "pl") {
ranges = ranges_latin2;
} else if (lang == "ru" || lang == "uk") {
- ranges = ImGui::GetIO().Fonts->GetGlyphRangesCyrillic();
+ ranges = ImGui::GetIO().Fonts->GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters
+ } else if (lang == "tr") {
+ ranges = ranges_turkish;
+ } else if (lang == "vi") {
+ ranges = ranges_vietnamese;
} else if (lang == "jp") {
- ranges = ImGui::GetIO().Fonts->GetGlyphRangesJapanese();
+ ranges = ImGui::GetIO().Fonts->GetGlyphRangesJapanese(); // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
+ m_font_cjk = true;
} else if (lang == "ko") {
- ranges = ImGui::GetIO().Fonts->GetGlyphRangesKorean();
+ ranges = ImGui::GetIO().Fonts->GetGlyphRangesKorean(); // Default + Korean characters
+ m_font_cjk = true;
} else if (lang == "zh") {
- ranges = ImGui::GetIO().Fonts->GetGlyphRangesChineseSimplifiedCommon();
+ ranges = (language == "zh_TW") ?
+ // Traditional Chinese
+ // Default + Half-Width + Japanese Hiragana/Katakana + full set of about 21000 CJK Unified Ideographs
+ ImGui::GetIO().Fonts->GetGlyphRangesChineseFull() :
+ // Simplified Chinese
+ // Default + Half-Width + Japanese Hiragana/Katakana + set of 2500 CJK Unified Ideographs for common simplified Chinese
+ ImGui::GetIO().Fonts->GetGlyphRangesChineseSimplifiedCommon();
+ m_font_cjk = true;
+ } else if (lang == "th") {
+ ranges = ImGui::GetIO().Fonts->GetGlyphRangesThai(); // Default + Thai characters
+ } else {
+ ranges = ImGui::GetIO().Fonts->GetGlyphRangesDefault(); // Basic Latin, Extended Latin
}
if (ranges != m_glyph_ranges) {
@@ -352,7 +389,9 @@ void ImGuiWrapper::init_font()
ImGuiIO& io = ImGui::GetIO();
io.Fonts->Clear();
- ImFont* font = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/NotoSans-Regular.ttf").c_str(), m_font_size, nullptr, m_glyph_ranges);
+ //FIXME replace with io.Fonts->AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, m_font_size, nullptr, m_glyph_ranges);
+ //https://github.com/ocornut/imgui/issues/220
+ ImFont* font = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/" + (m_font_cjk ? "NotoSansCJK-Regular.ttc" : "NotoSans-Regular.ttf")).c_str(), m_font_size, nullptr, m_glyph_ranges);
if (font == nullptr) {
font = io.Fonts->AddFontDefault();
if (font == nullptr) {
diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp
index b593054c4..37ef90ff3 100644
--- a/src/slic3r/GUI/ImGuiWrapper.hpp
+++ b/src/slic3r/GUI/ImGuiWrapper.hpp
@@ -19,6 +19,8 @@ namespace GUI {
class ImGuiWrapper
{
const ImWchar *m_glyph_ranges;
+ // Chinese, Japanese, Korean
+ bool m_font_cjk;
float m_font_size;
unsigned m_font_texture;
float m_style_scaling;
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index c82955b09..a6b1a4ec4 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -259,29 +259,45 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 *
if (preset_type == Slic3r::Preset::TYPE_FILAMENT)
{
Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &event) {
- if (extruder_idx < 0 || event.GetLogicalPosition(wxClientDC(this)).x > 24) {
+ int shifl_Left = 0;
+ float scale = m_em_unit*0.1f;
+#if defined(wxBITMAPCOMBOBOX_OWNERDRAWN_BASED)
+ shifl_Left = int(scale * 4 + 0.5f); // IMAGE_SPACING_RIGHT = 4 for wxBitmapComboBox -> Space left of image
+#endif
+ int icon_right_pos = int(scale * (24+4) + 0.5);
+ int mouse_pos = event.GetLogicalPosition(wxClientDC(this)).x;
+// if (extruder_idx < 0 || event.GetLogicalPosition(wxClientDC(this)).x > 24) {
+ if ( extruder_idx < 0 || mouse_pos < shifl_Left || mouse_pos > icon_right_pos ) {
// Let the combo box process the mouse click.
event.Skip();
return;
}
// Swallow the mouse click and open the color picker.
+
+ // get current color
+ DynamicPrintConfig* cfg = wxGetApp().get_tab(Preset::TYPE_PRINTER)->get_config();
+ auto colors = static_cast<ConfigOptionStrings*>(cfg->option("extruder_colour")->clone());
+ wxColour clr(colors->values[extruder_idx]);
+ if (!clr.IsOk())
+ clr = wxTransparentColour;
+
auto data = new wxColourData();
data->SetChooseFull(1);
- auto dialog = new wxColourDialog(/* wxGetApp().mainframe */this, data);
- dialog->CenterOnParent();
- if (dialog->ShowModal() == wxID_OK) {
- DynamicPrintConfig cfg = *wxGetApp().get_tab(Preset::TYPE_PRINTER)->get_config();
+ data->SetColour(clr);
- //FIXME this is too expensive to call full_config to get just the extruder color!
- auto colors = static_cast<ConfigOptionStrings*>(wxGetApp().preset_bundle->full_config().option("extruder_colour")->clone());
+ auto dialog = new wxColourDialog(this, data);
+ dialog->CenterOnParent();
+ if (dialog->ShowModal() == wxID_OK)
+ {
colors->values[extruder_idx] = dialog->GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX);
- cfg.set_key_value("extruder_colour", colors);
+ DynamicPrintConfig cfg_new = *cfg;
+ cfg_new.set_key_value("extruder_colour", colors);
- wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg);
+ wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg_new);
wxGetApp().preset_bundle->update_platter_filament_ui(extruder_idx, this);
- wxGetApp().plater()->on_config_change(cfg);
+ wxGetApp().plater()->on_config_change(cfg_new);
}
dialog->Destroy();
});
diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp
index a29ba5c91..52cbdbb1d 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();
}
@@ -18,8 +21,13 @@ void PreferencesDialog::build()
auto app_config = get_app_config();
m_optgroup = std::make_shared<ConfigOptionsGroup>(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<bool>(value) ? "1" : "0";
+
+ if (opt_key == "use_custom_toolbar_size") {
+ m_icon_size_sizer->ShowItems(boost::any_cast<bool>(value));
+ this->layout();
+ }
};
// TODO
@@ -109,6 +117,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 +163,79 @@ void PreferencesDialog::on_dpi_changed(const wxRect &suggested_rect)
{
m_optgroup->msw_rescale();
- const int em = em_unit();
+ msw_buttons_rescale(this, em_unit(), { wxID_OK, wxID_CANCEL });
- msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL });
+ layout();
+}
- const wxSize& size = wxSize(47 * em, 28 * em);
+void PreferencesDialog::layout()
+{
+ const int em = em_unit();
- 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);
+
+ 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")) + " (%) :");
+
+ 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());
+
+ long style = wxSL_HORIZONTAL;
+ if (!isOSX)
+ style |= wxSL_LABELS | wxSL_AUTOTICKS;
+
+ auto slider = new wxSlider(parent, wxID_ANY, def_val, 30, 100,
+ wxDefaultPosition, wxDefaultSize, style);
+
+ 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);
+
+ 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();
+
+ if (val_label)
+ val_label->SetLabelText(wxString::Format("%d", val));
+ }), slider->GetId());
+
+ for (wxWindow* win : std::vector<wxWindow*>{ slider, label, val_label }) {
+ if (!win) continue;
+ win->SetFont(wxGetApp().normal_font());
+
+ if (isOSX) continue; // under OSX we use wxBG_STYLE_ERASE
+ win->SetBackgroundStyle(wxBG_STYLE_PAINT);
+ }
+
+ 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..9fffe6a7f 100644
--- a/src/slic3r/GUI/Preferences.hpp
+++ b/src/slic3r/GUI/Preferences.hpp
@@ -16,6 +16,8 @@ class PreferencesDialog : public DPIDialog
{
std::map<std::string, std::string> m_values;
std::shared_ptr<ConfigOptionsGroup> m_optgroup;
+ wxSizer* m_icon_size_sizer;
+ bool isOSX {false};
public:
PreferencesDialog(wxWindow* parent);
~PreferencesDialog() {}
@@ -25,6 +27,8 @@ public:
protected:
void on_dpi_changed(const wxRect &suggested_rect) override;
+ void layout();
+ void create_icon_size_slider();
};
} // GUI