Implemented focusing of the last edited range
This commit is contained in:
parent
213635f559
commit
567f382938
3 changed files with 76 additions and 24 deletions
|
@ -43,28 +43,67 @@ ObjectLayers::ObjectLayers(wxWindow* parent) :
|
||||||
|
|
||||||
wxSizer* ObjectLayers::create_layer_without_buttons(const t_layer_config_ranges::value_type& layer)
|
wxSizer* ObjectLayers::create_layer_without_buttons(const t_layer_config_ranges::value_type& layer)
|
||||||
{
|
{
|
||||||
|
const bool is_last_edited_range = layer.first == m_last_edited_range;
|
||||||
|
|
||||||
// Add control for the "Min Z"
|
// Add control for the "Min Z"
|
||||||
|
|
||||||
auto temp = new LayerRangeEditor(m_parent, double_to_string(layer.first.first),
|
auto temp = new LayerRangeEditor(m_parent, double_to_string(layer.first.first),
|
||||||
[layer](coordf_t min_z) {
|
[layer, this](coordf_t min_z)
|
||||||
wxGetApp().obj_list()->edit_layer_range(layer.first, { min_z, layer.first.second });
|
{
|
||||||
});
|
if (fabs(min_z - layer.first.first) < EPSILON) {
|
||||||
|
m_selection_type = sitUndef;
|
||||||
|
return false; // LayersList would not be updated/recreated
|
||||||
|
}
|
||||||
|
|
||||||
|
// data for next focusing
|
||||||
|
m_last_edited_range = { min_z, layer.first.second };
|
||||||
|
m_selection_type = sitMinZ;
|
||||||
|
|
||||||
|
wxGetApp().obj_list()->edit_layer_range(layer.first, m_last_edited_range);
|
||||||
|
return true; // LayersList will be updated/recreated
|
||||||
|
} );
|
||||||
|
|
||||||
|
if (is_last_edited_range && m_selection_type == sitMinZ) {
|
||||||
|
temp->SetFocus();
|
||||||
|
temp->SetInsertionPointEnd();
|
||||||
|
}
|
||||||
|
|
||||||
m_grid_sizer->Add(temp);
|
m_grid_sizer->Add(temp);
|
||||||
|
|
||||||
// Add control for the "Max Z"
|
// Add control for the "Max Z"
|
||||||
|
|
||||||
temp = new LayerRangeEditor(m_parent, double_to_string(layer.first.second),
|
temp = new LayerRangeEditor(m_parent, double_to_string(layer.first.second),
|
||||||
[layer](coordf_t max_z) {
|
[layer, this](coordf_t max_z)
|
||||||
wxGetApp().obj_list()->edit_layer_range(layer.first, { layer.first.first, max_z });
|
{
|
||||||
|
if (fabs(max_z - layer.first.second) < EPSILON) {
|
||||||
|
m_selection_type = sitUndef;
|
||||||
|
return false; // LayersList would not be updated/recreated
|
||||||
|
}
|
||||||
|
|
||||||
|
// data for next focusing
|
||||||
|
m_last_edited_range = { layer.first.first, max_z };
|
||||||
|
m_selection_type = sitMaxZ;
|
||||||
|
|
||||||
|
wxGetApp().obj_list()->edit_layer_range(layer.first, m_last_edited_range);
|
||||||
|
return true; // LayersList will not be updated/recreated
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (is_last_edited_range && m_selection_type == sitMaxZ) {
|
||||||
|
temp->SetFocus();
|
||||||
|
temp->SetInsertionPointEnd();
|
||||||
|
}
|
||||||
|
|
||||||
m_grid_sizer->Add(temp);
|
m_grid_sizer->Add(temp);
|
||||||
|
|
||||||
// Add control for the "Layer height"
|
// Add control for the "Layer height"
|
||||||
|
|
||||||
temp = new LayerRangeEditor(m_parent,
|
temp = new LayerRangeEditor(m_parent,
|
||||||
double_to_string(layer.second.option("layer_height")->getFloat()),
|
double_to_string(layer.second.option("layer_height")->getFloat()),
|
||||||
[layer](coordf_t layer_height) {
|
[layer, this](coordf_t layer_height)
|
||||||
|
{
|
||||||
wxGetApp().obj_list()->edit_layer_range(layer.first, layer_height);
|
wxGetApp().obj_list()->edit_layer_range(layer.first, layer_height);
|
||||||
}, false );
|
return false; // LayersList would not be updated/recreated
|
||||||
|
});
|
||||||
|
|
||||||
auto sizer = new wxBoxSizer(wxHORIZONTAL);
|
auto sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
sizer->Add(temp);
|
sizer->Add(temp);
|
||||||
|
@ -169,8 +208,7 @@ void ObjectLayers::msw_rescale()
|
||||||
|
|
||||||
LayerRangeEditor::LayerRangeEditor( wxWindow* parent,
|
LayerRangeEditor::LayerRangeEditor( wxWindow* parent,
|
||||||
const wxString& value,
|
const wxString& value,
|
||||||
std::function<void(coordf_t)> edit_fn,
|
std::function<bool(coordf_t)> edit_fn
|
||||||
const bool deletable_after_change
|
|
||||||
) :
|
) :
|
||||||
wxTextCtrl(parent, wxID_ANY, value, wxDefaultPosition,
|
wxTextCtrl(parent, wxID_ANY, value, wxDefaultPosition,
|
||||||
wxSize(field_width * em_unit(parent), wxDefaultCoord), wxTE_PROCESS_ENTER)
|
wxSize(field_width * em_unit(parent), wxDefaultCoord), wxTE_PROCESS_ENTER)
|
||||||
|
@ -179,18 +217,23 @@ LayerRangeEditor::LayerRangeEditor( wxWindow* parent,
|
||||||
|
|
||||||
this->Bind(wxEVT_TEXT_ENTER, ([this, edit_fn](wxEvent& e)
|
this->Bind(wxEVT_TEXT_ENTER, ([this, edit_fn](wxEvent& e)
|
||||||
{
|
{
|
||||||
m_enter_pressed = true;
|
m_enter_pressed = true;
|
||||||
edit_fn(get_value());
|
// If LayersList wasn't updated/recreated, we can call wxEVT_KILL_FOCUS.Skip()
|
||||||
|
if ( !edit_fn(get_value()) )
|
||||||
|
m_call_kill_focus = true;
|
||||||
}), this->GetId());
|
}), this->GetId());
|
||||||
|
|
||||||
this->Bind(wxEVT_KILL_FOCUS, ([this, edit_fn, deletable_after_change](wxEvent& e)
|
this->Bind(wxEVT_KILL_FOCUS, ([this, edit_fn](wxEvent& e)
|
||||||
{
|
{
|
||||||
if (!deletable_after_change)
|
|
||||||
e.Skip();
|
|
||||||
if (!m_enter_pressed) {
|
if (!m_enter_pressed) {
|
||||||
m_enter_pressed = false;
|
m_enter_pressed = false;
|
||||||
edit_fn(get_value());
|
|
||||||
|
// If LayersList wasn't updated/recreated, we should call e.Skip()
|
||||||
|
if ( !edit_fn(get_value()) )
|
||||||
|
e.Skip();
|
||||||
}
|
}
|
||||||
|
else if (m_call_kill_focus)
|
||||||
|
e.Skip();
|
||||||
}), this->GetId());
|
}), this->GetId());
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,16 +14,16 @@ class ConfigOptionsGroup;
|
||||||
|
|
||||||
class LayerRangeEditor : public wxTextCtrl
|
class LayerRangeEditor : public wxTextCtrl
|
||||||
{
|
{
|
||||||
bool m_enter_pressed { false };
|
bool m_enter_pressed { false };
|
||||||
|
bool m_call_kill_focus { false };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LayerRangeEditor( wxWindow* parent,
|
LayerRangeEditor( wxWindow* parent,
|
||||||
const wxString& value = wxEmptyString,
|
const wxString& value = wxEmptyString,
|
||||||
std::function<void(coordf_t val)> edit_fn = [](coordf_t) {},
|
std::function<bool(coordf_t val)> edit_fn = [](coordf_t) {return false; }
|
||||||
const bool deletable_after_change = true
|
|
||||||
);
|
);
|
||||||
~LayerRangeEditor() {}
|
~LayerRangeEditor() {}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
coordf_t get_value();
|
coordf_t get_value();
|
||||||
};
|
};
|
||||||
|
@ -34,7 +34,16 @@ class ObjectLayers : public OG_Settings
|
||||||
ScalableBitmap m_bmp_add;
|
ScalableBitmap m_bmp_add;
|
||||||
ModelObject* m_object {nullptr};
|
ModelObject* m_object {nullptr};
|
||||||
|
|
||||||
wxFlexGridSizer* m_grid_sizer;
|
wxFlexGridSizer* m_grid_sizer;
|
||||||
|
std::pair<coordf_t, coordf_t> m_last_edited_range;
|
||||||
|
|
||||||
|
enum SelectedItemType
|
||||||
|
{
|
||||||
|
sitUndef,
|
||||||
|
sitMinZ,
|
||||||
|
sitMaxZ,
|
||||||
|
sitLayerHeight,
|
||||||
|
} m_selection_type {sitUndef};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ObjectLayers(wxWindow* parent);
|
ObjectLayers(wxWindow* parent);
|
||||||
|
|
|
@ -2212,7 +2212,7 @@ void ObjectList::del_layer_range(const std::pair<coordf_t, coordf_t>& range)
|
||||||
const int obj_idx = get_selected_obj_idx();
|
const int obj_idx = get_selected_obj_idx();
|
||||||
if (obj_idx < 0) return;
|
if (obj_idx < 0) return;
|
||||||
|
|
||||||
t_layer_height_ranges& ranges = object(obj_idx)->layer_height_ranges;
|
t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
|
||||||
|
|
||||||
wxDataViewItem selectable_item = GetSelection();
|
wxDataViewItem selectable_item = GetSelection();
|
||||||
int layer_idx = 0;
|
int layer_idx = 0;
|
||||||
|
@ -2221,10 +2221,10 @@ void ObjectList::del_layer_range(const std::pair<coordf_t, coordf_t>& range)
|
||||||
selectable_item = m_objects_model->GetParent(selectable_item);
|
selectable_item = m_objects_model->GetParent(selectable_item);
|
||||||
else {
|
else {
|
||||||
// May be not a best solution #ys_FIXME
|
// May be not a best solution #ys_FIXME
|
||||||
t_layer_height_ranges::iterator layer_selected = ranges.find(range);
|
t_layer_config_ranges::iterator layer_selected = ranges.find(range);
|
||||||
t_layer_height_ranges::iterator it = ranges.begin();
|
t_layer_config_ranges::iterator it = ranges.begin();
|
||||||
while (it != layer_selected) {
|
while (it != layer_selected) {
|
||||||
it++;
|
++it;
|
||||||
layer_idx++;
|
layer_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue