[epiphany] Add again the spinner.



commit 893114a0a7b0c8b774b927dbc7de1844fb670ac3
Author: Xan Lopez <xan gnome org>
Date:   Mon Aug 10 08:28:40 2009 +0300

    Add again the spinner.
    
    We need some indication in the UI of network activity when there are
    no tabs opened and the progress bar hasn't appeared yet in the URL
    entry. Re-add the spinner for now, we'll think of a better solution
    later.
    
    Bug #585035

 lib/widgets/Makefile.am              |    2 +
 lib/widgets/ephy-spinner-tool-item.c |  115 ++++++++++++++++++++++++++++++++++
 lib/widgets/ephy-spinner-tool-item.h |   62 ++++++++++++++++++
 src/ephy-toolbar.c                   |   59 ++++++++++++++++-
 src/ephy-toolbar.h                   |    3 +
 src/ephy-window.c                    |    2 +
 6 files changed, 239 insertions(+), 4 deletions(-)
---
diff --git a/lib/widgets/Makefile.am b/lib/widgets/Makefile.am
index 4a3a690..c0134b6 100644
--- a/lib/widgets/Makefile.am
+++ b/lib/widgets/Makefile.am
@@ -9,6 +9,8 @@ libephywidgets_la_SOURCES = \
 	ephy-search-entry.h			\
 	ephy-spinner.c				\
 	ephy-spinner.h				\
+	ephy-spinner-tool-item.c		\
+	ephy-spinner-tool-item.h		\
 	ephy-tree-model-node.c			\
 	ephy-tree-model-node.h			\
 	ephy-tree-model-sort.c			\
