diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index ef51c6b872..24a7bd6d5f 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -5600,37 +5600,28 @@ void GCodeViewer::render_legend(float& legend_height) if (imgui.draw_radio_button(name, 1.5f * icon_size, active, draw_callback)) { #if ENABLE_NEW_GCODE_VIEWER - const libvgcode::Interval& view_visible_range = m_viewer.get_view_visible_range(); - const libvgcode::Interval& view_enabled_range = m_viewer.get_view_enabled_range(); - bool keep_visible_range = false; + const libvgcode::Interval view_visible_range = m_viewer.get_view_visible_range(); + const libvgcode::Interval view_enabled_range = m_viewer.get_view_enabled_range(); + const bool keep_visible_range = view_visible_range != view_enabled_range; #if ENABLE_COG_AND_TOOL_MARKERS - if (type == Preview::OptionType::Shells) - m_shells.visible = !active; - else { - m_viewer.toggle_option_visibility(libvgcode::convert(type)); - if (view_visible_range != view_enabled_range) - keep_visible_range = true; - } + if (type == Preview::OptionType::Shells) + m_shells.visible = !active; + else + m_viewer.toggle_option_visibility(libvgcode::convert(type)); #else - switch (type) - { - case Preview::OptionType::CenterOfGravity: { m_cog.set_visible(!active); break; } - case Preview::OptionType::ToolMarker: { m_sequential_view.marker.set_visible(!active); break; } - case Preview::OptionType::Shells: { m_shells.visible = !active; break; } - default: { - m_viewer.toggle_option_visibility(libvgcode::convert(type)); - if (view_visible_range != view_enabled_range) - keep_visible_range = true; - break; - } - } -#endif // ENABLE_COG_AND_TOOL_MARKERS - std::optional view_visible_range_min; - std::optional view_visible_range_max; - if (keep_visible_range) { - view_visible_range_min = static_cast(view_visible_range[0]); - view_visible_range_max = static_cast(view_visible_range[1]); + switch (type) + { + case Preview::OptionType::CenterOfGravity: { m_cog.set_visible(!active); break; } + case Preview::OptionType::ToolMarker: { m_sequential_view.marker.set_visible(!active); break; } + case Preview::OptionType::Shells: { m_shells.visible = !active; break; } + default: { + m_viewer.toggle_option_visibility(libvgcode::convert(type)); + break; } + } +#endif // ENABLE_COG_AND_TOOL_MARKERS + std::optional view_visible_range_min = keep_visible_range ? std::optional{ static_cast(view_visible_range[0]) } : std::nullopt; + std::optional view_visible_range_max = keep_visible_range ? std::optional{ static_cast(view_visible_range[1]) } : std::nullopt; wxGetApp().plater()->update_preview_moves_slider(view_visible_range_min, view_visible_range_max); #else unsigned int new_flags = set_flag(flags, flag, !active); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 2a43fc6bfb..51c39c850c 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -737,6 +737,10 @@ void Preview::update_moves_slider() const libvgcode::Interval& range = m_canvas->get_gcode_view_enabled_range(); uint32_t last_gcode_id = m_canvas->get_gcode_vertex_at(range[0]).gcode_id; + std::optional gcode_id_min = visible_range_min.has_value() ? + std::optional{ m_canvas->get_gcode_vertex_at(*visible_range_min).gcode_id } : std::nullopt; + std::optional gcode_id_max = visible_range_max.has_value() ? + std::optional{ m_canvas->get_gcode_vertex_at(*visible_range_max).gcode_id } : std::nullopt; const size_t range_size = range[1] - range[0] + 1; std::vector values; @@ -750,28 +754,33 @@ void Preview::update_moves_slider() for (size_t i = range[0]; i <= range[1]; ++i) { const uint32_t gcode_id = m_canvas->get_gcode_vertex_at(i).gcode_id; + bool skip = false; if (i > range[0]) { // skip consecutive moves with same gcode id (resulting from processing G2 and G3 lines) if (last_gcode_id == gcode_id) { values.back() = static_cast(i + 1); - alternate_values.back() = static_cast(gcode_id); - continue; + skip = true; } else last_gcode_id = gcode_id; } - values.emplace_back(static_cast(i + 1)); - alternate_values.emplace_back(static_cast(gcode_id)); - if (visible_range_min.has_value() && i + 1 == visible_range_min) + if (!skip) { + values.emplace_back(static_cast(i + 1)); + alternate_values.emplace_back(static_cast(gcode_id)); + } + + if (gcode_id_min.has_value() && alternate_values.back() == static_cast(*gcode_id_min)) visible_range_min_id = counter; - else if (visible_range_max.has_value() && i + 1 == visible_range_max) + else if (gcode_id_max.has_value() && alternate_values.back() == static_cast(*gcode_id_max)) visible_range_max_id = counter; - ++counter; + + if (!skip) + ++counter; } - const int span_min_id = visible_range_min_id.has_value() ? static_cast(*visible_range_min_id) : 0; - const int span_max_id = visible_range_max_id.has_value() ? static_cast(*visible_range_max_id) : static_cast(values.size()) - 1; + const int span_min_id = visible_range_min_id.has_value() ? std::max(0, static_cast(*visible_range_min_id) - 1) : 0; + const int span_max_id = visible_range_max_id.has_value() ? std::max(0, static_cast(*visible_range_max_id) - 1) : static_cast(values.size()) - 1; m_moves_slider->SetSliderValues(values); m_moves_slider->SetSliderAlternateValues(alternate_values);