From a8ee1b7f5486d325eda484649c4860d43b5642ed Mon Sep 17 00:00:00 2001 From: ack-err Date: Wed, 4 Sep 2013 11:56:14 +0000 Subject: Drag polling and drag operator naming does now respect and prefer overlapping regions. --- .../blender/editors/interface/interface_handlers.c | 1 - source/blender/windowmanager/intern/wm_dragdrop.c | 26 ++++++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index c1ec8652b29..cf77c12e5ce 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -2600,7 +2600,6 @@ static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data data->escapecancel = true; button_activate_state(C, but, BUTTON_STATE_EXIT); } - } } diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c index d41715640df..42c13d39fe5 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.c +++ b/source/blender/windowmanager/intern/wm_dragdrop.c @@ -199,7 +199,9 @@ static const char *wm_dropbox_active(bContext *C, wmDrag *drag, wmEvent *event) wmWindow *win = CTX_wm_window(C); ScrArea *sa = CTX_wm_area(C); ARegion *ar = CTX_wm_region(C); - const char *name; + ARegion *ar_iter = NULL; + const char *name = NULL; + const char *name_overlap = NULL; name = dropbox_active(C, &win->handlers, drag, event); if (name) return name; @@ -208,7 +210,27 @@ static const char *wm_dropbox_active(bContext *C, wmDrag *drag, wmEvent *event) if (name) return name; name = dropbox_active(C, &ar->handlers, drag, event); - if (name) return name; + + /* Make sure overlapping regions are preferred over non-overlapping ones */ + if (!ar->overlap) { + for (ar_iter = sa->regionbase.first; ar_iter; ar_iter = ar_iter->next) { + if (ar_iter->overlap) { + /* only update name_overlap if none was found yet */ + if (name_overlap == NULL) { + /* We've got to fake the region for a little bit */ + CTX_wm_region_set(C, ar_iter); + name_overlap = dropbox_active(C, &ar_iter->handlers, drag, event); + } + } + } + } + /* make sure proper region is restored */ + CTX_wm_region_set(C, ar); + + if (name_overlap) + return name_overlap; + if (name) + return name; return NULL; } -- cgit v1.2.3