static void place_separator_func (GtkWidget **separator, GtkWidget *child, GtkWidget *before, gpointer user_data) { gboolean need_separator; Place *place, *place_before; gchar *text; GtkWidget *w; need_separator = FALSE; place = g_object_get_data (G_OBJECT (child), "place"); if (before != NULL) { place_before = g_object_get_data (G_OBJECT (before), "place"); if (place_before->place_type < place->place_type) /* use a separator before the first item of a new type */ need_separator = TRUE; } else { /* always put a separator before the first item */ need_separator = TRUE; } if (need_separator && *separator == NULL) { text = g_strdup_printf ("<b>%s</b>", get_heading_name (place->place_type)); w = gtk_label_new (NULL); g_object_set (w, "margin-top", 6, "margin-right", 10, "margin-bottom", 6, "margin-left", 10, NULL); gtk_label_set_markup (GTK_LABEL (w), text); gtk_widget_set_halign (w, GTK_ALIGN_START); gtk_style_context_add_class (gtk_widget_get_style_context (w), "dim-label"); g_object_ref_sink (w); *separator = w; g_free (text); } else if (!need_separator && *separator != NULL) { gtk_widget_destroy (*separator); } }
static void place_header_func (GtkListBoxRow *row, GtkListBoxRow *before, gpointer user_data) { gboolean need_separator; GtkWidget *current; Place *place, *place_before; gchar *text; GtkWidget *w; need_separator = FALSE; place = g_object_get_data (G_OBJECT (row), "place"); if (before != NULL) { place_before = g_object_get_data (G_OBJECT (before), "place"); if (place_before->place_type < place->place_type) /* use a separator before the first item of a new type */ need_separator = TRUE; } else { /* always put a separator before the first item */ need_separator = TRUE; } current = gtk_list_box_row_get_header (row); if (need_separator && current == NULL) { text = g_strdup_printf ("<b>%s</b>", get_heading_name (place->place_type)); w = gtk_label_new (NULL); g_object_set (w, "margin-top", 6, "margin-end", 10, "margin-bottom", 6, "margin-start", 10, NULL); gtk_label_set_markup (GTK_LABEL (w), text); gtk_widget_set_halign (w, GTK_ALIGN_START); gtk_style_context_add_class (gtk_widget_get_style_context (w), "dim-label"); gtk_list_box_row_set_header (row, w); g_free (text); } else if (!need_separator && current != NULL) { gtk_list_box_row_set_header (row, NULL); } }