[Bf-blender-cvs] [649fdc79385] master: Fix T73049: Drag & drop on overlapping panels behaves incorrectly
Jacques Lucke
noreply at git.blender.org
Thu Mar 12 19:38:24 CET 2020
Commit: 649fdc793851a214f54c9ecdaae4c120c4bd11c9
Author: Jacques Lucke
Date: Thu Mar 12 19:34:59 2020 +0100
Branches: master
https://developer.blender.org/rB649fdc793851a214f54c9ecdaae4c120c4bd11c9
Fix T73049: Drag & drop on overlapping panels behaves incorrectly
Reviewers: brecht, Severin
Differential Revision: https://developer.blender.org/D7024
===================================================================
M source/blender/editors/include/ED_screen.h
M source/blender/editors/screen/area_query.c
M source/blender/editors/space_image/space_image.c
M source/blender/editors/space_view3d/space_view3d.c
===================================================================
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 1dd40f27fbb..0785b0e97f7 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -431,6 +431,7 @@ int ED_region_generic_tools_region_snap_size(const struct ARegion *region, int s
bool ED_region_overlap_isect_x(const ARegion *region, const int event_x);
bool ED_region_overlap_isect_y(const ARegion *region, const int event_y);
bool ED_region_overlap_isect_xy(const ARegion *region, const int event_xy[2]);
+bool ED_region_overlap_isect_any_xy(const ScrArea *area, const int event_xy[2]);
bool ED_region_overlap_isect_x_with_margin(const ARegion *region,
const int event_x,
const int margin);
diff --git a/source/blender/editors/screen/area_query.c b/source/blender/editors/screen/area_query.c
index f8a6b301911..2cccd9a2ba5 100644
--- a/source/blender/editors/screen/area_query.c
+++ b/source/blender/editors/screen/area_query.c
@@ -61,6 +61,18 @@ bool ED_region_overlap_isect_xy(const ARegion *region, const int event_xy[2])
ED_region_overlap_isect_y(region, event_xy[1]));
}
+bool ED_region_overlap_isect_any_xy(const ScrArea *area, const int event_xy[2])
+{
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
+ if (ED_region_is_overlap(area->spacetype, region->regiontype)) {
+ if (ED_region_overlap_isect_xy(region, event_xy)) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
bool ED_region_panel_category_gutter_calc_rect(const ARegion *region, rcti *r_ar_gutter)
{
*r_ar_gutter = region->winrct;
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index dc546e5baf5..42a8a746eef 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -262,18 +262,22 @@ static void image_keymap(struct wmKeyConfig *keyconf)
}
/* dropboxes */
-static bool image_drop_poll(bContext *UNUSED(C),
+static bool image_drop_poll(bContext *C,
wmDrag *drag,
- const wmEvent *UNUSED(event),
+ const wmEvent *event,
const char **UNUSED(tooltip))
{
+ ScrArea *area = CTX_wm_area(C);
+ if (ED_region_overlap_isect_any_xy(area, &event->x)) {
+ return false;
+ }
if (drag->type == WM_DRAG_PATH) {
/* rule might not work? */
if (ELEM(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_MOVIE, ICON_FILE_BLANK)) {
- return 1;
+ return true;
}
}
- return 0;
+ return false;
}
static void image_drop_copy(wmDrag *drag, wmDropBox *drop)
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 8ec7d5a166b..020c58270fc 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -436,35 +436,50 @@ static void view3d_main_region_exit(wmWindowManager *wm, ARegion *region)
ED_view3d_stop_render_preview(wm, region);
}
-static bool view3d_ob_drop_poll(bContext *UNUSED(C),
+static bool view3d_drop_id_in_main_region_poll(bContext *C,
+ wmDrag *drag,
+ const wmEvent *event,
+ ID_Type id_type)
+{
+ ScrArea *area = CTX_wm_area(C);
+ if (ED_region_overlap_isect_any_xy(area, &event->x)) {
+ return false;
+ }
+ return WM_drag_ID(drag, id_type) != NULL;
+}
+
+static bool view3d_ob_drop_poll(bContext *C,
wmDrag *drag,
- const wmEvent *UNUSED(event),
+ const wmEvent *event,
const char **UNUSED(tooltip))
{
- return WM_drag_ID(drag, ID_OB) != NULL;
+ return view3d_drop_id_in_main_region_poll(C, drag, event, ID_OB);
}
-static bool view3d_collection_drop_poll(bContext *UNUSED(C),
+static bool view3d_collection_drop_poll(bContext *C,
wmDrag *drag,
- const wmEvent *UNUSED(event),
+ const wmEvent *event,
const char **UNUSED(tooltip))
{
- return WM_drag_ID(drag, ID_GR) != NULL;
+ return view3d_drop_id_in_main_region_poll(C, drag, event, ID_GR);
}
-static bool view3d_mat_drop_poll(bContext *UNUSED(C),
+static bool view3d_mat_drop_poll(bContext *C,
wmDrag *drag,
- const wmEvent *UNUSED(event),
+ const wmEvent *event,
const char **UNUSED(tooltip))
{
- return WM_drag_ID(drag, ID_MA) != NULL;
+ return view3d_drop_id_in_main_region_poll(C, drag, event, ID_MA);
}
-static bool view3d_ima_drop_poll(bContext *UNUSED(C),
+static bool view3d_ima_drop_poll(bContext *C,
wmDrag *drag,
- const wmEvent *UNUSED(event),
+ const wmEvent *event,
const char **UNUSED(tooltip))
{
+ if (ED_region_overlap_isect_any_xy(CTX_wm_area(C), &event->x)) {
+ return false;
+ }
if (drag->type == WM_DRAG_PATH) {
/* rule might not work? */
return (ELEM(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_MOVIE));
More information about the Bf-blender-cvs
mailing list