Skip to content

Commit 73370bc

Browse files
committed
vertical index by start date sort
1 parent f6ef441 commit 73370bc

File tree

9 files changed

+46
-3
lines changed

9 files changed

+46
-3
lines changed

csp/contests/unpriv_main_page.csp

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ ns_unparse_statement(
1616
const unsigned char *bb,
1717
int is_submittable);
1818

19+
int
20+
compare_prob_with_start_date_name(const int * l, const int * r, const struct section_problem_data **probs) {
21+
if (probs[*l]->start_date > probs[*r]->start_date) {
22+
return -1;
23+
}
24+
if (probs[*l]->start_date < probs[*r]->start_date) {
25+
return 1;
26+
}
27+
// qsort is unstable that why use id as stabilization
28+
return *l - *r;
29+
}
30+
1931
void
2032
ns_unparse_answers(
2133
FILE *fout,
@@ -278,11 +290,22 @@ ns_unparse_answers(
278290
// vertical navigation bar
279291
%></div></td><td class="b0" id="probNavRightList" valign="top"><%
280292
prev_group_name[0] = 0;
281-
282-
for (i = 1, j = 0; i <= cs->max_prob; i++) {
293+
int probs = 0;
294+
int indexes[cs->max_prob];
295+
for (i = 1; i <= cs->max_prob; i++) {
283296
if (!(prob = cs->probs[i])) continue;
284297
if (!(pinfo[i].status & PROB_STATUS_TABABLE)) continue;
298+
indexes[probs] = i;
299+
++probs;
300+
}
301+
if (global->vertical_navigation_sdate_sort > 0) {
302+
qsort_r(indexes, probs, sizeof(indexes[0]), compare_prob_with_start_date_name, cs->probs);
303+
}
285304

305+
for (j = 0; j < probs; ++j) {
306+
i = indexes[j];
307+
if (!(prob = cs->probs[i])) continue;
308+
if (!(pinfo[i].status & PROB_STATUS_TABABLE)) continue;
286309
if (prob->group_name && strcmp(prob->group_name, prev_group_name)) {
287310
%><div class="probDisabled"><s:v value="prob->group_name" escape="false" /></div><%
288311
snprintf(prev_group_name, sizeof(prev_group_name), "%s", prob->group_name);
@@ -303,7 +326,6 @@ ns_unparse_answers(
303326
}
304327
%><s:url name="ProblemUrl" ac="view-problem-submit"><s:param name="prob_id" value="i" /></s:url><%
305328
%><s:a class="tab" url="ProblemUrl"><s:v value="prob->short_name" escape="false" /></s:a></div><%
306-
j++;
307329
}
308330
%></td></tr></table>
309331
<%

csp/super-server/cnts_edit_cur_global_page.csp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ static const unsigned char MSG_disable_user_standings[] = "Disable build-in stan
4444
static const unsigned char MSG_disable_language[] = "Disable language column in new-client";
4545
static const unsigned char MSG_problem_navigation[] = "Advanced problem navigation";
4646
static const unsigned char MSG_vertical_navigation[] = "Place problem navigation vertically";
47+
static const unsigned char MSG_vertical_navigation_sdate_sort[] = "Sort problem navigation vertically with problem start_date descending";
4748
static const unsigned char MSG_disable_virtual_start[] = "Disable user Virtual start button";
4849
static const unsigned char MSG_disable_virtual_auto_judge[] = "Disable auto-judging after virtual olympiad";
4950
static const unsigned char MSG_enable_auto_print_protocol[] = "Enable automatic protocol printing";
@@ -328,6 +329,7 @@ static const unsigned char * const form_row_attrs[]=
328329
<%@expand EDIT_BOOL_ROW "disable_language" "caps" "400px" %>
329330
<%@expand EDIT_BOOL_ROW "problem_navigation" "caps" "400px" %>
330331
<%@expand EDIT_BOOL_ROW "vertical_navigation" "caps" "400px" %>
332+
<%@expand EDIT_BOOL_ROW "vertical_navigation_sdate_sort" "caps" "400px" %>
331333
<%@expand EDIT_BOOL_ROW "disable_virtual_start" "caps" "400px" %>
332334
<%@expand EDIT_BOOL_ROW "disable_virtual_auto_judge" "caps" "400px" %>
333335
<%@expand EDIT_BOOL_ROW "enable_auto_print_protocol" "caps" "400px" %>
@@ -896,6 +898,7 @@ function popupCapsDialog(e, skipField)
896898
"disable_language",
897899
"problem_navigation",
898900
"vertical_navigation",
901+
"vertical_navigation_sdate_sort",
899902
"disable_virtual_start",
900903
"disable_virtual_auto_judge",
901904
"enable_auto_print_protocol",
@@ -926,6 +929,7 @@ function capsDialogOnChange()
926929
$("#caps-disable_banner_page-div").toggle($("#caps-enable_printing").is(':checked'));
927930
$("#caps-printout_uses_login-div").toggle($("#caps-enable_printing").is(':checked') && $("#caps-disable_banner_page").is(':checked'));
928931
$("#caps-vertical_navigation-div").toggle($("#caps-problem_navigation").is(':checked'));
932+
$("#caps-vertical_navigation_sdate_sort-div").toggle($("#caps-problem_navigation").is(':checked'));
929933
$("#caps-disable_virtual_start-div").toggle(<s:v type="jsbool" value="global->is_virtual > 0" />);
930934
$("#caps-disable_virtual_auto_judge-div").toggle(<s:v type="jsbool" value="global->score_system == SCORE_OLYMPIAD" />);
931935
$("#caps-enable_auto_print_protocol-div").toggle(<s:v type="jsbool" value="global->score_system == SCORE_OLYMPIAD" />);
@@ -1438,6 +1442,7 @@ function advancedDialogOnChange()
14381442
<%@expand ORIG_BOOL_ROW "disable_language" %>
14391443
<%@expand ORIG_BOOL_ROW "problem_navigation" %>
14401444
<%@expand ORIG_BOOL_ROW "vertical_navigation" %>
1445+
<%@expand ORIG_BOOL_ROW "vertical_navigation_sdate_sort" %>
14411446
<%@expand ORIG_BOOL_ROW "disable_virtual_start" %>
14421447
<%@expand ORIG_BOOL_ROW "disable_virtual_auto_judge" %>
14431448
<%@expand ORIG_BOOL_ROW "enable_auto_print_protocol" %>

csp/super-server/glob_save_capabilities_form.csp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
ejintbool_t disable_language = 0;
3636
ejintbool_t problem_navigation = 0;
3737
ejintbool_t vertical_navigation = 0;
38+
ejintbool_t vertical_navigation_sdate_sort = 0;
3839
ejintbool_t disable_virtual_start = 0;
3940
ejintbool_t disable_virtual_auto_judge = 0;
4041
ejintbool_t enable_auto_print_protocol = 0;
@@ -72,6 +73,7 @@
7273
%><s:read var="disable_language" default="0" /><%
7374
%><s:read var="problem_navigation" default="0" /><%
7475
%><s:read var="vertical_navigation" default="0" /><%
76+
%><s:read var="vertical_navigation_sdate_sort" default="0" /><%
7577
%><s:read var="disable_virtual_start" default="0" /><%
7678
%><s:read var="disable_virtual_auto_judge" default="0" /><%
7779
%><s:read var="enable_auto_print_protocol" default="0" /><%
@@ -109,6 +111,7 @@
109111
global->disable_language = disable_language;
110112
global->problem_navigation = problem_navigation;
111113
global->vertical_navigation = vertical_navigation;
114+
global->vertical_navigation_sdate_sort = vertical_navigation_sdate_sort;
112115
global->disable_virtual_start = disable_virtual_start;
113116
global->disable_virtual_auto_judge = disable_virtual_auto_judge;
114117
global->enable_auto_print_protocol = enable_auto_print_protocol;

gen/prepare_meta.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ static struct meta_info_item meta_info_section_global_data_data[] =
6666
[CNTSGLOB_problem_navigation] = { CNTSGLOB_problem_navigation, 'B', XSIZE(struct section_global_data, problem_navigation), "problem_navigation", XOFFSET(struct section_global_data, problem_navigation) },
6767
[CNTSGLOB_problem_tab_size] = { CNTSGLOB_problem_tab_size, 'i', XSIZE(struct section_global_data, problem_tab_size), "problem_tab_size", XOFFSET(struct section_global_data, problem_tab_size) },
6868
[CNTSGLOB_vertical_navigation] = { CNTSGLOB_vertical_navigation, 'B', XSIZE(struct section_global_data, vertical_navigation), "vertical_navigation", XOFFSET(struct section_global_data, vertical_navigation) },
69+
[CNTSGLOB_vertical_navigation_sdate_sort] = { CNTSGLOB_vertical_navigation_sdate_sort, 'B', XSIZE(struct section_global_data, vertical_navigation_sdate_sort), "vertical_navigation_sdate_sort", XOFFSET(struct section_global_data, vertical_navigation_sdate_sort) },
6970
[CNTSGLOB_disable_virtual_start] = { CNTSGLOB_disable_virtual_start, 'B', XSIZE(struct section_global_data, disable_virtual_start), "disable_virtual_start", XOFFSET(struct section_global_data, disable_virtual_start) },
7071
[CNTSGLOB_disable_virtual_auto_judge] = { CNTSGLOB_disable_virtual_auto_judge, 'B', XSIZE(struct section_global_data, disable_virtual_auto_judge), "disable_virtual_auto_judge", XOFFSET(struct section_global_data, disable_virtual_auto_judge) },
7172
[CNTSGLOB_enable_auto_print_protocol] = { CNTSGLOB_enable_auto_print_protocol, 'B', XSIZE(struct section_global_data, enable_auto_print_protocol), "enable_auto_print_protocol", XOFFSET(struct section_global_data, enable_auto_print_protocol) },

include/ejudge/meta/prepare_meta.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ enum
6161
CNTSGLOB_problem_navigation,
6262
CNTSGLOB_problem_tab_size,
6363
CNTSGLOB_vertical_navigation,
64+
CNTSGLOB_vertical_navigation_sdate_sort,
6465
CNTSGLOB_disable_virtual_start,
6566
CNTSGLOB_disable_virtual_auto_judge,
6667
CNTSGLOB_enable_auto_print_protocol,

include/ejudge/prepare.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ struct section_global_data
264264
int problem_tab_size;
265265
/** display problem tabs vertically */
266266
ejintbool_t vertical_navigation;
267+
/** use start_date sort order instead of problem id */
268+
ejintbool_t vertical_navigation_sdate_sort;
267269
/** disable "virtual start" command for contestants */
268270
ejintbool_t disable_virtual_start;
269271
/** disable auto-judging after virtual olympiad is finished for a user */

include/ejudge/prepare_dflt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
#define DFLT_G_DISABLE_LANGUAGE 0
115115
#define DFLT_G_PROBLEM_NAVIGATION 0
116116
#define DFLT_G_VERTICAL_NAVIGATION 0
117+
#define DFLT_G_VERTICAL_NAVIGATION_SDATE_SORT 0
117118
#define DFLT_G_DISABLE_VIRTUAL_START 0
118119
#define DFLT_G_DISABLE_VIRTUAL_AUTO_JUDGE 0
119120
#define DFLT_G_ENABLE_AUTO_PRINT_PROTOCOL 0

lib/prepare.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ static const struct config_parse_info section_global_params[] =
108108
GLOBAL_PARAM(problem_navigation, "d"),
109109
GLOBAL_PARAM(problem_tab_size, "d"),
110110
GLOBAL_PARAM(vertical_navigation, "d"),
111+
GLOBAL_PARAM(vertical_navigation_sdate_sort, "d"),
111112
GLOBAL_PARAM(disable_virtual_start, "d"),
112113
GLOBAL_PARAM(disable_virtual_auto_judge, "d"),
113114
GLOBAL_PARAM(enable_auto_print_protocol, "d"),
@@ -884,6 +885,7 @@ global_init_func(struct generic_section_config *gp)
884885
p->disable_language = -1;
885886
p->problem_navigation = -1;
886887
p->vertical_navigation = -1;
888+
p->vertical_navigation_sdate_sort = -1;
887889
p->disable_virtual_start = -1;
888890
p->disable_virtual_auto_judge = -1;
889891
p->enable_auto_print_protocol = -1;
@@ -2826,6 +2828,8 @@ set_defaults(
28262828
g->problem_navigation = DFLT_G_PROBLEM_NAVIGATION;
28272829
if (g->vertical_navigation == -1)
28282830
g->vertical_navigation = DFLT_G_VERTICAL_NAVIGATION;
2831+
if (g->vertical_navigation_sdate_sort == -1)
2832+
g->vertical_navigation_sdate_sort = DFLT_G_VERTICAL_NAVIGATION_SDATE_SORT;
28292833
if (g->disable_virtual_start == -1)
28302834
g->disable_virtual_start = DFLT_G_DISABLE_VIRTUAL_START;
28312835
if (g->disable_virtual_auto_judge == -1)
@@ -5474,6 +5478,7 @@ prepare_set_global_defaults(
54745478
if (g->disable_language < 0) g->disable_language = DFLT_G_DISABLE_LANGUAGE;
54755479
if (g->problem_navigation < 0) g->problem_navigation = DFLT_G_PROBLEM_NAVIGATION;
54765480
if (g->vertical_navigation < 0) g->vertical_navigation = DFLT_G_VERTICAL_NAVIGATION;
5481+
if (g->vertical_navigation_sdate_sort < 0) g->vertical_navigation_sdate_sort = DFLT_G_VERTICAL_NAVIGATION_SDATE_SORT;
54775482
if (g->disable_virtual_start < 0) g->disable_virtual_start = DFLT_G_DISABLE_VIRTUAL_START;
54785483
if (g->disable_virtual_auto_judge < 0) g->disable_virtual_auto_judge = DFLT_G_DISABLE_VIRTUAL_AUTO_JUDGE;
54795484
if (g->enable_auto_print_protocol < 0) g->enable_auto_print_protocol = DFLT_G_ENABLE_AUTO_PRINT_PROTOCOL;
@@ -5758,6 +5763,7 @@ prepare_new_global_section(int contest_id, const unsigned char *root_dir,
57585763
global->disable_language = DFLT_G_DISABLE_LANGUAGE;
57595764
global->problem_navigation = 1;
57605765
global->vertical_navigation = DFLT_G_VERTICAL_NAVIGATION;
5766+
global->vertical_navigation_sdate_sort = DFLT_G_VERTICAL_NAVIGATION_SDATE_SORT;
57615767
global->disable_virtual_start = DFLT_G_DISABLE_VIRTUAL_START;
57625768
global->disable_virtual_auto_judge = DFLT_G_DISABLE_VIRTUAL_AUTO_JUDGE;
57635769
global->enable_auto_print_protocol = DFLT_G_ENABLE_AUTO_PRINT_PROTOCOL;

lib/prepare_out.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,8 @@ prepare_unparse_global(
266266
unparse_bool(f, "problem_navigation", global->problem_navigation);
267267
if (global->vertical_navigation != DFLT_G_VERTICAL_NAVIGATION)
268268
unparse_bool(f, "vertical_navigation", global->vertical_navigation);
269+
if (global->vertical_navigation_sdate_sort != DFLT_G_VERTICAL_NAVIGATION_SDATE_SORT)
270+
unparse_bool(f, "vertical_navigation_sdate_sort", global->vertical_navigation_sdate_sort);
269271
if (global->disable_virtual_start != DFLT_G_DISABLE_VIRTUAL_START)
270272
unparse_bool(f, "disable_virtual_start", global->disable_virtual_start);
271273
if (global->disable_virtual_auto_judge != DFLT_G_DISABLE_VIRTUAL_AUTO_JUDGE)

0 commit comments

Comments
 (0)