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

Brecht Van Lommel brecht at blender.org
Sun Mar 29 21:44:39 CEST 2009


Revision: 19452
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19452
Author:   blendix
Date:     2009-03-29 21:44:39 +0200 (Sun, 29 Mar 2009)

Log Message:
-----------
UI:
* Added a PanelType and HeaderType for registering panels
  and headers in regions. When the region draws, it will
  then automatically draw the ones that were registerd with
  poll and draw callbacks.

  Used for text header, properties and object buttons now.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
    branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
    branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c
    branches/blender2.5/blender/source/blender/editors/interface/interface_panel.c
    branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h
    branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_object.c
    branches/blender2.5/blender/source/blender/editors/space_buttons/space_buttons.c
    branches/blender2.5/blender/source/blender/editors/space_text/space_text.c
    branches/blender2.5/blender/source/blender/editors/space_text/text_header.c
    branches/blender2.5/blender/source/blender/editors/space_text/text_intern.h

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2009-03-29 18:46:17 UTC (rev 19451)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2009-03-29 19:44:39 UTC (rev 19452)
@@ -36,11 +36,14 @@
 struct bContextDataResult;
 struct bScreen;
 struct ListBase;
+struct Panel;
 struct ScrArea;
 struct SpaceType;
 struct wmNotifier;
 struct wmWindow;
 struct wmWindowManager;
+struct uiLayout;
+struct uiMenuItem;
 
 /* spacetype has everything stored to get an editor working, it gets initialized via 
    ED_spacetypes_init() in editors/area/spacetypes.c   */
@@ -122,13 +125,51 @@
 	/* custom drawing callbacks */
 	ListBase	drawcalls;
 
+	/* panels type definitions */
+	ListBase paneltypes;
+
+	/* header type definitions */
+	ListBase headertypes;
+
 	/* hardcoded constraints, smaller than these values region is not visible */
 	int			minsizex, minsizey;
 	/* default keymaps to add */
 	int			keymapflag;
 } ARegionType;
 
+/* panel types */
 
+typedef struct PanelType {
+	struct PanelType *next, *prev;
+	
+	char		*idname;	/* unique name */
+	char		*name;		/* for panel header */
+	char		*context;	/* for buttons window */
+
+	/* verify if the panel should draw or not */
+	int			(*poll)(const struct bContext *);
+	/* draw entirely, view changes should be handled here */
+	void		(*draw)(const struct bContext *, struct Panel *);	
+
+	/* python integration */
+	void		*py_data;
+} PanelType;
+
+/* header types */
+
+typedef struct HeaderType {
+	struct HeaderType *next, *prev;
+
+	char		*idname;	/* unique name */
+	char		*name;		/* for UI */
+
+	/* draw entirely, view changes should be handled here */
+	void		(*draw)(const struct bContext *, struct uiLayout *);	
+
+	/* python integration */
+	void		*py_data;
+} HeaderType;
+
 /* spacetypes */
 struct SpaceType *BKE_spacetype_from_id(int spaceid);
 struct ARegionType *BKE_regiontype_from_id(struct SpaceType *st, int regionid);

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c	2009-03-29 18:46:17 UTC (rev 19451)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c	2009-03-29 19:44:39 UTC (rev 19452)
@@ -54,8 +54,11 @@
 {
 	ARegionType *art;
 	
-	for(art= st->regiontypes.first; art; art= art->next)
+	for(art= st->regiontypes.first; art; art= art->next) {
 		BLI_freelistN(&art->drawcalls);
+		BLI_freelistN(&art->paneltypes);
+		BLI_freelistN(&art->headertypes);
+	}
 	
 	BLI_freelistN(&st->regiontypes);
 }

Modified: branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2009-03-29 18:46:17 UTC (rev 19451)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2009-03-29 19:44:39 UTC (rev 19452)
@@ -42,6 +42,7 @@
 struct wmOperator;
 struct AutoComplete;
 struct bContext;
+struct Panel;
 struct PointerRNA;
 struct PropertyRNA;
 struct ReportList;
@@ -508,6 +509,8 @@
 extern void uiPanelControl(int);
 extern void uiSetPanelHandler(int);
 
