diff options
-rw-r--r-- | source/blender/blenkernel/BKE_screen.h | 41 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/screen.c | 5 | ||||
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 11 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 105 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_panel.c | 5 | ||||
-rw-r--r-- | source/blender/editors/space_buttons/buttons_intern.h | 10 | ||||
-rw-r--r-- | source/blender/editors/space_buttons/buttons_object.c | 77 | ||||
-rw-r--r-- | source/blender/editors/space_buttons/space_buttons.c | 79 | ||||
-rw-r--r-- | source/blender/editors/space_text/space_text.c | 61 | ||||
-rw-r--r-- | source/blender/editors/space_text/text_header.c | 50 | ||||
-rw-r--r-- | source/blender/editors/space_text/text_intern.h | 6 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_screen_types.h | 5 |
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; |