diff options
author | ack-err <ack-err> | 2013-09-04 15:56:14 +0400 |
---|---|---|
committer | ack-err <ack-err> | 2013-09-04 15:56:14 +0400 |
commit | a8ee1b7f5486d325eda484649c4860d43b5642ed (patch) | |
tree | ee6c2f6cee71520f54d957da08e46e6daceaaec3 | |
parent | a8db9bcf5f330fbdca87d76611a902f0977b3f6e (diff) |
Drag polling and drag operator naming does now respect and prefer overlapping regions.
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 1 | ||||
-rw-r--r-- | 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; } |