mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-14 05:25:58 +08:00
Implemented UI_Point3, fixed tests.
This commit is contained in:
parent
4fa9f5ee2a
commit
9f83da9519
@ -308,7 +308,6 @@ public:
|
||||
/// Function to call when the contents of this change.
|
||||
std::function<void (const std::string&, std::tuple<std::string, std::string> value)> on_change {nullptr};
|
||||
|
||||
|
||||
void enable() override { _ctrl_x->Enable(); _ctrl_y->Enable(); }
|
||||
void disable() override { _ctrl_x->Disable(); _ctrl_y->Disable(); }
|
||||
|
||||
@ -342,9 +341,57 @@ private:
|
||||
void _set_value(Slic3r::Pointf3 value);
|
||||
void _set_value(std::string value);
|
||||
|
||||
};
|
||||
|
||||
class UI_Point3 : public UI_Sizer {
|
||||
public:
|
||||
UI_Point3(wxWindow* _parent, Slic3r::ConfigOptionDef _opt);
|
||||
~UI_Point3() { _lbl_x->Destroy(); _lbl_y->Destroy(); _ctrl_x->Destroy(); _ctrl_y->Destroy(); _lbl_z->Destroy(); _ctrl_z->Destroy(); }
|
||||
std::string get_string();
|
||||
|
||||
void set_value(boost::any value) override; //< Implements set_value
|
||||
|
||||
Slic3r::Pointf get_point() override; /// return a Slic3r::Pointf corresponding to the textctrl contents.
|
||||
Slic3r::Pointf3 get_point3() override; /// return a Slic3r::Pointf3 corresponding to the textctrl contents.
|
||||
|
||||
void enable() override { _ctrl_x->Enable(); _ctrl_y->Enable(); _ctrl_z->Enable(); }
|
||||
void disable() override { _ctrl_x->Disable(); _ctrl_y->Disable(); _ctrl_z->Disable(); }
|
||||
|
||||
std::function<void (const std::string&, std::tuple<std::string, std::string, std::string> value)> on_change {nullptr};
|
||||
|
||||
/// Local-access items
|
||||
wxTextCtrl* ctrl_x() { return _ctrl_x;}
|
||||
wxTextCtrl* ctrl_y() { return _ctrl_y;}
|
||||
wxTextCtrl* ctrl_z() { return _ctrl_z;}
|
||||
|
||||
wxStaticText* lbl_x() { return _lbl_x;}
|
||||
wxStaticText* lbl_y() { return _lbl_y;}
|
||||
wxStaticText* lbl_z() { return _lbl_z;}
|
||||
|
||||
protected:
|
||||
virtual std::string LogChannel() override { return "UI_Point3"s; }
|
||||
|
||||
void _on_change(std::string opt_id) override {
|
||||
if (!this->disable_change_event && this->_ctrl_x->IsEnabled() && this->on_change != nullptr) {
|
||||
this->on_change(opt_id, std::make_tuple<std::string, std::string, std::string>(_ctrl_x->GetValue().ToStdString(), _ctrl_y->GetValue().ToStdString(), _ctrl_z->GetValue().ToStdString()));
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
wxSize field_size {40, 1};
|
||||
wxStaticText* _lbl_x {nullptr};
|
||||
wxStaticText* _lbl_y {nullptr};
|
||||
wxStaticText* _lbl_z {nullptr};
|
||||
|
||||
wxTextCtrl* _ctrl_x {nullptr};
|
||||
wxTextCtrl* _ctrl_y {nullptr};
|
||||
wxTextCtrl* _ctrl_z {nullptr};
|
||||
|
||||
wxBoxSizer* _sizer {nullptr};
|
||||
|
||||
void _set_value(Slic3r::Pointf value);
|
||||
void _set_value(Slic3r::Pointf3 value);
|
||||
void _set_value(std::string value);
|
||||
|
||||
};
|
||||
|
||||
|
131
src/GUI/OptionsGroup/UI_Point3.cpp
Normal file
131
src/GUI/OptionsGroup/UI_Point3.cpp
Normal file
@ -0,0 +1,131 @@
|
||||
#include "OptionsGroup/Field.hpp"
|
||||
#include "misc_ui.hpp"
|
||||
#include "Log.hpp"
|
||||
|
||||
#include <regex>
|
||||
|
||||
namespace Slic3r { namespace GUI {
|
||||
|
||||
using namespace std::string_literals;
|
||||
|
||||
std::string UI_Point3::get_string() {
|
||||
std::string result {""};
|
||||
if (_ctrl_x->GetValue().ToStdString() == "") {
|
||||
result.append("0.0");
|
||||
} else {
|
||||
result.append(trim_zeroes(_ctrl_x->GetValue().ToStdString()));
|
||||
}
|
||||
result.append(";"s);
|
||||
if (_ctrl_y->GetValue().ToStdString() == "") {
|
||||
result.append("0.0");
|
||||
} else {
|
||||
result.append(trim_zeroes(_ctrl_y->GetValue().ToStdString()));
|
||||
}
|
||||
result.append(";"s);
|
||||
if (_ctrl_z->GetValue().ToStdString() == "") {
|
||||
result.append("0.0");
|
||||
} else {
|
||||
result.append(trim_zeroes(_ctrl_z->GetValue().ToStdString()));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Slic3r::Pointf3 UI_Point3::get_point3() {
|
||||
return Pointf3(
|
||||
this->_ctrl_x->GetValue().ToStdString() != ""s ? std::stod(this->_ctrl_x->GetValue().ToStdString()) : 0.0,
|
||||
this->_ctrl_y->GetValue().ToStdString() != ""s ? std::stod(this->_ctrl_y->GetValue().ToStdString()) : 0.0,
|
||||
this->_ctrl_z->GetValue().ToStdString() != ""s ? std::stod(this->_ctrl_z->GetValue().ToStdString()) : 0.0
|
||||
);
|
||||
}
|
||||
Slic3r::Pointf UI_Point3::get_point() {
|
||||
return Pointf(
|
||||
this->_ctrl_x->GetValue().ToStdString() != ""s ? std::stod(this->_ctrl_x->GetValue().ToStdString()) : 0.0,
|
||||
this->_ctrl_y->GetValue().ToStdString() != ""s ? std::stod(this->_ctrl_y->GetValue().ToStdString()) : 0.0
|
||||
);
|
||||
}
|
||||
void UI_Point3::set_value(boost::any value) {
|
||||
// type detection and handing off to children
|
||||
if (value.type() == typeid(Slic3r::Pointf)) {
|
||||
this->_set_value(boost::any_cast<Pointf>(value));
|
||||
} else if (value.type() == typeid(Slic3r::Pointf3)) {
|
||||
this->_set_value(boost::any_cast<Pointf3>(value));
|
||||
} else if (value.type() == typeid(std::string)) {
|
||||
this->_set_value(boost::any_cast<std::string>(value));
|
||||
} else if (value.type() == typeid(wxString)) {
|
||||
this->_set_value(boost::any_cast<wxString>(value).ToStdString());
|
||||
} else {
|
||||
Slic3r::Log::warn(this->LogChannel(), LOG_WSTRING("Type " << value.type().name() << " is not handled in set_value."));
|
||||
}
|
||||
}
|
||||
|
||||
void UI_Point3::_set_value(Slic3r::Pointf value) {
|
||||
/// load the controls directly from the value
|
||||
this->_ctrl_x->SetValue(trim_zeroes(std::to_string(value.x)));
|
||||
this->_ctrl_y->SetValue(trim_zeroes(std::to_string(value.y)));
|
||||
this->_ctrl_z->SetValue("0.0");
|
||||
}
|
||||
|
||||
void UI_Point3::_set_value(Slic3r::Pointf3 value) {
|
||||
/// load the controls directly from the value
|
||||
this->_ctrl_x->SetValue(trim_zeroes(std::to_string(value.x)));
|
||||
this->_ctrl_y->SetValue(trim_zeroes(std::to_string(value.y)));
|
||||
this->_ctrl_z->SetValue(trim_zeroes(std::to_string(value.z)));
|
||||
}
|
||||
|
||||
void UI_Point3::_set_value(std::string value) {
|
||||
/// parse the string into the two parts.
|
||||
std::regex format_regex(";");
|
||||
auto f_begin { std::sregex_token_iterator(value.begin(), value.end(), format_regex, -1) };
|
||||
auto f_end { std::sregex_token_iterator() };
|
||||
|
||||
if (f_begin != f_end) {
|
||||
auto iter = f_begin;
|
||||
this->_ctrl_x->SetValue(trim_zeroes(iter->str()));
|
||||
iter++;
|
||||
if (iter != f_end)
|
||||
this->_ctrl_y->SetValue(trim_zeroes(iter->str()));
|
||||
iter++;
|
||||
if (iter != f_end)
|
||||
this->_ctrl_z->SetValue(trim_zeroes(iter->str()));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
UI_Point3::UI_Point3(wxWindow* _parent, Slic3r::ConfigOptionDef _opt) : UI_Sizer(_parent, _opt) {
|
||||
Slic3r::Pointf3 def_val {_opt.default_value == nullptr ? Pointf3() : Pointf3(*(dynamic_cast<ConfigOptionPoint3*>(_opt.default_value))) };
|
||||
|
||||
this->_ctrl_x = new wxTextCtrl(parent, wxID_ANY, trim_zeroes(wxString::FromDouble(def_val.x)), wxDefaultPosition, this->field_size, wxTE_PROCESS_ENTER);
|
||||
this->_ctrl_y = new wxTextCtrl(parent, wxID_ANY, trim_zeroes(wxString::FromDouble(def_val.y)), wxDefaultPosition, this->field_size, wxTE_PROCESS_ENTER);
|
||||
this->_ctrl_z = new wxTextCtrl(parent, wxID_ANY, trim_zeroes(wxString::FromDouble(def_val.z)), wxDefaultPosition, this->field_size, wxTE_PROCESS_ENTER);
|
||||
|
||||
this->_lbl_x = new wxStaticText(parent, wxID_ANY, wxString("x:"));
|
||||
this->_lbl_y = new wxStaticText(parent, wxID_ANY, wxString("y:"));
|
||||
this->_lbl_z = new wxStaticText(parent, wxID_ANY, wxString("z:"));
|
||||
|
||||
this->_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
this->sizer = _sizer;
|
||||
|
||||
this->_sizer->Add(_lbl_x, 0, wxALIGN_CENTER_VERTICAL, 0);
|
||||
this->_sizer->Add(_ctrl_x, 0, wxALIGN_CENTER_VERTICAL, 0);
|
||||
this->_sizer->Add(_lbl_y, 0, wxALIGN_CENTER_VERTICAL, 0);
|
||||
this->_sizer->Add(_ctrl_y, 0, wxALIGN_CENTER_VERTICAL, 0);
|
||||
this->_sizer->Add(_lbl_z, 0, wxALIGN_CENTER_VERTICAL, 0);
|
||||
this->_sizer->Add(_ctrl_z, 0, wxALIGN_CENTER_VERTICAL, 0);
|
||||
|
||||
if (this->opt.tooltip != ""s) {
|
||||
this->_ctrl_x->SetToolTip(this->opt.tooltip);
|
||||
this->_ctrl_y->SetToolTip(this->opt.tooltip);
|
||||
this->_ctrl_z->SetToolTip(this->opt.tooltip);
|
||||
}
|
||||
|
||||
// events
|
||||
_ctrl_x->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent& e) { this->_on_change(""); e.Skip(); });
|
||||
_ctrl_y->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent& e) { this->_on_change(""); e.Skip(); });
|
||||
_ctrl_z->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent& e) { this->_on_change(""); e.Skip(); });
|
||||
_ctrl_x->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) { if (this->on_kill_focus != nullptr) {this->on_kill_focus(""); this->_on_change("");} e.Skip(); });
|
||||
_ctrl_y->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) { if (this->on_kill_focus != nullptr) {this->on_kill_focus(""); this->_on_change("");} e.Skip(); });
|
||||
_ctrl_z->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) { if (this->on_kill_focus != nullptr) {this->on_kill_focus(""); this->_on_change("");} e.Skip(); });
|
||||
}
|
||||
|
||||
} } // Namespace Slic3r::GUI
|
@ -23,9 +23,9 @@ SCENARIO( "UI_Point3: default values from options and basic accessor methods") {
|
||||
wxUIActionSimulator sim;
|
||||
wxMilliSleep(500);
|
||||
|
||||
GIVEN( "A UI point method and a X,Y coordinate (3.2, 10.2) as the default_value") {
|
||||
GIVEN( "A UI point method and a X,Y coordinate (3.2, 10.2, 0.0) as the default_value") {
|
||||
auto simple_option {ConfigOptionDef()};
|
||||
auto* default_point {new ConfigOptionPoint(Pointf(3.2, 10.2))};
|
||||
auto* default_point {new ConfigOptionPoint3(Pointf3(3.2, 10.2, 0.0))};
|
||||
simple_option.default_value = default_point;
|
||||
auto test_field {Slic3r::GUI::UI_Point3(wxTheApp->GetTopWindow(), simple_option)};
|
||||
|
||||
@ -44,7 +44,7 @@ SCENARIO( "UI_Point3: default values from options and basic accessor methods") {
|
||||
}
|
||||
GIVEN( "A UI point, coordinate in X/Y/Z and a tooltip in simple_option") {
|
||||
auto simple_option {ConfigOptionDef()};
|
||||
auto* default_point {new ConfigOptionPoint(Pointf3(3.2, 10.2, 0.2))};
|
||||
auto* default_point {new ConfigOptionPoint3(Pointf3(3.2, 10.2, 0.2))};
|
||||
simple_option.default_value = default_point;
|
||||
|
||||
auto test_field {Slic3r::GUI::UI_Point3(wxTheApp->GetTopWindow(), simple_option)};
|
||||
@ -122,7 +122,7 @@ SCENARIO( "UI_Point3: set_value works with several types of inputs") {
|
||||
WHEN( "set_value is called with a string of the form '30.9;211.2;411.0'") {
|
||||
test_field.set_value("30.9;211.2;411.0"s);
|
||||
THEN( "get_point3() returns a Pointf3(30.9, 211.2, 411.0)") {
|
||||
REQUIRE(test_field.get_point3() == Pointf(30.9, 211.2, 411.0));
|
||||
REQUIRE(test_field.get_point3() == Pointf3(30.9, 211.2, 411.0));
|
||||
}
|
||||
THEN( "get_point() returns a Pointf(30.9, 211.2)") {
|
||||
REQUIRE(test_field.get_point() == Pointf(30.9, 211.2));
|
||||
@ -173,7 +173,7 @@ SCENARIO( "UI_Point3: Event responses") {
|
||||
auto simple_option {ConfigOptionDef()};
|
||||
auto test_field {Slic3r::GUI::UI_Point3(wxTheApp->GetTopWindow(), simple_option)};
|
||||
auto event_count {0};
|
||||
auto changefunc {[&event_count] (const std::string& opt_id, std::tuple<std::string, std::string> value) { event_count++; }};
|
||||
auto changefunc {[&event_count] (const std::string& opt_id, std::tuple<std::string, std::string, std::string> value) { event_count++; }};
|
||||
auto killfunc {[&event_count](const std::string& opt_id) { event_count++; }};
|
||||
|
||||
test_field.on_change = changefunc;
|
||||
@ -240,7 +240,7 @@ SCENARIO( "UI_Point3: Event responses") {
|
||||
auto simple_option {ConfigOptionDef()};
|
||||
auto test_field {Slic3r::GUI::UI_Point3(wxTheApp->GetTopWindow(), simple_option)};
|
||||
auto event_count {0};
|
||||
auto changefunc {[&event_count] (const std::string& opt_id, std::tuple<std::string, std::string> value) { event_count++; }};
|
||||
auto changefunc {[&event_count] (const std::string& opt_id, std::tuple<std::string, std::string, std::string> value) { event_count++; }};
|
||||
auto killfunc {[&event_count](const std::string& opt_id) { event_count += 1; }};
|
||||
|
||||
test_field.on_change = changefunc;
|
||||
|
Loading…
x
Reference in New Issue
Block a user