GList * npw_header_list_insert_header (GList *list, NPWHeader *header) { GList *node; GList *template_list; for (node = g_list_first (list); node != NULL; node = g_list_next (node)) { NPWHeader* first; gint res; template_list = (GList *)node->data; first = (NPWHeader *)template_list->data; res = g_ascii_strcasecmp (npw_header_get_category (first), npw_header_get_category (header)); if (res == 0) { node->data = g_list_insert_sorted (template_list, header, (GCompareFunc) compare_header_name); return list; } else if (res > 0) { break; } } template_list = g_list_prepend (NULL, header); return g_list_insert_before (list, node, template_list); }
NPWHeader* npw_header_list_find_header (GList *list, NPWHeader *header) { GList *node; GList *template_list; for (node = g_list_first (list); node != NULL; node = g_list_next (node)) { NPWHeader* first; gint res; template_list = (GList *)node->data; first = (NPWHeader *)template_list->data; res = g_ascii_strcasecmp (npw_header_get_category (first), npw_header_get_category (header)); if (res == 0) { GList *find; find = g_list_find_custom (template_list, header, (GCompareFunc) compare_header_name); if (find != NULL) { return (NPWHeader *)find->data; } break; } else if (res > 0) { break; } } return NULL; }
/* Add a page in the project notebook */ static void cb_druid_insert_project_page (gpointer value, gpointer user_data) { NPWDruid* druid = (NPWDruid*)user_data; GtkBuilder *builder; GtkWidget* label; GtkWidget* child; GtkWidget* assistant; GtkIconView* view; GtkNotebook *book; GtkListStore *store; GList *template_list = (GList *)value; const gchar* category; category = npw_header_get_category ((NPWHeader *)template_list->data); /* Build another complete wizard dialog from the gtk builder file * but keep only the project selection notebook page */ builder = gtk_builder_new (); if (!gtk_builder_add_from_file (builder, GTK_BUILDER_UI_FILE, NULL)) { g_warn_if_reached (); g_object_unref (builder); return; } /* Fill icon view */ view = GTK_ICON_VIEW (gtk_builder_get_object (builder, PROJECT_LIST)); gtk_icon_view_set_pixbuf_column (view, PIXBUF_COLUMN); gtk_icon_view_set_markup_column (view, TEXT_COLUMN); store = gtk_list_store_new (4, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); g_list_foreach (template_list, cb_druid_insert_project_icon, store); gtk_icon_view_set_model (view, GTK_TREE_MODEL (store)); /* Connect signal to update dialog */ g_signal_connect (G_OBJECT (view), "selection-changed", G_CALLBACK (on_druid_project_update_selected), druid); g_signal_connect (G_OBJECT (view), "map", G_CALLBACK (on_druid_project_update_selected), druid); g_signal_connect_swapped (G_OBJECT (view), "item-activated", G_CALLBACK (gtk_assistant_next_page), druid->window); /* Set new page label */ assistant = GTK_WIDGET (gtk_builder_get_object (builder, NEW_PROJECT_DIALOG)); book = GTK_NOTEBOOK (gtk_builder_get_object (builder, PROJECT_BOOK)); child = gtk_notebook_get_nth_page (book, 0); label = gtk_notebook_get_tab_label (book, child); gtk_label_set_text (GTK_LABEL(label), (const gchar *)category); /* Pick up the filled project selection page from the newly created dialog * add it to the wizard project notebook and destroy the dialog */ gtk_notebook_remove_page (book, 0); gtk_notebook_append_page (druid->project_book, child, label); gtk_widget_destroy (assistant); g_object_unref (builder); }