aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/widgets/Makefile.am2
-rw-r--r--lib/widgets/ephy-spinner-tool-item.c115
-rw-r--r--lib/widgets/ephy-spinner-tool-item.h62
-rw-r--r--src/ephy-toolbar.c59
-rw-r--r--src/ephy-toolbar.h3
-rw-r--r--src/ephy-window.c2
6 files changed, 239 insertions, 4 deletions
diff --git a/lib/widgets/Makefile.am b/lib/widgets/Makefile.am
index 4a3a69033..c0134b6ff 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 000000000..96af434c6
--- /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 000000000..04abcdf46
--- /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 464272f4d..e91b8ed62 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 a2f6a11cd..370b1e161 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 c38436961..51de4b4f5 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