WIP commit for UI drawing.

- Hooked up Diego's new Font API
- Added Style definitions for fonts, currently it uses
  a different font for panel titles to show it.
- Styles are in Userdef now too, still not finished 
- Userdef "DPI" will offer global control over font size,
  to match monitor size/resolution. It's meant to scale
  widgets and headers too btw, later.
- Lots of code removed for old fonts, but that's unfinished.

On todo: too much to mention, will continue happily tomorrow!
This commit is contained in:
Ton Roosendaal 2009-04-09 18:11:18 +00:00
parent 46d8c1ebc7
commit 79c30a0752
8 changed files with 454 additions and 508 deletions

@ -46,6 +46,7 @@ struct Panel;
struct PointerRNA;
struct PropertyRNA;
struct ReportList;
struct rcti;
typedef struct uiBut uiBut;
typedef struct uiBlock uiBlock;
@ -128,11 +129,12 @@ typedef struct uiPopupBlockHandle uiPopupBlockHandle;
#define UI_BUT_ALIGN_DOWN (1<<17)
#define UI_BUT_DISABLED (1<<18)
/* dont draw hilite on mouse over */
/* dont draw hilite on mouse over */
#define UI_NO_HILITE (1<<19)
#define UI_BUT_ANIMATED (1<<20)
#define UI_BUT_ANIMATED_KEY (1<<21)
/* Button types, bits stored in 1 value... and a short even!
- bits 0-4: bitnr (0-31)
- bits 5-7: pointer type
@ -631,5 +633,10 @@ void uiRegionHeaderLayout(const struct bContext *C, struct ARegion *ar);
void uiAnimContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index);
/* Styled text draw */
void uiFontStyleDraw(struct uiFontStyle *fs, struct rcti *rect, char *str);
#endif /* UI_INTERFACE_H */

