mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-16 03:07:55 -06:00
Completed UI to visualize changes and to reset to initial value
This commit is contained in:
parent
38dca8396f
commit
986ee50437
3 changed files with 57 additions and 19 deletions
|
@ -464,9 +464,8 @@ void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, b
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case coPoints:{
|
case coPoints:{
|
||||||
ConfigOptionPoints points;
|
ConfigOptionPoints* vec_new = new ConfigOptionPoints{ boost::any_cast<Pointf>(value) };
|
||||||
points.values = boost::any_cast<std::vector<Pointf>>(value);
|
config.option<ConfigOptionPoints>(opt_key)->set_at(vec_new, opt_index, 0);
|
||||||
config.set_key_value(opt_key, new ConfigOptionPoints(points));
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case coNone:
|
case coNone:
|
||||||
|
|
|
@ -293,6 +293,13 @@ void ConfigOptionsGroup::back_to_initial_value(const std::string opt_key)
|
||||||
auto *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(config.option("nozzle_diameter"));
|
auto *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(config.option("nozzle_diameter"));
|
||||||
value = int(nozzle_diameter->values.size());
|
value = int(nozzle_diameter->values.size());
|
||||||
}
|
}
|
||||||
|
else if (m_opt_map.find(opt_key) != m_opt_map.end())
|
||||||
|
{
|
||||||
|
auto opt_id = m_opt_map.find(opt_key)->first;
|
||||||
|
std::string opt_short_key = m_opt_map.at(opt_id).first;
|
||||||
|
int opt_index = m_opt_map.at(opt_id).second;
|
||||||
|
value = get_config_value(config, opt_short_key, opt_index);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
value = get_config_value(config, opt_key);
|
value = get_config_value(config, opt_key);
|
||||||
|
|
||||||
|
@ -360,7 +367,7 @@ boost::any ConfigOptionsGroup::get_config_value(DynamicPrintConfig& config, std:
|
||||||
double val = opt->type == coFloats ?
|
double val = opt->type == coFloats ?
|
||||||
config.opt_float(opt_key, idx) :
|
config.opt_float(opt_key, idx) :
|
||||||
opt->type == coFloat ? config.opt_float(opt_key) :
|
opt->type == coFloat ? config.opt_float(opt_key) :
|
||||||
config.option<ConfigOptionPercents>(opt_key)->values.at(idx);
|
config.option<ConfigOptionPercents>(opt_key)->get_at(idx);
|
||||||
ret = double_to_string(val);
|
ret = double_to_string(val);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -406,10 +413,8 @@ boost::any ConfigOptionsGroup::get_config_value(DynamicPrintConfig& config, std:
|
||||||
ret = static_cast<int>(config.option<ConfigOptionEnum<SeamPosition>>(opt_key)->value);
|
ret = static_cast<int>(config.option<ConfigOptionEnum<SeamPosition>>(opt_key)->value);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case coPoints:{
|
case coPoints:
|
||||||
const auto &value = *config.option<ConfigOptionPoints>(opt_key);
|
ret = config.option<ConfigOptionPoints>(opt_key)->get_at(idx);
|
||||||
ret = value.values.at(idx);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case coNone:
|
case coNone:
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -138,28 +138,62 @@ PageShp Tab::add_options_page(wxString title, std::string icon, bool is_extruder
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void add_correct_opts_to_dirty_options(const std::string &opt_key, std::vector<std::string> *vec, TabPrinter *tab)
|
||||||
|
{
|
||||||
|
auto opt_init = static_cast<T*>(tab->m_presets->get_selected_preset().config.option(opt_key));
|
||||||
|
auto opt_cur = static_cast<T*>(tab->m_config->option(opt_key));
|
||||||
|
int opt_init_max_id = opt_init->values.size()-1;
|
||||||
|
for (int i = 0; i < opt_cur->values.size(); i++)
|
||||||
|
{
|
||||||
|
int init_id = i <= opt_init_max_id ? i : 0;
|
||||||
|
if (opt_cur->values[i] != opt_init->values[init_id])
|
||||||
|
vec->emplace_back(opt_key + "#" + std::to_string(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Update the combo box label of the selected preset based on its "dirty" state,
|
// Update the combo box label of the selected preset based on its "dirty" state,
|
||||||
// comparing the selected preset config with $self->{config}.
|
// comparing the selected preset config with $self->{config}.
|
||||||
void Tab::update_dirty(){
|
void Tab::update_dirty(){
|
||||||
m_presets->update_dirty_ui(m_presets_choice);
|
m_presets->update_dirty_ui(m_presets_choice);
|
||||||
on_presets_changed();
|
on_presets_changed();
|
||||||
|
|
||||||
|
// Update UI according to changes
|
||||||
auto dirty_options = m_presets->current_dirty_options();
|
auto dirty_options = m_presets->current_dirty_options();
|
||||||
|
|
||||||
bool change_extruder_data = false;
|
|
||||||
|
|
||||||
if (name() == "printer"){
|
if (name() == "printer"){
|
||||||
TabPrinter* tab_printer = static_cast<TabPrinter*>(this);
|
// Update dirty_options in case changes of Extruder's options
|
||||||
if (tab_printer->m_initial_extruders_count != tab_printer->m_extruders_count){
|
TabPrinter* tab = static_cast<TabPrinter*>(this);
|
||||||
|
std::vector<std::string> new_dirty;
|
||||||
|
for (auto opt_key : dirty_options)
|
||||||
|
{
|
||||||
|
switch (m_config->option(opt_key)->type())
|
||||||
|
{
|
||||||
|
case coInts: add_correct_opts_to_dirty_options<ConfigOptionInts >(opt_key, &new_dirty, tab); break;
|
||||||
|
case coBools: add_correct_opts_to_dirty_options<ConfigOptionBools >(opt_key, &new_dirty, tab); break;
|
||||||
|
case coFloats: add_correct_opts_to_dirty_options<ConfigOptionFloats >(opt_key, &new_dirty, tab); break;
|
||||||
|
case coStrings: add_correct_opts_to_dirty_options<ConfigOptionStrings >(opt_key, &new_dirty, tab); break;
|
||||||
|
case coPercents:add_correct_opts_to_dirty_options<ConfigOptionPercents >(opt_key, &new_dirty, tab); break;
|
||||||
|
case coPoints: add_correct_opts_to_dirty_options<ConfigOptionPoints >(opt_key, &new_dirty, tab); break;
|
||||||
|
default: new_dirty.emplace_back(opt_key); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dirty_options.resize(0);
|
||||||
|
dirty_options = new_dirty;
|
||||||
|
if (tab->m_initial_extruders_count != tab->m_extruders_count){
|
||||||
dirty_options.emplace_back("extruders_count");
|
dirty_options.emplace_back("extruders_count");
|
||||||
change_extruder_data = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add new dirty options to m_dirty_options
|
// Add new dirty options to m_dirty_options
|
||||||
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);
|
||||||
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()){
|
||||||
if (field->m_Label != nullptr)
|
if (field->m_Label != nullptr){
|
||||||
field->m_Label->SetForegroundColour(*get_modified_label_clr());
|
field->m_Label->SetForegroundColour(*get_modified_label_clr());
|
||||||
|
field->m_Label->Refresh(true);
|
||||||
|
}
|
||||||
field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(wxMSW ? var("action_undo.png") : var("arrow_undo.png")), wxBITMAP_TYPE_PNG));
|
field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(wxMSW ? var("action_undo.png") : var("arrow_undo.png")), wxBITMAP_TYPE_PNG));
|
||||||
field->m_is_modified_value = true;
|
field->m_is_modified_value = true;
|
||||||
|
|
||||||
|
@ -168,16 +202,17 @@ 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();
|
|
||||||
for (auto i = 0; i < 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);
|
||||||
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->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG));
|
field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG));
|
||||||
if (field->m_Label != nullptr)
|
if (field->m_Label != nullptr){
|
||||||
field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT);
|
field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT);
|
||||||
|
field->m_Label->Refresh(true);
|
||||||
|
}
|
||||||
field->m_is_modified_value = false;
|
field->m_is_modified_value = false;
|
||||||
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()){
|
||||||
|
@ -271,7 +306,6 @@ void Tab::load_config(DynamicPrintConfig config)
|
||||||
}
|
}
|
||||||
change_opt_value(*m_config, opt_key, value, opt_index);
|
change_opt_value(*m_config, opt_key, value, opt_index);
|
||||||
modified = 1;
|
modified = 1;
|
||||||
// get_field(opt_key)->m_Label->SetBackgroundColour(*get_modified_label_clr());
|
|
||||||
}
|
}
|
||||||
if (modified) {
|
if (modified) {
|
||||||
update_dirty();
|
update_dirty();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue