2.5
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:
parent
46d8c1ebc7
commit
79c30a0752
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
202
source/blender/editors/interface/interface_style.c
Normal file
202
source/blender/editors/interface/interface_style.c
Normal file
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user