Esempio n. 1
0
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);
    }
}
Esempio n. 2
0
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;
    }
}
Esempio n. 3
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);

    }
}
Esempio n. 4
0
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);
}
Esempio n. 6
0
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);
}
Esempio n. 7
0
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);
    }
}
Esempio n. 8
0
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);
    }
}