[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59090] branches/soc-2013-ui_replay/source /blender: Working on custom panels for the toolbars.

Vincent Akkermans vincent at ack-err.net
Tue Aug 13 00:04:11 CEST 2013


Revision: 59090
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59090
Author:   ack-err
Date:     2013-08-12 22:04:10 +0000 (Mon, 12 Aug 2013)
Log Message:
-----------
Working on custom panels for the toolbars. This adds an operator that adds a PanelType to the current region.

Modified Paths:
--------------
    branches/soc-2013-ui_replay/source/blender/editors/interface/interface_panel.c
    branches/soc-2013-ui_replay/source/blender/makesdna/DNA_screen_types.h
    branches/soc-2013-ui_replay/source/blender/windowmanager/WM_api.h
    branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_init_exit.c
    branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_operators.c

Modified: branches/soc-2013-ui_replay/source/blender/editors/interface/interface_panel.c
===================================================================
--- branches/soc-2013-ui_replay/source/blender/editors/interface/interface_panel.c	2013-08-12 17:05:02 UTC (rev 59089)
+++ branches/soc-2013-ui_replay/source/blender/editors/interface/interface_panel.c	2013-08-12 22:04:10 UTC (rev 59090)
@@ -1191,6 +1191,7 @@
 //			RNA_pointer_create(NULL, &RNA_Panel, &block->panel, &panel_ptr);
 //			RNA_pointer_set(&props_ptr, "panel", panel_ptr);
 			
+			// TODO: don't need to define an operator, just call directly ~ ack-err
 			RNA_string_set(&props_ptr, "panel_name", block->panel->type->idname);
 			WM_operator_name_call(C, "WM_OT_panel_popup", WM_OP_INVOKE_DEFAULT, &props_ptr);
 

Modified: branches/soc-2013-ui_replay/source/blender/makesdna/DNA_screen_types.h
===================================================================
--- branches/soc-2013-ui_replay/source/blender/makesdna/DNA_screen_types.h	2013-08-12 17:05:02 UTC (rev 59089)
+++ branches/soc-2013-ui_replay/source/blender/makesdna/DNA_screen_types.h	2013-08-12 22:04:10 UTC (rev 59090)
@@ -231,6 +231,7 @@
 /* paneltype flag */
 #define PNL_DEFAULT_CLOSED		1
 #define PNL_NO_HEADER			2
