Fixed highlighting of the searched option

+ Create controls only on the shown and active tab
+ Line class : deleted unused sizer
+ In GUI_Utils added TaskTimer class for the print a time of some task duration
+ BedShapeDialog:: activated options_groups
+ commented some unused code
This commit is contained in:
YuSanka 2020-09-24 15:41:48 +02:00
parent 52e6050698
commit 8fb3a44a4e
10 changed files with 186 additions and 106 deletions

View file

@ -229,9 +229,11 @@ void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const Conf
auto optgroup = init_shape_options_page(BedShape::get_name(BedShape::Type::Rectangular)); auto optgroup = init_shape_options_page(BedShape::get_name(BedShape::Type::Rectangular));
BedShape::append_option_line(optgroup, BedShape::Parameter::RectSize); BedShape::append_option_line(optgroup, BedShape::Parameter::RectSize);
BedShape::append_option_line(optgroup, BedShape::Parameter::RectOrigin); BedShape::append_option_line(optgroup, BedShape::Parameter::RectOrigin);
optgroup->activate();
optgroup = init_shape_options_page(BedShape::get_name(BedShape::Type::Circular)); optgroup = init_shape_options_page(BedShape::get_name(BedShape::Type::Circular));
BedShape::append_option_line(optgroup, BedShape::Parameter::Diameter); BedShape::append_option_line(optgroup, BedShape::Parameter::Diameter);
optgroup->activate();
optgroup = init_shape_options_page(BedShape::get_name(BedShape::Type::Custom)); optgroup = init_shape_options_page(BedShape::get_name(BedShape::Type::Custom));

View file

@ -68,8 +68,6 @@
#include <shlobj.h> #include <shlobj.h>
#endif // __WXMSW__ #endif // __WXMSW__
#include <chrono>
#if ENABLE_THUMBNAIL_GENERATOR_DEBUG #if ENABLE_THUMBNAIL_GENERATOR_DEBUG
#include <boost/beast/core/detail/base64.hpp> #include <boost/beast/core/detail/base64.hpp>
#include <boost/nowide/fstream.hpp> #include <boost/nowide/fstream.hpp>
@ -80,32 +78,6 @@ namespace GUI {
class MainFrame; class MainFrame;
class TaskTimer
{
std::chrono::milliseconds start_timer;
std::string task_name;
public:
TaskTimer(std::string task_name):
task_name(task_name.empty() ? "task" : task_name)
{
start_timer = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch());
}
~TaskTimer()
{
std::chrono::milliseconds stop_timer = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch());
auto process_duration = std::chrono::milliseconds(stop_timer - start_timer).count();
std::string out = (boost::format("\n!!! %1% duration = %2% ms \n\n") % task_name % process_duration).str();
printf(out.c_str());
#ifdef __WXMSW__
std::wstring stemp = std::wstring(out.begin(), out.end());
OutputDebugString(stemp.c_str());
#endif
}
};
class SplashScreen : public wxSplashScreen class SplashScreen : public wxSplashScreen
{ {
public: public:
@ -753,9 +725,11 @@ bool GUI_App::on_init_inner()
#endif // ENABLE_GCODE_VIEWER #endif // ENABLE_GCODE_VIEWER
scrn->SetText(_L("Creating settings tabs...")); scrn->SetText(_L("Creating settings tabs..."));
TaskTimer timer2("Creating settings tabs");
mainframe = new MainFrame(); mainframe = new MainFrame();
// hide settings tabs after first Layout // hide settings tabs after first Layout
mainframe->select_tab(0); mainframe->select_tab(size_t(0));
sidebar().obj_list()->init_objects(); // propagate model objects to object list sidebar().obj_list()->init_objects(); // propagate model objects to object list
// update_mode(); // !!! do that later // update_mode(); // !!! do that later
@ -1007,7 +981,7 @@ void GUI_App::recreate_GUI(const wxString& msg_name)
MainFrame *old_main_frame = mainframe; MainFrame *old_main_frame = mainframe;
mainframe = new MainFrame(); mainframe = new MainFrame();
// hide settings tabs after first Layout // hide settings tabs after first Layout
mainframe->select_tab(0); mainframe->select_tab(size_t(0));
// Propagate model objects to object list. // Propagate model objects to object list.
sidebar().obj_list()->init_objects(); sidebar().obj_list()->init_objects();
SetTopWindow(mainframe); SetTopWindow(mainframe);
@ -1456,7 +1430,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
// hide full main_sizer for mainFrame // hide full main_sizer for mainFrame
mainframe->GetSizer()->Show(false); mainframe->GetSizer()->Show(false);
mainframe->update_layout(); mainframe->update_layout();
mainframe->select_tab(0); mainframe->select_tab(size_t(0));
} }
break; break;
} }

View file

