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

Ton Roosendaal ton at blender.org
Mon Feb 16 13:14:07 CET 2009


Revision: 18992
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18992
Author:   ton
Date:     2009-02-16 13:14:04 +0100 (Mon, 16 Feb 2009)

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

Proper integration of File-selecting in WM. The communication
flow was flawed. :) Main problem was that filewindow can change
the screen context entirely, and should not do this directly on
a call inside an operator. Another problem was that the operator
ownership was handed over to SpaceFile, which is asking for 
problems if you want to execute the operator with proper context
later on.

Solution is simple; window handlers already are valid owners of
operators and can manage context, so instead of directly talking
to the 'file space', you give the operator to a new handler this
way:

    WM_event_add_fileselect(C, op);

This handler then listens to events (OPEN, EXEC, CANCEL) sent
by the WM or by the filewindow itself. This way local context
operators (like "open new image in imagewindow") will survive
a full-window fileselector fine, and in future also secondary
windows browsing files.

Two bugfixes included in this commit too:
- Add sequence menus in Sequencer used wrong context.
- When handler executes operators, it sets stored context now
  by first checking if this is still valid.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c
    branches/blender2.5/blender/source/blender/editors/space_file/space_file.c
    branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c
    branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_header.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_event_system.h
    branches/blender2.5/blender/source/blender/windowmanager/wm_event_types.h

Modified: branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-02-16 09:48:38 UTC (rev 18991)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-02-16 12:14:04 UTC (rev 18992)
@@ -457,11 +457,8 @@
 {
 	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
 	
-	if(sfile->op) {
-		WM_operator_free(sfile->op);
-		sfile->op = NULL;
-	}
-	ED_screen_full_prevspace(C);
+	WM_event_fileselect_event(C, sfile->op, EVT_FILESELECT_CANCEL);
+	sfile->op = NULL;
 	
 	return OPERATOR_FINISHED;
 }
@@ -477,34 +474,21 @@
 	ot->poll= ED_operator_file_active;
 }
 
-
+/* sends events now, so things get handled on windowqueue level */
 int file_exec(bContext *C, wmOperator *unused)
 {
 	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
 	char name[FILE_MAX];
 	
-	ED_screen_full_prevspace(C);
-	
 	if(sfile->op) {
 		wmOperator *op= sfile->op;
 		
-		/* if load .blend, all UI pointers after exec are invalid! */
-		/* but, operator can be freed still */
-		
 		sfile->op = NULL;
 		BLI_strncpy(name, sfile->params->dir, sizeof(name));
 		strcat(name, sfile->params->file);
 		RNA_string_set(op->ptr, "filename", name);
 		
-		/* a bit weak, might become arg for ED_fileselect? */
-		if(strncmp(sfile->params->title, "Save", 4)==0) {
-			/* this gives ownership to pupmenu */
-			uiPupMenuSaveOver(C, op, name);
-		}
-		else {
-			op->type->exec(C, op);
-			WM_operator_free(op);
-		}
+		WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC);
 	}
 				
 	return OPERATOR_FINISHED;

Modified: branches/blender2.5/blender/source/blender/editors/space_file/space_file.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/space_file.c	2009-02-16 09:48:38 UTC (rev 18991)
+++ branches/blender2.5/blender/source/blender/editors/space_file/space_file.c	2009-02-16 12:14:04 UTC (rev 18992)
@@ -125,10 +125,6 @@
 		MEM_freeN(sfile->params);
 		sfile->params= NULL;
 	}
-	
-	if (sfile->op) {
-		WM_operator_free(sfile->op);
-	}
 }
 
 

Modified: branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c	2009-02-16 09:48:38 UTC (rev 18991)
+++ branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c	2009-02-16 12:14:04 UTC (rev 18992)
@@ -63,7 +63,6 @@
 #include "RNA_types.h"
 
 #include "ED_image.h"
