Skip to content

Commit 23805ba

Browse files
committed
gtk2: implement export battery save menu item
1 parent f744661 commit 23805ba

File tree

1 file changed

+41
-10
lines changed

1 file changed

+41
-10
lines changed

desmume/src/frontend/posix/gtk2/main.cpp

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ static void RecordMovieDialog();
153153
static void PlayMovieDialog();
154154
static void StopMovie();
155155
static void ImportBackupDialog();
156+
static void ExportBackupDialog();
156157
static void OpenNdsDialog();
157158
static void SaveStateDialog();
158159
static void LoadStateDialog();
@@ -245,6 +246,7 @@ static const char *ui_description =
245246
#endif
246247
" <separator/>"
247248
" <menuitem action='importbackup'/>"
249+
" <menuitem action='exportbackup'/>"
248250
" <separator/>"
249251
" <menuitem action='recordmovie'/>"
250252
" <menuitem action='playmovie'/>"
@@ -439,6 +441,7 @@ static const GtkActionEntry action_entries[] = {
439441
{ "savestateto", NULL, "Save state _to ...", NULL, NULL, SaveStateDialog },
440442
{ "loadstatefrom", NULL, "Load state _from ...", NULL, NULL, LoadStateDialog },
441443
{ "importbackup", NULL, "_Import backup from ...", NULL, NULL, ImportBackupDialog },
444+
{ "exportbackup", NULL, "_Export backup to ...", NULL, NULL, ExportBackupDialog },
442445
{ "recordmovie", NULL, "Record movie _to ...", NULL, NULL, RecordMovieDialog },
443446
{ "playmovie", NULL, "Play movie _from ...", NULL, NULL, PlayMovieDialog },
444447
{ "stopmovie", NULL, "Stop movie", NULL, NULL, StopMovie },
@@ -1187,7 +1190,7 @@ static void PlayMovieDialog()
11871190
gtk_widget_destroy(pFileSelection);
11881191
}
11891192

1190-
static void ImportBackupDialog()
1193+
static void ImportExportBackupDialog(bool is_export)
11911194
{
11921195
GtkFileFilter *pFilter_dsm, *pFilter_any;
11931196
GtkWidget *pFileSelection;
@@ -1201,20 +1204,23 @@ static void ImportBackupDialog()
12011204

12021205
pFilter_dsm = gtk_file_filter_new();
12031206
gtk_file_filter_add_pattern(pFilter_dsm, "*.sav");
1204-
gtk_file_filter_set_name(pFilter_dsm, "Battery save file (.sav)");
1207+
gtk_file_filter_set_name(pFilter_dsm, "Raw/No$GBA Save format (.sav)");
12051208

12061209
pFilter_any = gtk_file_filter_new();
12071210
gtk_file_filter_add_pattern(pFilter_any, "*");
12081211
gtk_file_filter_set_name(pFilter_any, "All files");
12091212

12101213
/* Creating the selection window */
1211-
pFileSelection = gtk_file_chooser_dialog_new("Import backup from...",
1214+
pFileSelection = gtk_file_chooser_dialog_new(
1215+
is_export?"Export Backup Memory To ..." : "Import backup from...",
12121216
GTK_WINDOW(pParent),
1213-
GTK_FILE_CHOOSER_ACTION_OPEN,
1217+
is_export?GTK_FILE_CHOOSER_ACTION_SAVE:GTK_FILE_CHOOSER_ACTION_OPEN,
12141218
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1215-
GTK_STOCK_OPEN, GTK_RESPONSE_OK,
1219+
is_export?GTK_STOCK_SAVE:GTK_STOCK_OPEN,
1220+
GTK_RESPONSE_OK,
12161221
NULL);
1217-
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE);
1222+
if (is_export)
1223+
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE);
12181224

12191225
/* Only the dialog window is accepting events: */
12201226
gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE);
@@ -1226,11 +1232,27 @@ static void ImportBackupDialog()
12261232
switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) {
12271233
case GTK_RESPONSE_OK:
12281234
sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection));
1229-
struct stat st; int ret;
1230-
if(stat(sPath, &st) != -1) {
1231-
ret = MMU_new.backupDevice.importData(sPath, st.st_size);
1232-
NDS_Reset(); // reboot game
1235+
int ret;
1236+
if (is_export) {
1237+
ret = MMU_new.backupDevice.exportData(sPath);
1238+
} else {
1239+
ret = false;
1240+
struct stat st;
1241+
if(stat(sPath, &st) != -1) {
1242+
ret = MMU_new.backupDevice.importData(sPath, st.st_size);
1243+
}
12331244
}
1245+
if(ret == false ) {
1246+
GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow),
1247+
GTK_DIALOG_MODAL,
1248+
GTK_MESSAGE_ERROR,
1249+
GTK_BUTTONS_OK,
1250+
is_export?"Unable to export:\n%s":"Unable to import:\n%s", sPath);
1251+
gtk_dialog_run(GTK_DIALOG(pDialog));
1252+
gtk_widget_destroy(pDialog);
1253+
} else if (!is_export) {
1254+
NDS_Reset(); // reboot game
1255+
}
12341256
g_free(sPath);
12351257
break;
12361258
default:
@@ -1239,6 +1261,15 @@ static void ImportBackupDialog()
12391261
gtk_widget_destroy(pFileSelection);
12401262
}
12411263

1264+
static void ImportBackupDialog()
1265+
{
1266+
ImportExportBackupDialog(false);
1267+
}
1268+
1269+
static void ExportBackupDialog()
1270+
{
1271+
ImportExportBackupDialog(true);
1272+
}
12421273

12431274
static void SaveStateDialog()
12441275
{

0 commit comments

Comments
 (0)