diff --git a/lib/widgets/ephy-spinner-tool-item.c b/lib/widgets/ephy-spinner-tool-item.c
new file mode 100644
index 0000000..96af434
--- /dev/null
+++ b/lib/widgets/ephy-spinner-tool-item.c
@@ -0,0 +1,115 @@
+/* 
+ *  Copyright © 2006 Christian Persch
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ *
+ *  $Id$
+ */
+
+#ifndef COMPILING_TESTSPINNER
+#include "config.h"
+#endif
+
+#include "ephy-spinner-tool-item.h"
+#include "ephy-spinner.h"
+
+G_DEFINE_TYPE (EphySpinnerToolItem, ephy_spinner_tool_item, GTK_TYPE_TOOL_ITEM)
+
+static void
+ephy_spinner_tool_item_init (EphySpinnerToolItem *item)
+{
+	GtkWidget *spinner;
+
+	spinner = ephy_spinner_new ();
+	gtk_container_add (GTK_CONTAINER (item), spinner);
+	gtk_widget_show (spinner);
+}
+
+static void
+ephy_spinner_tool_item_toolbar_reconfigured (GtkToolItem *tool_item)
+{
+	EphySpinner *spinner;
+	GtkToolbarStyle style;
+	GtkIconSize spinner_size;
+
+	spinner = EPHY_SPINNER (gtk_bin_get_child (GTK_BIN (tool_item)));
+	g_return_if_fail (spinner);
+
+	style = gtk_tool_item_get_toolbar_style (tool_item);
+
+	/* FIXME: be smarter by taking the toolbar icon size (gtk_toolbar_get_icon_size) into account! */
+
+	if (style == GTK_TOOLBAR_BOTH)
+	{
+		spinner_size = GTK_ICON_SIZE_DIALOG;
+	}
+	else
+	{
+		spinner_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
+	}
+
+	ephy_spinner_set_size (spinner, spinner_size);
+
+	if (GTK_TOOL_ITEM_CLASS (ephy_spinner_tool_item_parent_class)->toolbar_reconfigured)
+		GTK_TOOL_ITEM_CLASS (ephy_spinner_tool_item_parent_class)->toolbar_reconfigured (tool_item);
+}
+
+static void
+ephy_spinner_tool_item_class_init (EphySpinnerToolItemClass *klass)
+{
+	GtkToolItemClass *tool_item_class = GTK_TOOL_ITEM_CLASS (klass);
+
+	tool_item_class->toolbar_reconfigured = ephy_spinner_tool_item_toolbar_reconfigured;
+}
+
+/*
+ * ephy_spinner_tool_item_new:
+ *
+ * Create a new #EphySpinnerToolItem. The spinner is a widget
+ * that gives the user feedback about network status with
+ * an animated image.
+ *
+ * Return Value: the spinner tool item
+ **/
+GtkToolItem *
+ephy_spinner_tool_item_new (void)
+{
+	return GTK_TOOL_ITEM (g_object_new (EPHY_TYPE_SPINNER_TOOL_ITEM, NULL));
+}
+
+/*
+ * ephy_spinner_tool_item_set_spinning:
+ *
+ * Start or stop the spinner.
+ **/
+void
+ephy_spinner_tool_item_set_spinning (EphySpinnerToolItem *item,
+				     gboolean spinning)
+{
+	EphySpinner *spinner;
+
+	spinner = EPHY_SPINNER (gtk_bin_get_child (GTK_BIN (item)));
+	g_return_if_fail (spinner);
+
+	if (spinning)
+	{
+		ephy_spinner_start (spinner);
+	}
+	else
+	{
+		ephy_spinner_stop (spinner);
+	}
+}
diff --git a/lib/widgets/ephy-spinner-tool-item.h b/lib/widgets/ephy-spinner-tool-item.h
new file mode 100644
index 0000000..04abcdf
--- /dev/null
+++ b/lib/widgets/ephy-spinner-tool-item.h
@@ -0,0 +1,62 @@
+/*
+ *  Copyright © 2006 Christian Persch
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ *
+ *  $Id$
+ */
+
+#ifndef EPHY_SPINNER_TOOL_ITEM_H
+#define EPHY_SPINNER_TOOL_ITEM_H
+
+#include <gtk/gtktoolitem.h>
+
+G_BEGIN_DECLS
+
+#define EPHY_TYPE_SPINNER_TOOL_ITEM		(ephy_spinner_tool_item_get_type ())
+#define EPHY_SPINNER_TOOL_ITEM(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), EPHY_TYPE_SPINNER_TOOL_ITEM, EphySpinnerToolItem))
+#define EPHY_SPINNER_TOOL_ITEM_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), EPHY_TYPE_SPINNER_TOOL_ITEM, EphySpinnerToolItemClass))
+#define EPHY_IS_SPINNER_TOOL_ITEM(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), EPHY_TYPE_SPINNER_TOOL_ITEM))
+#define EPHY_IS_SPINNER_TOOL_ITEM_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), EPHY_TYPE_SPINNER_TOOL_ITEM))
+#define EPHY_SPINNER_TOOL_ITEM_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), EPHY_TYPE_SPINNER_TOOL_ITEM, EphySpinnerToolItemClass))
+
+typedef struct _EphySpinnerToolItem		EphySpinnerToolItem;
+typedef struct _EphySpinnerToolItemClass	EphySpinnerToolItemClass;
+typedef struct _EphySpinnerToolItemDetails	EphySpinnerToolItemDetails;
+
+struct _EphySpinnerToolItem
+{
+	GtkToolItem parent;
+
+	/*< private >*/
+	EphySpinnerToolItemDetails *details;
+};
+
+struct _EphySpinnerToolItemClass
+{
+	GtkToolItemClass parent_class;
+};
+
+GType		ephy_spinner_tool_item_get_type		(void);
+
+GtkToolItem    *ephy_spinner_tool_item_new		(void);
+
+void		ephy_spinner_tool_item_set_spinning	(EphySpinnerToolItem *item,
+							 gboolean spinning);
+
+G_END_DECLS
+
+#endif /* !EPHY_SPINNER_TOOL_ITEM_H */
diff --git a/src/ephy-toolbar.c b/src/ephy-toolbar.c
index 464272f..e91b8ed 100644
--- a/src/ephy-toolbar.c
+++ b/src/ephy-toolbar.c
@@ -32,6 +32,7 @@
 #include "ephy-navigation-action.h"
 #include "ephy-topic-action.h"
 #include "ephy-zoom-action.h"
+#include "ephy-spinner-tool-item.h"
 #include "ephy-dnd.h"
 #include "ephy-shell.h"
 #include "ephy-stock-icons.h"
@@ -66,6 +67,8 @@ struct _EphyToolbarPrivate
 	GtkActionGroup *action_group;
 	GtkAction *actions[LAST_ACTION];
 	GtkWidget *fixed_toolbar;
+	EphySpinnerToolItem *spinner;
+	GtkToolItem *sep_item;
 	GtkToolItem *exit_button;
 	gulong set_focus_handler;
 
@@ -73,6 +76,7 @@ struct _EphyToolbarPrivate
 	guint show_lock : 1;
 	guint is_secure : 1;
 	guint leave_fullscreen_visible : 1;
+	guint spinning : 1;
 };
 
 static const GtkTargetEntry drag_targets [] =
@@ -123,13 +127,18 @@ ephy_toolbar_update_fixed_visibility (EphyToolbar *toolbar)
 	gboolean show;
 
 	show = priv->leave_fullscreen_visible;
-#if 0
-	g_object_set (priv->exit_button, "visible", show,
-					 "sensitive", show, NULL);
-#endif
+	g_object_set (priv->sep_item, "visible", show, NULL);
 	g_object_set (priv->fixed_toolbar, "visible", show, NULL);
 }
 
