Cancellation of parameter page build process.

This commit is contained in:
bubnikv 2020-09-29 13:36:56 +02:00
parent ec8602f8d9
commit b15023dfa9
4 changed files with 116 additions and 64 deletions

View file

@ -362,42 +362,52 @@ void OptionsGroup::activate_line(Line& line)
} }
// create all controls for the option group from the m_lines // create all controls for the option group from the m_lines
bool OptionsGroup::activate() bool OptionsGroup::activate(std::function<void()> throw_if_canceled)
{ {
if (sizer)//(!sizer->IsEmpty()) if (sizer)//(!sizer->IsEmpty())
return false; return false;
if (staticbox) { try {
stb = new wxStaticBox(m_parent, wxID_ANY, _(title)); if (staticbox) {
if (!wxOSX) stb->SetBackgroundStyle(wxBG_STYLE_PAINT); stb = new wxStaticBox(m_parent, wxID_ANY, _(title));
stb->SetFont(wxOSX ? wxGetApp().normal_font() : wxGetApp().bold_font()); if (!wxOSX) stb->SetBackgroundStyle(wxBG_STYLE_PAINT);
stb->SetFont(wxOSX ? wxGetApp().normal_font() : wxGetApp().bold_font());
}
else
stb = nullptr;
sizer = (staticbox ? new wxStaticBoxSizer(stb, wxVERTICAL) : new wxBoxSizer(wxVERTICAL));
auto num_columns = 1U;
size_t grow_col = 1;
if (label_width == 0)
grow_col = 0;
else
num_columns++;
if (extra_column) {
num_columns++;
grow_col++;
}
m_grid_sizer = new wxFlexGridSizer(0, num_columns, 1, 0);
static_cast<wxFlexGridSizer*>(m_grid_sizer)->SetFlexibleDirection(wxBOTH);
static_cast<wxFlexGridSizer*>(m_grid_sizer)->AddGrowableCol(grow_col);
sizer->Add(m_grid_sizer, 0, wxEXPAND | wxALL, wxOSX || !staticbox ? 0 : 5);
// activate lines
for (Line& line: m_lines) {
throw_if_canceled();
activate_line(line);
}
} catch (UIBuildCanceled&) {
auto p = sizer;
this->clear();
p->Clear(true);
delete p;
throw;
} }
else
stb = nullptr;
sizer = (staticbox ? new wxStaticBoxSizer(stb, wxVERTICAL) : new wxBoxSizer(wxVERTICAL));
auto num_columns = 1U;
size_t grow_col = 1;
if (label_width == 0)
grow_col = 0;
else
num_columns++;
if (extra_column) {
num_columns++;
grow_col++;
}
m_grid_sizer = new wxFlexGridSizer(0, num_columns, 1, 0);
static_cast<wxFlexGridSizer*>(m_grid_sizer)->SetFlexibleDirection(wxBOTH);
static_cast<wxFlexGridSizer*>(m_grid_sizer)->AddGrowableCol(grow_col);
sizer->Add(m_grid_sizer, 0, wxEXPAND | wxALL, wxOSX || !staticbox ? 0 : 5);
// activate lines
for (Line& line: m_lines)
activate_line(line);
return true; return true;
} }

View file

