[Bf-blender-cvs] [53c539c] ui-align-rework: Refactor of new 'align compute' code.

Bastien Montagne noreply at git.blender.org
Tue Oct 20 18:07:14 CEST 2015


Commit: 53c539cca4a42accf6729135bdcd568ec3496f15
Author: Bastien Montagne
Date:   Tue Oct 20 12:56:26 2015 +0200
Branches: ui-align-rework
https://developer.blender.org/rB53c539cca4a42accf6729135bdcd568ec3496f15

Refactor of new 'align compute' code.

Much, much shorter now.

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

M	release/scripts/startup/bl_ui/properties_render.py
M	source/blender/editors/interface/interface.c

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

diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 1f1802a..1192fa8 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -131,16 +131,17 @@ class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
         scene = context.scene
         rd = scene.render
 
-        row = layout.row(align=True)
+        col_a = layout.column(align=True)
+
+        row = col_a.row(align=True)
         row.menu("RENDER_MT_presets", text=bpy.types.RENDER_MT_presets.bl_label)
         row.operator("render.preset_add", text="", icon='ZOOMIN')
         row.operator("render.preset_add", text="", icon='ZOOMOUT').remove_active = True
 
-        split = layout.split()
+        split = col_a.split(align=True)
 
-        col = split.column()
+        col = split.column(align=True)
         sub = col.column(align=True)
-        sub.label(text="Resolution:")
         sub.prop(rd, "resolution_x", text="X")
         sub.prop(rd, "resolution_y", text="Y")
         sub.prop(rd, "resolution_percentage", text="")
@@ -149,17 +150,17 @@ class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
         sub.prop(rd, "pixel_aspect_x", text="X")
         sub.prop(rd, "pixel_aspect_y", text="Y")
 
-        row = col.row()
+        row = col.row(align=True)
         row.prop(rd, "use_border", text="Border")
-        sub = row.row()
+        sub = row.row(align=True)
         sub.active = rd.use_border
         sub.prop(rd, "use_crop_to_border", text="Crop")
 
-        col = split.column()
+        col = split.column(align=True)
         sub = col.column(align=True)
-        sub.label(text="Frame Range:")
         sub.prop(scene, "frame_start")
-        sub.prop(scene, "frame_end")
+        #~ sub.prop(scene, "frame_end")
+        sub.label("")
         sub.prop(scene, "frame_step")
 
         sub.label(text="Frame Rate:")
@@ -172,6 +173,8 @@ class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
         subrow.prop(rd, "frame_map_old", text="Old")
         subrow.prop(rd, "frame_map_new", text="New")
 
+        col_a.prop(scene, "frame_end")
+
 
 class RENDER_PT_antialiasing(RenderButtonsPanel, Panel):
     bl_label = "Anti-Aliasing"
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index f0e25a8..dfde112 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1251,7 +1251,8 @@ void UI_block_end_ex(const bContext *C, uiBlock *block, const int xy[2])
 		UI_block_layout_resolve(block, NULL, NULL);
 	}
 
