diff options
author | Andreas Kling <kling@serenityos.org> | 2020-02-13 21:50:50 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-02-13 21:50:50 +0100 |
commit | 2c14e46b966539c0089ccee1a0b4beb6c16d3475 (patch) | |
tree | 2acafc4f9da9db80c851367ffcfb57831901f5da | |
parent | f0ae353c9ef526e91faeed9376528bd6250066a0 (diff) | |
download | serenity-2c14e46b966539c0089ccee1a0b4beb6c16d3475.zip |
LibGUI: Indicate ItemView drag acceptance with a little rectangle
If an index accepts a drag, we now draw a little rectangle around it
when the drag moves over it.
-rw-r--r-- | Libraries/LibGUI/ItemView.cpp | 26 | ||||
-rw-r--r-- | Libraries/LibGUI/ItemView.h | 3 |
2 files changed, 29 insertions, 0 deletions
diff --git a/Libraries/LibGUI/ItemView.cpp b/Libraries/LibGUI/ItemView.cpp index 5c0dd5c76a..55d7f94e2e 100644 --- a/Libraries/LibGUI/ItemView.cpp +++ b/Libraries/LibGUI/ItemView.cpp @@ -33,6 +33,8 @@ #include <LibGUI/Painter.h> #include <LibGUI/ScrollBar.h> +//#define DRAGDROP_DEBUG + namespace GUI { ItemView::ItemView(Widget* parent) @@ -178,6 +180,25 @@ void ItemView::mouseup_event(MouseEvent& event) AbstractView::mouseup_event(event); } +void ItemView::drag_move_event(DragEvent& event) +{ + auto index = index_at_event_position(event.position()); + ModelIndex new_drop_candidate_index; + if (index.is_valid()) { + bool acceptable = model()->accepts_drag(index, event.data_type()); +#ifdef DRAGDROP_DEBUG + dbg() << "Drag of type '" << event.data_type() << "' moving over " << index << ", acceptable: " << acceptable; +#endif + if (acceptable) + new_drop_candidate_index = index; + } + if (m_drop_candidate_index != new_drop_candidate_index) { + m_drop_candidate_index = new_drop_candidate_index; + update(); + } + event.accept(); +} + void ItemView::mousemove_event(MouseEvent& event) { if (!model()) @@ -273,6 +294,11 @@ void ItemView::paint_event(PaintEvent& event) text_color = model()->data(model_index, Model::Role::ForegroundColor).to_color(palette().color(foreground_role())); painter.fill_rect(text_rect, background_color); painter.draw_text(text_rect, item_text.to_string(), font, Gfx::TextAlignment::Center, text_color, Gfx::TextElision::Right); + + if (model_index == m_drop_candidate_index) { + // FIXME: This visualization is not great, as it's also possible to drop things on the text label.. + painter.draw_rect(icon_rect.inflated(8, 8), palette().selection(), true); + } }; } diff --git a/Libraries/LibGUI/ItemView.h b/Libraries/LibGUI/ItemView.h index 08900cdb30..d5eafe31ac 100644 --- a/Libraries/LibGUI/ItemView.h +++ b/Libraries/LibGUI/ItemView.h @@ -63,6 +63,7 @@ private: virtual void mousemove_event(MouseEvent&) override; virtual void mouseup_event(MouseEvent&) override; virtual void keydown_event(KeyEvent&) override; + virtual void drag_move_event(DragEvent&) override; int item_count() const; Gfx::Rect item_rect(int item_index) const; @@ -81,6 +82,8 @@ private: Gfx::Point m_rubber_band_origin; Gfx::Point m_rubber_band_current; Vector<ModelIndex> m_rubber_band_remembered_selection; + + ModelIndex m_drop_candidate_index; }; } |