fteqw/quakec/menusys/menusys/mitem_tabs.qc

169 lines
4.7 KiB
Plaintext

/***************************************************************************
tabs/tab widgets.
the 'tabs' widget is simply a tab-selection control. horizontal multiple choice. it draws only its currently active child.
the 'tab' widget is merely a container of other widgets, no different from a standard frame object, just has a name and a specific size.
*/
class mitem_tabs : mitem_frame /*frame... but not really*/
{
virtual void(vector pos) item_draw;
virtual float(vector pos, float scan, float char, float down) item_keypress;
// virtual void() item_resize;
void() mitem_tabs =
{
item_framesize = '2 16 2';
item_flags |= IF_SELECTABLE|IF_RESIZABLE;
};
};
class mitem_tab : mitem_frame
{
virtual float(vector pos, float scan, float char, float down) item_keypress =
{
if (scan == K_UPARROW && down)
menu_selectnextitem(this, TRUE);
else if (scan == K_DOWNARROW && down)
menu_selectnextitem(this, FALSE);
else if (super::item_keypress(pos, scan, char, down))
return TRUE;
else
return FALSE;
return TRUE;
};
void() mitem_tab =
{
item_framesize = '0 0 0';
item_flags |= IF_SELECTABLE|IF_RESIZABLE;
};
};
void(vector pos) mitem_tabs::item_draw =
{
local mitem ch;
local vector tpos = pos;
local float w;
local vector col;
//to highlight the active tab, we draw the top line 1 pixel higher, and no bottom line
for (ch = item_children; ch; ch = ch.item_next)
{
w = stringwidth(ch.item_text, TRUE, '8 8') + 8;
ui.drawfill(tpos + '0 1', [1, 15], TD_LFT, item_alpha, 0);
ui.drawfill(tpos + [w-1, 1], [1, 14], TD_RGT, item_alpha, 0);
if (ch == item_kactivechild)
{
//top line
ui.drawfill(tpos, [w, 1], TD_TOP, item_alpha, 0);
}
else
{
//top line
ui.drawfill(tpos + '0 1', [w, 1], TD_TOP, item_alpha, 0);
//bottom
ui.drawfill(tpos + '0 15', [w, 1], TD_TOP, item_alpha, 0);
}
col = item_rgb;
if (!(ch.item_flags & IF_SELECTABLE))
col *= 0.2;
else
{
if (!item_kactivechild)
item_focuschange(ch, IF_KFOCUSED);
if (mouseinbox(tpos, [w, 16]))
col_z = 0;
if (ch.item_flags & IF_KFOCUSED)
col_x = 0;
}
ui.drawstring(tpos + '4 4', ch.item_text, '8 8', col, item_alpha, 0);
tpos_x += w;
}
ui.drawfill(tpos + '0 15', [pos_x + item_size_x - tpos_x, 1], TD_TOP, item_alpha, 0); //top
ui.drawfill(pos + '0 16', [1, item_size_y - 16], TD_LFT, item_alpha, 0); //left
ui.drawfill(pos + [item_size_x-1, 16], [1, item_size_y - 17], TD_RGT, item_alpha, 0); //right
ui.drawfill(pos + [1, item_size_y-1], [item_size_x-1, 1], TD_BOT, item_alpha, 0); //bottom
if (item_mactivechild != item_kactivechild)
item_focuschange(item_kactivechild, IF_MFOCUSED); //give the tab full focus.
ch = item_kactivechild;
if (ch)
ch.item_draw(pos + ch.item_position + [item_framesize[0], item_framesize[1]]);
};
float(vector pos, float scan, float char, float down) mitem_tabs::item_keypress =
{
local mitem ch;
local vector tpos = pos;
local vector sz;
local float result;
if (down && (scan == K_MOUSE1 || scan == K_MOUSE2 || scan == K_MOUSE3))
{
sz_y = 16;
//to highlight the active tab, we draw the top line 1 pixel higher, and no bottom line
for (ch = this.item_children; ch; ch = ch.item_next)
{
sz_x = stringwidth(ch.item_text, TRUE, '8 8') + 8;
if (mouseinbox(tpos, sz))
{
item_focuschange(ch, IF_KFOCUSED); //give the tab full focus.
return TRUE;
}
tpos_x += sz_x;
}
}
ch = item_kactivechild;
if (ch)
{
result = ch.item_keypress(pos + [item_framesize[0], item_framesize[1]] + ch.item_position, scan, char, down);
if (!result && down)
{
if (scan == K_TAB || scan == K_RIGHTARROW)
{
ch = ch.item_next;
if (!ch)
ch = item_children;
item_focuschange(ch, IF_KFOCUSED);
result = TRUE;
}
// else if (scan == K_LEFTARROW)
// {
// ch = ch.item_next;
// if (!ch)
// ch = item_children;
// item_focuschange((ch.item_next?ch.item_next:this.item_children), IF_KFOCUSED);
// result = TRUE;
// }
}
}
else
result = FALSE;
return result;
};
/*void() mitem_tabs::item_resize =
{
local mitem ch;
for (ch = this.item_children; ch; ch = ch.item_next)
{
ch.item_size = this.item_size;
if (ch.item_resized)
ch.item_resized();
}
};*/
mitem_tabs(vector sz) menuitemtabs_spawn =
{
return spawn(mitem_tabs, item_size:sz);
};
mitem_tab(mitem_tabs tabs, string itname) menuitemtab_spawn =
{
//a tab itself is little different from a frame, just has no implicit focus, and has a title
mitem_tab n = spawn(mitem_tab, item_text:itname, frame_hasscroll:TRUE);
tabs.addr(n, RS_X_MIN_PARENT_MIN|RS_Y_MIN_PARENT_MIN | RS_X_MAX_PARENT_MAX|RS_Y_MAX_PARENT_MAX, '0 0', '0 0');
return n;
};