Fixed extruder number updating after changing of the extruder count

This commit is contained in:
YuSanka 2018-12-10 17:00:28 +01:00
parent 0420d76037
commit d7db1cdc73
2 changed files with 52 additions and 39 deletions

View file

@ -67,16 +67,10 @@ ObjectList::ObjectList(wxWindow* parent) :
Bind(wxEVT_CHAR, [this](wxKeyEvent& event) { key_event(event); }); // doesn't work on OSX
#ifdef __WXMSW__
// Extruder value changed
// Bind(wxEVT_CHOICE, [this](wxCommandEvent& event) { update_extruder_in_config(event.GetString()); });
GetMainWindow()->Bind(wxEVT_MOTION, [this](wxMouseEvent& event) {
set_tooltip_for_item(/*event.GetPosition()*/get_mouse_position_in_control());
event.Skip();
});
// #else
// equivalent to wxEVT_CHOICE on __WXMSW__
// Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, [this](wxDataViewEvent& e) { item_value_change(e); });
#endif //__WXMSW__
Bind(wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, [this](wxDataViewEvent& e) { on_begin_drag(e); });
@ -201,12 +195,54 @@ wxDataViewColumn* ObjectList::create_objects_list_extruder_column(int extruders_
return column;
}
void ObjectList::update_extruder_values_for_items(const int max_extruder)
{
for (int i = 0; i < m_objects->size(); ++i)
{
wxDataViewItem item = m_objects_model->GetItemById(i);
if (!item) continue;
auto object = (*m_objects)[i];
wxString extruder;
if (!object->config.has("extruder") ||
object->config.option<ConfigOptionInt>("extruder")->value > max_extruder)
extruder = "default";
else
extruder = wxString::Format("%d", object->config.option<ConfigOptionInt>("extruder")->value);
m_objects_model->SetValue(extruder, item, 1);
if (object->volumes.size() > 1) {
for (auto id = 0; id < object->volumes.size(); id++) {
item = m_objects_model->GetItemByVolumeId(i, id);
if (!item) continue;
if (!object->volumes[id]->config.has("extruder") ||
object->volumes[id]->config.option<ConfigOptionInt>("extruder")->value > max_extruder)
extruder = "default";
else
extruder = wxString::Format("%d", object->volumes[id]->config.option<ConfigOptionInt>("extruder")->value);
m_objects_model->SetValue(extruder, item, 1);
}
}
}
}
void ObjectList::update_objects_list_extruder_column(int extruders_count)
{
if (!this) return; // #ys_FIXME
if (wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA)
extruders_count = 1;
wxDataViewChoiceRenderer* ch_render = dynamic_cast<wxDataViewChoiceRenderer*>(GetColumn(1)->GetRenderer());
if (ch_render->GetChoices().GetCount() - 1 == extruders_count)
return;
m_prevent_update_extruder_in_config = true;
if (m_objects && extruders_count > 1)
update_extruder_values_for_items(extruders_count);
// delete old 2nd column
DeleteColumn(GetColumn(1));
// insert new created 3rd column
@ -215,6 +251,8 @@ void ObjectList::update_objects_list_extruder_column(int extruders_count)
set_extruder_column_hidden(extruders_count <= 1);
//a workaround for a wrong last column width updating under OSX
GetColumn(2)->SetWidth(25);
m_prevent_update_extruder_in_config = false;
}
void ObjectList::set_extruder_column_hidden(bool hide)
@ -222,8 +260,10 @@ void ObjectList::set_extruder_column_hidden(bool hide)
GetColumn(1)->SetHidden(hide);
}
void ObjectList::update_extruder_in_config(const wxDataViewItem& item/*wxString& selection*/)
void ObjectList::update_extruder_in_config(const wxDataViewItem& item)
{
if (m_prevent_update_extruder_in_config)
return;
if (m_objects_model->GetParent(item) == wxDataViewItem(0)) {
const int obj_idx = m_objects_model->GetIdByItem(item);
m_config = &(*m_objects)[obj_idx]->config;
@ -376,20 +416,6 @@ void ObjectList::key_event(wxKeyEvent& event)
event.Skip();
}
void ObjectList::item_value_change(wxDataViewEvent& event)
{
if (event.GetColumn() == 1)
{
wxVariant variant;
m_objects_model->GetValue(variant, event.GetItem(), 1);
// #ifdef __WXOSX__
// m_selected_extruder = variant.GetString();
// #else // --> for Linux
// update_extruder_in_config(variant.GetString());
// #endif //__WXOSX__
}
}
struct draging_item_data
{
int obj_idx;
@ -589,9 +615,6 @@ void ObjectList::get_settings_choice(const wxString& category_name)
const auto settings_item = m_objects_model->GetSettingsItem(item);
select_item(settings_item ? settings_item :
m_objects_model->AddSettingsChild(item));
#ifndef __WXOSX__
// part_selection_changed();
#endif //no __WXOSX__
}
else {
auto panel = wxGetApp().sidebar().scrolled_panel();
@ -765,11 +788,6 @@ void ObjectList::load_subobject(int type)
if (i == part_names.size() - 1)
select_item(sel_item);
}
#ifndef __WXOSX__ //#ifdef __WXMSW__ // #ys_FIXME
// selection_changed();
#endif //no __WXOSX__//__WXMSW__
}
void ObjectList::load_part( ModelObject* model_object,
@ -1641,11 +1659,6 @@ void ObjectList::update_settings_items()
UnselectAll();
}
// void ObjectList::OnEditingDone(wxDataViewEvent &event)
// {
// m_selected_extruder = event.GetValue().GetString();
// }
void ObjectList::ItemValueChanged(wxDataViewEvent &event)
{
update_extruder_in_config(event.GetItem());

View file

@ -80,9 +80,10 @@ class ObjectList : public wxDataViewCtrl
bool m_prevent_list_events = false; // We use this flag to avoid circular event handling Select()
// happens to fire a wxEVT_LIST_ITEM_SELECTED on OSX, whose event handler
// calls this method again and again and again
// #ifdef __WXOSX__
// wxString m_selected_extruder = "";
// #endif //__WXOSX__
bool m_prevent_update_extruder_in_config = false; // We use this flag to avoid updating of the extruder value in config
// during updating of the extruder count.
bool m_parts_changed = false;
bool m_part_settings_changed = false;
@ -106,6 +107,7 @@ public:
void set_extruder_column_hidden(bool hide);
// update extruder in current config
void update_extruder_in_config(const wxDataViewItem& item/*wxString& selection*/);
void update_extruder_values_for_items(const int max_extruder);
void init_icons();
@ -115,7 +117,6 @@ public:
void context_menu();
void show_context_menu();
void key_event(wxKeyEvent& event);
void item_value_change(wxDataViewEvent& event);
void on_begin_drag(wxDataViewEvent &event);
void on_drop_possible(wxDataViewEvent &event);
@ -202,7 +203,6 @@ public:
void update_settings_items();
private:
// void OnEditingDone(wxDataViewEvent &event);
void ItemValueChanged(wxDataViewEvent &event);
};