[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47762] branches/soc-2012-bratwurst/source /blender/editors/screen/screen_ops.c: Fix rendering corruption when trying to merge an split with multiple areas on one side .

Jorge Rodriguez bs.vino at gmail.com
Tue Jun 12 00:09:29 CEST 2012


Revision: 47762
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47762
Author:   vino
Date:     2012-06-11 22:09:15 +0000 (Mon, 11 Jun 2012)
Log Message:
-----------
Fix rendering corruption when trying to merge an split with multiple areas on one side. For now this is disabled, hopefully later I'll get around to making a patch that allows the user to join multiple areas at once.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/source/blender/editors/screen/screen_ops.c

Modified: branches/soc-2012-bratwurst/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/screen/screen_ops.c	2012-06-11 20:58:16 UTC (rev 47761)
+++ branches/soc-2012-bratwurst/source/blender/editors/screen/screen_ops.c	2012-06-11 22:09:15 UTC (rev 47762)
@@ -960,6 +960,29 @@
 	return 1;
 }
 
+static void area_move_reset_split_offset(ScrArea* split)
+{
+	split->v1->flag &= ~VERT_FLAG_OFFSET;
+	split->v2->flag &= ~VERT_FLAG_OFFSET;
+	split->v3->flag &= ~VERT_FLAG_OFFSET;
+	split->v4->flag &= ~VERT_FLAG_OFFSET;
+}
+
+static void area_move_reset_split_offsets(ScrArea** split1, ScrArea** split2)
+{
+	if (!split1 || !(*split1))
+		return;
+
+	if (!split2 || !(*split2))
+		return;
+
+	area_move_reset_split_offset(*split1);
+	area_move_reset_split_offset(*split2);
+
+	*split1 = NULL;
+	*split2 = NULL;
+}
+
 /* moves selected screen edge amount of delta, used by split & move */
 static void area_move_apply_do(bContext *C, int origval, int delta, int dir, int bigger, int smaller, ScrArea** split1, ScrArea** split2)
 {
@@ -1036,16 +1059,50 @@
 					if (overflow < 0)
 					{
 						if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v2->flag&VERT_FLAG_SELECTED))
-							*split1 = sa;
+						{
+							// If there's already a split on this side then disallow joining.
+							// Blender doesn't support joining a split with multiple areas on one side.
+							if (*split1)
+							{
+								area_move_reset_split_offsets(split1, split2);
+								overflow = 0;
+							}
+							else
+								*split1 = sa;
+						}
 						else if ((sa->v3->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
-							*split2 = sa;
+						{
+							if (*split2)
+							{
+								area_move_reset_split_offsets(split1, split2);
+								overflow = 0;
+							}
+							else
+								*split2 = sa;
+						}
 					}
 					else
 					{
 						if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v2->flag&VERT_FLAG_SELECTED))
-							*split2 = sa;
+						{
+							if (*split2)
+							{
+								area_move_reset_split_offsets(split1, split2);
+								overflow = 0;
+							}
+							else
+								*split2 = sa;
+						}
 						else if ((sa->v3->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
-							*split1 = sa;
+						{
+							if (*split1)
+							{
+								area_move_reset_split_offsets(split1, split2);
+								overflow = 0;
+							}
+							else
+								*split1 = sa;
+						}
 					}
 				}
 				else
@@ -1053,44 +1110,63 @@
 					if (overflow > 0)
 					{
 						if ((sa->v2->flag&VERT_FLAG_SELECTED) && (sa->v3->flag&VERT_FLAG_SELECTED))
-							*split1 = sa;
+						{
+							if (*split1)
+							{
+								area_move_reset_split_offsets(split1, split2);
+								overflow = 0;
+							}
+							else
+								*split1 = sa;
+						}
 						else if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
-							*split2 = sa;
+						{
+							if (*split2)
+							{
+								area_move_reset_split_offsets(split1, split2);
+								overflow = 0;
+							}
+							else
+								*split2 = sa;
+						}
 					}
 					else
 					{
 						if ((sa->v2->flag&VERT_FLAG_SELECTED) && (sa->v3->flag&VERT_FLAG_SELECTED))
-							*split2 = sa;
+						{
+							if (*split2)
+							{
+								area_move_reset_split_offsets(split1, split2);
+								overflow = 0;
+							}
+							else
+								*split2 = sa;
+						}
 						else if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
-							*split1 = sa;
+						{
+							if (*split1)
+							{
+								area_move_reset_split_offsets(split1, split2);
+								overflow = 0;
+							}
+							else
+								*split1 = sa;
+						}
 					}
 				}
 			}
+			else
+				area_move_reset_split_offset(sa);
 
 			ED_area_tag_redraw(sa);
 		}
 	}
 
-	// split2 is the one that's closing
-	if (split2 && *split2 && (*split2)->type->spaceid == SPACE_INFO)
+	if (split1 && *split1 && split2 && *split2 && ((*split2)->type->spaceid == SPACE_INFO || area_getorientation(*split1, *split2) < 0))
 	{
 		// Don't allow dragging closed of SPACE_INFO.
 		// It should be tougher to close, most users want it always open and new users don't want to accidentally close it.
-		(*split2)->v1->flag &= ~VERT_FLAG_OFFSET;
-		(*split2)->v2->flag &= ~VERT_FLAG_OFFSET;
-		(*split2)->v3->flag &= ~VERT_FLAG_OFFSET;
-		(*split2)->v4->flag &= ~VERT_FLAG_OFFSET;
-
-		if (*split1)
-		{
-			(*split1)->v1->flag &= ~VERT_FLAG_OFFSET;
-			(*split1)->v2->flag &= ~VERT_FLAG_OFFSET;
-			(*split1)->v3->flag &= ~VERT_FLAG_OFFSET;
-			(*split1)->v4->flag &= ~VERT_FLAG_OFFSET;
-		}
-
-		*split1 = NULL;
-		*split2 = NULL;
+		area_move_reset_split_offsets(split1, split2);
 	}
 
 	WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL); /* redraw everything */




More information about the Bf-blender-cvs mailing list