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
diff options
context:
space:
mode:
authorSlic3rPE <slic3r@Slic3rPEs-MacBook-Pro.local>2020-03-11 11:10:25 +0300
committerSlic3rPE <slic3r@Slic3rPEs-MacBook-Pro.local>2020-03-11 11:10:25 +0300
commite47e487fe22e9b2c48f116f8c15b8cb479256e74 (patch)
tree2e32f85ee4472d7fd4d32d14ce3ff85b382163d0 /src/slic3r/GUI/GUI_ObjectLayers.cpp
parent7b6c920a3d5e298d20b5873feb69ff5327eba700 (diff)
Fix of a crash on OSX after changing a layer range value and then
pressing the "add layer" button.
Diffstat (limited to 'src/slic3r/GUI/GUI_ObjectLayers.cpp')
-rw-r--r--src/slic3r/GUI/GUI_ObjectLayers.cpp68
1 files changed, 36 insertions, 32 deletions
diff --git a/src/slic3r/GUI/GUI_ObjectLayers.cpp b/src/slic3r/GUI/GUI_ObjectLayers.cpp
index d209214ae..d62bb2727 100644
--- a/src/slic3r/GUI/GUI_ObjectLayers.cpp
+++ b/src/slic3r/GUI/GUI_ObjectLayers.cpp
@@ -58,7 +58,7 @@ void ObjectLayers::select_editor(LayerRangeEditor* editor, const bool is_last_ed
}
}
-wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range)
+wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinusButton *delete_button, PlusMinusButton *add_button)
{
const bool is_last_edited_range = range == m_selectable_range;
@@ -79,8 +79,8 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range)
// Add control for the "Min Z"
- auto editor = new LayerRangeEditor(this, double_to_string(range.first), etMinZ,
- set_focus_data, [range, update_focus_data, this](coordf_t min_z, bool enter_pressed)
+ auto editor = new LayerRangeEditor(this, double_to_string(range.first), etMinZ, set_focus_data,
+ [range, update_focus_data, this, delete_button, add_button](coordf_t min_z, bool enter_pressed, bool dont_update_ui)
{
if (fabs(min_z - range.first) < EPSILON) {
m_selection_type = etUndef;
@@ -89,10 +89,14 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range)
// data for next focusing
coordf_t max_z = min_z < range.second ? range.second : min_z + 0.5;
- const t_layer_height_range& new_range = { min_z, max_z };
+ const t_layer_height_range new_range = { min_z, max_z };
+ if (delete_button)
+ delete_button->range = new_range;
+ if (add_button)
+ add_button->range = new_range;
update_focus_data(new_range, etMinZ, enter_pressed);
- return wxGetApp().obj_list()->edit_layer_range(range, new_range);
+ return wxGetApp().obj_list()->edit_layer_range(range, new_range, dont_update_ui);
});
select_editor(editor, is_last_edited_range);
@@ -100,8 +104,8 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range)
// Add control for the "Max Z"
- editor = new LayerRangeEditor(this, double_to_string(range.second), etMaxZ,
- set_focus_data, [range, update_focus_data, this](coordf_t max_z, bool enter_pressed)
+ editor = new LayerRangeEditor(this, double_to_string(range.second), etMaxZ, set_focus_data,
+ [range, update_focus_data, this, delete_button, add_button](coordf_t max_z, bool enter_pressed, bool dont_update_ui)
{
if (fabs(max_z - range.second) < EPSILON || range.first > max_z) {
m_selection_type = etUndef;
@@ -110,9 +114,13 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range)
// data for next focusing
const t_layer_height_range& new_range = { range.first, max_z };
+ if (delete_button)
+ delete_button->range = new_range;
+ if (add_button)
+ add_button->range = new_range;
update_focus_data(new_range, etMaxZ, enter_pressed);
- return wxGetApp().obj_list()->edit_layer_range(range, new_range);
+ return wxGetApp().obj_list()->edit_layer_range(range, new_range, dont_update_ui);
});
select_editor(editor, is_last_edited_range);
@@ -120,9 +128,8 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range)
// Add control for the "Layer height"
- editor = new LayerRangeEditor(this,
- double_to_string(m_object->layer_config_ranges[range].option("layer_height")->getFloat()),
- etLayerHeight, set_focus_data, [range, this](coordf_t layer_height, bool)
+ editor = new LayerRangeEditor(this, double_to_string(m_object->layer_config_ranges[range].option("layer_height")->getFloat()), etLayerHeight, set_focus_data,
+ [range, this](coordf_t layer_height, bool, bool)
{
return wxGetApp().obj_list()->edit_layer_range(range, layer_height);
});
@@ -141,30 +148,27 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range)
return sizer;
}
-
+
void ObjectLayers::create_layers_list()
{
for (const auto layer : m_object->layer_config_ranges)
{
const t_layer_height_range& range = layer.first;
- auto sizer = create_layer(range);
-
- auto del_btn = new ScalableButton(m_parent, wxID_ANY, m_bmp_delete);
+ auto del_btn = new PlusMinusButton(m_parent, m_bmp_delete, range);
del_btn->SetToolTip(_(L("Remove layer range")));
+ auto add_btn = new PlusMinusButton(m_parent, m_bmp_add, range);
+ add_btn->SetToolTip(_(L("Add layer range")));
+ auto sizer = create_layer(range, del_btn, add_btn);
sizer->Add(del_btn, 0, wxRIGHT | wxLEFT, em_unit(m_parent));
+ sizer->Add(add_btn);
- del_btn->Bind(wxEVT_BUTTON, [range](wxEvent &) {
- wxGetApp().obj_list()->del_layer_range(range);
+ del_btn->Bind(wxEVT_BUTTON, [del_btn](wxEvent &) {
+ wxGetApp().obj_list()->del_layer_range(del_btn->range);
});
- auto add_btn = new ScalableButton(m_parent, wxID_ANY, m_bmp_add);
- add_btn->SetToolTip(_(L("Add layer range")));
-
- sizer->Add(add_btn);
-
- add_btn->Bind(wxEVT_BUTTON, [range](wxEvent &) {
- wxGetApp().obj_list()->add_layer_range_after_current(range);
+ add_btn->Bind(wxEVT_BUTTON, [add_btn](wxEvent &) {
+ wxGetApp().obj_list()->add_layer_range_after_current(add_btn->range);
});
}
}
@@ -204,7 +208,7 @@ void ObjectLayers::update_layers_list()
if (type & itLayerRoot)
create_layers_list();
else
- create_layer(objects_ctrl->GetModel()->GetLayerRangeByItem(item));
+ create_layer(objects_ctrl->GetModel()->GetLayerRangeByItem(item), nullptr, nullptr);
m_parent->Layout();
}
@@ -255,7 +259,7 @@ void ObjectLayers::msw_rescale()
{
wxSizerItem* b_item = item->GetSizer()->GetItem(btn);
if (b_item->IsWindow()) {
- ScalableButton* button = dynamic_cast<ScalableButton*>(b_item->GetWindow());
+ auto button = dynamic_cast<PlusMinusButton*>(b_item->GetWindow());
if (button != nullptr)
button->msw_rescale();
}
@@ -275,7 +279,7 @@ LayerRangeEditor::LayerRangeEditor( ObjectLayers* parent,
const wxString& value,
EditorType type,
std::function<void(EditorType)> set_focus_data_fn,
- std::function<bool(coordf_t, bool enter_pressed)> edit_fn
+ std::function<bool(coordf_t, bool, bool)> edit_fn
) :
m_valid_value(value),
m_type(type),
@@ -293,13 +297,13 @@ LayerRangeEditor::LayerRangeEditor( ObjectLayers* parent,
m_enter_pressed = true;
// If LayersList wasn't updated/recreated, we can call wxEVT_KILL_FOCUS.Skip()
if (m_type&etLayerHeight) {
- if (!edit_fn(get_value(), true))
+ if (!edit_fn(get_value(), true, false))
SetValue(m_valid_value);
else
m_valid_value = double_to_string(get_value());
m_call_kill_focus = true;
}
- else if (!edit_fn(get_value(), true)) {
+ else if (!edit_fn(get_value(), true, false)) {
SetValue(m_valid_value);
m_call_kill_focus = true;
}
@@ -319,13 +323,13 @@ LayerRangeEditor::LayerRangeEditor( ObjectLayers* parent,
#endif // not __WXGTK__
// If LayersList wasn't updated/recreated, we should call e.Skip()
if (m_type & etLayerHeight) {
- if (!edit_fn(get_value(), false))
+ if (!edit_fn(get_value(), false, dynamic_cast<ObjectLayers::PlusMinusButton*>(e.GetWindow()) != nullptr))
SetValue(m_valid_value);
else
m_valid_value = double_to_string(get_value());
e.Skip();
}
- else if (!edit_fn(get_value(), false)) {
+ else if (!edit_fn(get_value(), false, dynamic_cast<ObjectLayers::PlusMinusButton*>(e.GetWindow()) != nullptr)) {
SetValue(m_valid_value);
e.Skip();
}
@@ -387,4 +391,4 @@ void LayerRangeEditor::msw_rescale()
}
} //namespace GUI
-} //namespace Slic3r \ No newline at end of file
+} //namespace Slic3r