-#include "ED_fileselect.h"
 #include "ED_screen.h"
 #include "ED_space_api.h"
 #include "ED_uvedit.h"
@@ -591,18 +590,8 @@
 
 static void image_filesel(bContext *C, wmOperator *op, const char *path)
 {
-	SpaceFile *sfile;
-
-	// XXX context is not set back ok afterwards
-	// ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_FILE);
-	ED_area_newspace(C, CTX_wm_area(C), SPACE_FILE);
-	
-	/* settings for filebrowser */
-	sfile= (SpaceFile*)CTX_wm_space_data(C);
-	sfile->op= op;
-
-	/* XXX right params for image save, with pupmenu and image type .. */
-	ED_fileselect_set_params(sfile, FILE_SPECIAL, op->type->name, path, 0, 0, 0);
+	RNA_string_set(op->ptr, "filename", path);
+	WM_event_add_fileselect(C, op); 
 }
 
 /******************** open image operator ********************/
@@ -834,6 +823,7 @@
 			sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype);
 		
 		// XXX activate_fileselect_menu(FILE_SPECIAL, "Save Image", name, strp, &sima->imtypenr, save_image_doit);
+		// XXX note: we can give default menu enums to operator for this 
 		
 		image_filesel(C, op, ima->name);
 

Modified: branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_header.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_header.c	2009-02-16 09:48:38 UTC (rev 18991)
+++ branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_header.c	2009-02-16 12:14:04 UTC (rev 18992)
@@ -146,7 +146,7 @@
 //static uiBlock *seq_selectmenu(bContext *C, ARegion *ar, void *arg_unused)
 static void seq_selectmenu(bContext *C, uiMenuItem *head, void *arg_unused)
 {
-	uiMenuContext(head, WM_OP_INVOKE_DEFAULT);
+	uiMenuContext(head, WM_OP_INVOKE_REGION_WIN);
 
 	uiMenuItemEnumO(head, "Strips to the Left", 0, "SEQUENCER_OT_select_active_side", "side", SEQ_SIDE_LEFT);
 	uiMenuItemEnumO(head, "Strips to the Right", 0, "SEQUENCER_OT_select_active_side", "side", SEQ_SIDE_RIGHT);
@@ -212,7 +212,7 @@
 //static uiBlock *seq_addmenu_effectmenu(bContext *C, ARegion *ar, void *arg_unused)
 static void seq_addmenu_effectmenu(bContext *C, uiMenuItem *head, void *arg_unused)
 {
-	uiMenuContext(head, WM_OP_INVOKE_DEFAULT);
+	uiMenuContext(head, WM_OP_INVOKE_REGION_WIN);
 	
 	uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_ADD);
 	uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_SUB);
@@ -238,7 +238,7 @@
 	uiMenuLevel(head, "Effects...", seq_addmenu_effectmenu);
 	uiMenuSeparator(head);
 
-	uiMenuContext(head, WM_OP_INVOKE_DEFAULT);
+	uiMenuContext(head, WM_OP_INVOKE_REGION_WIN);
 
 #ifdef WITH_FFMPEG
 	uiMenuItemBooleanO(head, "Audio (RAM)", 0, "SEQUENCER_OT_add_sound_strip", "hd", FALSE);
@@ -263,7 +263,7 @@
 	Scene *scene= CTX_data_scene(C);
 	Editing *ed= seq_give_editing(scene, FALSE);
 	
