[Bf-blender-cvs] [66b84ad] master: Followup to previous commit: fix same wrong numinput handling in other modal ops.

Bastien Montagne noreply at git.blender.org
Mon Aug 25 20:28:06 CEST 2014


Commit: 66b84ad1592d8f89ef85fa64006fea0b59a55565
Author: Bastien Montagne
Date:   Mon Aug 25 20:18:43 2014 +0200
Branches: master
https://developer.blender.org/rB66b84ad1592d8f89ef85fa64006fea0b59a55565

Followup to previous commit: fix same wrong numinput handling in other modal ops.

Also stumbled uppon 'move marker' code, was needing a bunch of fixes, cleanup and simplification,
and added a candy feature - now you will enter numinput values in seconds when editor is
in 'time' mode, instead of frames!

===================================================================

M	source/blender/editors/animation/anim_markers.c
M	source/blender/editors/mesh/editmesh_bevel.c
M	source/blender/editors/mesh/editmesh_inset.c
M	source/blender/editors/mesh/editmesh_loopcut.c

===================================================================

diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c
index a133bc49..3313b70 100644
--- a/source/blender/editors/animation/anim_markers.c
+++ b/source/blender/editors/animation/anim_markers.c
@@ -604,24 +604,88 @@ typedef struct MarkerMove {
 	NumInput num;
 } MarkerMove;
 
+static bool ed_marker_move_use_time(MarkerMove *mm)
+{
+	if (((mm->slink->spacetype == SPACE_TIME) && !(((SpaceTime *)mm->slink)->flag & TIME_DRAWFRAMES)) ||
+	    ((mm->slink->spacetype == SPACE_SEQ) && !(((SpaceSeq *)mm->slink)->flag & SEQ_DRAWFRAMES)) ||
+	    ((mm->slink->spacetype == SPACE_ACTION) && (((SpaceAction *)mm->slink)->flag & SACTION_DRAWTIME)) ||
+	    ((mm->slink->spacetype == SPACE_IPO) && !(((SpaceIpo *)mm->slink)->flag & SIPO_DRAWTIME)) ||
+	    ((mm->slink->spacetype == SPACE_NLA) && !(((SpaceNla *)mm->slink)->flag & SNLA_DRAWTIME)))
+	{
+		return true;
+	}
+
+	return false;
+}
+
+static void ed_marker_move_update_header(bContext *C, wmOperator *op)
+{
+	Scene *scene = CTX_data_scene(C);
+	MarkerMove *mm = op->customdata;
+	TimeMarker *marker, *selmarker = NULL;
+	const int offs = RNA_int_get(op->ptr, "frames");
+	char str[256];
+	char str_offs[NUM_STR_REP_LEN];
+	int totmark;
+	const bool use_time = ed_marker_move_use_time(mm);
+
+	for (totmark = 0, marker = mm->markers->first; marker; marker = marker->next) {
+		if (marker->flag & SELECT) {
+			selmarker = marker;
+			totmark++;
+		}
+	}
+
+	if (hasNumInput(&mm->num)) {
+		outputNumInput(&mm->num, str_offs, scene->unit.scale_length);
+	}
+	else if (use_time) {
+		BLI_snprintf(str_offs, sizeof(str_offs), "%.2f", FRA2TIME(offs));
+	}
+	else {
+		BLI_snprintf(str_offs, sizeof(str_offs), "%d", offs);
+	}
+
+	if (totmark == 1 && selmarker) {
+		/* we print current marker value */
+		if (use_time) {
+			BLI_snprintf(str, sizeof(str), "Marker %.2f offset %s", FRA2TIME(selmarker->frame), str_offs);
+		}
+		else {
+			BLI_snprintf(str, sizeof(str), "Marker %d offset %s", selmarker->frame, str_offs);
+		}
+	}
+	else {
+		BLI_snprintf(str, sizeof(str), "Marker offset %s", str_offs);
+	}
+
+	ED_area_headerprint(CTX_wm_area(C), str);
+}
+
 /* copy selection to temp buffer */
 /* return 0 if not OK */
