Allow sorting by all of the fields in the watching-menu.

git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@507 db0b04b0-f4d1-0310-9a6d-de3e77497b0e
This commit is contained in:
Pasi Kallinen 2009-10-19 19:29:47 +00:00
parent 91675def98
commit ae11d81827
4 changed files with 61 additions and 10 deletions

View File

@ -440,16 +440,20 @@ inprogressmenu (int gameid)
if (len > 0) {
mvaddstr (3, 1, "The following games are in progress:");
#define dgl_sortprintw(mode, x, str) \
if (sortmode == mode) attron(title_attr); \
mvprintw(top_banner_hei,x,str); \
if (sortmode == mode) attroff(title_attr);
mvprintw(top_banner_hei,1," ");
if (sortmode == SORTMODE_USERNAME) attron(title_attr);
mvprintw(top_banner_hei,4,"Username");
if (sortmode == SORTMODE_USERNAME) attroff(title_attr);
mvprintw(top_banner_hei,21,"Game");
mvprintw(top_banner_hei,29,"Size");
mvprintw(top_banner_hei,37,"Start date & time");
if (sortmode == SORTMODE_IDLETIME) attron(title_attr);
mvprintw(top_banner_hei,58,"Idle time");
if (sortmode == SORTMODE_IDLETIME) attroff(title_attr);
dgl_sortprintw(SORTMODE_USERNAME, 4, "Username")
dgl_sortprintw(SORTMODE_GAMENUM, 21, "Game")
dgl_sortprintw(SORTMODE_WINDOWSIZE, 29, "Size")
dgl_sortprintw(SORTMODE_STARTTIME, 37, "Start date & time")
dgl_sortprintw(SORTMODE_IDLETIME, 58, "Idle time")
#undef dgl_sortprintw
}
for (i = 0; i < max_height; i++)

View File

@ -13,6 +13,7 @@
# define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
#define dglsign(x) (x < 0 ? -1 : (x > 0 ? 1 : 0))
typedef enum
{
@ -146,6 +147,9 @@ typedef enum
{
SORTMODE_NONE = 0,
SORTMODE_USERNAME,
SORTMODE_GAMENUM,
SORTMODE_WINDOWSIZE,
SORTMODE_STARTTIME,
SORTMODE_IDLETIME,
NUM_SORTMODES
} dg_sortmode;
@ -153,6 +157,9 @@ typedef enum
static const char *SORTMODE_NAME[NUM_SORTMODES] = {
"Unsorted",
"Username",
"Game",
"Windowsize",
"Starttime",
"Idletime"
};

View File

@ -379,12 +379,51 @@ sort_game_idletime(const void *g1, const void *g2)
return strcasecmp(game1->name, game2->name);
}
static int
sort_game_gamenum(const void *g1, const void *g2)
{
const struct dg_game *game1 = *(const struct dg_game **)g1;
const struct dg_game *game2 = *(const struct dg_game **)g2;
if (game2->gamenum != game1->gamenum)
return dglsign(game2->gamenum - game1->gamenum);
else
return strcasecmp(game1->name, game2->name);
}
static int
sort_game_windowsize(const void *g1, const void *g2)
{
const struct dg_game *game1 = *(const struct dg_game **)g1;
const struct dg_game *game2 = *(const struct dg_game **)g2;
if (game2->ws_col != game1->ws_col)
return dglsign(game1->ws_col - game2->ws_col);
if (game2->ws_row != game1->ws_row)
return dglsign(game1->ws_row - game2->ws_row);
return strcasecmp(game1->name, game2->name);
}
static int
sort_game_starttime(const void *g1, const void *g2)
{
const struct dg_game *game1 = *(const struct dg_game **)g1;
const struct dg_game *game2 = *(const struct dg_game **)g2;
int i = strcmp(game1->date, game2->date);
if (!i)
i = strcmp(game1->time, game2->time);
if (!i)
return strcasecmp(game1->name, game2->name);
return i;
}
struct dg_game **
sort_games (struct dg_game **games, int len, dg_sortmode sortmode)
{
switch (sortmode) {
case SORTMODE_USERNAME: qsort(games, len, sizeof(struct dg_game *), sort_game_username); break;
case SORTMODE_GAMENUM: qsort(games, len, sizeof(struct dg_game *), sort_game_gamenum); break;
case SORTMODE_WINDOWSIZE: qsort(games, len, sizeof(struct dg_game *), sort_game_windowsize); break;
case SORTMODE_IDLETIME: qsort(games, len, sizeof(struct dg_game *), sort_game_idletime); break;
case SORTMODE_STARTTIME: qsort(games, len, sizeof(struct dg_game *), sort_game_starttime); break;
default: ;
}
return games;

View File

@ -20,7 +20,8 @@ allow_new_nicks = yes
maxnicklen = 10
# Set the default watching-screen sorting mode. Can be one of
# "unsorted", "username" or "idletime". Unsorted is the default.
# "unsorted", "username", "game", "windowsize", "starttime" or "idletime".
# Unsorted is the default.
#sortmode = "username"
# Path to a prepared chroot jail.