+struct Panel *uiPanelFromBlock(struct uiBlock *block);
+
 /* Handlers
  *
  * Handlers that can be registered in regions, areas and windows for
@@ -622,12 +625,8 @@
 typedef void (*uiHeaderCreateFunc)(const struct bContext *C, uiLayout *layout);
 typedef void (*uiPanelCreateFunc)(const struct bContext *C, uiLayout *layout);
 
-void uiPanelLayout(const struct bContext *C, struct ARegion *ar, char *blockname,
-	char *panelname, char *tabname, uiPanelCreateFunc func, int order);
-void uiCompactPanelLayout(const struct bContext *C, struct ARegion *ar, char *blockname,
-	char *panelname, char *tabname, uiPanelCreateFunc func, int order);
-void uiHeaderLayout(const struct bContext *C, struct ARegion *ar,
-	uiHeaderCreateFunc func);
+void uiRegionPanelLayout(const struct bContext *C, struct ARegion *ar, int vertical, char *context);
+void uiRegionHeaderLayout(const struct bContext *C, struct ARegion *ar);
 
 #endif /*  UI_INTERFACE_H */
 

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c	2009-03-29 18:46:17 UTC (rev 19451)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c	2009-03-29 19:44:39 UTC (rev 19452)
@@ -16,6 +16,7 @@
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_idprop.h"
+#include "BKE_screen.h"
 #include "BKE_utildefines.h"
 
 #include "RNA_access.h"
@@ -24,6 +25,8 @@
 #include "UI_resources.h"
 #include "UI_view2d.h"
 
+#include "BIF_gl.h"
+
 #include "ED_util.h"
 #include "ED_types.h"
 #include "ED_screen.h"
@@ -899,59 +902,103 @@
 
 /* Utilities */
 
-static void ui_panel_layout(const bContext *C, ARegion *ar, char *blockname, char *panelname, char *tabname, uiPanelCreateFunc func, int order, int w)
+void uiRegionPanelLayout(const bContext *C, ARegion *ar, int vertical, char *context)
 {
 	uiBlock *block;
-	uiLayout *layout;
-	int xco, yco, x, y;
+	PanelType *pt;
+	Panel *panel;
+	float col[3];
+	int xco, yco, x=0, y=0, w;
 
 	// XXX this only hides cruft
 
-	x= 20*order;
-	y= -100*(order+1);
-
-	block= uiBeginBlock(C, ar, blockname, UI_EMBOSS, UI_HELV);
-	if(uiNewPanel(C, ar, block, panelname, tabname, x, y, w, 0)==0) return;
+	/* clear */
+	UI_GetThemeColor3fv(TH_HEADER, col);
+	glClearColor(col[0], col[1], col[2], 0.0);
+	glClear(GL_COLOR_BUFFER_BIT);
 	
-	layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, x, y, w, 0);
+	/* set view2d view matrix for scrolling (without scrollers) */
+	UI_view2d_view_ortho(C, &ar->v2d);
+	
+	for(pt= ar->type->paneltypes.first; pt; pt= pt->next) {
+		if(context)
+			if(!pt->context || strcmp(context, pt->context) != 0)
+				continue;
 
-	func(C, layout);
+		if(pt->draw && (!pt->poll || pt->poll(C))) {
+			w= (ar->type->minsizex)? ar->type->minsizex-22: UI_PANEL_WIDTH-22;
 
-	uiLayoutEnd(C, block, layout, &xco, &yco);
-	uiEndBlock(C, block);
+			block= uiBeginBlock(C, ar, pt->idname, UI_EMBOSS, UI_HELV);
+			if(uiNewPanel(C, ar, block, pt->name, pt->name, x, y, w, 0)==0) return;
+			
+			panel= uiPanelFromBlock(block);
+			panel->type= pt;
+			panel->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, x, y, w, 0);
 
-	uiNewPanelHeight(block, y - yco + 6);
-}
+			pt->draw(C, panel);
 
-void uiCompactPanelLayout(const bContext *C, ARegion *ar, char *blockname, char *panelname, char *tabname, uiPanelCreateFunc func, int order)
-{
-	ui_panel_layout(C, ar, blockname, panelname, tabname, func, order, UI_COMPACT_PANEL_WIDTH-22);
-}
+			uiLayoutEnd(C, block, panel->layout, &xco, &yco);
+			uiEndBlock(C, block);
 
