[Bf-blender-cvs] [c6416ae6531] master: Screen: support splitting from floating menu

Campbell Barton noreply at git.blender.org
Mon Jul 2 12:41:13 CEST 2018


Commit: c6416ae65316c1ff89f9b65d2a87ad4ea6cdd1d6
Author: Campbell Barton
Date:   Mon Jul 2 12:24:21 2018 +0200
Branches: master
https://developer.blender.org/rBc6416ae65316c1ff89f9b65d2a87ad4ea6cdd1d6

Screen: support splitting from floating menu

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

M	source/blender/editors/screen/screen_ops.c

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

diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 411469b539b..44467b6a994 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1655,8 +1655,11 @@ static int area_split_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 	int dir;
 
 	/* no full window splitting allowed */
-	if (sc->state != SCREENNORMAL)
-		return OPERATOR_CANCELLED;
+	BLI_assert(sc->state == SCREENNORMAL);
+
+	PropertyRNA *prop_dir = RNA_struct_find_property(op->ptr, "direction");
+	PropertyRNA *prop_factor = RNA_struct_find_property(op->ptr, "factor");
+	PropertyRNA *prop_cursor = RNA_struct_find_property(op->ptr, "cursor");
 
 	if (event->type == EVT_ACTIONZONE_AREA) {
 		sActionzoneData *sad = event->customdata;
@@ -1676,46 +1679,69 @@ static int area_split_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 		/* prepare operator state vars */
 		if (sad->gesture_dir == 'n' || sad->gesture_dir == 's') {
 			dir = 'h';
-			RNA_float_set(op->ptr, "factor", ((float)(event->x - sad->sa1->v1->vec.x)) / (float)sad->sa1->winx);
+			RNA_property_float_set(
+			        op->ptr, prop_factor,
+			        ((float)(event->x - sad->sa1->v1->vec.x)) / (float)sad->sa1->winx);
 		}
 		else {
 			dir = 'v';
-			RNA_float_set(op->ptr, "factor", ((float)(event->y - sad->sa1->v1->vec.y)) / (float)sad->sa1->winy);
+			RNA_property_float_set(
+			        op->ptr, prop_factor,
+			        ((float)(event->y - sad->sa1->v1->vec.y)) / (float)sad->sa1->winy);
 		}
-		RNA_enum_set(op->ptr, "direction", dir);
+		RNA_property_enum_set(op->ptr, prop_dir, dir);
 
 		/* general init, also non-UI case, adds customdata, sets area and defaults */
-		if (!area_split_init(C, op))
+		if (!area_split_init(C, op)) {
 			return OPERATOR_PASS_THROUGH;
+		}
+	}
+	else if (RNA_property_is_set(op->ptr, prop_dir)) {
+		ScrArea *sa = CTX_wm_area(C);
+		if (sa == NULL) {
+			return OPERATOR_CANCELLED;
+		}
+		dir = RNA_property_enum_get(op->ptr, prop_dir);
+		if (dir == 'h') {
+			RNA_property_float_set(
+			        op->ptr, prop_factor,
+			        ((float)(event->x - sa->v1->vec.x)) / (float)sa->winx);
+		}
+		else {
+			RNA_property_float_set(
+			        op->ptr, prop_factor,
+			        ((float)(event->y - sa->v1->vec.y)) / (float)sa->winy);
+		}
 
+		if (!area_split_init(C, op)) {
+			return OPERATOR_CANCELLED;
+		}
 	}
 	else {
 		ScrEdge *actedge;
-		int x, y;
+		int event_co[2];
 
 		/* retrieve initial mouse coord, so we can find the active edge */
-		if (RNA_struct_property_is_set(op->ptr, "mouse_x"))
-			x = RNA_int_get(op->ptr, "mouse_x");
-		else
-			x = event->x;
-
-		if (RNA_struct_property_is_set(op->ptr, "mouse_y"))
-			y = RNA_int_get(op->ptr, "mouse_y");
-		else
-			y = event->x;
+		if (RNA_property_is_set(op->ptr, prop_cursor)) {
+			RNA_property_int_get_array(op->ptr, prop_cursor, event_co);
+		}
+		else {
+			copy_v2_v2_int(event_co, &event->x);
+		}
 
-		actedge = screen_find_active_scredge(sc, winsize_x, winsize_y, x, y);
-		if (actedge == NULL)
+		actedge = screen_find_active_scredge(sc, winsize_x, winsize_y, event_co[0], event_co[1]);
+		if (actedge == NULL) {
 			return OPERATOR_CANCELLED;
+		}
 
 		dir = scredge_is_horizontal(actedge) ? 'v' : 'h';
 
-		RNA_enum_set(op->ptr, "direction", dir);
+		RNA_property_enum_set(op->ptr, prop_dir, dir);
 
 		/* special case, adds customdata, sets defaults */
-		if (!area_split_menu_init(C, op))
+		if (!area_split_menu_init(C, op)) {
 			return OPERATOR_CANCELLED;
-
+		}
 	}
 
 	sd = (sAreaSplitData *)op->customdata;
@@ -1913,8 +1939,7 @@ static void SCREEN_OT_area_split(wmOperatorType *ot)
 	/* rna */
 	RNA_def_enum(ot->srna, "direction", prop_direction_items, 'h', "Direction", "");
 	RNA_def_float(ot->srna, "factor", 0.5f, 0.0, 1.0, "Factor", "", 0.0, 1.0);
-	RNA_def_int(ot->srna, "mouse_x", -100, INT_MIN, INT_MAX, "Mouse X", "", INT_MIN, INT_MAX);
-	RNA_def_int(ot->srna, "mouse_y", -100, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX);
+	RNA_def_int_vector(ot->srna, "cursor", 2, NULL, INT_MIN, INT_MAX, "Cursor", "", INT_MIN, INT_MAX);
 }
 
 /** \} */
@@ -2965,8 +2990,7 @@ static int screen_area_options_invoke(bContext *C, wmOperator *op, const wmEvent
 
 	uiItemFullO(layout, "SCREEN_OT_area_split", NULL, ICON_NONE, NULL, WM_OP_INVOKE_DEFAULT, 0, &ptr);
 	/* store initial mouse cursor position */
-	RNA_int_set(&ptr, "mouse_x", event->x);
-	RNA_int_set(&ptr, "mouse_y", event->y);
+	RNA_int_set_array(&ptr, "cursor", &event->x);
 
 	uiItemFullO(layout, "SCREEN_OT_area_join", NULL, ICON_NONE, NULL, WM_OP_INVOKE_DEFAULT, 0, &ptr);
 	/* mouse cursor on edge, '4' can fail on wide edges... */



More information about the Bf-blender-cvs mailing list