diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2013-08-27 16:04:19 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2013-08-27 16:04:19 +0800 |
commit | 809402554c85a101b5914f54af9d0151c3810e50 (patch) | |
tree | abd2ef76ab595b15b95843ec402618c582ba4b81 | |
parent | 9fd9cfeb97108f8c83e6fc59b96d8605c93b34c9 (diff) | |
download | gsoc2013-libgnome-autoar-809402554c85a101b5914f54af9d0151c3810e50.tar.gz gsoc2013-libgnome-autoar-809402554c85a101b5914f54af9d0151c3810e50.tar.zst gsoc2013-libgnome-autoar-809402554c85a101b5914f54af9d0151c3810e50.zip |
Allow archive format and filter widgets having initial values
-rw-r--r-- | gnome-autoar/autoar-format-filter.c | 12 | ||||
-rw-r--r-- | gnome-autoar/autoar-format-filter.h | 2 | ||||
-rw-r--r-- | gnome-autoar/autoar-gtk.c | 179 | ||||
-rw-r--r-- | gnome-autoar/autoar-gtk.h | 20 | ||||
-rw-r--r-- | tests/test-ui.c | 10 |
5 files changed, 162 insertions, 61 deletions
diff --git a/gnome-autoar/autoar-format-filter.c b/gnome-autoar/autoar-format-filter.c index eab5d8b..3010664 100644 --- a/gnome-autoar/autoar-format-filter.c +++ b/gnome-autoar/autoar-format-filter.c @@ -104,6 +104,12 @@ static AutoarFilterDescription autoar_filter_description[] = { "application/x-lrzip", "Long Range ZIP (lrzip)" } }; +gboolean +autoar_format_is_valid (AutoarFormat format) +{ + return (format > 0 && format < AUTOAR_FORMAT_LAST); +} + const char* autoar_format_get_mime_type (AutoarFormat format) { @@ -148,6 +154,12 @@ autoar_format_get_description_libarchive (AutoarFormat format) return str; } +gboolean +autoar_filter_is_valid (AutoarFilter filter) +{ + return (filter > 0 && filter < AUTOAR_FILTER_LAST); +} + const char* autoar_filter_get_mime_type (AutoarFilter filter) { diff --git a/gnome-autoar/autoar-format-filter.h b/gnome-autoar/autoar-format-filter.h index 1a4bbaf..9449f7e 100644 --- a/gnome-autoar/autoar-format-filter.h +++ b/gnome-autoar/autoar-format-filter.h @@ -62,12 +62,14 @@ typedef enum { AUTOAR_FILTER_LAST /*< skip >*/ } AutoarFilter; +gboolean autoar_format_is_valid (AutoarFormat format); const char *autoar_format_get_mime_type (AutoarFormat format); const char *autoar_format_get_extension (AutoarFormat format); const char *autoar_format_get_description (AutoarFormat format); int autoar_format_get_format_libarchive (AutoarFormat format); gchar *autoar_format_get_description_libarchive (AutoarFormat format); +gboolean autoar_filter_is_valid (AutoarFilter filter); const char *autoar_filter_get_mime_type (AutoarFilter filter); const char *autoar_filter_get_extension (AutoarFilter filter); const char *autoar_filter_get_description (AutoarFilter filter); diff --git a/gnome-autoar/autoar-gtk.c b/gnome-autoar/autoar-gtk.c index b4c4bb9..f7deeac 100644 --- a/gnome-autoar/autoar-gtk.c +++ b/gnome-autoar/autoar-gtk.c @@ -106,17 +106,76 @@ simple_get_variable_row (GtkTreeModel *model, } static void +simple_set_active (GtkComboBox *simple, + GtkTreeModel *model, + AutoarFormat format, + AutoarFilter filter) +{ + GtkTreeIter iter, prev; + AutoarFormat this_format; + AutoarFilter this_filter; + int *previous; + + previous = g_object_get_data ((GObject*)simple, "previous"); + gtk_tree_model_get_iter_first (model, &iter); + do { + gtk_tree_model_get (model, &iter, + SIMPLE_COL_FORMAT, &this_format, + SIMPLE_COL_FILTER, &this_filter, -1); + if (this_format == format && this_filter == filter) { + gtk_combo_box_set_active_iter (simple, &iter); + previous[0] = format; + previous[1] = filter; + return; + } + prev = iter; + } while (gtk_tree_model_iter_next (model, &iter)); + + if (autoar_format_is_valid (format) && autoar_filter_is_valid (filter) && + gtk_tree_model_iter_previous (model, &prev)) { + GtkTreeIter active; + char *description_string; + + simple_get_variable_row (model, &prev, &active); + description_string = format_filter_full_description (format, filter); + gtk_list_store_set (GTK_LIST_STORE (model), &active, + SIMPLE_COL_FORMAT, format, + SIMPLE_COL_FILTER, filter, + SIMPLE_COL_DESCRIPTION, description_string, -1); + g_free (description_string); + + gtk_combo_box_set_active_iter (simple, &active); + previous[0] = format; + previous[1] = filter; + } else { + int get_format, get_filter; + gtk_tree_model_get_iter_first (model, &iter); + gtk_combo_box_set_active_iter (simple, &iter); + gtk_tree_model_get (model, &iter, + SIMPLE_COL_FORMAT, &get_format, + SIMPLE_COL_FILTER, &get_filter, -1); + previous[0] = format; + previous[1] = filter; + } +} + +static void simple_changed_cb (GtkComboBox *simple, void *data) { GtkTreeIter iter; GtkTreeModel* model; - AutoarFormat format; + int format, filter; + int *previous; if (!gtk_combo_box_get_active_iter (simple, &iter)) return; model = gtk_combo_box_get_model (simple); - gtk_tree_model_get (model, &iter, SIMPLE_COL_FORMAT, &format, -1); + gtk_tree_model_get (model, &iter, + SIMPLE_COL_FORMAT, &format, + SIMPLE_COL_FILTER, &filter, -1); + + previous = g_object_get_data ((GObject*)simple, "previous"); if (!format) { GtkWidget *dialog_widget; @@ -127,75 +186,54 @@ simple_changed_cb (GtkComboBox *simple, GtkWidget *advanced_widget; int response; - AutoarFormat format; - AutoarFilter filter; - simple_widget = GTK_WIDGET (simple); dialog_widget = gtk_dialog_new_with_buttons ( _("Choose an archive format"), GTK_WINDOW (gtk_widget_get_ancestor (simple_widget, GTK_TYPE_WINDOW)), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _("Cancel"), GTK_RESPONSE_CANCEL, _("OK"), GTK_RESPONSE_ACCEPT, NULL); dialog = GTK_DIALOG (dialog_widget); gtk_dialog_set_default_response (dialog, GTK_RESPONSE_ACCEPT); dialog_content = gtk_dialog_get_content_area (dialog); - advanced_widget = autoar_gtk_format_filter_advanced_new (); + advanced_widget = autoar_gtk_format_filter_advanced_new (previous[0], + previous[1]); gtk_container_add (GTK_CONTAINER (dialog_content), advanced_widget); gtk_widget_show_all (dialog_widget); response = gtk_dialog_run (dialog); if (response == GTK_RESPONSE_ACCEPT && gtk_tree_model_iter_previous (model, &iter) && - autoar_gtk_format_filter_advanced_get (advanced_widget, &format, &filter)) { - AutoarFormat scan_format; - AutoarFilter scan_filter; - GtkTreeIter scanner; - GtkTreeIter active_row; - char *description_string; - - /* Scan the list to find the matching row */ - gtk_tree_model_get_iter_first (model, &scanner); - do { - gtk_tree_model_get (model, &scanner, - SIMPLE_COL_FORMAT, &scan_format, - SIMPLE_COL_FILTER, &scan_filter, -1); - if (scan_format == format && scan_filter == filter) { - active_row = scanner; - goto got_new_active; - } - } while (gtk_tree_model_iter_next (model, &scanner)); - - /* No matching row, so we have to create it */ - simple_get_variable_row (model, &iter, &active_row); - description_string = format_filter_full_description (format, filter); - gtk_list_store_set (GTK_LIST_STORE (model), &active_row, - SIMPLE_COL_FORMAT, format, - SIMPLE_COL_FILTER, filter, - SIMPLE_COL_DESCRIPTION, description_string, -1); - g_free (description_string); - -got_new_active: - gtk_combo_box_set_active_iter (simple, &active_row); - } + autoar_gtk_format_filter_advanced_get (advanced_widget, &format, &filter)) + simple_set_active (simple, model, format, filter); + else + simple_set_active (simple, model, previous[0], previous[1]); gtk_widget_destroy (dialog_widget); + } else { + previous[0] = format; + previous[1] = filter; } } GtkWidget* -autoar_gtk_format_filter_simple_new (void) +autoar_gtk_format_filter_simple_new (AutoarFormat default_format, + AutoarFilter default_filter) { GtkWidget *simple_widget; GtkComboBox *simple_combo; GtkCellLayout *simple; GtkCellRenderer *cell_renderer; + GtkTreeModel *model; GtkListStore *store; GtkTreeIter iter; int i; + int *previous; + struct format_filter { AutoarFormat format; @@ -213,6 +251,7 @@ autoar_gtk_format_filter_simple_new (void) }; store = gtk_list_store_new (N_SIMPLE_COLS, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING); + model = GTK_TREE_MODEL (store); for (i = 0; i < sizeof (defaults) / sizeof (struct format_filter); i++) { char *description; @@ -239,7 +278,7 @@ autoar_gtk_format_filter_simple_new (void) SIMPLE_COL_FILTER, 0, SIMPLE_COL_DESCRIPTION, _("Other format…"), -1); - simple_widget = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); + simple_widget = gtk_combo_box_new_with_model (model); simple = GTK_CELL_LAYOUT (simple_widget); simple_combo = GTK_COMBO_BOX (simple_widget); cell_renderer = gtk_cell_renderer_text_new (); @@ -247,7 +286,10 @@ autoar_gtk_format_filter_simple_new (void) gtk_cell_layout_pack_start (simple, cell_renderer, FALSE); gtk_cell_layout_add_attribute (simple, cell_renderer, "text", SIMPLE_COL_DESCRIPTION); - gtk_combo_box_set_active (simple_combo, 0); + previous = g_new (int, 2); + g_object_set_data_full ((GObject*)simple, "previous", previous, g_free); + simple_set_active (simple_combo, model, default_format, default_filter); + gtk_combo_box_set_row_separator_func (simple_combo, simple_row_separator_cb, NULL, NULL); g_signal_connect (simple, "changed", G_CALLBACK (simple_changed_cb), NULL); @@ -258,8 +300,8 @@ autoar_gtk_format_filter_simple_new (void) gboolean autoar_gtk_format_filter_simple_get (GtkWidget *simple, - AutoarFormat *format, - AutoarFilter *filter) + int *format, + int *filter) { GtkComboBox *combo; GtkTreeModel *model; @@ -296,8 +338,8 @@ static void advanced_update_description_cb (GtkTreeView *unused_variable, GtkWidget *advanced) { - AutoarFormat format; - AutoarFilter filter; + int format; + int filter; GtkLabel *description; char *description_string; @@ -353,7 +395,8 @@ advanced_filter_store (void) } GtkWidget* -autoar_gtk_format_filter_advanced_new (void) +autoar_gtk_format_filter_advanced_new (AutoarFormat default_format, + AutoarFilter default_filter) { GtkWidget *advanced_widget; GtkGrid *advanced; @@ -391,7 +434,26 @@ autoar_gtk_format_filter_advanced_new (void) format_renderer, "text", ADVANCED_FORMAT_COL_DESCRIPTION, NULL); - format_path = gtk_tree_path_new_first (); + if (autoar_format_is_valid (default_format)) { + GtkTreeIter iter; + gboolean valid; + format_path = NULL; + for (valid = gtk_tree_model_get_iter_first (format_model, &iter); + valid; + valid = gtk_tree_model_iter_next (format_model, &iter)) { + int get_format; + gtk_tree_model_get (format_model, &iter, + ADVANCED_FORMAT_COL_FORMAT, &get_format, -1); + if (default_format == get_format) { + format_path = gtk_tree_model_get_path (format_model, &iter); + break; + } + } + if (format_path == NULL) + format_path = gtk_tree_path_new_first (); + } else { + format_path = gtk_tree_path_new_first (); + } gtk_tree_view_set_cursor (format, format_path, NULL, FALSE); gtk_tree_path_free (format_path); gtk_grid_attach (advanced, format_widget, 0, 0, 1, 1); @@ -407,7 +469,26 @@ autoar_gtk_format_filter_advanced_new (void) filter_renderer, "text", ADVANCED_FILTER_COL_DESCRIPTION, NULL); - filter_path = gtk_tree_path_new_first (); + if (autoar_filter_is_valid (default_filter)) { + GtkTreeIter iter; + gboolean valid; + filter_path = NULL; + for (valid = gtk_tree_model_get_iter_first (filter_model, &iter); + valid; + valid = gtk_tree_model_iter_next (filter_model, &iter)) { + int get_filter; + gtk_tree_model_get (filter_model, &iter, + ADVANCED_FILTER_COL_FILTER, &get_filter, -1); + if (default_filter == get_filter) { + filter_path = gtk_tree_model_get_path (filter_model, &iter); + break; + } + } + if (filter_path == NULL) + filter_path = gtk_tree_path_new_first (); + } else { + filter_path = gtk_tree_path_new_first (); + } gtk_tree_view_set_cursor (filter, filter_path, NULL, FALSE); gtk_tree_path_free (filter_path); gtk_grid_attach (advanced, filter_widget, 1, 0, 1, 1); @@ -431,8 +512,8 @@ autoar_gtk_format_filter_advanced_new (void) gboolean autoar_gtk_format_filter_advanced_get (GtkWidget *advanced, - AutoarFormat *format, - AutoarFilter *filter) + int *format, + int *filter) { GtkGrid *grid; GtkTreeIter format_iter, filter_iter; diff --git a/gnome-autoar/autoar-gtk.h b/gnome-autoar/autoar-gtk.h index 9102d7d..0f9a59f 100644 --- a/gnome-autoar/autoar-gtk.h +++ b/gnome-autoar/autoar-gtk.h @@ -32,15 +32,17 @@ G_BEGIN_DECLS -GtkWidget *autoar_gtk_format_filter_simple_new (void); -gboolean autoar_gtk_format_filter_simple_get (GtkWidget *simple, - AutoarFormat *format, - AutoarFilter *filter); - -GtkWidget *autoar_gtk_format_filter_advanced_new (void); -gboolean autoar_gtk_format_filter_advanced_get (GtkWidget *advanced, - AutoarFormat *format, - AutoarFilter *filter); +GtkWidget *autoar_gtk_format_filter_simple_new (AutoarFormat default_format, + AutoarFilter default_filter); +gboolean autoar_gtk_format_filter_simple_get (GtkWidget *simple, + int *format, + int *filter); + +GtkWidget *autoar_gtk_format_filter_advanced_new (AutoarFormat default_format, + AutoarFilter default_filter); +gboolean autoar_gtk_format_filter_advanced_get (GtkWidget *advanced, + int *format, + int *filter); G_END_DECLS diff --git a/tests/test-ui.c b/tests/test-ui.c index ad69adb..16c9edb 100644 --- a/tests/test-ui.c +++ b/tests/test-ui.c @@ -10,8 +10,8 @@ before_deleted (GtkWindow *window, GdkEvent *event, GtkWidget *simple) { - AutoarFormat format; - AutoarFilter filter; + int format; + int filter; char *str; autoar_gtk_format_filter_simple_get (simple, &format, &filter); @@ -43,13 +43,17 @@ main (int argc, { GtkWidget *window; GtkWidget *simple; + int format, filter; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), argv[0]); - simple = autoar_gtk_format_filter_simple_new (); + format = (argc >= 2) ? atoi (argv[1]) : 0; + filter = (argc >= 3) ? atoi (argv[2]) : 0; + + simple = autoar_gtk_format_filter_simple_new (format, filter); gtk_container_add (GTK_CONTAINER (window), simple); g_signal_connect (window, "delete-event", G_CALLBACK (before_deleted), simple); |