-void uiPanelLayout(const bContext *C, ARegion *ar, char *blockname, char *panelname, char *tabname, uiPanelCreateFunc func, int order)
-{
-	ui_panel_layout(C, ar, blockname, panelname, tabname, func, order, UI_PANEL_WIDTH-22);
+			panel->layout= NULL;
+			uiNewPanelHeight(block, y - yco + 6);
+
+			if(vertical)
+				y += yco;
+			else
+				x += xco;
+		}
+	}
+
+	uiDrawPanels(C, 1);
+	uiMatchPanelsView2d(ar);
+	
+	/* restore view matrix? */
+	UI_view2d_view_restore(C);
 }
 
-void uiHeaderLayout(const bContext *C, ARegion *ar, uiHeaderCreateFunc func)
+void uiRegionHeaderLayout(const bContext *C, ARegion *ar)
 {
 	uiBlock *block;
 	uiLayout *layout;
+	HeaderType *ht;
+	float col[3];
 	int xco, yco;
 
 	// XXX this only hides cruft
+	
+	/* clear */
+	if(ED_screen_area_active(C))
+		UI_GetThemeColor3fv(TH_HEADER, col);
+	else
+		UI_GetThemeColor3fv(TH_HEADERDESEL, col);
+	
+	glClearColor(col[0], col[1], col[2], 0.0);
+	glClear(GL_COLOR_BUFFER_BIT);
+	
+	/* set view2d view matrix for scrolling (without scrollers) */
+	UI_view2d_view_ortho(C, &ar->v2d);
 
-	block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS, UI_HELV);
-	layout= uiLayoutBegin(UI_LAYOUT_HORIZONTAL, 8, 3, 0, 24);
+	xco= 8;
+	yco= 3;
 
-	func(C, layout);
+	/* draw all headers types */
+	for(ht= ar->type->headertypes.first; ht; ht= ht->next) {
+		block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS, UI_HELV);
+		layout= uiLayoutBegin(UI_LAYOUT_HORIZONTAL, xco, yco, 0, 24);
 
-	uiLayoutEnd(C, block, layout, &xco, &yco);
-	uiEndBlock(C, block);
-	uiDrawBlock(C, block);
+		if(ht->draw)
+			ht->draw(C, layout);
 
+		uiLayoutEnd(C, block, layout, &xco, &yco);
+		uiEndBlock(C, block);
+		uiDrawBlock(C, block);
+	}
+
 	/* always as last  */
 	UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
+
+	/* restore view matrix? */
+	UI_view2d_view_restore(C);
 }
 
-

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_panel.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_panel.c	2009-03-29 18:46:17 UTC (rev 19451)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_panel.c	2009-03-29 19:44:39 UTC (rev 19452)
@@ -236,6 +236,11 @@
 	return 1;
 }
 
+Panel *uiPanelFromBlock(uiBlock *block)
+{
+	return block->panel;
+}
+
 void uiFreePanels(ListBase *lb)
 {
 	BLI_freelistN(lb);

Modified: branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h	2009-03-29 18:46:17 UTC (rev 19451)
+++ branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h	2009-03-29 19:44:39 UTC (rev 19452)
@@ -28,6 +28,10 @@
 #ifndef ED_BUTTONS_INTERN_H
 #define ED_BUTTONS_INTERN_H
 
+struct ARegion;
+struct ARegionType;
+struct bContext;
+
 /* warning: the values of these defines are used in sbuts->tabs[7] */
 /* buts->mainb new */
 #define CONTEXT_SCENE	0
@@ -73,9 +77,9 @@
 /* internal exports only */
 
 /* image_header.c */
-void buttons_header_buttons(const bContext *C, ARegion *ar);
-void buttons_scene(const bContext *C, ARegion *ar);
-void buttons_object(const bContext *C, ARegion *ar);
+void buttons_header_buttons(const struct bContext *C, struct ARegion *ar);
+void buttons_scene(const struct bContext *C, struct ARegion *ar);
+void buttons_object_register(struct ARegionType *art);
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list