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:
-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;