[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17763] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Tue Dec 9 16:59:46 CET 2008


Revision: 17763
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17763
Author:   ton
Date:     2008-12-09 16:59:43 +0100 (Tue, 09 Dec 2008)

Log Message:
-----------
2.5

Area Manager: revised how an area subdivision gets managed. Originally
the 'spacedata' would store regiondata too, but this already became
impractical (like having view2d data in region is useful). So I left
that part how it is. See new diagram:

http://wiki.blender.org/index.php/BlenderDev/Blender2.5/AreaManager

This means that regions in an Area define location/size or constraints
for how they get arranged. The "RegionType" which is linked to this 
defines its functionality. 

For fun, test, and code validation: two temporary hotkeys added.
SKEY: splits current region horizontally
SHIFT+S: splits vertically

Note - in outliner - that "context" sticks to the Area as whole, the region
here only defines view. That's the purpose. :) For two outliners with different
context you open 2 areas.
Also note that dragging screen-edges shows the region-alignment type (split
with percentage).

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
    branches/blender2.5/blender/source/blender/editors/interface/interface_ops.c
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/screen/spacetypes.c
    branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c
    branches/blender2.5/blender/source/blender/editors/space_time/space_time.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-09 14:30:05 UTC (rev 17762)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-09 15:59:43 UTC (rev 17763)
@@ -46,6 +46,7 @@
 void	ED_region_do_refresh(struct bContext *C, ARegion *ar);
 void	ED_region_exit(struct bContext *C, ARegion *ar);
 void	ED_region_pixelspace(const struct bContext *C, ARegion *ar);
+ARegion *ED_region_copy(ARegion *ar);
 
 /* spaces */
 void	ED_spacetypes_init(void);

Modified: branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2008-12-09 14:30:05 UTC (rev 17762)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2008-12-09 15:59:43 UTC (rev 17763)
@@ -341,7 +341,7 @@
 void uiTestRegion(const struct bContext *C); /* XXX 2.50 temporary test */
 
 void UI_keymap(struct wmWindowManager *wm);
-
+void UI_operatortypes(void);
 void UI_init(void);
 void UI_init_userdef(void);
 void UI_exit(void);

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_ops.c	2008-12-09 14:30:05 UTC (rev 17762)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_ops.c	2008-12-09 15:59:43 UTC (rev 17763)
@@ -3503,7 +3503,7 @@
 
 /* ************************** registration **********************************/
 
-void ui_operatortypes(void)
+void UI_operatortypes(void)
 {
 	WM_operatortype_append(ED_UI_OT_button_activate);
 	WM_operatortype_append(ED_UI_OT_menu_block_handle);

Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-12-09 14:30:05 UTC (rev 17762)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-12-09 15:59:43 UTC (rev 17763)
@@ -166,9 +166,8 @@
 		fac= BLI_frand();
 		glColor3f(fac, fac, fac);
 		glRecti(20,  2,  30,  12);
-		
-		region_draw_emboss(ar);
 	}
+	region_draw_emboss(ar);
 	
 	/* XXX test: add convention to end regions always in pixel space, for drawing of borders/gestures etc */
 	ED_region_pixelspace(C, ar);
@@ -193,7 +192,7 @@
 
 /* *************************************************************** */
 
