[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23598] trunk/blender/source/blender: Fix #19311: adding/opening datablocks did not always make the right

Brecht Van Lommel brecht at blender.org
Fri Oct 2 01:32:58 CEST 2009


Revision: 23598
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23598
Author:   blendix
Date:     2009-10-02 01:32:57 +0200 (Fri, 02 Oct 2009)

Log Message:
-----------
Fix #19311: adding/opening datablocks did not always make the right
one active. Now there's a function to get the pointer + property from
the UI, just like for the animation operators.

Also two fixes for fileselect events, regions are now preserved so that
context is restored to the old region, and the cancel callback is called
when the operator is cancelled.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/world.c
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/physics/particle_boids.c
    trunk/blender/source/blender/editors/render/render_shading.c
    trunk/blender/source/blender/editors/screen/area.c
    trunk/blender/source/blender/editors/space_action/action_edit.c
    trunk/blender/source/blender/editors/space_image/image_ops.c
    trunk/blender/source/blender/editors/space_text/text_ops.c
    trunk/blender/source/blender/makesrna/RNA_types.h
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: trunk/blender/source/blender/blenkernel/intern/world.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/world.c	2009-10-01 22:35:07 UTC (rev 23597)
+++ trunk/blender/source/blender/blenkernel/intern/world.c	2009-10-01 23:32:57 UTC (rev 23598)
@@ -86,15 +86,20 @@
 
 	wrld= alloc_libblock(&G.main->world, ID_WO, name);
 	
-	wrld->horb= 0.6f;
-	wrld->skytype= WO_SKYBLEND;
+	wrld->horr= 0.25f;
+	wrld->horg= 0.25f;
+	wrld->horb= 0.25f;
+	wrld->zenr= 0.1f;
+	wrld->zeng= 0.1f;
+	wrld->zenb= 0.1f;
+	wrld->skytype= 0;
 	wrld->stardist= 15.0f;
 	wrld->starsize= 2.0f;
 	
 	wrld->exp= 0.0f;
 	wrld->exposure=wrld->range= 1.0f;
 
-	wrld->aodist= 5.0f;
+	wrld->aodist= 10.0f;
 	wrld->aosamp= 5;
 	wrld->aoenergy= 1.0f;
 	wrld->aobias= 0.05f;

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h	2009-10-01 22:35:07 UTC (rev 23597)
+++ trunk/blender/source/blender/editors/include/UI_interface.h	2009-10-01 23:32:57 UTC (rev 23598)
@@ -670,6 +670,7 @@
 /* Helpers for Operators */
 void uiAnimContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index);
 void uiFileBrowseContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop);
+void uiIDContextProperty(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop);
 
 /* Styled text draw */
 void uiStyleFontSet(struct uiFontStyle *fs);

Modified: trunk/blender/source/blender/editors/interface/interface_templates.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_templates.c	2009-10-01 22:35:07 UTC (rev 23597)
+++ trunk/blender/source/blender/editors/interface/interface_templates.c	2009-10-01 23:32:57 UTC (rev 23598)
@@ -153,6 +153,36 @@
 
 /************************ ID Template ***************************/
 
