[nautilus/wip/csoriano/flow] add max-width container
- From: Carlos Soriano <csoriano src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/csoriano/flow] add max-width container
- Date: Wed, 30 Nov 2016 16:38:37 +0000 (UTC)
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]