[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