[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47149] branches/soc-2012-bratwurst/source /blender: Close an area by dragging an edge between two areas.

Jorge Rodriguez bs.vino at gmail.com
Tue May 29 07:32:59 CEST 2012


Revision: 47149
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47149
Author:   vino
Date:     2012-05-29 05:32:59 +0000 (Tue, 29 May 2012)
Log Message:
-----------
Close an area by dragging an edge between two areas. Also works while dragging out a new area using the new area handle.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/source/blender/editors/screen/area.c
    branches/soc-2012-bratwurst/source/blender/editors/screen/screen_edit.c
    branches/soc-2012-bratwurst/source/blender/editors/screen/screen_ops.c
    branches/soc-2012-bratwurst/source/blender/makesdna/DNA_screen_types.h

Modified: branches/soc-2012-bratwurst/source/blender/editors/screen/area.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/screen/area.c	2012-05-29 04:11:53 UTC (rev 47148)
+++ branches/soc-2012-bratwurst/source/blender/editors/screen/area.c	2012-05-29 05:32:59 UTC (rev 47149)
@@ -464,7 +464,7 @@
 		ar->drawrct.xmax = MIN2(winrct.xmax, ar->drawrct.xmax);
 		ar->drawrct.ymax = MIN2(winrct.ymax, ar->drawrct.ymax);
 	}
-	
+
 	/* note; this sets state, so we can use wmOrtho and friends */
 	wmSubWindowScissorSet(win, ar->swinid, &ar->drawrct);
 	
@@ -1124,7 +1124,19 @@
 	else sa->totrct.ymin = sa->v1->vec.y;
 	if (sa->v2->vec.y < sizey - 1) sa->totrct.ymax = sa->v2->vec.y - 1 - rt;
 	else sa->totrct.ymax = sa->v2->vec.y;
-	
+
+	if (sa->v1->flag&VERT_FLAG_OFFSET)
+	{
+		sa->totrct.xmin += sa->v1->offset.x;
+		sa->totrct.ymin += sa->v1->offset.y;
+	}
+
+	if (sa->v4->flag&VERT_FLAG_OFFSET)
+		sa->totrct.xmax += sa->v4->offset.x;
+
+	if (sa->v2->flag&VERT_FLAG_OFFSET)
+		sa->totrct.ymax += sa->v2->offset.y;
+
 	/* for speedup */
 	sa->winx = sa->totrct.xmax - sa->totrct.xmin + 1;
 	sa->winy = sa->totrct.ymax - sa->totrct.ymin + 1;

Modified: branches/soc-2012-bratwurst/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/screen/screen_edit.c	2012-05-29 04:11:53 UTC (rev 47148)
+++ branches/soc-2012-bratwurst/source/blender/editors/screen/screen_edit.c	2012-05-29 05:32:59 UTC (rev 47149)
@@ -180,19 +180,19 @@
 	
 	se = sc->edgebase.first;
 	while (se) {
-		se->v1->flag = 1;
-		se->v2->flag = 1;
+		se->v1->flag |= VERT_FLAG_SELECTED;
+		se->v2->flag |= VERT_FLAG_SELECTED;
 		se = se->next;
 	}
 	
 	sv = sc->vertbase.first;
 	while (sv) {
 		svn = sv->next;
-		if (sv->flag == 0) {
+		if (!(sv->flag & VERT_FLAG_SELECTED)) {
 			BLI_remlink(&sc->vertbase, sv);
 			MEM_freeN(sv);
 		}
-		else sv->flag = 0;
+		else sv->flag &= ~VERT_FLAG_SELECTED;
 		sv = svn;
 	}
 }
@@ -586,28 +586,30 @@
 	
 	sv = sc->vertbase.first;
 	while (sv) {
-		sv->flag = 0;
+		sv->flag &= ~VERT_FLAG_SELECTED;
 		sv = sv->next;
 	}
 	
