tournois.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /* $Id: tournois.c,v 1.4 2001/05/07 02:41:36 kilobug Exp $ */
  2. #include "mclient.h"
  3. #include "tournois.h"
  4. typedef struct _tournois_t
  5. {
  6. int mapid, nbc;
  7. GtkWidget *nbp, *nbt, *nbm, *methode, *cmd;
  8. int *champ;
  9. } tournois_t;
  10. static void kill_trn_window(GtkWidget *wid, rt_t *rt)
  11. {
  12. if (rt->dialog == NULL)
  13. return;
  14. gtk_widget_destroy(rt->dialog);
  15. rt->dialog = NULL;
  16. rt->textarea = NULL;
  17. rt->disp = FALSE;
  18. }
  19. static void kill_trn(GtkWidget *wid, rt_t *rt)
  20. {
  21. rt->nbm = 0;
  22. }
  23. static char *trn_met[] = { "Combinatoire", "Aléatoire", NULL, "Rotatif",
  24. "Pyramidal", NULL };
  25. static void run_trn_commit(GtkWidget *wid, tournois_t *trn)
  26. {
  27. rt_t *rt;
  28. char *s;
  29. int i;
  30. GtkWidget *sw, *dial, *widget, *hbox;
  31. GtkScrolledWindow *scrw;
  32. rt = g_malloc(sizeof(*rt));
  33. rt->mapid = trn->mapid;
  34. rt->nbc = trn->nbc;
  35. rt->champ = trn->champ;
  36. rt->cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(trn->cmd)));
  37. set_data_from_spin(trn->nbp, &rt->nbp);
  38. set_data_from_spin(trn->nbt, &rt->nbt);
  39. set_data_from_spin(trn->nbm, &rt->nbm);
  40. s = gtk_entry_get_text(GTK_ENTRY(trn->methode));
  41. for (i = 0; trn_met[i] != NULL; i++)
  42. if (!strcmp(trn_met[i], s))
  43. break;
  44. rt->scores = g_malloc(sizeof(*rt->scores) * rt->nbp);
  45. rt->methode = i;
  46. rt->disp = rt->run = TRUE;
  47. rt->cur = 0;
  48. rt->buf = g_strdup("");
  49. rt->chmp = g_malloc(sizeof(int) * rt->nbp);
  50. s = mysql_get_str(gl_config->mysql,
  51. "SELECT fichier FROM Maps "
  52. "WHERE id=%d", rt->mapid);
  53. if (!g_path_is_absolute(s))
  54. {
  55. rt->map = g_strconcat(getenv("PROLO_DATA_DIR"),
  56. G_DIR_SEPARATOR_S, s, NULL);
  57. g_free(s);
  58. }
  59. else
  60. rt->map = s;
  61. trn_init(rt);
  62. /* Main box */
  63. dial = rt->dialog = gtk_dialog_new();
  64. gtk_widget_hide(dial);
  65. gtk_signal_connect(GTK_OBJECT(dial), "destroy",
  66. GTK_SIGNAL_FUNC(kill_trn_window), rt);
  67. gtk_window_set_title(GTK_WINDOW(dial), "Suivi d'un tournois");
  68. gtk_container_set_border_width(GTK_CONTAINER(&(GTK_DIALOG(dial)->window)),
  69. 7);
  70. sw = gtk_scrolled_window_new(NULL, NULL);
  71. scrw = GTK_SCROLLED_WINDOW(sw);
  72. rt->textarea = gtk_text_new(gtk_scrolled_window_get_hadjustment(scrw),
  73. gtk_scrolled_window_get_vadjustment(scrw));
  74. gtk_text_set_word_wrap(GTK_TEXT(rt->textarea), FALSE);
  75. gtk_text_set_line_wrap(GTK_TEXT(rt->textarea), TRUE);
  76. gtk_text_set_editable(GTK_TEXT(rt->textarea), FALSE);
  77. gtk_widget_show(sw);
  78. gtk_scrolled_window_set_policy(scrw, GTK_POLICY_AUTOMATIC,
  79. GTK_POLICY_AUTOMATIC);
  80. gtk_container_add(GTK_CONTAINER(sw), rt->textarea);
  81. gtk_widget_show(rt->textarea);
  82. /* Buttons */
  83. hbox = gtk_hbox_new(FALSE, 3);
  84. gtk_widget_show(hbox);
  85. widget = gtk_button_new_with_label(" Arrêter ");
  86. gtk_widget_show(widget);
  87. gtk_signal_connect(GTK_OBJECT(widget), "clicked",
  88. GTK_SIGNAL_FUNC(kill_trn), rt);
  89. gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 9);
  90. widget = gtk_button_new_with_label(" Fermer ");
  91. gtk_widget_show(widget);
  92. gtk_signal_connect(GTK_OBJECT(widget), "clicked",
  93. GTK_SIGNAL_FUNC(kill_trn_window), rt);
  94. gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 9);
  95. gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dial)->action_area), hbox, TRUE,
  96. TRUE, 9);
  97. gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dial)->vbox), sw, TRUE,
  98. TRUE, 9);
  99. gtk_window_set_default_size(GTK_WINDOW(&(GTK_DIALOG(dial)->window)),
  100. 340, 280);
  101. gtk_widget_show(rt->dialog);
  102. }
  103. GtkWidget *start_tournois_box()
  104. {
  105. tournois_t *trn;
  106. GtkWidget *dialog = NULL, *tbl = NULL, *wid = NULL;
  107. GList *l, *maps, *prgs;
  108. int nbp, i;
  109. if (!gl_config->staff)
  110. {
  111. wid = create_label("Fonctionnalité réservée aux organisateurs.");
  112. return create_dialog("Lancement d'un trounois", wid, NULL,
  113. " Annuler ", NULL, NULL, destroy_widget);
  114. }
  115. maps = GTK_CLIST(gl_config->mapl)->selection;
  116. if (maps == NULL)
  117. {
  118. wid = create_label("Aucune carte sélectionnée.");
  119. return create_dialog("Erreur", wid, NULL, " Fermer ", NULL, NULL,
  120. destroy_widget);
  121. }
  122. prgs = GTK_CLIST(gl_config->prgl)->selection;
  123. if (prgs == NULL)
  124. {
  125. wid = create_label("Aucun champion sélectionné.");
  126. return create_dialog("Erreur", wid, NULL, " Fermer ", NULL, NULL,
  127. destroy_widget);
  128. }
  129. trn = g_malloc(sizeof(*trn));
  130. trn->nbc = g_list_length(prgs);
  131. trn->champ = g_malloc(sizeof(*(trn->champ)) * trn->nbc);
  132. for (i = 0, l = prgs; l != NULL; l = l->next, i++)
  133. trn->champ[i] = *((int *)
  134. gtk_clist_get_row_data(GTK_CLIST(gl_config->prgl),
  135. GPOINTER_TO_INT(l->data)));
  136. trn->mapid = *((int *) gtk_clist_get_row_data(GTK_CLIST(gl_config->mapl),
  137. GPOINTER_TO_INT(maps->data)));
  138. nbp = mysql_get_int(gl_config->mysql,
  139. "SELECT joueurs FROM Maps where id=%d", trn->mapid);
  140. tbl = gtk_table_new(2, 5, FALSE);
  141. gtk_widget_show(tbl);
  142. dialog = create_dialog("Lancement d'un tournois", tbl, " Valider ",
  143. " Annuler ", run_trn_commit, trn, destroy_widget);
  144. gtk_table_attach_defaults(GTK_TABLE(tbl), create_label(" Tours: "),
  145. 0, 1, 0, 1);
  146. trn->nbt = create_spin(1, 5000, 200);
  147. gtk_tooltips_set_tip(gl_config->tooltips, trn->nbt,
  148. "Nombre de tours que dureront les parties", "");
  149. gtk_table_attach_defaults(GTK_TABLE(tbl), trn->nbt, 1, 2, 0, 1);
  150. gtk_table_attach_defaults(GTK_TABLE(tbl), create_label(" Joueurs: "),
  151. 0, 1, 1, 2);
  152. trn->nbp = create_spin(1, MIN(nbp, trn->nbc), MIN(nbp, trn->nbc));
  153. gtk_tooltips_set_tip(gl_config->tooltips, trn->nbp,
  154. "Nombre de joueurs par partie", "");
  155. gtk_table_attach_defaults(GTK_TABLE(tbl), trn->nbp, 1, 2, 1, 2);
  156. gtk_table_attach_defaults(GTK_TABLE(tbl), create_label(" Nb matchs: "),
  157. 0, 1, 3, 4);
  158. trn->nbm = create_spin(1, 10000, trn->nbc * 2);
  159. gtk_tooltips_set_tip(gl_config->tooltips, trn->nbm,
  160. "Nombre de matchs maximum", "");
  161. gtk_table_attach_defaults(GTK_TABLE(tbl), trn->nbm, 1, 2, 3, 4);
  162. gtk_table_attach_defaults(GTK_TABLE(tbl), create_label("Paramètres: "),
  163. 0, 1, 4, 5);
  164. trn->cmd = create_entry(NULL, 100);
  165. gtk_signal_connect(GTK_OBJECT(trn->cmd), "activate",
  166. run_trn_commit, trn);
  167. gtk_signal_connect_after(GTK_OBJECT(trn->cmd), "activate",
  168. destroy_widget, dialog);
  169. gtk_tooltips_set_tip(gl_config->tooltips, trn->cmd,
  170. "Paramètres supplémentaires à passer au serveur", "");
  171. gtk_table_attach_defaults(GTK_TABLE(tbl), trn->cmd, 1, 2, 4, 5);
  172. l = NULL;
  173. for (i = 0; trn_met[i] != NULL; i++)
  174. l = g_list_append(l, trn_met[i]);
  175. gtk_table_attach_defaults(GTK_TABLE(tbl), create_label(" Méthode: "),
  176. 0, 1, 2, 3);
  177. wid = gtk_combo_new();
  178. gtk_widget_show(wid);
  179. gtk_tooltips_set_tip(gl_config->tooltips, GTK_COMBO(wid)->entry,
  180. "Méthode d'exécution des matchs", "");
  181. gtk_combo_set_popdown_strings(GTK_COMBO(wid), l);
  182. gtk_combo_set_value_in_list(GTK_COMBO(wid), TRUE, TRUE);
  183. gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wid)->entry), l->data);
  184. gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(wid)->entry), FALSE);
  185. gtk_table_attach_defaults(GTK_TABLE(tbl), wid, 1, 2, 2, 3);
  186. trn->methode = GTK_COMBO(wid)->entry;
  187. g_list_free(l);
  188. gtk_object_set_data_full(GTK_OBJECT(dialog), "42", trn,
  189. (GtkDestroyNotify) free);
  190. return dialog;
  191. }