@ -88,7 +88,7 @@ static void ui_rna_ID_autocomplete(bContext *C, char *str, void *arg_but);
/* ************ GLOBALS ************* */
static uiFont UIfont[UI_ARRAY]; // no init needed
static uiFontOld UIfont[UI_ARRAY]; // no init needed
/* ************* translation ************** */
@ -643,11 +643,34 @@ void uiEndBlock(const bContext *C, uiBlock *block)
/* ************** BLOCK DRAWING FUNCTION ************* */
/* project button or block (but==NULL) to pixels in regionspace */
static void ui_but_to_pixelrect(rcti *rect, const ARegion *ar, uiBlock *block, uiBut *but)
{
float gx, gy;
float getsizex, getsizey;
getsizex= ar->winx;
getsizey= ar->winy;
gx= (but?but->x1:block->minx) + (block->panel?block->panel->ofsx:0.0f);
gy= (but?but->y1:block->miny) + (block->panel?block->panel->ofsy:0.0f);
rect->xmin= floor(getsizex*(0.5+ 0.5*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0])));
rect->ymin= floor(getsizey*(0.5+ 0.5*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1])));
gx= (but?but->x2:block->maxx) + (block->panel?block->panel->ofsx:0.0f);
gy= (but?but->y2:block->maxy) + (block->panel?block->panel->ofsy:0.0f);
rect->xmax= floor(getsizex*(0.5+ 0.5*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0])));
rect->ymax= floor(getsizey*(0.5+ 0.5*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1])));
}
void uiDrawBlock(const bContext *C, uiBlock *block)
{
ARegion *ar;
uiBut *but;
rcti rect;
/* get menu region or area region */
ar= CTX_wm_menu(C);
if(!ar)
@ -659,13 +682,6 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
/* we set this only once */
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if(block->flag & UI_BLOCK_LOOP)
ui_draw_menu_back(block);
else if(block->panel)
ui_draw_panel(ar, block);
if(block->drawextra) block->drawextra(C, block);
/* pixel space for AA widgets */
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@ -675,9 +691,21 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
wmOrtho2(0.0f, ar->winx, 0.0f, ar->winy);
for(but= block->buttons.first; but; but= but->next)
ui_draw_but(ar, but);
/* back */
ui_but_to_pixelrect(&rect, ar, block, NULL);
if(block->flag & UI_BLOCK_LOOP)
ui_draw_menu_back(block, &rect);
else if(block->panel)
ui_draw_panel(ar, block, &rect);
if(block->drawextra) block->drawextra(C, block);
/* widgets */
for(but= block->buttons.first; but; but= but->next) {
ui_but_to_pixelrect(&rect, ar, block, but);
ui_draw_but(ar, but, &rect);
}
/* restore matrix */
glMatrixMode(GL_PROJECTION);
glPopMatrix();
@ -3287,12 +3315,14 @@ void UI_init(void)
void UI_init_userdef()
{
uiStyleInit();
ui_text_init_userdef();
ui_theme_init_userdef();
}
void UI_exit(void)
{
uiStyleExit();
ui_resources_free();
}

@ -39,6 +39,7 @@ struct IDProperty;
struct uiHandleButtonData;
struct wmEvent;
struct wmWindow;
struct uiFontStyle;
/* ****************** general defines ************** */
@ -121,7 +122,7 @@ typedef struct {
typedef struct {
void *xl, *large, *medium, *small;
} uiFont;
} uiFontOld;
typedef struct uiLinkLine { /* only for draw/edit */
struct uiLinkLine *next, *prev;
@ -361,12 +362,10 @@ void autocomplete_end(struct AutoComplete *autocpl, char *autoname);
/* interface_panel.c */
extern int ui_handler_panel_region(struct bContext *C, struct wmEvent *event);
extern void ui_draw_panel(struct ARegion *ar, uiBlock *block);
extern void ui_draw_panel(struct ARegion *ar, uiBlock *block, rcti *rect);
/* interface_draw.c */
extern void ui_rasterpos_safe(float x, float y, float aspect);
extern void ui_draw_tria_icon(float x, float y, float aspect, char dir);
extern void ui_draw_anti_x(float x1, float y1, float x2, float y2);
extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
@ -383,8 +382,12 @@ extern void ui_button_active_cancel(const struct bContext *C, uiBut *but);
/* interface_widgets.c */
void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3);
void ui_draw_menu_back(uiBlock *block);
extern void ui_draw_but(ARegion *ar, uiBut *but);
void ui_draw_menu_back(uiBlock *block, rcti *rect);
extern void ui_draw_but(ARegion *ar, uiBut *but, rcti *rect);
/* interface_style.c */
void uiStyleInit(void);
void uiStyleExit(void);
/* interface_anim.c */
void ui_but_anim_flag(uiBut *but, float cfra);

@ -20,9 +20,7 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
* Contributor(s): Blender Foundation, 2003-2009 full recode.
*
* ***** END GPL LICENSE BLOCK *****
*/
@ -451,7 +449,7 @@ uiBlock *uiFindOpenPanelBlockName(ListBase *lb, char *name)
}
/* triangle 'icon' for panel header */
void ui_draw_tria_icon(float x, float y, float aspect, char dir)
void ui_draw_tria_icon(float x, float y, char dir)
{
if(dir=='h') {
ui_draw_anti_tria( x-1, y, x-1, y+11.0, x+9, y+6.25);
@ -489,155 +487,17 @@ static void ui_draw_x_icon(float x, float y)
}
#if 0
static void ui_set_panel_pattern(char dir)
{
static int firsttime= 1;
static GLubyte path[4*32], patv[4*32];
int a,b,i=0;
if(firsttime) {
firsttime= 0;
for(a=0; a<128; a++) patv[a]= 0x33;
for(a=0; a<8; a++) {
for(b=0; b<4; b++) path[i++]= 0xff; /* 1 scanlines */
for(b=0; b<12; b++) path[i++]= 0x0; /* 3 lines */
}
}
glEnable(GL_POLYGON_STIPPLE);
if(dir=='h') glPolygonStipple(path);
else glPolygonStipple(patv);
}
#endif
static char *ui_block_cut_str(uiBlock *block, char *str, short okwidth)
{
short width, ofs=strlen(str);
static char str1[128];
if(ofs>127) return str;
width= block->aspect*UI_GetStringWidth(block->curfont, str, ui_translate_buttons());
if(width <= okwidth) return str;
strcpy(str1, str);
while(width > okwidth && ofs>0) {
ofs--;
str1[ofs]= 0;
width= block->aspect*UI_GetStringWidth(block->curfont, str1, 0);
if(width < 10) break;
}
return str1;
}
#define PNL_ICON 20
#define PNL_DRAGGER 20
static void ui_draw_panel_header(ARegion *ar, uiBlock *block)
{
Panel *pa, *panel= block->panel;
float width;
int a, nr= 1, pnl_icons;
char *activename= panel->drawname[0]?panel->drawname:panel->panelname;
char *panelname, *str;
/* count */
for(pa= ar->panels.first; pa; pa=pa->next)
if(pa->active)
if(pa->paneltab==panel)
nr++;
pnl_icons= PNL_ICON+8;
if(panel->control & UI_PNL_CLOSE) pnl_icons+= PNL_ICON;
if(nr==1) {
// full header
UI_ThemeColorShade(TH_HEADER, -30);
uiSetRoundBox(3);
uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
/* active tab */
/* draw text label */
UI_ThemeColor(TH_TEXT_HI);
ui_rasterpos_safe(4.0f+block->minx+pnl_icons, block->maxy+5.0f, block->aspect);
UI_DrawString(block->curfont, activename, ui_translate_buttons());
return;
}
// tabbed, full header brighter
//UI_ThemeColorShade(TH_HEADER, 0);
//uiSetRoundBox(3);
//uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
a= 0;
width= (panel->sizex - 3 - pnl_icons - PNL_ICON)/nr;
for(pa= ar->panels.first; pa; pa=pa->next) {
panelname= pa->drawname[0]?pa->drawname:pa->panelname;
if(a == 0)
activename= panelname;
if(pa->active==0);
else if(pa==panel) {
/* active tab */
/* draw the active tab */
uiSetRoundBox(3);
UI_ThemeColorShade(TH_HEADER, -3);
uiRoundBox(2+pnl_icons+a*width, panel->sizey-1, pnl_icons+(a+1)*width, panel->sizey+PNL_HEADER-3, 8);
/* draw the active text label */
UI_ThemeColor(TH_TEXT);
ui_rasterpos_safe(16+pnl_icons+a*width, panel->sizey+4, block->aspect);
if(panelname != activename && strstr(panelname, activename) == panelname)
str= ui_block_cut_str(block, panelname+strlen(activename), (short)(width-10));
else
str= ui_block_cut_str(block, panelname, (short)(width-10));
UI_DrawString(block->curfont, str, ui_translate_buttons());
a++;
}
else if(pa->paneltab==panel) {
/* draw an inactive tab */
uiSetRoundBox(3);
UI_ThemeColorShade(TH_HEADER, -60);
uiRoundBox(2+pnl_icons+a*width, panel->sizey, pnl_icons+(a+1)*width, panel->sizey+PNL_HEADER-3, 8);
/* draw an inactive tab label */
UI_ThemeColorShade(TH_TEXT_HI, -40);
ui_rasterpos_safe(16+pnl_icons+a*width, panel->sizey+4, block->aspect);
if(panelname != activename && strstr(panelname, activename) == panelname)
str= ui_block_cut_str(block, panelname+strlen(activename), (short)(width-10));
else
str= ui_block_cut_str(block, panelname, (short)(width-10));
UI_DrawString(block->curfont, str, ui_translate_buttons());
a++;
}
}
// dragger
/*
uiSetRoundBox(15);
UI_ThemeColorShade(TH_HEADER, -70);
uiRoundBox(panel->sizex-PNL_ICON+5, panel->sizey+5, panel->sizex-5, panel->sizey+PNL_HEADER-5, 5);
*/
}
static void ui_draw_panel_scalewidget(uiBlock *block)
static void ui_draw_panel_scalewidget(rcti *rect)
{
float xmin, xmax, dx;
float ymin, ymax, dy;
xmin= block->maxx-PNL_HEADER+2;
xmax= block->maxx-3;
ymin= block->miny+3;
ymax= block->miny+PNL_HEADER-2;
xmin= rect->xmax-PNL_HEADER+2;
xmax= rect->xmax-3;
ymin= rect->ymin+3;
ymax= rect->ymin+PNL_HEADER-2;
dx= 0.5f*(xmax-xmin);
dy= 0.5f*(ymax-ymin);
@ -648,20 +508,20 @@ static void ui_draw_panel_scalewidget(uiBlock *block)
fdrawline(xmin+dx, ymin, xmax, ymax-dy);
glColor4ub(0, 0, 0, 50);
fdrawline(xmin, ymin+block->aspect, xmax, ymax+block->aspect);
fdrawline(xmin+dx, ymin+block->aspect, xmax, ymax-dy+block->aspect);
fdrawline(xmin, ymin+1, xmax, ymax+1);
fdrawline(xmin+dx, ymin+1, xmax, ymax-dy+1);
glDisable(GL_BLEND);
}
static void ui_draw_panel_dragwidget(uiBlock *block)
static void ui_draw_panel_dragwidget(rcti *rect)
{
float xmin, xmax, dx;
float ymin, ymax, dy;
xmin= block->maxx-10-PNL_HEADER+8;
xmax= block->maxx-10;
ymin= block->maxy+4;
ymax= block->maxy+PNL_HEADER-4;
xmin= rect->xmax-10-PNL_HEADER+8;
xmax= rect->xmax-10;
ymin= rect->ymax+4;
ymax= rect->ymax+PNL_HEADER-4;
dx= 0.333f*(xmax-xmin);
dy= 0.333f*(ymax-ymin);
@ -673,203 +533,23 @@ static void ui_draw_panel_dragwidget(uiBlock *block)
fdrawline(xmin+2*dx, ymax, xmax, ymin+2*dy);
glColor4ub(0, 0, 0, 50);
fdrawline(xmin, ymax+block->aspect, xmax, ymin+block->aspect);
fdrawline(xmin+dx, ymax+block->aspect, xmax, ymin+dy+block->aspect);
fdrawline(xmin+2*dx, ymax+block->aspect, xmax, ymin+2*dy+block->aspect);
fdrawline(xmin, ymax+1, xmax, ymin+1);
fdrawline(xmin+dx, ymax+1, xmax, ymin+dy+1);
fdrawline(xmin+2*dx, ymax+1, xmax, ymin+2*dy+1);
glDisable(GL_BLEND);
}
static void ui_draw_panel_old(ARegion *ar, uiBlock *block)
static void ui_draw_panel_header_style(ARegion *ar, uiStyle *style, Panel *panel, rcti *rect)
{
Panel *panel= block->panel;
int ofsx;
char *panelname= panel->drawname[0]?panel->drawname:panel->panelname;
if(panel->paneltab) return;
/* if the panel is minimized vertically:
* (------)
*/
if(panel->flag & PNL_CLOSEDY) {
/* draw a little rounded box, the size of the header */
uiSetRoundBox(15);
UI_ThemeColorShade(TH_HEADER, -30);
uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
/* title */
ofsx= PNL_ICON+8;
if(panel->control & UI_PNL_CLOSE) ofsx+= PNL_ICON;
UI_ThemeColor(TH_TEXT_HI);
ui_rasterpos_safe(4+block->minx+ofsx, block->maxy+5, block->aspect);
UI_DrawString(block->curfont, panelname, ui_translate_buttons());
/* border */
if(panel->flag & PNL_SELECT) {
UI_ThemeColorShade(TH_HEADER, -120);
uiRoundRect(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
}
/* if it's being overlapped by a panel being dragged */
if(panel->flag & PNL_OVERLAP) {
UI_ThemeColor(TH_TEXT_HI);
uiRoundRect(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
}
}
/* if the panel is minimized horizontally:
* /-\
* |
* |
* |
* \_/
*/
else if(panel->flag & PNL_CLOSEDX) {
char str[4];
int a, end, ofs;
/* draw a little rounded box, the size of the header, rotated 90 deg */
uiSetRoundBox(15);
UI_ThemeColorShade(TH_HEADER, -30);
uiRoundBox(block->minx, block->miny, block->minx+PNL_HEADER, block->maxy+PNL_HEADER, 8);
/* title, only the initial character for now */
UI_ThemeColor(TH_TEXT_HI);
str[1]= 0;
end= strlen(panelname);
ofs= 20;
for(a=0; a<end; a++) {
str[0]= panelname[a];
if( isupper(str[0]) ) {
ui_rasterpos_safe(block->minx+5, block->maxy-ofs, block->aspect);
UI_DrawString(block->curfont, str, 0);
ofs+= 15;
}
}
/* border */
if(panel->flag & PNL_SELECT) {
UI_ThemeColorShade(TH_HEADER, -120);
uiRoundRect(block->minx, block->miny, block->minx+PNL_HEADER, block->maxy+PNL_HEADER, 8);
}
if(panel->flag & PNL_OVERLAP) {
UI_ThemeColor(TH_TEXT_HI);
uiRoundRect(block->minx, block->miny, block->minx+PNL_HEADER, block->maxy+PNL_HEADER, 8);
}
}
/* an open panel */
else {
/* all panels now... */
if(panel->control & UI_PNL_SOLID) {
UI_ThemeColorShade(TH_HEADER, -30);
uiSetRoundBox(3);
uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
glEnable(GL_BLEND);
UI_ThemeColor4(TH_PANEL);
uiSetRoundBox(12);
/* bad code... but its late :) */
if(strcmp(block->name, "image_panel_preview")==0)
uiRoundRect(block->minx, block->miny, block->maxx, block->maxy, 8);
else
uiRoundBox(block->minx, block->miny, block->maxx, block->maxy, 8);
// glRectf(block->minx, block->miny, block->maxx, block->maxy);
/* shadow */
/*
glColor4ub(0, 0, 0, 40);
fdrawline(block->minx+2, block->miny-1, block->maxx+1, block->miny-1);
fdrawline(block->maxx+1, block->miny-1, block->maxx+1, block->maxy+7);
glColor4ub(0, 0, 0, 10);
fdrawline(block->minx+3, block->miny-2, block->maxx+2, block->miny-2);
fdrawline(block->maxx+2, block->miny-2, block->maxx+2, block->maxy+6);
*/
glDisable(GL_BLEND);
}
/* floating panel */
else if(panel->control & UI_PNL_TRANSP) {
UI_ThemeColorShade(TH_HEADER, -30);
uiSetRoundBox(3);
uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
glEnable(GL_BLEND);
UI_ThemeColor4(TH_PANEL);
glRectf(block->minx, block->miny, block->maxx, block->maxy);
glDisable(GL_BLEND);
}
/* draw the title, tabs, etc in the header */
ui_draw_panel_header(ar, block);
/* in some occasions, draw a border */
if(panel->flag & PNL_SELECT) {
if(panel->control & UI_PNL_SOLID) uiSetRoundBox(15);
else uiSetRoundBox(3);
UI_ThemeColorShade(TH_HEADER, -120);
uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 8);
}
if(panel->flag & PNL_OVERLAP) {
if(panel->control & UI_PNL_SOLID) uiSetRoundBox(15);
else uiSetRoundBox(3);
UI_ThemeColor(TH_TEXT_HI);
uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 8);
}
if(panel->control & UI_PNL_SCALE)
ui_draw_panel_scalewidget(block);
/* and a soft shadow-line for now */
/*
glEnable( GL_BLEND );
glColor4ub(0, 0, 0, 50);
fdrawline(block->maxx, block->miny, block->maxx, block->maxy+PNL_HEADER/2);
fdrawline(block->minx, block->miny, block->maxx, block->miny);
glDisable(GL_BLEND);
*/
}
/* draw optional close icon */
ofsx= 6;
if(panel->control & UI_PNL_CLOSE) {
ui_draw_x_icon(block->minx+2+ofsx, block->maxy+5);
ofsx= 22;
}
/* draw collapse icon */
UI_ThemeColor(TH_TEXT_HI);
if(panel->flag & PNL_CLOSEDY)
ui_draw_tria_icon(block->minx+6+ofsx, block->maxy+5, block->aspect, 'h');
else if(panel->flag & PNL_CLOSEDX)
ui_draw_tria_icon(block->minx+7, block->maxy+2, block->aspect, 'h');
else
ui_draw_tria_icon(block->minx+6+ofsx, block->maxy+5, block->aspect, 'v');
}
static void ui_draw_panel_header_style(ARegion *ar, uiBlock *block)
{
Panel *pa, *panel= block->panel;
Panel *pa;
rcti hrect;
float width;
int a, nr= 1, pnl_icons;
char *activename= panel->drawname[0]?panel->drawname:panel->panelname;
char *panelname, *str;
char *panelname;
ui_draw_panel_dragwidget(block);
ui_draw_panel_dragwidget(rect);
/* count */
for(pa= ar->panels.first; pa; pa=pa->next)
@ -881,11 +561,17 @@ static void ui_draw_panel_header_style(ARegion *ar, uiBlock *block)
if(panel->control & UI_PNL_CLOSE) pnl_icons+= PNL_ICON;
if(nr==1) {
/* active tab */
/* draw text label */
UI_ThemeColor(TH_TEXT);
ui_rasterpos_safe(4.0f+block->minx+pnl_icons, block->maxy+5.0f, block->aspect);
UI_DrawString(block->curfont, activename, ui_translate_buttons());
hrect.xmin= rect->xmin+pnl_icons;
hrect.ymin= rect->ymax;
hrect.xmax= rect->xmax;
hrect.ymax= rect->ymax + PNL_HEADER;
uiFontStyleDraw(&style->paneltitle, &hrect, activename);
return;
}
@ -893,44 +579,28 @@ static void ui_draw_panel_header_style(ARegion *ar, uiBlock *block)
width= (panel->sizex - 3 - pnl_icons - PNL_ICON)/nr;
for(pa= ar->panels.first; pa; pa=pa->next) {
panelname= pa->drawname[0]?pa->drawname:pa->panelname;
if(a == 0)
activename= panelname;
if(pa->active==0);
else if(pa==panel) {
if(pa->active && (pa==panel || pa->paneltab==panel)) {
/* active tab */
/* draw the active text label */
UI_ThemeColor(TH_TEXT);
ui_rasterpos_safe(16+pnl_icons+a*width, panel->sizey+4, block->aspect);
if(panelname != activename && strstr(panelname, activename) == panelname)
str= ui_block_cut_str(block, panelname+strlen(activename), (short)(width-10));
if(pa==panel)
UI_ThemeColor(TH_TEXT);
else
str= ui_block_cut_str(block, panelname, (short)(width-10));
UI_DrawString(block->curfont, str, ui_translate_buttons());
UI_ThemeColorBlend(TH_TEXT, TH_BACK, 0.5f);
a++;
}
else if(pa->paneltab==panel) {
/* draw an inactive tab label */
UI_ThemeColorBlend(TH_TEXT, TH_BACK, 0.5f);
ui_rasterpos_safe(16+pnl_icons+a*width, panel->sizey+4, block->aspect);
if(panelname != activename && strstr(panelname, activename) == panelname)
str= ui_block_cut_str(block, panelname+strlen(activename), (short)(width-10));
else
str= ui_block_cut_str(block, panelname, (short)(width-10));
UI_DrawString(block->curfont, str, ui_translate_buttons());
hrect.xmin= rect->xmin+pnl_icons + a*width;
hrect.ymin= rect->ymax;
hrect.xmax= hrect.xmin + width;
hrect.ymax= hrect.ymin + PNL_HEADER;
uiFontStyleDraw(&style->paneltitle, &hrect, panelname);
a++;
}
}
}
/* XXX has follow style definitions still */
static void ui_draw_panel_style(ARegion *ar, uiBlock *block)
void ui_draw_panel(ARegion *ar, uiBlock *block, rcti *rect)
{
uiStyle *style= U.uistyles.first; // XXX pass on
Panel *panel= block->panel, *prev;
int ofsx;
@ -944,21 +614,21 @@ static void ui_draw_panel_style(ARegion *ar, uiBlock *block)
}
if(prev) {
float minx= block->minx+10;
float maxx= block->maxx-10;
float y= block->maxy + PNL_HEADER;
float minx= rect->xmin+10;
float maxx= rect->xmax-10;
float y= rect->ymax + PNL_HEADER;
glEnable(GL_BLEND);
glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
fdrawline(minx, y, maxx, y);
glColor4f(1.0f, 1.0f, 1.0f, 0.25f);
fdrawline(minx, y-block->aspect, maxx, y-block->aspect);
fdrawline(minx, y-1, maxx, y-1);
glDisable(GL_BLEND);
}
/* title */
if(!(panel->flag & PNL_CLOSEDX)) {
ui_draw_panel_header_style(ar, block);
ui_draw_panel_header_style(ar, style, panel, rect);
}
/* if the panel is minimized vertically:
@ -970,7 +640,7 @@ static void ui_draw_panel_style(ARegion *ar, uiBlock *block)
/* if it's being overlapped by a panel being dragged */
if(panel->flag & PNL_OVERLAP) {
UI_ThemeColor(TH_TEXT_HI);
uiRoundRect(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
uiRoundRect(rect->xmin, rect->ymax, rect->xmax, rect->ymax+PNL_HEADER, 8);
}
}
@ -986,18 +656,18 @@ static void ui_draw_panel_style(ARegion *ar, uiBlock *block)
else uiSetRoundBox(3);
UI_ThemeColorShade(TH_HEADER, -120);
uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 8);
uiRoundRect(rect->xmin, rect->ymin, rect->xmax, rect->ymax+PNL_HEADER, 8);
}
if(panel->flag & PNL_OVERLAP) {
if(panel->control & UI_PNL_SOLID) uiSetRoundBox(15);
else uiSetRoundBox(3);
UI_ThemeColor(TH_TEXT_HI);
uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 8);
uiRoundRect(rect->xmin, rect->ymin, rect->xmax, rect->ymax+PNL_HEADER, 8);
}
if(panel->control & UI_PNL_SCALE)
ui_draw_panel_scalewidget(block);
ui_draw_panel_scalewidget(rect);
}
/* draw optional close icon */
@ -1005,7 +675,7 @@ static void ui_draw_panel_style(ARegion *ar, uiBlock *block)
ofsx= 6;
if(panel->control & UI_PNL_CLOSE) {
ui_draw_x_icon(block->minx+2+ofsx, block->maxy+2);
ui_draw_x_icon(rect->xmin+2+ofsx, rect->ymax+2);
ofsx= 22;
}
@ -1013,23 +683,16 @@ static void ui_draw_panel_style(ARegion *ar, uiBlock *block)
UI_ThemeColor(TH_TEXT);
if(panel->flag & PNL_CLOSEDY)
ui_draw_tria_icon(block->minx+6+ofsx, block->maxy+1, block->aspect, 'h');
ui_draw_tria_icon(rect->xmin+6+ofsx, rect->ymax+3, 'h');
else if(panel->flag & PNL_CLOSEDX)
ui_draw_tria_icon(block->minx+7, block->maxy+1, block->aspect, 'h');
ui_draw_tria_icon(rect->xmin+7, rect->ymax+3, 'h');
else
ui_draw_tria_icon(block->minx+6+ofsx, block->maxy+1, block->aspect, 'v');
ui_draw_tria_icon(rect->xmin+6+ofsx, rect->ymax+3, 'v');
}
void ui_draw_panel(ARegion *ar, uiBlock *block)
{
ui_draw_panel_style(ar, block);
if(0) ui_draw_panel_old(ar, block); // XXX
}
/* ------------ panel alignment ---------------- */
@ -1352,17 +1015,13 @@ void uiEndPanels(const bContext *C, ARegion *ar)
/* draw panels, selected on top */
for(block= ar->uiblocks.first; block; block=block->next) {
if(block->active && block->panel && !(block->panel->flag & PNL_SELECT)) {
uiPanelPush(block);
uiDrawBlock(C, block);
uiPanelPop(block);
}
}
for(block= ar->uiblocks.first; block; block=block->next) {
if(block->active && block->panel && (block->panel->flag & PNL_SELECT)) {
uiPanelPush(block);
uiDrawBlock(C, block);
uiPanelPop(block);
}
}
}

