[gtk+/wip/baedert/gtkimageview: 2075/2075] imageview+demo: Port to gtk4



commit 229ecc72d59e88f0cfa1ac9fe6cd8d632f733823
Author: Timm Bäder <mail baedert org>
Date:   Sat Feb 11 10:22:53 2017 +0100

    imageview+demo: Port to gtk4

 demos/gtk-demo/image_view.c  |    3 +-
 demos/gtk-demo/image_view.ui |    2 -
 gtk/gtkabstractimage.c       |    2 +-
 gtk/gtkimageview.c           |  221 ++++++++++++++++++++++++-----------------
 4 files changed, 132 insertions(+), 96 deletions(-)
---
diff --git a/demos/gtk-demo/image_view.c b/demos/gtk-demo/image_view.c
index 9c078e1..03d7c9f 100644
--- a/demos/gtk-demo/image_view.c
+++ b/demos/gtk-demo/image_view.c
@@ -33,6 +33,7 @@ file_set_cb (GtkFileChooserButton *widget,
                                        NULL);
 
   g_free (filename);
+  g_object_unref (file);
 }
 
 static void
@@ -259,7 +260,7 @@ do_image_view (GtkWidget *do_widget)
   gtk_builder_connect_signals (builder, NULL);
 
   gtk_window_resize (GTK_WINDOW (window), 800, 600);
-  gtk_widget_show_all (window);
+  gtk_widget_show (window);
 
   g_object_unref (builder);
 
diff --git a/demos/gtk-demo/image_view.ui b/demos/gtk-demo/image_view.ui
index 3dfd6b0..a7ef066 100644
--- a/demos/gtk-demo/image_view.ui
+++ b/demos/gtk-demo/image_view.ui
@@ -97,7 +97,6 @@
         <child>
           <object class="GtkButton">
             <property name="visible">false</property>
-            <property name="no_show_all">true</property>
             <property name="label" translatable="yes">Load Surface</property>
             <signal name="clicked" handler="load_surface_button_clicked_cb" />
           </object>
@@ -112,7 +111,6 @@
         <child>
           <object class="GtkButton">
             <property name="visible">false</property>
-            <property name="no_show_all">true</property>
             <property name="label" translatable="yes">Clear</property>
             <signal name="clicked" handler="clear_button_clicked_cb" />
           </object>
diff --git a/gtk/gtkabstractimage.c b/gtk/gtkabstractimage.c
index cd29a54..060b5db 100644
--- a/gtk/gtkabstractimage.c
+++ b/gtk/gtkabstractimage.c
@@ -45,7 +45,7 @@ gtk_abstract_image_class_init (GtkAbstractImageClass *klass)
                                          G_SIGNAL_RUN_FIRST,
                                          G_STRUCT_OFFSET (GtkAbstractImageClass, changed),
                                          NULL, NULL,
-                                         _gtk_marshal_VOID__VOID,
+                                         NULL,
                                          G_TYPE_NONE, 0);
 
   klass->changed = NULL;
diff --git a/gtk/gtkimageview.c b/gtk/gtkimageview.c
index 54fb011..24cc24e 100644
--- a/gtk/gtkimageview.c
+++ b/gtk/gtkimageview.c
@@ -53,6 +53,7 @@
 #include "gtkadjustment.h"
 #include "gtkabstractimage.h"
 #include "gtkprogresstrackerprivate.h"
+#include "gtksnapshot.h"
 #include <gdk/gdkcairo.h>
 #include <math.h>
 
@@ -1019,23 +1020,29 @@ gtk_image_view_init (GtkImageView *image_view)
   gtk_image_view_ensure_gestures (image_view);
 }
 
