static void cb_compose_images_measure (GtkWidget *widget, GtkOrientation orientation, int for_size, int *minimum, int *natural, int *minimum_baseline, int *natural_baseline) { CbComposeImages *self = CB_COMPOSE_IMAGES (widget); const guint n_images = self->images->len; guint i; if (n_images == 0) return; for (i = 0; i < n_images; i ++) { const Image *image = &g_array_index (self->images, Image, i); GtkWidget *img = image->image; int button_width, button_height; int image_min, image_nat; gtk_widget_measure (image->delete_button, GTK_ORIENTATION_HORIZONTAL, -1, &button_width, NULL, NULL, NULL); gtk_widget_measure (image->delete_button, GTK_ORIENTATION_VERTICAL, button_width, &button_height, NULL, NULL, NULL); /* The button overlaps the image by half its allocation */ if (orientation == GTK_ORIENTATION_HORIZONTAL) { gtk_widget_measure (img, orientation, MAX (-1, for_size - (button_height / 2)), &image_min, &image_nat, NULL, NULL); *minimum += image_min + (button_width / 2); *natural += image_nat + (button_width / 2); } else /* VERTICAL */ { int image_width = for_size > -1 ? (for_size / MAX_MEDIA_PER_UPLOAD) - IMAGE_SPACING : -1; const double fraction = 1.0 - image->fraction; image_width -= button_width / 2; gtk_widget_measure (img, orientation, MAX (image_width, -1), &image_min, &image_nat, NULL, NULL); *minimum = MAX (*minimum, (image_min + (button_height / 2)) * fraction); *natural = MAX (*natural, (image_nat + (button_height / 2)) * fraction); } } /* Don't forget the spacing */ if (orientation == GTK_ORIENTATION_HORIZONTAL) { *minimum += IMAGE_SPACING * (n_images - 1); *natural += IMAGE_SPACING * (n_images - 1); } }
static void gtk_button_measure (GtkCssGadget *gadget, GtkOrientation orientation, int for_size, int *minimum, int *natural, int *minimum_baseline, int *natural_baseline, gpointer data) { GtkWidget *widget; GtkWidget *child; widget = gtk_css_gadget_get_owner (gadget); child = gtk_bin_get_child (GTK_BIN (widget)); if (child && gtk_widget_get_visible (child)) { gtk_widget_measure (child, orientation, for_size, minimum, natural, minimum_baseline, natural_baseline); } else { *minimum = 0; *natural = 0; if (minimum_baseline) *minimum_baseline = 0; if (natural_baseline) *natural_baseline = 0; } }
static void gtk_check_button_measure (GtkWidget *widget, GtkOrientation orientation, int for_size, int *minimum, int *natural, int *minimum_baseline, int *natural_baseline) { GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget)); GtkWidget *child; int indicator_min = 0; int indicator_nat = 0; int child_min = 0; int child_nat = 0; *minimum = 0; *natural = 0; if (priv->draw_indicator) { gtk_widget_measure (priv->indicator_widget, orientation, for_size, &indicator_min, &indicator_nat, NULL, NULL); } child = gtk_bin_get_child (GTK_BIN (widget)); if (child) { gtk_widget_measure (child, orientation, for_size, &child_min, &child_nat, minimum_baseline, natural_baseline); } if (orientation == GTK_ORIENTATION_HORIZONTAL) { *minimum = indicator_min + child_min; *natural = indicator_nat + child_nat; } else /* VERTICAL */ { *minimum = MAX (indicator_min, child_min); *natural = MAX (indicator_nat, child_nat); } }
void gtd_row_measure_with_max (GtkWidget *widget, GtkOrientation orientation, gint for_size, gint *minimum, gint *natural, gint *minimum_baseline, gint *natural_baseline) { if (orientation == GTK_ORIENTATION_VERTICAL) { gtk_widget_measure (gtk_bin_get_child (GTK_BIN (widget)), orientation, for_size, minimum, natural, minimum_baseline, natural_baseline); } else { gint local_minimum_width; gint local_natural_width; gint scale_factor; gint margins; gtk_widget_measure (gtk_bin_get_child (GTK_BIN (widget)), orientation, for_size, &local_minimum_width, &local_natural_width, minimum_baseline, natural_baseline); scale_factor = gtk_widget_get_scale_factor (widget); margins = gtk_widget_get_margin_start (widget) + gtk_widget_get_margin_end (widget); if (minimum) *minimum = (MIN (local_minimum_width, MAX_WIDTH) - margins) * scale_factor; if (natural) *natural = (MAX (local_minimum_width, MAX_WIDTH) - margins) * scale_factor; } }
static void cb_reply_indicator_measure (GtkWidget *widget, GtkOrientation orientation, int for_size, int *minimum, int *natural, int *minimum_baseline, int *natural_baseline) { CbReplyIndicator *self = CB_REPLY_INDICATOR (widget); gtk_widget_measure (self->revealer, orientation, for_size, minimum, natural, minimum_baseline, natural_baseline); }
static void gtk_app_chooser_widget_measure (GtkWidget *widget, GtkOrientation orientation, int for_size, int *minimum, int *natural, int *minimum_baseline, int *natural_baseline) { GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (widget); GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self); gtk_widget_measure (priv->overlay, orientation, for_size, minimum, natural, minimum_baseline, natural_baseline); }
static void gtk_check_button_size_allocate (GtkWidget *widget, int width, int height, int baseline) { GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget)); GtkAllocation child_alloc = { 0 }; GtkWidget *child; gboolean is_rtl = _gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL; int x = 0; if (priv->draw_indicator) { child_alloc.y = 0; child_alloc.height = height; gtk_widget_measure (priv->indicator_widget, GTK_ORIENTATION_HORIZONTAL, -1, &child_alloc.width, NULL, NULL, NULL); if (is_rtl) { x = 0; child_alloc.x = width - child_alloc.width; } else { x = child_alloc.width; child_alloc.x = 0; } gtk_widget_size_allocate (priv->indicator_widget, &child_alloc, baseline); } child = gtk_bin_get_child (GTK_BIN (widget)); if (child) { child_alloc.x = x; child_alloc.y = 0; child_alloc.width = width - child_alloc.width; /* Indicator width */ child_alloc.height = height; gtk_widget_size_allocate (child, &child_alloc, baseline); } }
static void cb_compose_images_size_allocate (GtkWidget *widget, const GtkAllocation *allocation, int baseline) { CbComposeImages *self = CB_COMPOSE_IMAGES (widget); const guint n_images = self->images->len; guint i; int max_image_width; GtkAllocation image_alloc; if (n_images == 0) return; max_image_width = (allocation->width / MAX_MEDIA_PER_UPLOAD) - IMAGE_SPACING; image_alloc.x = 0; image_alloc.y = 0; image_alloc.height = allocation->height; for (i = 0; i < n_images; i ++) { const Image *image = &g_array_index (self->images, Image, i); GtkWidget *img = image->image; int child_width; GtkAllocation button_alloc; int image_height; int nat_child_height, min_child_height; gtk_widget_measure (image->delete_button, GTK_ORIENTATION_HORIZONTAL, -1, &button_alloc.width, NULL, NULL, NULL); gtk_widget_measure (image->delete_button, GTK_ORIENTATION_VERTICAL, button_alloc.width, &button_alloc.height, NULL, NULL, NULL); image_height = allocation->height - (button_alloc.height / 2); gtk_widget_measure (img, GTK_ORIENTATION_HORIZONTAL, MAX (image_height, -1), NULL, &child_width, NULL, NULL); child_width = MIN (child_width, max_image_width) - (button_alloc.width / 2); gtk_widget_measure (img, GTK_ORIENTATION_VERTICAL, child_width, &min_child_height, &nat_child_height, NULL, NULL); image_alloc.y = (button_alloc.height / 2) + ((allocation->height - button_alloc.height / 2) * image->fraction); /* Delete animation */ image_alloc.width = child_width; image_alloc.height = MAX (MIN (nat_child_height, image_height), min_child_height); gtk_widget_size_allocate (img, &image_alloc, baseline); /* Allocate delete button */ button_alloc.x = image_alloc.x + image_alloc.width - (button_alloc.width / 2); button_alloc.y = 0; gtk_widget_size_allocate (image->delete_button, &button_alloc, baseline); /* Progressbar */ if (gtk_widget_get_visible (image->progressbar)) { GtkAllocation progress_alloc; progress_alloc.x = image_alloc.x + IMAGE_PADDING; gtk_widget_measure (image->progressbar, GTK_ORIENTATION_VERTICAL, -1, &progress_alloc.height, NULL, NULL, NULL); gtk_widget_measure (image->progressbar, GTK_ORIENTATION_HORIZONTAL, -1, &progress_alloc.width, NULL, NULL, NULL); progress_alloc.width = MAX (progress_alloc.width, image_alloc.width - (IMAGE_PADDING * 2)); progress_alloc.y = image_alloc.y + image_alloc.height - progress_alloc.height - IMAGE_PADDING; gtk_widget_size_allocate (image->progressbar, &progress_alloc, baseline); } image_alloc.x += (image_alloc.width + (button_alloc.width / 2) + IMAGE_SPACING) * (1.0 - image->fraction); } }