summaryrefslogtreecommitdiff
path: root/src/dlg-extract.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dlg-extract.c')
-rw-r--r--src/dlg-extract.c50
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)