fteqw/quakec/menusys/menu/updates.qc
Spoike c949500da8 Implement preliminary openxr plugin. inputs are still useless (can HOPEFULLY result in some prints, but nothing else), and there's no considerations for 2d things.
Fix prediction issues with the ftenq protocol.
Fix some console image previews.
Added mod_precache cvar. set to 0 to significantly reduce memory usage in xonotic...
Prevent xonotic's random file writes from forcing full worker syncs, for faster loading.
QTV connections are now accepted only from localhost peers by default.



git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5694 fc73d0e0-1445-4013-8a0c-d673dee63da5
2020-05-14 15:50:26 +00:00

184 lines
6.4 KiB
C++

#include "../menusys/mitem_grid.qc"
enum
{
GPMI_NAME, //name of the package, for use with the pkg command.
GPMI_CATEGORY, //category text
GPMI_TITLE, //name of the package, for showing the user.
GPMI_VERSION, //version info (may have multiple with the same name but different versions)
GPMI_DESCRIPTION, //some blurb
GPMI_LICENSE, //what license its distributed under
GPMI_AUTHOR, //name of the person(s) who created it
GPMI_WEBSITE, //where to contribute/find out more info/etc
GPMI_INSTALLED, //current state
GPMI_ACTION, //desired state
GPMI_AVAILABLE, //whether it may be downloaded or not.
GPMI_FILESIZE, //whether it may be downloaded or not.
};
class mitem_updategrid : mitem_grid
{
virtual void(vector pos) item_draw =
{ //make sure we see any updates as they're detected...
if (getpackagemanagerinfo(grid_numchildren, GPMI_NAME))
{
grid_numchildren++;
while(getpackagemanagerinfo(grid_numchildren, GPMI_NAME))
grid_numchildren++;
item_resized();
}
super::item_draw(pos);
};
virtual void(vector pos, float idx) grid_draw;
virtual float(vector pos, float scan, float char, float down, float idx) grid_keypress;
// virtual void(float olditem, float newitem) grid_selectionchanged;
};
void(vector pos, float idx) mitem_updategrid::grid_draw =
{
string text = getpackagemanagerinfo(idx, GPMI_TITLE);
vector col = item_rgb;
if (item_flags & IF_MFOCUSED && idx == grid_mactive)
col_z = 0;
if (item_flags & IF_KFOCUSED && idx == grid_kactive)
col_x = 0;
string status = getpackagemanagerinfo(idx, GPMI_INSTALLED);
string action = getpackagemanagerinfo(idx, GPMI_ACTION);
if (action == "purge") //delete the thing
action = "^&F4 ";
else if (action=="reinstall") //purge then reinstall(the purge status was explicit at least.)
action = "^&F2P";
else if (action=="user") //install(explcitly by user)
action = "^&F2 ";
else if (action=="auto") //install(to satisfy dependancies)
action = "^&FA ";
else if (action=="disable")
action = "^&FE ";
else if (action=="retain")
action = "^&FE ";
else
action = "^&F4 ";
if (status == "0%" || status == "pending")
{
ui.drawfill(pos, [item_size_x, item_scale], '0 0 0.5', 0.1, 0);
action = status = " ";
}
else if (strstrofs(status, "%")>=0)
{
float frac = stof(status)/100;
ui.drawfill(pos, [item_size_x*frac, item_scale], '0 0 0.5', 0.9, 0);
action = status = " ";
}
else if (status == "corrupt")
status = "^&FE?"; //yellow
else if (status == "enabled")
status = "^&F2 "; //green
else if (status == "present")
status = "^&FE "; //yellow
else
status = "^&F4 "; //red
ui.drawstring(pos, strcat(status, action, "^&F-", text), '1 1 0' * item_scale, col, item_alpha, 0);
};
/*void(float olditem, float newitem) mitem_updategrid::grid_selectionchanged =
{
};
*/float(vector pos, float scan, float char, float down, float idx) mitem_updategrid::grid_keypress =
{
string text;
if (!down)
return FALSE;
else if (scan == K_DEL||scan == K_BACKSPACE||scan == K_LEFTARROW)
{
text = getpackagemanagerinfo(idx, GPMI_NAME);
if (!text)
return FALSE;
string action = getpackagemanagerinfo(idx, GPMI_ACTION);
if (action == "purge") //delete the thing
action = "rem";
else if (action=="reinstall") //purge then reinstall(the purge status was explicit at least.)
action = "rem";
else if (action=="user") //install(explcitly by user)
action = "rem";
else if (action=="auto") //install(to satisfy dependancies)
action = "rem";
else
action = "del";
text = strcat("pkg quiet_", action, " \"", text, "\"\n");
localcmd(text);
}
else if (scan == K_RIGHTARROW || scan==K_ENTER || scan == K_MOUSE1)
{
text = getpackagemanagerinfo(idx, GPMI_NAME);
if (!text)
return FALSE;
text = strcat("pkg quiet_add \"", text, "\"\n");
localcmd(text);
}
else
return FALSE;
return TRUE;
};
class menu_updates : mitem_exmenu
{
string filter;
mitem_updategrid grid;
virtual string(string key) get =
{
if (key == "info")
{
string text=__NULL__, tmp;
tmp = getpackagemanagerinfo(grid.grid_kactive, GPMI_VERSION); text = strcat(text, "^aVersion:^a ", tmp?:"Unspecified");
tmp = getpackagemanagerinfo(grid.grid_kactive, GPMI_AUTHOR); text = strcat(text, "\n^aAuthor:^a ", tmp?:"Unknown");
tmp = getpackagemanagerinfo(grid.grid_kactive, GPMI_LICENSE); text = strcat(text, "\n^aLicense:^a ", tmp?:"Unknown");
tmp = getpackagemanagerinfo(grid.grid_kactive, GPMI_WEBSITE); text = strcat(text, "\n^aWebsite:^a ", tmp?:"Unknown");
tmp = getpackagemanagerinfo(grid.grid_kactive, GPMI_DESCRIPTION); text = strcat(text, "\n^aDescription:^a ", tmp?:"No description specified");
return text;
}
return super::get(key);
};
};
void(mitem_desktop desktop) M_Menu_Updates =
{
mitem it;
float h = (480+240)/2;
localcmd("pkg update\n");
//create the menu, give it focus, and make sure its displayed over everything else.
menu_updates m = spawn(menu_updates, item_text:_("Updates List"), item_flags:IF_SELECTABLE, item_command:"m_main", frame_stdheight:h);
desktop.add(m, RS_X_MIN_PARENT_MIN|RS_Y_MIN_PARENT_MIN | RS_X_MAX_PARENT_MAX|RS_Y_MAX_PARENT_MAX, '0 0', '0 0');
desktop.item_focuschange(m, IF_KFOCUSED);
m.totop();
//draw title art above the options
mitem_pic banner = spawn(mitem_pic, item_text:"gfx/ttl_cstm.lmp", item_size_y:24, item_flags:IF_CENTERALIGN);
m.add(banner, RS_X_MIN_PARENT_MID|RS_Y_MIN_PARENT_MID | RS_X_MAX_PARENT_MID|RS_Y_MAX_OWN_MIN, [banner.item_size_x*-0.5, h*-0.5], [banner.item_size_x*0.5, 24]);
//spawn our grid for the actual options. this provides a scrollbar if we have too many items.
m.grid = spawn(mitem_updategrid, item_flags: IF_SELECTABLE, item_scale: 8);
m.add(m.grid, RS_X_MIN_PARENT_MID|RS_Y_MIN_PARENT_MID | RS_X_MAX_PARENT_MID|RS_Y_MAX_PARENT_MID, [-160, h*-0.5+32], [40, h*0.5]);
it = spawn(mitem_label, item_text: "info", item_flags: 0, item_scale: 8);
m.add(it, RS_X_MIN_PARENT_MID|RS_Y_MIN_PARENT_MID | RS_X_MAX_PARENT_MAX|RS_Y_MAX_PARENT_MID, [40, h*-0.5+32], [0, h*0.5-16]);
it = spawn(mitem_button, item_text: "Apply", item_command: "pkg apply\n", item_flags: IF_SELECTABLE, item_scale: 8);
m.add(it, RS_X_MIN_PARENT_MID|RS_Y_MIN_PARENT_MID | RS_X_MAX_PARENT_MAX|RS_Y_MAX_PARENT_MID, [40+1, h*0.5-16+1], [0-1, h*0.5-1]);
//and give us a suitable menu tint too, just because.
addmenuback(m);
};