-	TIMEIT_BENCH(ui_block_align_calc(block), ui_block_align_calc);
+//	TIMEIT_BENCH(ui_block_align_calc(block), ui_block_align_calc);
+	ui_block_align_calc(block);
 
 	if ((block->flag & UI_BLOCK_LOOP) && (block->flag & UI_BLOCK_NUMSELECT)) {
 		ui_menu_block_set_keyaccels(block); /* could use a different flag to check */
@@ -2939,116 +2940,144 @@ void UI_block_align_end(uiBlock *block)
 #if 1
 typedef struct uiButAlign {
 	uiBut *but;
-	struct uiButAlign *left, *top, *right, *down;
-	float dleft, dtop, dright, ddown;
-	int flag;
+
+	/* Neighbor buttons */
+	struct uiButAlign *neighbors[4];
+
+	/* Pointers to coordinates (rctf values) of the button. */
+	float *borders[4];
+
+	/* Distances to the neighbors. */
+	float dists[4];
+
+	/* Flags, used to mark whether we should 'stitch' the corners of this button with its neighbors' ones. */
+	char flags[4];
 } uiButAlign;
 
 enum {
-	ALIGN_STITCH_LEFT_DOWN  = 1 << 0,
-	ALIGN_STITCH_LEFT_TOP   = 1 << 1,
-	ALIGN_STITCH_TOP_LEFT   = 1 << 2,
-	ALIGN_STITCH_TOP_RIGHT  = 1 << 3,
-	ALIGN_STITCH_RIGHT_TOP  = 1 << 4,
-	ALIGN_STITCH_RIGHT_DOWN = 1 << 5,
-	ALIGN_STITCH_DOWN_RIGHT = 1 << 6,
-	ALIGN_STITCH_DOWN_LEFT  = 1 << 7,
+	LEFT         = 0,
+	TOP          = 1,
+	RIGHT        = 2,
+	DOWN         = 3,
+
+	STITCH_LEFT  = 1 << 4,
+	STITCH_TOP   = 1 << 5,
+	STITCH_RIGHT = 1 << 6,
+	STITCH_DOWN  = 1 << 7,
 };
 
+#define OPPOSITE(_s) (((_s) + 2) % 4)
+#define SIDE1(_s) (((_s) + 1) % 4)
+#define SIDE2(_s) (((_s) + 3) % 4)
+
+#define STITCH(_s) (1 << ((_s) + 4))
+
 bool ui_but_can_align(uiBut *but)
 {
 	return !ELEM(but->type, UI_BTYPE_LABEL, UI_BTYPE_CHECKBOX, UI_BTYPE_CHECKBOX_N, UI_BTYPE_SEPR, UI_BTYPE_SEPR_LINE);
 }
 
-static bool buts_touching_vertical(uiBut *but1, uiBut *but2)
-{
-	return !((but1->rect.ymin >= but2->rect.ymax) || (but1->rect.ymax <= but2->rect.ymin));
-}
-
-static bool buts_touching_horizontal(uiBut *but1, uiBut *but2)
-{
-	return !((but1->rect.xmin >= but2->rect.xmax) || (but1->rect.xmax <= but2->rect.xmin));
+static int get_but_align_flag(const int i) {
+	switch (i) {
+		case LEFT:
+			return UI_BUT_ALIGN_LEFT;
+		case TOP:
+			return UI_BUT_ALIGN_TOP;
+		case RIGHT:
+			return UI_BUT_ALIGN_RIGHT;
+		case DOWN:
+			return UI_BUT_ALIGN_DOWN;
+		default:
+			BLI_assert(0);
+			return 0;
+	}
 }
 
 /* Only the shortest diff (if below acceptable limits) is set, other pointers are set to NULL. */
-static int buts_proximity(
-        uiBut *but1, uiBut *but2, float *r_dleft, float *r_dtop, float *r_dright, float *r_ddown, int *r_corners)
+static void buts_proximity_compute(uiButAlign *but1, uiButAlign *but2)
 {
-	const float max_delta_y = 0.5f * UI_UNIT_Y;
-	const float max_delta_x = 0.5f * UI_UNIT_X;
+	const float max_delta = 0.5f * max_ii(UI_UNIT_Y, UI_UNIT_X);
 	float delta;
-	int ret = 0;
+	int i;
 
-	*r_corners = 0;
+	const bool buts_share[2] = {
+	    /* Sharing same line? */
+	    !((*but1->borders[DOWN] >= *but2->borders[TOP]) || (*but1->borders[TOP] <= *but2->borders[DOWN])),
+	    /* Sharing same column? */
+	    !((*but1->borders[LEFT] >= *but2->borders[RIGHT]) || (*but1->borders[RIGHT] <= *but2->borders[LEFT])),
+	};
 
-	if (buts_touching_vertical(but1, but2)) {
-		delta = fabsf(but1->rect.xmax - but2->rect.xmin);
-		if (delta < max_delta_x ) {
-			*r_dright = delta;
-			ret |= UI_BUT_ALIGN_RIGHT;
+	for (i = 0; i < 4; i++) {
+		const int i_share = i % 2;
 
-			delta = fabsf(but1->rect.ymin - but2->rect.ymin);
-			if (delta < max_delta_y) {
-				*r_corners |= ALIGN_STITCH_RIGHT_DOWN;
-			}
-			delta = fabsf(but1->rect.ymax - but2->rect.ymax);
-			if (delta < max_delta_y) {
-				*r_corners |= ALIGN_STITCH_RIGHT_TOP;
-			}
-		}
-		else {
-			delta = fabsf(but1->rect.xmin - but2->rect.xmax);
-			if (delta < max_delta_x) {
-				*r_dleft = delta;
-				ret |= UI_BUT_ALIGN_LEFT;
-
-				delta = fabsf(but1->rect.ymin - but2->rect.ymin);
-				if (delta < max_delta_y) {
-					*r_corners |= ALIGN_STITCH_LEFT_DOWN;
-				}
-				delta = fabsf(but1->rect.ymax - but2->rect.ymax);
-				if (delta < max_delta_y) {
-					*r_corners |= ALIGN_STITCH_LEFT_TOP;
+		if (buts_share[i_share]) {
+			const int i_opp = OPPOSITE(i);
+
+			delta = fabsf(*but1->borders[i] - *but2->borders[i_opp]);
+			if (delta < max_delta) {
+				if (delta <= but1->dists[i]) {
+					if (delta < but1->dists[i]) {
+						but1->neighbors[i] = but2;
+						but2->neighbors[i_opp] = but1;
+						but1->dists[i] = but2->dists[i_opp] = delta;
+					}
+					{
+						const int i_s1 = SIDE1(i);
+						const int i_s2 = SIDE2(i);
+
+						const int stitch = STITCH(i);
+						const int stitch_opp = STITCH(i_opp);
+
+						delta = fabsf(*but1->borders[i_s1] - *but2->borders[i_s1]);
+						if (delta < max_delta) {
+							but1->flags[i_s1] |= stitch;
+							but2->flags[i_s1] |= stitch_opp;
+						}
+						delta = fabsf(*but1->borders[i_s2] - *but2->borders[i_s2]);
+						if (delta < max_delta) {
+							but1->flags[i_s2] |= stitch;
+							but2->flags[i_s2] |= stitch_opp;
+						}
+					}
 				}
+				return;
 			}
 		}
 	}
-	else if (buts_touching_horizontal(but1, but2)) {
-		delta = fabsf(but1->rect.ymin - but2->rect.ymax);
-		if (delta < max_delta_y) {
-			*r_ddown = delta;
-			ret |= UI_BUT_ALIGN_DOWN;
+}
 
-			delta = fabsf(but1->rect.xmin - but2->rect.xmin);
-			if (delta < max_delta_x) {
-				*r_corners |= ALIGN_STITCH_DOWN_LEFT;
-			}
-			delta = fabsf(but1->rect.xmax - but2->rect.xmax);
-			if (delta < max_delta_x) {
-				*r_corners |= ALIGN_STITCH_DOWN_RIGHT;
-			}
+static void align_stitch_neighbors(
+        uiButAlign *butal,
+        const int i, const int i_opp, const int i_s1, const int i_s2,
+        const int align, const int align_opp, const float co)
+{
+	uiButAlign *butal_neighbor;
+
+	printf("%s\n", butal->but->str);
+	if (STREQ(butal->but->str, "Frame Step:")) {
+		printf("%s: main side %d, stride side %d: %f\n", butal->but->str, i, i_s1, butal->dists[i]);
+	}
+
+	while ((butal->flags[i] & STITCH(i_s1)) &&
+	       (butal = butal->neighbors[i_s1]) &&
+	       (butal->flags[i] & STITCH(i_s2)))
+	{
+		if (STREQ(butal->but->str, "Frame Step:")) {
+			printf("%s: main side %d, stride side %d: %f\n", butal->but->str, i, i_s1, butal->dists[i]);
 		}
-		else {
-			delta = fabsf(but1->rect.ymax - but2->rect.ymin);
-			if (delta < max_delta_y) {
-				*r_dtop = delta;
-				ret |= UI_BUT_ALIGN_TOP;
-
-				delta = fabsf(but1->rect.xmin - but2->rect.xmin);
-				if (delta < max_delta_x) {
-					*r_corners |= ALIGN_STITCH_TOP_LEFT;
-				}
-				delta = fabsf(but1->rect.xmax - but2->rect.xmax);
-				if (delta < max_delta_x) {
-					*r_corners |= ALIGN_STITCH_TOP_RIGHT;
-				}
+		if (butal->dists[i]) {
+			butal_neighbor = butal->neighbors[i];
+
+			if (butal_neighbor) {
+				butal->but->drawflag |= align;
+				butal_neighbor->but->drawflag |= align_opp;
+				*butal_neighbor->borders[i_opp] = co;
+				butal_neighbor->dists[i_opp] = 0.0f;
 			}
+			*butal->borders[i] = co;
+			butal->dists[i] = 0.0f;
 		}
 	}
-
-	BLI_assert(ELEM(ret, 0, UI_BUT_ALIGN_LEFT, UI_BUT_ALIGN_TOP, UI_BUT_ALIGN_RIGHT, UI_BUT_ALIGN_DOWN));
-
-	return ret;
 }
 
 void ui_block_align_calc(uiBlock *block)
@@ -3082,7 +3111,11 @@ void ui_block_align_calc(uiBlock *block)
 		}
 
 		but_align->but = but;
-		copy_v4_fl(&but_align->dleft, FLT_MAX);
+		but_align->borders[LEFT] = &but->rect.xmin;
+		but_align->borders[RIGHT] = &but->rect.xmax;
+		but_align->borders[DOWN] = &but->rect.ymin;
+		but_align->borders[TOP] = &but->rect.ymax;
+		copy_v4_fl(but_align->dists, FLT_MAX);
 		but_align++;
 	}
 
@@ -3090,88 +3123,11 @@ void ui_block_align_calc(uiBlock *block)
 		const short alignnr = but_a

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list