Mon, 28 Oct 2013 20:58:42 +0530
Merged soc.2013.gobjectification branch
| libpurple/request.h | file | annotate | diff | comparison | revisions | |
| pidgin/gtkrequest.c | file | annotate | diff | comparison | revisions |
--- a/libpurple/request.c Mon Oct 28 20:56:20 2013 +0530 +++ b/libpurple/request.c Mon Oct 28 20:58:42 2013 +0530 @@ -147,6 +147,8 @@ GHashTable *fields; + gchar **tab_names; + GList *required_fields; GList *validated_fields; @@ -161,6 +163,7 @@ PurpleRequestFields *fields_list; char *title; + gint tab_no; GList *fields; }; @@ -494,6 +497,7 @@ { g_return_if_fail(fields != NULL); + g_strfreev(fields->tab_names); g_list_foreach(fields->groups, (GFunc)purple_request_field_group_destroy, NULL); g_list_free(fields->groups); g_list_free(fields->required_fields); @@ -551,6 +555,32 @@ return fields->groups; } +void +purple_request_fields_set_tab_names(PurpleRequestFields *fields, + const gchar **tab_names) +{ + guint i, tab_count; + gchar **new_names; + + g_return_if_fail(fields != NULL); + + tab_count = (tab_names != NULL) ? g_strv_length((gchar **)tab_names) : 0; + new_names = (tab_count > 0) ? g_new0(gchar*, tab_count + 1) : NULL; + for (i = 0; i < tab_count; i++) + new_names[i] = g_strdup(tab_names[i]); + + g_strfreev(fields->tab_names); + fields->tab_names = new_names; +} + +const gchar ** +purple_request_fields_get_tab_names(const PurpleRequestFields *fields) +{ + g_return_val_if_fail(fields != NULL, NULL); + + return (const gchar **)fields->tab_names; +} + gboolean purple_request_fields_exists(const PurpleRequestFields *fields, const char *id) { @@ -798,6 +828,20 @@ } void +purple_request_field_group_set_tab(PurpleRequestFieldGroup *group, guint tab_no) +{ + g_return_if_fail(group != NULL); + + group->tab_no = tab_no; +} + +guint +purple_request_field_group_get_tab(const PurpleRequestFieldGroup *group) +{ + return group->tab_no; +} + +void purple_request_field_group_destroy(PurpleRequestFieldGroup *group) { g_return_if_fail(group != NULL);
--- a/libpurple/request.h Mon Oct 28 20:56:20 2013 +0530 +++ b/libpurple/request.h Mon Oct 28 20:58:42 2013 +0530 @@ -488,6 +488,27 @@ GList *purple_request_fields_get_groups(const PurpleRequestFields *fields); /** + * Set tab names for a field list. + * + * @param fields The fields list. + * @param tab_names NULL-terminated array of localized tab labels, + * may be @c NULL. + */ +void purple_request_fields_set_tab_names(PurpleRequestFields *fields, + const gchar **tab_names); + +/** + * Returns tab names of a field list. + * + * @param fields The fields list. + * + * @return NULL-terminated array of localized tab labels, or NULL if tabs + * are disabled. + */ +const gchar ** +purple_request_fields_get_tab_names(const PurpleRequestFields *fields); + +/** * Returns whether or not the field with the specified ID exists. * * @param fields The fields list. @@ -661,6 +682,28 @@ PurpleRequestFieldGroup *purple_request_field_group_new(const char *title); /** + * Sets tab number for a group. + * + * @param group The group. + * @param tab_no The tab number. + * + * @see purple_request_fields_set_tab_names + */ +void purple_request_field_group_set_tab(PurpleRequestFieldGroup *group, + guint tab_no); + +/** + * Returns tab number of a group. + * + * @param group The group. + * + * @return Tab number. + * + * @see purple_request_fields_get_tab_names + */ +guint purple_request_field_group_get_tab(const PurpleRequestFieldGroup *group); + +/** * Destroys a fields group. * * @param group The group to destroy.
--- a/pidgin/gtkrequest.c Mon Oct 28 20:56:20 2013 +0530 +++ b/pidgin/gtkrequest.c Mon Oct 28 20:58:42 2013 +0530 @@ -1577,9 +1577,9 @@ { PidginRequestData *data; GtkWidget *win; - GtkWidget *vbox; - GtkWidget *vbox2; - GtkWidget *hbox; + GtkNotebook *notebook; + GtkWidget **pages; + GtkWidget *hbox, *vbox; GtkWidget *frame; GtkWidget *label; GtkWidget *table; @@ -1591,10 +1591,11 @@ PurpleRequestField *field; char *label_text; char *primary_esc, *secondary_esc; - int total_fields = 0; const gboolean compact = purple_request_cpar_is_compact(cpar); GSList *extra_actions, *it; size_t extra_actions_count, i; + const gchar **tab_names; + guint tab_count; data = g_new0(PidginRequestData, 1); data->type = PURPLE_REQUEST_FIELDS; @@ -1681,30 +1682,72 @@ g_free(label_text); } - for (gl = purple_request_fields_get_groups(fields); gl != NULL; - gl = gl->next) - total_fields += g_list_length(purple_request_field_group_get_fields(gl->data)); - - if(total_fields > 9) { - GtkWidget *hbox_for_spacing, *vbox_for_spacing; - - hbox_for_spacing = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_box_pack_start(GTK_BOX(vbox), - pidgin_make_scrollable(hbox_for_spacing, GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC, GTK_SHADOW_NONE, -1, 200), - TRUE, TRUE, 0); - gtk_widget_show(hbox_for_spacing); - - vbox_for_spacing = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_box_pack_start(GTK_BOX(hbox_for_spacing), - vbox_for_spacing, TRUE, TRUE, PIDGIN_HIG_BOX_SPACE); - gtk_widget_show(vbox_for_spacing); - - vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_box_pack_start(GTK_BOX(vbox_for_spacing), - vbox2, TRUE, TRUE, PIDGIN_HIG_BOX_SPACE); - gtk_widget_show(vbox2); + /* Setup tabs */ + tab_names = purple_request_fields_get_tab_names(fields); + if (tab_names == NULL) { + notebook = NULL; + tab_count = 1; + + pages = g_new0(GtkWidget*, 1); + pages[0] = vbox; } else { - vbox2 = vbox; + tab_count = g_strv_length((gchar **)tab_names); + notebook = GTK_NOTEBOOK(gtk_notebook_new()); + + pages = g_new0(GtkWidget*, tab_count); + + for (i = 0; i < tab_count; i++) { + pages[i] = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); + gtk_container_set_border_width(GTK_CONTAINER(pages[i]), PIDGIN_HIG_BORDER); + gtk_notebook_append_page(notebook, pages[i], NULL); + gtk_notebook_set_tab_label_text(notebook, pages[i], tab_names[i]); + gtk_widget_show(pages[i]); + } + } + + for (i = 0; i < tab_count; i++) { + guint total_fields = 0; + GList *it; + + it = purple_request_fields_get_groups(fields); + for (; it != NULL; it = g_list_next(it)) { + group = it->data; + if (purple_request_field_group_get_tab(group) != i) + continue; + total_fields += g_list_length( + purple_request_field_group_get_fields(group)); + } + + if(total_fields > 9) { + GtkWidget *hbox_for_spacing, *vbox_for_spacing; + + gtk_container_set_border_width( + GTK_CONTAINER(pages[i]), 0); + + hbox_for_spacing = + gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); + gtk_box_pack_start(GTK_BOX(pages[i]), + pidgin_make_scrollable(hbox_for_spacing, + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC, + GTK_SHADOW_NONE, -1, 200), + TRUE, TRUE, 0); + gtk_widget_show(hbox_for_spacing); + + vbox_for_spacing = + gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); + gtk_box_pack_start(GTK_BOX(hbox_for_spacing), + vbox_for_spacing, TRUE, TRUE, + PIDGIN_HIG_BOX_SPACE); + gtk_widget_show(vbox_for_spacing); + + pages[i] = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); + gtk_box_pack_start(GTK_BOX(vbox_for_spacing), + pages[i], TRUE, TRUE, PIDGIN_HIG_BOX_SPACE); + gtk_widget_show(pages[i]); + } + + if (notebook == NULL) + vbox = pages[0]; } if (secondary) { @@ -1715,10 +1758,16 @@ g_free(secondary_esc); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - gtk_box_pack_start(GTK_BOX(vbox2), label, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(vbox), label, (notebook == NULL), + (notebook == NULL), 0); gtk_widget_show(label); } + if (notebook != NULL) { + gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(notebook), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(notebook)); + } + for (gl = purple_request_fields_get_groups(fields); gl != NULL; gl = gl->next) @@ -1729,17 +1778,24 @@ size_t rows; size_t col_num; size_t row_num = 0; + guint tab_no; group = gl->data; field_list = purple_request_field_group_get_fields(group); + tab_no = purple_request_field_group_get_tab(group); + if (tab_no >= tab_count) { + purple_debug_warning("gtkrequest", + "Invalid tab number: %d", tab_no); + tab_no = 0; + } if (purple_request_field_group_get_title(group) != NULL) { - frame = pidgin_make_frame(vbox2, + frame = pidgin_make_frame(pages[tab_no], purple_request_field_group_get_title(group)); } else - frame = vbox2; + frame = pages[tab_no]; field_count = g_list_length(field_list); /* @@ -1793,7 +1849,8 @@ gtk_table_set_row_spacings(GTK_TABLE(table), PIDGIN_HIG_BOX_SPACE); gtk_table_set_col_spacings(GTK_TABLE(table), PIDGIN_HIG_BOX_SPACE); - gtk_container_add(GTK_CONTAINER(frame), table); + gtk_box_pack_start(GTK_BOX(frame), table, + (notebook == NULL), (notebook == NULL), 0); gtk_widget_show(table); for (row_num = 0, fl = field_list; @@ -1955,6 +2012,8 @@ if (!purple_request_fields_all_valid(fields)) gtk_widget_set_sensitive(data->ok_button, FALSE); + g_free(pages); + pidgin_auto_parent_window(win); gtk_widget_show(win);