@ -0,0 +1,202 @@
/**
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2009 Blender Foundation.
* All rights reserved.
*
* Contributor(s): Blender Foundation
*
* ***** END GPL LICENSE BLOCK *****
*/
#include <limits.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
#include "DNA_screen_types.h"
#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
#include "BLI_arithb.h"
#include "BLI_listbase.h"
#include "BLI_rect.h"
#include "BLI_string.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "BLF_api.h"
#include "UI_interface.h"
#include "UI_interface_icons.h"
#include "UI_resources.h"
#include "UI_text.h"
#include "UI_view2d.h"
#include "ED_datafiles.h"
#include "ED_util.h"
#include "ED_types.h"
#include "interface_intern.h"
/* style + theme + layout-engine = UI */
/*
This is a complete set of layout rules, the 'state' of the Layout
Engine. Multiple styles are possible, defined via C or Python. Styles
get a name, and will typically get activated per region type, like
"Header", or "Listview" or "Toolbar". Properties of Style definitions
are:
- default collumn properties, internal spacing, aligning, min/max width
- button alignment rules (for groups)
- label placement rules
- internal labeling or external labeling default
- default minimum widths for buttons/labels (in amount of characters)
- font types, styles and relative sizes for Panel titles, labels, etc.
*/
/* ********************************************** */
static uiStyle *ui_style_new(ListBase *styles, const char *name)
{
uiStyle *style= MEM_callocN(sizeof(uiStyle), "new style");
BLI_addtail(styles, style);
BLI_strncpy(style->name, name, MAX_STYLE_NAME);
style->paneltitle.uifont_id= UIFONT_DEFAULT;
style->paneltitle.points= 14;
style->paneltitle.shadow= 3;
style->paneltitle.shadowalpha= 0.25f;
style->grouplabel.uifont_id= UIFONT_DEFAULT;
style->grouplabel.points= 12;
style->paneltitle.shadow= 3;
style->grouplabel.shadowalpha= 0.25f;
style->widgetlabel.uifont_id= UIFONT_DEFAULT;
style->widgetlabel.points= 11;
style->widgetlabel.shadowalpha= 0.25f;
style->widget.uifont_id= UIFONT_DEFAULT;
style->widget.points= 11;
style->widget.shadowalpha= 0.25f;
return style;
}
static uiFont *uifont_to_blfont(int id)
{
uiFont *font= U.uifonts.first;
for(; font; font= font->next) {
if(font->uifont_id==id) {
return font;
}
}
return NULL;
}
/* *************** draw ************************ */
void uiFontStyleDraw(uiFontStyle *fs, rcti *rect, char *str)
{
uiFont *font= uifont_to_blfont(fs->uifont_id);
float height;
int xofs=0, yofs;
BLF_set(font->blf_id);
BLF_size(fs->points, U.dpi);
height= BLF_height("A");
yofs= floor( 0.5f*(rect->ymax - rect->ymin - height));
if(fs->align==UI_STYLE_TEXT_CENTER)
xofs= floor( 0.5f*(rect->xmax - rect->xmin - BLF_width(str)));
BLF_position(rect->xmin+xofs, rect->ymin+yofs, 0.0f);
BLF_draw(str);
}
/* ************** init exit ************************ */
/* called on each .B.blend read */
/* reading without uifont will create one */
void uiStyleInit(void)
{
uiFont *font= U.uifonts.first;
uiStyle *style= U.uistyles.first;
/* recover from uninitialized dpi */
CLAMP(U.dpi, 72, 240);
/* default builtin */
if(font==NULL) {
font= MEM_callocN(sizeof(uiFont), "ui font");
BLI_addtail(&U.uifonts, font);
strcpy(font->filename, "default");
font->uifont_id= UIFONT_DEFAULT;
}
for(font= U.uifonts.first; font; font= font->next) {
if(font->uifont_id==UIFONT_DEFAULT) {
font->blf_id= BLF_load_mem("default", (unsigned char*)datatoc_bfont_ttf, datatoc_bfont_ttf_size);
}
else {
font->blf_id= BLF_load(font->filename);
if(font->blf_id == -1)
font->blf_id= BLF_load_mem("default", (unsigned char*)datatoc_bfont_ttf, datatoc_bfont_ttf_size);
}
if (font->blf_id == -1)
printf("uiStyleInit error, no fonts available\n");
else {
BLF_set(font->blf_id);
BLF_size(11, U.dpi); /* ? just for speed to initialize? */
BLF_size(12, U.dpi);
BLF_size(14, U.dpi);
}
}
if(style==NULL) {
ui_style_new(&U.uistyles, "Default Style");
}
}
void uiStyleExit(void)
{
BLI_freelistN(&U.uifonts);
BLI_freelistN(&U.uistyles);
}

