[gtk+/wip/csoriano/pathbar-bin-view-window] f
- From: Carlos Soriano Sánchez <csoriano src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/csoriano/pathbar-bin-view-window] f
- Date: Wed, 10 Aug 2016 20:14:49 +0000 (UTC)
commit 43486b0d5e34b399108874754fd10de21036ffcc
Author: Carlos Soriano <csoriano gnome org>
Date: Wed Aug 10 09:33:01 2016 +0200
f
gtk/gtkpathbar.c | 356 ++++++++++++++++++++++++++++++---------------
gtk/gtkpathbarbox.c | 1 -
gtk/gtkpathbarcontainer.c | 27 ++--
gtk/ui/gtkpathbar.ui | 4 -
tests/testpathbar.c | 11 +-
5 files changed, 260 insertions(+), 139 deletions(-)
---
diff --git a/gtk/gtkpathbar.c b/gtk/gtkpathbar.c
index 3716ef3..4d0b1aa 100644
--- a/gtk/gtkpathbar.c
+++ b/gtk/gtkpathbar.c
@@ -79,6 +79,7 @@ struct _GtkPathBarPrivate
gchar *root_path;
gchar *path;
+ gchar *old_path;
gchar *selected_path;
gint inverted :1;
@@ -127,6 +128,7 @@ get_path_bar_widgets (GtkPathBar *self,
GtkWidget **path_bar,
GtkWidget **root_overflow_button,
GtkWidget **tail_overflow_button,
+ GtkWidget **root_button,
GtkWidget **tail_button,
GtkWidget **path_bar_container,
gboolean current)
@@ -150,6 +152,8 @@ get_path_bar_widgets (GtkPathBar *self,
if (tail_button)
*tail_button = priv->path_bar_tail_1;
+ if (root_button)
+ *root_button = priv->path_bar_root_1;
}
else
{
@@ -164,6 +168,8 @@ get_path_bar_widgets (GtkPathBar *self,
if (tail_button)
*tail_button = priv->path_bar_tail_2;
+ if (root_button)
+ *root_button = priv->path_bar_root_2;
}
}
@@ -266,43 +272,85 @@ free_path_chunk_data (PathChunkData *data)
g_slice_free (PathChunkData, data);
}
-static GtkWidget *
-create_path_chunk (GtkPathBar *self,
+static void
+add_path_chunk_data (GtkPathBar *self,
+ GtkWidget *widget,
+ GtkWidget *button,
+ const gchar *path,
+ const gchar *label,
+ GIcon *icon)
+{
+ PathChunkData *path_chunk_data;
+
+ path_chunk_data = g_slice_new (PathChunkData);
+ if (label)
+ path_chunk_data->label = g_strdup (label);
+ else
+ path_chunk_data->label = NULL;
+
+ if (icon)
+ path_chunk_data->icon = g_object_ref (icon);
+ else
+ path_chunk_data->icon = NULL;
+
+ path_chunk_data->path = g_strdup (path);
+ path_chunk_data->path_bar = self;
+ path_chunk_data->button = button;
+ g_object_set_data_full (G_OBJECT (widget), "data",
+ path_chunk_data, (GDestroyNotify) free_path_chunk_data);
+}
+
+static void
+update_path_chunk (GtkPathBar *self,
+ GtkWidget *widget,
+ GtkWidget *button,
const gchar *path,
const gchar *label,
- GIcon *icon,
- gboolean separator_after_button)
+ GIcon *icon)
{
- GtkWidget *button;
- GtkWidget *separator;
- GtkWidget *path_chunk;
- GtkWidget *button_label;
GtkWidget *image;
- GtkStyleContext *style;
- PathChunkData *path_chunk_data;
+ GtkWidget *button_label;
- path_chunk = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
- button = gtk_toggle_button_new ();
+ gtk_container_foreach (GTK_CONTAINER (button), (GtkCallback) gtk_widget_destroy, NULL);
if (icon)
{
image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_MENU);
gtk_button_set_image (GTK_BUTTON (button), image);
+
+ gtk_widget_show (image);
}
- else if (label)
+
+ if (label)
{
button_label = gtk_label_new (label);
gtk_label_set_ellipsize (GTK_LABEL (button_label), PANGO_ELLIPSIZE_MIDDLE);
- // FIXME: the GtkLabel requests more than the number of chars set here.
- // For visual testing for now substract 2 chars.
gtk_label_set_width_chars (GTK_LABEL (button_label),
MIN (strlen (label), 10));
gtk_container_add (GTK_CONTAINER (button), button_label);
+
+ gtk_widget_show (button_label);
}
- else
- {
- g_critical ("Path chunk doesn't provide either icon or label");
- }
+
+ add_path_chunk_data (self, widget, button, path, label, icon);
+}
+
+static GtkWidget *
+create_path_chunk (GtkPathBar *self,
+ const gchar *path,
+ const gchar *label,
+ GIcon *icon,
+ gboolean separator_after_button)
+{
+ GtkWidget *button;
+ GtkWidget *separator;
+ GtkWidget *path_chunk;
+ GtkStyleContext *style;
+
+ path_chunk = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ button = gtk_toggle_button_new ();
+
+ update_path_chunk (self, path_chunk, button, path, label, icon);
style = gtk_widget_get_style_context (button);
gtk_style_context_add_class (style, "flat");
@@ -324,33 +372,27 @@ create_path_chunk (GtkPathBar *self,
gtk_container_add (GTK_CONTAINER (path_chunk), separator);
}
- path_chunk_data = g_slice_new (PathChunkData);
- if (label)
- path_chunk_data->label = g_strdup (label);
- else
- path_chunk_data->label = NULL;
-
- if (icon)
- path_chunk_data->icon = g_object_ref (icon);
- else
- path_chunk_data->icon = NULL;
-
- path_chunk_data->path = g_strdup (path);
- path_chunk_data->path_bar = self;
- path_chunk_data->button = button;
- g_object_set_data_full (G_OBJECT (path_chunk), "data",
- path_chunk_data, (GDestroyNotify) free_path_chunk_data);
-
gtk_widget_show_all (path_chunk);
return path_chunk;
}
+static gboolean
+is_absolute_root (const gchar *path)
+{
+ return g_strcmp0 (path, G_DIR_SEPARATOR_S) == 0;
+}
+
static gchar**
-get_splitted_path (const gchar* path)
+get_splitted_path (GtkPathBar *self,
+ const gchar *path)
{
gchar *path_no_first_slash;
- gchar **splitted_path;
+ gchar **splitted_path = NULL;
+
+g_print ("path get splitted path %s\n", path);
+ if (strlen (path) == 0)
+ return splitted_path;
path_no_first_slash = g_utf8_substring (path, 1, strlen (path));
splitted_path = g_strsplit (path_no_first_slash, G_DIR_SEPARATOR_S, -1);
@@ -360,10 +402,32 @@ get_splitted_path (const gchar* path)
return splitted_path;
}
-static gboolean
-is_absolute_root (const gchar *path)
+static gchar *
+get_unprefixed_path (GtkPathBar *self,
+ const gchar *path)
{
- return g_strcmp0 (path, G_DIR_SEPARATOR_S) == 0;
+ GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (self);
+ gchar *unprefixed_path = NULL;
+
+ if (priv->root_path && !is_absolute_root (priv->root_path))
+ {
+ unprefixed_path = g_utf8_substring (path,
+ priv->root_path ? strlen (priv->root_path) : 0,
+ strlen (path));
+ }
+ else
+ {
+ gchar **splitted_path = NULL;
+
+ splitted_path = get_splitted_path (self, path);
+
+ if (splitted_path[0])
+ unprefixed_path = g_utf8_substring (path,
+ strlen (splitted_path[0]) + 1,
+ strlen (path));
+ }
+
+ return unprefixed_path;
}
static gboolean
@@ -413,14 +477,28 @@ fill_path_bar (GtkPathBar *self,
{
GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (self);
GString *current_path ;
+ gchar** prefixed_splitted_path;
GtkWidget *path_chunk;
gboolean separator_after_button;
gint length;
gint i;
+ GString *root_path;
current_path = g_string_new ("");
if (priv->root_path)
- g_string_append (current_path, priv->root_path);
+ {
+ g_string_append (current_path, priv->root_path);
+ }
+ else if (!is_absolute_root (priv->path))
+ {
+ prefixed_splitted_path = get_splitted_path (self, priv->path);
+ root_path = g_string_new ("");
+ g_string_append (root_path, G_DIR_SEPARATOR_S);
+ g_string_append (root_path, prefixed_splitted_path[0]);
+
+ g_string_append (current_path, root_path->str);
+ }
+
i = splitted_old_path ? g_strv_length (splitted_old_path) : 0;
length = g_strv_length (splitted_path);
for (; i < length; i++)
@@ -443,7 +521,8 @@ fill_path_bar (GtkPathBar *self,
}
static void
-hide_overflow_handling (GtkPathBar *self)
+hide_overflow_handling (GtkPathBar *self,
+ gboolean root)
{
GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (self);
GtkWidget *path_chunk;
@@ -451,11 +530,12 @@ hide_overflow_handling (GtkPathBar *self)
GtkWidget *root_overflow_button;
GtkWidget *tail_button;
GtkWidget *path_bar_container;
- g_print ("###### hide overflow %d\n", priv->inverted);
+ gchar** splitted_path;
- get_path_bar_widgets (GTK_PATH_BAR (self), NULL, &root_overflow_button, &tail_overflow_button,
&tail_button, &path_bar_container, TRUE);
+ get_path_bar_widgets (GTK_PATH_BAR (self), NULL, &root_overflow_button, &tail_overflow_button, NULL,
&tail_button, &path_bar_container, TRUE);
- if (priv->inverted)
+g_print ("hide overflow\n");
+ if (root)
{
gtk_button_set_label (root_overflow_button, "/");
gtk_widget_set_sensitive (root_overflow_button, FALSE);
@@ -464,31 +544,18 @@ hide_overflow_handling (GtkPathBar *self)
{
gtk_widget_hide (tail_overflow_button);
gtk_widget_hide (tail_button);
- path_chunk = create_path_chunk (self, "/meeh", "The tail",
+ splitted_path = get_splitted_path (self, priv->path);
+ path_chunk = create_path_chunk (self, priv->path, splitted_path[g_strv_length (splitted_path) - 1],
NULL, TRUE);
gtk_path_bar_container_add (path_bar_container, path_chunk, FALSE);
- }
-}
-static void
-on_invert_animation_done (GtkPathBarContainer *container,
- GtkPathBar *self)
-{
- GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (self);
- GtkWidget *path_chunk;
- GtkWidget *overflow_button;
- GtkWidget *tail_button;
- GList *children;
- GList *shown_children;
-
- if (priv->inverted && gtk_path_bar_container_is_overflowing (container))
- {
- hide_overflow_handling (self);
+ g_strfreev (splitted_path);
}
}
static void
-start_overflow_handling (GtkPathBar *self)
+start_overflow_handling (GtkPathBar *self,
+ gboolean root)
{
GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (self);
GtkWidget *path_bar_container;
@@ -497,22 +564,42 @@ start_overflow_handling (GtkPathBar *self)
GtkWidget *tail_button;
GList *children;
GList *last;
+ gchar** splitted_path;
- get_path_bar_widgets (GTK_PATH_BAR (self), NULL, &root_overflow_button, &tail_overflow_button,
&tail_button, &path_bar_container, TRUE);
+ get_path_bar_widgets (GTK_PATH_BAR (self), NULL, &root_overflow_button, &tail_overflow_button, NULL,
&tail_button, &path_bar_container, TRUE);
- if (priv->inverted)
+g_print ("start overflow\n");
+ if (root)
{
gtk_button_set_label (root_overflow_button, "//");
gtk_widget_set_sensitive (root_overflow_button, TRUE);
}
else
{
+ splitted_path = get_splitted_path (self, priv->path);
+ update_path_chunk (self, tail_button, tail_button, priv->path,
+ splitted_path[g_strv_length (splitted_path) - 1], NULL);
+
gtk_widget_show (tail_overflow_button);
gtk_widget_show (tail_button);
children = gtk_path_bar_container_get_children (path_bar_container);
last = g_list_last (children);
if (last)
gtk_path_bar_container_remove (path_bar_container, last->data, FALSE);
+
+ g_strfreev (splitted_path);
+ }
+}
+
+static void
+on_invert_animation_done (GtkPathBarContainer *container,
+ GtkPathBar *self)
+{
+ GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (self);
+
+ if (gtk_path_bar_container_is_overflowing (container))
+ {
+ hide_overflow_handling (self, !priv->inverted);
}
}
@@ -538,7 +625,8 @@ update_overflow (GtkPathBar *self)
GtkWidget *tail_overflow_button;
GtkWidget *root_overflow_button;
- get_path_bar_widgets (GTK_PATH_BAR (self), NULL, &root_overflow_button, &tail_overflow_button, NULL,
&path_bar_container, TRUE);
+ g_print ("update overflow\n");
+ get_path_bar_widgets (GTK_PATH_BAR (self), NULL, &root_overflow_button, &tail_overflow_button, NULL, NULL,
&path_bar_container, TRUE);
children = gtk_path_bar_container_get_children (path_bar_container);
shown_children = gtk_path_bar_container_get_shown_children (path_bar_container);
last_shown_child = g_list_last (shown_children);
@@ -554,18 +642,18 @@ update_overflow (GtkPathBar *self)
gtk_widget_set_visible (button_children->next->data, visible);
}
- if (!gtk_widget_is_visible (tail_overflow_button))
+ if (gtk_path_bar_container_get_invert_animation (path_bar_container))
return;
- if (!gtk_path_bar_container_is_overflowing (path_bar_container) &&
!gtk_path_bar_container_get_invert_animation (path_bar_container))
+ if (!gtk_path_bar_container_is_overflowing (path_bar_container) &&
+ (gtk_widget_is_visible (tail_overflow_button) || g_strcmp0 (gtk_button_get_label (GTK_BUTTON
(root_overflow_button)), "//") == 0))
{
- g_print ("~~~~~~~~~~~changeeeeed equal lenght\n");
- hide_overflow_handling (self);
+ hide_overflow_handling (self, priv->inverted);
}
- else if (gtk_path_bar_container_is_overflowing (path_bar_container) &&
!gtk_path_bar_container_get_invert_animation (path_bar_container))
+ else if (gtk_path_bar_container_is_overflowing (path_bar_container) &&
+ !(gtk_widget_is_visible (tail_overflow_button) || g_strcmp0 (gtk_button_get_label (GTK_BUTTON
(root_overflow_button)), "//") == 0))
{
- g_print ("~~~~~~~~~~~changeeeeed different length %d %d\n", g_list_length (shown_children),
g_list_length (children));
- start_overflow_handling (self);
+ start_overflow_handling (self, priv->inverted);
}
}
@@ -574,6 +662,7 @@ on_children_shown_changed (GtkPathBarContainer *container,
GParamSpec *spec,
GtkPathBar *self)
{
+ g_print ("children shown changed\n");
update_overflow (self);
}
@@ -583,50 +672,71 @@ update_path_bar (GtkPathBar *self,
{
GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (self);
GtkWidget *path_bar_container;
- GtkWidget *overflow_button;
GtkWidget *path_bar;
- GtkWidget *root_chunk;
+ GtkWidget *root_button;
+ GtkWidget *tail_button;
+ GtkWidget *tail_overflow_button;
+ GtkWidget *root_overflow_button;
gchar *unprefixed_path;
gchar *unprefixed_old_path = NULL;
gchar **splitted_path;
+ gchar **unprefixed_splitted_path;
gchar **splitted_old_path = NULL;
+ gchar **unprefixed_splitted_old_path = NULL;
- g_print ("update path\n");
- if (priv->root_path && !is_absolute_root (priv->root_path))
- {
- unprefixed_path = g_utf8_substring (priv->path, strlen (priv->root_path),
- strlen (priv->path));
- if (old_path)
- unprefixed_old_path = g_utf8_substring (old_path, strlen (priv->root_path),
- strlen (old_path));
- }
- else
- {
- unprefixed_path = g_strdup (priv->path);
- if (old_path)
- unprefixed_old_path = g_utf8_substring (old_path, strlen (priv->root_path),
- strlen (old_path));
- }
+ g_print ("((((((((((((((((((((((((((( update path\n");
+
+ if (old_path)
+ unprefixed_old_path = get_unprefixed_path (self, old_path);
+
+ unprefixed_path = get_unprefixed_path (self, priv->path);
+ splitted_path = get_splitted_path (self, priv->path);
if (unprefixed_old_path &&
(g_str_has_prefix (unprefixed_old_path, unprefixed_path) ||
- g_str_has_prefix (unprefixed_path, unprefixed_old_path)))
- get_path_bar_widgets (GTK_PATH_BAR (self), &path_bar, NULL, NULL, NULL, &path_bar_container, TRUE);
+ g_str_has_prefix (unprefixed_path, unprefixed_old_path)))
+ get_path_bar_widgets (GTK_PATH_BAR (self), &path_bar, &root_overflow_button, &tail_overflow_button,
&root_button, &tail_button, &path_bar_container, TRUE);
else
- get_path_bar_widgets (GTK_PATH_BAR (self), &path_bar, NULL, NULL, NULL, &path_bar_container, FALSE);
+ get_path_bar_widgets (GTK_PATH_BAR (self), &path_bar, &root_overflow_button, &tail_overflow_button,
&root_button, &tail_button, &path_bar_container, FALSE);
+
+ if (!is_absolute_root (priv->path))
+ gtk_widget_show (root_overflow_button);
+ else
+ gtk_widget_hide (root_overflow_button);
+
+ gtk_widget_hide (tail_button);
+ gtk_widget_hide (tail_overflow_button);
if (priv->root_path)
{
- root_chunk = create_path_chunk (self, priv->root_path, priv->root_label,
- priv->root_icon, TRUE);
+ update_path_chunk (self, root_button, root_button, priv->root_path,
+ priv->root_label, priv->root_icon);
+ }
+ else
+ {
+ GString *root_path;
+ gchar *label;
+
+ root_path = g_string_new ("");
+ g_string_append (root_path, G_DIR_SEPARATOR_S);
+ if (!is_absolute_root (priv->path))
+ {
+ g_string_append (root_path, splitted_path[0]);
+ label = splitted_path[0];
+ }
+ else
+ {
+ label = G_DIR_SEPARATOR_S;
+ }
+
+ update_path_chunk (self, root_button, root_button, root_path->str, label, priv->root_icon);
+
+ g_string_free (root_path, TRUE);
}
if (g_strcmp0 (priv->root_path, priv->path) == 0)
return;
- splitted_path = get_splitted_path (unprefixed_path);
- if (unprefixed_old_path)
- splitted_old_path = get_splitted_path (unprefixed_old_path);
/* We always expect a path in the format /path/path in UNIX or \path\path in Windows.
* However, the OS separator alone is a valid path, so we need to handle it
* ourselves if the client didn't set a root label or icon for it.
@@ -636,15 +746,20 @@ update_path_bar (GtkPathBar *self,
gint length;
gint i;
+ unprefixed_splitted_path = get_splitted_path (self, unprefixed_path);
+ if (unprefixed_old_path)
+ unprefixed_splitted_old_path = get_splitted_path (self, unprefixed_old_path);
+
length = g_strv_length (splitted_path);
+ //g_print ("a ver %s %s %d %d\n", unprefixed_path, unprefixed_old_path, g_str_has_prefix
(unprefixed_path, unprefixed_old_path), g_str_has_prefix (unprefixed_old_path, unprefixed_path));
/* Addition */
- if (unprefixed_old_path && g_str_has_prefix (unprefixed_path, unprefixed_old_path))
+ if (unprefixed_old_path && g_str_has_prefix (priv->path, old_path))
{
- fill_path_bar (self, path_bar_container, splitted_path, splitted_old_path);
+ fill_path_bar (self, path_bar_container, unprefixed_splitted_path, splitted_old_path);
}
/* Removal */
- else if (unprefixed_old_path && g_str_has_prefix (unprefixed_path, unprefixed_path))
+ else if (unprefixed_old_path && g_str_has_prefix (old_path, priv->path))
{
GList *children;
GList *l;
@@ -654,16 +769,15 @@ update_path_bar (GtkPathBar *self,
children_length = g_list_length (children);
for (i = 0, l = children; i < children_length; i++, l = l->next)
{
- if (i < g_strv_length (splitted_old_path))
+ if (unprefixed_splitted_path && i < g_strv_length (unprefixed_splitted_path))
continue;
-
gtk_path_bar_container_remove (GTK_PATH_BAR_CONTAINER (path_bar_container), l->data, TRUE);
}
}
/* Completely different path */
else
{
- fill_path_bar (self, path_bar_container, splitted_path, splitted_old_path);
+ fill_path_bar (self, path_bar_container, unprefixed_splitted_path, unprefixed_splitted_old_path);
}
g_strfreev (splitted_path);
@@ -672,10 +786,8 @@ update_path_bar (GtkPathBar *self,
else
{
gtk_path_bar_container_remove_all_children (GTK_PATH_BAR_CONTAINER (path_bar_container));
- fill_path_bar (self, path_bar_container, splitted_path, NULL);
}
- g_print ("update path finish %p\n",path_bar);
gtk_stack_set_visible_child (GTK_STACK (self), path_bar);
}
@@ -687,9 +799,8 @@ update_selected_path (GtkPathBar *self)
GList *children;
GList *l;
GtkWidget *path_bar_container;
- GtkWidget *overflow_button;
- get_path_bar_widgets (GTK_PATH_BAR (self), NULL, NULL, NULL, NULL, &path_bar_container, TRUE);
+ get_path_bar_widgets (GTK_PATH_BAR (self), NULL, NULL, NULL, NULL, NULL, &path_bar_container, TRUE);
children = gtk_path_bar_container_get_children (GTK_PATH_BAR_CONTAINER (path_bar_container));
for (l = children; l != NULL; l = l->next)
{
@@ -919,12 +1030,21 @@ gtk_path_bar_init (GtkPathBar *self)
g_signal_connect (priv->path_bar_container_2, "invert-animation-done",
G_CALLBACK (on_invert_animation_done), self);
+ g_signal_connect (priv->path_bar_root_1, "button-release-event",
+ G_CALLBACK (on_path_chunk_button_release_event), NULL);
+ g_signal_connect (priv->path_bar_root_2, "button-release-event",
+ G_CALLBACK (on_path_chunk_button_release_event), NULL);
+ g_signal_connect (priv->path_bar_tail_1, "button-release-event",
+ G_CALLBACK (on_path_chunk_button_release_event), NULL);
+ g_signal_connect (priv->path_bar_tail_2, "button-release-event",
+ G_CALLBACK (on_path_chunk_button_release_event), NULL);
+
priv->request_allocation_for_invert = FALSE;
- gtk_path_bar_set_inverted (self, TRUE);
+ gtk_widget_set_no_show_all (self, TRUE);
- gtk_widget_set_no_show_all (self, FALSE);
+ gtk_path_bar_set_inverted (self, TRUE);
}
@@ -983,7 +1103,7 @@ gtk_path_bar_set_path_extended (GtkPathBar *self,
}
/**
- * gtk_path_bar_get_selected_path:
+ * gtk_path_bar_get_path:
* @path_bar: a #GtkPathBar
*
* Get the path represented by the path bar
@@ -1069,6 +1189,8 @@ gtk_path_bar_set_selected_path (GtkPathBar *self,
priv = gtk_path_bar_get_instance_private (GTK_PATH_BAR (self));
new_path_as_file = g_file_new_for_path (path);
+ g_print ("select path %s %s\n", path, priv->path);
+
g_return_if_fail (new_path_as_file);
g_return_if_fail (g_str_has_prefix (priv->path, path) ||
g_strcmp0 (priv->path, path) == 0);
@@ -1131,18 +1253,16 @@ gtk_path_bar_set_inverted (GtkPathBar *self,
if (priv->inverted != inverted)
{
- GtkWidget *overflow_button;
GtkWidget *path_bar_container;
priv->inverted = inverted != FALSE;
- get_path_bar_widgets (GTK_PATH_BAR (self), NULL, NULL, NULL, NULL, &path_bar_container, TRUE);
+ get_path_bar_widgets (GTK_PATH_BAR (self), NULL, NULL, NULL, NULL, NULL, &path_bar_container, TRUE);
- if (gtk_path_bar_container_is_overflowing (GTK_PATH_BAR_CONTAINER (path_bar_container)) &&
- !priv->inverted)
+ if (gtk_path_bar_container_is_overflowing (GTK_PATH_BAR_CONTAINER (path_bar_container)))
{
priv->request_allocation_for_invert = TRUE;
- start_overflow_handling (self);
+ start_overflow_handling (self, priv->inverted);
}
else
{
diff --git a/gtk/gtkpathbarbox.c b/gtk/gtkpathbarbox.c
index 43e51e1..90271f2 100644
--- a/gtk/gtkpathbarbox.c
+++ b/gtk/gtkpathbarbox.c
@@ -157,7 +157,6 @@ gtk_path_bar_box_size_allocate (GtkWidget *widget,
&distributed_size);
sizes[i].minimum_size = MIN (child_available_size.width, distributed_size.width);
- g_print ("pathbar getting %d\n", sizes[i].minimum_size);
}
child_allocation.x = current_x;
diff --git a/gtk/gtkpathbarcontainer.c b/gtk/gtkpathbarcontainer.c
index 1854ebe..82bf57e 100644
--- a/gtk/gtkpathbarcontainer.c
+++ b/gtk/gtkpathbarcontainer.c
@@ -171,7 +171,9 @@ really_remove_child (GtkPathBarContainer *self,
gboolean was_visible = gtk_widget_get_visible (widget);
priv->children_to_remove = g_list_remove (priv->children_to_remove,
- child->data);
+ child->data);
+ priv->children = g_list_remove (priv->children,
+ widget);
gtk_container_remove (GTK_CONTAINER (priv->children_box), revealer);
if (was_visible)
@@ -207,7 +209,6 @@ gtk_path_bar_container_remove (GtkPathBarContainer *self,
to_remove = widget;
priv->children_to_remove = g_list_append (priv->children_to_remove, to_remove);
- priv->children = g_list_remove (priv->children, to_remove);
if (!animate)
{
@@ -216,7 +217,6 @@ gtk_path_bar_container_remove (GtkPathBarContainer *self,
priv->children_to_hide = g_list_remove (priv->children_to_hide, to_remove);
}
-
gtk_widget_queue_resize (GTK_WIDGET (self));
}
@@ -302,7 +302,6 @@ get_children_preferred_size_for_requisition (GtkPathBarContainer *self,
n_children++;
}
- g_print ("available size %d %d\n", available_size->width, n_children);
gtk_distribute_natural_allocation (MAX (0, available_size->width - current_children_min_width),
n_children, sizes);
@@ -372,6 +371,8 @@ update_children_visibility (GtkPathBarContainer *self)
for (i = 0, child = children; child != NULL; i++, child = child->next)
{
child_widget = GTK_WIDGET (child->data);
+ if (g_list_find (priv->children_to_remove, child_widget))
+ continue;
gtk_widget_get_preferred_width_for_height (child_widget,
available_size.height,
@@ -530,7 +531,7 @@ idle_update_revealers (GtkPathBarContainer *self)
revealer = gtk_widget_get_parent (l->data);
if (gtk_revealer_get_child_revealed (GTK_REVEALER (revealer)))
{
- g_signal_handlers_disconnect_by_func (revealer, revealer_on_hide_completed, self);
+ g_signal_handlers_disconnect_by_func (revealer, unrevealed_really_remove_child, self);
g_signal_connect (revealer, "notify::child-revealed",
(GCallback) unrevealed_really_remove_child, self);
@@ -778,7 +779,6 @@ invert_animation_on_tick (GtkWidget *widget,
elapsed = gdk_frame_clock_get_frame_time (frame_clock) - priv->invert_animation_initial_time;
priv->invert_animation_progress = MIN (1, elapsed * animation_speed / (1000. * max_scroll));
- g_print ("################animation progres %d %d %f %f\n", gtk_widget_get_allocated_width (GTK_WIDGET
(self)), max_scroll, elapsed / 1000., priv->invert_animation_progress);
update_scrolling (self);
if (priv->invert_animation_progress >= 1)
@@ -803,7 +803,6 @@ start_invert_animation (GtkPathBarContainer *self)
finish_invert_animation (self);
priv->invert_animation_initial_width = gtk_widget_get_allocated_width (GTK_WIDGET (self));
- g_print ("INITIAL INVERT ANIMATION WIDTH %d\n", priv->invert_animation_initial_width);
priv->invert_animation = TRUE;
priv->invert_animation_progress = 0;
priv->allocated = FALSE;
@@ -812,6 +811,9 @@ start_invert_animation (GtkPathBarContainer *self)
{
GtkWidget *revealer;
+ if (g_list_find (priv->children_to_remove, child->data))
+ continue;
+
revealer = gtk_widget_get_parent (GTK_WIDGET (child->data));
remove_opacity_classes (revealer);
@@ -1047,7 +1049,6 @@ real_get_preferred_size_for_requisition (GtkWidget *widget,
(priv->invert_animation_initial_width - natural_size->width);
distributed_size->width += (1 - priv->invert_animation_progress) *
(priv->invert_animation_initial_width - distributed_size->width);
- g_print ("real get preferres size %d %d %d\n", minimum_size->width, natural_size->width,
distributed_size->width);
}
}
@@ -1161,7 +1162,6 @@ gtk_path_bar_container_adapt_to_size (GtkPathBarContainer *self,
GtkPathBarContainerPrivate *priv = gtk_path_bar_container_get_instance_private (self);
priv->parent_available_width = available_size->width;
- g_print ("adapt to size %d\n", priv->parent_available_width);
update_children_visibility (self);
idle_update_revealers (self);
@@ -1255,6 +1255,13 @@ gboolean
gtk_path_bar_container_is_overflowing (GtkPathBarContainer *self)
{
GtkPathBarContainerPrivate *priv = gtk_path_bar_container_get_instance_private (self);
+ GList *children;
+ gboolean overflowing;
+
+ children = gtk_path_bar_container_get_children (self);
+ overflowing = g_list_length (children) != g_list_length (priv->children_to_show);
+
+ g_list_free (children);
- return g_list_length (priv->children) != g_list_length (priv->children_to_show);
+ return overflowing;
}
diff --git a/gtk/ui/gtkpathbar.ui b/gtk/ui/gtkpathbar.ui
index e5cab6b..df38c17 100644
--- a/gtk/ui/gtkpathbar.ui
+++ b/gtk/ui/gtkpathbar.ui
@@ -11,7 +11,6 @@
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="path_bar_root_1">
- <property name="label" translatable="yes">The Root</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -52,7 +51,6 @@
</child>
<child>
<object class="GtkButton" id="path_bar_tail_1">
- <property name="label" translatable="yes">The Tail</property>
<property name="visible">False</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -72,7 +70,6 @@
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="path_bar_root_2">
- <property name="label" translatable="yes">The Root</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -113,7 +110,6 @@
</child>
<child>
<object class="GtkButton" id="path_bar_tail_2">
- <property name="label" translatable="yes">The Tail</property>
<property name="visible">False</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
diff --git a/tests/testpathbar.c b/tests/testpathbar.c
index 984a318..1a6a303 100644
--- a/tests/testpathbar.c
+++ b/tests/testpathbar.c
@@ -12,9 +12,8 @@ static GtkWidget *files_path_bar_random;
static GtkWidget *files_path_bar_recent;
static const gchar* REAL_LOCATION_RANDOM = "file:///boot/efi/EFI/BOOT";
static const gchar* REAL_LOCATION_RECENT = "recent:///";
-static const gchar* ORIGINAL_PATH = "/test/test 2/test 3/asda
lkasdl/pppppppppppppppp/alskd/t/t/test3/tttttt/tast";
+static const gchar* ORIGINAL_PATH = "/test/test 2/test 3/asda lkasdl/test/alskd/t/t/test3/tttttt/tast";
static const gchar* ROOT_PATH = "/test/test 2/test 3";
-static const gchar* DISPLAY_PATH = "/test/test 2/This Is A Root/asda lkasdl/pppppppppppppppp/ alskd";
static void
action_menu_1 (GSimpleAction *action,
@@ -97,7 +96,7 @@ get_display_path_from_selected (const gchar *selected_path)
gchar *display_path_gchar;
splitted_path = g_strsplit (selected_path, "/", -1);
- display_splitted_path = g_strsplit (DISPLAY_PATH, "/", -1);
+ display_splitted_path = g_strsplit (ORIGINAL_PATH, "/", -1);
display_path = g_string_new ("");
/* Skip the first empty split part */
for (i = 1; i < g_strv_length (splitted_path); i++)
@@ -129,7 +128,7 @@ on_path_selected_set_path (GtkPathBar *path_bar,
if (path_bar == GTK_PATH_BAR (path_bar_custom_root_label))
{
gtk_path_bar_set_path_extended (GTK_PATH_BAR (path_bar_custom_root_label),
- selected_path, ROOT_PATH, "This Is A Root", NULL);
+ selected_path, NULL, NULL, NULL);
}
else if (path_bar == GTK_PATH_BAR (path_bar_custom_root_icon))
{
@@ -255,7 +254,6 @@ main (int argc, char *argv[])
gtk_path_bar_set_path (GTK_PATH_BAR (path_bar), ORIGINAL_PATH);
connect_path_bar (GTK_PATH_BAR (path_bar));
-#if 0
/* ----------------------------------------------------------------------- */
path_bar_inverted = gtk_path_bar_new ();
gtk_path_bar_set_inverted (GTK_PATH_BAR (path_bar_inverted), TRUE);
@@ -280,10 +278,11 @@ main (int argc, char *argv[])
path_bar_custom_root_label = gtk_path_bar_new ();
gtk_path_bar_set_inverted (GTK_PATH_BAR (path_bar_custom_root_label), TRUE);
gtk_path_bar_set_path_extended (GTK_PATH_BAR (path_bar_custom_root_label),
- ORIGINAL_PATH, ROOT_PATH, "This Is A Root", NULL);
+ ORIGINAL_PATH, NULL, NULL, NULL);
connect_path_bar_set_path (GTK_PATH_BAR (path_bar_custom_root_label));
gtk_grid_attach (GTK_GRID (grid), path_bar_custom_root_label, 0, 6, 1, 1);
+#if 0
/* ----------------------------------------------------------------------- */
path_bar_custom_root_icon = gtk_path_bar_new ();
gtk_path_bar_set_inverted (GTK_PATH_BAR (path_bar_custom_root_icon), TRUE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]