mirror of
https://github.com/nzp-team/fteqw.git
synced 2025-03-10 18:31:45 +00:00
Added autorun setting. Fixed greying of options that are not supported by the engine. Fixed keyboard navigation for general widgets (special menus might still be annoying). git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5285 fc73d0e0-1445-4013-8a0c-d673dee63da5
168 lines
4.7 KiB
C++
168 lines
4.7 KiB
C++
/***************************************************************************
|
|
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;
|
|
};
|