Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-03-29 23:44:39 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-03-29 23:44:39 +0400
commit6705b6f96ea4255f6bd69a039562ed603a83a83e (patch)
treed8859110c9810e66666ba8add287ca201a0d6238
parent9b7f44ceb56c741af10459924be7775ea91bfa68 (diff)
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.
-rw-r--r--source/blender/blenkernel/BKE_screen.h41
-rw-r--r--source/blender/blenkernel/intern/screen.c5
-rw-r--r--source/blender/editors/include/UI_interface.h11
-rw-r--r--source/blender/editors/interface/interface_layout.c105
-rw-r--r--source/blender/editors/interface/interface_panel.c5
-rw-r--r--source/blender/editors/space_buttons/buttons_intern.h10
-rw-r--r--source/blender/editors/space_buttons/buttons_object.c77
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c79
-rw-r--r--source/blender/editors/space_text/space_text.c61
-rw-r--r--source/blender/editors/space_text/text_header.c50
-rw-r--r--source/blender/editors/space_text/text_intern.h6
-rw-r--r--source/blender/makesdna/DNA_screen_types.h5
12 files changed, 303 insertions, 152 deletions
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index dc1233e7db3..a25a7cff51d 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -36,11 +36,14 @@ struct bContext;
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,12 +125,50 @@ typedef struct ARegionType {
/* 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);
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 33c674d1a7a..483876e5e05 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -54,8 +54,11 @@ static void spacetype_free(SpaceType *st)
{
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);
}
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 234226f63cc..f7d21d0374c 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -42,6 +42,7 @@ struct wmWindowManager;
struct wmOperator;
struct AutoComplete;
struct bContext;
+struct Panel;
struct PointerRNA;
struct PropertyRNA;
struct ReportList;
@@ -508,6 +509,8 @@ extern int uiAlignPanelStep(struct ScrArea *sa, struct ARegion *ar, float fac);
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 @@ void uiItemMenu(uiLayout *layout, int slot, const char *name, int icon, uiMenuCr
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 */
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index ea26bafc1f8..f6f5bae5fa5 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -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 @@ void uiLayoutEnd(const bContext *C, uiBlock *block, uiLayout *layout, int *x, in
/* 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);
+
+ xco= 8;
+ yco= 3;
- block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS, UI_HELV);
- layout= uiLayoutBegin(UI_LAYOUT_HORIZONTAL, 8, 3, 0, 24);
+ /* 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);
- func(C, layout);
+ if(ht->draw)
+ ht->draw(C, layout);
- uiLayoutEnd(C, block, layout, &xco, &yco);
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
+ 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);
+}
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index da70d847176..17a58f8b616 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -236,6 +236,11 @@ int uiNewPanel(const bContext *C, ARegion *ar, uiBlock *block, char *panelname,
return 1;
}
+Panel *uiPanelFromBlock(uiBlock *block)
+{
+ return block->panel;
+}
+
void uiFreePanels(ListBase *lb)
{
BLI_freelistN(lb);
diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h
index 17c4e39ddd6..e979e815e18 100644
--- a/source/blender/editors/space_buttons/buttons_intern.h
+++ b/source/blender/editors/space_buttons/buttons_intern.h
@@ -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);
#endif /* ED_BUTTONS_INTERN_H */
diff --git a/source/blender/editors/space_buttons/buttons_object.c b/source/blender/editors/space_buttons/buttons_object.c
index bb7bf346808..965376b731a 100644
--- a/source/blender/editors/space_buttons/buttons_object.c
+++ b/source/blender/editors/space_buttons/buttons_object.c
@@ -30,14 +30,19 @@
#include <stdio.h>
#include <stdlib.h>
+#include "MEM_guardedalloc.h"
+
#include "DNA_group_types.h"
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "BLI_listbase.h"
+
#include "BKE_context.h"
#include "BKE_group.h"
#include "BKE_main.h"
+#include "BKE_screen.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -46,8 +51,9 @@
#include "WM_types.h"
-static void object_panel_transform(const bContext *C, uiLayout *layout)
+static void object_panel_transform(const bContext *C, Panel *pnl)
{
+ uiLayout *layout= pnl->layout;
Object *ob= CTX_data_active_object(C);
PointerRNA obptr;
@@ -59,8 +65,9 @@ static void object_panel_transform(const bContext *C, uiLayout *layout)
uiItemR(layout, UI_TSLOT_COLUMN_3, NULL, 0, &obptr, "scale");
}
-static void object_panel_groups(const bContext *C, uiLayout *layout)
+static void object_panel_groups(const bContext *C, Panel *pnl)
{
+ uiLayout *layout= pnl->layout;
Main *bmain= CTX_data_main(C);
Object *ob= CTX_data_active_object(C);
Group *group;
@@ -93,8 +100,9 @@ static void object_panel_groups(const bContext *C, uiLayout *layout)
}
}
-static void object_panel_display(const bContext *C, uiLayout *layout)
+static void object_panel_display(const bContext *C, Panel *pnl)
{
+ uiLayout *layout= pnl->layout;
Object *ob= CTX_data_active_object(C);
PointerRNA obptr;
@@ -115,8 +123,9 @@ static void object_panel_display(const bContext *C, uiLayout *layout)
uiItemR(layout, UI_TSLOT_COLUMN_2, "Transparency", 0, &obptr, "draw_transparent");
}
-static void object_panel_duplication(const bContext *C, uiLayout *layout)
+static void object_panel_duplication(const bContext *C, Panel *pnl)
{
+ uiLayout *layout= pnl->layout;
Object *ob= CTX_data_active_object(C);
PointerRNA obptr;
@@ -138,8 +147,9 @@ static void object_panel_duplication(const bContext *C, uiLayout *layout)
}
}
-static void object_panel_animation(const bContext *C, uiLayout *layout)
+static void object_panel_animation(const bContext *C, Panel *pnl)
{
+ uiLayout *layout= pnl->layout;
Object *ob= CTX_data_active_object(C);
PointerRNA obptr;
@@ -159,21 +169,48 @@ static void object_panel_animation(const bContext *C, uiLayout *layout)
uiItemR(layout, UI_TSLOT_COLUMN_2, "Rotation", 0, &obptr, "track_rotation");
}
-void buttons_object(const bContext *C, ARegion *ar)
+void buttons_object_register(ARegionType *art)
{
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
- Object *ob= CTX_data_active_object(C);
- int tab= sbuts->tab[CONTEXT_OBJECT];
-
- if(tab == TAB_OBJECT_OBJECT) {
- if(!ob)
- return;
-
- uiPanelLayout(C, ar, "OBJECT_PT_transform", "Transform", "Object", object_panel_transform, 0);
- uiPanelLayout(C, ar, "OBJECT_PT_groups", "Groups", "Object", object_panel_groups, 1);
- uiPanelLayout(C, ar, "OBJECT_PT_display", "Display", "Object", object_panel_display, 2);
- uiPanelLayout(C, ar, "OBJECT_PT_duplication", "Duplication", "Object", object_panel_duplication, 3);
- uiPanelLayout(C, ar, "OBJECT_PT_animation", "Animation", "Object", object_panel_animation, 4);
- }
+ PanelType *pt;
+
+ /* panels: transform */
+ pt= MEM_callocN(sizeof(PanelType), "spacetype buttons panel");
+ pt->idname= "OBJECT_PT_transform";
+ pt->name= "Transform";
+ pt->context= "object";
+ pt->draw= object_panel_transform;
+ BLI_addtail(&art->paneltypes, pt);
+
+ /* panels: groups */
+ pt= MEM_callocN(sizeof(PanelType), "spacetype buttons panel");
+ pt->idname= "OBJECT_PT_groups";
+ pt->name= "Groups";
+ pt->context= "object";
+ pt->draw= object_panel_groups;
+ BLI_addtail(&art->paneltypes, pt);
+
+ /* panels: display */
+ pt= MEM_callocN(sizeof(PanelType), "spacetype buttons panel");
+ pt->idname= "OBJECT_PT_display";
+ pt->name= "Display";
+ pt->context= "object";
+ pt->draw= object_panel_display;
+ BLI_addtail(&art->paneltypes, pt);
+
+ /* panels: duplication */
+ pt= MEM_callocN(sizeof(PanelType), "spacetype buttons panel");
+ pt->idname= "OBJECT_PT_duplication";
+ pt->name= "Duplication";
+ pt->context= "object";
+ pt->draw= object_panel_duplication;
+ BLI_addtail(&art->paneltypes, pt);
+
+ /* panels: animation */
+ pt= MEM_callocN(sizeof(PanelType), "spacetype buttons panel");
+ pt->idname= "OBJECT_PT_animation";
+ pt->name= "Animation";
+ pt->context= "object";
+ pt->draw= object_panel_animation;
+ BLI_addtail(&art->paneltypes, pt);
}
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index 3205fea2a15..bae318ff454 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -158,41 +158,51 @@ static void buttons_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
- View2D *v2d= &ar->v2d;
- float col[3], fac;
- int align= 0;
-
- /* clear and setup matrix */
- UI_GetThemeColor3fv(TH_BACK, col);
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- UI_view2d_view_ortho(C, v2d);
- /* swapbuffers indicator */
- fac= BLI_frand();
- glColor3f(fac, fac, fac);
- glRecti(20, v2d->cur.ymin+2, 30, v2d->cur.ymin+12);
-
- /* panels */
- if(sbuts->mainb == CONTEXT_SCENE)
- buttons_scene(C, ar);
- else if(sbuts->mainb == CONTEXT_OBJECT)
- buttons_object(C, ar);
- else
- drawnewstuff();
-
- if(sbuts->align)
- if(sbuts->re_align || sbuts->mainbo!=sbuts->mainb || sbuts->tabo!=sbuts->tab[sbuts->mainb])
- align= 1;
+ if(sbuts->mainb == CONTEXT_OBJECT) {
+ int tab= sbuts->tab[CONTEXT_OBJECT];
+ int vertical= (sbuts->align == 2);
- uiDrawPanels(C, 1); // XXX align);
- uiMatchPanelsView2d(ar);
-
- /* reset view matrix */
- UI_view2d_view_restore(C);
-
- /* scrollers? */
+ if(tab == TAB_OBJECT_OBJECT)
+ uiRegionPanelLayout(C, ar, vertical, "object");
+ }
+ else {
+ View2D *v2d= &ar->v2d;
+ float col[3], fac;
+ //int align= 0;
+
+ /* clear and setup matrix */
+ UI_GetThemeColor3fv(TH_BACK, col);
+ glClearColor(col[0], col[1], col[2], 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ UI_view2d_view_ortho(C, v2d);
+
+ /* swapbuffers indicator */
+ fac= BLI_frand();
+ glColor3f(fac, fac, fac);
+ glRecti(20, v2d->cur.ymin+2, 30, v2d->cur.ymin+12);
+
+ /* panels */
+ if(sbuts->mainb == CONTEXT_SCENE)
+ buttons_scene(C, ar);
+ else
+ drawnewstuff();
+
+#if 0
+ if(sbuts->align)
+ if(sbuts->re_align || sbuts->mainbo!=sbuts->mainb || sbuts->tabo!=sbuts->tab[sbuts->mainb])
+ align= 1;
+#endif
+
+ uiDrawPanels(C, 1); // XXX align);
+ uiMatchPanelsView2d(ar);
+
+ /* reset view matrix */
+ UI_view2d_view_restore(C);
+
+ /* scrollers? */
+ }
}
void buttons_operatortypes(void)
@@ -271,6 +281,8 @@ void ED_spacetype_buttons(void)
art->listener= buttons_area_listener;
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES;
+ buttons_object_register(art);
+
BLI_addhead(&st->regiontypes, art);
/* regions: header */
@@ -295,7 +307,6 @@ void ED_spacetype_buttons(void)
BLI_addhead(&st->regiontypes, art);
-
BKE_spacetype_register(st);
}
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 90abd516c5a..89852955ca3 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -344,28 +344,12 @@ static void text_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
static void text_header_area_init(wmWindowManager *wm, ARegion *ar)
{
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
+ ar->v2d.flag &= ~(V2D_PIXELOFS_X|V2D_PIXELOFS_Y); // XXX temporary
}
static void text_header_area_draw(const bContext *C, ARegion *ar)
{
- float col[3];
-
- /* 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);
-
- text_header_buttons(C, ar);
-
- /* restore view matrix? */
- UI_view2d_view_restore(C);
+ uiRegionHeaderLayout(C, ar);
}
/****************** properties region ******************/
@@ -378,20 +362,7 @@ static void text_properties_area_init(wmWindowManager *wm, ARegion *ar)
static void text_properties_area_draw(const bContext *C, ARegion *ar)
{
- float col[3];
-
- /* clear */
- UI_GetThemeColor3fv(TH_HEADER, 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);
-
- text_properties_buttons(C, ar);
-
- /* restore view matrix? */
- UI_view2d_view_restore(C);
+ uiRegionPanelLayout(C, ar, 1, NULL);
}
/********************* registration ********************/
@@ -422,17 +393,6 @@ void ED_spacetype_text(void)
BLI_addhead(&st->regiontypes, art);
- /* regions: header */
- art= MEM_callocN(sizeof(ARegionType), "spacetype text region");
- art->regionid = RGN_TYPE_HEADER;
- art->minsizey= HEADERY;
- art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
-
- art->init= text_header_area_init;
- art->draw= text_header_area_draw;
-
- BLI_addhead(&st->regiontypes, art);
-
/* regions: properties */
art= MEM_callocN(sizeof(ARegionType), "spacetype text region");
art->regionid = RGN_TYPE_UI;
@@ -442,8 +402,23 @@ void ED_spacetype_text(void)
art->init= text_properties_area_init;
art->draw= text_properties_area_draw;
+ text_properties_register(art);
+
BLI_addhead(&st->regiontypes, art);
+
+ /* regions: header */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype text region");
+ art->regionid = RGN_TYPE_HEADER;
+ art->minsizey= HEADERY;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+ art->init= text_header_area_init;
+ art->draw= text_header_area_draw;
+
+ text_header_register(art);
+
+ BLI_addhead(&st->regiontypes, art);
+
BKE_spacetype_register(st);
}
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index 63fd5e6dae6..63e3bca1ad0 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -93,7 +93,7 @@ static void do_text_template_scriptsmenu(bContext *C, void *arg, int event)
// XXX BPY_menu_do_python(PYMENU_SCRIPTTEMPLATE, event);
}
-uiBlock *text_template_scriptsmenu(bContext *C, void *args_unused)
+static uiBlock *text_template_scriptsmenu(bContext *C, void *args_unused)
{
ARegion *ar= CTX_wm_region(C);
uiBlock *block;
@@ -126,7 +126,7 @@ static void do_text_plugin_scriptsmenu(bContext *C, void *arg, int event)
// XXX BPY_menu_do_python(PYMENU_TEXTPLUGIN, event);
}
-uiBlock *text_plugin_scriptsmenu(bContext *C, void *args_unused)
+static uiBlock *text_plugin_scriptsmenu(bContext *C, void *args_unused)
{
ARegion *ar= CTX_wm_region(C);
uiBlock *block;
@@ -195,6 +195,11 @@ static void text_editmenu_to3dmenu(bContext *C, uiMenuItem *head, void *arg_unus
uiMenuItemBooleanO(head, "One Object Per Line", 0, "TEXT_OT_to_3d_object", "split_lines", 1);
}
+static int text_menu_edit_poll(bContext *C)
+{
+ return (CTX_data_edit_text(C) != NULL);
+}
+
static void text_editmenu(bContext *C, uiMenuItem *head, void *arg_unused)
{
uiMenuItemO(head, 0, "ED_OT_undo");
@@ -353,7 +358,7 @@ static void text_idpoin_handle(bContext *C, ID *id, int event)
/********************** header buttons ***********************/
-static void header_buttons(const bContext *C, uiLayout *layout)
+static void text_header_draw(const bContext *C, uiLayout *layout)
{
bScreen *sc= CTX_wm_screen(C);
SpaceText *st= (SpaceText*)CTX_wm_space_data(C);
@@ -411,17 +416,25 @@ static void header_buttons(const bContext *C, uiLayout *layout)
}
}
-void text_header_buttons(const bContext *C, ARegion *ar)
+void text_header_register(ARegionType *art)
{
- uiHeaderLayout(C, ar, header_buttons);
+ HeaderType *ht;
+
+ /* header */
+ ht= MEM_callocN(sizeof(HeaderType), "spacetype text header");
+ ht->idname= "TEXT_HT_header";
+ ht->name= "Header";
+ ht->draw= text_header_draw;
+ BLI_addhead(&art->headertypes, ht);
}
/************************** properties ******************************/
-void properties_buttons(const bContext *C, uiLayout *layout)
+static void text_properties_panel_draw(const bContext *C, Panel *panel)
{
bScreen *sc= CTX_wm_screen(C);
SpaceText *st= CTX_wm_space_text(C);
+ uiLayout *layout= panel->layout;
PointerRNA spaceptr;
RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr);
@@ -436,10 +449,11 @@ void properties_buttons(const bContext *C, uiLayout *layout)
uiItemR(layout, UI_TSLOT_COLUMN_1, NULL, 0, &spaceptr, "tab_width");
}
-void find_buttons(const bContext *C, uiLayout *layout)
+static void text_find_panel_draw(const bContext *C, Panel *panel)
{
bScreen *sc= CTX_wm_screen(C);
SpaceText *st= CTX_wm_space_text(C);
+ uiLayout *layout= panel->layout;
PointerRNA spaceptr;
RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr);
@@ -468,13 +482,23 @@ void find_buttons(const bContext *C, uiLayout *layout)
uiItemR(layout, UI_TSLOT_COLUMN_2, "All", 0, &spaceptr, "find_all");
}
-void text_properties_buttons(const bContext *C, ARegion *ar)
+void text_properties_register(ARegionType *art)
{
- uiCompactPanelLayout(C, ar, "TEXT_OT_properties", "Properties", "Text", properties_buttons, 0);
- uiCompactPanelLayout(C, ar, "TEXT_OT_find", "Find", "Text", find_buttons, 1);
-
- uiDrawPanels(C, 1);
- uiMatchPanelsView2d(ar);
+ PanelType *pt;
+
+ /* panels: properties */
+ pt= MEM_callocN(sizeof(PanelType), "spacetype text panel");
+ pt->idname= "TEXT_PT_properties";
+ pt->name= "Properties";
+ pt->draw= text_properties_panel_draw;
+ BLI_addtail(&art->paneltypes, pt);
+
+ /* panels: find */
+ pt= MEM_callocN(sizeof(PanelType), "spacetype text panel");
+ pt->idname= "TEXT_PT_find";
+ pt->name= "Find";
+ pt->draw= text_find_panel_draw;
+ BLI_addtail(&art->paneltypes, pt);
}
ARegion *text_has_properties_region(ScrArea *sa)
diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h
index 746858a9fdd..7ec75e292ce 100644
--- a/source/blender/editors/space_text/text_intern.h
+++ b/source/blender/editors/space_text/text_intern.h
@@ -31,6 +31,7 @@
/* internal exports only */
struct ARegion;
+struct ARegionType;
struct bContext;
struct BMF_Font;
struct ReportList;
@@ -42,9 +43,8 @@ struct wmOperatorType;
struct wmWindowManager;
/* text_header.c */
-void text_header_buttons(const struct bContext *C, struct ARegion *ar);
-void text_find_buttons(const struct bContext *C, struct ARegion *ar);
-void text_properties_buttons(const struct bContext *C, struct ARegion *ar);
+void text_properties_register(struct ARegionType *art);
+void text_header_register(struct ARegionType *art);
/* text_draw.c */
void draw_text_main(struct SpaceText *st, struct ARegion *ar);
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index d90527040dd..4ab9aa55b42 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -38,7 +38,9 @@ struct SpaceType;
struct SpaceLink;
struct ARegion;
struct ARegionType;
+struct PanelType;
struct Scene;
+struct uiLayout;
struct wmTimer;
typedef struct bScreen {
@@ -88,6 +90,9 @@ typedef struct ScrEdge {
typedef struct Panel { /* the part from uiBlock that needs saved in file */
struct Panel *next, *prev;
+ struct PanelType *type; /* runtime */
+ struct uiLayout *layout; /* runtime for drawing */
+
char panelname[64], tabname[64]; /* defined as UI_MAX_NAME_STR */
char drawname[64]; /* panelname is identifier for restoring location */
short ofsx, ofsy, sizex, sizey;