00001
00010 #include <gtk/gtk.h>
00011 #include <sys/types.h>
00012 #include <sys/stat.h>
00013 #include <fcntl.h>
00014 #include <unistd.h>
00015 #include <stdlib.h>
00016 #include <stdio.h>
00017 #include <string.h>
00018
00019 #include <main.h>
00020 #include <globals.h>
00021 #include <handler.h>
00022 #include <ui.h>
00023 #include <simulation.h>
00024 #include <sys/types.h>
00025 #include <netinet/in.h>
00026 #include <inttypes.h>
00027 #include <strings.h>
00028 #include <savegame_fe.h>
00029 #include <savegame_be.h>
00030 #include <compilerpragmas.h>
00031 #include <uibits.h>
00032
00034 struct city_listselect {
00035 GtkListStore *store;
00036 GtkWidget *list;
00037 GtkWidget *dlg;
00038 savegame_t *sg;
00039 };
00040
00045 static void
00046 free_listselect(struct city_listselect *sel)
00047 {
00048 if (sel == NULL) return;
00049 if (sel->sg) savegame_close(sel->sg);
00050 if (sel->store != NULL) g_object_unref(sel->store);
00051 free(sel);
00052 }
00053
00063 static void
00064 ImportOneFromGame(GtkWidget *widget, gint response, gpointer data)
00065 {
00066 struct city_listselect *sel = (struct city_listselect *)data;
00067
00068 if (response == GTK_RESPONSE_OK) {
00069 GtkTreeSelection *select;
00070 GtkTreeModel *model;
00071 GtkTreeIter iter;
00072 int city = 0;
00073
00074 select = gtk_tree_view_get_selection(GTK_TREE_VIEW(sel->list));
00075 if (gtk_tree_selection_get_selected(select, &model, &iter)) {
00076 gtk_tree_model_get(model, &iter, 0, &city, -1);
00077 }
00078
00079 savegame_getcity(sel->sg, city, &game, (char **)&worldPtr);
00080 PostLoadGame();
00081 DrawGame(1);
00082 MapHasJumped();
00083 }
00084 free_listselect(sel);
00085 gtk_widget_destroy(widget);
00086 }
00087
00095 static void
00096 lsrow_activated(gpointer data)
00097 {
00098 struct city_listselect *sel = (struct city_listselect *)data;
00099
00100 ImportOneFromGame(sel->dlg, GTK_RESPONSE_OK, data);
00101 }
00102
00107 static void
00108 loadCities(savegame_t *sg)
00109 {
00110 int i;
00111 struct city_listselect *ls = malloc(sizeof (struct city_listselect));
00112 GtkTreeIter iter;
00113
00114 ls->store = gtk_list_store_new(2, G_TYPE_UINT, G_TYPE_STRING);
00115 ls->sg = sg;
00116
00117 for (i = 0; i < savegame_citycount(sg); i++) {
00118 gtk_list_store_append(ls->store, &iter);
00119 gtk_list_store_set(ls->store, &iter,
00120 0, i,
00121 1, savegame_getcityname(sg, i),
00122 -1);
00123 }
00124 ls->dlg = gtk_dialog_new_with_buttons("Pick A City",
00125 GTK_WINDOW(window_main_get()), GTK_DIALOG_DESTROY_WITH_PARENT,
00126 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
00127 GTK_STOCK_OK, GTK_RESPONSE_OK,
00128 NULL);
00129
00130 ls->list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls->store));
00131 gtk_tree_view_append_column(GTK_TREE_VIEW(ls->list),
00132 gtk_tree_view_column_new_with_attributes("Name",
00133 gtk_cell_renderer_text_new(), "text", 1, NULL));
00134 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ls->dlg)->vbox),
00135 ls->list, TRUE, TRUE, 0);
00136 g_signal_connect(GTK_OBJECT(ls->dlg), "response",
00137 G_CALLBACK(ImportOneFromGame), ls);
00138 g_signal_connect_swapped(GTK_OBJECT(ls->list), "row-activated",
00139 G_CALLBACK(lsrow_activated), ls);
00140 gtk_widget_show_all(ls->dlg);
00141 }
00142
00149 static void
00150 doOpen(gchar *filename)
00151 {
00152 savegame_t *sg = savegame_open(filename);
00153
00154 if (sg == NULL) {
00155 WriteLog("no savegames in file\n");
00156 return;
00157 }
00158 setCityFileName(filename);
00159
00160 if (savegame_citycount(sg) == 0) {
00161 savegame_close(sg);
00162 return;
00163 }
00164
00165 if (savegame_citycount(sg) > 1) {
00166 loadCities(sg);
00167 } else {
00168 savegame_getcity(sg, 0, &game, (char **)&worldPtr);
00169 PostLoadGame();
00170 DrawGame(1);
00171 MapHasJumped();
00172 savegame_close(sg);
00173 }
00174 }
00175
00181 static void
00182 open_afile(GtkObject *sel __attribute__((unused)), gpointer data)
00183 {
00184 GtkWidget *dat = (GtkWidget *)data;
00185
00186 doOpen((gchar *)gtk_file_selection_get_filename(
00187 GTK_FILE_SELECTION(dat)));
00188 }
00189
00195 static void
00196 free_object(GtkObject *obj __attribute__((unused)), gpointer data)
00197 {
00198 GtkWidget *dat = (GtkWidget *)data;
00199 gtk_widget_destroy(dat);
00200 }
00201
00206 void
00207 opengame_handler(void)
00208 {
00209 GtkWidget *file_sel = gtk_file_selection_new(
00210 "Select saved game to open");
00211
00212 g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(file_sel)->ok_button),
00213 "clicked", G_CALLBACK(open_afile), (gpointer)file_sel);
00214
00215 g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(file_sel)->ok_button),
00216 "clicked", G_CALLBACK(free_object), (gpointer)file_sel);
00217 g_signal_connect(
00218 GTK_OBJECT(GTK_FILE_SELECTION(file_sel)->cancel_button),
00219 "clicked", G_CALLBACK(free_object), (gpointer)file_sel);
00220
00221 gtk_widget_show(GTK_WIDGET(file_sel));
00222 }
00223
00225 static struct ng_form_tag {
00226 GtkWidget *form;
00227 GtkWidget *cityName;
00228 GtkWidget *foo;
00229 } ng;
00230
00236 static gint
00237 close_newgame(GtkWidget *widget __attribute__((unused)),
00238 gpointer data __attribute__((unused)))
00239 {
00240 ng.form = NULL;
00241 return (FALSE);
00242 }
00243
00247 void
00248 newgame_handler(void)
00249 {
00250 GtkWidget *table, *mainbox;
00251 GtkWidget *label;
00252
00253
00254
00255 ng.form = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00256 gtk_window_set_title(GTK_WINDOW(ng.form), "Create New City");
00257
00258 mainbox = gtk_vbox_new(FALSE, 10);
00259 table = gtk_table_new(12, 4, TRUE);
00260 gtk_container_set_border_width(GTK_CONTAINER(mainbox), 3);
00261
00262 label = create_right_label("City Name:");
00263 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
00264
00265 ng.cityName = gtk_entry_new();
00266 gtk_table_attach(GTK_TABLE(table), ng.cityName, 1, 4, 0, 1,
00267 GTK_FILL | GTK_EXPAND, 0, 0, 0);
00268
00269
00270
00271
00272
00273
00274 g_signal_connect(G_OBJECT(ng.form), "delete_event",
00275 G_CALLBACK(close_newgame), 0);
00276
00277 gtk_container_add(GTK_CONTAINER(ng.form), mainbox);
00278 gtk_box_pack_start(GTK_BOX(mainbox), table, TRUE, TRUE, 0);
00279
00280 gtk_widget_show_all(ng.form);
00281 }
00282
00288 void
00289 store_filename(GtkWidget *sel __attribute__((unused)), gpointer data)
00290 {
00291 gchar *name = (gchar*)gtk_file_selection_get_filename(data);
00292
00293 if (name != NULL) {
00294 if (-1 == setCityFileName(name)) {
00295 return;
00296 }
00297 } else
00298 return;
00299 WriteLog("This game will be saved as %s from now on\n", name);
00300 save_defaultfilename();
00301 }
00302
00303 void
00304 savegameas_handler(void)
00305 {
00306 GtkWidget *fileSel;
00307
00308 fileSel = gtk_file_selection_new("Save game as...");
00309 g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fileSel)->ok_button),
00310 "clicked", G_CALLBACK(store_filename), (gpointer)fileSel);
00311
00312 g_signal_connect_swapped(
00313 GTK_OBJECT(GTK_FILE_SELECTION(fileSel)->ok_button),
00314 "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)fileSel);
00315 g_signal_connect_swapped(
00316 GTK_OBJECT(GTK_FILE_SELECTION(fileSel)->cancel_button),
00317 "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)fileSel);
00318
00319 gtk_widget_show(GTK_WIDGET(fileSel));
00320 }
00321
00322 void
00323 savegame_handler(void)
00324 {
00325 if (getCityFileName() == NULL) {
00326 savegameas_handler();
00327 return;
00328 }
00329
00330 save_defaultfilename();
00331 }