PixelPaint: Fix layer dragging bug

A previous commit I made broke layer dragging since the hole_index
was always being computed with respect to the top of the layer list
widget, however we were now drawing layers from the bottom. When
you didn't have enough layers to fill up the full height, dragging
them around would be weird.

This patch computes the hole index correctly using the same offset
we start drawing from, and fixes the behavior.
This commit is contained in:
Mustafa Quraish 2021-09-02 20:16:19 -04:00 committed by Andreas Kling
parent fd895c7a24
commit 285a888b61
Notes: sideshowbarker 2024-07-18 04:33:48 +09:00
2 changed files with 8 additions and 5 deletions

View File

@ -277,7 +277,9 @@ size_t LayerListWidget::hole_index_during_move() const
VERIFY(is_moving_gadget());
auto& moving_gadget = m_gadgets[m_moving_gadget_index.value()];
int center_y_of_moving_gadget = moving_gadget.rect.translated(0, moving_gadget.movement_delta.y()).center().y();
return center_y_of_moving_gadget / vertical_step;
int top_of_gadgets = max(0, height() - m_total_gadget_height);
return (center_y_of_moving_gadget - top_of_gadgets) / vertical_step;
}
void LayerListWidget::select_bottom_layer()
@ -316,8 +318,8 @@ void LayerListWidget::cycle_through_selection(int delta)
void LayerListWidget::relayout_gadgets()
{
auto total_gadget_height = static_cast<int>(m_gadgets.size()) * vertical_step + 6;
int y = max(0, height() - total_gadget_height);
m_total_gadget_height = static_cast<int>(m_gadgets.size()) * vertical_step + 6;
int y = max(0, height() - m_total_gadget_height);
Optional<size_t> hole_index;
if (is_moving_gadget())
@ -334,8 +336,8 @@ void LayerListWidget::relayout_gadgets()
++index;
}
set_content_size({ widget_inner_rect().width(), total_gadget_height });
vertical_scrollbar().set_range(0, max(total_gadget_height - height(), 0));
set_content_size({ widget_inner_rect().width(), m_total_gadget_height });
vertical_scrollbar().set_range(0, max(m_total_gadget_height - height(), 0));
update();
}

View File

@ -73,6 +73,7 @@ private:
Gfx::IntPoint m_moving_event_origin;
size_t m_selected_gadget_index { 0 };
int m_total_gadget_height { 0 };
};
}