-static gboolean
-gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
+static void
+gtk_image_view_snapshot (GtkWidget   *widget,
+                         GtkSnapshot *snapshot)
 {
   GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
   GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
   GtkStyleContext *sc = gtk_widget_get_style_context (widget);
+  GtkAllocation allocation;
+  cairo_t *ct;
   int widget_width = gtk_widget_get_allocated_width (widget);
   int widget_height = gtk_widget_get_allocated_height (widget);
   double draw_x = 0;
   double draw_y = 0;
-  int image_width;
-  int image_height;
   double draw_width;
   double draw_height;
+  int image_width;
+  int image_height;
   double scale = 0.0;
   int scale_factor;
 
+  gtk_widget_get_allocation (widget, &allocation);
+
+
   if (priv->vadjustment && priv->hadjustment)
     {
       int x = - gtk_adjustment_get_value (priv->hadjustment);
@@ -1045,25 +1052,25 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
 
       if (w > 0 && h > 0)
         {
-          gtk_render_background (sc, ct, x, y, w, h);
-          gtk_render_frame (sc, ct, x, y, w, h);
+          gtk_snapshot_render_background (snapshot, sc, x, y, w, h);
+          gtk_snapshot_render_frame (snapshot, sc, x, y, w, h);
         }
     }
   else
     {
-      gtk_render_background (sc, ct, 0, 0, widget_width, widget_height);
-      gtk_render_frame      (sc, ct, 0, 0, widget_width, widget_height);
+      gtk_snapshot_render_background (snapshot, sc, 0, 0, widget_width, widget_height);
+      gtk_snapshot_render_frame (snapshot, sc, 0, 0, widget_width, widget_height);
     }
 
   if (!priv->image)
-    return GDK_EVENT_PROPAGATE;
+    return;
 
   gtk_image_view_compute_bounding_box (image_view,
                                        &draw_width, &draw_height,
                                        &scale);
 
   if (draw_width == 0 || draw_height == 0)
-    return GDK_EVENT_PROPAGATE;
+    return;
 
   scale_factor = gtk_abstract_image_get_scale_factor (priv->image);
   if (scale_factor == 0)
@@ -1071,7 +1078,6 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
 
   image_width  = priv->image_width * scale / scale_factor;
   image_height = priv->image_height* scale / scale_factor;
-
   if (priv->hadjustment && priv->vadjustment)
     {
       draw_x = (gtk_adjustment_get_page_size (priv->hadjustment) - image_width)  / 2.0;
@@ -1083,7 +1089,6 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
       draw_y = (widget_height - image_height) / 2.0;
     }
 
-  cairo_rectangle (ct, 0, 0, widget_width, widget_height);
 
   if (priv->hadjustment && draw_width >= widget_width)
     {
@@ -1097,21 +1102,75 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
       draw_y -= gtk_adjustment_get_value (priv->vadjustment);
     }
 
+
+  g_message ("draw_x: %f, draw_y: %f", draw_x, draw_y);
+  g_message ("Widget width: %d, draw_width: %f, image_width: %d",
+             allocation.width, draw_width, image_width);
+
+
+  gtk_snapshot_push_clip (snapshot,
+                          &GRAPHENE_RECT_INIT (
+                            allocation.x,
+                            allocation.y,
+                            allocation.width,
+                            allocation.height),
+                          "GtkImageView clip");
+
+
   /* Rotate around the center */
-  cairo_translate (ct,
-                   draw_x + (image_width  / 2.0),
-                   draw_y + (image_height / 2.0));
-  cairo_rotate (ct, DEG_TO_RAD (gtk_image_view_get_real_angle (image_view)));
-  cairo_translate (ct,
-                   - draw_x - (image_width  / 2.0),
-                   - draw_y - (image_height / 2.0));
+  {
+    graphene_matrix_t rotate;
+    graphene_vec3_t rotate_vector;
+
+    graphene_vec3_init (&rotate_vector, 0, 0, 1);
+
+    graphene_matrix_init_identity (&rotate);
+
+
+    graphene_matrix_translate (&rotate,
+                               &GRAPHENE_POINT3D_INIT(
+                                 -(image_width / 2),
+                                 -(image_height / 2),
+                                 0
+                               ));
+
+    graphene_matrix_rotate (&rotate,
+                            gtk_image_view_get_real_angle (image_view),
+                            &rotate_vector);
+
+
+    graphene_matrix_translate (&rotate,
+                               &GRAPHENE_POINT3D_INIT(
+                                 (image_width / 2),
+                                 (image_height / 2),
+                                 0
+                               ));
+
+
+    graphene_matrix_scale (&rotate, scale, scale, 1);
+
+    graphene_matrix_translate (&rotate,
+                               &GRAPHENE_POINT3D_INIT (draw_x, draw_y, 0));
+
+    gtk_snapshot_push_transform (snapshot, &rotate, "ImageView rotate");
 
-  cairo_scale (ct, scale, scale);
-  cairo_translate (ct, draw_x / scale, draw_y / scale);
-  gtk_abstract_image_draw (priv->image, ct);
-  cairo_paint (ct);
+    ct = gtk_snapshot_append_cairo (snapshot,
+                                    &GRAPHENE_RECT_INIT (
+                                      0,
+                                      0,
+                                      draw_width  / scale,
+                                      draw_height / scale
+                                    ),
+                                    "ImageView");
 
-  return GDK_EVENT_PROPAGATE;
+    gtk_abstract_image_draw (priv->image, ct);
+    cairo_paint (ct);
+    cairo_destroy (ct);
+
+    gtk_snapshot_pop (snapshot);
+  }
+
+  gtk_snapshot_pop (snapshot); /* Clip */
 }
 
 static void
