void sample_save_as_cb(GtkWidget * widget, gpointer data) { GtkWidget *dialog; gint win_width, win_height; sw_view * view = (sw_view *)data; sw_sample * sample; GtkWidget * save_options; GtkWidget * frame; GtkWidget * hbox; GtkWidget * label; GtkWidget * option_menu; GtkWidget * save_menu; struct stat statbuf; gchar *filename; gint retval; save_as_data * sd; char buf[512]; win_width = gdk_screen_width () / 2; win_height = gdk_screen_height () / 2; sample = view->sample; dialog = gtk_file_chooser_dialog_new (_("Sweep: Save file"), GTK_WINDOW(view->window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); //gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); attach_window_close_accel(GTK_WINDOW(dialog)); sweep_set_window_icon (GTK_WINDOW(dialog)); save_options = gtk_hbox_new (TRUE, 1); frame = gtk_frame_new (_("Save Options")); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start (GTK_BOX (save_options), frame, TRUE, TRUE, 4); hbox = gtk_hbox_new (FALSE, 4); gtk_container_set_border_width (GTK_CONTAINER (hbox), 4); gtk_container_add (GTK_CONTAINER (frame), hbox); gtk_widget_show (hbox); label = gtk_label_new (_("Determine File Type:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); option_menu = gtk_option_menu_new (); gtk_box_pack_start (GTK_BOX (hbox), option_menu, TRUE, TRUE, 0); gtk_widget_show (option_menu); save_menu = create_save_menu (sample); gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), save_menu); gtk_widget_show (frame); /* pack the containing save_options hbox into the save-dialog */ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), save_options, FALSE, FALSE, 0); gtk_widget_show (save_options); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); gtk_widget_set_size_request (dialog, win_width, win_height); if (strcmp (g_path_get_dirname(sample->pathname), ".") == 0) { char last_save [512]; prefs_get_string (LAST_SAVE_KEY, last_save, sizeof (last_save), ""); if (last_save [0]) { gchar * last_save_dir = g_dirname (last_save); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog), last_save_dir); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(dialog), sample->pathname); g_free (last_save_dir); } } else { retval = gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(dialog), sample->pathname); /* FIXME: bug (local only?) causes gtk_file_chooser_set_filename to fail silently in some cases*/ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); //printf("filename pre: %s\n", filename); //printf("sample->pathname: %s\n", sample->pathname); } retval = gtk_dialog_run (GTK_DIALOG (dialog)); filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); //printf("filename post: %s\n", filename); sample = view->sample; sd = g_malloc (sizeof (save_as_data)); sd->sample = sample; sd->pathname = filename; if (retval == GTK_RESPONSE_ACCEPT) { if (!sweep_dir_exists (filename)) { g_free (sd); g_free (filename); return; } if (stat (filename, &statbuf) == -1) { switch (errno) { case ENOENT: /* If it doesn't exist, it's ok to save as */ overwrite_ok_cb (NULL, sd); break; default: sweep_perror (errno, filename); break; } } else { /* file exists */ if (access(filename, W_OK) == -1) { sweep_perror (errno, _("You are not allowed to write to\n%s"), filename); } else { snprintf (buf, sizeof (buf), _("%s exists. Overwrite?"), filename); question_dialog_new (sample, _("File exists"), buf, _("Overwrite"), _("Don't overwrite"), G_CALLBACK (overwrite_ok_cb), sd, G_CALLBACK (overwrite_cancel_cb), sd, SWEEP_EDIT_MODE_META); } } /* FIXME: wrapped this due to the above gtk_file_chooser_set_filename problem */ } else if (sd->pathname != NULL) { gchar msg [1024]; snprintf (msg, sizeof (msg), _("Save as %s cancelled"), g_path_get_basename (sd->pathname)); sample_set_tmp_message (sd->sample, msg); } else { g_free (sd); g_free (filename); } gtk_widget_destroy (dialog); }
Sint32 vbutton::do_call(Sint32 whatfunc, Sint32 arg) { switch (whatfunc) { case BEGINMENU: return beginmenu(arg); case CREATE_TEAM_MENU: return create_team_menu(arg); case SET_PLAYER_MODE: return set_player_mode(arg); case QUIT_MENU: quit(arg); return 1; case CREATE_VIEW_MENU: return create_view_menu(arg); case CREATE_EDIT_MENU: return create_edit_menu(arg); case CREATE_BUY_MENU: return create_buy_menu(arg); case CREATE_LOAD_MENU: return create_load_menu(arg); case CREATE_SAVE_MENU: return create_save_menu(arg); case GO_MENU: return go_menu(arg); case RETURN_MENU: return arg; case CYCLE_TEAM_GUY: return cycle_team_guy(arg); case DECREASE_STAT: return decrease_stat(arg); case INCREASE_STAT: return increase_stat(arg); case EDIT_GUY: return edit_guy(arg); case CYCLE_GUY: return cycle_guy(arg); case ADD_GUY: return add_guy(arg); case DO_SAVE: return do_save(arg); case DO_LOAD: return do_load(arg); case NAME_GUY: // name some guy return name_guy(arg); case CREATE_DETAIL_MENU: return create_detail_menu(NULL); case DO_SET_SCEN_LEVEL: return do_set_scen_level(arg); case SET_DIFFICULTY: return set_difficulty(); case CHANGE_TEAM: return change_teamnum(arg); case CHANGE_HIRE_TEAM: return change_hire_teamnum(arg); case ALLIED_MODE: return change_allied(); case YES_OR_NO: return yes_or_no(arg); default: return 4; } }
Sint32 vbutton::do_call(Sint32 whatfunc, Sint32 arg) { switch (whatfunc) { case BEGINMENU: return beginmenu(arg); case CREATE_TEAM_MENU: return create_team_menu(arg); case SET_PLAYER_MODE: return set_player_mode(arg); case QUIT_MENU: quit(arg); return 1; case CREATE_VIEW_MENU: return create_view_menu(arg); case CREATE_TRAIN_MENU: return create_train_menu(arg); case CREATE_HIRE_MENU: return create_hire_menu(arg); case CREATE_LOAD_MENU: return create_load_menu(arg); case CREATE_SAVE_MENU: return create_save_menu(arg); case GO_MENU: return go_menu(arg); case RETURN_MENU: return arg; case CYCLE_TEAM_GUY: return cycle_team_guy(arg); case DECREASE_STAT: return decrease_stat(arg); case INCREASE_STAT: return increase_stat(arg); case EDIT_GUY: return edit_guy(arg); case CYCLE_GUY: return cycle_guy(arg); case ADD_GUY: return add_guy(arg); case DO_SAVE: return do_save(arg); case DO_LOAD: return do_load(arg); case NAME_GUY: // name some guy return name_guy(arg); case CREATE_DETAIL_MENU: return create_detail_menu(NULL); case DO_SET_SCEN_LEVEL: return do_set_scen_level(arg); case DO_PICK_CAMPAIGN: return do_pick_campaign(arg); case SET_DIFFICULTY: return set_difficulty(); case CHANGE_TEAM: return change_teamnum(arg); case CHANGE_HIRE_TEAM: return change_hire_teamnum(arg); case ALLIED_MODE: return change_allied(); case DO_LEVEL_EDIT: return level_editor(); case YES_OR_NO: return yes_or_no(arg); case MAIN_OPTIONS: return main_options(); case TOGGLE_SOUND: toggle_effect("sound", "sound"); return REDRAW; case TOGGLE_RENDERING_ENGINE: toggle_rendering_engine(); return REDRAW; case TOGGLE_FULLSCREEN: toggle_effect("graphics", "fullscreen"); myscreen->set_fullscreen(cfg.is_on("graphics", "fullscreen")); return REDRAW; case OVERSCAN_ADJUST: return overscan_adjust(arg); case TOGGLE_MINI_HP_BAR: toggle_effect("effects", "mini_hp_bar"); return REDRAW; case TOGGLE_HIT_FLASH: toggle_effect("effects", "hit_flash"); return REDRAW; case TOGGLE_HIT_RECOIL: toggle_effect("effects", "hit_recoil"); return REDRAW; case TOGGLE_ATTACK_LUNGE: toggle_effect("effects", "attack_lunge"); return REDRAW; case TOGGLE_HIT_ANIM: toggle_effect("effects", "hit_anim"); return REDRAW; case TOGGLE_DAMAGE_NUMBERS: toggle_effect("effects", "damage_numbers"); return REDRAW; case TOGGLE_HEAL_NUMBERS: toggle_effect("effects", "heal_numbers"); return REDRAW; case TOGGLE_GORE: toggle_effect("effects", "gore"); return REDRAW; case RESTORE_DEFAULT_SETTINGS: restore_default_settings(); cfg.load_settings(); return REDRAW; default: return OK; } }