[Bf-blender-cvs] [04671df] wiggly-widgets: Code for runtime registration of widgets that should make it possible to remove and add widgetgroup types from the system.

Antony Riakiotakis noreply at git.blender.org
Mon Dec 8 15:48:29 CET 2014


Commit: 04671df15ff406a7c7ccc0aa303f6f268dbb949a
Author: Antony Riakiotakis
Date:   Mon Dec 8 15:48:09 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB04671df15ff406a7c7ccc0aa303f6f268dbb949a

Code for runtime registration of widgets that should make it possible to
remove and add widgetgroup types from the system.

Start operator that will control sequencer backdrop. Architecture here
still needs a little work so good compatibility with Add-ons can be
ensured.

===================================================================

M	source/blender/editors/space_node/space_node.c
M	source/blender/editors/space_sequencer/sequencer_intern.h
M	source/blender/editors/space_sequencer/sequencer_ops.c
M	source/blender/editors/space_sequencer/sequencer_view.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_widgets.c

===================================================================

diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index aa4de42..f48e140 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -885,13 +885,13 @@ static void WIDGETGROUP_node_transform_update(const struct bContext *C, struct w
 
 static void node_widgets(void)
 {
-	struct wmWidgetMapType *wmaptype;
 	struct wmWidgetGroupType *wgroup_node_transform;
 
-	wgroup_node_transform = WM_widgetgrouptype_new(WIDGETGROUP_node_transform_poll, WIDGETGROUP_node_transform_update);
-	wmaptype = WM_widgetmaptype_find(SPACE_NODE, RGN_TYPE_WINDOW, false, true);
-
-	WM_widgetgrouptype_register(wmaptype, wgroup_node_transform);
+	WM_widgetmaptype_find(SPACE_NODE, RGN_TYPE_WINDOW, false, true);
+	
+	wgroup_node_transform = WM_widgetgrouptype_new(WIDGETGROUP_node_transform_poll, WIDGETGROUP_node_transform_update, SPACE_NODE, RGN_TYPE_WINDOW, false);
+	/* create the widgetmap here */
+	WM_widgetgrouptype_register(NULL, wgroup_node_transform);
 }
 
 /* only called once, from space/spacetypes.c */
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h
index 4e11b4d..a63c670 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -129,6 +129,8 @@ void SEQUENCER_OT_paste(struct wmOperatorType *ot);
 
 void SEQUENCER_OT_rebuild_proxy(struct wmOperatorType *ot);
 
+void SEQUENCER_OT_backdrop_transform(struct wmOperatorType *ot);
+
 /* preview specific operators */
 void SEQUENCER_OT_view_all_preview(struct wmOperatorType *ot);
 
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index 9b5ef18..d62ee51 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -123,6 +123,7 @@ void sequencer_operatortypes(void)
 
 	/* sequencer_view.h */
 	WM_operatortype_append(SEQUENCER_OT_sample);
+	WM_operatortype_append(SEQUENCER_OT_backdrop_transform);	
 }
 
 
diff --git a/source/blender/editors/space_sequencer/sequencer_view.c b/source/blender/editors/space_sequencer/sequencer_view.c
index 7fdbc9c..4dc4d1d 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -35,6 +35,7 @@
 #include "BLI_utildefines.h"
 
 #include "DNA_scene_types.h"
+#include "DNA_widget_types.h"
 
 #include "BKE_context.h"
 #include "BKE_main.h"
@@ -238,3 +239,60 @@ void SEQUENCER_OT_sample(wmOperatorType *ot)
 	/* flags */
 	ot->flag = OPTYPE_BLOCKING;
 }
