mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-13 01:37:53 -06:00
Undo buttons work
This commit is contained in:
parent
4547755221
commit
3caf54c359
5 changed files with 58 additions and 18 deletions
|
@ -18,6 +18,17 @@ namespace Slic3r { namespace GUI {
|
||||||
wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None);
|
wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Field::PostInitialize(){
|
||||||
|
m_Undo_btn = new wxButton(m_parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
|
||||||
|
// use bouth of temporary_icons till don't have "undo_icon"
|
||||||
|
auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
||||||
|
m_Undo_btn->SetBackgroundColour(color);
|
||||||
|
m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG));
|
||||||
|
m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent){ on_back_to_initial_value(); }));
|
||||||
|
|
||||||
|
BUILD();
|
||||||
|
}
|
||||||
|
|
||||||
void Field::on_kill_focus(wxEvent& event) {
|
void Field::on_kill_focus(wxEvent& event) {
|
||||||
// Without this, there will be nasty focus bugs on Windows.
|
// Without this, there will be nasty focus bugs on Windows.
|
||||||
// Also, docs for wxEvent::Skip() say "In general, it is recommended to skip all
|
// Also, docs for wxEvent::Skip() say "In general, it is recommended to skip all
|
||||||
|
@ -34,6 +45,12 @@ namespace Slic3r { namespace GUI {
|
||||||
m_on_change(m_opt_id, get_value());
|
m_on_change(m_opt_id, get_value());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Field::on_back_to_initial_value()
|
||||||
|
{
|
||||||
|
if (m_back_to_initial_value != nullptr)
|
||||||
|
m_back_to_initial_value(m_opt_id);
|
||||||
|
}
|
||||||
|
|
||||||
wxString Field::get_tooltip_text(const wxString& default_string)
|
wxString Field::get_tooltip_text(const wxString& default_string)
|
||||||
{
|
{
|
||||||
wxString tooltip_text("");
|
wxString tooltip_text("");
|
||||||
|
|
|
@ -26,21 +26,14 @@ class Field;
|
||||||
using t_field = std::unique_ptr<Field>;
|
using t_field = std::unique_ptr<Field>;
|
||||||
using t_kill_focus = std::function<void()>;
|
using t_kill_focus = std::function<void()>;
|
||||||
using t_change = std::function<void(t_config_option_key, boost::any)>;
|
using t_change = std::function<void(t_config_option_key, boost::any)>;
|
||||||
|
using t_back_to_init = std::function<void(std::string)>;
|
||||||
|
|
||||||
wxString double_to_string(double const value);
|
wxString double_to_string(double const value);
|
||||||
|
|
||||||
class Field {
|
class Field {
|
||||||
protected:
|
protected:
|
||||||
// factory function to defer and enforce creation of derived type.
|
// factory function to defer and enforce creation of derived type.
|
||||||
virtual void PostInitialize(){
|
virtual void PostInitialize();
|
||||||
m_Undo_btn = new wxButton(m_parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT|wxNO_BORDER);
|
|
||||||
// use bouth of temporary_icons till don't have "undo_icon"
|
|
||||||
m_Undo_btn->SetBitmap(wxBitmap(from_u8(__WXMSW__ ? var("action_undo.png") : var("arrow_undo.png")), wxBITMAP_TYPE_PNG));
|
|
||||||
auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
|
||||||
m_Undo_btn->SetBackgroundColour(color);
|
|
||||||
m_Undo_btn->Hide();
|
|
||||||
BUILD();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finish constructing the Field's wxWidget-related properties, including setting its own sizer, etc.
|
/// Finish constructing the Field's wxWidget-related properties, including setting its own sizer, etc.
|
||||||
virtual void BUILD() = 0;
|
virtual void BUILD() = 0;
|
||||||
|
@ -51,6 +44,8 @@ protected:
|
||||||
void on_kill_focus(wxEvent& event);
|
void on_kill_focus(wxEvent& event);
|
||||||
/// Call the attached on_change method.
|
/// Call the attached on_change method.
|
||||||
void on_change_field();
|
void on_change_field();
|
||||||
|
/// Call the attached m_back_to_initial_value method.
|
||||||
|
void on_back_to_initial_value();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// parent wx item, opportunity to refactor (probably not necessary - data duplication)
|
/// parent wx item, opportunity to refactor (probably not necessary - data duplication)
|
||||||
|
@ -62,6 +57,9 @@ public:
|
||||||
/// Function object to store callback passed in from owning object.
|
/// Function object to store callback passed in from owning object.
|
||||||
t_change m_on_change {nullptr};
|
t_change m_on_change {nullptr};
|
||||||
|
|
||||||
|
/// Function object to store callback passed in from owning object.
|
||||||
|
t_back_to_init m_back_to_initial_value{ nullptr };
|
||||||
|
|
||||||
// This is used to avoid recursive invocation of the field change/update by wxWidgets.
|
// This is used to avoid recursive invocation of the field change/update by wxWidgets.
|
||||||
bool m_disable_change_event {false};
|
bool m_disable_change_event {false};
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,11 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
|
||||||
field->m_parent = parent();
|
field->m_parent = parent();
|
||||||
|
|
||||||
//! Label to change background color, when option is modified
|
//! Label to change background color, when option is modified
|
||||||
field->m_Label = label;
|
field->m_Label = label;
|
||||||
|
field->m_back_to_initial_value = [this](std::string opt_id){
|
||||||
|
if (!this->m_disabled)
|
||||||
|
this->back_to_initial_value(opt_id);
|
||||||
|
};
|
||||||
|
|
||||||
// assign function objects for callbacks, etc.
|
// assign function objects for callbacks, etc.
|
||||||
return field;
|
return field;
|
||||||
|
@ -270,6 +274,16 @@ void ConfigOptionsGroup::on_change_OG(t_config_option_key opt_id, boost::any val
|
||||||
OptionsGroup::on_change_OG(opt_id, value); //!? Why doing this
|
OptionsGroup::on_change_OG(opt_id, value); //!? Why doing this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConfigOptionsGroup::back_to_initial_value(const std::string opt_key)
|
||||||
|
{
|
||||||
|
if (m_get_initial_config == nullptr)
|
||||||
|
return;
|
||||||
|
DynamicPrintConfig config = m_get_initial_config();
|
||||||
|
boost::any value = get_config_value(config, opt_key);
|
||||||
|
set_value(opt_key, value);
|
||||||
|
on_change_OG(opt_key, get_value(opt_key)/*value*/);
|
||||||
|
}
|
||||||
|
|
||||||
void ConfigOptionsGroup::reload_config(){
|
void ConfigOptionsGroup::reload_config(){
|
||||||
for (std::map< std::string, std::pair<std::string, int> >::iterator it = m_opt_map.begin(); it != m_opt_map.end(); ++it) {
|
for (std::map< std::string, std::pair<std::string, int> >::iterator it = m_opt_map.begin(); it != m_opt_map.end(); ++it) {
|
||||||
auto opt_id = it->first;
|
auto opt_id = it->first;
|
||||||
|
|
|
@ -19,6 +19,12 @@
|
||||||
#define wxOSX false
|
#define wxOSX false
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
#define wxMSW true
|
||||||
|
#else
|
||||||
|
#define wxMSW false
|
||||||
|
#endif
|
||||||
|
|
||||||
#define BORDER(a, b) ((wxOSX ? a : b))
|
#define BORDER(a, b) ((wxOSX ? a : b))
|
||||||
|
|
||||||
namespace Slic3r { namespace GUI {
|
namespace Slic3r { namespace GUI {
|
||||||
|
@ -78,6 +84,7 @@ public:
|
||||||
wxSizer* sizer {nullptr};
|
wxSizer* sizer {nullptr};
|
||||||
column_t extra_column {nullptr};
|
column_t extra_column {nullptr};
|
||||||
t_change m_on_change {nullptr};
|
t_change m_on_change {nullptr};
|
||||||
|
std::function<DynamicPrintConfig()> m_get_initial_config{ nullptr };
|
||||||
|
|
||||||
wxFont sidetext_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) };
|
wxFont sidetext_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) };
|
||||||
wxFont label_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) };
|
wxFont label_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) };
|
||||||
|
@ -145,6 +152,7 @@ protected:
|
||||||
|
|
||||||
virtual void on_kill_focus (){};
|
virtual void on_kill_focus (){};
|
||||||
virtual void on_change_OG(t_config_option_key opt_id, boost::any value);
|
virtual void on_change_OG(t_config_option_key opt_id, boost::any value);
|
||||||
|
virtual void back_to_initial_value(const std::string opt_key){};
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConfigOptionsGroup: public OptionsGroup {
|
class ConfigOptionsGroup: public OptionsGroup {
|
||||||
|
@ -172,10 +180,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_change_OG(t_config_option_key opt_id, boost::any value) override;
|
void on_change_OG(t_config_option_key opt_id, boost::any value) override;
|
||||||
void on_kill_focus() override
|
void back_to_initial_value(const std::string opt_key) override;
|
||||||
{
|
void on_kill_focus() override{ reload_config();}
|
||||||
reload_config();
|
|
||||||
}
|
|
||||||
void reload_config();
|
void reload_config();
|
||||||
boost::any config_value(std::string opt_key, int opt_index, bool deserialize);
|
boost::any config_value(std::string opt_key, int opt_index, bool deserialize);
|
||||||
// return option value from config
|
// return option value from config
|
||||||
|
|
|
@ -148,8 +148,8 @@ void Tab::update_dirty(){
|
||||||
for (auto opt_key : dirty_options){
|
for (auto opt_key : dirty_options){
|
||||||
Field* field = get_field(opt_key/*, opt_index*/);
|
Field* field = get_field(opt_key/*, opt_index*/);
|
||||||
if (field != nullptr && find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){
|
if (field != nullptr && find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){
|
||||||
field->m_Label->SetForegroundColour(*get_modified_label_clr());
|
field->m_Label->SetForegroundColour(*get_modified_label_clr());
|
||||||
field->m_Undo_btn->Show();
|
field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(wxMSW ? var("action_undo.png") : var("arrow_undo.png")), wxBITMAP_TYPE_PNG));
|
||||||
|
|
||||||
m_dirty_options.push_back(opt_key);
|
m_dirty_options.push_back(opt_key);
|
||||||
}
|
}
|
||||||
|
@ -157,13 +157,13 @@ void Tab::update_dirty(){
|
||||||
|
|
||||||
// Delete undirty options from m_dirty_options
|
// Delete undirty options from m_dirty_options
|
||||||
size_t cnt = m_dirty_options.size();
|
size_t cnt = m_dirty_options.size();
|
||||||
for (auto i = 0; i < /*cnt*/m_dirty_options.size(); ++i)
|
for (auto i = 0; i < m_dirty_options.size(); ++i)
|
||||||
{
|
{
|
||||||
const std::string &opt_key = m_dirty_options[i];
|
const std::string &opt_key = m_dirty_options[i];
|
||||||
Field* field = get_field(opt_key/*, opt_index*/);
|
Field* field = get_field(opt_key/*, opt_index*/);
|
||||||
if (field != nullptr && find(dirty_options.begin(), dirty_options.end(), opt_key) == dirty_options.end())
|
if (field != nullptr && find(dirty_options.begin(), dirty_options.end(), opt_key) == dirty_options.end())
|
||||||
{
|
{
|
||||||
field->m_Undo_btn->Hide();
|
field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG));
|
||||||
field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT);
|
field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT);
|
||||||
std::vector<std::string>::iterator itr = find(m_dirty_options.begin(), m_dirty_options.end(), opt_key);
|
std::vector<std::string>::iterator itr = find(m_dirty_options.begin(), m_dirty_options.end(), opt_key);
|
||||||
if (itr != m_dirty_options.end()){
|
if (itr != m_dirty_options.end()){
|
||||||
|
@ -1774,6 +1774,11 @@ ConfigOptionsGroupShp Page::new_optgroup(wxString title, int noncommon_label_wid
|
||||||
//! });
|
//! });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
optgroup->m_get_initial_config = [this](){
|
||||||
|
DynamicPrintConfig config = static_cast<Tab*>(GetParent())->m_presets->get_selected_preset().config;
|
||||||
|
return config;
|
||||||
|
};
|
||||||
|
|
||||||
vsizer()->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 10);
|
vsizer()->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 10);
|
||||||
m_optgroups.push_back(optgroup);
|
m_optgroups.push_back(optgroup);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue