[nautilus/wip/csoriano/flow] add max-width container



commit 4901518baccd90524b4dbf78d572b3dd9c0826e2
Author: Carlos Soriano <csoriano gnome org>
Date:   Wed Nov 30 17:37:53 2016 +0100

    add max-width container

 src/Makefile.am               |    2 +
 src/nautilus-icon-view-item.c |  134 ++++++++++++++++++++++++++++++++++++++---
 src/nautilus-icon-view-item.h |   11 +++-
 src/nautilus-icon-view.c      |   60 ++++++-------------
 src/resources/css/Adwaita.css |    8 +-
 5 files changed, 159 insertions(+), 56 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index b8b233c..3e2dd1a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -168,6 +168,8 @@ nautilus_no_main_sources = \
        nautilus-freedesktop-dbus.h             \
        nautilus-icon-view.c                    \
        nautilus-icon-view.h                    \
+       nautilus-icon-view-item.c               \
+       nautilus-icon-view-item.h               \
        nautilus-image-properties-page.c        \
        nautilus-image-properties-page.h        \
        nautilus-list-model.c                   \
diff --git a/src/nautilus-icon-view-item.c b/src/nautilus-icon-view-item.c
index a76de74..329d746 100644
--- a/src/nautilus-icon-view-item.c
+++ b/src/nautilus-icon-view-item.c
@@ -3,6 +3,7 @@
 struct _NautilusIconViewItem
 {
     GtkBin parent_instance;
+    guint max_width;
 };
 
 G_DEFINE_TYPE (NautilusIconViewItem, nautilus_icon_view_item, GTK_TYPE_BIN)
@@ -10,11 +11,27 @@ G_DEFINE_TYPE (NautilusIconViewItem, nautilus_icon_view_item, GTK_TYPE_BIN)
 enum
 {
     PROP_0,
+    PROP_FILE,
+    PROP_MAX_WIDTH,
     N_PROPS
 };
 
 static GParamSpec *properties [N_PROPS];
 