@ -18,6 +18,8 @@
#include <wx/debug.h> #include <wx/debug.h>
#include <wx/settings.h> #include <wx/settings.h>
#include <chrono>
#include "Event.hpp" #include "Event.hpp"
class wxCheckBox; class wxCheckBox;
@ -396,6 +398,32 @@ inline int hex_digit_to_int(const char c)
} }
#endif // ENABLE_GCODE_VIEWER #endif // ENABLE_GCODE_VIEWER
class TaskTimer
{
std::chrono::milliseconds start_timer;
std::string task_name;
public:
TaskTimer(std::string task_name):
task_name(task_name.empty() ? "task" : task_name)
{
start_timer = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch());
}
~TaskTimer()
{
std::chrono::milliseconds stop_timer = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch());
auto process_duration = std::chrono::milliseconds(stop_timer - start_timer).count();
std::string out = (boost::format("\n!!! %1% duration = %2% ms \n\n") % task_name % process_duration).str();
printf(out.c_str());
#ifdef __WXMSW__
std::wstring stemp = std::wstring(out.begin(), out.end());
OutputDebugString(stemp.c_str());
#endif
}
};
}} }}
#endif #endif

View file

@ -595,7 +595,7 @@ void MainFrame::init_tabpanel()
m_last_selected_tab = m_tabpanel->GetSelection(); m_last_selected_tab = m_tabpanel->GetSelection();
} }
else else
select_tab(0); // select Plater select_tab(size_t(0)); // select Plater
}); });
m_plater = new Plater(this, this); m_plater = new Plater(this, this);
@ -650,6 +650,24 @@ void MainFrame::add_created_tab(Tab* panel)
m_tabpanel->AddPage(panel, panel->title()); m_tabpanel->AddPage(panel, panel->title());
} }
bool MainFrame::is_active_and_shown_tab(Tab* tab)
{
if (!this)
return false;
int page_id = m_tabpanel->FindPage(tab);
if (m_tabpanel->GetSelection() != page_id)
return false;
if (m_layout == ESettingsLayout::Dlg)
return m_settings_dialog.IsShown();
if (m_layout == ESettingsLayout::New)
return m_main_sizer->IsShown(m_tabpanel);
return true;
}
bool MainFrame::can_start_new_project() const bool MainFrame::can_start_new_project() const
{ {
return (m_plater != nullptr) && !m_plater->model().objects.empty(); return (m_plater != nullptr) && !m_plater->model().objects.empty();
@ -1167,7 +1185,7 @@ void MainFrame::init_menubar()
{ {
if (m_plater) { if (m_plater) {
append_menu_item(windowMenu, wxID_HIGHEST + 1, _L("&Plater Tab") + "\tCtrl+1", _L("Show the plater"), append_menu_item(windowMenu, wxID_HIGHEST + 1, _L("&Plater Tab") + "\tCtrl+1", _L("Show the plater"),
[this](wxCommandEvent&) { select_tab(0); }, "plater", nullptr, [this](wxCommandEvent&) { select_tab(size_t(0)); }, "plater", nullptr,
[this]() {return true; }, this); [this]() {return true; }, this);
windowMenu->AppendSeparator(); windowMenu->AppendSeparator();
} }
@ -1723,9 +1741,35 @@ void MainFrame::load_config(const DynamicPrintConfig& config)
#endif #endif
} }
void MainFrame::select_tab(Tab* tab)
{
if (!tab)
return;
int page_idx = m_tabpanel->FindPage(tab);
if (page_idx != wxNOT_FOUND && m_layout == ESettingsLayout::Dlg)
page_idx++;
select_tab(size_t(page_idx));
}
void MainFrame::select_tab(size_t tab/* = size_t(-1)*/) void MainFrame::select_tab(size_t tab/* = size_t(-1)*/)
{ {
bool tabpanel_was_hidden = false; bool tabpanel_was_hidden = false;
// Controls on page are created on active page of active tab now.
// We should select/activate tab before its showing to avoid an UI-flickering
auto select = [this, tab](bool was_hidden) {
// when tab == -1, it means we should show the last selected tab
size_t new_selection = tab == (size_t)(-1) ? m_last_selected_tab : (m_layout == ESettingsLayout::Dlg && tab != 0) ? tab - 1 : tab;
if (m_tabpanel->GetSelection() != new_selection)
m_tabpanel->SetSelection(new_selection);
else if (was_hidden) {
Tab* cur_tab = dynamic_cast<Tab*>(m_tabpanel->GetPage(new_selection));
if (cur_tab)
cur_tab->OnActivate();
}
};
if (m_layout == ESettingsLayout::Dlg) { if (m_layout == ESettingsLayout::Dlg) {
if (tab==0) { if (tab==0) {
if (m_settings_dialog.IsShown()) if (m_settings_dialog.IsShown())
@ -1739,14 +1783,20 @@ void MainFrame::select_tab(size_t tab/* = size_t(-1)*/)
#ifdef __WXOSX__ // Don't call SetFont under OSX to avoid name cutting in ObjectList #ifdef __WXOSX__ // Don't call SetFont under OSX to avoid name cutting in ObjectList
if (m_settings_dialog.IsShown()) if (m_settings_dialog.IsShown())
m_settings_dialog.Hide(); m_settings_dialog.Hide();
else
tabpanel_was_hidden = true;
select(tabpanel_was_hidden);
m_tabpanel->Show(); m_tabpanel->Show();
m_settings_dialog.Show(); m_settings_dialog.Show();
#else #else
if (m_settings_dialog.IsShown()) if (m_settings_dialog.IsShown()) {
select(false);
m_settings_dialog.SetFocus(); m_settings_dialog.SetFocus();
}
else { else {
tabpanel_was_hidden = true; tabpanel_was_hidden = true;
select(tabpanel_was_hidden);
m_tabpanel->Show(); m_tabpanel->Show();
m_settings_dialog.Show(); m_settings_dialog.Show();
} }
@ -1755,6 +1805,7 @@ void MainFrame::select_tab(size_t tab/* = size_t(-1)*/)
else if (m_layout == ESettingsLayout::New) { else if (m_layout == ESettingsLayout::New) {
m_main_sizer->Show(m_plater, tab == 0); m_main_sizer->Show(m_plater, tab == 0);
tabpanel_was_hidden = !m_main_sizer->IsShown(m_tabpanel); tabpanel_was_hidden = !m_main_sizer->IsShown(m_tabpanel);
select(tabpanel_was_hidden);
m_main_sizer->Show(m_tabpanel, tab != 0); m_main_sizer->Show(m_tabpanel, tab != 0);
// plater should be focused for correct navigation inside search window // plater should be focused for correct navigation inside search window
@ -1762,17 +1813,23 @@ void MainFrame::select_tab(size_t tab/* = size_t(-1)*/)
m_plater->SetFocus(); m_plater->SetFocus();
Layout(); Layout();
} }
else
select(false);
// When we run application in ESettingsLayout::New or ESettingsLayout::Dlg mode, tabpanel is hidden from the very beginning // When we run application in ESettingsLayout::New or ESettingsLayout::Dlg mode, tabpanel is hidden from the very beginning
// and as a result Tab::update_changed_tree_ui() function couldn't update m_is_nonsys_values values, // and as a result Tab::update_changed_tree_ui() function couldn't update m_is_nonsys_values values,
// which are used for update TreeCtrl and "revert_buttons". // which are used for update TreeCtrl and "revert_buttons".
// So, force the call of this function for Tabs, if tab panel was hidden // So, force the call of this function for Tabs, if tab panel was hidden
if (tabpanel_was_hidden) if (tabpanel_was_hidden)
for (auto tab : wxGetApp().tabs_list) for (auto cur_tab : wxGetApp().tabs_list)
tab->update_changed_tree_ui(); cur_tab->update_changed_tree_ui();
// when tab == -1, it means we should show the last selected tab //// when tab == -1, it means we should show the last selected tab
m_tabpanel->SetSelection(tab == (size_t)(-1) ? m_last_selected_tab : (m_layout == ESettingsLayout::Dlg && tab != 0) ? tab - 1 : tab); //size_t new_selection = tab == (size_t)(-1) ? m_last_selected_tab : (m_layout == ESettingsLayout::Dlg && tab != 0) ? tab - 1 : tab;
//if (m_tabpanel->GetSelection() != new_selection)
// m_tabpanel->SetSelection(new_selection);
//if (tabpanel_was_hidden)
// static_cast<Tab*>(m_tabpanel->GetPage(new_selection))->OnActivate();
} }
// Set a camera direction, zoom to all objects. // Set a camera direction, zoom to all objects.
@ -1919,7 +1976,7 @@ SettingsDialog::SettingsDialog(MainFrame* mainframe)
auto key_up_handker = [this](wxKeyEvent& evt) { auto key_up_handker = [this](wxKeyEvent& evt) {
if ((evt.GetModifiers() & wxMOD_CONTROL) != 0) { if ((evt.GetModifiers() & wxMOD_CONTROL) != 0) {
switch (evt.GetKeyCode()) { switch (evt.GetKeyCode()) {
case '1': { m_main_frame->select_tab(0); break; } case '1': { m_main_frame->select_tab(size_t(0)); break; }
case '2': { m_main_frame->select_tab(1); break; } case '2': { m_main_frame->select_tab(1); break; }
case '3': { m_main_frame->select_tab(2); break; } case '3': { m_main_frame->select_tab(2); break; }
case '4': { m_main_frame->select_tab(3); break; } case '4': { m_main_frame->select_tab(3); break; }

View file

@ -159,6 +159,7 @@ public:
void init_tabpanel(); void init_tabpanel();
void create_preset_tabs(); void create_preset_tabs();
void add_created_tab(Tab* panel); void add_created_tab(Tab* panel);
bool is_active_and_shown_tab(Tab* tab);
#if ENABLE_GCODE_VIEWER #if ENABLE_GCODE_VIEWER
void init_menubar_as_editor(); void init_menubar_as_editor();
void init_menubar_as_gcodeviewer(); void init_menubar_as_gcodeviewer();
@ -184,6 +185,7 @@ public:
void load_config(const DynamicPrintConfig& config); void load_config(const DynamicPrintConfig& config);
// Select tab in m_tabpanel // Select tab in m_tabpanel
// When tab == -1, will be selected last selected tab // When tab == -1, will be selected last selected tab
void select_tab(Tab* tab);
void select_tab(size_t tab = size_t(-1)); void select_tab(size_t tab = size_t(-1));
void select_view(const std::string& direction); void select_view(const std::string& direction);
// Propagate changed configuration from the Tab to the Plater and save changes to the AppConfig // Propagate changed configuration from the Tab to the Plater and save changes to the AppConfig

View file

@ -138,7 +138,6 @@ void OptionsGroup::append_line(const Line& line)
m_lines.emplace_back(line); m_lines.emplace_back(line);
if (line.full_width && ( if (line.full_width && (
line.sizer != nullptr ||
line.widget != nullptr || line.widget != nullptr ||
!line.get_extra_widgets().empty()) !line.get_extra_widgets().empty())
) )
@ -156,14 +155,9 @@ void OptionsGroup::append_line(const Line& line)
void OptionsGroup::activate_line(Line& line) void OptionsGroup::activate_line(Line& line)
{ {
if (line.full_width && ( if (line.full_width && (
line.sizer != nullptr ||
line.widget != nullptr || line.widget != nullptr ||
!line.get_extra_widgets().empty()) !line.get_extra_widgets().empty())
) { ) {
if (line.sizer != nullptr) {
sizer->Add(line.sizer, 0, wxEXPAND | wxALL, wxOSX ? 0 : 15);
return;
}
if (line.widget != nullptr) { if (line.widget != nullptr) {
sizer->Add(line.widget(this->ctrl_parent()), 0, wxEXPAND | wxALL, wxOSX ? 0 : 15); sizer->Add(line.widget(this->ctrl_parent()), 0, wxEXPAND | wxALL, wxOSX ? 0 : 15);
return; return;
@ -585,7 +579,7 @@ bool ConfigOptionsGroup::is_visible(ConfigOptionMode mode)
bool ConfigOptionsGroup::update_visibility(ConfigOptionMode mode) bool ConfigOptionsGroup::update_visibility(ConfigOptionMode mode)
{ {
if (m_options_mode.empty()) if (m_options_mode.empty() || !m_grid_sizer)
return true; return true;
int opt_mode_size = m_options_mode.size(); int opt_mode_size = m_options_mode.size();
if (m_grid_sizer->GetEffectiveRowsCount() != opt_mode_size && if (m_grid_sizer->GetEffectiveRowsCount() != opt_mode_size &&

View file

@ -49,7 +49,6 @@ public:
wxString label_tooltip {wxString("")}; wxString label_tooltip {wxString("")};
size_t full_width {0}; size_t full_width {0};
wxStaticText** full_Label {nullptr}; wxStaticText** full_Label {nullptr};
wxSizer* sizer {nullptr};
widget_t widget {nullptr}; widget_t widget {nullptr};
std::function<wxWindow*(wxWindow*)> near_label_widget{ nullptr }; std::function<wxWindow*(wxWindow*)> near_label_widget{ nullptr };

View file

@ -305,11 +305,12 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) :
if (!tab_print) return; if (!tab_print) return;
if (opt_key == "fill_density") { if (opt_key == "fill_density") {
value = m_og->get_config_value(*config, opt_key); tab_print->update_dirty();
tab_print->set_value(opt_key, value); tab_print->reload_config();
tab_print->update(); tab_print->update();
} }
else{ else
{
DynamicPrintConfig new_conf = *config; DynamicPrintConfig new_conf = *config;
if (opt_key == "brim") { if (opt_key == "brim") {
double new_val; double new_val;
@ -350,8 +351,6 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) :
} }
tab_print->load_config(new_conf); tab_print->load_config(new_conf);
} }
tab_print->update_dirty();
}; };
@ -982,7 +981,7 @@ void Sidebar::jump_to_option(size_t selected)
wxGetApp().get_tab(opt.type)->activate_option(boost::nowide::narrow(opt.opt_key), boost::nowide::narrow(opt.category)); wxGetApp().get_tab(opt.type)->activate_option(boost::nowide::narrow(opt.opt_key), boost::nowide::narrow(opt.category));
// Switch to the Settings NotePad // Switch to the Settings NotePad
wxGetApp().mainframe->select_tab(); // wxGetApp().mainframe->select_tab();
} }
ObjectManipulation* Sidebar::obj_manipul() ObjectManipulation* Sidebar::obj_manipul()

View file

@ -67,8 +67,10 @@ void Tab::Highlighter::invalidate()
{ {
timer.Stop(); timer.Stop();
bbmp->invalidate(); if (bbmp) {
bbmp = nullptr; bbmp->invalidate();
bbmp = nullptr;
}
blink_counter = 0; blink_counter = 0;
} }
@ -385,19 +387,24 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str
void Tab::OnActivate() void Tab::OnActivate()
{ {
#ifdef __WXOSX__
wxWindowUpdateLocker noUpdates(this); wxWindowUpdateLocker noUpdates(this);
#ifdef __WXOSX__
// wxWindowUpdateLocker noUpdates(this);
auto size = GetSizer()->GetSize(); auto size = GetSizer()->GetSize();
m_tmp_panel->GetSizer()->SetMinSize(size.x + m_size_move, size.y); m_tmp_panel->GetSizer()->SetMinSize(size.x + m_size_move, size.y);
Fit(); Fit();
m_size_move *= -1; m_size_move *= -1;
#endif // __WXOSX__ #endif // __WXOSX__
// create controls on active page
active_selected_page();
m_active_page->Show();
m_hsizer->Layout();
Refresh();
} }
void Tab::update_labels_colour() void Tab::update_labels_colour()
{ {
// Freeze();
//update options "decoration" //update options "decoration"
for (const auto opt : m_options_list) for (const auto opt : m_options_list)
{ {
@ -426,7 +433,6 @@ void Tab::update_labels_colour()
if (field == nullptr) continue; if (field == nullptr) continue;
field->set_label_colour_force(color); field->set_label_colour_force(color);
} }
// Thaw();
auto cur_item = m_treectrl->GetFirstVisibleItem(); auto cur_item = m_treectrl->GetFirstVisibleItem();
if (!cur_item || !m_treectrl->IsVisible(cur_item)) if (!cur_item || !m_treectrl->IsVisible(cur_item))
@ -722,6 +728,8 @@ void Tab::update_undo_buttons()
void Tab::on_roll_back_value(const bool to_sys /*= true*/) void Tab::on_roll_back_value(const bool to_sys /*= true*/)
{ {
if (!m_active_page) return;
int os; int os;
if (to_sys) { if (to_sys) {
if (!m_is_nonsys_values) return; if (!m_is_nonsys_values) return;
@ -734,10 +742,10 @@ void Tab::on_roll_back_value(const bool to_sys /*= true*/)
m_postpone_update_ui = true; m_postpone_update_ui = true;
auto selection = m_treectrl->GetItemText(m_treectrl->GetSelection()); //auto selection = m_treectrl->GetItemText(m_treectrl->GetSelection());
for (auto page : m_pages) //for (auto page : m_pages)
if (_(page->title()) == selection) { // if (_(page->title()) == selection) {
for (auto group : page->m_optgroups) { for (auto group : /*page*/m_active_page->m_optgroups) {
if (group->title == "Capabilities") { if (group->title == "Capabilities") {
if ((m_options_list["extruders_count"] & os) == 0) if ((m_options_list["extruders_count"] & os) == 0)
to_sys ? group->back_to_sys_value("extruders_count") : group->back_to_initial_value("extruders_count"); to_sys ? group->back_to_sys_value("extruders_count") : group->back_to_initial_value("extruders_count");
@ -778,8 +786,8 @@ void Tab::on_roll_back_value(const bool to_sys /*= true*/)
to_sys ? group->back_to_sys_value(opt_key) : group->back_to_initial_value(opt_key); to_sys ? group->back_to_sys_value(opt_key) : group->back_to_initial_value(opt_key);
} }
} }
break; // break;
} //}
m_postpone_update_ui = false; m_postpone_update_ui = false;
update_changed_ui(); update_changed_ui();
@ -819,10 +827,10 @@ void Tab::load_config(const DynamicPrintConfig& config)
// Reload current $self->{config} (aka $self->{presets}->edited_preset->config) into the UI fields. // Reload current $self->{config} (aka $self->{presets}->edited_preset->config) into the UI fields.
void Tab::reload_config() void Tab::reload_config()
{ {
// Freeze(); //for (auto page : m_pages)
for (auto page : m_pages) // page->reload_config();
page->reload_config(); if (m_active_page)
// Thaw(); m_active_page->reload_config();
} }
void Tab::update_mode() void Tab::update_mode()
@ -884,8 +892,6 @@ void Tab::msw_rescale()
// rescale options_groups // rescale options_groups
if (m_active_page) if (m_active_page)
m_active_page->msw_rescale(); m_active_page->msw_rescale();
//for (auto page : m_pages)
// page->msw_rescale();
Layout(); Layout();
} }
@ -918,14 +924,16 @@ void Tab::sys_color_changed()
update_labels_colour(); update_labels_colour();
// update options_groups // update options_groups
for (auto page : m_pages) if (m_active_page)
page->sys_color_changed(); m_active_page->msw_rescale();
Layout(); Layout();
} }
Field* Tab::get_field(const t_config_option_key& opt_key, int opt_index/* = -1*/) const Field* Tab::get_field(const t_config_option_key& opt_key, int opt_index/* = -1*/) const
{ {
return m_active_page ? m_active_page->get_field(opt_key, opt_index) : nullptr;
Field* field = nullptr; Field* field = nullptr;
for (auto page : m_pages) { for (auto page : m_pages) {
field = page->get_field(opt_key, opt_index); field = page->get_field(opt_key, opt_index);
@ -960,14 +968,14 @@ void Tab::toggle_option(const std::string& opt_key, bool toggle, int opt_index/*
// Set a key/value pair on this page. Return true if the value has been modified. // Set a key/value pair on this page. Return true if the value has been modified.
// Currently used for distributing extruders_count over preset pages of Slic3r::GUI::Tab::Printer // Currently used for distributing extruders_count over preset pages of Slic3r::GUI::Tab::Printer
// after a preset is loaded. // after a preset is loaded.
bool Tab::set_value(const t_config_option_key& opt_key, const boost::any& value) { //bool Tab::set_value(const t_config_option_key& opt_key, const boost::any& value) {
bool changed = false; // bool changed = false;
for(auto page: m_pages) { // for(auto page: m_pages) {
if (page->set_value(opt_key, value)) // if (page->set_value(opt_key, value))
changed = true; // changed = true;
} // }
return changed; // return changed;
} //}
// To be called by custom widgets, load a value into a config, // To be called by custom widgets, load a value into a config,
// update the preset selection boxes (the dirty flags) // update the preset selection boxes (the dirty flags)
@ -1020,7 +1028,7 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value)
if (opt_key == "pad_around_object") { if (opt_key == "pad_around_object") {
for (PageShp &pg : m_pages) { for (PageShp &pg : m_pages) {
Field * fld = pg->get_field(opt_key); Field * fld = pg->get_field(opt_key); /// !!! ysFIXME ????
if (fld) fld->set_value(value, false); if (fld) fld->set_value(value, false);
} }
} }
@ -1064,11 +1072,20 @@ void Tab::update_wiping_button_visibility() {
void Tab::activate_option(const std::string& opt_key, const wxString& category) void Tab::activate_option(const std::string& opt_key, const wxString& category)
{ {
Page* page {nullptr}; // wxWindowUpdateLocker noUpdates(this);
Field* field = get_field(opt_key, &page);
// we should to activate a tab with searched option, if it doesn't.
//if (!wxGetApp().mainframe->is_active_tab(this)) {
// wxNotebook* tap_panel = wxGetApp().tab_panel();
// tap_panel->SetSelection(tap_panel->FindPage(this));
//}
// Page* page {nullptr};
// Field* field = get_field(opt_key, &page);
// for option, which doesn't have field but just a text or button // for option, which doesn't have field but just a text or button
wxString page_title = (!field || !page) ? category : page->title(); // wxString page_title = (!field || !page) ? category : page->title();
wxString page_title = _(category);
auto cur_item = m_treectrl->GetFirstVisibleItem(); auto cur_item = m_treectrl->GetFirstVisibleItem();
if (!cur_item || !m_treectrl->IsVisible(cur_item)) if (!cur_item || !m_treectrl->IsVisible(cur_item))
@ -1076,7 +1093,7 @@ void Tab::activate_option(const std::string& opt_key, const wxString& category)
while (cur_item) { while (cur_item) {
auto title = m_treectrl->GetItemText(cur_item); auto title = m_treectrl->GetItemText(cur_item);
if (_(page_title) != title) { if (page_title != title) {
cur_item = m_treectrl->GetNextVisible(cur_item); cur_item = m_treectrl->GetNextVisible(cur_item);
continue; continue;
} }
@ -1086,10 +1103,14 @@ void Tab::activate_option(const std::string& opt_key, const wxString& category)
} }
// we should to activate a tab with searched option, if it doesn't. // we should to activate a tab with searched option, if it doesn't.
wxNotebook* tap_panel = wxGetApp().tab_panel(); wxGetApp().mainframe->select_tab(this);
int page_id = tap_panel->FindPage(this); Field* field = get_field(opt_key);
if (tap_panel->GetSelection() != page_id)
tap_panel->SetSelection(page_id); // we should to activate a tab with searched option, if it doesn't.
//wxNotebook* tap_panel = wxGetApp().tab_panel();
//int page_id = tap_panel->FindPage(this);
//if (tap_panel->GetSelection() != page_id)
// tap_panel->SetSelection(page_id);
// focused selected field // focused selected field
if (field) { if (field) {
@ -1973,7 +1994,7 @@ bool Tab::current_preset_is_dirty()
{ {
return m_presets->current_is_dirty(); return m_presets->current_is_dirty();
} }
/*
void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup)
{ {
const PrinterTechnology tech = m_presets->get_selected_preset().printer_technology(); const PrinterTechnology tech = m_presets->get_selected_preset().printer_technology();
@ -2090,7 +2111,7 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup)
\tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n\ \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n\
\tTo use a custom CA file, please import your CA file into Certificate Store / Keychain."))) % SLIC3R_APP_NAME).str() \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain."))) % SLIC3R_APP_NAME).str()
% std::string(ca_file_hint.ToUTF8())).str())); % std::string(ca_file_hint.ToUTF8())).str()));
*/ txt->SetFont(Slic3r::GUI::wxGetApp().normal_font()); * / txt->SetFont(Slic3r::GUI::wxGetApp().normal_font());
auto sizer = new wxBoxSizer(wxHORIZONTAL); auto sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(txt, 1, wxEXPAND); sizer->Add(txt, 1, wxEXPAND);
return sizer; return sizer;
@ -2099,7 +2120,7 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup)
optgroup->append_line(line); optgroup->append_line(line);
} }
} }
*/
void TabPrinter::build() void TabPrinter::build()
{ {
m_presets = &m_preset_bundle->printers; m_presets = &m_preset_bundle->printers;
@ -2423,14 +2444,14 @@ void TabPrinter::build_sla()
build_preset_description_line(optgroup.get()); build_preset_description_line(optgroup.get());
} }
/*
void TabPrinter::update_serial_ports() void TabPrinter::update_serial_ports()
{ {
Field *field = get_field("serial_port"); Field *field = get_field("serial_port");
Choice *choice = static_cast<Choice *>(field); Choice *choice = static_cast<Choice *>(field);
choice->set_values(Utils::scan_serial_ports()); choice->set_values(Utils::scan_serial_ports());
} }
*/
void TabPrinter::extruders_count_changed(size_t extruders_count) void TabPrinter::extruders_count_changed(size_t extruders_count)
{ {
bool is_count_changed = false; bool is_count_changed = false;
@ -2728,7 +2749,7 @@ void TabPrinter::on_preset_loaded()
// update the extruders count field // update the extruders count field
auto *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(m_config->option("nozzle_diameter")); auto *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(m_config->option("nozzle_diameter"));
size_t extruders_count = nozzle_diameter->values.size(); size_t extruders_count = nozzle_diameter->values.size();
set_value("extruders_count", int(extruders_count)); // set_value("extruders_count", int(extruders_count));
// update the GUI field according to the number of nozzle diameters supplied // update the GUI field according to the number of nozzle diameters supplied
extruders_count_changed(extruders_count); extruders_count_changed(extruders_count);
} }
@ -3297,6 +3318,8 @@ bool Tab::may_switch_to_SLA_preset()
void Tab::clear_pages() void Tab::clear_pages()
{ {
// invalidated highlighter, if any exists
m_highlighter.invalidate();
// clear pages from the controlls // clear pages from the controlls
for (auto p : m_pages) for (auto p : m_pages)
p->clear(); p->clear();
@ -3310,6 +3333,8 @@ void Tab::clear_pages()
m_compatible_prints.checkbox = nullptr; m_compatible_prints.checkbox = nullptr;
m_compatible_prints.btn = nullptr; m_compatible_prints.btn = nullptr;
m_blinking_ikons.clear();
} }
void Tab::update_description_lines() void Tab::update_description_lines()
@ -3372,7 +3397,10 @@ void Tab::OnTreeSelChange(wxTreeEvent& event)
for (auto& el : m_pages) for (auto& el : m_pages)
el.get()->Hide(); el.get()->Hide();
active_selected_page(); if (wxGetApp().mainframe->is_active_and_shown_tab(this)) {
active_selected_page();
m_active_page->Show();
}
#ifdef __linux__ #ifdef __linux__
no_updates.reset(nullptr); no_updates.reset(nullptr);
@ -3380,7 +3408,7 @@ void Tab::OnTreeSelChange(wxTreeEvent& event)
update_undo_buttons(); update_undo_buttons();
m_active_page->Show(); // m_active_page->Show();
m_hsizer->Layout(); m_hsizer->Layout();
Refresh(); Refresh();
} }
@ -3592,7 +3620,6 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep
{ {
deps.checkbox = new wxCheckBox(parent, wxID_ANY, _(L("All"))); deps.checkbox = new wxCheckBox(parent, wxID_ANY, _(L("All")));
deps.checkbox->SetFont(Slic3r::GUI::wxGetApp().normal_font()); deps.checkbox->SetFont(Slic3r::GUI::wxGetApp().normal_font());
// add_scaled_button(parent, &deps.btn, "printer_white", from_u8((boost::format(" %s %s") % _utf8(L("Set")) % std::string(dots.ToUTF8())).str()), wxBU_LEFT | wxBU_EXACTFIT);
deps.btn = new ScalableButton(parent, wxID_ANY, "printer_white", from_u8((boost::format(" %s %s") % _utf8(L("Set")) % std::string(dots.ToUTF8())).str()), deps.btn = new ScalableButton(parent, wxID_ANY, "printer_white", from_u8((boost::format(" %s %s") % _utf8(L("Set")) % std::string(dots.ToUTF8())).str()),
wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true); wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true);
deps.btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); deps.btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
@ -3674,7 +3701,6 @@ wxSizer* TabPrinter::create_bed_shape_widget(wxWindow* parent)
{ {
ScalableButton* btn = new ScalableButton(parent, wxID_ANY, "printer_white", " " + _(L("Set")) + " " + dots, ScalableButton* btn = new ScalableButton(parent, wxID_ANY, "printer_white", " " + _(L("Set")) + " " + dots,
wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true); wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true);
// add_scaled_button(parent, &btn, "printer_white", " " + _(L("Set")) + " " + dots, wxBU_LEFT | wxBU_EXACTFIT);
btn->SetFont(wxGetApp().normal_font()); btn->SetFont(wxGetApp().normal_font());
BlinkingBitmap* bbmp = new BlinkingBitmap(parent); BlinkingBitmap* bbmp = new BlinkingBitmap(parent);
@ -4103,7 +4129,6 @@ void TabSLAPrint::build()
optgroup->append_single_option_line("support_base_safety_distance"); optgroup->append_single_option_line("support_base_safety_distance");
// Mirrored parameter from Pad page for toggling elevation on the same page // Mirrored parameter from Pad page for toggling elevation on the same page
// optgroup->append_single_option_line("pad_around_object");
optgroup->append_single_option_line("support_object_elevation"); optgroup->append_single_option_line("support_object_elevation");
Line line{ "", "" }; Line line{ "", "" };

View file

@ -223,9 +223,9 @@ protected:
void set_timer_owner(wxEvtHandler* owner, int timerid = wxID_ANY); void set_timer_owner(wxEvtHandler* owner, int timerid = wxID_ANY);
void init(BlinkingBitmap* bmp); void init(BlinkingBitmap* bmp);
void blink(); void blink();
void invalidate();
private: private:
void invalidate();
BlinkingBitmap* bbmp {nullptr}; BlinkingBitmap* bbmp {nullptr};
int blink_counter {0}; int blink_counter {0};
@ -327,7 +327,7 @@ public:
Field* get_field(const t_config_option_key& opt_key, int opt_index = -1) const; Field* get_field(const t_config_option_key& opt_key, int opt_index = -1) const;
Field* get_field(const t_config_option_key &opt_key, Page** selected_page, int opt_index = -1); Field* get_field(const t_config_option_key &opt_key, Page** selected_page, int opt_index = -1);
void toggle_option(const std::string& opt_key, bool toggle, int opt_index = -1); void toggle_option(const std::string& opt_key, bool toggle, int opt_index = -1);
bool set_value(const t_config_option_key& opt_key, const boost::any& value); // bool set_value(const t_config_option_key& opt_key, const boost::any& value);
wxSizer* description_line_widget(wxWindow* parent, ogStaticText** StaticText); wxSizer* description_line_widget(wxWindow* parent, ogStaticText** StaticText);
bool current_preset_is_dirty(); bool current_preset_is_dirty();
@ -417,7 +417,7 @@ class TabPrinter : public Tab
std::vector<PageShp> m_pages_fff; std::vector<PageShp> m_pages_fff;
std::vector<PageShp> m_pages_sla; std::vector<PageShp> m_pages_sla;
void build_printhost(ConfigOptionsGroup *optgroup); // void build_printhost(ConfigOptionsGroup *optgroup);
public: public:
wxButton* m_serial_test_btn = nullptr; wxButton* m_serial_test_btn = nullptr;
ScalableButton* m_print_host_test_btn = nullptr; ScalableButton* m_print_host_test_btn = nullptr;
@ -447,7 +447,7 @@ public:
void update_fff(); void update_fff();
void update_sla(); void update_sla();
void update_pages(); // update m_pages according to printer technology void update_pages(); // update m_pages according to printer technology
void update_serial_ports(); // void update_serial_ports();
void extruders_count_changed(size_t extruders_count); void extruders_count_changed(size_t extruders_count);
PageShp build_kinematics_page(); PageShp build_kinematics_page();
void build_unregular_pages(); void build_unregular_pages();