@@ -1673,37 +1732,25 @@ gtk_image_view_realize (GtkWidget *widget)
 {
   GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (GTK_IMAGE_VIEW (widget));
   GtkAllocation allocation;
-  GdkWindowAttr attributes = { 0, };
   GdkWindow *window;
 
+  GTK_WIDGET_CLASS (gtk_image_view_parent_class)->realize (widget);
+
   gtk_widget_get_allocation (widget, &allocation);
-  gtk_widget_set_realized (widget, TRUE);
-
-  attributes.x = allocation.x;
-  attributes.y = allocation.y;
-  attributes.width  = allocation.width;
-  attributes.height = allocation.height;
-  attributes.window_type = GDK_WINDOW_CHILD;
-  attributes.event_mask = gtk_widget_get_events (widget) |
-                          GDK_POINTER_MOTION_MASK |
-                          GDK_BUTTON_PRESS_MASK |
-                          GDK_BUTTON_RELEASE_MASK |
-                          GDK_SMOOTH_SCROLL_MASK |
-                          GDK_SCROLL_MASK |
-                          GDK_TOUCH_MASK;
-  attributes.wclass = GDK_INPUT_ONLY;
-
-  window = gtk_widget_get_parent_window (widget);
-
-  gtk_widget_set_window (widget, window);
-  g_object_ref (G_OBJECT (window));
-
-  window = gdk_window_new (gtk_widget_get_parent_window (widget),
-                           &attributes, GDK_WA_X | GDK_WA_Y);
+
+  window = gdk_window_new_input (gtk_widget_get_window (widget),
+                                 gtk_widget_get_events (widget) |
+                                 GDK_POINTER_MOTION_MASK |
+                                 GDK_BUTTON_PRESS_MASK |
+                                 GDK_BUTTON_RELEASE_MASK |
+                                 GDK_SMOOTH_SCROLL_MASK |
+                                 GDK_SCROLL_MASK |
+                                 GDK_TOUCH_MASK,
+                                 &allocation);
+
   priv->event_window = window;
 
   gtk_widget_register_window (widget, priv->event_window);
-  gdk_window_set_user_data (window, widget);
 }
 
 static void
@@ -1783,19 +1830,24 @@ adjustment_value_changed_cb (GtkAdjustment *adjustment,
 }
 
 static void