-	uiMenuContext(head, WM_OP_INVOKE_DEFAULT);
+	uiMenuContext(head, WM_OP_INVOKE_REGION_WIN);
 
 	uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TRANSLATION);
 	uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TIME_EXTEND);

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h	2009-02-16 09:48:38 UTC (rev 18991)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h	2009-02-16 12:14:04 UTC (rev 18992)
@@ -44,14 +44,15 @@
 typedef struct bScreen {
 	ID id;
 	
-	ListBase vertbase, edgebase;
+	ListBase vertbase;					/* screens have vertices/edges to define areas */
+	ListBase edgebase;
 	ListBase areabase;
-	ListBase regionbase;				/* screen level regions, runtime only */
+	ListBase regionbase;				/* screen level regions (menus), runtime only */
+	
 	struct Scene *scene;
 	
-	short scenenr, screennr;			/* only for pupmenu */
-	
-	short full, winid;					/* winid from WM, starts with 1 */
+	short full;							/* fade out? */
+	short winid;						/* winid from WM, starts with 1 */
 	short do_draw;						/* notifier for drawing edges */
 	short do_refresh;					/* notifier for scale screen, changed screen, etc */
 	short do_draw_gesture;				/* notifier for gesture draw. */
@@ -62,6 +63,8 @@
 	short mainwin;						/* screensize subwindow, for screenedges and global menus */
 	short subwinactive;					/* active subwindow */
 	
+	int pad2;
+	
 	struct wmTimer *animtimer;			/* if set, screen has timer handler added in window */
 	void *context;						/* context callback */
 	

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2009-02-16 09:48:38 UTC (rev 18991)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2009-02-16 12:14:04 UTC (rev 18992)
@@ -161,11 +161,15 @@
 void		WM_gesture_end(struct bContext *C, struct wmGesture *gesture);
 
 			/* radial control operator */
-int		WM_radial_control_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
-int		WM_radial_control_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
+int			WM_radial_control_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
+int			WM_radial_control_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
 void		WM_OT_radial_control_partial(struct wmOperatorType *ot);
 void		WM_radial_control_string(struct wmOperator *op, char str[], int maxlen);
 
+			/* fileselecting support */
+void		WM_event_add_fileselect(struct bContext *C, struct wmOperator *op);
+void		WM_event_fileselect_event(struct bContext *C, void *ophandle, int eventval);
+
 			/* OpenGL wrappers, mimicking opengl syntax */
 void		wmSubWindowSet			(struct wmWindow *win, int swinid);
 void		wmSubWindowScissorSet	(struct wmWindow *win, int swinid, struct rcti *srct);

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-02-16 09:48:38 UTC (rev 18991)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-02-16 12:14:04 UTC (rev 18992)
@@ -50,6 +50,7 @@
 #include "BKE_scene.h"
 #include "BKE_utildefines.h"
 
+#include "ED_fileselect.h"
 #include "ED_screen.h"
 #include "ED_space_api.h"
 #include "ED_util.h"
@@ -455,10 +456,36 @@
 
 /* ********************* handlers *************** */
 
-/* not handler itself, is called by UI to move handlers to other queues, so don't close modal ones */
+/* future extra customadata free? */
 static void wm_event_free_handler(wmEventHandler *handler)
 {
+	MEM_freeN(handler);
+}
+
+/* only set context when area/region is part of screen */
+static void wm_handler_op_context(bContext *C, wmEventHandler *handler)
+{
+	bScreen *screen= CTX_wm_screen(C);
 	
+	if(screen && handler->op) {
+		ScrArea *sa;
+		
+		for(sa= screen->areabase.first; sa; sa= sa->next)
+			if(sa==handler->op_area)
+				break;
+		if(sa==NULL)
+			printf("internal error: handler (%s) has invalid area\n", handler->op->type->idname);
+		else {
+			ARegion *ar;
+			CTX_wm_area_set(C, sa);
+			for(ar= sa->regionbase.first; ar; ar= ar->next)
+				if(ar==handler->op_region)
+					break;
+			/* XXX no warning print here, after full-area and back regions are remade */
+			if(ar)
+				CTX_wm_region_set(C, ar);
+		}
+	}
 }
 
 /* called on exit or remove area, only here call cancel callback */
@@ -475,8 +502,7 @@
 				ScrArea *area= CTX_wm_area(C);
 				ARegion *region= CTX_wm_region(C);
 				
-				CTX_wm_area_set(C, handler->op_area);
-				CTX_wm_region_set(C, handler->op_region);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list