@ -24,6 +24,9 @@
namespace Slic3r { namespace GUI { namespace Slic3r { namespace GUI {
// Thrown if the building of a parameter page is canceled.
class UIBuildCanceled : public std::exception {};
/// Widget type describes a function object that returns a wxWindow (our widget) and accepts a wxWidget (parent window). /// Widget type describes a function object that returns a wxWindow (our widget) and accepts a wxWidget (parent window).
using widget_t = std::function<wxSizer*(wxWindow*)>;//!std::function<wxWindow*(wxWindow*)>; using widget_t = std::function<wxSizer*(wxWindow*)>;//!std::function<wxWindow*(wxWindow*)>;
@ -124,7 +127,7 @@ public:
void activate_line(Line& line); void activate_line(Line& line);
// create all controls for the option group from the m_lines // create all controls for the option group from the m_lines
bool activate(); bool activate(std::function<void()> throw_if_canceled = [](){});
// delete all controls from the option group // delete all controls from the option group
void clear(); void clear();

View file

@ -297,15 +297,28 @@ void Tab::create_preset_tab()
// This helps to process all the cursor key events on Windows in the tree control, // This helps to process all the cursor key events on Windows in the tree control,
// so that the cursor jumps to the last item. // so that the cursor jumps to the last item.
m_treectrl->Bind(wxEVT_TREE_SEL_CHANGED, [this](wxTreeEvent&) { m_treectrl->Bind(wxEVT_TREE_SEL_CHANGED, [this](wxTreeEvent&) {
if (!m_disable_tree_sel_changed_event && !m_pages.empty()) if (!m_disable_tree_sel_changed_event && !m_pages.empty()) {
m_page_switch_planned = true; if (m_page_switch_running)
m_page_switch_planned = true;
else {
m_page_switch_running = true;
do {
m_page_switch_planned = false;
} while (this->tree_sel_change_delayed());
m_page_switch_running = false;
}
}
m_treectrl->Update();
}); });
#if 0
m_treectrl->Bind(wxEVT_IDLE, [this](wxIdleEvent&) { m_treectrl->Bind(wxEVT_IDLE, [this](wxIdleEvent&) {
if (m_page_switch_planned) { if (m_page_switch_planned) {
this->tree_sel_change_delayed(); do {
m_page_switch_planned = false; m_page_switch_planned = false;
} while (this->tree_sel_change_delayed());
} }
}); });
#endif
m_treectrl->Bind(wxEVT_KEY_DOWN, &Tab::OnKeyDown, this); m_treectrl->Bind(wxEVT_KEY_DOWN, &Tab::OnKeyDown, this);
@ -424,7 +437,7 @@ void Tab::OnActivate()
#endif // __WXOSX__ #endif // __WXOSX__
// create controls on active page // create controls on active page
active_selected_page(); activate_selected_page();
// m_active_page->Show(); // m_active_page->Show();
m_hsizer->Layout(); m_hsizer->Layout();
Refresh(); Refresh();
@ -2820,9 +2833,9 @@ void TabPrinter::update_pages()
rebuild_page_tree(); rebuild_page_tree();
} }
void TabPrinter::active_selected_page() void TabPrinter::activate_selected_page(std::function<void()> throw_if_canceled)
{ {
Tab::active_selected_page(); Tab::activate_selected_page(throw_if_canceled);
// "extruders_count" doesn't update from the update_config(), // "extruders_count" doesn't update from the update_config(),
// so update it implicitly // so update it implicitly
@ -3372,19 +3385,20 @@ void Tab::update_description_lines()
update_preset_description_line(); update_preset_description_line();
} }
void Tab::active_selected_page() void Tab::activate_selected_page(std::function<void()> throw_if_canceled)
{ {
if (!m_active_page) if (!m_active_page)
return; return;
m_active_page->activate(m_mode); m_active_page->activate(m_mode, throw_if_canceled);
update_changed_ui(); update_changed_ui();
update_description_lines(); update_description_lines();
toggle_options(); toggle_options();
} }
void Tab::tree_sel_change_delayed() bool Tab::tree_sel_change_delayed()
{ {
#if 1
// There is a bug related to Ubuntu overlay scrollbars, see https://github.com/prusa3d/PrusaSlicer/issues/898 and https://github.com/prusa3d/PrusaSlicer/issues/952. // There is a bug related to Ubuntu overlay scrollbars, see https://github.com/prusa3d/PrusaSlicer/issues/898 and https://github.com/prusa3d/PrusaSlicer/issues/952.
// The issue apparently manifests when Show()ing a window with overlay scrollbars while the UI is frozen. For this reason, // The issue apparently manifests when Show()ing a window with overlay scrollbars while the UI is frozen. For this reason,
// we will Thaw the UI prematurely on Linux. This means destroing the no_updates object prematurely. // we will Thaw the UI prematurely on Linux. This means destroing the no_updates object prematurely.
@ -3398,6 +3412,7 @@ void Tab::tree_sel_change_delayed()
//#ifdef __WXOSX__ // Use Freeze/Thaw to avoid flickering during clear/activate new page //#ifdef __WXOSX__ // Use Freeze/Thaw to avoid flickering during clear/activate new page
wxWindowUpdateLocker noUpdates(this); wxWindowUpdateLocker noUpdates(this);
//#endif //#endif
#endif
#endif #endif
Page* page = nullptr; Page* page = nullptr;
@ -3411,29 +3426,50 @@ void Tab::tree_sel_change_delayed()
m_is_modified_values = page->m_is_modified_values; m_is_modified_values = page->m_is_modified_values;
break; break;
} }
if (page == nullptr || m_active_page == page) return; if (page == nullptr || m_active_page == page)
return false;
// clear pages from the controls // clear pages from the controls
m_active_page = page; m_active_page = page;
clear_pages();
//for (auto& el : m_pages) auto throw_if_canceled = std::function<void()>([this](){
// el.get()->Hide(); #ifdef WIN32
wxCheckForInterrupt(m_treectrl);
if (m_page_switch_planned)
throw UIBuildCanceled();
#endif // WIN32
});
if (wxGetApp().mainframe->is_active_and_shown_tab(this)) { try {
active_selected_page(); clear_pages();
// m_active_page->Show(); throw_if_canceled();
//for (auto& el : m_pages)
// el.get()->Hide();
if (wxGetApp().mainframe->is_active_and_shown_tab(this)) {
activate_selected_page(throw_if_canceled);
// m_active_page->Show();
}
#ifdef __linux__
no_updates.reset(nullptr);
#endif
update_undo_buttons();
throw_if_canceled();
// m_active_page->Show();
m_hsizer->Layout();
throw_if_canceled();
Refresh();
} catch (const UIBuildCanceled&) {
if (m_active_page)
m_active_page->clear();
return true;
} }
#ifdef __linux__ return false;
no_updates.reset(nullptr);
#endif
update_undo_buttons();
// m_active_page->Show();
m_hsizer->Layout();
Refresh();
} }
void Tab::OnKeyDown(wxKeyEvent& event) void Tab::OnKeyDown(wxKeyEvent& event)
@ -3892,16 +3928,17 @@ void Page::update_visibility(ConfigOptionMode mode, bool update_contolls_visibil
m_show = ret_val; m_show = ret_val;
} }
void Page::activate(ConfigOptionMode mode) void Page::activate(ConfigOptionMode mode, std::function<void()> throw_if_canceled)
{ {
//if (m_parent) //if (m_parent)
//m_parent->SetSizer(m_vsizer); //m_parent->SetSizer(m_vsizer);
for (auto group : m_optgroups) { for (auto group : m_optgroups) {
if (!group->activate()) if (!group->activate(throw_if_canceled))
continue; continue;
m_vsizer->Add(group->sizer, 0, wxEXPAND | wxALL, 10); m_vsizer->Add(group->sizer, 0, wxEXPAND | wxALL, 10);
group->update_visibility(mode); group->update_visibility(mode);
group->reload_config(); group->reload_config();
throw_if_canceled();
} }
} }

