[nautilus/wip/csoriano/flow] create icon view item



commit 74561da75221bbf291e22a6c6abbf41f33b9c206
Author: Carlos Soriano <csoriano gnome org>
Date:   Mon Dec 5 00:45:17 2016 +0100

    create icon view item

 src/nautilus-icon-view-item.c |  134 ++++++++++++++++++++++++++++++++++++++++-
 src/nautilus-icon-view-item.h |    8 +++
 src/nautilus-icon-view.c      |   75 +----------------------
 3 files changed, 142 insertions(+), 75 deletions(-)
---
diff --git a/src/nautilus-icon-view-item.c b/src/nautilus-icon-view-item.c
index d1c0edc..921acba 100644
--- a/src/nautilus-icon-view-item.c
+++ b/src/nautilus-icon-view-item.c
@@ -4,6 +4,7 @@ struct _NautilusIconViewItem
 {
     GtkFlowBoxChild parent_instance;
     GtkWidget *item_container;
+    guint icon_size;
 };
 
 G_DEFINE_TYPE (NautilusIconViewItem, nautilus_icon_view_item, GTK_TYPE_FLOW_BOX_CHILD)
@@ -12,6 +13,7 @@ enum
 {
     PROP_0,
     PROP_FILE,
+    PROP_ICON_SIZE,
     N_PROPS
 };
 
@@ -41,8 +43,22 @@ nautilus_icon_view_item_get_property (GObject    *object,
 
     switch (prop_id)
     {
+        case PROP_FILE:
+        {
+            g_value_set_object (value, self->file);
+        }
+        break;
+
+        case PROP_ICON_SIZE:
+        {
+            g_value_set_int (value, self->icon_size);
+        }
+        break;
+
         default:
+        {
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        }
     }
 }
 
@@ -56,8 +72,22 @@ nautilus_icon_view_item_set_property (GObject      *object,
 
     switch (prop_id)
     {
+        case PROP_FILE:
+        {
+            nautilus_icon_view_item_set_file (self, g_value_get_object (value));
+        }
+        break;
+
+        case PROP_ICON_SIZE:
+        {
+            nautilus_icon_view_item_set_icon_size (self, g_value_get_int (value));
+        }
+        break;
+
         default:
+        {
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        }
     }
 }
 
@@ -69,14 +99,92 @@ nautilus_icon_view_item_class_init (NautilusIconViewItemClass *klass)
     object_class->finalize = nautilus_icon_view_item_finalize;
     object_class->get_property = nautilus_icon_view_item_get_property;
     object_class->set_property = nautilus_icon_view_item_set_property;
+
+    g_object_class_install_property (object_class,
+                                     PROP_ICON_SIZE,
+                                     g_param_spec_int ("icon-size",
+                                                       "Icon size",
+                                                       "The size in pixels of the icon",
+                                                       NAUTILUS_CANVAS_ICON_SIZE_SMALL,
+                                                       NAUTILUS_CANVAS_ICON_SIZE_LARGER,
+                                                       NAUTILUS_CANVAS_ICON_SIZE_LARGE,
+                                                       G_PARAM_READWRITE));
+    g_object_class_install_property (object_class,
+                                     PROP_FILE,
+                                     g_param_spec_object ("icon-size",
+                                                          "Icon size",
+                                                          "The size in pixels of the icon",
+                                                          NAUTILUS_TYPE_FILE,
+                                                          G_PARAM_READWRITE));
+}
+
+static GtkWidget *
+create_icon (NautilusIconViewItem *self)
+{
+    NautilusFileIconFlags flags;
+    g_autoptr (GdkPixbuf) icon_pixbuf;
+    GtkImage *icon;
+    GtkWidget *fixed_height_box;
+    GtkStyleContext *style_context;
+
+    flags = NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS |
+            NAUTILUS_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE |
+            NAUTILUS_FILE_ICON_FLAGS_USE_EMBLEMS |
+            NAUTILUS_FILE_ICON_FLAGS_USE_ONE_EMBLEM;
+
+    icon_pixbuf = nautilus_file_get_icon_pixbuf (self->file, priv->icon_size,
+                                                 TRUE, 1, flags);
+    icon = gtk_image_new_from_pixbuf (icon_pixbuf);
+    gtk_widget_set_hexpand (icon, TRUE);
+    gtk_widget_set_vexpand (icon, TRUE);
+    gtk_widget_set_valign (icon, GTK_ALIGN_CENTER);
+    gtk_widget_set_halign (icon, GTK_ALIGN_CENTER);
+
+    fixed_height_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+    gtk_widget_set_valign (fixed_height_box, GTK_ALIGN_CENTER);
+    gtk_widget_set_halign (fixed_height_box, GTK_ALIGN_CENTER);
+    gtk_widget_set_size_request (fixed_height_box, get_icon_size_for_zoom_level (priv->zoom_level),
+                                 get_icon_size_for_zoom_level (priv->zoom_level));
+
+
+    style_context = gtk_widget_get_style_context (fixed_height_box);
+    gtk_style_context_add_class (style_contet, "icon-background");
+
+    gtk_box_pack_start (fixed_height_box, icon, FALSE, FALSE, 0);
+
+    gtk_widget_show_all (fixed_height_box);
+
+    return fixed_height_box;
+}
+
+static void
+update_icon (NautilusIconViewItem *self)
+{
+    GtkWidget *new_icon;
+    GtkWidget *old_icon;
+    GtkWidget *box;
+    GtkWidget *label;
+    NautilusFile *file;
+    gint label_nat_size;
+    gint icon_nat_size;
+
+    file = g_object_get_data (flow_box_item, "file");
+    old_icon = g_object_get_data (flow_box_item, "icon");
+    label = g_object_get_data (flow_box_item, "label");
+
+    nautilus_container_max_width_set_max_width (NAUTILUS_CONTAINER_MAX_WIDTH (self->item_container),
+                                                get_icon_size_for_zoom_level (priv->zoom_level));
+    box = gtk_bin_get_child (GTK_BIN (self->item_container));
+    gtk_container_remove (GTK_CONTAINER (box), old_icon);
+    new_icon = create_icon (self);
+    gtk_box_pack_start (box, new_icon, FALSE, FALSE, 0);
+    g_object_set_data (flow_box_item, "icon", new_icon);
 }
 
 static void
 nautilus_icon_view_item_init (NautilusIconViewItem *self)
 {
-    NautilusIconView *self = NAUTILUS_ICON_VIEW (user_data);
     NautilusFile *file = NAUTILUS_FILE (item);
-    NautilusIconViewPrivate *priv = nautilus_icon_view_get_instance_private (self);
     GtkFlowBoxChild *child;
     GtkBox *container;
     NautilusContainerMaxWidth *item_container;
@@ -89,7 +197,7 @@ nautilus_icon_view_item_init (NautilusIconViewItem *self)
     container = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
     self->item_container = nautilus_container_max_width_new ();
 
-    icon = create_icon (self, file);
+    icon = create_icon (self);
     gtk_box_pack_start (container, icon, FALSE, FALSE, 0);
 
     label = gtk_label_new (nautilus_file_get_display_name (file));
@@ -121,3 +229,23 @@ nautilus_icon_view_item_init (NautilusIconViewItem *self)
 
     gtk_widget_show_all (child);
 }
+
+void
+nautilus_icon_view_item_set_icon_size (NautilusIconViewItem *self,
+                                       guint                 icon_size)
+{
+  g_return_if_fail (NAUTILUS_IS_ICON_VIEW_ITEM (self));
+
+  priv->icon_size = icon_size;
+  update_icon (self);
+}
+
+void
+nautilus_icon_view_item_set_file (NautilusIconViewItem *self,
+                                  NautilusFile         *file)
+{
+  g_return_if_fail (NAUTILUS_IS_ICON_VIEW_ITEM (self));
+
+  g_clear_object (self->file);
+  self->file = g_object_ref (file);
+}
diff --git a/src/nautilus-icon-view-item.h b/src/nautilus-icon-view-item.h
index 1cbaa29..a33c1f5 100644
--- a/src/nautilus-icon-view-item.h
+++ b/src/nautilus-icon-view-item.h
@@ -4,6 +4,8 @@
 #include <glib.h>
 #include <gtk/gtk.h>
 
+#include "nautilus-file.h"
+
 G_BEGIN_DECLS
 
 #define NAUTILUS_TYPE_ICON_VIEW_ITEM (nautilus_icon_view_item_get_type())
@@ -12,6 +14,12 @@ G_DECLARE_FINAL_TYPE (NautilusIconViewItem, nautilus_icon_view_item, NAUTILUS, I
 
 NautilusIconViewItem *nautilus_icon_view_item_new (void);
 
+void nautilus_icon_view_item_set_icon_size (NautilusIconViewItem *item,
+                                            guint                 icon_size);
+
+void nautilus_icon_view_item_set_file (NautilusIconViewItem *item,
+                                       NautilusFile         *file);
+
 G_END_DECLS
 
 #endif /* NAUTILUS_ICON_VIEW_ITEM_H */
diff --git a/src/nautilus-icon-view.c b/src/nautilus-icon-view.c
index 7819c58..41ef305 100644
--- a/src/nautilus-icon-view.c
+++ b/src/nautilus-icon-view.c
@@ -200,75 +200,6 @@ get_icon_size_for_zoom_level (NautilusCanvasZoomLevel zoom_level)
     g_return_val_if_reached (NAUTILUS_CANVAS_ICON_SIZE_STANDARD);
 }
 
