From 7ba1ac9d154d8bfbddb01ca746ea630e12036ac7 Mon Sep 17 00:00:00 2001 From: manch1n Date: Sat, 6 May 2023 16:53:06 +0800 Subject: [PATCH] ENH: [STUDIO-2773] block notification Change-Id: I97b556b5ad1f25d8c4118e1f271c0756084d83cc --- resources/images/block_notification_close.svg | 4 + .../images/block_notification_close_hover.svg | 4 + resources/images/block_notification_error.svg | 3 + src/imgui/imconfig.h | 4 + src/slic3r/GUI/GLCanvas3D.cpp | 13 +- src/slic3r/GUI/ImGuiWrapper.cpp | 4 + src/slic3r/GUI/NotificationManager.cpp | 320 +++++++++++++++++- src/slic3r/GUI/NotificationManager.hpp | 18 + src/slic3r/GUI/PartPlate.hpp | 2 +- 9 files changed, 356 insertions(+), 16 deletions(-) create mode 100644 resources/images/block_notification_close.svg create mode 100644 resources/images/block_notification_close_hover.svg create mode 100644 resources/images/block_notification_error.svg diff --git a/resources/images/block_notification_close.svg b/resources/images/block_notification_close.svg new file mode 100644 index 000000000..a55fe49f7 --- /dev/null +++ b/resources/images/block_notification_close.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/block_notification_close_hover.svg b/resources/images/block_notification_close_hover.svg new file mode 100644 index 000000000..afb1dc2a7 --- /dev/null +++ b/resources/images/block_notification_close_hover.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/block_notification_error.svg b/resources/images/block_notification_error.svg new file mode 100644 index 000000000..902027fae --- /dev/null +++ b/resources/images/block_notification_error.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/imgui/imconfig.h b/src/imgui/imconfig.h index cdb6275ce..1774eb28a 100644 --- a/src/imgui/imconfig.h +++ b/src/imgui/imconfig.h @@ -193,6 +193,10 @@ namespace ImGui const wchar_t CollapseBtn = 0x0831; const wchar_t RevertBtn = 0x0832; + const wchar_t CloseBlockNotifButton = 0x0833; + const wchar_t CloseBlockNotifHoverButton = 0x0834; + const wchar_t BlockNotifErrorIcon = 0x0835; + // void MyFunction(const char* name, const MyMatrix44& v); } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 52e00d172..3b9ee33cf 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -8905,8 +8905,9 @@ std::vector> GLCanvas3D::_parse_colors(const std::vector font_icons = { {ImGui::ExpandBtn , "expand_btn" }, {ImGui::CollapseBtn , "collapse_btn" }, {ImGui::RevertBtn , "revert_btn" }, + + {ImGui::CloseBlockNotifButton , "block_notification_close" }, + {ImGui::CloseBlockNotifHoverButton , "block_notification_close_hover" }, }; static const std::map font_icons_large = { {ImGui::CloseNotifButton , "notification_close" }, @@ -113,6 +116,7 @@ static const std::map font_icons_large = { {ImGui::CloseNotifHoverDarkButton , "notification_close_hover_dark" }, {ImGui::DocumentationDarkButton , "notification_documentation_dark" }, {ImGui::DocumentationHoverDarkButton, "notification_documentation_hover_dark"}, + {ImGui::BlockNotifErrorIcon, "block_notification_error" }, }; static const std::map font_icons_extra_large = { diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 551bd2e56..e7f635106 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -306,6 +306,96 @@ void NotificationManager::PopNotification::render(GLCanvas3D& canvas, float init if (fading_pop) ImGui::PopStyleColor(3); } + +void NotificationManager::PopNotification::bbl_render_block_notification(GLCanvas3D &canvas, float initial_y, bool move_from_overlay, float overlay_width, float right_margin) +{ + if (m_state == EState::Unknown) + init(); + + if (m_state == EState::Hidden) { + m_top_y = initial_y - GAP_WIDTH; + return; + } + + if (m_state == EState::ClosePending || m_state == EState::Finished) + { + m_state = EState::Finished; + return; + } + + Size cnv_size = canvas.get_canvas_size(); + ImGuiWrapper& imgui = *wxGetApp().imgui(); + float right_gap = right_margin + (move_from_overlay ? overlay_width + m_line_height * 5 : 0); + bool fading_pop = false; + + if (m_line_height != ImGui::CalcTextSize("A").y) + init(); + + set_next_window_size(imgui); + + // top y of window + m_top_y = initial_y + m_window_height; + + ImVec2 win_pos(1.0f * (float) cnv_size.get_width() - right_gap, 1.0f * (float) cnv_size.get_height() - m_top_y); + imgui.set_next_window_pos(win_pos.x, win_pos.y, ImGuiCond_Always, 1.0f, 0.0f); + imgui.set_next_window_size(m_window_width, m_window_height, ImGuiCond_Always); + + // color change based on fading out + if (m_state == EState::FadingOut) { + push_style_color(ImGuiCol_WindowBg, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg), true, m_current_fade_opacity); + push_style_color(ImGuiCol_Text, ImGui::GetStyleColorVec4(ImGuiCol_Text), true, m_current_fade_opacity); + push_style_color(ImGuiCol_ButtonHovered, ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered), true, m_current_fade_opacity); + fading_pop = true; + } + + bool bgrnd_color_pop = push_background_color(); + + // name of window indentifies window - has to be unique string + if (m_id == 0) + m_id = m_id_provider.allocate_id(); + std::string name = "!!Ntfctn" + std::to_string(m_id); + + use_bbl_theme(); + if (m_data.level == NotificationLevel::SeriousWarningNotificationLevel) + { + push_style_color(ImGuiCol_Border, {245.f / 255.f, 155 / 255.f, 22 / 255.f, 1}, true, m_current_fade_opacity); + push_style_color(ImGuiCol_WindowBg, {245.f / 255.f, 155 / 255.f, 22 / 255.f, 1}, true, m_current_fade_opacity); + } + if (m_data.level == NotificationLevel::ErrorNotificationLevel) { + push_style_color(ImGuiCol_Border, {225.f / 255.f, 71 / 255.f, 71 / 255.f, 1}, true, m_current_fade_opacity); + push_style_color(ImGuiCol_WindowBg, {225.f / 255.f, 71 / 255.f, 71 / 255.f, 1}, true, m_current_fade_opacity); + } + push_style_color(ImGuiCol_Text, { 1,1,1,1 }, true, m_current_fade_opacity); + + if (imgui.begin(name, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse)) { + ImVec2 win_size = ImGui::GetWindowSize(); + ImVec2 win_pos = ImGui::GetWindowPos(); + if (ImGui::IsMouseHoveringRect(win_pos, win_pos + win_size)) { + set_hovered(); + } + + //render left icon + bbl_render_block_notif_left_sign(imgui, win_size.x, win_size.y, win_pos.x, win_pos.y); + bbl_render_block_notif_text(imgui, win_size.x, win_size.y, win_pos.x, win_pos.y); + bbl_render_block_notif_buttons(imgui, win_size, win_pos); + //render_close_button(imgui, win_size.x, win_size.y, win_pos.x, win_pos.y); + //m_minimize_b_visible = false; + //if (m_multiline && m_lines_count > 3) + // render_minimize_button(imgui, win_pos.x, win_pos.y); + } + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + imgui.end(); + + ImGui::PopStyleColor(3); + restore_default_theme(); + + if (bgrnd_color_pop) + ImGui::PopStyleColor(); + + if (fading_pop) + ImGui::PopStyleColor(3); +} + bool NotificationManager::PopNotification::push_background_color() { if (m_is_gray) { @@ -345,6 +435,10 @@ void NotificationManager::PopNotification::count_spaces() // m_left_indentation = picture_width + m_line_height / 2; //} m_window_width_offset = m_left_indentation + m_line_height * 3.f; + if (m_data.level == NotificationLevel::ErrorNotificationLevel || m_data.level == NotificationLevel::SeriousWarningNotificationLevel) { + m_left_indentation = 32 + m_line_height; + m_window_width_offset = 150.f; + } m_window_width = m_line_height * 25; } @@ -464,6 +558,68 @@ void NotificationManager::PopNotification::set_next_window_size(ImGuiWrapper& im m_window_height += 1 * m_line_height; // top and bottom } +void NotificationManager::PopNotification::bbl_render_block_notif_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + float x_offset = m_left_indentation; + int last_end = 0; + float starting_y = (m_lines_count == 2 ? win_size_y / 2 - m_line_height : (m_lines_count == 1 ? win_size_y / 2 - m_line_height / 2 : m_line_height / 2)); + float shift_y = m_line_height; + std::string line; + + for (size_t i = 0; i < (m_multiline ? m_endlines.size() : std::min(m_endlines.size(), (size_t)2)); i++) { + assert(m_endlines.size() > i && m_text1.size() >= m_endlines[i]); + line.clear(); + ImGui::SetCursorPosX(x_offset); + ImGui::SetCursorPosY(starting_y + i * shift_y); + if (m_endlines.size() > i && m_text1.size() >= m_endlines[i]) { + if (i == 1 && m_endlines.size() > 2 && !m_multiline) { + // second line with "more" hypertext + line = m_text1.substr(m_endlines[0] + (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0), m_endlines[1] - m_endlines[0] - (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0)); + while (ImGui::CalcTextSize(line.c_str()).x > m_window_width - m_window_width_offset - ImGui::CalcTextSize((".." + _u8L("More")).c_str()).x) { + line = line.substr(0, line.length() - 1); + } + line += ".."; + } + else { + // regural line + line = m_text1.substr(last_end, m_endlines[i] - last_end); + } + last_end = m_endlines[i]; + if (m_text1.size() > m_endlines[i]) + last_end += (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0); + + if (pos_start != string::npos && pos_end != string::npos && m_endlines[i] - line.length() >= pos_start && m_endlines[i] <= pos_end) { + push_style_color(ImGuiCol_Text, m_ErrorColor, m_state == EState::FadingOut, m_current_fade_opacity); + imgui.text(line.c_str()); + ImGui::PopStyleColor(); + } + else { + imgui.text(line.c_str()); + } + } + } + //hyperlink text + if (!m_multiline && m_lines_count > 2) { + render_hypertext(imgui, x_offset + ImGui::CalcTextSize((line + " ").c_str()).x, starting_y + shift_y, _u8L("More"), true); + } + else if (!m_hypertext.empty()) { + const ImVec2 button_size = {52, 28}; + ImVec2 cursor_pos = { win_size_x - m_line_height * 6.0f, win_size_y / 2 - button_size.y / 2 }; + ImGui::SetCursorPos(cursor_pos); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 2); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.f, 1.f, 1.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.f, 1.f, 1.f, 0.f)); + //if (imgui.button(_L("Jump"), button_size.x, button_size.y)) { if (on_text_click()) { close(); } } + ImGui::PopStyleColor(2); + ImGui::PopStyleVar(2); + render_hypertext(imgui, x_offset + ImGui::CalcTextSize((line + (line.empty() ? "" : " ")).c_str()).x, starting_y + (m_endlines.size() - 1) * shift_y, m_hypertext); + } + + // text2 (text after hypertext) is not rendered for regular notifications + // its rendering is in HintNotification::render_text +} + void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { float x_offset = m_left_indentation; @@ -539,9 +695,18 @@ void NotificationManager::PopNotification::render_hypertext(ImGuiWrapper& imgui, ImGui::PopStyleColor(3); //hover color - ImVec4 HyperColor = m_HyperTextColor; - if (ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly)) - HyperColor.y += 0.1f; + ImVec4 HyperColor = m_HyperTextColor;//ImVec4(150.f / 255.f, 100.f / 255.f, 0.f / 255.f, 1) + if (m_data.level == NotificationLevel::SeriousWarningNotificationLevel) + HyperColor = ImVec4(0.f, 0.f, 0.f, 0.4f); + if (m_data.level == NotificationLevel::ErrorNotificationLevel) + HyperColor = ImVec4(135.f / 255.f, 43 / 255.f, 43 / 255.f, 1); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly)) + { + HyperColor.y += 0.1f; + if (m_data.level == NotificationLevel::SeriousWarningNotificationLevel || m_data.level == NotificationLevel::SeriousWarningNotificationLevel) + HyperColor.x += 0.2f; + } + //text push_style_color(ImGuiCol_Text, HyperColor, m_state == EState::FadingOut, m_current_fade_opacity); @@ -607,6 +772,64 @@ void NotificationManager::PopNotification::render_close_button(ImGuiWrapper& img ImGui::PopStyleColor(5); } +void NotificationManager::PopNotification::bbl_render_block_notif_buttons(ImGuiWrapper& imgui, ImVec2 win_size, ImVec2 win_pos) +{ + // close button + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + std::wstring button_text; + button_text = ImGui::CloseBlockNotifButton; + ImVec2 button_pic_size = ImGui::CalcTextSize(into_u8(button_text).c_str()); + ImVec2 button_size(button_pic_size.x * 2.f, button_pic_size.y * 2.f); + + ImVec2 cursor_pos = { win_size.x - m_line_height * 2.0f, win_size.y / 2 - button_size.y / 2 }; + ImGui::SetCursorPos(cursor_pos); + //if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - win_size.x / 10.f, win_pos.y + win_size.y / 2 - button_pic_size.y), + // ImVec2(win_pos.x - win_size.x / 20.f, win_pos.y + win_size.y / 2 + button_pic_size.y), + // true)) + if(ImGui::IsMouseHoveringRect(win_pos + cursor_pos, win_pos + cursor_pos + button_size)) + { + button_text = ImGui::CloseBlockNotifHoverButton; + } + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + close(); + } + ImGui::PopStyleColor(5); + + + //// minimize button + //ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + //ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + //push_style_color(ImGuiCol_ButtonActive, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg), m_state == EState::FadingOut, m_current_fade_opacity); + //push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + //push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ////button - if part if treggered + //std::wstring button_text; + //button_text = m_is_dark ? ImGui::MinimalizeDarkButton : ImGui::MinimalizeButton; + //if (ImGui::IsMouseHoveringRect(ImVec2(win_pos_x - m_window_width / 10.f, win_pos_y + m_window_height - 2 * m_line_height + 1), + // ImVec2(win_pos_x, win_pos_y + m_window_height), + // true)) + //{ + // button_text = m_is_dark ? ImGui::MinimalizeHoverDarkButton : ImGui::MinimalizeHoverButton; + //} + //ImVec2 button_pic_size = ImGui::CalcTextSize(into_u8(button_text).c_str()); + //ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + //ImGui::SetCursorPosX(m_window_width - m_line_height * 1.8f); + //ImGui::SetCursorPosY(m_window_height - button_size.y - 5); + //if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + //{ + // m_multiline = false; + //} + + //ImGui::PopStyleColor(5); + //m_minimize_b_visible = true; +} + //void NotificationManager::PopNotification::render_multiline(ImGuiWrapper &imgui, const float win_pos_x, const float win_pos_y) //{ // if (m_data.type == NotificationType::BBLObjectInfo) @@ -615,6 +838,19 @@ void NotificationManager::PopNotification::render_close_button(ImGuiWrapper& img // } //} +void NotificationManager::PopNotification::bbl_render_block_notif_left_sign(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + auto window = ImGui::GetCurrentWindow(); + //window->DrawList->AddImage(user_texture_id, bb.Min + padding + margin, bb.Max - padding - margin, uv0, uv1, ImGui::GetColorU32(tint_col)); + + std::wstring text; + text = ImGui::BlockNotifErrorIcon; + ImGui::SetCursorPosX(m_line_height / 3); + ImGui::SetCursorPosY(m_window_height / 2 - m_line_height); + imgui.text(text.c_str()); + +} + void NotificationManager::PopNotification::bbl_render_left_sign(ImGuiWrapper &imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { ImDrawList *draw_list = ImGui::GetWindowDrawList(); @@ -1889,6 +2125,53 @@ void NotificationManager::upload_job_notification_show_error(int id, const std:: } } +void NotificationManager::push_slicing_serious_warning_notification(const std::string &text, std::vector objs) +{ + std::vector ids; + 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().obj_list()->select_items(ovs); + wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); + } + return false; + } : + std::function(); + auto link = callback ? _u8L("Jump to") : ""; + if (!objs.empty()) { + link += " ["; + for (auto obj : objs) { + if (obj) link += obj->name + ", "; + } + if (!objs.empty()) { + link.pop_back(); + link.pop_back(); + } + link += "] "; + } + set_all_slicing_warnings_gray(false); + push_notification_data({NotificationType::SlicingSeriousWarning, NotificationLevel::SeriousWarningNotificationLevel, 0, _u8L("Serious warning:") + "\n" + text, link, + callback}, + 0); + set_slicing_progress_hidden(); +} + +void NotificationManager::close_slicing_serious_warning_notification(const std::string &text) +{ + for (std::unique_ptr ¬ification : m_pop_notifications) { + if (notification->get_type() == NotificationType::SlicingSeriousWarning && notification->compare_text(_u8L("Serious warning:") + "\n" + text)) { notification->close(); } + } +} + void NotificationManager::init_slicing_progress_notification(std::function cancel_callback) { for (std::unique_ptr& notification : m_pop_notifications) { @@ -2134,12 +2417,13 @@ bool NotificationManager::push_notification_data(std::unique_ptrget_type() == NotificationType::SlicingWarning) { m_pop_notifications.back()->append(notification->get_data().ori_text); - } - else - m_pop_notifications.back()->update(notification->get_data()); + } else { + m_pop_notifications.back()->update(notification->get_data()); + } } } else { m_pop_notifications.emplace_back(std::move(notification)); + retval = true; } if (!m_initialized) @@ -2149,7 +2433,10 @@ bool NotificationManager::push_notification_data(std::unique_ptr notification, std::function condition_callback, int64_t initial_delay, int64_t delay_interval) +void NotificationManager::push_delayed_notification_data(std::unique_ptr notification, + std::function condition_callback, + int64_t initial_delay, + int64_t delay_interval) { if (initial_delay == 0 && condition_callback()) { if( push_notification_data(std::move(notification), 0)) @@ -2175,13 +2462,20 @@ void NotificationManager::render_notifications(GLCanvas3D &canvas, float overlay { sort_notifications(); - float last_y = bottom_margin * m_scale; + float bottom_up_last_y = bottom_margin * m_scale; for (const auto& notification : m_pop_notifications) { - if (notification->get_state() != PopNotification::EState::Hidden) { - notification->render(canvas, last_y, m_move_from_overlay && !m_in_preview, overlay_width * m_scale, right_margin * m_scale); - if (notification->get_state() != PopNotification::EState::Finished) - last_y = notification->get_top() + GAP_WIDTH; + if (notification->get_data().level == NotificationLevel::ErrorNotificationLevel || notification->get_data().level == NotificationLevel::SeriousWarningNotificationLevel) { + notification->bbl_render_block_notification(canvas, bottom_up_last_y, m_move_from_overlay && !m_in_preview, overlay_width * m_scale, right_margin * m_scale); + if (notification->get_state() != PopNotification::EState::Finished) + bottom_up_last_y = notification->get_top() + GAP_WIDTH; + } + else { + if (notification->get_state() != PopNotification::EState::Hidden) { + notification->render(canvas, bottom_up_last_y, m_move_from_overlay && !m_in_preview, overlay_width * m_scale, right_margin * m_scale); + if (notification->get_state() != PopNotification::EState::Finished) + bottom_up_last_y = notification->get_top() + GAP_WIDTH; + } } } m_last_render = GLCanvas3D::timestamp_now(); @@ -2315,6 +2609,8 @@ void NotificationManager::set_in_preview(bool preview) notification->hide(preview); if (m_in_preview && notification->get_type() == NotificationType::DidYouKnowHint) notification->close(); + if (notification->get_type() == NotificationType::ValidateWarning) + notification->hide(preview); } } diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 7fb3fcdf1..7127ce30e 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -73,6 +73,8 @@ enum class NotificationType // Slicing error produced by BackgroundSlicingProcess::validate() or by the BackgroundSlicingProcess background // thread thowing a SlicingError exception. SlicingError, + //Gcode conflict generates slicing severe warning + SlicingSeriousWarning, // Slicing warnings, issued by the slicing process. // Slicing warnings are registered for a particular Print milestone or a PrintObject and its milestone. SlicingWarning, @@ -162,6 +164,8 @@ public: ImportantNotificationLevel, // Warning, no fade-out. WarningNotificationLevel, + // Serious warning, bold reminder + SeriousWarningNotificationLevel, // Error, no fade-out. Top most position. ErrorNotificationLevel, }; @@ -191,6 +195,8 @@ public: void set_upload_job_notification_percentage(int id, const std::string& filename, const std::string& host, float percentage); void upload_job_notification_show_canceled(int id, const std::string& filename, const std::string& host); void upload_job_notification_show_error(int id, const std::string& filename, const std::string& host); + void push_slicing_serious_warning_notification(const std::string &text, std::vector objs); + void close_slicing_serious_warning_notification(const std::string &text); // Creates Slicing Error notification with a custom text and no fade out. void push_slicing_error_notification(const std::string &text, std::vector objs); // Creates Slicing Warning notification with a custom text and no fade out. @@ -375,6 +381,7 @@ private: PopNotification(const NotificationData &n, NotificationIDProvider &id_provider, wxEvtHandler* evt_handler); virtual ~PopNotification() { if (m_id) m_id_provider.release_id(m_id); } virtual void render(GLCanvas3D& canvas, float initial_y, bool move_from_overlay, float overlay_width, float right_margin); + virtual void bbl_render_block_notification(GLCanvas3D &canvas, float initial_y, bool move_from_overlay, float overlay_width, float right_margin); // close will dissapear notification on next render virtual void close() { m_state = EState::ClosePending; wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0);} // data from newer notification of same type @@ -384,6 +391,8 @@ private: void reinit() { m_state = EState::Unknown; } // returns top after movement float get_top() const { return m_top_y; } + // returns bottom after movement + float get_bottom() const { return m_bottom_y; } //returns top in actual frame float get_current_top() const { return m_top_y; } const NotificationType get_type() const { return m_data.type; } @@ -420,6 +429,13 @@ private: const float text_x, const float text_y, const std::string text, bool more = false); + virtual void bbl_render_block_notif_text(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + virtual void bbl_render_block_notif_buttons(ImGuiWrapper& imgui, + ImVec2 win_size, + ImVec2 win_pos); + virtual void bbl_render_block_notif_left_sign(ImGuiWrapper &imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y); // Left sign could be error or warning sign virtual void bbl_render_left_sign(ImGuiWrapper &imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y); @@ -511,6 +527,8 @@ private: float m_window_width { 450.0f }; //Distance from bottom of notifications to top of this notification float m_top_y { 0.0f }; + //Distance from top of block notifications to bottom of this notification + float m_bottom_y { 0.0f }; // Height of text - Used as basic scaling unit! float m_line_height; // endlines for text1, hypertext excluded diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index 9ca59de71..db8cbfaf0 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -398,7 +398,7 @@ public: { bool result = m_slice_result_valid; if (result) - result = m_gcode_result ? (!m_gcode_result->toolpath_outside && !m_gcode_result->conflict_result.has_value()) : false; + result = m_gcode_result ? (!m_gcode_result->toolpath_outside) : false;// && !m_gcode_result->conflict_result.has_value() gcode conflict can also print return result; }