-static int ed_marker_move_init(bContext *C, wmOperator *op)
+static bool ed_marker_move_init(bContext *C, wmOperator *op)
 {
 	Scene *scene = CTX_data_scene(C);
 	ListBase *markers = ED_context_get_markers(C);
 	MarkerMove *mm;
 	TimeMarker *marker;
-	int totmark = 0;
-	int a;
+	int a, totmark;
+
+	if (markers == NULL) {
+		return false;
+	}
+
+	for (totmark = 0, marker = markers->first; marker; marker = marker->next) {
+		if (marker->flag & SELECT) {
+			totmark++;
+		}
+	}
+
+	if (totmark == 0) {
+		return false;
+	}
 
-	if (markers == NULL) return 0;
-	
-	for (marker = markers->first; marker; marker = marker->next)
-		if (marker->flag & SELECT) totmark++;
-	
-	if (totmark == 0) return 0;
-	
 	op->customdata = mm = MEM_callocN(sizeof(MarkerMove), "Markermove");
 	mm->slink = CTX_wm_space_data(C);
 	mm->markers = markers;
@@ -632,16 +696,16 @@ static int ed_marker_move_init(bContext *C, wmOperator *op)
 	mm->num.val_flag[0] |= NUM_NO_FRACTION;
 	mm->num.unit_sys = scene->unit.system;
 	/* No time unit supporting frames currently... */
-	mm->num.unit_type[0] = B_UNIT_NONE;
-	
+	mm->num.unit_type[0] = ed_marker_move_use_time(mm) ? B_UNIT_TIME : B_UNIT_NONE;
+
 	for (a = 0, marker = markers->first; marker; marker = marker->next) {
 		if (marker->flag & SELECT) {
 			mm->oldframe[a] = marker->frame;
 			a++;
 		}
 	}
-	
-	return 1;
+
+	return true;
 }
 
 /* free stuff */
@@ -672,7 +736,9 @@ static int ed_marker_move_invoke(bContext *C, wmOperator *op, const wmEvent *eve
 		
 		/* reset frs delta */
 		RNA_int_set(op->ptr, "frames", 0);
-		
+
+		ed_marker_move_update_header(C, op);
+
 		return OPERATOR_RUNNING_MODAL;
 	}
 	
@@ -726,138 +792,88 @@ static void ed_marker_move_cancel(bContext *C, wmOperator *op)
 	ed_marker_move_exit(C, op);
 }
 
-
-
 static int ed_marker_move_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
 	Scene *scene = CTX_data_scene(C);
 	MarkerMove *mm = op->customdata;
 	View2D *v2d = UI_view2d_fromcontext(C);