+#define PNL_CUSTOM				4
 
 /* uilist layout_type */
 enum {

Modified: branches/soc-2013-ui_replay/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/soc-2013-ui_replay/source/blender/windowmanager/WM_api.h	2013-08-12 17:05:02 UTC (rev 59089)
+++ branches/soc-2013-ui_replay/source/blender/windowmanager/WM_api.h	2013-08-12 22:04:10 UTC (rev 59090)
@@ -258,6 +258,8 @@
 bool        WM_operator_properties_init(struct wmOperator *op);
 bool        WM_operator_last_properties_store(struct wmOperator *op);
 bool		WM_operator_default_properties_store(struct wmOperator *op);
+	
+void		WM_save_custom_panels(void);
 
 /* MOVE THIS SOMEWHERE ELSE */
 #define	SEL_TOGGLE		0

Modified: branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_init_exit.c
===================================================================
--- branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_init_exit.c	2013-08-12 17:05:02 UTC (rev 59089)
+++ branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_init_exit.c	2013-08-12 22:04:10 UTC (rev 59090)
@@ -394,6 +394,9 @@
 		wmWindow *win;
 
 		if (!G.background) {
+			
+			WM_save_custom_panels();
+			
 			if ((U.uiflag2 & USER_KEEP_SESSION) || BKE_undo_valid(NULL)) {
 				/* save the undo state as quit.blend */
 				char filename[FILE_MAX];

Modified: branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_operators.c	2013-08-12 17:05:02 UTC (rev 59089)
+++ branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_operators.c	2013-08-12 22:04:10 UTC (rev 59090)
@@ -114,6 +114,8 @@
 
 #define UNDOCUMENTED_OPERATOR_TIP N_("(undocumented operator)")
 
+#define MAX_CUSTOM_PANELS 1000
+
 /* ************ operator API, exported ********** */
 
 
@@ -4220,7 +4222,7 @@
 	return block;
 }
 
-
+// TODO: WM_OT_panel_popup shouldn't be an operator, but executed directly ~ ack-err
 static int wm_panel_popup_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
 {
 	return OPERATOR_FINISHED;
@@ -4251,16 +4253,134 @@
 	
 	ot->flag |= OPTYPE_INTERNAL;
 	
-	// Can't seem to define a pointer property for operators.
-	// The set/get/etc. functions aren't present when calling RNA_pointer_set
-//	prop = RNA_def_pointer(ot->srna, "panel", "Panel", "", "");
-//	RNA_def_property_flag(prop, PROP_HIDDEN | PROP_REQUIRED | PROP_NEVER_NULL);
-	
 	prop = RNA_def_string(ot->srna, "panel_name", "", 64, "panel_name", "The name of the panel being opened in a popup");
 	RNA_def_property_flag(prop, PROP_HIDDEN | PROP_REQUIRED);
 }
 
 
+void WM_save_custom_panels(void)
+{
+	printf("Saved panels to preference directory.\n");
+}
+
+//static int wm_create_custom_panel_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+//{
+//	uiPupBlock(C, wm_panel_popup_create_block, op);
+//	return OPERATOR_CANCELLED;
+//}
+
+static int wm_create_custom_panel_poll(bContext *C)
+{
+
+	if (CTX_wm_window(C) == NULL) {
+		return 0;
+	} else {
+		ScrArea *sa = CTX_wm_area(C);
+		ARegion *ar;
+		if (sa) {
+			// We should be in a space where there are toolbars
+			//if (!ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_CLIP)) return 0;
+			for (ar = sa->regionbase.first; ar; ar = ar->next) {
+				if (ar->type && ar->type->regionid == RGN_TYPE_TOOLS) {
+					return 1;
+				}
+			}
+		}
+	}
+	// If a RGN_TYPE_TOOLS wasn't found we can't create a panel for it
+	return 0;
+}
+
+
+static void custom_panel_draw(const bContext *UNUSED(C), Panel *pa)
+{
+	uiLayout *layout = pa->layout;
+	uiLayout *row = uiLayoutRow(layout, TRUE);
+	uiItemL(row, "yeah!", ICON_NONE);
+}
+
+static int wm_create_custom_panel_exec(bContext *C, wmOperator *UNUSED(op))
+{
+	ScrArea *sa = CTX_wm_area(C);
+	ARegion *ar;
+	PanelType *pt_iter, *pt_new;
+
+	// find RGN_TYPE_TOOLS
+	for (ar = sa->regionbase.first; ar; ar = ar->next)
+		if (ar->type && ar->type->regionid == RGN_TYPE_TOOLS)
+			break;
+	
+	if (ar == NULL) return OPERATOR_CANCELLED;
+	
+	// Create new panel type and add to the current editor's toolbar
+	pt_new = MEM_callocN(sizeof(PanelType), "custom panel type");
+	
+	// find new name for paneltype
+	for (int i=0; i < MAX_CUSTOM_PANELS; i++) {
+		// generate name
+		char *name = BLI_sprintfN("custom panel %i", i);
+		int name_taken = 0;
+		// see if it is taken
+		for (pt_iter = ar->type->paneltypes.first; pt_iter; pt_iter = pt_iter->next) {
+			if (strcmp(pt_iter->idname, name) == 0) {
+				name_taken = 1;
+				break;
+			}
+		}
+		// clear if taken
+		if(name_taken) {
+			MEM_freeN(name);
+			continue;
+		} else {
+			// name the new panel type if not taken
+			BLI_strncpy(pt_new->idname, name, BKE_ST_MAXNAME);
+			MEM_freeN(name);
+			break;
+		}		
+	}
+
+	strcpy(pt_new->label, N_("Custom Panel"));
+	strcpy(pt_new->translation_context, BLF_I18NCONTEXT_DEFAULT_BPYRNA);
+//	pt_new->draw_header = custom_panel_draw_header;
+	pt_new->draw = custom_panel_draw;
+//	pt_new->poll = custom_panel_poll;
+	pt_new->flag = PNL_CUSTOM;
+	pt_new->space_type = sa->spacetype;
+	pt_new->region_type = ar->regiontype;
+	BLI_strncpy(pt_new->context, CTX_data_mode_string(C), BKE_ST_MAXNAME);
+	BLI_addtail(&ar->type->paneltypes, pt_new);
+	
+	ED_region_tag_redraw(ar);
+	
+	printf("Added panel\n");
+	
+	// example draw func:
+//	pt->draw = buttons_panel_context;
+	// this might be good to get panels in the tool lregion
+//	pt->flag = PNL_NO_HEADER;
+	
+	return OPERATOR_FINISHED;
+}
+
+static void WM_OT_create_custom_panel(wmOperatorType *ot)
+{
+//	PropertyRNA *prop;
+	
+	ot->name = "Create Custom Panel";
+	ot->idname = "WM_OT_create_custom_panel";
+	ot->description = "Create a custom panel in the current region's toolbar";
+	
+//	ot->invoke = wm_create_custom_panel_invoke;
+	ot->exec = wm_create_custom_panel_exec;
+	ot->poll = wm_create_custom_panel_poll;
+	
+//	ot->flag |= OPTYPE_INTERNAL;
+	
+//	prop = RNA_def_string(ot->srna, "panel_name", "", 64, "panel_name", "The name of the panel being opened in a popup");
+//	RNA_def_property_flag(prop, PROP_HIDDEN | PROP_REQUIRED);
+}
+
+
 /* ******************************************************* */
 /* called on initialize WM_exit() */
 void wm_operatortype_free(void)
@@ -4301,6 +4421,7 @@
 	WM_operatortype_append(WM_OT_radial_control);
 	WM_operatortype_append(WM_OT_ndof_sensitivity_change);
 	WM_operatortype_append(WM_OT_panel_popup);
+	WM_operatortype_append(WM_OT_create_custom_panel);
 #if defined(WIN32)
 	WM_operatortype_append(WM_OT_console_toggle);
 #endif




More information about the Bf-blender-cvs mailing list