121 lines
3.4 KiB
Plaintext
121 lines
3.4 KiB
Plaintext
/***************************************************************************
|
|
key binding item.
|
|
interactable - queries binds for a command, and accepts new scan codes to bind for its given command.
|
|
*/
|
|
class mitem_bind : mitem
|
|
{
|
|
virtual void(vector pos) item_draw;
|
|
virtual float(vector pos, float scan, float char, float down) item_keypress;
|
|
virtual void(mitem newfocus, float flag) item_focuschange;
|
|
|
|
void() mitem_bind =
|
|
{
|
|
item_scale = item_size[1];
|
|
|
|
item_flags |= IF_SELECTABLE;
|
|
|
|
item_text = strzone(item_text);
|
|
item_command = strzone(item_command);
|
|
};
|
|
virtual void() item_remove =
|
|
{
|
|
strunzone(item_text);
|
|
strunzone(item_command);
|
|
};
|
|
};
|
|
#define menuitembind_spawn(text,command,sz) \
|
|
spawn(mitem_bind, \
|
|
item_text: text, \
|
|
item_command: command, \
|
|
item_size: sz \
|
|
)
|
|
|
|
void(vector pos) mitem_bind::item_draw =
|
|
{
|
|
#ifdef CSQC
|
|
tokenize(findkeysforcommandex(self.item_command));
|
|
string key1 = argv(0);
|
|
string key2 = argv(1);
|
|
#else
|
|
/*this is not my API...*/
|
|
tokenize(findkeysforcommand(self.item_command));
|
|
string key1 = argv(0);
|
|
string key2 = argv(1);
|
|
if (key1 != "") key1 = (key1=="-1")?"":keynumtostring(stof(key1));
|
|
if (key2 != "") key2 = (key2=="-1")?"":keynumtostring(stof(key2));
|
|
#endif
|
|
|
|
super::item_draw(pos);
|
|
pos_x += self.item_size_x / 2;
|
|
|
|
if (self.item_flags & IF_INTERACT)
|
|
{
|
|
ui.drawstring(pos, "Please press a key", '1 1 0' * self.item_scale, menuitem_textcolour(self), self.item_alpha, 0);
|
|
}
|
|
else
|
|
{
|
|
ui.drawstring(pos, key1, '1 1 0' * self.item_scale, menuitem_textcolour(self), self.item_alpha, 0);
|
|
pos_x += stringwidth(key1, TRUE, '1 1 0'*self.item_scale);
|
|
|
|
if (key2 != "")
|
|
{
|
|
ui.drawstring(pos, " or ", '1 1 0' * self.item_scale, menuitem_textcolour(self), self.item_alpha, 0);
|
|
pos_x += stringwidth(" or ", TRUE, '1 1 0'*self.item_scale);
|
|
|
|
ui.drawstring(pos, key2, '1 1 0' * self.item_scale, menuitem_textcolour(self), self.item_alpha, 0);
|
|
// pos_x += stringwidth(key2, TRUE, '1 1 0'*self.item_scale);
|
|
}
|
|
}
|
|
};
|
|
float(vector pos, float scan, float char, float down) mitem_bind::item_keypress =
|
|
{
|
|
if (!down)
|
|
return FALSE;
|
|
|
|
if (self.item_flags & IF_INTERACT)
|
|
{
|
|
if (scan == K_ESCAPE)
|
|
{
|
|
}
|
|
else if (scan)
|
|
localcmd(sprintf("bind \"%s\" \"%s\"\n", keynumtostring(scan), self.item_command));
|
|
else
|
|
return FALSE;
|
|
self.item_flags -= IF_INTERACT;
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
if (scan == K_ENTER || (scan == K_MOUSE1 && mouseinbox(pos, self.item_size)))
|
|
{
|
|
self.item_flags |= IF_INTERACT;
|
|
return TRUE;
|
|
}
|
|
if (scan == K_DEL || scan == K_BACKSPACE)
|
|
{
|
|
#ifdef CSQC
|
|
float c = tokenize(findkeysforcommandex(self.item_command));
|
|
for (float i = 0; i < c; i++)
|
|
localcmd(sprintf("bind \"%s\" \"\"\n", argv(i)));
|
|
#else
|
|
/*again, this is not my API...*/
|
|
tokenize(findkeysforcommand(self.item_command));
|
|
string key1 = argv(0);
|
|
string key2 = argv(1);
|
|
if (key1 != "") key1 = (key1=="-1")?"":keynumtostring(stof(key1));
|
|
if (key2 != "") key2 = (key2=="-1")?"":keynumtostring(stof(key2));
|
|
if (key1 != "") localcmd(sprintf("bind \"%s\" \"\"\n", key1));
|
|
if (key2 != "") localcmd(sprintf("bind \"%s\" \"\"\n", key2));
|
|
#endif
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
};
|
|
void(mitem newfocus, float flag) mitem_bind::item_focuschange =
|
|
{
|
|
if (!(self.item_flags & IF_KFOCUSED))
|
|
self.item_flags = self.item_flags - (self.item_flags & IF_INTERACT);
|
|
};
|
|
|