static void anjuta_cell_renderer_captioned_image_get_preferred_height (GtkCellRenderer *gtk_cell, GtkWidget *widget, gint *minimum, gint *natural) { gint text_min; gint text_nat; gint image_min; gint image_nat; AnjutaCellRendererCaptionedImage *cell = ANJUTA_CELL_RENDERER_CAPTIONED_IMAGE (gtk_cell); gtk_cell_renderer_get_preferred_height (cell->image, widget, &image_min, &image_nat); gtk_cell_renderer_get_preferred_height (cell->caption, widget, &text_min, &text_nat); if (minimum) { *minimum = image_min + text_min + PAD; } if (natural) { *natural = image_nat + text_nat + PAD; } }
static void anjuta_cell_renderer_captioned_image_render (GtkCellRenderer *gtk_cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) { AnjutaCellRendererCaptionedImage *cell = ANJUTA_CELL_RENDERER_CAPTIONED_IMAGE (gtk_cell); GdkRectangle text_area; GdkRectangle pixbuf_area; gint width, height; gtk_cell_renderer_get_preferred_width (cell->image, widget, NULL, &width); gtk_cell_renderer_get_preferred_height (cell->image, widget, NULL, &height); pixbuf_area.y = cell_area->y; pixbuf_area.x = cell_area->x; pixbuf_area.height = height; pixbuf_area.width = cell_area->width; gtk_cell_renderer_get_preferred_width (cell->caption, widget, NULL, &width); gtk_cell_renderer_get_preferred_height (cell->caption, widget, NULL, &height); text_area.x = cell_area->x + (cell_area->width - width) / 2; text_area.y = cell_area->y + (pixbuf_area.height + PAD); text_area.height = height; text_area.width = width; gtk_cell_renderer_render (cell->image, cr, widget, background_area, &pixbuf_area, flags); gtk_cell_renderer_render (cell->caption, cr, widget, background_area, &text_area, flags); }
static void acwin_calculate_window_size(Tacwin * acw, GList * items, GList * items2, const gchar *closetag, gint *numitems) { GList *tmplist; gboolean runtwo = FALSE; gchar *longest = NULL, *tmp; guint longestlen = 1; *numitems = 0; DBG_AUTOCOMP("acwin_calculate_window_size, items=%p, items2=%p, closetag=%s\n", items, items2, closetag); if (closetag) { longest = g_markup_escape_text(closetag, -1); longestlen = strlen(longest); } tmplist = g_list_first(items); while (!runtwo || tmplist) { guint len; if (!tmplist) { tmplist = g_list_first(items2); runtwo = TRUE; if (!tmplist) break; } g_assert(tmplist != NULL); g_assert(tmplist->data != NULL); /* DBG_AUTOCOMP("acwin_calculate_window_size, tmplist=%p", tmplist); DBG_AUTOCOMP(", tmplist->data=%p",tmplist->data); DBG_AUTOCOMP("=%s\n", (gchar *)tmplist->data);*/ tmp = g_markup_escape_text(tmplist->data, -1); len = strlen(tmp); if (len > longestlen) { longest = tmp; longestlen = len; } else { g_free(tmp); } (*numitems)++; tmplist = g_list_next(tmplist); } if (longest) { gint len, rowh,min_h,nat_h; PangoLayout *panlay = gtk_widget_create_pango_layout(GTK_WIDGET(acw->tree), NULL); pango_layout_set_markup(panlay, longest, -1); pango_layout_get_pixel_size(panlay, &len, &rowh); DBG_AUTOCOMP("longest=%s which has len=%d and rowheight=%d\n", longest, len, rowh); /* rowh+9 has been found by trial and error on a particular gtk theme and resolution, so there is quite a chance that this will not be optimal for other themes or for example on a high resolution display. I've tried to request this size but I cannot find it. I've now changed it to nat_h+5, hopefully nat_h is already a more dynamic value */ /*gint spacing,height; GtkRequisition min_size, nat_size; gtk_cell_renderer_get_preferred_height(acw->cell,GTK_WIDGET(acw->tree),&min_h,&nat_h); spacing= gtk_tree_view_column_get_spacing(acw->column); gtk_tree_view_column_cell_get_size(acw->column,NULL,NULL,NULL,NULL,&height); gtk_widget_get_preferred_size(GTK_WIDGET(acw->tree),&min_size,&nat_size); g_print("row=%d,rowh+9=%d,min_h=%d,nat_h=%d,spacing=%d,height=%d,nat_size.h=%d\n",rowh,rowh+9,min_h,nat_h,spacing,height,min_size.height);*/ #if GTK_CHECK_VERSION(3,0,0) gtk_cell_renderer_get_preferred_height(acw->cell,GTK_WIDGET(acw->tree),&min_h,&nat_h); #else nat_h=rowh+2; #endif acw->h = MIN((*numitems) * (nat_h+5), 350); /*MIN(MAX((*numitems + 1) * rowh + 8, 150), 350);*/ acw->w = acw->listwidth = MIN(len + 20, 350); DBG_AUTOCOMP("acwin_calculate_window_size, numitems=%d, rowh=%d, new height=%d, new width=%d\n", *numitems, rowh, acw->h, acw->listwidth); gtk_widget_set_size_request(GTK_WIDGET(acw->scroll), acw->listwidth, acw->h); /* ac_window */ g_free(longest); g_object_unref(G_OBJECT(panlay)); } }