@ -32,6 +32,7 @@
#include "DNA_ID.h"
#include "DNA_screen_types.h"
#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
#include "BLI_arithb.h"
@ -131,7 +132,7 @@ typedef struct uiWidgetType {
void (*state)(struct uiWidgetType *, int state);
void (*draw)(uiWidgetColors *, rcti *, int state, int roundboxalign);
void (*custom)(uiBut *, uiWidgetColors *, rcti *, int state, int roundboxalign);
void (*text)(uiBut *, rcti *, float *col);
void (*text)(uiStyle *style, uiBut *, rcti *, float *col);
} uiWidgetType;
@ -699,42 +700,39 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, int blend, rcti *rect)
static void widget_draw_text(uiBut *but, float x, float y)
static void widget_draw_text(uiStyle *style, uiBut *but, rcti *rect)
{
int transopts;
int len;
// int transopts;
char *cpoin;
ui_rasterpos_safe(x, y, but->aspect);
if(but->type==IDPOIN) transopts= 0; // no translation, of course!
else transopts= ui_translate_buttons();
// ui_rasterpos_safe(x, y, but->aspect);
// if(but->type==IDPOIN) transopts= 0; // no translation, of course!
// else transopts= ui_translate_buttons();
/* cut string in 2 parts */
cpoin= strchr(but->drawstr, '|');
if(cpoin) *cpoin= 0;
#ifdef INTERNATIONAL
if (but->type == FTPREVIEW)
FTF_DrawNewFontString (but->drawstr+but->ofs, FTF_INPUT_UTF8);
if(but->flag & UI_TEXT_LEFT)
style->widget.align= UI_STYLE_TEXT_LEFT;
else
UI_DrawString(but->font, but->drawstr+but->ofs, transopts);
#else
UI_DrawString(but->font, but->drawstr+but->ofs, transopts);
#endif
style->widget.align= UI_STYLE_TEXT_CENTER;
/* part text right aligned */
// XXX finish cutting
uiFontStyleDraw(&style->widget, rect, but->drawstr+but->ofs);
/* part text right aligned */
if(cpoin) {
len= UI_GetStringWidth(but->font, cpoin+1, ui_translate_buttons());
ui_rasterpos_safe( but->x2 - len*but->aspect-3, y, but->aspect);
UI_DrawString(but->font, cpoin+1, ui_translate_buttons());
// int len= UI_GetStringWidth(but->font, cpoin+1, ui_translate_buttons());
// ui_rasterpos_safe( but->x2 - len*but->aspect-3, y, but->aspect);
// UI_DrawString(but->font, cpoin+1, ui_translate_buttons());
*cpoin= '|';
}
}
/* draws text and icons for buttons */
static void widget_draw_text_icon(uiBut *but, rcti *rect, float *col)
static void widget_draw_text_icon(uiStyle *style, uiBut *but, rcti *rect, float *col)
{
float x, y;
short t, pos, ch;
short selsta_tmp, selend_tmp, selsta_draw, selwidth_draw;
@ -808,28 +806,19 @@ static void widget_draw_text_icon(uiBut *but, rcti *rect, float *col)
/* If there's an icon too (made with uiDefIconTextBut) then draw the icon
and offset the text label to accomodate it */
if ( (but->flag & UI_HAS_ICON) && (but->flag & UI_ICON_LEFT) )
{
if ( (but->flag & UI_HAS_ICON) && (but->flag & UI_ICON_LEFT) ) {
widget_draw_icon(but, but->icon, 0, rect);
if(but->editstr || (but->flag & UI_TEXT_LEFT)) x= rect->xmin + but->aspect*UI_icon_get_width(but->icon)+5.0;
else x= (rect->xmin+rect->xmax-but->strwidth+1)/2.0;
rect->xmin += UI_icon_get_width(but->icon);
if(but->editstr || (but->flag & UI_TEXT_LEFT))
rect->xmin += 5;
}
else
{
if(but->editstr || (but->flag & UI_TEXT_LEFT))
x= rect->xmin+4.0;
else if ELEM3(but->type, TOG, TOGN, TOG3)
x= rect->xmin+28.0; /* offset for checkmark */
else
x= (rect->xmin+rect->xmax-but->strwidth+1)/2.0;
}
/* position and draw */
y = (rect->ymin+rect->ymax- 9.0)/2.0;
else if(but->flag & UI_TEXT_LEFT)
rect->xmin += 5;
glColor3fv(col);
widget_draw_text(but, x, y);
widget_draw_text(style, but, rect);
}
/* if there's no text label, then check to see if there's an icon only and draw it */
@ -1312,6 +1301,10 @@ static void widget_numbut(uiWidgetColors *wcol, rcti *rect, int state, int round
widget_num_tria(&wtb.tria2, rect, 0.6f, 'r');
}
widgetbase_draw(&wtb, wcol);
/* text space */
rect->xmin += (rect->ymax-rect->ymin);
rect->xmax -= (rect->ymax-rect->ymin);
}
@ -1401,6 +1394,10 @@ static void widget_menubut(uiWidgetColors *wcol, rcti *rect, int state, int roun
widget_menu_trias(&wtb.tria1, rect);
widgetbase_draw(&wtb, wcol);
/* text space */
rect->xmax -= (rect->ymax-rect->ymin);
}
static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
@ -1458,6 +1455,9 @@ static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int ro
}
widgetbase_draw(&wtb, wcol);
/* text space */
rect->xmin += (rect->ymax-rect->ymin) + 8;
}
@ -1664,43 +1664,37 @@ static int widget_roundbox_set(uiBut *but, rcti *rect)
return 15;
}
static void ui_but_to_pixelrect(rcti *rect, const ARegion *ar, uiBut *but)
static void ui_fontscale(short *points, float aspect)
{
uiBlock *block= but->block;
float gx, gy;
float getsizex, getsizey;
getsizex= ar->winx;
getsizey= ar->winy;
gx= but->x1 + (block->panel?block->panel->ofsx:0.0f);
gy= but->y1 + (block->panel?block->panel->ofsy:0.0f);
rect->xmin= floor(getsizex*(0.5+ 0.5*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0])));
rect->ymin= floor(getsizey*(0.5+ 0.5*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1])));
gx= but->x2 + (block->panel?block->panel->ofsx:0.0f);
gy= but->y2 + (block->panel?block->panel->ofsy:0.0f);
if(aspect < 0.9f || aspect > 1.1f) {
float pointsf= *points;
rect->xmax= floor(getsizex*(0.5+ 0.5*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0])));
rect->ymax= floor(getsizey*(0.5+ 0.5*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1])));
/* for some reason scaling fonts goes too fast compared to widget size */
aspect= sqrt(aspect);
pointsf /= aspect;
if(aspect > 1.0)
*points= ceil(pointsf);
else
*points= floor(pointsf);
}
}
/* conversion from old to new buttons, so still messy */
void ui_draw_but(ARegion *ar, uiBut *but)
void ui_draw_but(ARegion *ar, uiBut *but, rcti *rect)
{
uiStyle style= *((uiStyle *)U.uistyles.first); // XXX pass on as arg
uiWidgetType *wt= NULL;
rcti rect;
/* project */
ui_but_to_pixelrect(&rect, ar, but);
/* scale fonts */
ui_fontscale(&style.widgetlabel.points, but->block->aspect);
ui_fontscale(&style.widget.points, but->block->aspect);
/* handle menus seperately */
if(but->dt==UI_EMBOSSP) {
switch (but->type) {
case LABEL:
widget_draw_text_icon(but, &rect, wcol_menu_back.text);
widget_draw_text_icon(&style, but, rect, wcol_menu_back.text);
break;
case SEPR:
break;
@ -1724,9 +1718,9 @@ void ui_draw_but(ARegion *ar, uiBut *but)
switch (but->type) {
case LABEL:
if(but->block->flag & UI_BLOCK_LOOP)
widget_draw_text_icon(but, &rect, wcol_menu_back.text);
widget_draw_text_icon(&style, but, rect, wcol_menu_back.text);
else
widget_draw_text_icon(but, &rect, wcol_regular.text);
widget_draw_text_icon(&style, but, rect, wcol_regular.text);
break;
case SEPR:
break;
@ -1749,8 +1743,10 @@ void ui_draw_but(ARegion *ar, uiBut *but)
case TOG:
case TOGN:
case TOG3:
if (!(but->flag & UI_HAS_ICON))
if (!(but->flag & UI_HAS_ICON)) {
wt= widget_type(UI_WTYPE_OPTION);
but->flag |= UI_TEXT_LEFT;
}
else
wt= widget_type(UI_WTYPE_TOGGLE);
break;
@ -1795,35 +1791,28 @@ void ui_draw_but(ARegion *ar, uiBut *but)
if(wt) {
int roundboxalign, state;
roundboxalign= widget_roundbox_set(but, &rect);
roundboxalign= widget_roundbox_set(but, rect);
state= but->flag;
if(but->editstr) state |= UI_TEXTINPUT;
wt->state(wt, state);
if(wt->custom)
wt->custom(but, &wt->wcol, &rect, state, roundboxalign);
wt->custom(but, &wt->wcol, rect, state, roundboxalign);
else if(wt->draw)
wt->draw(&wt->wcol, &rect, state, roundboxalign);
wt->text(but, &rect, wt->wcol.text);
wt->draw(&wt->wcol, rect, state, roundboxalign);
wt->text(&style, but, rect, wt->wcol.text);
if(state & UI_BUT_DISABLED)
widget_disabled(&rect);
widget_disabled(rect);
}
}
void ui_draw_menu_back(uiBlock *block)
void ui_draw_menu_back(uiBlock *block, rcti *rect)
{
uiWidgetType *wt= widget_type(UI_WTYPE_MENU_BACK);
rcti rect;
/* XXX project later? */
rect.xmin= block->minx;
rect.xmax= block->maxx;
rect.ymin= block->miny;
rect.ymax= block->maxy;
wt->state(wt, 0);
wt->draw(&wt->wcol, &rect, block->flag, block->direction);
wt->draw(&wt->wcol, rect, block->flag, block->direction);
}

@ -38,6 +38,67 @@
/* themes; defines in BIF_resource.h */
struct ColorBand;
/* ************************ style definitions ******************** */
#define MAX_STYLE_NAME 64
#define MAX_FONT_NAME 256
/* default uifont_id offered by Blender */
#define UIFONT_DEFAULT 0
#define UIFONT_BITMAP 1
/* free slots */
#define UIFONT_CUSTOM1 2
#define UIFONT_CUSTOM2 3
/* default fonts to load/initalize */
/* first font is the default (index 0), others optional */
typedef struct uiFont {
struct uiFont *next, *prev;
char filename[256];
short blf_id; /* from blfont lib */
short uifont_id; /* own id */
short r_to_l; /* fonts that read from left to right */
short pad;
} uiFont;
/* this state defines appearance of text */
typedef struct uiFontStyle {
short uifont_id; /* saved in file, 0 is default */
short points; /* actual size depends on 'global' dpi */
short italic, bold; /* style hint */
short shadow; /* value is amount of pixels blur */
short shadx, shady; /* shadow offset in pixels */
short align; /* text align hint */
float shadowalpha; /* total alpha */
float padf;
} uiFontStyle;
/* uiFontStyle->align */
#define UI_STYLE_TEXT_LEFT 0
#define UI_STYLE_TEXT_CENTER 1
#define UI_STYLE_TEXT_RIGHT 2
/* this is fed to the layout engine and widget code */
typedef struct uiStyle {
struct uiStyle *next, *prev;
char name[64]; /* MAX_STYLE_NAME */
uiFontStyle paneltitle;
uiFontStyle grouplabel;
uiFontStyle widgetlabel;
uiFontStyle widget;
short minlabelchars; /* in characters */
short minwidgetchars; /* in characters */
int pad;
} uiStyle;
/* global, button colors */
typedef struct ThemeUI {
char outline[4];
@ -153,7 +214,6 @@ typedef struct bTheme {
ThemeWireColor tarm[20];
/*ThemeWireColor tobj[20];*/
unsigned char bpad[4], bpad1[4];
} bTheme;
typedef struct SolidLight {
@ -174,20 +234,26 @@ typedef struct UserDef {
char sounddir[160];
/* yafray: temporary xml export directory */
char yfexportdir[160];
short versions, vrmlflag; // tmp for export, will be replaced by strubi
short versions, pad;
int gameflags;
int wheellinescroll;
int uiflag, language;
short userpref, viewzoom;
short console_buffer; //console vars here for tuhopuu compat, --phase
short console_out;
int mixbufsize;
int fontsize;
int fontsize; // XXX old
int dpi; /* range 48-128? */
short encoding;
short transopts;
short menuthreshold1, menuthreshold2;
char fontname[256]; // FILE_MAXDIR+FILE length
char fontname[256]; // XXX FILE_MAXDIR+FILE length
struct ListBase themes;
struct ListBase uifonts;
struct ListBase uistyles;
short undosteps;
short undomemory;
short gp_manhattendist, gp_euclideandist, gp_eraser;
@ -209,7 +275,7 @@ typedef struct UserDef {
short glreslimit;
short ndof_pan, ndof_rotate;
short curssize, ipo_new;
// char pad[8];
char versemaster[160];
char verseuser[160];
float glalphaclip;
@ -321,11 +387,6 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_DISABLE_SOUND 2
#define USER_DISABLE_MIPMAP 4
/* vrml flag */
#define USER_VRML_LAYERS 1
#define USER_VRML_AUTOSCALE 2
#define USER_VRML_TWOSIDED 4
/* wm draw method */
#define USER_DRAW_TRIPLE 0
#define USER_DRAW_OVERLAP 1

@ -146,11 +146,6 @@ static void init_userdef_themes(void)
U.dupflag |= USER_DUP_ARM;
}
/* userdef new option */
if (G.main->versionfile <= 222) {
U.vrmlflag= USER_VRML_LAYERS;
}
/* added seam, normal color, undo */
if (G.main->versionfile <= 234) {
bTheme *btheme;