]> skyeroc.xyz Git - dgamelaunch/commitdiff
Allow sorting by all of the fields in the watching-menu.
authorPasi Kallinen <paxed@alt.org>
Mon, 19 Oct 2009 19:29:47 +0000 (19:29 +0000)
committerPasi Kallinen <paxed@alt.org>
Mon, 19 Oct 2009 19:29:47 +0000 (19:29 +0000)
git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@507 db0b04b0-f4d1-0310-9a6d-de3e77497b0e

dgamelaunch.c
dgamelaunch.h
dgl-common.c
examples/dgamelaunch.conf

index 781c4670b0eae54239901a39dde7a767a1570d01..b2dc69e6ae38132be6e40d8ccd98e0b09b5f3e32 100644 (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++)
index 4d4a793661c78ea0732f2b355866d9568efe2e86..738a8d01a58330c9d453e58fb933032b8f15ef9d 100644 (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"
 };
 
index cffd9e2fcd2db07d2ab4a522d58ed5fc71472726..7a4e517984609ea058c96158f39358302d229c77 100644 (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;
index 0c203e58b72fa044f9fe150a79598be4dd06de35..95c31a2954f59f04f5d673237cb7f8a8f278eda8 100644 (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.