-	edge->v1->flag = 1;
-	edge->v2->flag = 1;
+	edge->v1->flag |= VERT_FLAG_SELECTED;
+	edge->v2->flag |= VERT_FLAG_SELECTED;
 	
 	oneselected = 1;
 	while (oneselected) {
 		se = sc->edgebase.first;
 		oneselected = 0;
 		while (se) {
-			if (se->v1->flag + se->v2->flag == 1) {
+			if ((se->v1->flag&VERT_FLAG_SELECTED) ^ (se->v2->flag&VERT_FLAG_SELECTED)) {
 				if (dir == 'h') {
 					if (se->v1->vec.y == se->v2->vec.y) {
-						se->v1->flag = se->v2->flag = 1;
+						se->v1->flag |= VERT_FLAG_SELECTED;
+						se->v2->flag |= VERT_FLAG_SELECTED;
 						oneselected = 1;
 					}
 				}
 				if (dir == 'v') {
 					if (se->v1->vec.x == se->v2->vec.x) {
-						se->v1->flag = se->v2->flag = 1;
+						se->v1->flag |= VERT_FLAG_SELECTED;
+						se->v2->flag |= VERT_FLAG_SELECTED;
 						oneselected = 1;
 					}
 				}
@@ -624,7 +626,7 @@
 	ScrArea *sa;
 	int sizex, sizey;
 	float facx, facy, tempf, min[2], max[2];
-	
+
 	/* calculate size */
 	min[0] = min[1] = 10000.0f;
 	max[0] = max[1] = 0.0f;
@@ -692,7 +694,7 @@
 				while (sv) {
 					/* if is a collapsed area */
 					if (sv != sa->v2 && sv != sa->v3) {
-						if (sv->flag) sv->vec.y = yval;
+						if (sv->flag&VERT_FLAG_SELECTED) sv->vec.y = yval;
 					}
 					sv = sv->next;
 				}
@@ -912,7 +914,19 @@
 	short x2 = sa->v3->vec.x;
 	short y2 = sa->v3->vec.y;
 	short a, rt;
-	
+
+	if (sa->v1->flag&VERT_FLAG_OFFSET)
+	{
+		x1 += sa->v1->offset.x;
+		y1 += sa->v1->offset.y;
+	}
+
+	if (sa->v3->flag&VERT_FLAG_OFFSET)
+	{
+		x2 += sa->v3->offset.x;
+		y2 += sa->v3->offset.y;
+	}
+
 	rt = 0; // CLAMPIS(G.rt, 0, 16);
 	
 	if (center == 0) {

Modified: branches/soc-2012-bratwurst/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/screen/screen_ops.c	2012-05-29 04:11:53 UTC (rev 47148)
+++ branches/soc-2012-bratwurst/source/blender/editors/screen/screen_ops.c	2012-05-29 05:32:59 UTC (rev 47149)
@@ -880,6 +880,8 @@
 typedef struct sAreaMoveData {
 	int bigger, smaller, origval, step;
 	char dir;
+	ScrArea* split1;
+	ScrArea* split2;
 } sAreaMoveData;
 
 /* helper call to move area-edge, sets limits */
@@ -896,18 +898,18 @@
 			int y1 = sa->v2->vec.y - sa->v1->vec.y - areaminy;
 			
 			/* if top or down edge selected, test height */
-			if (sa->v1->flag && sa->v4->flag)
+			if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
 				*bigger = MIN2(*bigger, y1);
-			else if (sa->v2->flag && sa->v3->flag)
+			else if ((sa->v2->flag&VERT_FLAG_SELECTED) && (sa->v3->flag&VERT_FLAG_SELECTED))
 				*smaller = MIN2(*smaller, y1);
 		}
 		else {
 			int x1 = sa->v4->vec.x - sa->v1->vec.x - AREAMINX;
 			
 			/* if left or right edge selected, test width */
-			if (sa->v1->flag && sa->v2->flag)
+			if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v2->flag&VERT_FLAG_SELECTED))
 				*bigger = MIN2(*bigger, x1);
-			else if (sa->v3->flag && sa->v4->flag)
+			else if ((sa->v3->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
 				*smaller = MIN2(*smaller, x1);
 		}
 	}
@@ -946,25 +948,42 @@
 }
 
 /* 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)
+static void area_move_apply_do(bContext *C, int origval, int delta, int dir, int bigger, int smaller, ScrArea** split1, ScrArea** split2)
 {
 	wmWindow *win = CTX_wm_window(C);
 	bScreen *sc = CTX_wm_screen(C);
 	ScrVert *v1;
 	ScrArea *sa;
 	int areaminy = ED_area_headersize() + 1;
-	
+	int overflow = 0;
+	int offset = 22;
+
+	if (delta < -smaller)
+		overflow = -1;
+	if (delta > bigger)
+		overflow = 1;
+
 	delta = CLAMPIS(delta, -smaller, bigger);
-	
+
 	for (v1 = sc->vertbase.first; v1; v1 = v1->next) {
-		if (v1->flag) {
+		if (v1->flag&VERT_FLAG_SELECTED) {
 			/* that way a nice AREAGRID  */
 			if ((dir == 'v') && v1->vec.x > 0 && v1->vec.x < win->sizex - 1) {
 				v1->vec.x = origval + delta;
 				if (delta != bigger && delta != -smaller) v1->vec.x -= (v1->vec.x % AREAGRID);
+
+				if (overflow)
+				{
+					v1->flag |= VERT_FLAG_OFFSET;
+					v1->offset.x = overflow>0?offset:-offset;
+					v1->offset.y = 0;
+				}
+				else
+					v1->flag &= ~VERT_FLAG_OFFSET;
 			}
 			if ((dir == 'h') && v1->vec.y > 0 && v1->vec.y < win->sizey - 1) {
 				v1->vec.y = origval + delta;
+				if (delta != bigger && delta != -smaller) v1->vec.y -= (v1->vec.y % AREAGRID);
 				
 				v1->vec.y += AREAGRID - 1;
 				v1->vec.y -= (v1->vec.y % AREAGRID);
@@ -972,13 +991,65 @@
 				/* prevent too small top header */
 				if (v1->vec.y > win->sizey - areaminy)
 					v1->vec.y = win->sizey - areaminy;
+
+				if (overflow)
+				{
+					v1->flag |= VERT_FLAG_OFFSET;
+					v1->offset.y = overflow>0?offset:-offset;
+					v1->offset.x = 0;
+				}
+				else
+					v1->flag &= ~VERT_FLAG_OFFSET;
 			}
 		}
 	}
 