-gtk_image_view_get_preferred_height (GtkWidget *widget,
-                                     int       *minimal,
-                                     int       *natural)
+gtk_image_view_measure (GtkWidget      *widget,
+                        GtkOrientation  orientation,
+                        int             for_size,
+                        int            *minimum,
+                        int            *natural,
+                        int            *minimum_baseline,
+                        int            *natural_baselien)
 {
   GtkImageView *image_view  = GTK_IMAGE_VIEW (widget);
   GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
 
-
-
   if (priv->fit_allocation && priv->image)
     {
-      *minimal = 0;
-      *natural = gtk_abstract_image_get_height (priv->image);
+      *minimum = 0;
+      if (orientation == GTK_ORIENTATION_HORIZONTAL)
+        *natural = gtk_abstract_image_get_width (priv->image);
+      else /* VERTICAL */
+        *natural = gtk_abstract_image_get_height (priv->image);
     }
   else
     {
@@ -1804,34 +1856,17 @@ gtk_image_view_get_preferred_height (GtkWidget *widget,
                                            &width,
                                            &height,
                                            NULL);
-      *minimal = height;
-      *natural = height;
-    }
-}
-
-static void
-gtk_image_view_get_preferred_width (GtkWidget *widget,
-                                    int       *minimal,
-                                    int       *natural)
-{
-  GtkImageView *image_view  = GTK_IMAGE_VIEW (widget);
-  GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
 
-  if (priv->fit_allocation && priv->image)
-    {
-      *minimal = 0;
-      *natural = gtk_abstract_image_get_width (priv->image);
-    }
-  else
-    {
-      double width, height;
-
-      gtk_image_view_compute_bounding_box (image_view,
-                                           &width,
-                                           &height,
-                                           NULL);
-      *minimal = width;
-      *natural = width;
+      if (orientation == GTK_ORIENTATION_HORIZONTAL)
+        {
+          *minimum = (int)width;
+          *natural = (int)width;
+        }
+      else /* VERTICAL */
+        {
+          *minimum = (int)height;
+          *natural = (int)height;
+        }
     }
 }
 
@@ -1999,15 +2034,14 @@ gtk_image_view_class_init (GtkImageViewClass *view_class)
   object_class->get_property = gtk_image_view_get_property;
   object_class->finalize     = gtk_image_view_finalize;
 
-  widget_class->draw                 = gtk_image_view_draw;
-  widget_class->realize              = gtk_image_view_realize;
-  widget_class->unrealize            = gtk_image_view_unrealize;
-  widget_class->size_allocate        = gtk_image_view_size_allocate;
-  widget_class->map                  = gtk_image_view_map;
-  widget_class->unmap                = gtk_image_view_unmap;
-  widget_class->scroll_event         = gtk_image_view_scroll_event;
-  widget_class->get_preferred_width  = gtk_image_view_get_preferred_width;
-  widget_class->get_preferred_height = gtk_image_view_get_preferred_height;
+  widget_class->realize       = gtk_image_view_realize;
+  widget_class->unrealize     = gtk_image_view_unrealize;
+  widget_class->size_allocate = gtk_image_view_size_allocate;
+  widget_class->map           = gtk_image_view_map;
+  widget_class->unmap         = gtk_image_view_unmap;
+  widget_class->scroll_event  = gtk_image_view_scroll_event;
+  widget_class->measure       = gtk_image_view_measure;
+  widget_class->snapshot      = gtk_image_view_snapshot;
 
   /**
    * GtkImageView:scale:
@@ -2221,6 +2255,9 @@ gtk_image_view_load_image_from_stream (GtkImageView *image_view,
 
       gtk_image_view_set_abstract_image (image_view, image);
     }
+
+  g_input_stream_close (input_stream, NULL, NULL);
+  g_object_unref (input_stream);
 }
 
 static void


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