-	TimeMarker *marker, *selmarker = NULL;
-	char str[256];
-		
-	switch (event->type) {
-		case ESCKEY:
-			ed_marker_move_cancel(C, op);
-			return OPERATOR_CANCELLED;
-		case RIGHTMOUSE:
-			/* press = user manually demands transform to be canceled */
-			if (event->val == KM_PRESS) {
+	const bool has_numinput = hasNumInput(&mm->num);
+	const bool use_time = ed_marker_move_use_time(mm);
+
+	/* Modal numinput active, try to handle numeric inputs first... */
+	if (event->val == KM_PRESS && has_numinput && handleNumInput(C, &mm->num, event)) {
+		float value = (float)RNA_int_get(op->ptr, "frames");
+
+		applyNumInput(&mm->num, &value);
+		if (use_time) {
+			value = TIME2FRA(value);
+		}
+
+		RNA_int_set(op->ptr, "frames", (int)value);
+		ed_marker_move_apply(C, op);
+		ed_marker_move_update_header(C, op);
+	}
+	else {
+		bool handled = false;
+		switch (event->type) {
+			case ESCKEY:
 				ed_marker_move_cancel(C, op);
 				return OPERATOR_CANCELLED;
-			}
-		/* else continue; <--- see if release event should be caught for tweak-end */
-		
-		case RETKEY:
-		case PADENTER:
-		case LEFTMOUSE:
-		case MIDDLEMOUSE:
-			if (WM_modal_tweak_exit(event, mm->event_type)) {
-				ed_marker_move_exit(C, op);
-				WM_event_add_notifier(C, NC_SCENE | ND_MARKERS, NULL);
-				WM_event_add_notifier(C, NC_ANIMATION | ND_MARKERS, NULL);
-				return OPERATOR_FINISHED;
-			}
-			break;
-		case MOUSEMOVE:
-		{
-			float dx, fac;
-
-			if (hasNumInput(&mm->num))
-				break;
-			
-			dx = BLI_rctf_size_x(&v2d->cur) / BLI_rcti_size_x(&v2d->mask);
-			
-			if (event->x != mm->evtx) {   /* XXX maybe init for first time */
-				int a, offs, totmark = 0;
-				
-				mm->evtx = event->x;
-				
-				fac = ((float)(event->x - mm->firstx) * dx);
-				
-				if (mm->slink->spacetype == SPACE_TIME) 
-					apply_keyb_grid(event->shift, event->ctrl, &fac, 0.0, FPS, 0.1 * FPS, 0);
-				else
-					apply_keyb_grid(event->shift, event->ctrl, &fac, 0.0, 1.0, 0.1, 0 /*was: U.flag & USER_AUTOGRABGRID*/);
-				
-				offs = (int)fac;
-				RNA_int_set(op->ptr, "frames", offs);
-				ed_marker_move_apply(C, op);
-				
-				/* cruft below is for header print */
-				for (a = 0, marker = mm->markers->first; marker; marker = marker->next) {
-					if (marker->flag & SELECT) {
-						selmarker = marker;
-						a++; totmark++;
-					}
+			case RIGHTMOUSE:
+				/* press = user manually demands transform to be canceled */
+				if (event->val == KM_PRESS) {
+					ed_marker_move_cancel(C, op);
+					return OPERATOR_CANCELLED;
 				}
-				
-				if (totmark == 1) {
-					/* we print current marker value */
-					if (mm->slink->spacetype == SPACE_TIME) {
-						SpaceTime *stime = (SpaceTime *)mm->slink;
-						if (stime->flag & TIME_DRAWFRAMES) 
-							BLI_snprintf(str, sizeof(str), "Marker %d offset %d", selmarker->frame, offs);
-						else 
-							BLI_snprintf(str, sizeof(str), "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
-					}
-					else if (mm->slink->spacetype == SPACE_ACTION) {
-						SpaceAction *saction = (SpaceAction *)mm->slink;
-						if (saction->flag & SACTION_DRAWTIME)
-							BLI_snprintf(str, sizeof(str), "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
-						else
-							BLI_snprintf(str, sizeof(str), "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
-					}
-					else {
-						BLI_snprintf(str, sizeof(str), "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
-					}
+			/* else continue; <--- see if release event should be caught for tweak-end */
+
+			case RETKEY:
+			case PADENTER:
+			case LEFTMOUSE:
+			case MIDDLEMOUSE:
+				if (WM_modal_tweak_exit(event, mm->event_type)) {
+					ed_marker_move_exit(C, op);
+					WM_event_add_notifier(C, NC_SCENE | ND_MARKERS, NULL);
+					WM_event_add_notifier(C, NC_ANIMATION | ND_MARKERS, NULL);
+					return OPERATOR_FINISHED;
 				}
-				else {
-					/* we only print the offset */
-					if (mm->slink->spacetype == SPACE_TIME) {
-						SpaceTime *stime = (SpaceTime *)mm->slink;
-						if (stime->flag & TIME_DRAWFRAMES) 
-							BLI_snprintf(str, sizeof(str), "Marker offset %d ", offs);
-						else 
-							BLI_snprintf(str, sizeof(str), "Marker offset %.2f ", FRA2TIME(offs));
-					}
-					else if (mm->slink->spacetype == SPACE_ACTION) {
-						SpaceAction *saction = (SpaceAction *)mm->slink;
-						if (saction->flag & SACTION_DRAWTIME)
-							BLI_snprintf(str, sizeof(str), "Marker offset %.2f ", FRA2TIME(offs));
+				break;
+			case MOUSEMOVE:
+				if (!has_numinput) {
+					float dx;
+
+					dx = BLI_rctf_size_x(&v2d->cur) / BLI_rcti_size_x(&v2d->mask);
+
+					if (event->x != mm->evtx) {   /* XXX maybe init for first time */
+						float fac;
+
+						mm->evtx = event->x;
+						fac = ((float)(event->x - mm->firstx) * dx);
+
+						if (mm->slink->spacetype == SPACE_TIME)
+							apply_keyb_grid(event->shift, event->ctrl, &fac, 0.0, FPS, 0.1 * FPS, 0);
 						else
-							BLI_snprintf(str, sizeof(str), "Marker offset %.2f ", (double)(offs));
-					}
-					else {
-						BLI_snprintf(str, sizeof(str), "Marker offset %.2f ", (double)(offs));
+							apply_keyb_grid(event->shift, event->ctrl, &fac, 0.0, 1.0, 0.1, 0 /*was: U.flag & USER_AUTOGRABGRID*/);
+
+						RNA_int_set(op->ptr, "frames", (int)fac);
+						ed_marker_move_apply(C, op);
+						ed_marker_move_update_header(C, op);
 					}
 				}
-				
-				ED_area_headerprint(CTX_wm_area(C), str);
-			}
-			break;
+				break;
 		}
-	}
 
-	if (event->val == KM_PRESS) {
-		if (handleNumInput(C, &mm->num, event)) {
-			char str_tx[NUM_STR_REP_LEN];
-			float value = RNA_int_get(op->ptr, "frames");
-			applyNumInput(&mm->num, &value);
+		if (!handled && event->val == KM_PRESS && handleNumInput(C, &mm->num, event)) {
+			float value = (float)RNA_int_get(op->ptr, "frames");
 
-			if (hasNumInput(&mm->num)) {
-				outputNumInput(&mm->num, str_tx, scene->unit.scale_length);
-			}
-			else {
-				BLI_snprintf(str_tx, sizeof(str_tx), "%d", (int)value);
+			applyNumInput(&mm->num, &value);
+			if 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list