[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35300] trunk/blender/source/blender: From the OFTL (old fart todo list)
Ton Roosendaal
ton at blender.org
Wed Mar 2 15:09:54 CET 2011
Revision: 35300
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35300
Author: ton
Date: 2011-03-02 14:09:54 +0000 (Wed, 02 Mar 2011)
Log Message:
-----------
>From the OFTL (old fart todo list)
Right Mouse on area edges has menu to Split or Join. Works like 2.4.
Code needed cleanup and upgrade; operators were hardcoded tied to using
the area corner widgets only. In theory this is getting py ready even,
but that might need some additional testing. :)
Modified Paths:
--------------
trunk/blender/source/blender/editors/screen/screen_edit.c
trunk/blender/source/blender/editors/screen/screen_ops.c
trunk/blender/source/blender/makesdna/DNA_screen_types.h
Modified: trunk/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_edit.c 2011-03-02 06:56:21 UTC (rev 35299)
+++ trunk/blender/source/blender/editors/screen/screen_edit.c 2011-03-02 14:09:54 UTC (rev 35300)
@@ -986,8 +986,9 @@
void ED_screen_draw(wmWindow *win)
{
ScrArea *sa;
- ScrArea *sa1=NULL;
- ScrArea *sa2=NULL;
+ ScrArea *sa1= NULL;
+ ScrArea *sa2= NULL;
+ ScrArea *sa3= NULL;
int dir = -1;
int dira = -1;
@@ -996,6 +997,7 @@
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
if (sa->flag & AREA_FLAG_DRAWJOINFROM) sa1 = sa;
if (sa->flag & AREA_FLAG_DRAWJOINTO) sa2 = sa;
+ if (sa->flag & (AREA_FLAG_DRAWSPLIT_H|AREA_FLAG_DRAWSPLIT_V)) sa3 = sa;
drawscredge_area(sa, win->sizex, win->sizey, 0);
}
for(sa= win->screen->areabase.first; sa; sa= sa->next)
@@ -1028,7 +1030,25 @@
scrarea_draw_shape_light(sa1, dira);
}
-// if(G.f & G_DEBUG) printf("draw screen\n");
+ /* splitpoint */
+ if(sa3) {
+ glEnable(GL_BLEND);
+ glColor4ub(255, 255, 255, 100);
+
+ if(sa3->flag & AREA_FLAG_DRAWSPLIT_H) {
+ sdrawline(sa3->totrct.xmin, win->eventstate->y, sa3->totrct.xmax, win->eventstate->y);
+ glColor4ub(0, 0, 0, 100);
+ sdrawline(sa3->totrct.xmin, win->eventstate->y+1, sa3->totrct.xmax, win->eventstate->y+1);
+ }
+ else {
+ sdrawline(win->eventstate->x, sa3->totrct.ymin, win->eventstate->x, sa3->totrct.ymax);
+ glColor4ub(0, 0, 0, 100);
+ sdrawline(win->eventstate->x+1, sa3->totrct.ymin, win->eventstate->x+1, sa3->totrct.ymax);
+ }
+
+ glDisable(GL_BLEND);
+ }
+
win->screen->do_draw= 0;
}
Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c 2011-03-02 06:56:21 UTC (rev 35299)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c 2011-03-02 14:09:54 UTC (rev 35300)
@@ -1094,21 +1094,44 @@
#define SPLIT_STARTED 1
#define SPLIT_PROGRESS 2
-typedef struct sAreaSplitData
- {
- int x, y; /* last used mouse position */
-
- int origval; /* for move areas */
- int bigger, smaller; /* constraints for moving new edge */
- int delta; /* delta move edge */
- int origmin, origsize; /* to calculate fac, for property storage */
-
- ScrEdge *nedge; /* new edge */
- ScrArea *sarea; /* start area */
- ScrArea *narea; /* new area */
- } sAreaSplitData;
+typedef struct sAreaSplitData {
+ int x, y; /* last used mouse position */
+
+ int origval; /* for move areas */
+ int bigger, smaller; /* constraints for moving new edge */
+ int delta; /* delta move edge */
+ int origmin, origsize; /* to calculate fac, for property storage */
+ int previewmode; /* draw previewline, then split */
+
+ ScrEdge *nedge; /* new edge */
+ ScrArea *sarea; /* start area */
+ ScrArea *narea; /* new area */
+
+} sAreaSplitData;
-/* generic init, no UI stuff here */
+/* generic init, menu case, doesn't need active area */
+static int area_split_menu_init(bContext *C, wmOperator *op)
+{
+ sAreaSplitData *sd;
+
+ /* custom data */
+ sd= (sAreaSplitData*)MEM_callocN(sizeof (sAreaSplitData), "op_area_split");
+ op->customdata= sd;
+
+ sd->sarea= CTX_wm_area(C);
+
+ if(sd->sarea) {
+ int dir= RNA_enum_get(op->ptr, "direction");
+
+ if(dir=='h')
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_H;
+ else
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_V;
+ }
+ return 1;
+}
+
+/* generic init, no UI stuff here, assumes active area */
static int area_split_init(bContext *C, wmOperator *op)
{
ScrArea *sa= CTX_wm_area(C);
@@ -1212,6 +1235,9 @@
if(sd->sarea) ED_area_tag_redraw(sd->sarea);
if(sd->narea) ED_area_tag_redraw(sd->narea);
+ if(sd->sarea)
+ sd->sarea->flag &= ~(AREA_FLAG_DRAWSPLIT_H|AREA_FLAG_DRAWSPLIT_V);
+
MEM_freeN(op->customdata);
op->customdata = NULL;
}
@@ -1228,18 +1254,15 @@
static int area_split_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
sAreaSplitData *sd;
+ int dir;
if(event->type==EVT_ACTIONZONE_AREA) {
sActionzoneData *sad= event->customdata;
- int dir;
if(sad->modifier>0) {
return OPERATOR_PASS_THROUGH;
}
- /* no full window splitting allowed */
- if(CTX_wm_area(C)->full)
- return OPERATOR_PASS_THROUGH;
/* verify *sad itself */
if(sad==NULL || sad->sa1==NULL || sad->az==NULL)
@@ -1264,11 +1287,47 @@
if(!area_split_init(C, op))
return OPERATOR_PASS_THROUGH;
- sd= (sAreaSplitData *)op->customdata;
+ }
+ else {
+ ScrEdge *actedge;
+ int x, y;
- sd->x= event->x;
- sd->y= event->y;
+ /* no full window splitting allowed */
+ if(CTX_wm_area(C) && CTX_wm_area(C)->full)
+ return OPERATOR_CANCELLED;
+ /* retrieve initial mouse coord, so we can find the active edge */
+ if(RNA_property_is_set(op->ptr, "mouse_x"))
+ x= RNA_int_get(op->ptr, "mouse_x");
+ else
+ x= event->x;
+
+ if(RNA_property_is_set(op->ptr, "mouse_y"))
+ y= RNA_int_get(op->ptr, "mouse_y");
+ else
+ y= event->x;
+
+ actedge= screen_find_active_scredge(CTX_wm_screen(C), x, y);
+ if(actedge==NULL)
+ return OPERATOR_CANCELLED;
+
+ dir= scredge_is_horizontal(actedge)?'v':'h';
+
+ RNA_enum_set(op->ptr, "direction", dir);
+
+ /* special case, adds customdata, sets defaults */
+ if(!area_split_menu_init(C, op))
+ return OPERATOR_CANCELLED;
+
+ }
+
+ sd= (sAreaSplitData *)op->customdata;
+
+ sd->x= event->x;
+ sd->y= event->y;
+
+ if(event->type==EVT_ACTIONZONE_AREA) {
+
/* do the split */
if(area_split_apply(C, op)) {
area_move_set_limits(CTX_wm_screen(C), dir, &sd->bigger, &sd->smaller);
@@ -1278,11 +1337,14 @@
return OPERATOR_RUNNING_MODAL;
}
-
}
else {
- /* nonmodal for now */
- return op->type->exec(C, op);
+ sd->previewmode= 1;
+ /* add temp handler for edge move or cancel */
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+
}
return OPERATOR_PASS_THROUGH;
@@ -1306,12 +1368,16 @@
{
sAreaSplitData *sd= (sAreaSplitData *)op->customdata;
- if (screen_area_join(C, CTX_wm_screen(C), sd->sarea, sd->narea)) {
- if (CTX_wm_area(C) == sd->narea) {
- CTX_wm_area_set(C, NULL);
- CTX_wm_region_set(C, NULL);
+ if(sd->previewmode) {
+ }
+ else {
+ if (screen_area_join(C, CTX_wm_screen(C), sd->sarea, sd->narea)) {
+ if (CTX_wm_area(C) == sd->narea) {
+ CTX_wm_area_set(C, NULL);
+ CTX_wm_region_set(C, NULL);
+ }
+ sd->narea = NULL;
}
- sd->narea = NULL;
}
area_split_exit(C, op);
@@ -1330,17 +1396,47 @@
dir= RNA_enum_get(op->ptr, "direction");
sd->delta= (dir == 'v')? event->x - sd->origval: event->y - sd->origval;
- area_move_apply_do(C, sd->origval, sd->delta, dir, sd->bigger, sd->smaller);
+ if(sd->previewmode==0)
+ area_move_apply_do(C, sd->origval, sd->delta, dir, sd->bigger, sd->smaller);
+ else {
+ if(sd->sarea) {
+ sd->sarea->flag &= ~(AREA_FLAG_DRAWSPLIT_H|AREA_FLAG_DRAWSPLIT_V);
+ ED_area_tag_redraw(sd->sarea);
+ }
+ sd->sarea= screen_areahascursor(CTX_wm_screen(C), event->x, event->y); /* area context not set */
+
+ if(sd->sarea) {
+ ED_area_tag_redraw(sd->sarea);
+ if (dir=='v') {
+ sd->origsize= sd->sarea->winx;
+ sd->origmin= sd->sarea->totrct.xmin;
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_V;
+ }
+ else {
+ sd->origsize= sd->sarea->winy;
+ sd->origmin= sd->sarea->totrct.ymin;
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_H;
+ }
+ }
+ }
fac= (dir == 'v') ? event->x-sd->origmin : event->y-sd->origmin;
RNA_float_set(op->ptr, "factor", fac / (float)sd->origsize);
+
break;
case LEFTMOUSE:
- if(event->val==KM_RELEASE) { /* mouse up */
+ if(sd->previewmode) {
+ area_split_apply(C, op);
area_split_exit(C, op);
return OPERATOR_FINISHED;
}
+ else {
+ if(event->val==KM_RELEASE) { /* mouse up */
+ area_split_exit(C, op);
+ return OPERATOR_FINISHED;
+ }
+ }
break;
case RIGHTMOUSE: /* cancel operation */
case ESCKEY:
@@ -1365,12 +1461,14 @@
ot->invoke= area_split_invoke;
ot->modal= area_split_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_screenactive;
ot->flag= OPTYPE_BLOCKING;
/* 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);
}
@@ -1866,6 +1964,7 @@
sAreaJoinData* jd= NULL;
int x1, y1;
int x2, y2;
+ int shared= 0;
/* required properties, make negative to get return 0 if not set by caller */
x1= RNA_int_get(op->ptr, "min_x");
@@ -1878,6 +1977,16 @@
if(sa1==NULL || sa2==NULL || sa1==sa2)
return 0;
+ /* do areas share an edge? */
+ if(sa1->v1==sa2->v1 || sa1->v1==sa2->v2 || sa1->v1==sa2->v3 || sa1->v1==sa2->v4) shared++;
+ if(sa1->v2==sa2->v1 || sa1->v2==sa2->v2 || sa1->v2==sa2->v3 || sa1->v2==sa2->v4) shared++;
+ if(sa1->v3==sa2->v1 || sa1->v3==sa2->v2 || sa1->v3==sa2->v3 || sa1->v3==sa2->v4) shared++;
+ if(sa1->v4==sa2->v1 || sa1->v4==sa2->v2 || sa1->v4==sa2->v3 || sa1->v4==sa2->v4) shared++;
+ if(shared!=2) {
+ printf("areas don't share edge\n");
+ return 0;
+ }
+
jd = (sAreaJoinData*)MEM_callocN(sizeof (sAreaJoinData), "op_area_join");
jd->sa1 = sa1;
@@ -1956,17 +2065,16 @@
RNA_int_set(op->ptr, "min_y", sad->y);
RNA_int_set(op->ptr, "max_x", event->x);
RNA_int_set(op->ptr, "max_y", event->y);
-
- if(!area_join_init(C, op))
- return OPERATOR_PASS_THROUGH;
-
- /* add temp handler */
- WM_event_add_modal_handler(C, op);
-
- return OPERATOR_RUNNING_MODAL;
}
- return OPERATOR_PASS_THROUGH;
+
+ if(!area_join_init(C, op))
+ return OPERATOR_PASS_THROUGH;
+
+ /* add temp handler */
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
}
static int area_join_cancel(bContext *C, wmOperator *op)
@@ -2092,7 +2200,7 @@
ot->exec= area_join_exec;
ot->invoke= area_join_invoke;
ot->modal= area_join_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_screenactive;
ot->flag= OPTYPE_BLOCKING;
@@ -2103,7 +2211,59 @@
RNA_def_int(ot->srna, "max_y", -100, INT_MIN, INT_MAX, "Y 2", "", INT_MIN, INT_MAX);
}
+/* ******************************* */
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list