Fix knife tool using an invalid event value check

The events value was checked without checking the expected modal state.
This commit is contained in:
Campbell Barton 2021-09-27 14:39:54 +10:00
parent 037e66999a
commit 10a26d583d
1 changed files with 41 additions and 37 deletions

View File

@ -4623,52 +4623,56 @@ static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event)
if (kcd->num.str_cur >= 2) {
knife_reset_snap_angle_input(kcd);
}
/* Modal numinput inactive, try to handle numeric inputs last... */
if (!handled && event->val == KM_PRESS && handleNumInput(C, &kcd->num, event)) {
applyNumInput(&kcd->num, &snapping_increment_temp);
/* Restrict number key input to 0 - 90 degree range. */
if (snapping_increment_temp > KNIFE_MIN_ANGLE_SNAPPING_INCREMENT &&
snapping_increment_temp < KNIFE_MAX_ANGLE_SNAPPING_INCREMENT) {
kcd->angle_snapping_increment = snapping_increment_temp;
if (event->type != EVT_MODAL_MAP) {
/* Modal number-input inactive, try to handle numeric inputs last. */
if (!handled && event->val == KM_PRESS && handleNumInput(C, &kcd->num, event)) {
applyNumInput(&kcd->num, &snapping_increment_temp);
/* Restrict number key input to 0 - 90 degree range. */
if (snapping_increment_temp > KNIFE_MIN_ANGLE_SNAPPING_INCREMENT &&
snapping_increment_temp < KNIFE_MAX_ANGLE_SNAPPING_INCREMENT) {
kcd->angle_snapping_increment = snapping_increment_temp;
}
knife_update_active(C, kcd);
knife_update_header(C, op, kcd);
ED_region_tag_redraw(kcd->region);
return OPERATOR_RUNNING_MODAL;
}
knife_update_active(C, kcd);
knife_update_header(C, op, kcd);
ED_region_tag_redraw(kcd->region);
return OPERATOR_RUNNING_MODAL;
}
}
/* Constrain axes with X,Y,Z keys. */
if (ELEM(event->val, KNF_MODAL_X_AXIS, KNF_MODAL_Y_AXIS, KNF_MODAL_Z_AXIS)) {
if (event->val == KNF_MODAL_X_AXIS && kcd->constrain_axis != KNF_CONSTRAIN_AXIS_X) {
kcd->constrain_axis = KNF_CONSTRAIN_AXIS_X;
kcd->constrain_axis_mode = KNF_CONSTRAIN_AXIS_MODE_GLOBAL;
kcd->axis_string[0] = 'X';
}
else if (event->val == KNF_MODAL_Y_AXIS && kcd->constrain_axis != KNF_CONSTRAIN_AXIS_Y) {
kcd->constrain_axis = KNF_CONSTRAIN_AXIS_Y;
kcd->constrain_axis_mode = KNF_CONSTRAIN_AXIS_MODE_GLOBAL;
kcd->axis_string[0] = 'Y';
}
else if (event->val == KNF_MODAL_Z_AXIS && kcd->constrain_axis != KNF_CONSTRAIN_AXIS_Z) {
kcd->constrain_axis = KNF_CONSTRAIN_AXIS_Z;
kcd->constrain_axis_mode = KNF_CONSTRAIN_AXIS_MODE_GLOBAL;
kcd->axis_string[0] = 'Z';
}
else {
/* Cycle through modes with repeated key presses. */
if (kcd->constrain_axis_mode != KNF_CONSTRAIN_AXIS_MODE_LOCAL) {
kcd->constrain_axis_mode++;
kcd->axis_string[0] += 32; /* Lower case. */
if (event->type == EVT_MODAL_MAP) {
if (ELEM(event->val, KNF_MODAL_X_AXIS, KNF_MODAL_Y_AXIS, KNF_MODAL_Z_AXIS)) {
if (event->val == KNF_MODAL_X_AXIS && kcd->constrain_axis != KNF_CONSTRAIN_AXIS_X) {
kcd->constrain_axis = KNF_CONSTRAIN_AXIS_X;
kcd->constrain_axis_mode = KNF_CONSTRAIN_AXIS_MODE_GLOBAL;
kcd->axis_string[0] = 'X';
}
else if (event->val == KNF_MODAL_Y_AXIS && kcd->constrain_axis != KNF_CONSTRAIN_AXIS_Y) {
kcd->constrain_axis = KNF_CONSTRAIN_AXIS_Y;
kcd->constrain_axis_mode = KNF_CONSTRAIN_AXIS_MODE_GLOBAL;
kcd->axis_string[0] = 'Y';
}
else if (event->val == KNF_MODAL_Z_AXIS && kcd->constrain_axis != KNF_CONSTRAIN_AXIS_Z) {
kcd->constrain_axis = KNF_CONSTRAIN_AXIS_Z;
kcd->constrain_axis_mode = KNF_CONSTRAIN_AXIS_MODE_GLOBAL;
kcd->axis_string[0] = 'Z';
}
else {
kcd->constrain_axis = KNF_CONSTRAIN_AXIS_NONE;
kcd->constrain_axis_mode = KNF_CONSTRAIN_AXIS_MODE_NONE;
/* Cycle through modes with repeated key presses. */
if (kcd->constrain_axis_mode != KNF_CONSTRAIN_AXIS_MODE_LOCAL) {
kcd->constrain_axis_mode++;
kcd->axis_string[0] += 32; /* Lower case. */
}
else {
kcd->constrain_axis = KNF_CONSTRAIN_AXIS_NONE;
kcd->constrain_axis_mode = KNF_CONSTRAIN_AXIS_MODE_NONE;
}
}
kcd->axis_constrained = (kcd->constrain_axis != KNF_CONSTRAIN_AXIS_NONE);
knifetool_disable_angle_snapping(kcd);
knife_update_header(C, op, kcd);
}
kcd->axis_constrained = (kcd->constrain_axis != KNF_CONSTRAIN_AXIS_NONE);
knifetool_disable_angle_snapping(kcd);
knife_update_header(C, op, kcd);
}
if (kcd->mode == MODE_DRAGGING) {