+	*split1 = NULL;
+	*split2 = NULL;
+
 	for (sa = sc->areabase.first; sa; sa = sa->next) {
-		if (sa->v1->flag || sa->v2->flag || sa->v3->flag || sa->v4->flag)
+		if ((sa->v1->flag&VERT_FLAG_SELECTED) || (sa->v2->flag&VERT_FLAG_SELECTED) || (sa->v3->flag&VERT_FLAG_SELECTED) || (sa->v4->flag&VERT_FLAG_SELECTED))
+		{
+			if (overflow)
+			{
+				if (dir == 'v')
+				{
+					if (overflow < 0)
+					{
+						if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v2->flag&VERT_FLAG_SELECTED))
+							*split1 = sa;
+						else if ((sa->v3->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
+							*split2 = sa;
+					}
+					else
+					{
+						if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v2->flag&VERT_FLAG_SELECTED))
+							*split2 = sa;
+						else if ((sa->v3->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
+							*split1 = sa;
+					}
+				}
+				else
+				{
+					if (overflow > 0)
+					{
+						if ((sa->v2->flag&VERT_FLAG_SELECTED) && (sa->v3->flag&VERT_FLAG_SELECTED))
+							*split1 = sa;
+						else if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
+							*split2 = sa;
+					}
+					else
+					{
+						if ((sa->v2->flag&VERT_FLAG_SELECTED) && (sa->v3->flag&VERT_FLAG_SELECTED))
+							*split2 = sa;
+						else if ((sa->v1->flag&VERT_FLAG_SELECTED) && (sa->v4->flag&VERT_FLAG_SELECTED))
+							*split1 = sa;
+					}
+				}
+			}
+
 			ED_area_tag_redraw(sa);
+		}
 	}
 
 	WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL); /* redraw everything */
@@ -990,11 +1061,36 @@
 	int delta;
 	
 	delta = RNA_int_get(op->ptr, "delta");
-	area_move_apply_do(C, md->origval, delta, md->dir, md->bigger, md->smaller);
+	area_move_apply_do(C, md->origval, delta, md->dir, md->bigger, md->smaller, &md->split1, &md->split2);
 }
 
 static void area_move_exit(bContext *C, wmOperator *op)
 {
+	bScreen *sc = CTX_wm_screen(C);
+	sAreaMoveData *md = op->customdata;
+	ScrVert *sv;
+
+	for (sv = sc->vertbase.first; sv; sv = sv->next)
+		sv->flag &= ~VERT_FLAG_OFFSET;
+
+	if (md->split1 && md->split2)
+	{
+		if (screen_area_join(C, CTX_wm_screen(C), md->split1, md->split2))
+		{
+			if (CTX_wm_area(C) == md->split2) {
+				CTX_wm_area_set(C, NULL);
+				CTX_wm_region_set(C, NULL);
+			}
+		}
+		else
+			ED_area_tag_redraw(md->split2);
+
+		WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL);
+		ED_area_tag_redraw(md->split1);
+		md->split1 = NULL;
+		md->split2 = NULL;
+	}
+
 	if (op->customdata)
 		MEM_freeN(op->customdata);
 	op->customdata = NULL;
@@ -1032,7 +1128,6 @@
 
 static int area_move_cancel(bContext *C, wmOperator *op)
 {
-	
 	RNA_int_set(op->ptr, "delta", 0);
 	area_move_apply(C, op);
 	area_move_exit(C, op);
@@ -1150,11 +1245,11 @@
 	int delta;              /* delta move edge */
 	int origmin, origsize;  /* to calculate fac, for property storage */
 	int previewmode;        /* draw previewline, then split */
+	int rejoin;
 
 	ScrEdge *nedge;         /* new edge */
 	ScrArea *sarea;         /* start area */
 	ScrArea *narea;         /* new area */
-	
 } sAreaSplitData;
 
 /* generic init, menu case, doesn't need active area */
@@ -1258,10 +1353,10 @@
 		
 		/* select newly created edge, prepare for moving edge */
 		for (sv = sc->vertbase.first; sv; sv = sv->next)
-			sv->flag = 0;
+			sv->flag &= ~(VERT_FLAG_SELECTED|VERT_FLAG_OFFSET);
 		
-		sd->nedge->v1->flag = 1;
-		sd->nedge->v2->flag = 1;
+		sd->nedge->v1->flag |= VERT_FLAG_SELECTED;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list