From 0766638212c087148e02db99a02baa210837bc7e Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 26 Jun 2024 15:12:43 +0200 Subject: [PATCH] Follow-up 97d82a0d57fb675960dd0f3e7c2f56862e6b6ac5 - Fixed labels on ruler --- src/slic3r/GUI/DoubleSliderForLayers.cpp | 52 ++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/DoubleSliderForLayers.cpp b/src/slic3r/GUI/DoubleSliderForLayers.cpp index 42e6ae85f1..4a56eea221 100644 --- a/src/slic3r/GUI/DoubleSliderForLayers.cpp +++ b/src/slic3r/GUI/DoubleSliderForLayers.cpp @@ -344,12 +344,15 @@ void DSForLayers::draw_ruler(const ImRect& slideable_region) int tick = 0; double value = 0.0; size_t sequence = 0; - int prev_y_pos = -1; + float prev_y_pos = -1.f; int values_size = (int)m_values.size(); + const float label_shift = 0.5f * label_height; + if (m_ruler.long_step < 0) { // sequential print when long_step wasn't detected because of a lot of printed objects if (m_ruler.max_values.size() > 1) { + float last_pos = get_tick_pos(m_ctrl.GetMaxPos()); while (tick <= m_ctrl.GetMaxPos() && sequence < m_ruler.count()) { // draw just ticks with max value value = m_ruler.max_values[sequence]; @@ -369,7 +372,7 @@ void DSForLayers::draw_ruler(const ImRect& slideable_region) float pos = get_tick_pos(tick); draw_tick(pos, long_outer_x); - if (prev_y_pos < 0 || prev_y_pos - pos >= label_height) { + if (prev_y_pos < 0 || pos == last_pos || (prev_y_pos - pos >= label_shift && pos - last_pos >= label_shift)) { draw_text(tick, pos); prev_y_pos = pos; } @@ -391,6 +394,46 @@ void DSForLayers::draw_ruler(const ImRect& slideable_region) } } else { + std::vector last_positions; + if (m_ruler.count() == 1) + last_positions.emplace_back(m_ctrl.GetMaxPos()); + else { + // fill last positions for each object in sequential print + last_positions.reserve(m_ruler.count()); + + int tick = 0; + double value = 0.0; + size_t sequence = 0; + + while (tick <= m_ctrl.GetMaxPos()) { + value += m_ruler.long_step; + + if (sequence < m_ruler.count() && value > m_ruler.max_values[sequence]) + value = m_ruler.max_values[sequence]; + + for (; tick < values_size; tick++) { + if (m_values[tick] == value) + break; + if (m_values[tick] > value) { + if (tick > 0) + tick--; + break; + } + } + if (tick > m_ctrl.GetMaxPos()) + break; + + if (sequence < m_ruler.count() && value == m_ruler.max_values[sequence]) { + last_positions.emplace_back(tick); + value = 0.0; + sequence++; + tick++; + } + } + } + + float last_pos = get_tick_pos(last_positions[sequence]); + while (tick <= m_ctrl.GetMaxPos()) { value += m_ruler.long_step; @@ -413,7 +456,7 @@ void DSForLayers::draw_ruler(const ImRect& slideable_region) float pos = get_tick_pos(tick); draw_tick(pos, long_outer_x); - if (prev_y_pos < 0 || prev_y_pos - pos >= label_height) { + if (prev_y_pos < 0 || pos == last_pos || (prev_y_pos - pos >= label_shift && pos - last_pos >= label_shift) ) { draw_text(tick, pos); prev_y_pos = pos; } @@ -424,6 +467,9 @@ void DSForLayers::draw_ruler(const ImRect& slideable_region) value = 0.0; sequence++; tick++; + + if (sequence < m_ruler.count()) + last_pos = get_tick_pos(last_positions[sequence]); } } // short ticks from the last tick to the end