Temporary changes and code cleaning

This commit is contained in:
YuSanka 2018-10-03 15:14:52 +02:00
parent 9ce9b87e81
commit 8f6e3cc43b
11 changed files with 92 additions and 281 deletions

View file

@ -119,11 +119,6 @@ void break_to_debugger()
// #ys_FIXME_for_delete
std::vector<Tab *> g_tabs_list;
std::vector <std::shared_ptr<ConfigOptionsGroup>> m_optgroups;
double m_brim_width = 0.0;
size_t m_label_width = 100;
wxButton* g_wiping_dialog_button = nullptr;
//showed/hided controls according to the view mode
wxWindow *g_right_panel = nullptr;
wxBoxSizer *g_frequently_changed_parameters_sizer = nullptr;
@ -192,8 +187,6 @@ void set_objects_list_sizer(wxBoxSizer *objects_list_sizer){
g_object_list_sizer = objects_list_sizer;
}
static wxString dots("", wxConvUTF8);
void open_model(wxWindow *parent, wxArrayString& input_files){
auto dialog = new wxFileDialog(parent /*? parent : GetTopWindow()*/,
_(L("Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):")),
@ -432,11 +425,6 @@ void set_print_callback_event(Print *print, int id)
wxWindow* get_right_panel(){
return g_right_panel;
}
const size_t& label_width(){
return m_label_width;
}
void create_combochecklist(wxComboCtrl* comboCtrl, std::string text, std::string items, bool initial_value)
{
if (comboCtrl == nullptr)
@ -531,16 +519,18 @@ void set_model_events_from_perl(Model &model,
// add_collapsible_panes(parent, sizer);
}
void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFlexGridSizer* preset_sizer)
void Sidebar::add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer/*, wxFlexGridSizer* preset_sizer*/)
{
DynamicPrintConfig* config = &wxGetApp().preset_bundle->prints.get_edited_preset().config;
std::shared_ptr<ConfigOptionsGroup> optgroup = std::make_shared<ConfigOptionsGroup>(parent, "", config);
const wxArrayInt& ar = preset_sizer->GetColWidths();
m_label_width = ar.IsEmpty() ? 100 : ar.front()-4;
optgroup->label_width = m_label_width;
// const wxArrayInt& ar = preset_sizer->GetColWidths();
// m_label_width = ar.IsEmpty() ? 100 : ar.front()-4;
optgroup->label_width = 100;// m_label_width;
auto m_optgroups = get_optgroups();
//Frequently changed parameters
optgroup->m_on_change = [config](t_config_option_key opt_key, boost::any value){
optgroup->m_on_change = [config, m_optgroups](t_config_option_key opt_key, boost::any value){
TabPrint* tab_print = nullptr;
for (size_t i = 0; i < wxGetApp().tab_panel()->GetPageCount(); ++i) {
Tab *tab = dynamic_cast<Tab*>(wxGetApp().tab_panel()->GetPage(i));
@ -566,12 +556,12 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl
double brim_width = config->opt_float("brim_width");
if (boost::any_cast<bool>(value) == true)
{
new_val = m_brim_width == 0.0 ? 10 :
m_brim_width < 0.0 ? m_brim_width * (-1) :
m_brim_width;
new_val = 10;// m_brim_width == 0.0 ? 10 :
// m_brim_width < 0.0 ? m_brim_width * (-1) :
// m_brim_width;
}
else{
m_brim_width = brim_width * (-1);
// m_brim_width = brim_width * (-1);
new_val = 0;
}
new_conf.set_key_value("brim_width", new ConfigOptionFloat(new_val));
@ -617,7 +607,7 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl
option.opt.full_width = true;
optgroup->append_single_option_line(option);
m_brim_width = config->opt_float("brim_width");
auto m_brim_width = config->opt_float("brim_width");
def.label = L("Brim");
def.type = coBool;
def.tooltip = L("This flag enables the brim that will be printed around each object on the first layer.");
@ -628,7 +618,8 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl
Line line = { "", "" };
line.widget = [config](wxWindow* parent){
line.widget = [config, this](wxWindow* parent){
auto g_wiping_dialog_button = get_wiping_dialog_button();
g_wiping_dialog_button = new wxButton(parent, wxID_ANY, _(L("Purging volumes")) + dots, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
auto sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(g_wiping_dialog_button);
@ -655,26 +646,6 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl
sizer->Add(optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT, 2);
m_optgroups.push_back(optgroup);// ogFrequentlyChangingParameters
// Object List
add_objects_list(parent, sizer);
// Frequently Object Settings
add_object_settings(parent, sizer);
}
void show_frequently_changed_parameters(bool show)
{
g_frequently_changed_parameters_sizer->Show(show);
if (!show) return;
for (size_t i = 0; i < wxGetApp().tab_panel()->GetPageCount(); ++i) {
Tab *tab = dynamic_cast<Tab*>(wxGetApp().tab_panel()->GetPage(i));
if (!tab)
continue;
tab->update_wiping_button_visibility();
break;
}
}
void show_buttons(bool show)
@ -706,42 +677,14 @@ void show_object_name(bool show)
grid_sizer->Show(static_cast<size_t>(1), show);
}
void update_mode()
{
wxWindowUpdateLocker noUpdates(g_right_panel->GetParent());
ConfigMenuIDs mode = wxGetApp().get_view_mode();
g_object_list_sizer->Show(mode == ConfigMenuModeExpert);
show_info_sizer(mode == ConfigMenuModeExpert);
show_buttons(mode == ConfigMenuModeExpert);
show_object_name(mode == ConfigMenuModeSimple);
show_manipulation_sizer(mode == ConfigMenuModeSimple);
// TODO There is a not the best place of it!
// *** Update showing of the collpane_settings
// show_collpane_settings(mode == ConfigMenuModeExpert);
// *************************
g_right_panel->Layout();
g_right_panel->GetParent()->Layout();
}
bool is_expert_mode(){
return wxGetApp().get_view_mode() == ConfigMenuModeExpert;
}
ConfigOptionsGroup* get_optgroup(size_t i)
{
return m_optgroups.empty() ? nullptr : m_optgroups[i].get();
return wxGetApp().mainframe->m_plater->sidebar().get_optgroup(i);
// return m_optgroups.empty() ? nullptr : m_optgroups[i].get();
}
std::vector <std::shared_ptr<ConfigOptionsGroup>>& get_optgroups() {
return m_optgroups;
}
wxButton* get_wiping_dialog_button()
{
return g_wiping_dialog_button;
return wxGetApp().mainframe->m_plater->sidebar().get_optgroups();//m_optgroups;
}
wxWindow* export_option_creator(wxWindow* parent)

View file

@ -117,7 +117,6 @@ void set_gui_appctl();
void open_model(wxWindow *parent, wxArrayString& input_files);
wxWindow* get_right_panel();
const size_t& label_width();
Tab* get_tab(const std::string& name);
std::vector<PresetTab>* get_preset_tabs();
@ -150,9 +149,6 @@ void warning_catcher(wxWindow* parent, const wxString& message);
// to deliver a progress status message.
void set_print_callback_event(Print *print, int id);
// update right panel of the Plater according to view mode
void update_mode();
void show_info_sizer(const bool show);
// Creates a wxCheckListBoxComboPopup inside the given wxComboCtrl, filled with the given text and items.
@ -177,16 +173,12 @@ void set_model_events_from_perl(Model &model,
int event_remove_object,
int event_update_scene);
void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFlexGridSizer* preset_sizer);
// Update view mode according to selected menu
void update_mode();
bool is_expert_mode();
// Callback to trigger a configuration update timer on the Plater.
static PerlCallback g_on_request_update_callback;
ConfigOptionsGroup* get_optgroup(size_t i);
std::vector <std::shared_ptr<ConfigOptionsGroup>>& get_optgroups();
wxButton* get_wiping_dialog_button();
void add_export_option(wxFileDialog* dlg, const std::string& format);
int get_export_option(wxFileDialog* dlg);

View file

@ -26,6 +26,7 @@
#include "Preferences.hpp"
#include "Tab.hpp"
#include <I18N.hpp>
#include <wx/wupdlock.h>
namespace Slic3r {
namespace GUI {
@ -488,7 +489,22 @@ ConfigMenuIDs GUI_App::get_view_mode()
return mode == "expert" ? ConfigMenuModeExpert : ConfigMenuModeSimple;
}
static wxString dots("", wxConvUTF8);
// Update view mode according to selected menu
void GUI_App::update_mode()
{
wxWindowUpdateLocker noUpdates(/*g_right_panel->GetParent()*/mainframe);
ConfigMenuIDs mode = wxGetApp().get_view_mode();
// g_object_list_sizer->Show(mode == ConfigMenuModeExpert);
show_info_sizer(mode == ConfigMenuModeExpert);
// show_buttons(mode == ConfigMenuModeExpert);
// show_object_name(mode == ConfigMenuModeSimple);
show_manipulation_sizer(mode == ConfigMenuModeSimple);
/*g_right_panel*/mainframe->m_plater->Layout();
/*g_right_panel->GetParent()*/mainframe->Layout();
}
void GUI_App::add_config_menu(wxMenuBar *menu)
{

View file

@ -42,6 +42,8 @@ enum ConfigMenuIDs {
class Tab;
static wxString dots("", wxConvUTF8);
class GUI_App : public wxApp
{
bool no_plater{ false };
@ -112,6 +114,7 @@ public:
void get_installed_languages(wxArrayString & names, wxArrayLong & identifiers);
ConfigMenuIDs get_view_mode();
void update_mode();
void add_config_menu(wxMenuBar *menu);
bool check_unsaved_changes();

View file

@ -158,8 +158,6 @@ void init_mesh_icons(){
bool is_parts_changed(){return m_parts_changed;}
bool is_part_settings_changed(){ return m_part_settings_changed; }
static wxString dots("", wxConvUTF8);
void set_tooltip_for_item(const wxPoint& pt)
{
wxDataViewItem item;
@ -452,34 +450,7 @@ wxSizer* object_movers(wxWindow *win)
return optgroup->sizer;
}
wxBoxSizer* content_settings(wxWindow *win)
{
DynamicPrintConfig* config = &wxGetApp().preset_bundle->/*full_config();//*/printers.get_edited_preset().config; // TODO get config from Model_volume
std::shared_ptr<ConfigOptionsGroup> optgroup = std::make_shared<ConfigOptionsGroup>(win, "Extruders", config);
optgroup->label_width = label_width();
Option option = optgroup->get_option("extruder");
option.opt.default_value = new ConfigOptionInt(1);
optgroup->append_single_option_line(option);
get_optgroups().push_back(optgroup); // ogObjectSettings
auto sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(create_edit_object_buttons(win), 0, wxEXPAND, 0); // *** Edit Object Buttons***
sizer->Add(optgroup->sizer, 1, wxEXPAND | wxLEFT, 20);
auto add_btn = new wxButton(win, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
if (wxMSW) add_btn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
add_btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("add.png")), wxBITMAP_TYPE_PNG));
sizer->Add(add_btn, 0, wxALIGN_LEFT | wxLEFT, 20);
sizer->Add(object_movers(win), 0, wxEXPAND | wxLEFT, 20);
return sizer;
}
void add_objects_list(wxWindow* parent, wxBoxSizer* sizer)
void Sidebar::add_objects_list(wxWindow* parent, wxBoxSizer* sizer)
{
const auto ol_sizer = create_objects_list(parent);
sizer->Add(ol_sizer, 1, wxEXPAND | wxTOP, 20);
@ -535,13 +506,13 @@ Line add_og_to_object_settings(const std::string& option_name, const std::string
return line;
}
void add_object_settings(wxWindow* parent, wxBoxSizer* sizer)
void Sidebar::add_object_settings(wxWindow* parent, wxBoxSizer* sizer, t_optgroups& optgroups)
{
auto optgroup = std::make_shared<ConfigOptionsGroup>(parent, _(L("Object Settings")));
optgroup->label_width = 100;
optgroup->set_grid_vgap(5);
optgroup->m_on_change = [](t_config_option_key opt_key, boost::any value){
optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value){
if (opt_key == "scale_unit"){
const wxString& selection = boost::any_cast<wxString>(value);
std::vector<std::string> axes{ "x", "y", "z" };
@ -566,7 +537,6 @@ void add_object_settings(wxWindow* parent, wxBoxSizer* sizer)
def.default_value = new ConfigOptionString{ " " };
optgroup->append_single_option_line(Option(def, "object_name"));
// Legend for object modification
auto line = Line{ "", "" };
def.label = "";
@ -604,54 +574,7 @@ void add_object_settings(wxWindow* parent, wxBoxSizer* sizer)
optgroup->disable();
get_optgroups().push_back(optgroup); // ogFrequentlyObjectSettings
}
// add Collapsible Pane to sizer
wxCollapsiblePane* add_collapsible_pane(wxWindow* parent, wxBoxSizer* sizer_parent, const wxString& name, std::function<wxSizer *(wxWindow *)> content_function)
{
#ifdef __WXMSW__
auto *collpane = new PrusaCollapsiblePaneMSW(parent, wxID_ANY, name);
#else
auto *collpane = new PrusaCollapsiblePane/*wxCollapsiblePane*/(parent, wxID_ANY, name);
#endif // __WXMSW__
// add the pane with a zero proportion value to the sizer which contains it
sizer_parent->Add(collpane, 0, wxGROW | wxALL, 0);
wxWindow *win = collpane->GetPane();
wxSizer *sizer = content_function(win);
wxSizer *sizer_pane = new wxBoxSizer(wxVERTICAL);
sizer_pane->Add(sizer, 1, wxGROW | wxEXPAND | wxBOTTOM, 2);
win->SetSizer(sizer_pane);
// sizer_pane->SetSizeHints(win);
return collpane;
}
void add_collapsible_panes(wxWindow* parent, wxBoxSizer* sizer)
{
// *** Objects List ***
auto collpane = add_collapsible_pane(parent, sizer, "Objects List:", create_objects_list);
collpane->Bind(wxEVT_COLLAPSIBLEPANE_CHANGED, ([collpane](wxCommandEvent& e){
// wxWindowUpdateLocker noUpdates(g_right_panel);
if (collpane->IsCollapsed()) {
m_sizer_object_buttons->Show(false);
m_sizer_part_buttons->Show(false);
m_sizer_object_movers->Show(false);
if (!m_objects_ctrl->HasSelection())
m_collpane_settings->Show(false);
}
}));
// *** Object/Part Settings ***
m_collpane_settings = add_collapsible_pane(parent, sizer, "Object Settings", content_settings);
}
void show_collpane_settings(bool expert_mode)
{
m_collpane_settings->Show(expert_mode && !m_objects_model->IsEmpty());
optgroups.push_back(optgroup); // ogFrequentlyObjectSettings
}
void add_object_to_list(const std::string &name, ModelObject* model_object)
@ -695,17 +618,12 @@ void delete_object_from_list()
m_objects_model->Delete(item);
part_selection_changed();
// if (m_objects_model->IsEmpty())
// m_collpane_settings->Show(false);
}
void delete_all_objects_from_list()
{
m_objects_model->DeleteAll();
part_selection_changed();
// m_collpane_settings->Show(false);
}
void set_object_count(int idx, int count)
@ -1629,100 +1547,6 @@ void part_selection_changed()
m_selected_object_id = obj_idx;
update_settings_value();
/* wxWindowUpdateLocker noUpdates(get_right_panel());
m_move_options = Point3(0, 0, 0);
m_last_coords = Point3(0, 0, 0);
// reset move sliders
std::vector<std::string> opt_keys = {"x", "y", "z"};
auto og = get_optgroup(ogObjectMovers);
for (auto opt_key: opt_keys)
og->set_value(opt_key, int(0));
// if (!item || m_selected_object_id < 0){
if (m_selected_object_id < 0){
m_sizer_object_buttons->Show(false);
m_sizer_part_buttons->Show(false);
m_sizer_object_movers->Show(false);
m_collpane_settings->Show(false);
return;
}
m_collpane_settings->Show(true);
auto volume_id = m_objects_model->GetVolumeIdByItem(item);
if (volume_id < 0){
m_sizer_object_buttons->Show(true);
m_sizer_part_buttons->Show(false);
m_sizer_object_movers->Show(false);
m_collpane_settings->SetLabelText(_(L("Object Settings")) + ":");
// elsif($itemData->{type} eq 'object') {
// # select nothing in 3D preview
//
// # attach object config to settings panel
// $self->{optgroup_movers}->disable;
// $self->{staticbox}->SetLabel('Object Settings');
// @opt_keys = (map @{$_->get_keys}, Slic3r::Config::PrintObject->new, Slic3r::Config::PrintRegion->new);
// $config = $self->{model_object}->config;
// }
return;
}
m_collpane_settings->SetLabelText(_(L("Part Settings")) + ":");
m_sizer_object_buttons->Show(false);
m_sizer_part_buttons->Show(true);
m_sizer_object_movers->Show(true);
auto bb_size = m_objects[m_selected_object_id]->bounding_box().size();
int scale = 10; //??
m_mover_x->SetMin(-bb_size.x * 4 * scale);
m_mover_x->SetMax(bb_size.x * 4 * scale);
m_mover_y->SetMin(-bb_size.y * 4 * scale);
m_mover_y->SetMax(bb_size.y * 4 * scale);
m_mover_z->SetMin(-bb_size.z * 4 * scale);
m_mover_z->SetMax(bb_size.z * 4 * scale);
// my ($config, @opt_keys);
m_btn_move_up->Enable(volume_id > 0);
m_btn_move_down->Enable(volume_id + 1 < m_objects[m_selected_object_id]->volumes.size());
// attach volume config to settings panel
auto volume = m_objects[m_selected_object_id]->volumes[volume_id];
if (volume->modifier)
og->enable();
else
og->disable();
// auto config = volume->config;
// get default values
// @opt_keys = @{Slic3r::Config::PrintRegion->new->get_keys};
// }
/*
# get default values
my $default_config = Slic3r::Config::new_from_defaults_keys(\@opt_keys);
# append default extruder
push @opt_keys, 'extruder';
$default_config->set('extruder', 0);
$config->set_ifndef('extruder', 0);
$self->{settings_panel}->set_default_config($default_config);
$self->{settings_panel}->set_config($config);
$self->{settings_panel}->set_opt_keys(\@opt_keys);
$self->{settings_panel}->set_fixed_options([qw(extruder)]);
$self->{settings_panel}->enable;
}
*/
}
void set_extruder_column_hidden(bool hide)

View file

@ -1,5 +1,6 @@
#ifndef slic3r_GUI_ObjectParts_hpp_
#define slic3r_GUI_ObjectParts_hpp_
// #include "OptionsGroup.hpp"
class wxWindow;
class wxSizer;
@ -17,15 +18,13 @@ class ModelObject;
class Model;
namespace GUI {
//class wxGLCanvas;
class ConfigOptionsGroup;
using t_optgroups = std::vector <std::shared_ptr<ConfigOptionsGroup>>;
enum ogGroup{
ogFrequentlyChangingParameters,
ogFrequentlyObjectSettings,
ogCurrentSettings
// ogObjectSettings,
// ogObjectMovers,
// ogPartSettings
ogObjectSettings
};
enum LambdaTypeIDs{
@ -49,10 +48,8 @@ struct OBJECT_PARAMETERS
typedef std::map<std::string, wxBitmap> t_category_icon;
inline t_category_icon& get_category_icon();
void add_collapsible_panes(wxWindow* parent, wxBoxSizer* sizer);
void add_objects_list(wxWindow* parent, wxBoxSizer* sizer);
void add_object_settings(wxWindow* parent, wxBoxSizer* sizer);
void show_collpane_settings(bool expert_mode);
void add_object_settings(wxWindow* parent, wxBoxSizer* sizer, t_optgroups& optgroups);
wxMenu *create_add_settings_popupmenu(bool is_part);
wxMenu *create_add_part_popupmenu();

View file

@ -8,7 +8,6 @@ namespace Slic3r
{
namespace GUI
{
static wxString dots("", wxConvUTF8);
LambdaObjectDialog::LambdaObjectDialog(wxWindow* parent,
const wxString type_name):

View file

@ -23,8 +23,6 @@
namespace Slic3r {
namespace GUI {
static wxString dots("", wxConvUTF8);
MainFrame::MainFrame(const bool no_plater, const bool loaded) :
wxFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE),
m_no_plater(no_plater),

View file

@ -40,6 +40,7 @@
#include "slic3r/Utils/ASCIIFolding.hpp"
#include <wx/glcanvas.h> // Needs to be last because reasons :-/
#include "WipeTowerDialog.hpp"
namespace fs = boost::filesystem;
using Slic3r::_3DScene;
@ -222,6 +223,12 @@ struct Sidebar::priv
wxButton *btn_reslice;
// wxButton *btn_print; // XXX: remove
wxButton *btn_send_gcode;
std::vector <std::shared_ptr<ConfigOptionsGroup>> optgroups {};
double brim_width = 0.0;
size_t label_width = 100;
wxButton* btn_wiping_dialog {nullptr};
};
@ -265,7 +272,12 @@ Sidebar::Sidebar(wxWindow *parent)
// Frequently changed parameters
p->sizer_params = new wxBoxSizer(wxVERTICAL);
GUI::add_frequently_changed_parameters(p->scrolled, p->sizer_params, p->sizer_presets);
add_frequently_changed_parameters(p->scrolled, p->sizer_params/*, p->sizer_presets*/);
// Object List
add_objects_list(p->scrolled, p->sizer_params);
// Frequently Object Settings
add_object_settings(p->scrolled, p->sizer_params, p->optgroups);
// Buttons in the scrolled area
wxBitmap arrow_up(GUI::from_u8(Slic3r::var("brick_go.png")), wxBITMAP_TYPE_PNG);
@ -356,6 +368,20 @@ void Sidebar::update_presets(Preset::Type preset_type)
// wxTheApp->{preset_bundle}->export_selections(wxTheApp->{app_config});
}
ConfigOptionsGroup* Sidebar::get_optgroup(size_t i)
{
return p->optgroups.empty() ? nullptr : p->optgroups[i].get();
}
t_optgroups& Sidebar::get_optgroups() {
return p->optgroups;
}
wxButton* Sidebar::get_wiping_dialog_button()
{
return p->btn_wiping_dialog;
}
// Plater::Object

View file

@ -8,11 +8,15 @@
#include "Preset.hpp"
class wxBoxSizer;
namespace Slic3r {
namespace GUI {
class MainFrame;
class ConfigOptionsGroup;
using t_optgroups = std::vector <std::shared_ptr<ConfigOptionsGroup>>;
class Sidebar : public wxPanel
{
@ -25,6 +29,15 @@ public:
~Sidebar();
void update_presets(Slic3r::Preset::Type preset_type);
void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer);
void add_objects_list(wxWindow* parent, wxBoxSizer* sizer);
void add_object_settings(wxWindow* parent, wxBoxSizer* sizer, t_optgroups& optgroups);
ConfigOptionsGroup* get_optgroup(size_t i);
t_optgroups& get_optgroups();
wxButton* get_wiping_dialog_button();
private:
struct priv;
std::unique_ptr<priv> p;

View file

@ -33,9 +33,6 @@
namespace Slic3r {
namespace GUI {
static wxString dots("", wxConvUTF8);
// sub new
void Tab::create_preset_tab(PresetBundle *preset_bundle)
{
m_preset_bundle = preset_bundle;
@ -720,9 +717,12 @@ void Tab::update_wiping_button_visibility() {
bool multiple_extruders = dynamic_cast<ConfigOptionFloats*>((m_preset_bundle->printers.get_edited_preset().config).option("nozzle_diameter"))->values.size() > 1;
bool single_extruder_mm = dynamic_cast<ConfigOptionBool*>( (m_preset_bundle->printers.get_edited_preset().config).option("single_extruder_multi_material"))->value;
if (get_wiping_dialog_button()) {
get_wiping_dialog_button()->Show(wipe_tower_enabled && multiple_extruders && single_extruder_mm);
(get_wiping_dialog_button()->GetParent())->Layout();
if (!wxGetApp().mainframe)
return;
auto wiping_dialog_button = wxGetApp().mainframe->m_plater->sidebar().get_wiping_dialog_button();
if (wiping_dialog_button) {
wiping_dialog_button->Show(wipe_tower_enabled && multiple_extruders && single_extruder_mm);
wiping_dialog_button->GetParent()->Layout();
}
}