diff options
author | Niels De Graef <nielsdegraef@gmail.com> | 2017-06-27 09:34:39 +0200 |
---|---|---|
committer | Niels De Graef <nielsdegraef@gmail.com> | 2017-06-27 09:48:50 +0200 |
commit | 67f3eb60d8c89c886a45b8346e164fa616185c6b (patch) | |
tree | 5a1648ba9473c06f502a3a58a8543723a843165b | |
parent | 9a55109d997e681cdc0a67653f78f73c05232c21 (diff) | |
download | gnome-contacts-67f3eb60d8c89c886a45b8346e164fa616185c6b.tar.gz |
Sync the CropArea-widget again.
Sync'ed to the latest commit of gnome-control-center (commit d511097).
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/cc-crop-area.c (renamed from src/um-crop-area.c) | 156 | ||||
-rw-r--r-- | src/cc-crop-area.h (renamed from src/um-crop-area.h) | 48 | ||||
-rw-r--r-- | src/contacts-avatar-dialog.vala | 4 | ||||
-rw-r--r-- | vapi/custom.vapi | 4 |
5 files changed, 115 insertions, 101 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 637052f..bd09d94 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -58,7 +58,7 @@ contact-resources.c: $(top_srcdir)/data/contacts.gresource.xml $(resource_files) gnome_contacts_SOURCES = \ $(vala_sources) \ - um-crop-area.c \ + cc-crop-area.c \ contact-resources.c \ contacts-esd-setup.c \ $(NULL) @@ -92,6 +92,6 @@ CLEANFILES = \ EXTRA_DIST = \ org.gnome.Contacts.gschema.xml \ cheese-flash.h \ - um-crop-area.h \ + cc-crop-area.h \ contacts-esd-setup.h \ $(NULL) diff --git a/src/um-crop-area.c b/src/cc-crop-area.c index aaa77c2..b0e6f21 100644 --- a/src/um-crop-area.c +++ b/src/cc-crop-area.c @@ -4,7 +4,7 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or + * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -26,9 +26,9 @@ #include <glib/gi18n.h> #include <gtk/gtk.h> -#include "um-crop-area.h" +#include "cc-crop-area.h" -struct _UmCropAreaPrivate { +struct _CcCropAreaPrivate { GdkPixbuf *browse_pixbuf; GdkPixbuf *pixbuf; GdkPixbuf *color_shifted; @@ -44,7 +44,7 @@ struct _UmCropAreaPrivate { gdouble aspect; }; -G_DEFINE_TYPE (UmCropArea, um_crop_area, GTK_TYPE_DRAWING_AREA); +G_DEFINE_TYPE (CcCropArea, cc_crop_area, GTK_TYPE_DRAWING_AREA); static inline guchar shift_color_byte (guchar b, @@ -87,21 +87,27 @@ shift_colors (GdkPixbuf *pixbuf, } static void -update_pixbufs (UmCropArea *area) +update_pixbufs (CcCropArea *area) { gint width; gint height; GtkAllocation allocation; gdouble scale; - GdkRGBA color; - guint32 pixel; - gint dest_x, dest_y, dest_width, dest_height; + gint dest_width, dest_height; GtkWidget *widget; - GtkStyleContext *context; widget = GTK_WIDGET (area); gtk_widget_get_allocation (widget, &allocation); - context = gtk_widget_get_style_context (widget); + + width = gdk_pixbuf_get_width (area->priv->browse_pixbuf); + height = gdk_pixbuf_get_height (area->priv->browse_pixbuf); + + scale = allocation.height / (gdouble)height; + if (scale * width > allocation.width) + scale = allocation.width / (gdouble)width; + + dest_width = width * scale; + dest_height = height * scale; if (area->priv->pixbuf == NULL || gdk_pixbuf_get_width (area->priv->pixbuf) != allocation.width || @@ -111,31 +117,14 @@ update_pixbufs (UmCropArea *area) area->priv->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, gdk_pixbuf_get_has_alpha (area->priv->browse_pixbuf), 8, - allocation.width, allocation.height); - - gtk_style_context_get_background_color (context, gtk_style_context_get_state (context), &color); - pixel = (((gint)(color.red * 1.0)) << 16) | - (((gint)(color.green * 1.0)) << 8) | - ((gint)(color.blue * 1.0)); - gdk_pixbuf_fill (area->priv->pixbuf, pixel); - - width = gdk_pixbuf_get_width (area->priv->browse_pixbuf); - height = gdk_pixbuf_get_height (area->priv->browse_pixbuf); - - scale = allocation.height / (gdouble)height; - if (scale * width > allocation.width) - scale = allocation.width / (gdouble)width; - - dest_width = width * scale; - dest_height = height * scale; - dest_x = (allocation.width - dest_width) / 2; - dest_y = (allocation.height - dest_height) / 2, + dest_width, dest_height); + gdk_pixbuf_fill (area->priv->pixbuf, 0x0); gdk_pixbuf_scale (area->priv->browse_pixbuf, area->priv->pixbuf, - dest_x, dest_y, + 0, 0, dest_width, dest_height, - dest_x, dest_y, + 0, 0, scale, scale, GDK_INTERP_BILINEAR); @@ -145,22 +134,31 @@ update_pixbufs (UmCropArea *area) shift_colors (area->priv->color_shifted, -32, -32, -32, 0); if (area->priv->scale == 0.0) { - area->priv->crop.width = 2 * area->priv->base_width / scale; - area->priv->crop.height = 2 * area->priv->base_height / scale; + gdouble scale_to_80, scale_to_image, crop_scale; + + /* Scale the crop rectangle to 80% of the area, or less to fit the image */ + scale_to_80 = MIN ((gdouble)gdk_pixbuf_get_width (area->priv->pixbuf) * 0.8 / area->priv->base_width, + (gdouble)gdk_pixbuf_get_height (area->priv->pixbuf) * 0.8 / area->priv->base_height); + scale_to_image = MIN ((gdouble)dest_width / area->priv->base_width, + (gdouble)dest_height / area->priv->base_height); + crop_scale = MIN (scale_to_80, scale_to_image); + + area->priv->crop.width = crop_scale * area->priv->base_width / scale; + area->priv->crop.height = crop_scale * area->priv->base_height / scale; area->priv->crop.x = (gdk_pixbuf_get_width (area->priv->browse_pixbuf) - area->priv->crop.width) / 2; area->priv->crop.y = (gdk_pixbuf_get_height (area->priv->browse_pixbuf) - area->priv->crop.height) / 2; } area->priv->scale = scale; - area->priv->image.x = dest_x; - area->priv->image.y = dest_y; + area->priv->image.x = (allocation.width - dest_width) / 2; + area->priv->image.y = (allocation.height - dest_height) / 2; area->priv->image.width = dest_width; area->priv->image.height = dest_height; } } static void -crop_to_widget (UmCropArea *area, +crop_to_widget (CcCropArea *area, GdkRectangle *crop) { crop->x = area->priv->image.x + area->priv->crop.x * area->priv->scale; @@ -183,12 +181,12 @@ typedef enum { } Location; static gboolean -um_crop_area_draw (GtkWidget *widget, +cc_crop_area_draw (GtkWidget *widget, cairo_t *cr) { GdkRectangle crop; - gint width, height; - UmCropArea *uarea = UM_CROP_AREA (widget); + gint width, height, ix, iy; + CcCropArea *uarea = CC_CROP_AREA (widget); if (uarea->priv->browse_pixbuf == NULL) return FALSE; @@ -199,14 +197,17 @@ um_crop_area_draw (GtkWidget *widget, height = gdk_pixbuf_get_height (uarea->priv->pixbuf); crop_to_widget (uarea, &crop); - gdk_cairo_set_source_pixbuf (cr, uarea->priv->color_shifted, 0, 0); - cairo_rectangle (cr, 0, 0, width, crop.y); - cairo_rectangle (cr, 0, crop.y, crop.x, crop.height); - cairo_rectangle (cr, crop.x + crop.width, crop.y, width - crop.x - crop.width, crop.height); - cairo_rectangle (cr, 0, crop.y + crop.height, width, height - crop.y - crop.height); + ix = uarea->priv->image.x; + iy = uarea->priv->image.y; + + gdk_cairo_set_source_pixbuf (cr, uarea->priv->color_shifted, ix, iy); + cairo_rectangle (cr, ix, iy, width, crop.y - iy); + cairo_rectangle (cr, ix, crop.y, crop.x - ix, crop.height); + cairo_rectangle (cr, crop.x + crop.width, crop.y, width - crop.width - (crop.x - ix), crop.height); + cairo_rectangle (cr, ix, crop.y + crop.height, width, height - crop.height - (crop.y - iy)); cairo_fill (cr); - gdk_cairo_set_source_pixbuf (cr, uarea->priv->pixbuf, 0, 0); + gdk_cairo_set_source_pixbuf (cr, uarea->priv->pixbuf, ix, iy); cairo_rectangle (cr, crop.x, crop.y, crop.width, crop.height); cairo_fill (cr); @@ -301,7 +302,7 @@ find_location (GdkRectangle *rect, } static void -update_cursor (UmCropArea *area, +update_cursor (CcCropArea *area, gint x, gint y) { @@ -351,7 +352,8 @@ update_cursor (UmCropArea *area, } if (cursor_type != area->priv->current_cursor) { - GdkCursor *cursor = gdk_cursor_new (cursor_type); + GdkCursor *cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (area)), + cursor_type); gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (area)), cursor); g_object_unref (cursor); area->priv->current_cursor = cursor_type; @@ -373,10 +375,10 @@ eval_radial_line (gdouble center_x, gdouble center_y, } static gboolean -um_crop_area_motion_notify_event (GtkWidget *widget, +cc_crop_area_motion_notify_event (GtkWidget *widget, GdkEventMotion *event) { - UmCropArea *area = UM_CROP_AREA (widget); + CcCropArea *area = CC_CROP_AREA (widget); gint x, y; gint delta_x, delta_y; gint width, height; @@ -634,10 +636,10 @@ um_crop_area_motion_notify_event (GtkWidget *widget, } static gboolean -um_crop_area_button_press_event (GtkWidget *widget, +cc_crop_area_button_press_event (GtkWidget *widget, GdkEventButton *event) { - UmCropArea *area = UM_CROP_AREA (widget); + CcCropArea *area = CC_CROP_AREA (widget); GdkRectangle crop; if (area->priv->browse_pixbuf == NULL) @@ -657,10 +659,10 @@ um_crop_area_button_press_event (GtkWidget *widget, } static gboolean -um_crop_area_button_release_event (GtkWidget *widget, +cc_crop_area_button_release_event (GtkWidget *widget, GdkEventButton *event) { - UmCropArea *area = UM_CROP_AREA (widget); + CcCropArea *area = CC_CROP_AREA (widget); GdkRectangle crop; if (area->priv->browse_pixbuf == NULL) @@ -680,9 +682,17 @@ um_crop_area_button_release_event (GtkWidget *widget, } static void -um_crop_area_finalize (GObject *object) +cc_crop_area_set_size_request (CcCropArea *area) { - UmCropArea *area = UM_CROP_AREA (object); + gtk_widget_set_size_request (GTK_WIDGET (area), + area->priv->base_width, + area->priv->base_height); +} + +static void +cc_crop_area_finalize (GObject *object) +{ + CcCropArea *area = CC_CROP_AREA (object); if (area->priv->browse_pixbuf) { g_object_unref (area->priv->browse_pixbuf); @@ -699,25 +709,25 @@ um_crop_area_finalize (GObject *object) } static void -um_crop_area_class_init (UmCropAreaClass *klass) +cc_crop_area_class_init (CcCropAreaClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - object_class->finalize = um_crop_area_finalize; - widget_class->draw = um_crop_area_draw; - widget_class->button_press_event = um_crop_area_button_press_event; - widget_class->button_release_event = um_crop_area_button_release_event; - widget_class->motion_notify_event = um_crop_area_motion_notify_event; + object_class->finalize = cc_crop_area_finalize; + widget_class->draw = cc_crop_area_draw; + widget_class->button_press_event = cc_crop_area_button_press_event; + widget_class->button_release_event = cc_crop_area_button_release_event; + widget_class->motion_notify_event = cc_crop_area_motion_notify_event; - g_type_class_add_private (klass, sizeof (UmCropAreaPrivate)); + g_type_class_add_private (klass, sizeof (CcCropAreaPrivate)); } static void -um_crop_area_init (UmCropArea *area) +cc_crop_area_init (CcCropArea *area) { - area->priv = (G_TYPE_INSTANCE_GET_PRIVATE ((area), UM_TYPE_CROP_AREA, - UmCropAreaPrivate)); + area->priv = (G_TYPE_INSTANCE_GET_PRIVATE ((area), CC_TYPE_CROP_AREA, + CcCropAreaPrivate)); gtk_widget_add_events (GTK_WIDGET (area), GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | @@ -732,16 +742,18 @@ um_crop_area_init (UmCropArea *area) area->priv->base_width = 48; area->priv->base_height = 48; area->priv->aspect = 1; + + cc_crop_area_set_size_request (area); } GtkWidget * -um_crop_area_new (void) +cc_crop_area_new (void) { - return g_object_new (UM_TYPE_CROP_AREA, NULL); + return g_object_new (CC_TYPE_CROP_AREA, NULL); } GdkPixbuf * -um_crop_area_get_picture (UmCropArea *area) +cc_crop_area_get_picture (CcCropArea *area) { gint width, height; @@ -757,7 +769,7 @@ um_crop_area_get_picture (UmCropArea *area) } void -um_crop_area_set_picture (UmCropArea *area, +cc_crop_area_set_picture (CcCropArea *area, GdkPixbuf *pixbuf) { int width; @@ -791,20 +803,22 @@ um_crop_area_set_picture (UmCropArea *area, } void -um_crop_area_set_min_size (UmCropArea *area, +cc_crop_area_set_min_size (CcCropArea *area, gint width, gint height) { area->priv->base_width = width; area->priv->base_height = height; + cc_crop_area_set_size_request (area); + if (area->priv->aspect > 0) { area->priv->aspect = area->priv->base_width / (gdouble)area->priv->base_height; } } void -um_crop_area_set_constrain_aspect (UmCropArea *area, +cc_crop_area_set_constrain_aspect (CcCropArea *area, gboolean constrain) { if (constrain) { diff --git a/src/um-crop-area.h b/src/cc-crop-area.h index 8992957..38657c6 100644 --- a/src/um-crop-area.h +++ b/src/cc-crop-area.h @@ -17,49 +17,49 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef _UM_CROP_AREA_H_ -#define _UM_CROP_AREA_H_ +#ifndef _CC_CROP_AREA_H_ +#define _CC_CROP_AREA_H_ #include <glib-object.h> #include <gtk/gtk.h> G_BEGIN_DECLS -#define UM_TYPE_CROP_AREA (um_crop_area_get_type ()) -#define UM_CROP_AREA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UM_TYPE_CROP_AREA, \ - UmCropArea)) -#define UM_CROP_AREA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UM_TYPE_CROP_AREA, \ - UmCropAreaClass)) -#define UM_IS_CROP_AREA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UM_TYPE_CROP_AREA)) -#define UM_IS_CROP_AREA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UM_TYPE_CROP_AREA)) -#define UM_CROP_AREA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UM_TYPE_CROP_AREA, \ - UmCropAreaClass)) +#define CC_TYPE_CROP_AREA (cc_crop_area_get_type ()) +#define CC_CROP_AREA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CC_TYPE_CROP_AREA, \ + CcCropArea)) +#define CC_CROP_AREA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CC_TYPE_CROP_AREA, \ + CcCropAreaClass)) +#define CC_IS_CROP_AREA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CC_TYPE_CROP_AREA)) +#define CC_IS_CROP_AREA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CC_TYPE_CROP_AREA)) +#define CC_CROP_AREA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CC_TYPE_CROP_AREA, \ + CcCropAreaClass)) -typedef struct _UmCropAreaClass UmCropAreaClass; -typedef struct _UmCropArea UmCropArea; -typedef struct _UmCropAreaPrivate UmCropAreaPrivate; +typedef struct _CcCropAreaClass CcCropAreaClass; +typedef struct _CcCropArea CcCropArea; +typedef struct _CcCropAreaPrivate CcCropAreaPrivate; -struct _UmCropAreaClass { +struct _CcCropAreaClass { GtkDrawingAreaClass parent_class; }; -struct _UmCropArea { +struct _CcCropArea { GtkDrawingArea parent_instance; - UmCropAreaPrivate *priv; + CcCropAreaPrivate *priv; }; -GType um_crop_area_get_type (void) G_GNUC_CONST; +GType cc_crop_area_get_type (void) G_GNUC_CONST; -GtkWidget *um_crop_area_new (void); -GdkPixbuf *um_crop_area_get_picture (UmCropArea *area); -void um_crop_area_set_picture (UmCropArea *area, +GtkWidget *cc_crop_area_new (void); +GdkPixbuf *cc_crop_area_get_picture (CcCropArea *area); +void cc_crop_area_set_picture (CcCropArea *area, GdkPixbuf *pixbuf); -void um_crop_area_set_min_size (UmCropArea *area, +void cc_crop_area_set_min_size (CcCropArea *area, gint width, gint height); -void um_crop_area_set_constrain_aspect (UmCropArea *area, +void cc_crop_area_set_constrain_aspect (CcCropArea *area, gboolean constrain); G_END_DECLS -#endif /* _UM_CROP_AREA_H_ */ +#endif /* _CC_CROP_AREA_H_ */ diff --git a/src/contacts-avatar-dialog.vala b/src/contacts-avatar-dialog.vala index 7ffa801..0802f38 100644 --- a/src/contacts-avatar-dialog.vala +++ b/src/contacts-avatar-dialog.vala @@ -48,7 +48,7 @@ public class Contacts.AvatarDialog : Dialog { private FlowBox stock_thumbnail_grid; [GtkChild] private Grid crop_page; - private Um.CropArea crop_area; + private Cc.CropArea crop_area; [GtkChild] private Grid photobooth_page; [GtkChild] @@ -260,7 +260,7 @@ public class Contacts.AvatarDialog : Dialog { } private void set_crop_widget (Gdk.Pixbuf pixbuf) { - this.crop_area = new Um.CropArea (); + this.crop_area = new Cc.CropArea (); this.crop_area.set_vexpand (true); this.crop_area.set_hexpand (true); this.crop_area.set_min_size (48, 48); diff --git a/vapi/custom.vapi b/vapi/custom.vapi index 47930ea..75a72f6 100644 --- a/vapi/custom.vapi +++ b/vapi/custom.vapi @@ -35,8 +35,8 @@ namespace Contacts { public static unowned Gtk.Widget get_icon_for_goa_account (string goa_id); } -[CCode (cprefix = "Um", lower_case_cprefix = "um_", cheader_filename = "um-crop-area.h")] -namespace Um { +[CCode (cprefix = "Cc", lower_case_cprefix = "cc_", cheader_filename = "cc-crop-area.h")] +namespace Cc { public class CropArea : Gtk.DrawingArea { [CCode (has_construct_function = false, type = "GtkWidget*")] public CropArea (); |