[yelp] [libyelp] Implement previous and next menu items
- From: Shaun McCance <shaunm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [yelp] [libyelp] Implement previous and next menu items
- Date: Wed, 28 Apr 2010 21:41:32 +0000 (UTC)
commit ac89d5aa37f8854bce9ceb0612d048eb83929d56
Author: Shaun McCance <shaunm gnome org>
Date: Wed Apr 28 12:25:55 2010 -0500
[libyelp] Implement previous and next menu items
These are done entirely by YelpView, which exposes them as actions in
a GtkActionGroup. I'd like to move history navigation to YelpView as
well, using the same trick.
libyelp/yelp-view.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++-
libyelp/yelp-view.h | 26 +++++++-------
src/yelp-window.c | 10 ++++-
3 files changed, 109 insertions(+), 17 deletions(-)
---
diff --git a/libyelp/yelp-view.c b/libyelp/yelp-view.c
index 24e047b..e937065 100644
--- a/libyelp/yelp-view.c
+++ b/libyelp/yelp-view.c
@@ -67,6 +67,9 @@ static void view_resource_request (WebKitWebView *vi
WebKitNetworkResponse *response,
gpointer user_data);
+static void view_navigation_action (GtkAction *action,
+ YelpView *view);
+
static void view_clear_load (YelpView *view);
static void view_load_page (YelpView *view);
static void view_show_error_page (YelpView *view,
@@ -82,6 +85,19 @@ static void document_callback (YelpDocument *document,
YelpView *view,
GError *error);
+static const GtkActionEntry entries[] = {
+ {"YelpViewGoPrevious", NULL,
+ N_("_Previous Page"),
+ "<Control>Page_Up",
+ NULL,
+ G_CALLBACK (view_navigation_action) },
+ {"YelpViewGoNext", NULL,
+ N_("_Next Page"),
+ "<Control>Page_Down",
+ NULL,
+ G_CALLBACK (view_navigation_action) }
+};
+
enum {
PROP_0,
PROP_URI,
@@ -120,6 +136,8 @@ struct _YelpViewPrivate {
gchar *page_desc;
gchar *page_icon;
+ GtkActionGroup *action_group;
+
gint navigation_requested;
};
@@ -144,6 +162,12 @@ yelp_view_init (YelpView *view)
G_CALLBACK (view_navigation_requested), NULL);
g_signal_connect (view, "resource-request-starting",
G_CALLBACK (view_resource_request), NULL);
+
+ priv->action_group = gtk_action_group_new ("YelpView");
+ gtk_action_group_set_translation_domain (priv->action_group, GETTEXT_PACKAGE);
+ gtk_action_group_add_actions (priv->action_group,
+ entries, G_N_ELEMENTS (entries),
+ view);
}
static void
@@ -162,6 +186,11 @@ yelp_view_dispose (GObject *object)
priv->cancellable = NULL;
}
+ if (priv->action_group) {
+ g_object_unref (priv->action_group);
+ priv->action_group = NULL;
+ }
+
if (priv->document) {
g_object_unref (priv->document);
priv->document = NULL;
@@ -388,6 +417,13 @@ yelp_view_load_uri (YelpView *view,
g_signal_emit_by_name (view, "notify::page-desc", 0);
g_signal_emit_by_name (view, "notify::page-icon", 0);
+ gtk_action_set_sensitive (gtk_action_group_get_action (priv->action_group,
+ "YelpViewGoPrevious"),
+ FALSE);
+ gtk_action_set_sensitive (gtk_action_group_get_action (priv->action_group,
+ "YelpViewGoNext"),
+ FALSE);
+
priv->uri = g_object_ref (uri);
if (!yelp_uri_is_resolved (uri)) {
priv->uri_resolved = g_signal_connect (uri, "resolved",
@@ -425,7 +461,14 @@ YelpDocument *
yelp_view_get_document (YelpView *view)
{
YelpViewPrivate *priv = GET_PRIV (view);
- return g_object_ref (priv->document);
+ return priv->document;
+}
+
+GtkActionGroup *
+yelp_view_get_action_group (YelpView *view)
+{
+ YelpViewPrivate *priv = GET_PRIV (view);
+ return priv->action_group;
}
/******************************************************************************/
@@ -487,6 +530,36 @@ view_resource_request (WebKitWebView *view,
}
static void
+view_navigation_action (GtkAction *action,
+ YelpView *view)
+{
+ YelpViewPrivate *priv = GET_PRIV (view);
+ gchar *page_id, *new_id, *xref;
+ YelpUri *new_uri;
+
+ page_id = yelp_uri_get_page_id (priv->uri);
+
+ if (g_str_equal (gtk_action_get_name (action), "YelpViewGoPrevious"))
+ new_id = yelp_document_get_prev_id (priv->document, page_id);
+ else
+ new_id = yelp_document_get_next_id (priv->document, page_id);
+
+ /* Just in case we screwed up somewhere */
+ if (new_id == NULL) {
+ gtk_action_set_sensitive (action, FALSE);
+ return;
+ }
+
+ xref = g_strconcat ("xref:", new_id, NULL);
+ new_uri = yelp_uri_new_relative (priv->uri, xref);
+ yelp_view_load_uri (view, new_uri);
+
+ g_free (xref);
+ g_free (new_id);
+ g_object_unref (new_uri);
+}
+
+static void
view_clear_load (YelpView *view)
{
YelpViewPrivate *priv = GET_PRIV (view);
@@ -732,7 +805,8 @@ document_callback (YelpDocument *document,
debug_print (DB_FUNCTION, "entering\n");
if (signal == YELP_DOCUMENT_SIGNAL_INFO) {
- gchar *page_id;
+ gchar *page_id, *prev_id, *next_id;
+ GtkAction *action;
page_id = yelp_uri_get_page_id (priv->uri);
g_free (priv->root_title);
@@ -745,10 +819,22 @@ document_callback (YelpDocument *document,
priv->page_desc = yelp_document_get_page_desc (document, page_id);
priv->page_icon = yelp_document_get_page_icon (document, page_id);
+ prev_id = yelp_document_get_prev_id (document, page_id);
+ action = gtk_action_group_get_action (priv->action_group, "YelpViewGoPrevious");
+ gtk_action_set_sensitive (action, prev_id != NULL);
+ g_free (prev_id);
+
+ next_id = yelp_document_get_next_id (document, page_id);
+ action = gtk_action_group_get_action (priv->action_group, "YelpViewGoNext");
+ gtk_action_set_sensitive (action, next_id != NULL);
+ g_free (next_id);
+
g_signal_emit_by_name (view, "notify::root-title", 0);
g_signal_emit_by_name (view, "notify::page-title", 0);
g_signal_emit_by_name (view, "notify::page-desc", 0);
g_signal_emit_by_name (view, "notify::page-icon", 0);
+
+ g_free (page_id);
}
else if (signal == YELP_DOCUMENT_SIGNAL_CONTENTS) {
const gchar *contents;
diff --git a/libyelp/yelp-view.h b/libyelp/yelp-view.h
index ea2238f..0758d78 100644
--- a/libyelp/yelp-view.h
+++ b/libyelp/yelp-view.h
@@ -1,4 +1,4 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* Copyright (C) 2009 Shaun McCance <shaunm gnome org>
*
@@ -57,19 +57,19 @@ typedef enum {
YELP_VIEW_STATE_ERROR
} YelpViewState;
-GType yelp_view_get_type (void);
-GType yelp_view_state_get_type (void);
+GType yelp_view_get_type (void);
+GType yelp_view_state_get_type (void);
-GtkWidget * yelp_view_new (void);
-
-void yelp_view_load (YelpView *view,
- const gchar *uri);
-void yelp_view_load_uri (YelpView *view,
- YelpUri *uri);
-void yelp_view_load_document (YelpView *view,
- YelpUri *uri,
- YelpDocument *document);
-YelpDocument * yelp_view_get_document (YelpView *view);
+GtkWidget * yelp_view_new (void);
+void yelp_view_load (YelpView *view,
+ const gchar *uri);
+void yelp_view_load_uri (YelpView *view,
+ YelpUri *uri);
+void yelp_view_load_document (YelpView *view,
+ YelpUri *uri,
+ YelpDocument *document);
+YelpDocument * yelp_view_get_document (YelpView *view);
+GtkActionGroup * yelp_view_get_action_group (YelpView *view);
G_END_DECLS
diff --git a/src/yelp-window.c b/src/yelp-window.c
index b5233d6..6906037 100644
--- a/src/yelp-window.c
+++ b/src/yelp-window.c
@@ -143,6 +143,9 @@ static const gchar *YELP_UI =
"<menu action='GoMenu'>"
"<menuitem action='GoBack'/>"
"<menuitem action='GoForward'/>"
+ "<separator/>"
+ "<menuitem action='YelpViewGoPrevious'/>"
+ "<menuitem action='YelpViewGoNext'/>"
"</menu>"
"</menubar>"
"<accelerator action='OpenLocation'/>"
@@ -349,6 +352,8 @@ window_construct (YelpWindow *window)
gtk_window_set_icon_name (GTK_WINDOW (window), "help-browser");
+ priv->view = (YelpView *) yelp_view_new ();
+
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
@@ -363,6 +368,9 @@ window_construct (YelpWindow *window)
gtk_ui_manager_insert_action_group (priv->ui_manager,
yelp_application_get_action_group (priv->application),
1);
+ gtk_ui_manager_insert_action_group (priv->ui_manager,
+ yelp_view_get_action_group (priv->view),
+ 2);
gtk_window_add_accel_group (GTK_WINDOW (window),
gtk_ui_manager_get_accel_group (priv->ui_manager));
gtk_ui_manager_add_ui_from_string (priv->ui_manager, YELP_UI, -1, NULL);
@@ -450,7 +458,6 @@ window_construct (YelpWindow *window)
GTK_POLICY_AUTOMATIC);
gtk_box_pack_end (GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
- priv->view = (YelpView *) yelp_view_new ();
g_signal_connect (priv->view, "external-uri", G_CALLBACK (view_external_uri), window);
g_signal_connect (priv->view, "loaded", G_CALLBACK (view_loaded), window);
g_signal_connect (priv->view, "notify::yelp-uri", G_CALLBACK (view_uri_selected), window);
@@ -726,7 +733,6 @@ view_loaded (YelpView *view,
}
g_strfreev (ids);
- g_object_unref (document);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]