Event System: remove tweak events in favor of click-drag
Supporting two kinds of dragging is redundant, remove tweak events as they only supported 3 mouse buttons and added complexity from using the 'value' to store directions. Support only click-drag events (KM_CLICK_DRAG) which can be used with any keyboard or mouse button. Details: - A "direction" member has been added to keymap items and events which can be used when the event value is set to KM_CLICK_DRAG. - Keymap items are version patched. - Loading older key-maps are also updated. - Currently the key-maps stored in ./release/scripts/presets/keyconfig/ still reference tweak events & need updating. For now they are updated on load. Note that in general this wont impact add-ons as modal operators don't receive tweak events. Reviewed By: brecht Ref D14214
This commit is contained in:
parent
426ff481a7
commit
4986f71848
Notes:
blender-bot
2023-02-14 10:18:56 +01:00
Referenced by commit4c3e91e5f5
, Fix T96520 Node editor: Tweak fails with unselected nodes Referenced by commitd4bdf21929
, Fix T96701: RMB select fails to show gizmo on mouse button release Referenced by commitfb87578698
, Fix T96255: Node socket fails to drag Referenced by issue #101904, Keymap Option Tweak Missing Referenced by issue #96701, Gizmo does not show unless screen is updated(?) for right click select. Referenced by issue #96515, Regression: Can not translate after selecting with Select Circle Referenced by issue #96120, Crash when trying to drag and drop from the file browser
|
@ -52,6 +52,8 @@ def kmi_args_as_data(kmi):
|
|||
s.append(f"\"{attr:s}\": " + ("-1" if mod == -1 else "True"))
|
||||
if (mod := kmi.key_modifier) and (mod != 'NONE'):
|
||||
s.append(f"\"key_modifier\": '{mod:s}'")
|
||||
if (direction := kmi.direction) and (direction != 'ANY'):
|
||||
s.append(f"\"direction\": '{direction:s}'")
|
||||
|
||||
if kmi.repeat:
|
||||
if (
|
||||
|
@ -247,6 +249,20 @@ def _init_properties_from_data(base_props, base_value):
|
|||
def keymap_init_from_data(km, km_items, is_modal=False):
|
||||
new_fn = getattr(km.keymap_items, "new_modal" if is_modal else "new")
|
||||
for (kmi_idname, kmi_args, kmi_data) in km_items:
|
||||
|
||||
# TODO(@campbellbarton): Temporary workaround keep until our
|
||||
# key-maps have been updated to remove tweak events.
|
||||
if ty_new := {
|
||||
'EVT_TWEAK_L': 'LEFTMOUSE',
|
||||
'EVT_TWEAK_M': 'MIDDLEMOUSE',
|
||||
'EVT_TWEAK_R': 'RIGHTMOUSE',
|
||||
}.get(kmi_args["type"]):
|
||||
kmi_args["type"] = ty_new
|
||||
if (value := kmi_args["value"]) != 'ANY':
|
||||
kmi_args["direction"] = value
|
||||
kmi_args["value"] = 'CLICK_DRAG'
|
||||
# End workaround.
|
||||
|
||||
kmi = new_fn(kmi_idname, **kmi_args)
|
||||
if kmi_data is not None:
|
||||
if not kmi_data.get("active", True):
|
||||
|
|
|
@ -30,4 +30,22 @@ def keyconfig_update(keyconfig_data, keyconfig_version):
|
|||
# Setting repeat true on other kinds of events is harmless.
|
||||
item_event["repeat"] = True
|
||||
|
||||
if keyconfig_version <= (3, 2, 5):
|
||||
# Only copy once.
|
||||
if not has_copy:
|
||||
keyconfig_data = copy.deepcopy(keyconfig_data)
|
||||
has_copy = True
|
||||
|
||||
for _km_name, _km_parms, km_items_data in keyconfig_data:
|
||||
for (_item_op, item_event, _item_prop) in km_items_data["items"]:
|
||||
if ty_new := {
|
||||
'EVT_TWEAK_L': 'LEFTMOUSE',
|
||||
'EVT_TWEAK_M': 'MIDDLEMOUSE',
|
||||
'EVT_TWEAK_R': 'RIGHTMOUSE',
|
||||
}.get(item_event.get("type")):
|
||||
item_event["type"] = ty_new
|
||||
if (value := item_event["value"]) != 'ANY':
|
||||
item_event["direction"] = value
|
||||
item_event["value"] = 'CLICK_DRAG'
|
||||
|
||||
return keyconfig_data
|
||||
|
|
|
@ -180,6 +180,10 @@ def draw_kmi(display_keymaps, kc, km, kmi, layout, level):
|
|||
subrow.prop(kmi, "type", text="")
|
||||
subrow.prop(kmi, "value", text="")
|
||||
|
||||
if map_type in {'KEYBOARD', 'MOUSE'} and kmi.value == 'CLICK_DRAG':
|
||||
subrow = sub.row()
|
||||
subrow.prop(kmi, "direction")
|
||||
|
||||
subrow = sub.row()
|
||||
subrow.scale_x = 0.75
|
||||
subrow.prop(kmi, "any", toggle=True)
|
||||
|
|
|
@ -1426,28 +1426,28 @@ def km_view3d(params):
|
|||
("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
{"properties": [("type", 'BOTTOM'), ("align_active", True)]}),
|
||||
*((
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'NORTH', "alt": True},
|
||||
{"properties": [("type", 'TOP'), ("relative", True)]}),
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'SOUTH', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'SOUTH', "alt": True},
|
||||
{"properties": [("type", 'BOTTOM'), ("relative", True)]}),
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'EAST', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'EAST', "alt": True},
|
||||
{"properties": [("type", 'RIGHT'), ("relative", True)]}),
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'WEST', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'WEST', "alt": True},
|
||||
{"properties": [("type", 'LEFT'), ("relative", True)]}),
|
||||
) if params.v3d_alt_mmb_drag_action == 'RELATIVE' else (
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'NORTH', "alt": True},
|
||||
{"properties": [("type", 'TOP')]}),
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'SOUTH', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'SOUTH', "alt": True},
|
||||
{"properties": [("type", 'BOTTOM')]}),
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'EAST', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'EAST', "alt": True},
|
||||
{"properties": [("type", 'RIGHT')]}),
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'WEST', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'WEST', "alt": True},
|
||||
{"properties": [("type", 'LEFT')]}),
|
||||
# Match the pie menu.
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH_WEST', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'NORTH_WEST', "alt": True},
|
||||
{"properties": [("type", 'FRONT')]}),
|
||||
("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH_EAST', "alt": True},
|
||||
("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'NORTH_EAST', "alt": True},
|
||||
{"properties": [("type", 'BACK')]}),
|
||||
# Match the pie menu.
|
||||
)),
|
||||
("view3d.view_center_pick", {"type": 'MIDDLEMOUSE', "value": 'CLICK', "alt": True}, None),
|
||||
("view3d.ndof_orbit_zoom", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
|
||||
|
@ -6600,10 +6600,10 @@ def km_3d_view_tool_shear(params):
|
|||
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
|
||||
{"items": [
|
||||
("transform.shear",
|
||||
{"type": params.tool_tweak, "value": 'NORTH', **params.tool_modifier},
|
||||
{"type": params.tool_mouse, "value": 'CLICK_DRAG', "direction": 'NORTH', **params.tool_modifier},
|
||||
{"properties": [("release_confirm", True), ("orient_axis_ortho", 'Y')]}),
|
||||
("transform.shear",
|
||||
{"type": params.tool_tweak, "value": 'SOUTH', **params.tool_modifier},
|
||||
{"type": params.tool_mouse, "value": 'CLICK_DRAG', "direction": 'SOUTH', **params.tool_modifier},
|
||||
{"properties": [("release_confirm", True), ("orient_axis_ortho", 'Y')]}),
|
||||
|
||||
# Use as fallback to catch diagonals too.
|
||||
|
|
|
@ -25,7 +25,7 @@ extern "C" {
|
|||
|
||||
/* Blender file format version. */
|
||||
#define BLENDER_FILE_VERSION BLENDER_VERSION
|
||||
#define BLENDER_FILE_SUBVERSION 4
|
||||
#define BLENDER_FILE_SUBVERSION 5
|
||||
|
||||
/* Minimum Blender version that supports reading file written with the current
|
||||
* version. Older Blender versions will test this and show a warning if the file
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
|
||||
#include "readfile.h" /* Own include. */
|
||||
|
||||
#include "WM_types.h"
|
||||
#include "wm_event_types.h"
|
||||
|
||||
/* Don't use translation strings in versioning!
|
||||
|
@ -363,10 +364,12 @@ static void do_version_select_mouse(UserDef *userdef, wmKeyMapItem *kmi)
|
|||
kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
|
||||
break;
|
||||
case EVT_TWEAK_S:
|
||||
kmi->type = (left) ? EVT_TWEAK_L : EVT_TWEAK_R;
|
||||
kmi->type = (left) ? LEFTMOUSE : RIGHTMOUSE;
|
||||
kmi->val = KM_CLICK_DRAG;
|
||||
break;
|
||||
case EVT_TWEAK_A:
|
||||
kmi->type = (left) ? EVT_TWEAK_R : EVT_TWEAK_L;
|
||||
kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
|
||||
kmi->val = KM_CLICK_DRAG;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -385,6 +388,39 @@ static bool keymap_item_has_invalid_wm_context_data_path(wmKeyMapItem *kmi,
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool keymap_item_update_tweak_event(wmKeyMapItem *kmi, void *UNUSED(user_data))
|
||||
{
|
||||
/* Tweak events for L M R mouse-buttons. */
|
||||
enum {
|
||||
EVT_TWEAK_L = 0x5002,
|
||||
EVT_TWEAK_M = 0x5003,
|
||||
EVT_TWEAK_R = 0x5004,
|
||||
};
|
||||
switch (kmi->type) {
|
||||
case EVT_TWEAK_L:
|
||||
kmi->type = LEFTMOUSE;
|
||||
break;
|
||||
case EVT_TWEAK_M:
|
||||
kmi->type = MIDDLEMOUSE;
|
||||
break;
|
||||
case EVT_TWEAK_R:
|
||||
kmi->type = RIGHTMOUSE;
|
||||
break;
|
||||
default:
|
||||
kmi->direction = KM_ANY;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (kmi->val >= EVT_GESTURE_N && kmi->val <= EVT_GESTURE_NW) {
|
||||
kmi->direction = kmi->val;
|
||||
}
|
||||
else {
|
||||
kmi->direction = KM_ANY;
|
||||
}
|
||||
kmi->val = KM_CLICK_DRAG;
|
||||
return false;
|
||||
}
|
||||
|
||||
void blo_do_versions_userdef(UserDef *userdef)
|
||||
{
|
||||
/* #UserDef & #Main happen to have the same struct member. */
|
||||
|
@ -952,6 +988,16 @@ void blo_do_versions_userdef(UserDef *userdef)
|
|||
userdef->ndof_flag |= NDOF_CAMERA_PAN_ZOOM;
|
||||
}
|
||||
|
||||
if (!USER_VERSION_ATLEAST(302, 5)) {
|
||||
BKE_keyconfig_pref_filter_items(userdef,
|
||||
&((struct wmKeyConfigFilterItemParams){
|
||||
.check_item = true,
|
||||
.check_diff_item_add = true,
|
||||
}),
|
||||
keymap_item_update_tweak_event,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Versioning code until next subversion bump goes here.
|
||||
*
|
||||
|
|
|
@ -201,7 +201,7 @@ static uiBlock *menu_add_shortcut(bContext *C, ARegion *region, void *arg)
|
|||
/* XXX this guess_opname can potentially return a different keymap
|
||||
* than being found on adding later... */
|
||||
wmKeyMap *km = WM_keymap_guess_opname(C, idname);
|
||||
wmKeyMapItem *kmi = WM_keymap_add_item(km, idname, EVT_AKEY, KM_PRESS, 0, 0);
|
||||
wmKeyMapItem *kmi = WM_keymap_add_item(km, idname, EVT_AKEY, KM_PRESS, 0, 0, KM_ANY);
|
||||
const int kmi_id = kmi->id;
|
||||
|
||||
/* This takes ownership of prop, or prop can be NULL for reset. */
|
||||
|
|
|
@ -9398,7 +9398,7 @@ static int ui_list_activate_hovered_row(bContext *C,
|
|||
}
|
||||
}
|
||||
|
||||
const int *mouse_xy = ISTWEAK(event->type) ? event->prev_click_xy : event->xy;
|
||||
const int *mouse_xy = (event->val == KM_CLICK_DRAG) ? event->prev_click_xy : event->xy;
|
||||
uiBut *listrow = ui_list_row_find_mouse_over(region, mouse_xy);
|
||||
if (listrow) {
|
||||
wmOperatorType *custom_activate_optype = ui_list->dyn_data->custom_activate_optype;
|
||||
|
@ -9425,7 +9425,7 @@ static bool ui_list_is_hovering_draggable_but(bContext *C,
|
|||
const wmEvent *event)
|
||||
{
|
||||
/* On a tweak event, uses the coordinates from where tweaking was started. */
|
||||
const int *mouse_xy = ISTWEAK(event->type) ? event->prev_click_xy : event->xy;
|
||||
const int *mouse_xy = (event->val == KM_CLICK_DRAG) ? event->prev_click_xy : event->xy;
|
||||
const uiBut *hovered_but = ui_but_find_mouse_over_ex(region, mouse_xy, false, NULL, NULL);
|
||||
|
||||
if (list->dyn_data->custom_drag_optype) {
|
||||
|
@ -9442,7 +9442,7 @@ static int ui_list_handle_click_drag(bContext *C,
|
|||
ARegion *region,
|
||||
const wmEvent *event)
|
||||
{
|
||||
if (!ELEM(event->type, LEFTMOUSE, EVT_TWEAK_L)) {
|
||||
if (event->type != LEFTMOUSE) {
|
||||
return WM_HANDLER_CONTINUE;
|
||||
}
|
||||
|
||||
|
@ -9452,7 +9452,7 @@ static int ui_list_handle_click_drag(bContext *C,
|
|||
bool activate = false;
|
||||
bool activate_dragging = false;
|
||||
|
||||
if (event->type == EVT_TWEAK_L) {
|
||||
if (event->val == KM_CLICK_DRAG) {
|
||||
if (is_draggable) {
|
||||
activate_dragging = true;
|
||||
activate = true;
|
||||
|
@ -9462,7 +9462,7 @@ static int ui_list_handle_click_drag(bContext *C,
|
|||
* regular events (including mouse presses to start dragging) and this part only kicks in if it
|
||||
* hasn't handled the release event. Note that if there's no overlaid button, the row selects
|
||||
* on the press event already via regular #UI_BTYPE_LISTROW handling. */
|
||||
else if ((event->type == LEFTMOUSE) && (event->val == KM_CLICK)) {
|
||||
else if (event->val == KM_CLICK) {
|
||||
activate = true;
|
||||
}
|
||||
|
||||
|
@ -9549,7 +9549,7 @@ static int ui_handle_list_event(bContext *C, const wmEvent *event, ARegion *regi
|
|||
}
|
||||
}
|
||||
|
||||
if (ELEM(event->type, LEFTMOUSE, EVT_TWEAK_L)) {
|
||||
if (event->type == LEFTMOUSE) {
|
||||
retval = ui_list_handle_click_drag(C, ui_list, region, event);
|
||||
}
|
||||
else if (val == KM_PRESS) {
|
||||
|
|
|
@ -573,18 +573,6 @@ int UI_icon_from_event_type(short event_type, short event_value)
|
|||
else if (event_type == EVT_RIGHTALTKEY) {
|
||||
event_type = EVT_LEFTALTKEY;
|
||||
}
|
||||
else if (event_type == EVT_TWEAK_L) {
|
||||
event_type = LEFTMOUSE;
|
||||
event_value = KM_CLICK_DRAG;
|
||||
}
|
||||
else if (event_type == EVT_TWEAK_M) {
|
||||
event_type = MIDDLEMOUSE;
|
||||
event_value = KM_CLICK_DRAG;
|
||||
}
|
||||
else if (event_type == EVT_TWEAK_R) {
|
||||
event_type = RIGHTMOUSE;
|
||||
event_value = KM_CLICK_DRAG;
|
||||
}
|
||||
|
||||
DrawInfo *di = g_di_event_list;
|
||||
do {
|
||||
|
|
|
@ -50,9 +50,12 @@ void viewdolly_modal_keymap(wmKeyConfig *keyconf)
|
|||
|
||||
/* disabled mode switching for now, can re-implement better, later on */
|
||||
#if 0
|
||||
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ROTATE);
|
||||
WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ROTATE);
|
||||
WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_MOVE);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, KM_ANY, VIEWROT_MODAL_SWITCH_ROTATE);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, KM_ANY, VIEWROT_MODAL_SWITCH_ROTATE);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, KM_ANY, VIEWROT_MODAL_SWITCH_MOVE);
|
||||
#endif
|
||||
|
||||
/* assign map to operators */
|
||||
|
|
|
@ -43,8 +43,8 @@ void viewmove_modal_keymap(wmKeyConfig *keyconf)
|
|||
keymap = WM_modalkeymap_ensure(keyconf, "View3D Move Modal", modal_items);
|
||||
|
||||
/* items for modal map */
|
||||
WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, VIEW_MODAL_CONFIRM);
|
||||
WM_modalkeymap_add_item(keymap, EVT_ESCKEY, KM_PRESS, KM_ANY, 0, VIEW_MODAL_CONFIRM);
|
||||
WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, KM_ANY, VIEW_MODAL_CONFIRM);
|
||||
WM_modalkeymap_add_item(keymap, EVT_ESCKEY, KM_PRESS, KM_ANY, 0, KM_ANY, VIEW_MODAL_CONFIRM);
|
||||
|
||||
/* disabled mode switching for now, can re-implement better, later on */
|
||||
#if 0
|
||||
|
|
|
@ -1697,7 +1697,7 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
|
|||
|
||||
/* Needed to translate tweak events to mouse buttons. */
|
||||
t->launch_event = event ? WM_userdef_event_type_from_keymap_type(event->type) : -1;
|
||||
t->is_launch_event_drag = event ? (ISTWEAK(event->type) || event->val == KM_CLICK_DRAG) : false;
|
||||
t->is_launch_event_drag = event ? (event->val == KM_CLICK_DRAG) : false;
|
||||
|
||||
/* XXX Remove this when wm_operator_call_internal doesn't use window->eventstate
|
||||
* (which can have type = 0) */
|
||||
|
|
|
@ -295,9 +295,6 @@ typedef struct wmWindow {
|
|||
/** Storage for event system. */
|
||||
struct wmEvent *eventstate;
|
||||
|
||||
/** Internal for wm_operators.c. */
|
||||
struct wmGesture *tweak;
|
||||
|
||||
/* Input Method Editor data - complex character input (especially for Asian character input)
|
||||
* Currently WIN32 and APPLE, runtime-only data. */
|
||||
struct wmIMEData *ime_data;
|
||||
|
@ -364,7 +361,9 @@ typedef struct wmKeyMapItem {
|
|||
/** Event code itself. */
|
||||
short type;
|
||||
/** KM_ANY, KM_PRESS, KM_NOTHING etc. */
|
||||
short val;
|
||||
int8_t val;
|
||||
/** Use when `val == WM_CLICK_DRAG`, */
|
||||
int8_t direction;
|
||||
/** `oskey` also known as apple, windows-key or super, value denotes order of pressed. */
|
||||
short shift, ctrl, alt, oskey;
|
||||
/** Raw-key modifier. */
|
||||
|
@ -422,7 +421,7 @@ enum {
|
|||
enum {
|
||||
KMI_TYPE_KEYBOARD = 0,
|
||||
KMI_TYPE_MOUSE = 1,
|
||||
KMI_TYPE_TWEAK = 2,
|
||||
/* 2 is deprecated, was tweak. */
|
||||
KMI_TYPE_TEXTINPUT = 3,
|
||||
KMI_TYPE_TIMER = 4,
|
||||
KMI_TYPE_NDOF = 5,
|
||||
|
|
|
@ -90,9 +90,8 @@ DEF_ENUM(rna_enum_motionpath_bake_location_items)
|
|||
DEF_ENUM(rna_enum_motionpath_display_type_items)
|
||||
DEF_ENUM(rna_enum_motionpath_range_items)
|
||||
|
||||
DEF_ENUM(rna_enum_event_value_all_items)
|
||||
DEF_ENUM(rna_enum_event_value_keymouse_items)
|
||||
DEF_ENUM(rna_enum_event_value_tweak_items)
|
||||
DEF_ENUM(rna_enum_event_value_items)
|
||||
DEF_ENUM(rna_enum_event_direction_items)
|
||||
|
||||
DEF_ENUM(rna_enum_event_type_items)
|
||||
DEF_ENUM(rna_enum_event_type_mask_items)
|
||||
|
|
|
@ -28,13 +28,6 @@
|
|||
|
||||
#ifdef RNA_RUNTIME
|
||||
|
||||
static const EnumPropertyItem event_tweak_type_items[] = {
|
||||
{EVT_TWEAK_L, "EVT_TWEAK_L", 0, "Left", ""},
|
||||
{EVT_TWEAK_M, "EVT_TWEAK_M", 0, "Middle", ""},
|
||||
{EVT_TWEAK_R, "EVT_TWEAK_R", 0, "Right", ""},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
static const EnumPropertyItem event_mouse_type_items[] = {
|
||||
{LEFTMOUSE, "LEFTMOUSE", 0, "Left", ""},
|
||||
{MIDDLEMOUSE, "MIDDLEMOUSE", 0, "Middle", ""},
|
||||
|
@ -156,10 +149,6 @@ const EnumPropertyItem rna_enum_event_type_items[] = {
|
|||
{WHEELINMOUSE, "WHEELINMOUSE", 0, "Wheel In", "WhIn"},
|
||||
{WHEELOUTMOUSE, "WHEELOUTMOUSE", 0, "Wheel Out", "WhOut"},
|
||||
{0, "", 0, NULL, NULL},
|
||||
{EVT_TWEAK_L, "EVT_TWEAK_L", 0, "Tweak Left", "TwkL"},
|
||||
{EVT_TWEAK_M, "EVT_TWEAK_M", 0, "Tweak Middle", "TwkM"},
|
||||
{EVT_TWEAK_R, "EVT_TWEAK_R", 0, "Tweak Right", "TwkR"},
|
||||
{0, "", 0, NULL, NULL},
|
||||
{EVT_AKEY, "A", 0, "A", ""},
|
||||
{EVT_BKEY, "B", 0, "B", ""},
|
||||
{EVT_CKEY, "C", 0, "C", ""},
|
||||
|
@ -362,26 +351,7 @@ const EnumPropertyItem rna_enum_event_type_items[] = {
|
|||
* This is needed for `km.keymap_items.new` value argument,
|
||||
* to accept values from different types.
|
||||
*/
|
||||
const EnumPropertyItem rna_enum_event_value_all_items[] = {
|
||||
{KM_ANY, "ANY", 0, "Any", ""},
|
||||
{KM_PRESS, "PRESS", 0, "Press", ""},
|
||||
{KM_RELEASE, "RELEASE", 0, "Release", ""},
|
||||
{KM_CLICK, "CLICK", 0, "Click", ""},
|
||||
{KM_DBL_CLICK, "DOUBLE_CLICK", 0, "Double Click", ""},
|
||||
{KM_CLICK_DRAG, "CLICK_DRAG", 0, "Click Drag", ""},
|
||||
{EVT_GESTURE_N, "NORTH", 0, "North", ""},
|
||||
{EVT_GESTURE_NE, "NORTH_EAST", 0, "North-East", ""},
|
||||
{EVT_GESTURE_E, "EAST", 0, "East", ""},
|
||||
{EVT_GESTURE_SE, "SOUTH_EAST", 0, "South-East", ""},
|
||||
{EVT_GESTURE_S, "SOUTH", 0, "South", ""},
|
||||
{EVT_GESTURE_SW, "SOUTH_WEST", 0, "South-West", ""},
|
||||
{EVT_GESTURE_W, "WEST", 0, "West", ""},
|
||||
{EVT_GESTURE_NW, "NORTH_WEST", 0, "North-West", ""},
|
||||
{KM_NOTHING, "NOTHING", 0, "Nothing", ""},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
const EnumPropertyItem rna_enum_event_value_keymouse_items[] = {
|
||||
const EnumPropertyItem rna_enum_event_value_items[] = {
|
||||
{KM_ANY, "ANY", 0, "Any", ""},
|
||||
{KM_PRESS, "PRESS", 0, "Press", ""},
|
||||
{KM_RELEASE, "RELEASE", 0, "Release", ""},
|
||||
|
@ -393,7 +363,7 @@ const EnumPropertyItem rna_enum_event_value_keymouse_items[] = {
|
|||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
const EnumPropertyItem rna_enum_event_value_tweak_items[] = {
|
||||
const EnumPropertyItem rna_enum_event_direction_items[] = {
|
||||
{KM_ANY, "ANY", 0, "Any", ""},
|
||||
{EVT_GESTURE_N, "NORTH", 0, "North", ""},
|
||||
{EVT_GESTURE_NE, "NORTH_EAST", 0, "North-East", ""},
|
||||
|
@ -420,7 +390,6 @@ const EnumPropertyItem rna_enum_event_type_mask_items[] = {
|
|||
{EVT_TYPE_MASK_MOUSE_BUTTON, "MOUSE_BUTTON", 0, "Mouse Button", ""},
|
||||
{EVT_TYPE_MASK_MOUSE, "MOUSE", 0, "Mouse", ""},
|
||||
{EVT_TYPE_MASK_NDOF, "NDOF", 0, "NDOF", ""},
|
||||
{EVT_TYPE_MASK_TWEAK, "TWEAK", 0, "Tweak", ""},
|
||||
{EVT_TYPE_MASK_ACTIONZONE, "ACTIONZONE", 0, "Action Zone", ""},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
@ -612,18 +581,6 @@ static PointerRNA rna_OperatorMacro_properties_get(PointerRNA *ptr)
|
|||
return result;
|
||||
}
|
||||
|
||||
static const EnumPropertyItem *rna_Event_value_itemf(bContext *UNUSED(C),
|
||||
PointerRNA *ptr,
|
||||
PropertyRNA *UNUSED(prop),
|
||||
bool *UNUSED(r_free))
|
||||
{
|
||||
const wmEvent *event = ptr->data;
|
||||
if (ISTWEAK(event->type)) {
|
||||
return rna_enum_event_value_tweak_items;
|
||||
}
|
||||
return rna_enum_event_value_all_items;
|
||||
}
|
||||
|
||||
static void rna_Event_ascii_get(PointerRNA *ptr, char *value)
|
||||
{
|
||||
const wmEvent *event = ptr->data;
|
||||
|
@ -915,10 +872,6 @@ static void rna_wmKeyMapItem_map_type_set(PointerRNA *ptr, int value)
|
|||
kmi->type = EVT_AKEY;
|
||||
kmi->val = KM_PRESS;
|
||||
break;
|
||||
case KMI_TYPE_TWEAK:
|
||||
kmi->type = EVT_TWEAK_L;
|
||||
kmi->val = KM_ANY;
|
||||
break;
|
||||
case KMI_TYPE_MOUSE:
|
||||
kmi->type = LEFTMOUSE;
|
||||
kmi->val = KM_PRESS;
|
||||
|
@ -969,9 +922,6 @@ static const EnumPropertyItem *rna_KeyMapItem_type_itemf(bContext *UNUSED(C),
|
|||
if (map_type == KMI_TYPE_MOUSE) {
|
||||
return event_mouse_type_items;
|
||||
}
|
||||
if (map_type == KMI_TYPE_TWEAK) {
|
||||
return event_tweak_type_items;
|
||||
}
|
||||
if (map_type == KMI_TYPE_TIMER) {
|
||||
return event_timer_type_items;
|
||||
}
|
||||
|
@ -986,24 +936,6 @@ static const EnumPropertyItem *rna_KeyMapItem_type_itemf(bContext *UNUSED(C),
|
|||
}
|
||||
}
|
||||
|
||||
static const EnumPropertyItem *rna_KeyMapItem_value_itemf(bContext *UNUSED(C),
|
||||
PointerRNA *ptr,
|
||||
PropertyRNA *UNUSED(prop),
|
||||
bool *UNUSED(r_free))
|
||||
{
|
||||
int map_type = rna_wmKeyMapItem_map_type_get(ptr);
|
||||
|
||||
if (map_type == KMI_TYPE_MOUSE || map_type == KMI_TYPE_KEYBOARD || map_type == KMI_TYPE_NDOF) {
|
||||
return rna_enum_event_value_keymouse_items;
|
||||
}
|
||||
if (map_type == KMI_TYPE_TWEAK) {
|
||||
return rna_enum_event_value_tweak_items;
|
||||
}
|
||||
else {
|
||||
return rna_enum_event_value_all_items;
|
||||
}
|
||||
}
|
||||
|
||||
static const EnumPropertyItem *rna_KeyMapItem_propvalue_itemf(bContext *C,
|
||||
PointerRNA *ptr,
|
||||
PropertyRNA *UNUSED(prop),
|
||||
|
@ -2106,8 +2038,7 @@ static void rna_def_event(BlenderRNA *brna)
|
|||
/* enums */
|
||||
prop = RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "val");
|
||||
RNA_def_property_enum_items(prop, rna_enum_event_value_all_items);
|
||||
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Event_value_itemf");
|
||||
RNA_def_property_enum_items(prop, rna_enum_event_value_items);
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Value", "The type of event, only applies to some");
|
||||
|
||||
|
@ -2118,6 +2049,12 @@ static void rna_def_event(BlenderRNA *brna)
|
|||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Type", "");
|
||||
|
||||
prop = RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "direction");
|
||||
RNA_def_property_enum_items(prop, rna_enum_event_direction_items);
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Direction", "The direction (only applies to drag events)");
|
||||
|
||||
/* keyboard */
|
||||
prop = RNA_def_property(srna, "is_repeat", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
|
@ -2538,7 +2475,6 @@ static void rna_def_keyconfig(BlenderRNA *brna)
|
|||
|
||||
static const EnumPropertyItem map_type_items[] = {
|
||||
{KMI_TYPE_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""},
|
||||
{KMI_TYPE_TWEAK, "TWEAK", 0, "Tweak", ""},
|
||||
{KMI_TYPE_MOUSE, "MOUSE", 0, "Mouse", ""},
|
||||
{KMI_TYPE_NDOF, "NDOF", 0, "NDOF", ""},
|
||||
{KMI_TYPE_TEXTINPUT, "TEXTINPUT", 0, "Text Input", ""},
|
||||
|
@ -2679,11 +2615,16 @@ static void rna_def_keyconfig(BlenderRNA *brna)
|
|||
|
||||
prop = RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "val");
|
||||
RNA_def_property_enum_items(prop, rna_enum_event_value_all_items);
|
||||
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_KeyMapItem_value_itemf");
|
||||
RNA_def_property_enum_items(prop, rna_enum_event_value_items);
|
||||
RNA_def_property_ui_text(prop, "Value", "");
|
||||
RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
|
||||
|
||||
prop = RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "direction");
|
||||
RNA_def_property_enum_items(prop, rna_enum_event_direction_items);
|
||||
RNA_def_property_ui_text(prop, "Direction", "The direction (only applies to drag events)");
|
||||
RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
|
||||
|
||||
prop = RNA_def_property(srna, "id", PROP_INT, PROP_NONE);
|
||||
RNA_def_property_int_sdna(prop, NULL, "id");
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
|
|
|
@ -258,6 +258,7 @@ static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km,
|
|||
int alt,
|
||||
int oskey,
|
||||
int keymodifier,
|
||||
int direction,
|
||||
bool repeat,
|
||||
bool head)
|
||||
{
|
||||
|
@ -275,7 +276,7 @@ static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km,
|
|||
WM_operator_bl_idname(idname_bl, idname);
|
||||
|
||||
/* create keymap item */
|
||||
kmi = WM_keymap_add_item(km, idname_bl, type, value, modifier, keymodifier);
|
||||
kmi = WM_keymap_add_item(km, idname_bl, type, value, modifier, keymodifier, direction);
|
||||
|
||||
if (!repeat) {
|
||||
kmi->flag |= KMI_REPEAT_IGNORE;
|
||||
|
@ -324,6 +325,7 @@ static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km,
|
|||
int alt,
|
||||
int oskey,
|
||||
int keymodifier,
|
||||
int direction,
|
||||
bool repeat)
|
||||
{
|
||||
/* only modal maps */
|
||||
|
@ -338,13 +340,14 @@ static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km,
|
|||
|
||||
/* not initialized yet, do delayed lookup */
|
||||
if (!km->modal_items) {
|
||||
kmi = WM_modalkeymap_add_item_str(km, type, value, modifier, keymodifier, propvalue_str);
|
||||
kmi = WM_modalkeymap_add_item_str(
|
||||
km, type, value, modifier, keymodifier, direction, propvalue_str);
|
||||
}
|
||||
else {
|
||||
if (RNA_enum_value_from_id(km->modal_items, propvalue_str, &propvalue) == 0) {
|
||||
BKE_report(reports, RPT_WARNING, "Property value not in enumeration");
|
||||
}
|
||||
kmi = WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
|
||||
kmi = WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, direction, propvalue);
|
||||
}
|
||||
|
||||
if (!repeat) {
|
||||
|
@ -729,7 +732,7 @@ void RNA_api_window(StructRNA *srna)
|
|||
RNA_def_function_flag(func, FUNC_USE_REPORTS);
|
||||
parm = RNA_def_enum(func, "type", rna_enum_event_type_items, 0, "Type", "");
|
||||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
||||
parm = RNA_def_enum(func, "value", rna_enum_event_value_all_items, 0, "Value", "");
|
||||
parm = RNA_def_enum(func, "value", rna_enum_event_value_items, 0, "Value", "");
|
||||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
||||
parm = RNA_def_string(func, "unicode", NULL, 0, "", "");
|
||||
RNA_def_parameter_clear_flags(parm, PROP_NEVER_NULL, 0);
|
||||
|
@ -1134,7 +1137,7 @@ void RNA_api_keymapitems(StructRNA *srna)
|
|||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
||||
parm = RNA_def_enum(func, "type", rna_enum_event_type_items, 0, "Type", "");
|
||||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
||||
parm = RNA_def_enum(func, "value", rna_enum_event_value_all_items, 0, "Value", "");
|
||||
parm = RNA_def_enum(func, "value", rna_enum_event_value_items, 0, "Value", "");
|
||||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
||||
RNA_def_boolean(func, "any", 0, "Any", "");
|
||||
RNA_def_int(func, "shift", KM_NOTHING, KM_ANY, KM_MOD_HELD, "Shift", "", KM_ANY, KM_MOD_HELD);
|
||||
|
@ -1142,6 +1145,7 @@ void RNA_api_keymapitems(StructRNA *srna)
|
|||
RNA_def_int(func, "alt", KM_NOTHING, KM_ANY, KM_MOD_HELD, "Alt", "", KM_ANY, KM_MOD_HELD);
|
||||
RNA_def_int(func, "oskey", KM_NOTHING, KM_ANY, KM_MOD_HELD, "OS Key", "", KM_ANY, KM_MOD_HELD);
|
||||
RNA_def_enum(func, "key_modifier", rna_enum_event_type_items, 0, "Key Modifier", "");
|
||||
RNA_def_enum(func, "direction", rna_enum_event_direction_items, KM_ANY, "Direction", "");
|
||||
RNA_def_boolean(func, "repeat", false, "Repeat", "When set, accept key-repeat events");
|
||||
RNA_def_boolean(func,
|
||||
"head",
|
||||
|
@ -1158,7 +1162,7 @@ void RNA_api_keymapitems(StructRNA *srna)
|
|||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
||||
parm = RNA_def_enum(func, "type", rna_enum_event_type_items, 0, "Type", "");
|
||||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
||||
parm = RNA_def_enum(func, "value", rna_enum_event_value_all_items, 0, "Value", "");
|
||||
parm = RNA_def_enum(func, "value", rna_enum_event_value_items, 0, "Value", "");
|
||||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
||||
RNA_def_boolean(func, "any", 0, "Any", "");
|
||||
RNA_def_int(func, "shift", KM_NOTHING, KM_ANY, KM_MOD_HELD, "Shift", "", KM_ANY, KM_MOD_HELD);
|
||||
|
@ -1166,6 +1170,7 @@ void RNA_api_keymapitems(StructRNA *srna)
|
|||
RNA_def_int(func, "alt", KM_NOTHING, KM_ANY, KM_MOD_HELD, "Alt", "", KM_ANY, KM_MOD_HELD);
|
||||
RNA_def_int(func, "oskey", KM_NOTHING, KM_ANY, KM_MOD_HELD, "OS Key", "", KM_ANY, KM_MOD_HELD);
|
||||
RNA_def_enum(func, "key_modifier", rna_enum_event_type_items, 0, "Key Modifier", "");
|
||||
RNA_def_enum(func, "direction", rna_enum_event_direction_items, KM_ANY, "Direction", "");
|
||||
RNA_def_boolean(func, "repeat", false, "Repeat", "When set, accept key-repeat events");
|
||||
parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item");
|
||||
RNA_def_function_return(func, parm);
|
||||
|
|
|
@ -1432,6 +1432,8 @@ bool WM_event_is_modal_drag_exit(const struct wmEvent *event,
|
|||
bool WM_event_is_last_mousemove(const struct wmEvent *event);
|
||||
bool WM_event_is_mouse_drag(const struct wmEvent *event);
|
||||
bool WM_event_is_mouse_drag_or_press(const wmEvent *event);
|
||||
int WM_event_drag_direction(const wmEvent *event);
|
||||
|
||||
/**
|
||||
* Detect motion between selection (callers should only use this for selection picking),
|
||||
* typically mouse press/click events.
|
||||
|
|
|
@ -42,8 +42,13 @@ void WM_keymap_clear(struct wmKeyMap *keymap);
|
|||
/**
|
||||
* Always add item.
|
||||
*/
|
||||
wmKeyMapItem *WM_keymap_add_item(
|
||||
struct wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier);
|
||||
wmKeyMapItem *WM_keymap_add_item(struct wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction);
|
||||
wmKeyMapItem *WM_keymap_add_item_copy(struct wmKeyMap *keymap, wmKeyMapItem *kmi_src);
|
||||
|
||||
bool WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
|
||||
|
@ -80,23 +85,43 @@ bool WM_keymap_item_compare(const struct wmKeyMapItem *k1, const struct wmKeyMap
|
|||
/**
|
||||
* Menu wrapper for #WM_keymap_add_item.
|
||||
*/
|
||||
wmKeyMapItem *WM_keymap_add_menu(
|
||||
struct wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier);
|
||||
wmKeyMapItem *WM_keymap_add_menu(struct wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction);
|
||||
/**
|
||||
* Pie-menu wrapper for #WM_keymap_add_item.
|
||||
*/
|
||||
wmKeyMapItem *WM_keymap_add_menu_pie(
|
||||
struct wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier);
|
||||
wmKeyMapItem *WM_keymap_add_menu_pie(struct wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction);
|
||||
/**
|
||||
* Panel (popover) wrapper for #WM_keymap_add_item.
|
||||
*/
|
||||
wmKeyMapItem *WM_keymap_add_panel(
|
||||
struct wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier);
|
||||
wmKeyMapItem *WM_keymap_add_panel(struct wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction);
|
||||
/**
|
||||
* Tool wrapper for #WM_keymap_add_item.
|
||||
*/
|
||||
wmKeyMapItem *WM_keymap_add_tool(
|
||||
struct wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier);
|
||||
wmKeyMapItem *WM_keymap_add_tool(struct wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction);
|
||||
|
||||
wmKeyMap *WM_keymap_guess_from_context(const struct bContext *C);
|
||||
|
||||
|
@ -128,10 +153,20 @@ wmKeyMap *WM_modalkeymap_ensure(struct wmKeyConfig *keyconf,
|
|||
const char *idname,
|
||||
const struct EnumPropertyItem *items);
|
||||
wmKeyMap *WM_modalkeymap_find(struct wmKeyConfig *keyconf, const char *idname);
|
||||
wmKeyMapItem *WM_modalkeymap_add_item(
|
||||
struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value);
|
||||
wmKeyMapItem *WM_modalkeymap_add_item_str(
|
||||
struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, const char *value);
|
||||
wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction,
|
||||
int value);
|
||||
wmKeyMapItem *WM_modalkeymap_add_item_str(struct wmKeyMap *km,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction,
|
||||
const char *value);
|
||||
const wmKeyMapItem *WM_modalkeymap_find_propvalue(const wmKeyMap *km, int propvalue);
|
||||
void WM_modalkeymap_assign(struct wmKeyMap *km, const char *opname);
|
||||
|
||||
|
|
|
@ -494,7 +494,6 @@ typedef struct wmNotifier {
|
|||
/* ************** Gesture Manager data ************** */
|
||||
|
||||
/* wmGesture->type */
|
||||
#define WM_GESTURE_TWEAK 0
|
||||
#define WM_GESTURE_LINES 1
|
||||
#define WM_GESTURE_RECT 2
|
||||
#define WM_GESTURE_CROSS_RECT 3
|
||||
|
@ -504,7 +503,6 @@ typedef struct wmNotifier {
|
|||
|
||||
/**
|
||||
* wmGesture is registered to #wmWindow.gesture, handled by operator callbacks.
|
||||
* Tweak gesture is builtin feature.
|
||||
*/
|
||||
typedef struct wmGesture {
|
||||
struct wmGesture *next, *prev;
|
||||
|
@ -660,6 +658,9 @@ typedef struct wmEvent {
|
|||
*/
|
||||
uint8_t modifier;
|
||||
|
||||
/** The direction (for #KM_CLICK_DRAG events only). */
|
||||
int8_t direction;
|
||||
|
||||
/** Raw-key modifier (allow using any key as a modifier). */
|
||||
short keymodifier;
|
||||
|
||||
|
|
|
@ -640,24 +640,29 @@ wmKeyMap *wm_gizmogroup_tweak_modal_keymap(wmKeyConfig *keyconf)
|
|||
keymap = WM_modalkeymap_ensure(keyconf, name, modal_items);
|
||||
|
||||
/* items for modal map */
|
||||
WM_modalkeymap_add_item(keymap, EVT_ESCKEY, KM_PRESS, KM_ANY, 0, TWEAK_MODAL_CANCEL);
|
||||
WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, TWEAK_MODAL_CANCEL);
|
||||
WM_modalkeymap_add_item(keymap, EVT_ESCKEY, KM_PRESS, KM_ANY, 0, KM_ANY, TWEAK_MODAL_CANCEL);
|
||||
WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, KM_ANY, TWEAK_MODAL_CANCEL);
|
||||
|
||||
WM_modalkeymap_add_item(keymap, EVT_RETKEY, KM_PRESS, KM_ANY, 0, TWEAK_MODAL_CONFIRM);
|
||||
WM_modalkeymap_add_item(keymap, EVT_PADENTER, KM_PRESS, KM_ANY, 0, TWEAK_MODAL_CONFIRM);
|
||||
WM_modalkeymap_add_item(keymap, EVT_RETKEY, KM_PRESS, KM_ANY, 0, KM_ANY, TWEAK_MODAL_CONFIRM);
|
||||
WM_modalkeymap_add_item(keymap, EVT_PADENTER, KM_PRESS, KM_ANY, 0, KM_ANY, TWEAK_MODAL_CONFIRM);
|
||||
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, EVT_RIGHTSHIFTKEY, KM_PRESS, KM_ANY, 0, TWEAK_MODAL_PRECISION_ON);
|
||||
keymap, EVT_RIGHTSHIFTKEY, KM_PRESS, KM_ANY, 0, KM_ANY, TWEAK_MODAL_PRECISION_ON);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, EVT_RIGHTSHIFTKEY, KM_RELEASE, KM_ANY, 0, TWEAK_MODAL_PRECISION_OFF);
|
||||
WM_modalkeymap_add_item(keymap, EVT_LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, TWEAK_MODAL_PRECISION_ON);
|
||||
keymap, EVT_RIGHTSHIFTKEY, KM_RELEASE, KM_ANY, 0, KM_ANY, TWEAK_MODAL_PRECISION_OFF);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, EVT_LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, TWEAK_MODAL_PRECISION_OFF);
|
||||
keymap, EVT_LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, KM_ANY, TWEAK_MODAL_PRECISION_ON);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, EVT_LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, KM_ANY, TWEAK_MODAL_PRECISION_OFF);
|
||||
|
||||
WM_modalkeymap_add_item(keymap, EVT_RIGHTCTRLKEY, KM_PRESS, KM_ANY, 0, TWEAK_MODAL_SNAP_ON);
|
||||
WM_modalkeymap_add_item(keymap, EVT_RIGHTCTRLKEY, KM_RELEASE, KM_ANY, 0, TWEAK_MODAL_SNAP_OFF);
|
||||
WM_modalkeymap_add_item(keymap, EVT_LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, TWEAK_MODAL_SNAP_ON);
|
||||
WM_modalkeymap_add_item(keymap, EVT_LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, TWEAK_MODAL_SNAP_OFF);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, EVT_RIGHTCTRLKEY, KM_PRESS, KM_ANY, 0, KM_ANY, TWEAK_MODAL_SNAP_ON);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, EVT_RIGHTCTRLKEY, KM_RELEASE, KM_ANY, 0, KM_ANY, TWEAK_MODAL_SNAP_OFF);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, EVT_LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, KM_ANY, TWEAK_MODAL_SNAP_ON);
|
||||
WM_modalkeymap_add_item(
|
||||
keymap, EVT_LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, KM_ANY, TWEAK_MODAL_SNAP_OFF);
|
||||
|
||||
WM_modalkeymap_assign(keymap, "GIZMOGROUP_OT_gizmo_tweak");
|
||||
|
||||
|
@ -709,24 +714,26 @@ static wmKeyMap *WM_gizmogroup_keymap_template_select_ex(
|
|||
const int select_tweak = (U.flag & USER_LMOUSESELECT) ? EVT_TWEAK_L : EVT_TWEAK_R;
|
||||
const int action_mouse = (U.flag & USER_LMOUSESELECT) ? RIGHTMOUSE : LEFTMOUSE;
|
||||
#else
|
||||
const int select_mouse = RIGHTMOUSE;
|
||||
const int select_tweak = EVT_TWEAK_R;
|
||||
const int action_mouse = LEFTMOUSE;
|
||||
const int select_mouse = RIGHTMOUSE, select_mouse_val = KM_PRESS;
|
||||
const int select_tweak = RIGHTMOUSE, select_tweak_val = KM_CLICK_DRAG;
|
||||
const int action_mouse = LEFTMOUSE, action_mouse_val = KM_PRESS;
|
||||
#endif
|
||||
|
||||
if (do_init) {
|
||||
WM_keymap_add_item(km, "GIZMOGROUP_OT_gizmo_tweak", action_mouse, KM_PRESS, KM_ANY, 0);
|
||||
WM_keymap_add_item(km, "GIZMOGROUP_OT_gizmo_tweak", select_tweak, KM_ANY, 0, 0);
|
||||
WM_keymap_add_item(
|
||||
km, "GIZMOGROUP_OT_gizmo_tweak", action_mouse, action_mouse_val, KM_ANY, 0, KM_ANY);
|
||||
WM_keymap_add_item(
|
||||
km, "GIZMOGROUP_OT_gizmo_tweak", select_tweak, select_tweak_val, 0, 0, KM_ANY);
|
||||
}
|
||||
|
||||
if (do_init) {
|
||||
wmKeyMapItem *kmi = WM_keymap_add_item(
|
||||
km, "GIZMOGROUP_OT_gizmo_select", select_mouse, KM_PRESS, 0, 0);
|
||||
km, "GIZMOGROUP_OT_gizmo_select", select_mouse, select_mouse_val, 0, 0, KM_ANY);
|
||||
RNA_boolean_set(kmi->ptr, "extend", false);
|
||||
RNA_boolean_set(kmi->ptr, "deselect", false);
|
||||
RNA_boolean_set(kmi->ptr, "toggle", false);
|
||||
kmi = WM_keymap_add_item(
|
||||
km, "GIZMOGROUP_OT_gizmo_select", select_mouse, KM_PRESS, KM_SHIFT, 0);
|
||||
km, "GIZMOGROUP_OT_gizmo_select", select_mouse, select_mouse_val, KM_SHIFT, 0, KM_ANY);
|
||||
RNA_boolean_set(kmi->ptr, "extend", false);
|
||||
RNA_boolean_set(kmi->ptr, "deselect", false);
|
||||
RNA_boolean_set(kmi->ptr, "toggle", true);
|
||||
|
@ -1129,7 +1136,8 @@ void WM_gizmo_group_refresh(const bContext *C, wmGizmoGroup *gzgroup)
|
|||
ARegion *region = CTX_wm_region(C);
|
||||
BLI_assert(region->gizmo_map == gzmap);
|
||||
/* Check if the tweak event originated from this region. */
|
||||
if ((win->tweak != NULL) && BLI_rcti_compare(®ion->winrct, &win->tweak->winrct)) {
|
||||
if ((win->eventstate != NULL) && (win->event_queue_check_drag) &&
|
||||
BLI_rcti_isect_pt_v(®ion->winrct, win->eventstate->prev_click_xy)) {
|
||||
/* We need to run refresh again. */
|
||||
gzgroup->init_flag &= ~WM_GIZMOGROUP_INIT_REFRESH;
|
||||
WM_gizmomap_tag_refresh_drawstep(gzmap, WM_gizmomap_drawstep_from_gizmo_group(gzgroup));
|
||||
|
|
|
@ -156,7 +156,6 @@ static void window_manager_blend_read_data(BlendDataReader *reader, ID *id)
|
|||
win->gpuctx = NULL;
|
||||
win->eventstate = NULL;
|
||||
win->cursor_keymap_status = NULL;
|
||||
win->tweak = NULL;
|
||||
#if defined(WIN32) || defined(__APPLE__)
|
||||
win->ime_data = NULL;
|
||||
#endif
|
||||
|
|
|
@ -47,12 +47,7 @@ static void event_ids_from_type_and_value(const short type,
|
|||
RNA_enum_identifier(rna_enum_event_type_items, type, r_type_id);
|
||||
|
||||
/* Value. */
|
||||
if (ISTWEAK(type)) {
|
||||
RNA_enum_identifier(rna_enum_event_value_tweak_items, val, r_val_id);
|
||||
}
|
||||
else {
|
||||
RNA_enum_identifier(rna_enum_event_value_all_items, val, r_val_id);
|
||||
}
|
||||
RNA_enum_identifier(rna_enum_event_value_items, val, r_val_id);
|
||||
}
|
||||
|
||||
void WM_event_print(const wmEvent *event)
|
||||
|
@ -160,13 +155,6 @@ bool WM_event_type_mask_test(const int event_type, const enum eEventType_Mask ma
|
|||
}
|
||||
}
|
||||
|
||||
/* Tweak. */
|
||||
if (mask & EVT_TYPE_MASK_TWEAK) {
|
||||
if (ISTWEAK(event_type)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/* Action Zone. */
|
||||
if (mask & EVT_TYPE_MASK_ACTIONZONE) {
|
||||
if (IS_EVENT_ACTIONZONE(event_type)) {
|
||||
|
@ -192,12 +180,6 @@ bool WM_event_is_modal_drag_exit(const wmEvent *event,
|
|||
if (U.flag & USER_RELEASECONFIRM) {
|
||||
/* option on, so can exit with km-release */
|
||||
if (event->val == KM_RELEASE) {
|
||||
switch (init_event_type) {
|
||||
case EVT_TWEAK_L:
|
||||
case EVT_TWEAK_M:
|
||||
case EVT_TWEAK_R:
|
||||
return 1;
|
||||
}
|
||||
if ((init_event_val == KM_CLICK_DRAG) && (event->type == init_event_type)) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -205,8 +187,7 @@ bool WM_event_is_modal_drag_exit(const wmEvent *event,
|
|||
else {
|
||||
/* If the initial event wasn't a drag event then
|
||||
* ignore #USER_RELEASECONFIRM setting: see T26756. */
|
||||
if ((ELEM(init_event_type, EVT_TWEAK_L, EVT_TWEAK_M, EVT_TWEAK_R) ||
|
||||
init_event_val == KM_CLICK_DRAG) == 0) {
|
||||
if (init_event_val != KM_CLICK_DRAG) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -234,7 +215,7 @@ bool WM_event_is_last_mousemove(const wmEvent *event)
|
|||
|
||||
bool WM_event_is_mouse_drag(const wmEvent *event)
|
||||
{
|
||||
return ISTWEAK(event->type) || (ISMOUSE_BUTTON(event->type) && (event->val == KM_CLICK_DRAG));
|
||||
return (ISMOUSE_BUTTON(event->type) && (event->val == KM_CLICK_DRAG));
|
||||
}
|
||||
|
||||
bool WM_event_is_mouse_drag_or_press(const wmEvent *event)
|
||||
|
@ -243,6 +224,68 @@ bool WM_event_is_mouse_drag_or_press(const wmEvent *event)
|
|||
(ISMOUSE_BUTTON(event->type) && (event->val == KM_PRESS));
|
||||
}
|
||||
|
||||
int WM_event_drag_direction(const wmEvent *event)
|
||||
{
|
||||
const int delta[2] = {
|
||||
event->xy[0] - event->prev_click_xy[0],
|
||||
event->xy[1] - event->prev_click_xy[1],
|
||||
};
|
||||
|
||||
int theta = round_fl_to_int(4.0f * atan2f((float)delta[1], (float)delta[0]) / (float)M_PI);
|
||||
int val = EVT_GESTURE_W;
|
||||
|
||||
if (theta == 0) {
|
||||
val = EVT_GESTURE_E;
|
||||
}
|
||||
else if (theta == 1) {
|
||||
val = EVT_GESTURE_NE;
|
||||
}
|
||||
else if (theta == 2) {
|
||||
val = EVT_GESTURE_N;
|
||||
}
|
||||
else if (theta == 3) {
|
||||
val = EVT_GESTURE_NW;
|
||||
}
|
||||
else if (theta == -1) {
|
||||
val = EVT_GESTURE_SE;
|
||||
}
|
||||
else if (theta == -2) {
|
||||
val = EVT_GESTURE_S;
|
||||
}
|
||||
else if (theta == -3) {
|
||||
val = EVT_GESTURE_SW;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* debug */
|
||||
if (val == 1) {
|
||||
printf("tweak north\n");
|
||||
}
|
||||
if (val == 2) {
|
||||
printf("tweak north-east\n");
|
||||
}
|
||||
if (val == 3) {
|
||||
printf("tweak east\n");
|
||||
}
|
||||
if (val == 4) {
|
||||
printf("tweak south-east\n");
|
||||
}
|
||||
if (val == 5) {
|
||||
printf("tweak south\n");
|
||||
}
|
||||
if (val == 6) {
|
||||
printf("tweak south-west\n");
|
||||
}
|
||||
if (val == 7) {
|
||||
printf("tweak west\n");
|
||||
}
|
||||
if (val == 8) {
|
||||
printf("tweak north-west\n");
|
||||
}
|
||||
#endif
|
||||
return val;
|
||||
}
|
||||
|
||||
bool WM_cursor_test_motion_and_update(const int mval[2])
|
||||
{
|
||||
static int mval_prev[2] = {-1, -1};
|
||||
|
@ -316,12 +359,6 @@ int WM_userdef_event_map(int kmitype)
|
|||
int WM_userdef_event_type_from_keymap_type(int kmitype)
|
||||
{
|
||||
switch (kmitype) {
|
||||
case EVT_TWEAK_L:
|
||||
return LEFTMOUSE;
|
||||
case EVT_TWEAK_M:
|
||||
return MIDDLEMOUSE;
|
||||
case EVT_TWEAK_R:
|
||||
return RIGHTMOUSE;
|
||||
case WHEELOUTMOUSE:
|
||||
return (U.uiflag & USER_WHEELZOOMDIR) ? WHEELUPMOUSE : WHEELDOWNMOUSE;
|
||||
case WHEELINMOUSE:
|
||||
|
|
|
@ -2029,6 +2029,14 @@ static bool wm_eventmatch(const wmEvent *winevent, const wmKeyMapItem *kmi)
|
|||
}
|
||||
}
|
||||
|
||||
if (kmi->val == KM_CLICK_DRAG) {
|
||||
if (kmi->direction != KM_ANY) {
|
||||
if (kmi->direction != winevent->direction) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const bool shift = (winevent->modifier & KM_SHIFT) != 0;
|
||||
const bool ctrl = (winevent->modifier & KM_CTRL) != 0;
|
||||
const bool alt = (winevent->modifier & KM_ALT) != 0;
|
||||
|
@ -2775,7 +2783,7 @@ static int wm_handlers_do_gizmo_handler(bContext *C,
|
|||
{
|
||||
/* Drag events use the previous click location to highlight the gizmos,
|
||||
* Get the highlight again in case the user dragged off the gizmo. */
|
||||
const bool is_event_drag = ISTWEAK(event->type) || (event->val == KM_CLICK_DRAG);
|
||||
const bool is_event_drag = (event->val == KM_CLICK_DRAG);
|
||||
const bool is_event_modifier = ISKEYMODIFIER(event->type);
|
||||
/* Only keep the highlight if the gizmo becomes modal as result of event handling.
|
||||
* Without this check, even un-handled drag events will set the highlight if the drag
|
||||
|
@ -2886,15 +2894,10 @@ static int wm_handlers_do_gizmo_handler(bContext *C,
|
|||
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;
|
||||
|
||||
LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
|
||||
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)) {
|
||||
wm_eventmatch(&event_test_click_drag, 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;
|
||||
|
@ -3165,6 +3168,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
|
|||
if (win->event_queue_check_drag) {
|
||||
if (WM_event_drag_test(event, event->prev_click_xy)) {
|
||||
win->event_queue_check_drag_handled = true;
|
||||
const int direction = WM_event_drag_direction(event);
|
||||
|
||||
const int prev_xy[2] = {UNPACK2(event->xy)};
|
||||
const short prev_val = event->val;
|
||||
|
@ -3177,6 +3181,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
|
|||
event->type = event->prev_type;
|
||||
event->modifier = event->prev_click_modifier;
|
||||
event->keymodifier = event->prev_click_keymodifier;
|
||||
event->direction = direction;
|
||||
|
||||
CLOG_INFO(WM_LOG_HANDLERS, 1, "handling PRESS_DRAG");
|
||||
|
||||
|
@ -3184,6 +3189,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
|
|||
|
||||
action |= wm_handlers_do_intern(C, win, event, handlers);
|
||||
|
||||
event->direction = 0;
|
||||
event->keymodifier = prev_keymodifier;
|
||||
event->modifier = prev_modifier;
|
||||
event->val = prev_val;
|
||||
|
@ -3712,9 +3718,7 @@ void wm_event_do_handlers(bContext *C)
|
|||
/* Check dragging, creates new event or frees, adds draw tag. */
|
||||
wm_event_drag_and_drop_test(wm, win, event);
|
||||
|
||||
/* Builtin tweak, if action is break it removes tweak. */
|
||||
wm_tweakevent_test(C, event, action);
|
||||
|
||||
/* Builtin drag: #KM_CLICK_DRAG. */
|
||||
if (action & WM_HANDLER_BREAK) {
|
||||
win->event_queue_check_drag = false;
|
||||
}
|
||||
|
@ -5515,15 +5519,15 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win)
|
|||
} event_data[] = {
|
||||
{0, 0, LEFTMOUSE, KM_PRESS},
|
||||
{0, 0, LEFTMOUSE, KM_CLICK},
|
||||
{0, 1, EVT_TWEAK_L, KM_ANY},
|
||||
{0, 0, LEFTMOUSE, KM_CLICK_DRAG},
|
||||
|
||||
{1, 0, MIDDLEMOUSE, KM_PRESS},
|
||||
{1, 0, MIDDLEMOUSE, KM_CLICK},
|
||||
{1, 1, EVT_TWEAK_M, KM_ANY},
|
||||
{1, 0, MIDDLEMOUSE, KM_CLICK_DRAG},
|
||||
|
||||
{2, 0, RIGHTMOUSE, KM_PRESS},
|
||||
{2, 0, RIGHTMOUSE, KM_CLICK},
|
||||
{2, 1, EVT_TWEAK_R, KM_ANY},
|
||||
{2, 0, RIGHTMOUSE, KM_CLICK_DRAG},
|
||||
};
|
||||
|
||||
for (int button_index = 0; button_index < 3; button_index++) {
|
||||
|
|
|
@ -52,7 +52,6 @@ wmGesture *WM_gesture_new(wmWindow *window, const ARegion *region, const wmEvent
|
|||
if (ELEM(type,
|
||||
WM_GESTURE_RECT,
|
||||
WM_GESTURE_CROSS_RECT,
|
||||
WM_GESTURE_TWEAK,
|
||||
WM_GESTURE_CIRCLE,
|
||||
WM_GESTURE_STRAIGHTLINE)) {
|
||||
rcti *rect = MEM_callocN(sizeof(rcti), "gesture rect new");
|
||||
|
@ -83,9 +82,6 @@ wmGesture *WM_gesture_new(wmWindow *window, const ARegion *region, const wmEvent
|
|||
|
||||
void WM_gesture_end(wmWindow *win, wmGesture *gesture)
|
||||
{
|
||||
if (win->tweak == gesture) {
|
||||
win->tweak = NULL;
|
||||
}
|
||||
BLI_remlink(&win->gesture, gesture);
|
||||
MEM_freeN(gesture->customdata);
|
||||
WM_generic_user_data_free(&gesture->user_data);
|
||||
|
@ -114,74 +110,6 @@ bool WM_gesture_is_modal_first(const wmGesture *gesture)
|
|||
return (gesture->is_active_prev == false);
|
||||
}
|
||||
|
||||
int wm_gesture_evaluate(wmGesture *gesture, const wmEvent *event)
|
||||
{
|
||||
if (gesture->type == WM_GESTURE_TWEAK) {
|
||||
rcti *rect = gesture->customdata;
|
||||
const int delta[2] = {
|
||||
BLI_rcti_size_x(rect),
|
||||
BLI_rcti_size_y(rect),
|
||||
};
|
||||
|
||||
if (WM_event_drag_test_with_delta(event, delta)) {
|
||||
int theta = round_fl_to_int(4.0f * atan2f((float)delta[1], (float)delta[0]) / (float)M_PI);
|
||||
int val = EVT_GESTURE_W;
|
||||
|
||||
if (theta == 0) {
|
||||
val = EVT_GESTURE_E;
|
||||
}
|
||||
else if (theta == 1) {
|
||||
val = EVT_GESTURE_NE;
|
||||
}
|
||||
else if (theta == 2) {
|
||||
val = EVT_GESTURE_N;
|
||||
}
|
||||
else if (theta == 3) {
|
||||
val = EVT_GESTURE_NW;
|
||||
}
|
||||
else if (theta == -1) {
|
||||
val = EVT_GESTURE_SE;
|
||||
}
|
||||
else if (theta == -2) {
|
||||
val = EVT_GESTURE_S;
|
||||
}
|
||||
else if (theta == -3) {
|
||||
val = EVT_GESTURE_SW;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* debug */
|
||||
if (val == 1) {
|
||||
printf("tweak north\n");
|
||||
}
|
||||
if (val == 2) {
|
||||
printf("tweak north-east\n");
|
||||
}
|
||||
if (val == 3) {
|
||||
printf("tweak east\n");
|
||||
}
|
||||
if (val == 4) {
|
||||
printf("tweak south-east\n");
|
||||
}
|
||||
if (val == 5) {
|
||||
printf("tweak south\n");
|
||||
}
|
||||
if (val == 6) {
|
||||
printf("tweak south-west\n");
|
||||
}
|
||||
if (val == 7) {
|
||||
printf("tweak west\n");
|
||||
}
|
||||
if (val == 8) {
|
||||
printf("tweak north-west\n");
|
||||
}
|
||||
#endif
|
||||
return val;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ******************* gesture draw ******************* */
|
||||
|
||||
static void wm_gesture_draw_line_active_side(rcti *rect, const bool flip)
|
||||
|
@ -511,11 +439,6 @@ void wm_gesture_draw(wmWindow *win)
|
|||
if (gt->type == WM_GESTURE_RECT) {
|
||||
wm_gesture_draw_rect(gt);
|
||||
}
|
||||
#if 0
|
||||
else if (gt->type == WM_GESTURE_TWEAK) {
|
||||
wm_gesture_draw_line(gt);
|
||||
}
|
||||
#endif
|
||||
else if (gt->type == WM_GESTURE_CIRCLE) {
|
||||
wm_gesture_draw_circle(gt);
|
||||
}
|
||||
|
|
|
@ -470,131 +470,6 @@ void WM_OT_circle_gesture(wmOperatorType *ot)
|
|||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Tweak Gesture
|
||||
* \{ */
|
||||
|
||||
static void gesture_tweak_modal(bContext *C, const wmEvent *event)
|
||||
{
|
||||
wmWindow *window = CTX_wm_window(C);
|
||||
wmGesture *gesture = window->tweak;
|
||||
rcti *rect = gesture->customdata;
|
||||
bool gesture_end = false;
|
||||
|
||||
switch (event->type) {
|
||||
case MOUSEMOVE:
|
||||
case INBETWEEN_MOUSEMOVE: {
|
||||
|
||||
rect->xmax = event->xy[0] - gesture->winrct.xmin;
|
||||
rect->ymax = event->xy[1] - gesture->winrct.ymin;
|
||||
|
||||
const int val = wm_gesture_evaluate(gesture, event);
|
||||
if (val != 0) {
|
||||
wmEvent tevent;
|
||||
|
||||
wm_event_init_from_window(window, &tevent);
|
||||
/* We want to get coord from start of drag,
|
||||
* not from point where it becomes a tweak event, see T40549. */
|
||||
tevent.xy[0] = rect->xmin + gesture->winrct.xmin;
|
||||
tevent.xy[1] = rect->ymin + gesture->winrct.ymin;
|
||||
if (gesture->event_type == LEFTMOUSE) {
|
||||
tevent.type = EVT_TWEAK_L;
|
||||
}
|
||||
else if (gesture->event_type == RIGHTMOUSE) {
|
||||
tevent.type = EVT_TWEAK_R;
|
||||
}
|
||||
else {
|
||||
tevent.type = EVT_TWEAK_M;
|
||||
}
|
||||
tevent.val = val;
|
||||
tevent.modifier = gesture->event_modifier;
|
||||
tevent.keymodifier = gesture->event_keymodifier;
|
||||
tevent.flag = 0;
|
||||
/* mouse coords! */
|
||||
|
||||
/* important we add immediately after this event, so future mouse releases
|
||||
* (which may be in the queue already), are handled in order, see T44740 */
|
||||
wm_event_add_ex(window, &tevent, event);
|
||||
|
||||
gesture_end = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case LEFTMOUSE:
|
||||
case RIGHTMOUSE:
|
||||
case MIDDLEMOUSE:
|
||||
if (gesture->event_type == event->type) {
|
||||
gesture_end = true;
|
||||
|
||||
/* when tweak fails we should give the other keymap entries a chance */
|
||||
|
||||
/* XXX, assigning to readonly, BAD JUJU! */
|
||||
((wmEvent *)event)->val = KM_RELEASE;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (ISTIMER(event->type)) {
|
||||
/* Ignore timers. */
|
||||
}
|
||||
else if (event->type == EVENT_NONE) {
|
||||
/* Ignore none events. */
|
||||
}
|
||||
else if ((event->val == KM_RELEASE) &&
|
||||
(ISKEYMODIFIER(event->type) || (event->type == event->prev_click_keymodifier))) {
|
||||
/* Support releasing modifier keys without canceling the drag event, see T89989.
|
||||
* NOTE: this logic is replicated for drag events. */
|
||||
}
|
||||
else {
|
||||
gesture_end = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (gesture_end) {
|
||||
/* Frees gesture itself, and unregisters from window. */
|
||||
WM_gesture_end(window, gesture);
|
||||
|
||||
/* This isn't very nice but needed to redraw gizmos which are hidden while tweaking,
|
||||
* See #WM_GIZMOGROUPTYPE_DELAY_REFRESH_FOR_TWEAK for details. */
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
if ((region != NULL) && (region->gizmo_map != NULL)) {
|
||||
if (WM_gizmomap_tag_delay_refresh_for_tweak_check(region->gizmo_map)) {
|
||||
ED_region_tag_redraw(region);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void wm_tweakevent_test(bContext *C, const wmEvent *event, int action)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
|
||||
if (win->tweak == NULL) {
|
||||
const ARegion *region = CTX_wm_region(C);
|
||||
|
||||
if (region) {
|
||||
if (event->val == KM_PRESS) {
|
||||
if (ELEM(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE)) {
|
||||
win->tweak = WM_gesture_new(win, region, event, WM_GESTURE_TWEAK);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* no tweaks if event was handled */
|
||||
if (action & WM_HANDLER_BREAK) {
|
||||
WM_gesture_end(win, win->tweak);
|
||||
}
|
||||
else {
|
||||
gesture_tweak_modal(C, event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Lasso Gesture
|
||||
* \{ */
|
||||
|
|
|
@ -169,6 +169,7 @@ static bool wm_keymap_item_equals(wmKeyMapItem *a, wmKeyMapItem *b)
|
|||
return (wm_keymap_item_equals_result(a, b) && a->type == b->type && a->val == b->val &&
|
||||
a->shift == b->shift && a->ctrl == b->ctrl && a->alt == b->alt && a->oskey == b->oskey &&
|
||||
a->keymodifier == b->keymodifier && a->maptype == b->maptype &&
|
||||
((a->val != KM_CLICK_DRAG) || (a->direction == b->direction)) &&
|
||||
((ISKEYBOARD(a->type) == 0) ||
|
||||
(a->flag & KMI_REPEAT_IGNORE) == (b->flag & KMI_REPEAT_IGNORE)));
|
||||
}
|
||||
|
@ -195,9 +196,6 @@ int WM_keymap_item_map_type_get(const wmKeyMapItem *kmi)
|
|||
if (ISKEYBOARD(kmi->type)) {
|
||||
return KMI_TYPE_KEYBOARD;
|
||||
}
|
||||
if (ISTWEAK(kmi->type)) {
|
||||
return KMI_TYPE_TWEAK;
|
||||
}
|
||||
if (ISMOUSE(kmi->type)) {
|
||||
return KMI_TYPE_MOUSE;
|
||||
}
|
||||
|
@ -459,11 +457,12 @@ bool WM_keymap_poll(bContext *C, wmKeyMap *keymap)
|
|||
}
|
||||
|
||||
static void keymap_event_set(
|
||||
wmKeyMapItem *kmi, short type, short val, int modifier, short keymodifier)
|
||||
wmKeyMapItem *kmi, short type, short val, int modifier, short keymodifier, int direction)
|
||||
{
|
||||
kmi->type = type;
|
||||
kmi->val = val;
|
||||
kmi->keymodifier = keymodifier;
|
||||
kmi->direction = direction;
|
||||
|
||||
if (modifier == KM_ANY) {
|
||||
kmi->shift = kmi->ctrl = kmi->alt = kmi->oskey = KM_ANY;
|
||||
|
@ -497,15 +496,20 @@ static void keymap_item_set_id(wmKeyMap *keymap, wmKeyMapItem *kmi)
|
|||
}
|
||||
}
|
||||
|
||||
wmKeyMapItem *WM_keymap_add_item(
|
||||
wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
|
||||
wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction)
|
||||
{
|
||||
wmKeyMapItem *kmi = MEM_callocN(sizeof(wmKeyMapItem), "keymap entry");
|
||||
|
||||
BLI_addtail(&keymap->items, kmi);
|
||||
BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME);
|
||||
|
||||
keymap_event_set(kmi, type, val, modifier, keymodifier);
|
||||
keymap_event_set(kmi, type, val, modifier, keymodifier, direction);
|
||||
wm_keymap_item_properties_set(kmi);
|
||||
|
||||
keymap_item_set_id(keymap, kmi);
|
||||
|
@ -919,14 +923,14 @@ wmKeyMap *WM_modalkeymap_find(wmKeyConfig *keyconf, const char *idname)
|
|||
}
|
||||
|
||||
wmKeyMapItem *WM_modalkeymap_add_item(
|
||||
wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value)
|
||||
wmKeyMap *km, int type, int val, int modifier, int keymodifier, int direction, int value)
|
||||
{
|
||||
wmKeyMapItem *kmi = MEM_callocN(sizeof(wmKeyMapItem), "keymap entry");
|
||||
|
||||
BLI_addtail(&km->items, kmi);
|
||||
kmi->propvalue = value;
|
||||
|
||||
keymap_event_set(kmi, type, val, modifier, keymodifier);
|
||||
keymap_event_set(kmi, type, val, modifier, keymodifier, direction);
|
||||
|
||||
keymap_item_set_id(km, kmi);
|
||||
|
||||
|
@ -935,15 +939,20 @@ wmKeyMapItem *WM_modalkeymap_add_item(
|
|||
return kmi;
|
||||
}
|
||||
|
||||
wmKeyMapItem *WM_modalkeymap_add_item_str(
|
||||
wmKeyMap *km, int type, int val, int modifier, int keymodifier, const char *value)
|
||||
wmKeyMapItem *WM_modalkeymap_add_item_str(wmKeyMap *km,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction,
|
||||
const char *value)
|
||||
{
|
||||
wmKeyMapItem *kmi = MEM_callocN(sizeof(wmKeyMapItem), "keymap entry");
|
||||
|
||||
BLI_addtail(&km->items, kmi);
|
||||
BLI_strncpy(kmi->propvalue_str, value, sizeof(kmi->propvalue_str));
|
||||
|
||||
keymap_event_set(kmi, type, val, modifier, keymodifier);
|
||||
keymap_event_set(kmi, type, val, modifier, keymodifier, direction);
|
||||
|
||||
keymap_item_set_id(km, kmi);
|
||||
|
||||
|
@ -1730,6 +1739,9 @@ bool WM_keymap_item_compare(const wmKeyMapItem *k1, const wmKeyMapItem *k2)
|
|||
if (k1->val != k2->val) {
|
||||
return 0;
|
||||
}
|
||||
if (k1->val == KM_CLICK_DRAG && (k1->direction != k2->direction)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (k1->shift != KM_ANY && k2->shift != KM_ANY && k1->shift != k2->shift) {
|
||||
|
|
|
@ -29,40 +29,60 @@
|
|||
/** \name Wrappers for #WM_keymap_add_item
|
||||
* \{ */
|
||||
|
||||
wmKeyMapItem *WM_keymap_add_menu(
|
||||
wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
|
||||
wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction)
|
||||
{
|
||||
wmKeyMapItem *kmi = WM_keymap_add_item(
|
||||
keymap, "WM_OT_call_menu", type, val, modifier, keymodifier);
|
||||
keymap, "WM_OT_call_menu", type, val, modifier, keymodifier, direction);
|
||||
RNA_string_set(kmi->ptr, "name", idname);
|
||||
return kmi;
|
||||
}
|
||||
|
||||
wmKeyMapItem *WM_keymap_add_menu_pie(
|
||||
wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
|
||||
wmKeyMapItem *WM_keymap_add_menu_pie(wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction)
|
||||
{
|
||||
wmKeyMapItem *kmi = WM_keymap_add_item(
|
||||
keymap, "WM_OT_call_menu_pie", type, val, modifier, keymodifier);
|
||||
keymap, "WM_OT_call_menu_pie", type, val, modifier, keymodifier, direction);
|
||||
RNA_string_set(kmi->ptr, "name", idname);
|
||||
return kmi;
|
||||
}
|
||||
|
||||
wmKeyMapItem *WM_keymap_add_panel(
|
||||
wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
|
||||
wmKeyMapItem *WM_keymap_add_panel(wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction)
|
||||
{
|
||||
wmKeyMapItem *kmi = WM_keymap_add_item(
|
||||
keymap, "WM_OT_call_panel", type, val, modifier, keymodifier);
|
||||
keymap, "WM_OT_call_panel", type, val, modifier, keymodifier, direction);
|
||||
RNA_string_set(kmi->ptr, "name", idname);
|
||||
/* TODO: we might want to disable this. */
|
||||
RNA_boolean_set(kmi->ptr, "keep_open", false);
|
||||
return kmi;
|
||||
}
|
||||
|
||||
wmKeyMapItem *WM_keymap_add_tool(
|
||||
wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
|
||||
wmKeyMapItem *WM_keymap_add_tool(wmKeyMap *keymap,
|
||||
const char *idname,
|
||||
int type,
|
||||
int val,
|
||||
int modifier,
|
||||
int keymodifier,
|
||||
int direction)
|
||||
{
|
||||
wmKeyMapItem *kmi = WM_keymap_add_item(
|
||||
keymap, "WM_OT_tool_set_by_id", type, val, modifier, keymodifier);
|
||||
keymap, "WM_OT_tool_set_by_id", type, val, modifier, keymodifier, direction);
|
||||
RNA_string_set(kmi->ptr, "name", idname);
|
||||
return kmi;
|
||||
}
|
||||
|
|
|
@ -911,9 +911,9 @@ int WM_generic_select_modal(bContext *C, wmOperator *op, const wmEvent *event)
|
|||
|
||||
ret_value = op->type->exec(C, op);
|
||||
OPERATOR_RETVAL_CHECK(ret_value);
|
||||
|
||||
op->customdata = POINTER_FROM_INT((int)event->type);
|
||||
if (ret_value & OPERATOR_RUNNING_MODAL) {
|
||||
printf("Starting modal: %s\n", op->idname);
|
||||
WM_event_add_modal_handler(C, op);
|
||||
}
|
||||
return ret_value | OPERATOR_PASS_THROUGH;
|
||||
|
|
|
@ -74,16 +74,8 @@ void wm_gesture_draw(struct wmWindow *win);
|
|||
/**
|
||||
* Tweak and line gestures.
|
||||
*/
|
||||
int wm_gesture_evaluate(wmGesture *gesture, const struct wmEvent *event);
|
||||
void wm_gesture_tag_redraw(struct wmWindow *win);
|
||||
|
||||
/* wm_gesture_ops.c */
|
||||
|
||||
/**
|
||||
* Standard tweak, called after window handlers passed on event.
|
||||
*/
|
||||
void wm_tweakevent_test(bContext *C, const wmEvent *event, int action);
|
||||
|
||||
/* wm_jobs.c */
|
||||
|
||||
/**
|
||||
|
|
|
@ -325,16 +325,6 @@ enum {
|
|||
|
||||
/* NOTE: these values are saved in key-map files, do not change them but just add new ones. */
|
||||
|
||||
/* Tweak events:
|
||||
* Sent as additional event with the mouse coordinates
|
||||
* from where the initial click was placed. */
|
||||
|
||||
/* Tweak events for L M R mouse-buttons. */
|
||||
EVT_TWEAK_L = 0x5002, /* 20482 */
|
||||
EVT_TWEAK_M = 0x5003, /* 20483 */
|
||||
EVT_TWEAK_R = 0x5004, /* 20484 */
|
||||
/* 0x5010 (and lower) should be left to add other tweak types in the future. */
|
||||
|
||||
/* 0x5011 is taken, see EVT_ACTIONZONE_FULLSCREEN */
|
||||
|
||||
/* Misc Blender internals: 0x502x */
|
||||
|
@ -394,9 +384,6 @@ enum {
|
|||
BUTTON6MOUSE, \
|
||||
BUTTON7MOUSE))
|
||||
|
||||
/** Test whether the event is tweak event. */
|
||||
#define ISTWEAK(event_type) ((event_type) >= EVT_TWEAK_L && (event_type) <= EVT_TWEAK_R)
|
||||
|
||||
/** Test whether the event is a NDOF event. */
|
||||
#define ISNDOF(event_type) ((event_type) >= _NDOF_MIN && (event_type) <= _NDOF_MAX)
|
||||
|
||||
|
@ -423,14 +410,11 @@ enum eEventType_Mask {
|
|||
EVT_TYPE_MASK_MOUSE = (1 << 5),
|
||||
/** #ISNDOF */
|
||||
EVT_TYPE_MASK_NDOF = (1 << 6),
|
||||
/** #ISTWEAK */
|
||||
EVT_TYPE_MASK_TWEAK = (1 << 7),
|
||||
/** #IS_EVENT_ACTIONZONE */
|
||||
EVT_TYPE_MASK_ACTIONZONE = (1 << 8),
|
||||
EVT_TYPE_MASK_ACTIONZONE = (1 << 7),
|
||||
};
|
||||
#define EVT_TYPE_MASK_ALL \
|
||||
(EVT_TYPE_MASK_KEYBOARD | EVT_TYPE_MASK_MOUSE | EVT_TYPE_MASK_NDOF | EVT_TYPE_MASK_TWEAK | \
|
||||
EVT_TYPE_MASK_ACTIONZONE)
|
||||
(EVT_TYPE_MASK_KEYBOARD | EVT_TYPE_MASK_MOUSE | EVT_TYPE_MASK_NDOF | EVT_TYPE_MASK_ACTIONZONE)
|
||||
|
||||
#define EVT_TYPE_MASK_HOTKEY_INCLUDE \
|
||||
(EVT_TYPE_MASK_KEYBOARD | EVT_TYPE_MASK_MOUSE | EVT_TYPE_MASK_NDOF)
|
||||
|
|
Loading…
Reference in New Issue