+void
+nautilus_icon_view_item_set_max_width (NautilusIconViewItem *self,
+                                       guint                 max_width)
+{
+    self->max_width = max_width;
+    gtk_widget_queue_allocate (GTK_WIDGET (self));
+}
+
+guint
+nautilus_icon_view_item_get_max_width (NautilusIconViewItem *self)
+{
+    return self->max_width;
+}
+
 NautilusIconViewItem *
 nautilus_icon_view_item_new (void)
 {
@@ -39,8 +56,15 @@ nautilus_icon_view_item_get_property (GObject    *object,
 
     switch (prop_id)
     {
+        case PROP_MAX_WIDTH:
+        {
+            g_value_set_int (value, self->max_width);
+        }
         default:
+        {
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        }
+        break;
     }
 }
 
@@ -54,38 +78,132 @@ nautilus_icon_view_item_set_property (GObject      *object,
 
     switch (prop_id)
     {
+        case PROP_MAX_WIDTH:
+        {
+            nautilus_icon_view_item_set_max_width (self, g_value_get_int (value));
+        }
+        break;
         default:
+        {
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        }
+        break;
     }
 }
 
 static void
-get_preferred_size (GtkWidget      *widget,
-                    GtkRequisition *minimum_size,
-                    GtkRequisition *natural_size)
+get_preferred_width (GtkWidget *widget,
+                     gint      *minimum_size,
+                     gint      *natural_size)
 {
     GtkWidget *child;
     NautilusIconViewItem *self;
+    GtkStyleContext *style_context;
+    GtkBorder padding;
 
     self = NAUTILUS_ICON_VIEW_ITEM (widget);
-    child = gtk_bin_get_child (self);
+    child = gtk_bin_get_child (GTK_BIN (self));
+
+    *natural_size = 0;
+    *minimum_size = 0;
+    gtk_widget_get_preferred_width (child, minimum_size, natural_size);
+
+    *minimum_size = self->max_width == -1 ? *minimum_size : 96;
+    *natural_size = self->max_width == -1 ? *natural_size :
+                                            MAX (*minimum_size, MIN (self->max_width, *natural_size));
+
+    style_context = gtk_widget_get_style_context (child);
+    gtk_style_context_get_padding (style_context,
+                                   gtk_widget_get_state_flags (child),
+                                   &padding);
+    *minimum_size += padding.left + padding.right;
+    *natural_size += padding.left + padding.right;
+}
+
+static void
+get_preferred_height (GtkWidget *widget,
+                      gint      *minimum_size,
+                      gint      *natural_size)
+{
+    GtkWidget *child;
+    NautilusIconViewItem *self;
+    gint minimum_width = 0;
+    gint natural_width = 0;
+    GtkStyleContext *style_context;
+    GtkBorder padding;
+
+    self = NAUTILUS_ICON_VIEW_ITEM (widget);
+    child = gtk_bin_get_child (GTK_BIN (self));
+
+    get_preferred_width (widget, &minimum_width, &natural_width);
+    natural_width = self->max_width == -1 ? natural_width : MIN (self->max_width, natural_width);
+
+    gtk_widget_get_preferred_height_for_width (child, natural_width, minimum_size, natural_size);
+
+    style_context = gtk_widget_get_style_context (child);
+    gtk_style_context_get_padding (style_context,
+                                   gtk_widget_get_state_flags (child),
+                                   &padding);
+    *minimum_size += padding.top + padding.bottom;
+    *natural_size += padding.top + padding.bottom;
+
+    g_print ("preferred height %d %d\n", *minimum_size, *natural_size);
+}
+
+static void
+get_preferred_height_for_width (GtkWidget *widget,
+                                gint       width,
+                                gint      *minimum_size,
+                                gint      *natural_size)
+{
+    get_preferred_height (widget, minimum_size, natural_size);
+}
+
+static void
+size_allocate (GtkWidget     *widget,
+               GtkAllocation *allocation)
+{
+    GTK_WIDGET_CLASS (nautilus_icon_view_item_parent_class)->size_allocate (widget, allocation);
+}
+
+static void
+get_preferred_width_for_height (GtkWidget *widget,
+                                gint       height,
+                                gint      *minimum_size,
+                                gint      *natural_size)
+{
+    get_preferred_width (widget, minimum_size, natural_size);
+    g_print ("get preffered width for height %d\n", *natural_size);
+}
+
+static void
+constructed (GObject *obj)
+{
+    NautilusIconViewItem *self = NAUTILUS_ICON_VIEW_ITEM (obj);
 
-    gtk_widget_get_preferred_size (child, minimum_size, natural_size);
+    G_OBJECT_CLASS (nautilus_icon_view_item_parent_class)->constructed (obj);
 
-    natural_size->width = 96;
+    /* We want our parent to gives our preferred width */
+    gtk_widget_set_halign (GTK_WIDGET (self), GTK_ALIGN_CENTER);
+    self->max_width = -1;
 }
 
 static void
 nautilus_icon_view_item_class_init (NautilusIconViewItemClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
-    GtkWidgetClass *widget_class = G_WIDGET_CLASS (klass);
+    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (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;
+    object_class->constructed = constructed;
 
-    widget_class->get_preferred_size = get_preferred_size;
+    widget_class->get_preferred_width = get_preferred_width;
+    widget_class->get_preferred_width_for_height = get_preferred_width_for_height;
+    widget_class->get_preferred_height = get_preferred_height;
+    widget_class->get_preferred_height_for_width = get_preferred_height_for_width;
+    widget_class->size_allocate = size_allocate;
 }
 
 static void
diff --git a/src/nautilus-icon-view-item.h b/src/nautilus-icon-view-item.h
index bba8f85..9c3b3f6 100644
--- a/src/nautilus-icon-view-item.h
+++ b/src/nautilus-icon-view-item.h
@@ -1,16 +1,23 @@
 #ifndef NAUTILUS_ICON_VIEW_ITEM_H
 #define NAUTILUS_ICON_VIEW_ITEM_H
 
-#include <glib-object.h>
+#include <glib.h>
+#include <gtk/gtk.h>
 
 G_BEGIN_DECLS
 
 #define NAUTILUS_TYPE_ICON_VIEW_ITEM (nautilus_icon_view_item_get_type())
 
-G_DECLARE_FINAL_TYPE (NautilusIconViewItem, nautilus_icon_view_item, NAUTILUS, ICON_VIEW_ITEM, GTK_TYPE_BIN)
+G_DECLARE_FINAL_TYPE (NautilusIconViewItem, nautilus_icon_view_item, NAUTILUS, ICON_VIEW_ITEM, GtkBin)
 
 NautilusIconViewItem *nautilus_icon_view_item_new (void);
 
+void
+nautilus_icon_view_item_set_max_width (NautilusIconViewItem *self,
+                                       guint                 max_width);
+guint
+nautilus_icon_view_item_get_max_width (NautilusIconViewItem *self);
+
 G_END_DECLS
 
 #endif /* NAUTILUS_ICON_VIEW_ITEM_H */
diff --git a/src/nautilus-icon-view.c b/src/nautilus-icon-view.c
index 9f66d6d..ddee020 100644
--- a/src/nautilus-icon-view.c
+++ b/src/nautilus-icon-view.c
@@ -24,6 +24,8 @@
 #include "nautilus-directory.h"
 #include "nautilus-global-preferences.h"
 
+#include "nautilus-icon-view-item.h"
+
 #include <glib.h>
 
 static int n_files = 0;
@@ -234,10 +236,7 @@ create_icon (NautilusIconView *self,
     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");
-#if 0
-    gtk_widget_set_size_request (fixed_height_box, 130,
-                                 -1);
-#endif
+
     gtk_box_pack_start (fixed_height_box, icon, FALSE, FALSE, 0);
 
     gtk_widget_show_all (fixed_height_box);
@@ -249,10 +248,12 @@ 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;
@@ -261,7 +262,10 @@ replace_icon (NautilusIconView *self,
     old_icon = g_object_get_data (flow_box_item, "icon");
     label = g_object_get_data (flow_box_item, "label");
 
-    box = gtk_bin_get_child (GTK_BIN (flow_box_item));
+    icon_item = gtk_bin_get_child (GTK_BIN (flow_box_item));
+    nautilus_icon_view_item_set_max_width (NAUTILUS_ICON_VIEW_ITEM (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);
@@ -472,6 +476,7 @@ create_widget_func (gpointer item,
     NautilusIconViewPrivate *priv = nautilus_icon_view_get_instance_private (self);
     GtkFlowBoxChild *child;
     GtkBox *container;
+    NautilusIconViewItem *icon_item;
     gint label_nat_size;
     gint icon_nat_size;
     GtkLabel *label;
@@ -479,14 +484,13 @@ create_widget_func (gpointer item,
     GtkStyleContext *style_context;
 
     container = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+    icon_item = nautilus_icon_view_item_new ();
 
     icon = create_icon (self, file);
     gtk_box_pack_start (container, icon, FALSE, FALSE, 0);
 
     label = gtk_label_new (nautilus_file_get_display_name (file));
     gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_END);
-    gtk_label_set_max_width_chars (label, 0);
-    gtk_label_set_width_chars (label, 10);
     gtk_label_set_line_wrap (label, TRUE);
     gtk_label_set_line_wrap_mode (label, PANGO_WRAP_WORD_CHAR);
     gtk_label_set_lines (label, 4);
@@ -497,50 +501,22 @@ create_widget_func (gpointer item,
     style_context = gtk_widget_get_style_context (container);
     gtk_style_context_add_class (style_context, "icon-item-background");
 
-
-#if 0
-flowboxchild: selected {
-        background - color:transparent;
-    }
-flowboxchild: selected > box.icon - background {
-        background - color:#4a90d9;
-        border - color:#4a90d9;
-        border - style:solid;
-        border - width:2px;
-        border - radius:4px 4px 0px 0px;
-    }
-    flowboxchild > box.icon - background {
-        border - color:transparent;
-        border - style:solid;
-        border - width:2px;
-        border - radius:4px 4px 0px 0px;
-    }
-flowboxchild: selected > box.label - background {
-        background - color:#4a90d9;
-        border - color:#4a90d9;
-        border - style:solid;
-        border - width:2px;
-        border - radius:0px 0px 4px 4px;
-    }
-    flowboxchild > box.label - background {
-        border - color:transparent;
-        border - style:solid;
-        border - width:2px;
-        border - radius:0px 0px 4px 4px;
-    }
-#endif
     gtk_widget_show_all (container);
     gtk_widget_set_valign (container, GTK_ALIGN_START);
     gtk_widget_set_halign (container, GTK_ALIGN_CENTER);
 
+    gtk_container_add (icon_item, container);
+    nautilus_icon_view_item_set_max_width (NAUTILUS_ICON_VIEW_ITEM (icon_item),
+                                           get_icon_size_for_zoom_level (priv->zoom_level));
+
     child = gtk_flow_box_child_new ();
-    gtk_container_add (child, container);
+    gtk_container_add (child, icon_item);
 
     g_object_set_data (child, "file", file);
     g_object_set_data (child, "icon", icon);
     g_object_set_data (child, "label", label);
-    gtk_widget_set_size_request (GTK_WIDGET (child),
-                                 MAX (NAUTILUS_CANVAS_ICON_SIZE_LARGE, get_icon_size_for_zoom_level 
(priv->zoom_level)), -1);
+
+    gtk_widget_show_all (child);
 
     return child;
 }
diff --git a/src/resources/css/Adwaita.css b/src/resources/css/Adwaita.css
index 8938f89..fc05297 100644
--- a/src/resources/css/Adwaita.css
+++ b/src/resources/css/Adwaita.css
@@ -189,9 +189,9 @@ searchbar { border-top: 1px solid @borders; }
 /* Icon view */
 flowboxchild:selected{background-color:transparent;}
 
-flowboxchild > box .icon-background {padding:0px; background-color:black; border-color:#4a90d9; 
border-style:solid; border-width:0px;}
-flowboxchild:selected > box .icon-background {padding:0px; background-color:black; border-color:#4a90d9; 
border-style:solid; border-width:0px;}
+flowboxchild > widget > box > .icon-background {padding:0px; background-color:black; border-color:#4a90d9; 
border-style:solid; border-width:0px;}
+flowboxchild:selected > widget > box > .icon-background {padding:0px; background-color:black; 
border-color:#4a90d9; border-style:solid; border-width:0px;}
 
-flowboxchild > .icon-item-background {padding:4px;}
-flowboxchild:selected > .icon-item-background {padding:4px; background-color:#4a90d9; border-color:#4a90d9; 
border-style:solid; border-width:0px; border-radius:4px 4px 4px 4px;}
+flowboxchild > widget > .icon-item-background {padding:4px;}
+flowboxchild:selected > widget > .icon-item-background {padding:4px; background-color:#4a90d9; 
border-color:#4a90d9; border-style:solid; border-width:0px; border-radius:4px 4px 4px 4px;}
 


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