+
+int sequencer_backdrop_transform_poll(bContext *C)
+{
+	SpaceSeq *sseq = CTX_wm_space_seq(C);
+
+	return (sseq && (sseq->draw_flag & SEQ_DRAW_BACKDROP));
+}
+
+void widgetgroup_backdrop_draw(const struct bContext *C, struct wmWidgetGroup *wgroup)
+{
+	wmRectTransformWidget *cage = WIDGET_rect_transform_new(wgroup, WIDGET_RECT_TRANSFORM_STYLE_SCALE_UNIFORM | WIDGET_RECT_TRANSFORM_STYLE_TRANSLATE, NULL);
+	
+}
+
+
+static int sequencer_backdrop_transform_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+	/* no poll, lives always for the duration of the operator */
+	wmWidgetGroupType *cagetype = WM_widgetgrouptype_new(NULL, widgetgroup_backdrop_draw, SPACE_SEQ, RGN_TYPE_WINDOW, false);
+	op->customdata = cagetype;
+	WM_widgetgrouptype_register(CTX_data_main(C), cagetype);
+	
+	WM_event_add_modal_handler(C, op);
+	return OPERATOR_RUNNING_MODAL;
+}
+
+static int sequencer_backdrop_transform_modal(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	switch (event->type) {
+		case EVT_WIDGET_UPDATE:
+			break;
+			
+		case RETKEY:
+			WM_widgetgrouptype_unregister(CTX_data_main(C), op->customdata);
+			break;
+			
+	}
+	
+	return OPERATOR_RUNNING_MODAL;
+}
+
+void SEQUENCER_OT_backdrop_transform(struct wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Change Data/Files";
+	ot->idname = "SEQUENCER_OT_backdrop_transform";
+	ot->description = "";
+
+	/* api callbacks */
+	ot->invoke = sequencer_backdrop_transform_invoke;
+	ot->modal = sequencer_backdrop_transform_modal;
+	ot->poll = sequencer_backdrop_transform_poll;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index c331f7c..50e5c6a 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -780,26 +780,25 @@ static void WIDGETGROUP_shapekey_draw(const struct bContext *C, struct wmWidgetG
 
 static void view3d_widgets(void)
 {
-	struct wmWidgetMapType *wmaptype = WM_widgetmaptype_find(SPACE_VIEW3D, RGN_TYPE_WINDOW, true, true);
 	wmWidgetGroupType *wgroup_light,*wgroup_camera, *wgroup_shapekey;
 	// struct wmWidgetGroupType *wgroup_manipulator;
 
-	wgroup_light = WM_widgetgrouptype_new(WIDGETGROUP_lamp_poll, WIDGETGROUP_lamp_draw);
-	wgroup_camera = WM_widgetgrouptype_new(WIDGETGROUP_camera_poll, WIDGETGROUP_camera_draw);
-	wgroup_shapekey = WM_widgetgrouptype_new(WIDGETGROUP_shapekey_poll, WIDGETGROUP_shapekey_draw);
+	WM_widgetmaptype_find(SPACE_VIEW3D, RGN_TYPE_WINDOW, true, true);
+	
+	wgroup_light = WM_widgetgrouptype_new(WIDGETGROUP_lamp_poll, WIDGETGROUP_lamp_draw, SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
+	wgroup_camera = WM_widgetgrouptype_new(WIDGETGROUP_camera_poll, WIDGETGROUP_camera_draw, SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
+	wgroup_shapekey = WM_widgetgrouptype_new(WIDGETGROUP_shapekey_poll, WIDGETGROUP_shapekey_draw, SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
 
 #if 0
 	wgroup_manipulator = WM_widgetgrouptype_new(
-	        WIDGETGROUP_manipulator_create,
 	        WIDGETGROUP_manipulator_poll,
-	        WIDGETGROUP_manipulator_update,
-	        WIDGETGROUP_manipulator_free);
+	        WIDGETGROUP_manipulator_update);
 #endif
 	
 	//WM_widgetgrouptype_register(wmaptype, wgroup_manipulator);
-	WM_widgetgrouptype_register(wmaptype, wgroup_light);
-	WM_widgetgrouptype_register(wmaptype, wgroup_camera);
-	WM_widgetgrouptype_register(wmaptype, wgroup_shapekey);
+	WM_widgetgrouptype_register(NULL, wgroup_light);
+	WM_widgetgrouptype_register(NULL, wgroup_camera);
+	WM_widgetgrouptype_register(NULL, wgroup_shapekey);
 }
 
 
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 0128630..8de23c8 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -1395,9 +1395,9 @@ static void rna_WidgetGroup_unregister(struct Main *bmain, StructRNA *type)
 
 	//RNA_struct_free_extension(type, &wgrouptype->ext);
 
-	WM_widgetgrouptype_free(bmain, wgrouptype);
+	WM_widgetgrouptype_unregister(bmain, wgrouptype);
+	MEM_freeN(wgrouptype);
 	//WM_operatortype_remove_ptr(ot);
-	//WM_widgetgrouptype_unregister(wmap, wgrouptype);
 
 	/* not to be confused with the RNA_struct_free that WM_operatortype_remove calls, they are 2 different srna's */
 	RNA_struct_free(&BLENDER_RNA, type);
@@ -1474,7 +1474,7 @@ static char _widgetgroup_idname[OP_MAX_TYPENAME];
 //static char _widgetgroup_name[OP_MAX_TYPENAME];
 //static char _widgetgroup_descr[RNA_DYN_DESCR_MAX];
 //static char _widgetgroup_ctxt[RNA_DYN_DESCR_MAX];
-static StructRNA *rna_WidgetGroup_register(Main *UNUSED(bmain), ReportList *reports, void *data, const char *identifier,
+static StructRNA *rna_WidgetGroup_register(Main *bmain, ReportList *reports, void *data, const char *identifier,
                                         StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
 {
 
@@ -1499,6 +1499,12 @@ static StructRNA *rna_WidgetGroup_register(Main *UNUSED(bmain), ReportList *repo
 		            identifier, (int)sizeof(dummywgt.idname));
 		return NULL;
 	}
+	
+	/* check if the area supports widgets */
+	if (!WM_widgetmaptype_find(dummywgt.spaceid, dummywgt.regionid, dummywgt.is_3d, false)) {
+		BKE_reportf(reports, RPT_ERROR, "Area type does not support widgets");
+		return NULL;
+	}
 
 #if 0
 	/* check if we have registered this widgetgroup type before, and remove it */
@@ -1522,9 +1528,10 @@ static StructRNA *rna_WidgetGroup_register(Main *UNUSED(bmain), ReportList *repo
 	dummywgt.poll = (have_function[0]) ? widgetgroup_poll : NULL;
 	dummywgt.draw = (have_function[1]) ? widgetgroup_draw : NULL;
 
-	wgrouptype = WM_widgetgrouptype_new(NULL, NULL);
+	wgrouptype = WM_widgetgrouptype_new(NULL, NULL, 0, 0, 0);
 	memcpy(wgrouptype, &dummywgt, sizeof(dummywgt));
-
+	
+	WM_widgetgrouptype_register(bmain, wgrouptype);
 	/* update while blender is running */
 	WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
 
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 0d0b06e..283d7bb 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -471,9 +471,8 @@ bool        WM_event_is_tablet(const struct wmEvent *event);
 
 
 /* widget API */
-struct wmWidgetGroupType *WM_widgetgrouptype_new(
-        int (*poll)(const struct bContext *, struct wmWidgetGroupType *),
-        void (*draw)(const struct bContext *, struct wmWidgetGroup *));
+struct wmWidgetGroupType *WM_widgetgrouptype_new(int (*poll)(const struct bContext *, struct wmWidgetGroupType *),
+                                                 void (*draw)(const struct bContext *, struct wmWidgetGroup *), short spaceid, short regionid, bool is_3d);
 
 struct wmWidget *WM_widget_new(void (*draw)(struct wmWidget *, const struct bContext *),
                                void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, int),
@@ -499,9 +498,8 @@ void WM_widget_set_scale(struct wmWidget *widget, float scale);
 
 struct wmWidgetMapType *WM_widgetmaptype_find(int spaceid, int regionid, bool is_3d, bool create);
 
-bool WM_widgetgrouptype_register(struct wmWidgetMapType *wmap, struct wmWidgetGroupType *wgroup);
-void WM_widgetgrouptype_unregister(struct wmWidgetMapType *wmap, struct wmWidgetGroupType *wgroup);
-void WM_widgetgrouptype_free(struct Main *bmain, struct wmWidgetGroupType *wgroup);
+bo

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list