Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

linux-gtk/savegame_fe.c

Go to the documentation of this file.
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         /* SetupNewGame(); */
00254         /* setLoopSeconds(SPEED_PAUSED); */
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         /* Width/height */
00270 
00271         /* Add all the choices */
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 }

Generated on Mon Aug 30 19:44:15 2004 for pocketcity by doxygen1.2.18