+/* for new/open operators */
+void uiIDContextProperty(bContext *C, PointerRNA *ptr, PropertyRNA **prop)
+{
+	TemplateID *template;
+	ARegion *ar= CTX_wm_region(C);
+	uiBlock *block;
+	uiBut *but;
+
+	memset(ptr, 0, sizeof(*ptr));
+	*prop= NULL;
+
+	if(!ar)
+		return;
+
+	for(block=ar->uiblocks.first; block; block=block->next) {
+		for(but=block->buttons.first; but; but= but->next) {
+			/* find the button before the active one */
+			if((but->flag & (UI_BUT_LAST_ACTIVE|UI_ACTIVE))) {
+				if(but->func_argN) {
+					template= but->func_argN;
+					*ptr= template->ptr;
+					*prop= template->prop;
+					return;
+				}
+			}
+		}
+	}
+}
+
+
 static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
 {
 	TemplateID *template= (TemplateID*)arg_litem;
@@ -167,11 +197,7 @@
 			break;
 		case UI_ID_OPEN:
 		case UI_ID_ADD_NEW:
-			if(template->idlb->last) {
-				RNA_id_pointer_create(template->idlb->last, &idptr);
-				RNA_property_pointer_set(&template->ptr, template->prop, idptr);
-				RNA_property_update(C, &template->ptr, template->prop);
-			}
+			/* these call uiIDContextPropertySet */
 			break;
 		case UI_ID_DELETE:
 			memset(&idptr, 0, sizeof(idptr));
@@ -291,7 +317,7 @@
 		int w= id?UI_UNIT_X: (flag & UI_ID_OPEN)? UI_UNIT_X*3: UI_UNIT_X*6;
 		
 		if(newop) {
-			but= uiDefIconTextButO(block, BUT, newop, WM_OP_EXEC_REGION_WIN, ICON_ZOOMIN, (id)? "": "New", 0, 0, w, UI_UNIT_Y, NULL);
+			but= uiDefIconTextButO(block, BUT, newop, WM_OP_EXEC_DEFAULT, ICON_ZOOMIN, (id)? "": "New", 0, 0, w, UI_UNIT_Y, NULL);
 			uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ADD_NEW));
 		}
 		else {
@@ -307,7 +333,7 @@
 		int w= id?UI_UNIT_X: (flag & UI_ID_ADD_NEW)? UI_UNIT_X*3: UI_UNIT_X*6;
 		
 		if(openop) {
-			but= uiDefIconTextButO(block, BUT, openop, WM_OP_INVOKE_REGION_WIN, ICON_FILESEL, (id)? "": "Open", 0, 0, w, UI_UNIT_Y, NULL);
+			but= uiDefIconTextButO(block, BUT, openop, WM_OP_INVOKE_DEFAULT, ICON_FILESEL, (id)? "": "Open", 0, 0, w, UI_UNIT_Y, NULL);
 			uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_OPEN));
 		}
 		else {

Modified: trunk/blender/source/blender/editors/physics/particle_boids.c
===================================================================
--- trunk/blender/source/blender/editors/physics/particle_boids.c	2009-10-01 22:35:07 UTC (rev 23597)
+++ trunk/blender/source/blender/editors/physics/particle_boids.c	2009-10-01 23:32:57 UTC (rev 23598)
@@ -52,7 +52,6 @@
 /************************ add/del boid rule operators *********************/
 static int rule_add_exec(bContext *C, wmOperator *op)
 {
-	Scene *scene = CTX_data_scene(C);
 	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
 	ParticleSystem *psys= ptr.data;
 	Object *ob= ptr.id.data;
@@ -152,7 +151,6 @@
 /************************ move up/down boid rule operators *********************/
 static int rule_move_up_exec(bContext *C, wmOperator *op)
 {
-	Scene *scene= CTX_data_scene(C);
 	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
 	ParticleSystem *psys= ptr.data;
 	Object *ob = ptr.id.data;
@@ -191,7 +189,6 @@
 
 static int rule_move_down_exec(bContext *C, wmOperator *op)
 {
-	Scene *scene= CTX_data_scene(C);
 	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
 	ParticleSystem *psys= ptr.data;
 	Object *ob = ptr.id.data;
@@ -363,7 +360,6 @@
 
 static int state_move_down_exec(bContext *C, wmOperator *op)
 {
-	Scene *scene= CTX_data_scene(C);
 	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
 	ParticleSystem *psys= ptr.data;
 	BoidSettings *boids;

Modified: trunk/blender/source/blender/editors/render/render_shading.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_shading.c	2009-10-01 22:35:07 UTC (rev 23597)
+++ trunk/blender/source/blender/editors/render/render_shading.c	2009-10-01 23:32:57 UTC (rev 23598)
@@ -436,9 +436,8 @@
 static int new_material_exec(bContext *C, wmOperator *op)
 {
 	Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
-	Object *ob;
-	PointerRNA ptr;
-	int index;
+	PointerRNA ptr, idptr;
+	PropertyRNA *prop;
 
 	/* add or copy material */
 	if(ma)
@@ -446,18 +445,17 @@
 	else
 		ma= add_material("Material");
 
-	ma->id.us--; /* compensating for us++ in assign_material */
+	/* hook into UI */
+	uiIDContextProperty(C, &ptr, &prop);
 
-	/* attempt to assign to material slot */
-	ptr= CTX_data_pointer_get_type(C, "material_slot", &RNA_MaterialSlot);
+	if(prop) {
+		/* when creating new ID blocks, use is already 1, but RNA
+		 * pointer se also increases user, so this compensates it */
+		ma->id.us--;
 
-	if(ptr.data) {
-		ob= ptr.id.data;
-		index= (Material**)ptr.data - ob->mat;
-
-		assign_material(ob, ma, index+1);
-
-		WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+		RNA_id_pointer_create(&ma->id, &idptr);
+		RNA_property_pointer_set(&ptr, prop, idptr);
+		RNA_property_update(C, &ptr, prop);
 	}
 
 	WM_event_add_notifier(C, NC_MATERIAL|NA_ADDED, ma);
@@ -484,9 +482,8 @@
 static int new_texture_exec(bContext *C, wmOperator *op)
 {
 	Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
-	ID *id;
-	MTex *mtex;
-	PointerRNA ptr;
+	PointerRNA ptr, idptr;
+	PropertyRNA *prop;
 
 	/* add or copy texture */
 	if(tex)
@@ -494,23 +491,17 @@
 	else
 		tex= add_texture("Texture");
 
-	id_us_min(&tex->id);
+	/* hook into UI */
+	uiIDContextProperty(C, &ptr, &prop);
 
-	/* attempt to assign to texture slot */
-	ptr= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot);
+	if(prop) {
+		/* when creating new ID blocks, use is already 1, but RNA
+		 * pointer se also increases user, so this compensates it */
+		tex->id.us--;
 
-	if(ptr.data) {
-		id= ptr.id.data;
-		mtex= ptr.data;
-
-		if(mtex) {
-			if(mtex->tex)
-				id_us_min(&mtex->tex->id);
-			mtex->tex= tex;
-			id_us_plus(&tex->id);
-		}
-
-		/* XXX nodes, notifier .. */
+		RNA_id_pointer_create(&tex->id, &idptr);
+		RNA_property_pointer_set(&ptr, prop, idptr);
+		RNA_property_update(C, &ptr, prop);
 	}
 
 	WM_event_add_notifier(C, NC_TEXTURE|NA_ADDED, tex);
@@ -536,8 +527,9 @@
 
 static int new_world_exec(bContext *C, wmOperator *op)
 {
-	Scene *scene= CTX_data_scene(C);
 	World *wo= CTX_data_pointer_get_type(C, "world", &RNA_World).data;
+	PointerRNA ptr, idptr;
+	PropertyRNA *prop;
 
 	/* add or copy world */
 	if(wo)
@@ -545,11 +537,19 @@
 	else
 		wo= add_world("World");
 
-	/* assign to scene */
-	if(scene->world)
-		id_us_min(&scene->world->id);
-	scene->world= wo;
+	/* hook into UI */
+	uiIDContextProperty(C, &ptr, &prop);
 
+	if(prop) {
+		/* when creating new ID blocks, use is already 1, but RNA
+		 * pointer se also increases user, so this compensates it */
+		wo->id.us--;
+
+		RNA_id_pointer_create(&wo->id, &idptr);
+		RNA_property_pointer_set(&ptr, prop, idptr);
+		RNA_property_update(C, &ptr, prop);
+	}
+
 	WM_event_add_notifier(C, NC_WORLD|NA_ADDED, wo);
 	
 	return OPERATOR_FINISHED;

Modified: trunk/blender/source/blender/editors/screen/area.c
===================================================================
--- trunk/blender/source/blender/editors/screen/area.c	2009-10-01 22:35:07 UTC (rev 23597)
+++ trunk/blender/source/blender/editors/screen/area.c	2009-10-01 23:32:57 UTC (rev 23598)
@@ -958,17 +958,22 @@
 	/* Note; SPACE_EMPTY is possible on new screens */
 	
 	/* regions */
-	if(swap_space<2) {
-		st= BKE_spacetype_from_id(sa1->spacetype);
-		for(ar= sa1->regionbase.first; ar; ar= ar->next)
-			BKE_area_region_free(st, ar);
-		BLI_freelistN(&sa1->regionbase);
+	if(swap_space == 1) {
+		SWAP(ListBase, sa1->regionbase, sa2->regionbase);
 	}
-	
-	st= BKE_spacetype_from_id(sa2->spacetype);
-	for(ar= sa2->regionbase.first; ar; ar= ar->next) {
-		ARegion *newar= BKE_area_region_copy(st, ar);
-		BLI_addtail(&sa1->regionbase, newar);
+	else {
+		if(swap_space<2) {
+			st= BKE_spacetype_from_id(sa1->spacetype);
+			for(ar= sa1->regionbase.first; ar; ar= ar->next)
+				BKE_area_region_free(st, ar);
+			BLI_freelistN(&sa1->regionbase);
+		}
+		
+		st= BKE_spacetype_from_id(sa2->spacetype);
+		for(ar= sa2->regionbase.first; ar; ar= ar->next) {
+			ARegion *newar= BKE_area_region_copy(st, ar);
+			BLI_addtail(&sa1->regionbase, newar);
+		}
 	}
 }
 


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list