cd50a54a5a
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5812 fc73d0e0-1445-4013-8a0c-d673dee63da5
191 lines
6.7 KiB
C++
191 lines
6.7 KiB
C++
#include "../menusys/mitem_grid.qc"
|
|
|
|
enum : int
|
|
{
|
|
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...
|
|
__using getpackagemanagerinfo, ftoi;
|
|
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 =
|
|
{
|
|
__using getpackagemanagerinfo, ftoi;
|
|
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 =
|
|
{
|
|
__using getpackagemanagerinfo, ftoi;
|
|
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 =
|
|
{
|
|
__using getpackagemanagerinfo, ftoi;
|
|
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;
|
|
|
|
if (!checkbuiltin(getpackagemanagerinfo))
|
|
return; //not supported in this engine...
|
|
|
|
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);
|
|
};
|