summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels De Graef <nielsdegraef@gmail.com>2017-06-27 09:34:39 +0200
committerNiels De Graef <nielsdegraef@gmail.com>2017-06-27 09:48:50 +0200
commit67f3eb60d8c89c886a45b8346e164fa616185c6b (patch)
tree5a1648ba9473c06f502a3a58a8543723a843165b
parent9a55109d997e681cdc0a67653f78f73c05232c21 (diff)
downloadgnome-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.am4
-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.vala4
-rw-r--r--vapi/custom.vapi4
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 ();