diff options
Diffstat (limited to 'src/dlg-extract.c')
-rw-r--r-- | src/dlg-extract.c | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/src/dlg-extract.c b/src/dlg-extract.c index 1621c3e..6d63059 100644 --- a/src/dlg-extract.c +++ b/src/dlg-extract.c @@ -46,7 +46,6 @@ typedef struct { gboolean extract_clicked; } DialogData; - /* called when the main dialog is closed. */ static void destroy_cb (GtkWidget *widget, @@ -63,7 +62,6 @@ destroy_cb (GtkWidget *widget, g_free (data); } - static int extract_cb (GtkWidget *w, DialogData *data) @@ -71,6 +69,8 @@ extract_cb (GtkWidget *w, FrWindow *window = data->window; gboolean do_not_extract = FALSE; char *extract_to_dir; + char *sub_dir; + gboolean extract_sub_dir; gboolean overwrite; gboolean skip_newer; gboolean selected_files; @@ -181,16 +181,18 @@ extract_cb (GtkWidget *w, return FALSE; } - fr_window_set_extract_default_dir (window, extract_to_dir, TRUE); - overwrite = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("overwrite_checkbutton"))); skip_newer = ! gtk_toggle_button_get_inconsistent (GTK_TOGGLE_BUTTON (GET_WIDGET ("not_newer_checkbutton"))) && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("not_newer_checkbutton"))); junk_paths = ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("recreate_dir_checkbutton"))); + extract_sub_dir = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("create_subdir_checkbutton"))); g_settings_set_boolean (data->settings, PREF_EXTRACT_OVERWRITE, overwrite); if (! gtk_toggle_button_get_inconsistent (GTK_TOGGLE_BUTTON (GET_WIDGET ("not_newer_checkbutton")))) g_settings_set_boolean (data->settings, PREF_EXTRACT_SKIP_NEWER, skip_newer); g_settings_set_boolean (data->settings, PREF_EXTRACT_RECREATE_FOLDERS, ! junk_paths); + g_settings_set_boolean (data->settings, PREF_EXTRACT_CREATE_SUBDIR, extract_sub_dir); + + fr_window_set_extract_default_dir (window, extract_to_dir, !extract_sub_dir); selected_files = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("selected_files_radiobutton"))); pattern_files = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("file_pattern_radiobutton"))); @@ -222,6 +224,11 @@ extract_cb (GtkWidget *w, else base_dir = NULL; + if (extract_sub_dir) + sub_dir = remove_extension_from_path (g_filename_display_basename (fr_window_get_archive_uri (window))); + else + sub_dir = NULL; + /* close the dialog. */ gtk_widget_destroy (data->dialog); @@ -231,6 +238,7 @@ extract_cb (GtkWidget *w, fr_window_archive_extract (window, file_list, extract_to_dir, + sub_dir, base_dir, skip_newer, overwrite ? FR_OVERWRITE_YES : FR_OVERWRITE_NO, @@ -239,12 +247,12 @@ extract_cb (GtkWidget *w, path_list_free (file_list); g_free (extract_to_dir); + g_free (sub_dir); g_free (base_dir); return TRUE; } - static int file_sel_response_cb (GtkWidget *widget, int response, @@ -266,7 +274,6 @@ file_sel_response_cb (GtkWidget *widget, return FALSE; } - static void files_entry_changed_cb (GtkWidget *widget, DialogData *data) @@ -275,7 +282,6 @@ files_entry_changed_cb (GtkWidget *widget, gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("file_pattern_radiobutton")), TRUE); } - static void overwrite_toggled_cb (GtkToggleButton *button, DialogData *data) @@ -285,6 +291,13 @@ overwrite_toggled_cb (GtkToggleButton *button, gtk_widget_set_sensitive (GET_WIDGET ("not_newer_checkbutton"), active); } +static void +close_dialog_changed_cb (GtkToggleButton *button, + FrWindow *window) +{ + gboolean active = gtk_toggle_button_get_active (button); + fr_window_set_close_dialog (window, active); +} static void dlg_extract__common (FrWindow *window, @@ -292,6 +305,8 @@ dlg_extract__common (FrWindow *window, char *base_dir_for_selection) { DialogData *data; + GtkWidget *button; + const char *extract_default_dir; data = g_new0 (DialogData, 1); data->builder = gtk_builder_new_from_resource (ENGRAMPA_RESOURCE_UI_PATH G_DIR_SEPARATOR_S "dlg-extract.ui"); @@ -304,7 +319,12 @@ dlg_extract__common (FrWindow *window, /* Set widgets data. */ - gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (data->dialog), fr_window_get_extract_default_dir (window)); + extract_default_dir = fr_window_get_extract_default_dir (window); + if (uri_is_local (extract_default_dir)) + { + extract_default_dir = g_filename_from_uri (extract_default_dir, NULL, NULL); + } + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (data->dialog), extract_default_dir); if (data->selected_files != NULL) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("selected_files_radiobutton")), TRUE); @@ -322,6 +342,18 @@ dlg_extract__common (FrWindow *window, } gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("recreate_dir_checkbutton")), g_settings_get_boolean (data->settings, PREF_EXTRACT_RECREATE_FOLDERS)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("create_subdir_checkbutton")), g_settings_get_boolean (data->settings, PREF_EXTRACT_CREATE_SUBDIR)); + + button = GET_WIDGET ("close_dialog_checkbutton"); + g_settings_bind (data->settings, + PREF_EXTRACT_CLOSE_DIALOG, + GTK_TOGGLE_BUTTON (button), + "active", + G_SETTINGS_BIND_GET); + g_signal_connect (button, + "toggled", + G_CALLBACK (close_dialog_changed_cb), + window); /* Set the signals handlers. */ @@ -339,7 +371,6 @@ dlg_extract__common (FrWindow *window, gtk_widget_show (data->dialog); } - void dlg_extract (GtkWidget *widget, gpointer callback_data) @@ -352,7 +383,6 @@ dlg_extract (GtkWidget *widget, dlg_extract__common (window, files, base_dir); } - void dlg_extract_folder_from_sidebar (GtkWidget *widget, gpointer callback_data) |