-static GtkWidget *
-create_icon (NautilusIconView *self,
-             NautilusFile     *file)
-{
-    NautilusIconViewPrivate *priv = nautilus_icon_view_get_instance_private (self);
-    NautilusFileIconFlags flags;
-    g_autoptr (GdkPixbuf) icon_pixbuf;
-    GtkImage *icon;
-    GtkWidget *fixed_height_box;
-
-    flags = NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS |
-            NAUTILUS_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE |
-            NAUTILUS_FILE_ICON_FLAGS_USE_EMBLEMS |
-            NAUTILUS_FILE_ICON_FLAGS_USE_ONE_EMBLEM;
-
-    icon_pixbuf = nautilus_file_get_icon_pixbuf (file, get_icon_size_for_zoom_level (priv->zoom_level),
-                                                 TRUE, 1, flags);
-    icon = gtk_image_new_from_pixbuf (icon_pixbuf);
-    gtk_widget_set_hexpand (icon, TRUE);
-    gtk_widget_set_vexpand (icon, TRUE);
-    gtk_widget_set_valign (icon, GTK_ALIGN_CENTER);
-    gtk_widget_set_halign (icon, GTK_ALIGN_CENTER);
-
-    fixed_height_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    gtk_widget_set_valign (fixed_height_box, GTK_ALIGN_CENTER);
-    gtk_widget_set_halign (fixed_height_box, GTK_ALIGN_CENTER);
-    gtk_widget_set_size_request (fixed_height_box, get_icon_size_for_zoom_level (priv->zoom_level),
-                                 get_icon_size_for_zoom_level (priv->zoom_level));
-
-
-    GtkStyleContext *style_contet = gtk_widget_get_style_context (fixed_height_box);
-    /*.icon-background {background-color:#fbfbfb; box-shadow: 0px 0px 4px #DDD; margin-bottom:4px} */
-    gtk_style_context_add_class (style_contet, "icon-background");
-
-    gtk_box_pack_start (fixed_height_box, icon, FALSE, FALSE, 0);
-
-    gtk_widget_show_all (fixed_height_box);
-
-    return fixed_height_box;
-}
-
-static void
-replace_icon (NautilusIconView *self,
-              GtkWidget        *flow_box_item)
-{
-    NautilusIconViewPrivate *priv = nautilus_icon_view_get_instance_private (self);
-    GtkWidget *new_icon;
-    GtkWidget *old_icon;
-    GtkWidget *box;
-    GtkWidget *label;
-    GtkWidget *icon_item;
-    NautilusFile *file;
-    gint label_nat_size;
-    gint icon_nat_size;
-
-    file = g_object_get_data (flow_box_item, "file");
-    old_icon = g_object_get_data (flow_box_item, "icon");
-    label = g_object_get_data (flow_box_item, "label");
-
-    icon_item = gtk_bin_get_child (GTK_BIN (flow_box_item));
-    nautilus_container_max_width_set_max_width (NAUTILUS_CONTAINER_MAX_WIDTH (icon_item),
-                                                get_icon_size_for_zoom_level (priv->zoom_level));
-    box = gtk_bin_get_child (GTK_BIN (icon_item));
-    gtk_container_remove (GTK_CONTAINER (box), old_icon);
-    new_icon = create_icon (self, file);
-    gtk_box_pack_start (box, new_icon, FALSE, FALSE, 0);
-    g_object_set_data (flow_box_item, "icon", new_icon);
-}
-
 static void
 set_icon_size (NautilusIconView *self,
                gint              icon_size)
@@ -277,14 +208,14 @@ set_icon_size (NautilusIconView *self,
     g_autoptr (GList) items;
     GList *l;
     g_autoptr (GList) box_children;
-    GtkWidget *flow_box_item;
+    NautilusIconViewItem *item;
 
     items = gtk_container_get_children (priv->flow_box);
 
     for (l = items; l; l = l->next)
     {
-        flow_box_item = GTK_WIDGET (l->data);
-        replace_icon (self, flow_box_item);
+        item = GTK_WIDGET (l->data);
+        nautilus_icon_view_item_set_icon_size (self, get_icon_size_for_zoom_level (priv->zoom_level));
     }
 }
 


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