-
+/* dir is direction to check, not the splitting edge direction! */
 static int rct_fits(rcti *rect, char dir, int size)
 {
 	if(dir=='h') {
@@ -209,8 +208,10 @@
 	if(ar==NULL)
 		return;
 	
-	/* clear state flag first */
+	/* clear state flags first */
 	ar->flag &= ~RGN_FLAG_TOO_SMALL;
+	if(ar->next==NULL)
+		ar->alignment= RGN_ALIGN_NONE;
 	
 	if(ar->size<ar->minsize)
 		ar->size= ar->minsize;
@@ -220,7 +221,7 @@
 	/* XXX floating area region, not handled yet here */
 	else if(ar->alignment == RGN_ALIGN_FLOAT);
 	/* remainder is too small for any usage */
-	else if( rct_fits(remainder, 'v', 1)==0 || rct_fits(remainder, 'h', 1) < 0 ) {
+	else if( rct_fits(remainder, 'v', 1)<0 || rct_fits(remainder, 'h', 1) < 0 ) {
 		ar->flag |= RGN_FLAG_TOO_SMALL;
 	}
 	else if(ar->alignment==RGN_ALIGN_NONE) {
@@ -279,12 +280,22 @@
 		ar->winrct= *remainder;
 		
 		if(ar->alignment==RGN_ALIGN_HSPLIT) {
-			ar->winrct.xmax= (remainder->xmin+remainder->xmax)/2;
-			remainder->xmin= ar->winrct.xmax+1;
+			if( rct_fits(remainder, 'h', ar->size) > 4) {
+				ar->winrct.xmax= (remainder->xmin+remainder->xmax)/2;
+				remainder->xmin= ar->winrct.xmax+1;
+			}
+			else {
+				BLI_init_rcti(remainder, 0, 0, 0, 0);
+			}
 		}
 		else {
-			ar->winrct.ymax= (remainder->ymin+remainder->ymax)/2;
-			remainder->ymin= ar->winrct.ymax+1;
+			if( rct_fits(remainder, 'v', ar->size) > 4) {
+				ar->winrct.ymax= (remainder->ymin+remainder->ymax)/2;
+				remainder->ymin= ar->winrct.ymax+1;
+			}
+			else {
+				BLI_init_rcti(remainder, 0, 0, 0, 0);
+			}
 		}
 	}
 	
@@ -387,9 +398,24 @@
 	area_azone_initialize(sa);
 }
 
+
+ARegion *ED_region_copy(ARegion *ar)
+{
+	ARegion *newar= MEM_dupallocN(ar);
+	
+	newar->handlers.first= newar->handlers.last= NULL;
+	newar->uiblocks.first= newar->uiblocks.last= NULL;
+	newar->swinid= 0;
+	
+	/* XXX regiondata */
+	if(ar->regiondata)
+		newar->regiondata= MEM_dupallocN(ar->regiondata);
+	
+	return newar;
+}
+
 /* sa2 to sa1, we swap spaces for fullscreen to keep all allocated data */
 /* area vertices were set */
-
 void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space)
 {
 	Panel *pa1, *pa2, *patab;
@@ -429,11 +455,10 @@
 	
 	/* regions */
 	BLI_freelistN(&sa1->regionbase);
-	BLI_duplicatelist(&sa1->regionbase, &sa2->regionbase);
-	for(ar= sa1->regionbase.first; ar; ar= ar->next) {
-		ar->handlers.first= ar->handlers.last= NULL;
-		ar->uiblocks.first= ar->uiblocks.last= NULL;
-		ar->swinid= 0;
+	
+	for(ar= sa2->regionbase.first; ar; ar= ar->next) {
+		ARegion *newar= ED_region_copy(ar);
+		BLI_addtail(&sa1->regionbase, newar);
 	}
 		
 #ifndef DISABLE_PYTHON

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-09 14:30:05 UTC (rev 17762)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-09 15:59:43 UTC (rev 17763)
@@ -911,13 +911,14 @@
 	return OPERATOR_RUNNING_MODAL;
 }
 
+static EnumPropertyItem prop_direction_items[] = {
+	{'h', "HORIZONTAL", "Horizontal", ""},
+	{'v', "VERTICAL", "Vertical", ""},
+	{0, NULL, NULL, NULL}};
+
 void ED_SCR_OT_area_split(wmOperatorType *ot)
 {
 	PropertyRNA *prop;
-    static EnumPropertyItem prop_direction_items[] = {
-		{'h', "HORIZONTAL", "Horizontal", ""},
-		{'v', "VERTICAL", "Vertical", ""},
-		{0, NULL, NULL, NULL}};
 
 	ot->name = "Split area";
 	ot->idname = "ED_SCR_OT_area_split";
@@ -1245,6 +1246,61 @@
 	
 }
 
+/* ************** region split operator ***************************** */
+
+/* insert a region in the area region list */
+static int region_split_exec(bContext *C, wmOperator *op)
+{
+	ARegion *newar= ED_region_copy(C->region);
+	int dir= RNA_enum_get(op->ptr, "dir");
+	
+	BLI_insertlinkafter(&C->area->regionbase, C->region, newar);
+	
+	newar->alignment= C->region->alignment;
+	
+	if(dir=='h')
+		C->region->alignment= RGN_ALIGN_HSPLIT;
+	else
+		C->region->alignment= RGN_ALIGN_VSPLIT;
+	
+	WM_event_add_notifier(C, WM_NOTE_SCREEN_CHANGED, 0, NULL);
+	
+	return OPERATOR_FINISHED;
+}
+
+static int region_split_invoke(bContext *C, wmOperator *op, wmEvent *evt)
+{
+	
+	/* can't do menu, so event is checked manually */
+	if(evt->shift)
+		RNA_enum_set(op->ptr, "dir", 'v');
+	else
+		RNA_enum_set(op->ptr, "dir", 'h');
+
+	return region_split_exec(C, op);
+}
+
+
+void ED_SCR_OT_region_split(wmOperatorType *ot)
+{
+	PropertyRNA *prop;
+	
+	/* identifiers */
+	ot->name= "Split Region";
+	ot->idname= "ED_SCR_OT_region_split";
+	
+	/* api callbacks */
+	ot->exec= region_split_exec;
+	ot->invoke= region_split_invoke;
+	
+	ot->poll= ED_operator_areaactive;
+	
+	prop= RNA_def_property(ot->srna, "dir", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_items(prop, prop_direction_items);
+	RNA_def_property_enum_default(prop, 'h');
+}
+
+
 /* ************** border select operator (template) ***************************** */
 
 /* operator state vars used: (added by default WM callbacks)   
@@ -1318,7 +1374,8 @@
 	WM_operatortype_append(ED_SCR_OT_area_split);
 	WM_operatortype_append(ED_SCR_OT_area_join);
 	WM_operatortype_append(ED_SCR_OT_area_rip);
-	
+	WM_operatortype_append(ED_SCR_OT_region_split);
+		
 	/* tools shared by more space types */
 	ED_marker_operatortypes();	
 	
@@ -1337,6 +1394,9 @@
 	WM_keymap_verify_item(keymap, "ED_SCR_OT_area_join", EVT_ACTIONZONE, 0, 0, 0);	/* action tria */ 
 	WM_keymap_verify_item(keymap, "ED_SCR_OT_area_rip", RKEY, KM_PRESS, KM_ALT, 0);
 
+	 /* tests */
+	WM_keymap_add_item(keymap, "ED_SCR_OT_region_split", SKEY, KM_PRESS, 0, 0);
+	WM_keymap_add_item(keymap, "ED_SCR_OT_region_split", SKEY, KM_PRESS, KM_SHIFT, 0);
 	WM_keymap_verify_item(keymap, "ED_SCR_OT_repeat_last", F4KEY, KM_PRESS, 0, 0);
 }
 

Modified: branches/blender2.5/blender/source/blender/editors/screen/spacetypes.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/spacetypes.c	2008-12-09 14:30:05 UTC (rev 17762)
+++ branches/blender2.5/blender/source/blender/editors/screen/spacetypes.c	2008-12-09 15:59:43 UTC (rev 17763)
@@ -71,7 +71,7 @@
 	
 	/* register operator types for screen and all spaces */
 	ED_operatortypes_screen();
-	ui_operatortypes();
+	UI_operatortypes();
 	ui_view2d_operatortypes();
 	
 	spacetypes = BKE_spacetypes_list();

Modified: branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c	2008-12-09 14:30:05 UTC (rev 17762)
+++ branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c	2008-12-09 15:59:43 UTC (rev 17763)
@@ -496,16 +496,10 @@
 {
 	ARegion *ar;
 	
-	/* link area to SpaceXXX struct */
-	sa->type= BKE_spacetype_from_id(SPACE_OOPS);
-
-	/* add handlers to area */
-	/* define how many regions, the order and types */
-	
 	/* add types to regions, check handlers */
 	for(ar= sa->regionbase.first; ar; ar= ar->next) {
 		
-		ar->type= ED_regiontype_from_id(sa->type, ar->regiontype); /* XXX fix type and id */
+		ar->type= ED_regiontype_from_id(sa->type, ar->regiontype); 
 
 		if(ar->handlers.first==NULL) {
 			ListBase *keymap;

Modified: branches/blender2.5/blender/source/blender/editors/space_time/space_time.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_time/space_time.c	2008-12-09 14:30:05 UTC (rev 17762)
+++ branches/blender2.5/blender/source/blender/editors/space_time/space_time.c	2008-12-09 15:59:43 UTC (rev 17763)
@@ -230,22 +230,16 @@
 }
 
 
-/* spacetype; init callback */
+/* spacetype; init callback in ED_area_initialize() */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list