[gnome-contacts] Sync the CropArea-widget again.



commit 67f3eb60d8c89c886a45b8346e164fa616185c6b
Author: Niels De Graef <nielsdegraef gmail com>
Date:   Tue Jun 27 09:34:39 2017 +0200

    Sync the CropArea-widget again.
    
    Sync'ed to the latest commit of gnome-control-center (commit d511097).

 src/Makefile.am                        |    4 +-
 src/{um-crop-area.c => cc-crop-area.c} |  156 +++++++++++++++++---------------
 src/{um-crop-area.h => cc-crop-area.h} |   48 +++++-----
 src/contacts-avatar-dialog.vala        |    4 +-
 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
similarity index 84%
rename from src/um-crop-area.c
rename to 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
similarity index 52%
rename from src/um-crop-area.h
rename to 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 ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]