summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-02-13 21:50:50 +0100
committerAndreas Kling <kling@serenityos.org>2020-02-13 21:50:50 +0100
commit2c14e46b966539c0089ccee1a0b4beb6c16d3475 (patch)
tree2acafc4f9da9db80c851367ffcfb57831901f5da
parentf0ae353c9ef526e91faeed9376528bd6250066a0 (diff)
downloadserenity-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.cpp26
-rw-r--r--Libraries/LibGUI/ItemView.h3
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;
};
}