View file

@ -73,7 +73,7 @@ public:
void set_config(DynamicPrintConfig* config_in) { m_config = config_in; } void set_config(DynamicPrintConfig* config_in) { m_config = config_in; }
void reload_config(); void reload_config();
void update_visibility(ConfigOptionMode mode, bool update_contolls_visibility); void update_visibility(ConfigOptionMode mode, bool update_contolls_visibility);
void activate(ConfigOptionMode mode); void activate(ConfigOptionMode mode, std::function<void()> throw_if_canceled);
void clear(); void clear();
void msw_rescale(); void msw_rescale();
void sys_color_changed(); void sys_color_changed();
@ -239,6 +239,7 @@ protected:
DynamicPrintConfig m_cache_config; DynamicPrintConfig m_cache_config;
bool m_page_switch_running = false;
bool m_page_switch_planned = false; bool m_page_switch_planned = false;
public: public:
@ -294,7 +295,7 @@ public:
virtual void clear_pages(); virtual void clear_pages();
virtual void update_description_lines(); virtual void update_description_lines();
virtual void active_selected_page(); virtual void activate_selected_page(std::function<void()> throw_if_canceled);
void OnTreeSelChange(wxTreeEvent& event); void OnTreeSelChange(wxTreeEvent& event);
void OnKeyDown(wxKeyEvent& event); void OnKeyDown(wxKeyEvent& event);
@ -354,7 +355,8 @@ protected:
void compatible_widget_reload(PresetDependencies &deps); void compatible_widget_reload(PresetDependencies &deps);
void load_key_value(const std::string& opt_key, const boost::any& value, bool saved_value = false); void load_key_value(const std::string& opt_key, const boost::any& value, bool saved_value = false);
void tree_sel_change_delayed(); // return true if cancelled
bool tree_sel_change_delayed();
void on_presets_changed(); void on_presets_changed();
void build_preset_description_line(ConfigOptionsGroup* optgroup); void build_preset_description_line(ConfigOptionsGroup* optgroup);
void update_preset_description_line(); void update_preset_description_line();
@ -447,7 +449,7 @@ public:
void build() override; void build() override;
void build_fff(); void build_fff();
void build_sla(); void build_sla();
void active_selected_page() override; void activate_selected_page(std::function<void()> throw_if_canceled) override;
void clear_pages() override; void clear_pages() override;
void toggle_options() override; void toggle_options() override;
void update() override; void update() override;