+static void
+ephy_toolbar_update_spinner (EphyToolbar *toolbar)
+{
+	EphyToolbarPrivate *priv = toolbar->priv;
+
+	ephy_spinner_tool_item_set_spinning (priv->spinner, priv->spinning);
+}
+
 static void 
 maybe_finish_activation_cb (EphyWindow *window,
 			    GtkWidget *widget,
@@ -490,6 +499,17 @@ ephy_toolbar_set_security_state (EphyToolbar *toolbar,
 }
 
 void
+ephy_toolbar_set_spinning (EphyToolbar *toolbar,
+			   gboolean spinning)
+{
+	EphyToolbarPrivate *priv = toolbar->priv;
+
+	priv->spinning = spinning != FALSE;
+
+	ephy_toolbar_update_spinner (toolbar);
+}
+
+void
 ephy_toolbar_set_zoom (EphyToolbar *toolbar,
 		       gboolean can_zoom,
 		       float zoom)
@@ -503,6 +523,26 @@ ephy_toolbar_set_zoom (EphyToolbar *toolbar,
 /* Class implementation */
 
 static void
+ephy_toolbar_show (GtkWidget *widget)
+{
+	EphyToolbar *toolbar = EPHY_TOOLBAR (widget);
+
+	GTK_WIDGET_CLASS (ephy_toolbar_parent_class)->show (widget);
+
+	ephy_toolbar_update_spinner (toolbar);
+}
+
+static void
+ephy_toolbar_hide (GtkWidget *widget)
+{
+	EphyToolbar *toolbar = EPHY_TOOLBAR (widget);
+
+	GTK_WIDGET_CLASS (ephy_toolbar_parent_class)->hide (widget);
+
+	ephy_toolbar_update_spinner (toolbar);
+}
+
+static void
 ephy_toolbar_init (EphyToolbar *toolbar)
 {
 	EphyToolbarPrivate *priv;
@@ -531,6 +571,13 @@ ephy_toolbar_constructor (GType type,
 	gtoolbar = GTK_TOOLBAR (priv->fixed_toolbar);
 	gtk_toolbar_set_show_arrow (gtoolbar, FALSE);
 
+	priv->spinner = EPHY_SPINNER_TOOL_ITEM (ephy_spinner_tool_item_new ());
+	gtk_toolbar_insert (gtoolbar, GTK_TOOL_ITEM (priv->spinner), -1);
+	gtk_widget_show (GTK_WIDGET (priv->spinner));
+
+	priv->sep_item = gtk_separator_tool_item_new ();
+	gtk_toolbar_insert (gtoolbar, priv->sep_item, -1);
+
 	priv->exit_button = gtk_tool_button_new_from_stock (GTK_STOCK_LEAVE_FULLSCREEN);
 	gtk_tool_button_set_label (GTK_TOOL_BUTTON (priv->exit_button), _("Leave Fullscreen"));
 	gtk_tool_item_set_is_important (priv->exit_button, TRUE);
@@ -590,12 +637,16 @@ static void
 ephy_toolbar_class_init (EphyToolbarClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
 	object_class->constructor = ephy_toolbar_constructor;
 	object_class->finalize = ephy_toolbar_finalize;
 	object_class->set_property = ephy_toolbar_set_property;
 	object_class->get_property = ephy_toolbar_get_property;
 
+	widget_class->show = ephy_toolbar_show;
+	widget_class->hide = ephy_toolbar_hide;
+
 	signals[ACTIVATION_FINISHED] =
 		g_signal_new ("activation-finished",
 			      G_OBJECT_CLASS_TYPE (object_class),
diff --git a/src/ephy-toolbar.h b/src/ephy-toolbar.h
index a2f6a11..370b1e1 100644
--- a/src/ephy-toolbar.h
+++ b/src/ephy-toolbar.h
@@ -99,6 +99,9 @@ void		ephy_toolbar_set_security_state		(EphyToolbar *toolbar,
 							 const char *stock_id,
 							 const char *tooltip);
 
+void		ephy_toolbar_set_spinning		(EphyToolbar *toolbar,
+							 gboolean spinning);
+
 void		ephy_toolbar_set_zoom			(EphyToolbar *toolbar,
 							 gboolean can_zoom,
 							 float zoom);
diff --git a/src/ephy-window.c b/src/ephy-window.c
index c384369..51de4b4 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -1880,6 +1880,8 @@ sync_tab_load_status (EphyWebView  *view,
 	action = gtk_action_group_get_action (action_group, "FilePrint");
 	ephy_action_change_sensitivity_flags (action, SENS_FLAG_LOADING, loading);
 
+	ephy_toolbar_set_spinning (priv->toolbar, loading);
+
 	if (priv->fullscreen_popup)
 	{
 		ephy_fullscreen_popup_set_spinning



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