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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/interface/interface_widgets.c')
-rw-r--r--source/blender/editors/interface/interface_widgets.c145
1 files changed, 67 insertions, 78 deletions
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index dc409be3058..958cde4efe4 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -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;
- }
- 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;
+ rect->xmin += UI_icon_get_width(but->icon);
+
+ if(but->editstr || (but->flag & UI_TEXT_LEFT))
+ rect->xmin += 5;
}
-
- /* 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);
}