forked from bartvdbraak/blender
Fix T65479: Gizmo drag unusable with tools that activate on press
This commit is contained in:
parent
29526504d7
commit
6bc761a12e
@ -88,6 +88,20 @@
|
|||||||
#include "DEG_depsgraph.h"
|
#include "DEG_depsgraph.h"
|
||||||
#include "DEG_depsgraph_query.h"
|
#include "DEG_depsgraph_query.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When a gizmo is highlighted and uses click/drag events,
|
||||||
|
* this prevents mouse button press events from being passed through to other key-maps
|
||||||
|
* which would obscure those events.
|
||||||
|
*
|
||||||
|
* This allows gizmos that only use drag to co-exist with tools that use click.
|
||||||
|
*
|
||||||
|
* Without tools using press events which would prevent click/drag events getting to the gizmos.
|
||||||
|
*
|
||||||
|
* This is not a fool proof solution since since it's possible the gizmo operators would pass
|
||||||
|
* through thse events when called, see: T65479.
|
||||||
|
*/
|
||||||
|
#define USE_GIZMO_MOUSE_PRIORITY_HACK
|
||||||
|
|
||||||
static void wm_notifier_clear(wmNotifier *note);
|
static void wm_notifier_clear(wmNotifier *note);
|
||||||
static void update_tablet_data(wmWindow *win, wmEvent *event);
|
static void update_tablet_data(wmWindow *win, wmEvent *event);
|
||||||
|
|
||||||
@ -2578,14 +2592,17 @@ static int wm_handlers_do_keymap_with_gizmo_handler(
|
|||||||
/* Additional. */
|
/* Additional. */
|
||||||
wmGizmoGroup *gzgroup,
|
wmGizmoGroup *gzgroup,
|
||||||
wmKeyMap *keymap,
|
wmKeyMap *keymap,
|
||||||
const bool do_debug_handler)
|
const bool do_debug_handler,
|
||||||
|
bool *r_keymap_poll)
|
||||||
{
|
{
|
||||||
int action = WM_HANDLER_CONTINUE;
|
int action = WM_HANDLER_CONTINUE;
|
||||||
|
bool keymap_poll = false;
|
||||||
wmKeyMapItem *kmi;
|
wmKeyMapItem *kmi;
|
||||||
|
|
||||||
PRINT("%s: checking '%s' ...", __func__, keymap->idname);
|
PRINT("%s: checking '%s' ...", __func__, keymap->idname);
|
||||||
|
|
||||||
if (WM_keymap_poll(C, keymap)) {
|
if (WM_keymap_poll(C, keymap)) {
|
||||||
|
keymap_poll = true;
|
||||||
PRINT("pass\n");
|
PRINT("pass\n");
|
||||||
for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
||||||
if (wm_eventmatch(event, kmi)) {
|
if (wm_eventmatch(event, kmi)) {
|
||||||
@ -2623,6 +2640,11 @@ static int wm_handlers_do_keymap_with_gizmo_handler(
|
|||||||
else {
|
else {
|
||||||
PRINT("fail\n");
|
PRINT("fail\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r_keymap_poll) {
|
||||||
|
*r_keymap_poll = keymap_poll;
|
||||||
|
}
|
||||||
|
|
||||||
return action;
|
return action;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2772,16 +2794,49 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Don't use from now on. */
|
/* Don't use from now on. */
|
||||||
const bool is_event_handle_all = gz && (gz->flag & WM_GIZMO_EVENT_HANDLE_ALL);
|
bool is_event_handle_all = gz && (gz->flag & WM_GIZMO_EVENT_HANDLE_ALL);
|
||||||
|
|
||||||
if (handle_keymap) {
|
if (handle_keymap) {
|
||||||
/* Handle highlight gizmo. */
|
/* Handle highlight gizmo. */
|
||||||
if (gz != NULL) {
|
if (gz != NULL) {
|
||||||
|
bool keymap_poll = false;
|
||||||
wmGizmoGroup *gzgroup = gz->parent_gzgroup;
|
wmGizmoGroup *gzgroup = gz->parent_gzgroup;
|
||||||
wmKeyMap *keymap = WM_keymap_active(wm,
|
wmKeyMap *keymap = WM_keymap_active(wm,
|
||||||
gz->keymap ? gz->keymap : gzgroup->type->keymap);
|
gz->keymap ? gz->keymap : gzgroup->type->keymap);
|
||||||
action |= wm_handlers_do_keymap_with_gizmo_handler(
|
action |= wm_handlers_do_keymap_with_gizmo_handler(
|
||||||
C, event, handlers, handler, gzgroup, keymap, do_debug_handler);
|
C, event, handlers, handler, gzgroup, keymap, do_debug_handler, &keymap_poll);
|
||||||
|
|
||||||
|
#ifdef USE_GIZMO_MOUSE_PRIORITY_HACK
|
||||||
|
if (((action & WM_HANDLER_BREAK) == 0) && !is_event_handle_all && keymap_poll) {
|
||||||
|
if ((event->val == KM_PRESS) &&
|
||||||
|
ELEM(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE)) {
|
||||||
|
|
||||||
|
wmEvent event_test_click = *event;
|
||||||
|
event_test_click.val = KM_CLICK;
|
||||||
|
|
||||||
|
wmEvent event_test_click_drag = *event;
|
||||||
|
event_test_click_drag.val = KM_CLICK_DRAG;
|
||||||
|
|
||||||
|
wmEvent event_test_tweak = *event;
|
||||||
|
event_test_tweak.type = EVT_TWEAK_L + (event->type - LEFTMOUSE);
|
||||||
|
event_test_tweak.val = KM_ANY;
|
||||||
|
|
||||||
|
for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
||||||
|
if ((kmi->flag & KMI_INACTIVE) == 0) {
|
||||||
|
if (wm_eventmatch(&event_test_click, kmi) ||
|
||||||
|
wm_eventmatch(&event_test_click_drag, kmi) ||
|
||||||
|
wm_eventmatch(&event_test_tweak, kmi)) {
|
||||||
|
wmOperatorType *ot = WM_operatortype_find(kmi->idname, 0);
|
||||||
|
if (WM_operator_poll_context(C, ot, WM_OP_INVOKE_DEFAULT)) {
|
||||||
|
is_event_handle_all = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* USE_GIZMO_MOUSE_PRIORITY_HACK */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't use from now on. */
|
/* Don't use from now on. */
|
||||||
@ -2795,7 +2850,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||||||
if (wm_gizmogroup_is_any_selected(gzgroup)) {
|
if (wm_gizmogroup_is_any_selected(gzgroup)) {
|
||||||
wmKeyMap *keymap = WM_keymap_active(wm, gzgroup->type->keymap);
|
wmKeyMap *keymap = WM_keymap_active(wm, gzgroup->type->keymap);
|
||||||
action |= wm_handlers_do_keymap_with_gizmo_handler(
|
action |= wm_handlers_do_keymap_with_gizmo_handler(
|
||||||
C, event, handlers, handler, gzgroup, keymap, do_debug_handler);
|
C, event, handlers, handler, gzgroup, keymap, do_debug_handler, NULL);
|
||||||
if (action & WM_HANDLER_BREAK) {
|
if (action & WM_HANDLER_BREAK) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user