From 0dae851dc68a57718e2b7a0191f2d02ea621529d Mon Sep 17 00:00:00 2001 From: "liz.li" Date: Fri, 24 Nov 2023 09:54:35 +0800 Subject: [PATCH] FIX: there is no object can be jumped to in notification jira: new Change-Id: Ib81bf49236952ede24a2de126051572d63916e01 --- src/slic3r/GUI/GLCanvas3D.cpp | 4 +- src/slic3r/GUI/NotificationManager.cpp | 114 ++++++++++++++----------- 2 files changed, 65 insertions(+), 53 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e8769ad10..25c9f3ce1 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -9082,13 +9082,13 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) break; case SLICING_SERIOUS_WARNING: if (state) - notification_manager.push_slicing_serious_warning_notification(text, {conflictObj}); + notification_manager.push_slicing_serious_warning_notification(text, conflictObj ? std::vector{conflictObj} : std::vector{}); else notification_manager.close_slicing_serious_warning_notification(text); break; case SLICING_ERROR: if (state) - notification_manager.push_slicing_error_notification(text, {conflictObj}); + notification_manager.push_slicing_error_notification(text, conflictObj ? std::vector{conflictObj} : std::vector{}); else notification_manager.close_slicing_error_notification(text); break; diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index b08c55dae..ece473b91 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -1579,20 +1579,25 @@ void NotificationManager::push_validate_error_notification(StringObjectException { auto po = dynamic_cast(error.object); auto mo = po ? po->model_object() : dynamic_cast(error.object); - auto callback = (mo || !error.opt_key.empty()) ? [id = mo ? mo->id() : 0, opt = error.opt_key](wxEvtHandler *) { - auto & objects = wxGetApp().model().objects; - auto iter = id.id ? std::find_if(objects.begin(), objects.end(), [id](auto o) { return o->id() == id; }) : objects.end(); - if (iter != objects.end()) - wxGetApp().obj_list()->select_items({{*iter, nullptr}}); - if (!opt.empty()) { - if (iter != objects.end()) - wxGetApp().params_panel()->switch_to_object(); - wxGetApp().sidebar().jump_to_option(opt, Preset::TYPE_PRINT, L""); - } else { - wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); - } - return false; - } : std::function(); + std::function callback; + if (mo || !error.opt_key.empty()) { + callback = + [id = mo ? mo->id() : 0, opt = error.opt_key](wxEvtHandler*) { + auto& objects = wxGetApp().model().objects; + auto iter = id.id ? std::find_if(objects.begin(), objects.end(), [id](auto o) { return o->id() == id; }) : objects.end(); + if (iter != objects.end()) + wxGetApp().obj_list()->select_items({ {*iter, nullptr} }); + if (!opt.empty()) { + if (iter != objects.end()) + wxGetApp().params_panel()->switch_to_object(); + wxGetApp().sidebar().jump_to_option(opt, Preset::TYPE_PRINT, L""); + } + else { + wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); + } + return false; + }; + } auto link = (mo || !error.opt_key.empty()) ? _u8L("Jump to") : ""; if (mo) link += std::string(" [") + mo->name + "]"; if (!error.opt_key.empty()) link += std::string(" (") + error.opt_key + ")"; @@ -1607,19 +1612,22 @@ void NotificationManager::push_slicing_error_notification(const std::string &tex if (optr) ids.push_back(optr->id()); } - auto callback = !objs.empty() ? [ids](wxEvtHandler *) { - auto & objects = wxGetApp().model().objects; - std::vector ovs; - for (auto id : ids) { - auto iter = std::find_if(objects.begin(), objects.end(), [id](auto o) { return o->id() == id; }); - if (iter != objects.end()) { ovs.push_back({*iter, nullptr}); } - } - if (!ovs.empty()) { - wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); - wxGetApp().obj_list()->select_items(ovs); - } - return false; - } : std::function(); + std::function callback; + if (!objs.empty()) { + callback = [ids](wxEvtHandler*) { + auto& objects = wxGetApp().model().objects; + std::vector ovs; + for (auto id : ids) { + auto iter = std::find_if(objects.begin(), objects.end(), [id](auto o) { return o->id() == id; }); + if (iter != objects.end()) { ovs.push_back({ *iter, nullptr }); } + } + if (!ovs.empty()) { + wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); + wxGetApp().obj_list()->select_items(ovs); + } + return false; + }; + } auto link = callback ? _u8L("Jump to") : ""; if (!objs.empty()) { link += " ["; @@ -1639,15 +1647,18 @@ void NotificationManager::push_slicing_error_notification(const std::string &tex } void NotificationManager::push_slicing_warning_notification(const std::string& text, bool gray, ModelObject const * obj, ObjectID oid, int warning_step, int warning_msg_id, NotificationLevel level/* = NotificationLevel::WarningNotificationLevel*/) { - auto callback = obj ? [id = obj->id()](wxEvtHandler *) { - auto & objects = wxGetApp().model().objects; - auto iter = std::find_if(objects.begin(), objects.end(), [id](auto o) { return o->id() == id; }); - if (iter != objects.end()) { - wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); - wxGetApp().obj_list()->select_items({{*iter, nullptr}}); - } - return false; - } : std::function(); + std::function callback; + if (obj) { + callback = [id = obj->id()](wxEvtHandler*) { + auto& objects = wxGetApp().model().objects; + auto iter = std::find_if(objects.begin(), objects.end(), [id](auto o) { return o->id() == id; }); + if (iter != objects.end()) { + wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); + wxGetApp().obj_list()->select_items({ {*iter, nullptr} }); + } + return false; + }; + } auto link = callback ? _u8L("Jump to") : ""; if (obj) link += std::string(" [") + obj->name + "]"; NotificationData data { NotificationType::SlicingWarning, level, 0, _u8L("Warning:") + "\n" + text, link, callback }; @@ -1873,21 +1884,22 @@ void NotificationManager::push_slicing_serious_warning_notification(const std::s for (auto optr : objs) { if (optr) ids.push_back(optr->id()); } - auto callback = !objs.empty() ? - [ids](wxEvtHandler *) { - auto & objects = wxGetApp().model().objects; - std::vector ovs; - for (auto id : ids) { - auto iter = std::find_if(objects.begin(), objects.end(), [id](auto o) { return o->id() == id; }); - if (iter != objects.end()) { ovs.push_back({*iter, nullptr}); } - } - if (!ovs.empty()) { - wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); - wxGetApp().obj_list()->select_items(ovs); - } - return false; - } : - std::function(); + std::function callback; + if (!objs.empty()) { + callback = [ids](wxEvtHandler*) { + auto& objects = wxGetApp().model().objects; + std::vector ovs; + for (auto id : ids) { + auto iter = std::find_if(objects.begin(), objects.end(), [id](auto o) { return o->id() == id; }); + if (iter != objects.end()) { ovs.push_back({ *iter, nullptr }); } + } + if (!ovs.empty()) { + wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); + wxGetApp().obj_list()->select_items(ovs); + } + return false; + }; + } auto link = callback ? _u8L("Jump to") : ""; if (!objs.empty()) { link += " [";