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:
authorTon Roosendaal <ton@blender.org>2009-04-02 19:01:11 +0400
committerTon Roosendaal <ton@blender.org>2009-04-02 19:01:11 +0400
commitf408689e7235867ea56b1994c2214aeaa75d665e (patch)
tree85057dd7745b48162b4dbef215f17f1d0bbc969a /source/blender
parente9ad9f894e2151fb192e8a4215b4ac6e73a28d0c (diff)
2.5
Some more work on UI drawing code, added a generic structure for how widgets will be defined. It's still a wrapper on top of old buttons. Docs follow still. Some visual improvements; - more button types supported (check render buttons) - pressed state is shown - better 'panel' triangle AA, and new divider style Still a lot of work here. I expect the next days/weeks to be much more coding too, had to catch up with a lot of other Blender stuff. There's more (excitement) going on than code. :)
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/include/UI_interface.h34
-rw-r--r--source/blender/editors/interface/interface_intern.h5
-rw-r--r--source/blender/editors/interface/interface_layout.c6
-rw-r--r--source/blender/editors/interface/interface_panel.c131
-rw-r--r--source/blender/editors/interface/interface_widgets.c494
5 files changed, 457 insertions, 213 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 3d85839eeee..1509f2df652 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -110,25 +110,27 @@ typedef struct uiPopupBlockHandle uiPopupBlockHandle;
#define UI_PNL_UNSTOW 256
#define UI_PNL_SCALE 512
-/* warning the first 4 flags are internal */
+/* warning the first 6 flags are internal */
/* but->flag */
-#define UI_TEXT_LEFT 16
-#define UI_ICON_LEFT 32
-#define UI_ICON_RIGHT 64
+#define UI_TEXT_LEFT 64
+#define UI_ICON_LEFT 128
+#define UI_ICON_RIGHT 256
/* control for button type block */
-#define UI_MAKE_TOP 128
-#define UI_MAKE_DOWN 256
-#define UI_MAKE_LEFT 512
-#define UI_MAKE_RIGHT 1024
- /* dont draw hilite on mouse over */
-#define UI_NO_HILITE 2048
+#define UI_MAKE_TOP 512
+#define UI_MAKE_DOWN 1024
+#define UI_MAKE_LEFT 2048
+#define UI_MAKE_RIGHT 4096
+
/* button align flag, for drawing groups together */
-#define UI_BUT_ALIGN (15<<12)
-#define UI_BUT_ALIGN_TOP (1<<12)
-#define UI_BUT_ALIGN_LEFT (1<<13)
-#define UI_BUT_ALIGN_RIGHT (1<<14)
-#define UI_BUT_ALIGN_DOWN (1<<15)
-#define UI_BUT_DISABLED (1<<16)
+#define UI_BUT_ALIGN (15<<14)
+#define UI_BUT_ALIGN_TOP (1<<14)
+#define UI_BUT_ALIGN_LEFT (1<<15)
+#define UI_BUT_ALIGN_RIGHT (1<<16)
+#define UI_BUT_ALIGN_DOWN (1<<17)
+
+#define UI_BUT_DISABLED (1<<18)
+/* dont draw hilite on mouse over */
+#define UI_NO_HILITE (1<<19)
/* Button types, bits stored in 1 value... and a short even!
- bits 0-4: bitnr (0-31)
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 4574eb44cfa..ef76498eba9 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -55,6 +55,8 @@ struct wmWindow;
#define UI_MOUSE_OVER 2
#define UI_ACTIVE 4
#define UI_HAS_ICON 8
+#define UI_TEXTINPUT 16
+
/* warn: rest of uiBut->flag in UI_interface.h */
/* internal panel drawing defines */
@@ -344,5 +346,8 @@ void ui_draw_text(uiBut *but, float x, float y, int sunken);
/* interface_handlers.c */
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);
+
#endif
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index b83991a5259..11978f99e2b 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -871,8 +871,6 @@ void ui_layout_end(const bContext *C, uiBlock *block, uiLayout *layout, int *x,
if(x) *x= layout->x;
if(y) *y= layout->y;
- /* XXX temp, migration flag for drawing code */
- uiBlockSetFlag(block, UI_BLOCK_2_50);
}
void ui_layout_free(uiLayout *layout)
@@ -941,6 +939,10 @@ void uiRegionPanelLayout(const bContext *C, ARegion *ar, int vertical, char *con
if(pt->draw && (!pt->poll || pt->poll(C))) {
block= uiBeginBlock(C, ar, pt->idname, UI_EMBOSS, UI_HELV);
+
+ /* XXX temp, migration flag for drawing code */
+ uiBlockSetFlag(block, UI_BLOCK_2_50);
+
w= (ar->type->minsizex)? ar->type->minsizex-22: UI_PANEL_WIDTH-22;
if(uiNewPanel(C, ar, block, pt->name, pt->name, x, y, w, 0)) {
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 9d823712d48..2609bb9e2e4 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -453,37 +453,14 @@ uiBlock *uiFindOpenPanelBlockName(ListBase *lb, char *name)
return block;
}
-static void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3)
-{
- // we draw twice, anti polygons not widely supported...
- glBegin(GL_POLYGON);
- glVertex2f(x1, y1);
- glVertex2f(x2, y2);
- glVertex2f(x3, y3);
- glEnd();
-
- /* set antialias line */
- glEnable( GL_LINE_SMOOTH );
- glEnable( GL_BLEND );
-
- glBegin(GL_LINE_LOOP);
- glVertex2f(x1, y1);
- glVertex2f(x2, y2);
- glVertex2f(x3, y3);
- glEnd();
-
- glDisable( GL_LINE_SMOOTH );
- glDisable( GL_BLEND );
-}
-
/* triangle 'icon' for panel header */
void ui_draw_tria_icon(float x, float y, float aspect, char dir)
{
if(dir=='h') {
- ui_draw_anti_tria( x, y+1, x, y+10.0, x+8, y+6.25);
+ ui_draw_anti_tria( x-1, y, x-1, y+11.0, x+9, y+6.25);
}
else {
- ui_draw_anti_tria( x-2, y+9, x+8-2, y+9, x+4.25-2, y+1);
+ ui_draw_anti_tria( x-3, y+10, x+8-1, y+10, x+4.25-2, y);
}
}
@@ -679,7 +656,7 @@ static void ui_draw_panel_scalewidget(uiBlock *block)
glDisable(GL_BLEND);
}
-void ui_draw_panel(ARegion *ar, uiBlock *block)
+static void ui_draw_panel_old(ARegion *ar, uiBlock *block)
{
Panel *panel= block->panel;
int ofsx;
@@ -860,6 +837,108 @@ void ui_draw_panel(ARegion *ar, uiBlock *block)
ui_draw_tria_icon(block->minx+6+ofsx, block->maxy+5, block->aspect, 'v');
}
+/* XXX has follow style definitions still */
+static void ui_draw_panel_style(ARegion *ar, uiBlock *block)
+{
+ Panel *panel= block->panel;
+ int ofsx;
+ char *panelname= panel->drawname[0]?panel->drawname:panel->panelname;
+
+ if(panel->paneltab) return;
+
+ /* divider */
+ if(panel->prev) {
+ float minx= block->minx+10;
+ float maxx= block->maxx-10;
+ float y= block->maxy + 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);
+ glDisable(GL_BLEND);
+ }
+
+ /* title */
+ if(!(panel->flag & PNL_CLOSEDX)) {
+ ofsx= PNL_ICON+8;
+ if(panel->control & UI_PNL_CLOSE) ofsx+= PNL_ICON;
+ UI_ThemeColor(TH_TEXT);
+ ui_rasterpos_safe(4+block->minx+ofsx, block->maxy+2, block->aspect);
+ UI_DrawString(block->curfont, panelname, ui_translate_buttons());
+ }
+
+ /* if the panel is minimized vertically:
+ * (------)
+ */
+ if(panel->flag & PNL_CLOSEDY) {
+
+
+ /* 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);
+ }
+
+ }
+ else if(panel->flag & PNL_CLOSEDX) {
+
+ }
+ /* an open panel */
+ else {
+
+ /* 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);
+ }
+
+ /* draw optional close icon */
+
+ ofsx= 6;
+ if(panel->control & UI_PNL_CLOSE) {
+
+ ui_draw_x_icon(block->minx+2+ofsx, block->maxy+2);
+ ofsx= 22;
+ }
+
+ /* draw collapse icon */
+ UI_ThemeColor(TH_TEXT);
+
+ if(panel->flag & PNL_CLOSEDY)
+ ui_draw_tria_icon(block->minx+6+ofsx, block->maxy+1, block->aspect, 'h');
+ else if(panel->flag & PNL_CLOSEDX)
+ ui_draw_tria_icon(block->minx+7, block->maxy+1, block->aspect, 'h');
+ else
+ ui_draw_tria_icon(block->minx+6+ofsx, block->maxy+1, block->aspect, 'v');
+
+
+}
+
+
+void ui_draw_panel(ARegion *ar, uiBlock *block)
+{
+ if(block->flag & UI_BLOCK_2_50)
+ ui_draw_panel_style(ar, block);
+ else
+ ui_draw_panel_old(ar, block);
+}
+
/* ------------ panel alignment ---------------- */
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index be7bb5c09d8..1030914bb27 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -119,6 +119,57 @@ typedef struct uiWidgetBase {
} uiWidgetBase;
+typedef enum {
+ /* standard set */
+ UI_WTYPE_TOGGLE,
+ UI_WTYPE_OPTION,
+ UI_WTYPE_RADIO,
+ UI_WTYPE_NUMBER,
+ UI_WTYPE_SLIDER,
+ UI_WTYPE_EXEC,
+
+ /* strings */
+ UI_WTYPE_NAME,
+ UI_WTYPE_NAME_LINK,
+ UI_WTYPE_POINTER_LINK,
+ UI_WTYPE_FILENAME,
+
+ /* menus */
+ UI_WTYPE_MENU_RADIO,
+ UI_WTYPE_MENU_POINTER_LINK,
+
+ UI_WTYPE_PULLDOWN,
+ UI_WTYPE_MENU_ITEM,
+
+ /* specials */
+ UI_WTYPE_ICON,
+ UI_WTYPE_SWATCH,
+ UI_WTYPE_RGB_PICKER,
+ UI_WTYPE_NORMAL
+
+} uiWidgetTypeEnum;
+
+
+/* uiWidgetType: for time being only for visual appearance,
+ later, a handling callback can be added too
+*/
+typedef struct uiWidgetType {
+
+ /* pointer to theme color definition */
+ uiWidgetColors *wcol_theme;
+
+ /* converted colors for state */
+ uiWidgetColors wcol;
+
+ void (*state)(struct uiWidgetType *, int state);
+ void (*draw)(uiWidgetColors *, rcti *, int state, int roundboxalign);
+ void (*text)(uiBut *, rcti *, float *col);
+
+} uiWidgetType;
+
+
+/* *********************** draw data ************************** */
+
static float cornervec[9][2]= {{0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},
{0.707, 0.293}, {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}, {1.0, 1.0}};
@@ -151,7 +202,34 @@ static float check_tria_vert[6][2]= {
static int check_tria_face[4][3]= {
{3, 2, 4}, {3, 4, 5}, {1, 0, 3}, {0, 2, 3}};
+/* ************************************************* */
+
+void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3)
+{
+ float color[4];
+ int j;
+
+ glEnable(GL_BLEND);
+ glGetFloatv(GL_CURRENT_COLOR, color);
+ color[3]= 0.125;
+ glColor4fv(color);
+
+ /* for each AA step */
+ for(j=0; j<8; j++) {
+ glTranslatef(1.0*jit[j][0], 1.0*jit[j][1], 0.0f);
+
+ glBegin(GL_POLYGON);
+ glVertex2f(x1, y1);
+ glVertex2f(x2, y2);
+ glVertex2f(x3, y3);
+ glEnd();
+
+ glTranslatef(-1.0*jit[j][0], -1.0*jit[j][1], 0.0f);
+ }
+ glDisable(GL_BLEND);
+
+}
static void widget_init(uiWidgetBase *wt)
{
@@ -161,7 +239,7 @@ static void widget_init(uiWidgetBase *wt)
}
-static void round_box_edges(uiWidgetBase *wt, int roundboxtype, rcti *rect, float rad)
+static void round_box_edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, float rad)
{
float vec[9][2], veci[9][2];
float minx= rect->xmin, miny= rect->ymin, maxx= rect->xmax, maxy= rect->ymax;
@@ -183,7 +261,7 @@ static void round_box_edges(uiWidgetBase *wt, int roundboxtype, rcti *rect, floa
}
/* corner left-bottom */
- if(roundboxtype & 8) {
+ if(roundboxalign & 8) {
for(a=0; a<9; a++, tot++) {
wt->inner_v[tot][0]= minxi+veci[a][1];
@@ -210,7 +288,7 @@ static void round_box_edges(uiWidgetBase *wt, int roundboxtype, rcti *rect, floa
}
/* corner right-bottom */
- if(roundboxtype & 4) {
+ if(roundboxalign & 4) {
for(a=0; a<9; a++, tot++) {
wt->inner_v[tot][0]= maxxi-radi+veci[a][0];
@@ -239,7 +317,7 @@ static void round_box_edges(uiWidgetBase *wt, int roundboxtype, rcti *rect, floa
wt->halfwayvert= tot;
/* corner right-top */
- if(roundboxtype & 2) {
+ if(roundboxalign & 2) {
for(a=0; a<9; a++, tot++) {
wt->inner_v[tot][0]= maxxi-veci[a][1];
@@ -266,7 +344,7 @@ static void round_box_edges(uiWidgetBase *wt, int roundboxtype, rcti *rect, floa
}
/* corner left-top */
- if(roundboxtype & 1) {
+ if(roundboxalign & 1) {
for(a=0; a<9; a++, tot++) {
wt->inner_v[tot][0]= minxi+radi-veci[a][0];
@@ -401,20 +479,16 @@ static void round_box_shade_col(float *col1, float *col2, float fac)
glColor4fv(col);
}
-static void widget_draw(uiWidgetBase *wt, uiWidgetColors *wcol, int state)
+static void widget_draw(uiWidgetBase *wt, uiWidgetColors *wcol)
{
- float *inner= wcol->inner;
int j, a;
- if(state & UI_SELECT)
- inner= wcol->inner_sel;
-
glEnable(GL_BLEND);
/* backdrop non AA */
if(wcol->shaded==0) {
/* filled center, solid */
- glColor3fv(inner);
+ glColor3fv(wcol->inner);
glBegin(GL_POLYGON);
for(a=0; a<wt->totvert; a++)
glVertex2fv(wt->inner_v[a]);
@@ -423,7 +497,7 @@ static void widget_draw(uiWidgetBase *wt, uiWidgetColors *wcol, int state)
else {
float col1[3], col2[3];
- shadecolors(col1, col2, inner, wcol->shadetop, wcol->shadedown);
+ shadecolors(col1, col2, wcol->inner, wcol->shadetop, wcol->shadedown);
glShadeModel(GL_SMOOTH);
glBegin(GL_POLYGON);
@@ -631,11 +705,15 @@ static void widget_draw_text_icon(uiBut *but, rcti *rect, float *col)
/* *********************** widget types ************************************* */
+
/*
float outline[3];
float inner[3];
- float select[3];
+ float inner_sel[3];
float item[3];
+ float text[3];
+ float text_sel[3];
+
short shaded;
float shadetop, shadedown;
*/
@@ -666,6 +744,19 @@ static struct uiWidgetColors wcol_text= {
0.0f, 0.1f
};
+static struct uiWidgetColors wcol_option= {
+ {0.0f, 0.0f, 0.0f},
+ {0.25f, 0.25f, 0.25f},
+ {0.25f, 0.25f, 0.25f},
+ {1.0f, 1.0f, 1.0f},
+
+ {0.0f, 0.0f, 0.0f},
+ {1.0f, 1.0f, 1.0f},
+
+ 1,
+ 0.1f, -0.08f
+};
+
static struct uiWidgetColors wcol_menu= {
{0.0f, 0.0f, 0.0f},
{0.25f, 0.25f, 0.25f},
@@ -679,7 +770,8 @@ static struct uiWidgetColors wcol_menu= {
0.1f, -0.08f
};
-static struct uiWidgetColors wcol_row= {
+
+static struct uiWidgetColors wcol_radio= {
{0.0f, 0.0f, 0.0f},
{0.25f, 0.25f, 0.25f},
{0.34f, 0.5f, 0.76f},
@@ -705,7 +797,7 @@ static struct uiWidgetColors wcol_regular= {
0.0f, 0.0f
};
-static struct uiWidgetColors wcol_regular2= {
+static struct uiWidgetColors wcol_regular_shade= {
{0.1f, 0.1f, 0.1f},
{0.6f, 0.6f, 0.6f},
{0.4f, 0.4f, 0.4f},
@@ -718,70 +810,86 @@ static struct uiWidgetColors wcol_regular2= {
0.1f, -0.1f
};
+/* ************ button callbacks, state ***************** */
-static void widget_numbut(uiBut *but, rcti *rect, int state, int roundboxtype)
+/* copy colors from theme, and set changes in it based on state */
+static void widget_state(uiWidgetType *wt, int state)
{
- uiWidgetBase wt;
+ wt->wcol= *(wt->wcol_theme);
- widget_init(&wt);
+ if(state & UI_SELECT) {
+ VECCOPY(wt->wcol.inner, wt->wcol.inner_sel);
+ VECCOPY(wt->wcol.text, wt->wcol.text_sel);
+
+ /* only flip shade if it's not "pushed in in" */
+ if(wt->wcol.shaded && wt->wcol.shadetop>wt->wcol.shadedown) {
+ SWAP(float, wt->wcol.shadetop, wt->wcol.shadedown);
+ }
+ }
+ /* mouse over? */
+}
+
+
+/* ************ button callbacks, draw ***************** */
+
+static void widget_numbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+{
+ uiWidgetBase wtb;
+
+ widget_init(&wtb);
/* fully rounded */
- round_box_edges(&wt, roundboxtype, rect, 0.5f*(rect->ymax - rect->ymin));
+ round_box_edges(&wtb, roundboxalign, rect, 0.5f*(rect->ymax - rect->ymin));
/* decoration */
- widget_num_tria(&wt.tria1, rect, 0.6f, 0);
- widget_num_tria(&wt.tria2, rect, 0.6f, 'r');
-
- widget_draw(&wt, &wcol_num, state);
+ if(!(state & UI_TEXTINPUT)) {
+ widget_num_tria(&wtb.tria1, rect, 0.6f, 0);
+ widget_num_tria(&wtb.tria2, rect, 0.6f, 'r');
+ }
+ widget_draw(&wtb, wcol);
- if(state & UI_SELECT)
- widget_draw_text_icon(but, rect, wcol_num.text_sel);
- else
- widget_draw_text_icon(but, rect, wcol_num.text);
}
-static void widget_textbut(uiBut *but, rcti *rect, int state, int roundboxtype)
+
+static void widget_textbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
- uiWidgetBase wt;
+ uiWidgetBase wtb;
- widget_init(&wt);
+ widget_init(&wtb);
/* half rounded */
- round_box_edges(&wt, roundboxtype, rect, 4.0f);
+ round_box_edges(&wtb, roundboxalign, rect, 4.0f);
/* XXX button state */
- widget_draw(&wt, &wcol_text, state);
+ widget_draw(&wtb, wcol);
- widget_draw_text_icon(but, rect, wcol_text.text);
}
-static void widget_menubut(uiBut *but, rcti *rect, int state, int roundboxtype)
+static void widget_menubut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
- uiWidgetBase wt;
+ uiWidgetBase wtb;
- widget_init(&wt);
+ widget_init(&wtb);
/* half rounded */
- round_box_edges(&wt, roundboxtype, rect, 4.0f);
+ round_box_edges(&wtb, roundboxalign, rect, 4.0f);
/* XXX button state */
/* decoration */
- widget_menu_trias(&wt.tria1, rect);
+ widget_menu_trias(&wtb.tria1, rect);
- widget_draw(&wt, &wcol_menu, state);
-
- widget_draw_text_icon(but, rect, wcol_menu.text);
+ widget_draw(&wtb, wcol);
}
-static void widget_togbut(uiBut *but, rcti *rect, int state, int roundboxtype)
+static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
- uiWidgetBase wt;
+ uiWidgetBase wtb;
rcti recttemp= *rect;
int delta;
- widget_init(&wt);
+ widget_init(&wtb);
/* square */
recttemp.xmax= recttemp.xmin + (recttemp.ymax-recttemp.ymin);
@@ -794,131 +902,160 @@ static void widget_togbut(uiBut *but, rcti *rect, int state, int roundboxtype)
recttemp.ymax-= delta;
/* half rounded */
- round_box_edges(&wt, roundboxtype, &recttemp, 4.0f);
+ round_box_edges(&wtb, roundboxalign, &recttemp, 4.0f);
/* button state */
/* decoration */
if(state & UI_SELECT) {
- widget_check_trias(&wt.tria1, &recttemp);
+ widget_check_trias(&wtb.tria1, &recttemp);
}
- widget_draw(&wt, &wcol_menu, state);
-
- if(state & UI_SELECT)
- widget_draw_text_icon(but, rect, wcol_menu.text);
- else
- widget_draw_text_icon(but, rect, wcol_menu.text_sel);
+ widget_draw(&wtb, wcol);
}
-static void widget_rowbut(uiBut *but, rcti *rect, int state, int roundboxtype)
+static void widget_radiobut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
- uiWidgetBase wt;
+ uiWidgetBase wtb;
- widget_init(&wt);
+ widget_init(&wtb);
/* half rounded */
- round_box_edges(&wt, roundboxtype, rect, 4.0f);
+ round_box_edges(&wtb, roundboxalign, rect, 4.0f);
- widget_draw(&wt, &wcol_row, state);
+ widget_draw(&wtb, wcol);
- widget_draw_text_icon(but, rect, wcol_row.text);
}
-static void widget_but(uiBut *but, rcti *rect, int state, int roundboxtype)
+static void widget_but(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
- uiWidgetBase wt;
+ uiWidgetBase wtb;
- widget_init(&wt);
+ widget_init(&wtb);
/* half rounded */
- round_box_edges(&wt, roundboxtype, rect, 4.0f);
+ round_box_edges(&wtb, roundboxalign, rect, 4.0f);
- widget_draw(&wt, &wcol_regular, state);
+ widget_draw(&wtb, wcol);
- widget_draw_text_icon(but, rect, wcol_regular.text);
}
-static void widget_roundbut(uiBut *but, rcti *rect, int state, int roundboxtype)
+static void widget_roundbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
- uiWidgetBase wt;
+ uiWidgetBase wtb;
- widget_init(&wt);
+ widget_init(&wtb);
/* fully rounded */
- round_box_edges(&wt, roundboxtype, rect, 0.5f*(rect->ymax - rect->ymin));
-
- widget_num_tria(&wt.tria1, rect, 0.6f, 0);
-
- widget_draw(&wt, &wcol_regular2, state);
-
- widget_draw_text_icon(but, rect, wcol_regular2.text);
+ round_box_edges(&wtb, roundboxalign, rect, 0.5f*(rect->ymax - rect->ymin));
+ widget_draw(&wtb, wcol);
}
-/* test function only */
-void drawnewstuff()
+static void widget_disabled(rcti *rect)
{
- rcti rect;
+ float col[3];
- rect.xmin= 10; rect.xmax= 10+100;
- rect.ymin= -30; rect.ymax= -30+18;
- widget_numbut(NULL, &rect, 0, 15);
-
- rect.xmin= 120; rect.xmax= 120+100;
- rect.ymin= -30; rect.ymax= -30+20;
- widget_numbut(NULL, &rect, 0, 15);
+ glEnable(GL_BLEND);
- rect.xmin= 10; rect.xmax= 10+100;
- rect.ymin= -60; rect.ymax= -60+20;
- widget_menubut(NULL, &rect, 0, 15);
+ UI_GetThemeColor3fv(TH_BACK, col);
+ glColor4f(col[0], col[1], col[2], 0.5f);
+ glRectf(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
- rect.xmin= 120; rect.xmax= 120+100;
- widget_but(NULL, &rect, 0, 15);
+ glDisable(GL_BLEND);
+}
+
+static uiWidgetType *widget_type(uiWidgetTypeEnum type)
+{
+ static uiWidgetType wt;
- rect.xmin= 10; rect.xmax= 10+100;
- rect.ymin= -90; rect.ymax= -90+20;
- widget_rowbut(NULL, &rect, 1, 9);
+ /* defaults */
+ wt.wcol_theme= &wcol_regular;
+ wt.state= widget_state;
+ wt.draw= widget_but;
+ wt.text= widget_draw_text_icon;
- rect.xmin= 109; rect.xmax= 110+100;
- rect.ymin= -90; rect.ymax= -90+20;
- widget_rowbut(NULL, &rect, 0, 6);
+ switch(type) {
+ case UI_WTYPE_TOGGLE:
+ break;
+
+ case UI_WTYPE_OPTION:
+ wt.wcol_theme= &wcol_option;
+ wt.draw= widget_optionbut;
+ break;
+
+ case UI_WTYPE_RADIO:
+ wt.wcol_theme= &wcol_radio;
+ wt.draw= widget_radiobut;
+ break;
+
+ case UI_WTYPE_NUMBER:
+ wt.wcol_theme= &wcol_num;
+ wt.draw= widget_numbut;
+ break;
+
+ case UI_WTYPE_SLIDER:
+ break;
+
+ case UI_WTYPE_EXEC:
+ wt.wcol_theme= &wcol_regular_shade;
+ wt.draw= widget_roundbut;
+ break;
+
+
+ /* strings */
+ case UI_WTYPE_NAME:
+ wt.wcol_theme= &wcol_text;
+ wt.draw= widget_textbut;
+ break;
+
+ case UI_WTYPE_NAME_LINK:
+ break;
+
+ case UI_WTYPE_POINTER_LINK:
+ break;
+
+ case UI_WTYPE_FILENAME:
+ break;
+
+
+ /* menus */
+ case UI_WTYPE_MENU_RADIO:
+ wt.wcol_theme= &wcol_menu;
+ wt.draw= widget_menubut;
+ break;
+
+ case UI_WTYPE_MENU_POINTER_LINK:
+ wt.wcol_theme= &wcol_menu;
+ wt.draw= widget_menubut;
+ break;
+
+
+ case UI_WTYPE_PULLDOWN:
+ break;
+
+ case UI_WTYPE_MENU_ITEM:
+ break;
+
+
+ /* specials */
+ case UI_WTYPE_ICON:
+ break;
+
+ case UI_WTYPE_SWATCH:
+ break;
+
+ case UI_WTYPE_RGB_PICKER:
+ break;
+
+ case UI_WTYPE_NORMAL:
+ break;
+ }
- rect.xmin= 240; rect.xmax= 240+30;
- rect.ymin= -90; rect.ymax= -90+30;
- widget_roundbut(NULL, &rect, 0, 15);
+ return &wt;
}
-/* ************ new color and style definition ********************* */
-/*
-
-- minimum width definition?
-
-- Types
- * Icon toggle button
- * Row button (exclusive "enum" values)
- * Option button (also "bit flags")
- * Tool/Operator button
- * Number button
- * Number slider
-
- * Text string button (to rename data)
- * File name button (separate design?)
- * Linkage "Library" button (Object, Material, Parent, etc)
- * Linkage data name button (Bone, Vgroup)
-
- * Popup settings button, with optional text, icon or both.
- * Popup linkage button (Materials, Bones, etc)
- * Pulldown menu button (to invoke pulldown)
- * Pulldown menu item (and menu backdrop + title)
-
- * Button-less icons (open-close triangle, delete cross, ...)
- * Color picker Swatch
- * Color picker fields
- * Normal button (rotatable sphere)
-
-*/
static int widget_roundbox_set(uiBut *but, rcti *rect)
{
@@ -966,39 +1103,10 @@ static int widget_roundbox_set(uiBut *but, rcti *rect)
}
-/* widget classification
-
-- state:
- UI_MOUSE_OVER: on mouse over
- UI_ACTIVE: while using it
- UI_SELECT: internal state (toggle, row)
-
-- drawtype
- CUSTOM: no widget class, entirely free within rect
- WIDGET: part of the standard widget set
-
-- text placement, split?
-
-- widget color style hint
- - outline
- - interior col
- - interior slider color?
- - shade factors
- - decoration color
- - text colors
-
-- callbacks
- - widget_draw()
- - widget_text_icon()
- -
-
-*/
-
-
void ui_draw_but_new(ARegion *ar, uiBut *but)
{
+ uiWidgetType *wt= NULL;
rcti rect;
- int roundboxtype, state;
/* XXX project later */
rect.xmin= but->x1;
@@ -1006,39 +1114,87 @@ void ui_draw_but_new(ARegion *ar, uiBut *but)
rect.ymin= but->y1;
rect.ymax= but->y2;
- roundboxtype= widget_roundbox_set(but, &rect);
- state= but->flag;
-
switch (but->type) {
case LABEL:
- widget_draw_text_icon(but, &rect, wcol_regular2.text);
+ widget_draw_text_icon(but, &rect, wcol_regular.text);
+ break;
+ case BUT:
+ wt= widget_type(UI_WTYPE_EXEC);
break;
case NUM:
- widget_numbut(but, &rect, state, roundboxtype);
+ wt= widget_type(UI_WTYPE_NUMBER);
break;
case ROW:
- widget_rowbut(but, &rect, state, roundboxtype);
+ wt= widget_type(UI_WTYPE_RADIO);
break;
case TEX:
- widget_textbut(but, &rect, state, roundboxtype);
+ wt= widget_type(UI_WTYPE_NAME);
break;
case TOG:
case TOGN:
case TOG3:
- if (!(state & UI_HAS_ICON))
- widget_togbut(but, &rect, state, roundboxtype);
+ if (!(but->flag & UI_HAS_ICON))
+ wt= widget_type(UI_WTYPE_OPTION);
else
- widget_but(but, &rect, state, roundboxtype);
+ wt= widget_type(UI_WTYPE_TOGGLE);
break;
case MENU:
case BLOCK:
- widget_menubut(but, &rect, state, roundboxtype);
+ wt= widget_type(UI_WTYPE_MENU_RADIO);
break;
default:
- widget_but(but, &rect, state, roundboxtype);
+ wt= widget_type(UI_WTYPE_TOGGLE);
}
+ if(wt) {
+ int roundboxalign, state;
+
+ roundboxalign= widget_roundbox_set(but, &rect);
+ state= but->flag;
+ if(but->editstr) state |= UI_TEXTINPUT;
+
+ wt->state(wt, state);
+ wt->draw(&wt->wcol, &rect, state, roundboxalign);
+ wt->text(but, &rect, wt->wcol.text);
+
+ if(state & UI_BUT_DISABLED)
+ widget_disabled(&rect);
+ }
+}
+
+
+/* test function only */
+void drawnewstuff()
+{
+ rcti rect;
+
+ rect.xmin= 10; rect.xmax= 10+100;
+ rect.ymin= -30; rect.ymax= -30+18;
+ widget_numbut(&wcol_num, &rect, 0, 15);
+
+ rect.xmin= 120; rect.xmax= 120+100;
+ rect.ymin= -30; rect.ymax= -30+20;
+ widget_numbut(&wcol_num, &rect, 0, 15);
+
+ rect.xmin= 10; rect.xmax= 10+100;
+ rect.ymin= -60; rect.ymax= -60+20;
+ widget_menubut(&wcol_menu, &rect, 0, 15);
+
+ rect.xmin= 120; rect.xmax= 120+100;
+ widget_but(&wcol_regular, &rect, 0, 15);
+
+ rect.xmin= 10; rect.xmax= 10+100;
+ rect.ymin= -90; rect.ymax= -90+20;
+ widget_radiobut(&wcol_radio, &rect, 1, 9);
+
+ rect.xmin= 109; rect.xmax= 110+100;
+ rect.ymin= -90; rect.ymax= -90+20;
+ widget_radiobut(&wcol_radio, &rect, 0, 6);
+
+ rect.xmin= 240; rect.xmax= 240+30;
+ rect.ymin= -90; rect.ymax= -90+30;
+ widget_roundbut(&wcol_regular_shade, &rect, 0, 15);
}