summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun McCance <shaunm@gnome.org>2010-05-27 15:07:19 -0500
committerShaun McCance <shaunm@gnome.org>2010-05-27 15:07:19 -0500
commit64ea4e594c0dbc2de41e0d83c51282408ec62e08 (patch)
tree252efd5c1bf3fd4d1c9ccdd6162bebc57cd3ba1d
parent58fdaa84920387da8b34a4ec1148a5f5f6034f0a (diff)
downloadyelp-64ea4e594c0dbc2de41e0d83c51282408ec62e08.tar.gz
[yelp-window] First round on the bookmarks editor
-rw-r--r--src/yelp-application.c26
-rw-r--r--src/yelp-application.h3
-rw-r--r--src/yelp-window.c210
3 files changed, 238 insertions, 1 deletions
diff --git a/src/yelp-application.c b/src/yelp-application.c
index 375e43c7..9dcfba04 100644
--- a/src/yelp-application.c
+++ b/src/yelp-application.c
@@ -617,6 +617,32 @@ yelp_application_add_bookmark (YelpApplication *app,
}
void
+yelp_application_remove_bookmark (YelpApplication *app,
+ const gchar *doc_uri,
+ const gchar *page_id)
+{
+ GSettings *settings;
+
+ settings = application_get_doc_settings (app, doc_uri);
+
+ if (settings) {
+ GVariantBuilder builder;
+ GVariantIter *iter;
+ gchar *this_id, *this_icon, *this_title;
+ g_settings_get (settings, "bookmarks", "a(sss)", &iter);
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(sss)"));
+ while (g_variant_iter_loop (iter, "(&s&s&s)", &this_id, &this_icon, &this_title)) {
+ if (!g_str_equal (page_id, this_id))
+ g_variant_builder_add (&builder, "(sss)", this_id, this_icon, this_title);
+ }
+ g_variant_iter_free (iter);
+
+ g_settings_set_value (settings, "bookmarks", g_variant_builder_end (&builder));
+ g_signal_emit (app, signals[BOOKMARKS_CHANGED], 0, doc_uri);
+ }
+}
+
+void
yelp_application_update_bookmarks (YelpApplication *app,
const gchar *doc_uri,
const gchar *page_id,
diff --git a/src/yelp-application.h b/src/yelp-application.h
index bf664a95..7c3aa5c8 100644
--- a/src/yelp-application.h
+++ b/src/yelp-application.h
@@ -65,6 +65,9 @@ void yelp_application_add_bookmark (YelpApplication *app,
const gchar *page_id,
const gchar *icon,
const gchar *title);
+void yelp_application_remove_bookmark (YelpApplication *app,
+ const gchar *doc_uri,
+ const gchar *page_id);
void yelp_application_update_bookmarks (YelpApplication *app,
const gchar *doc_uri,
const gchar *page_id,
diff --git a/src/yelp-window.c b/src/yelp-window.c
index 14a126a7..ca6a1660 100644
--- a/src/yelp-window.c
+++ b/src/yelp-window.c
@@ -70,6 +70,8 @@ static void window_close (GtkAction *action,
YelpWindow *window);
static void window_add_bookmark (GtkAction *action,
YelpWindow *window);
+static void window_edit_bookmarks (GtkAction *action,
+ YelpWindow *window);
static void window_load_bookmark (GtkAction *action,
YelpWindow *window);
static void window_find_in_page (GtkAction *action,
@@ -147,6 +149,18 @@ static gboolean hidden_key_press (GtkWidget *widget,
GdkEventKey *event,
YelpWindow *window);
+static gboolean bookmarks_closed (GtkWindow *bookmarks,
+ GdkEvent *event,
+ YelpWindow *window);
+static void bookmarks_set_bookmarks (YelpWindow *window);
+static void bookmark_activated (GtkTreeView *view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ YelpWindow *window);
+static gboolean bookmark_key_release (GtkTreeView *view,
+ GdkEventKey *event,
+ YelpWindow *window);
+
enum {
PROP_0,
PROP_APPLICATION
@@ -209,6 +223,7 @@ static const gchar *YELP_UI =
"</menu>"
"<menu action='BookmarksMenu'>"
"<menuitem action='AddBookmark'/>"
+ "<menuitem action='EditBookmarks'/>"
"<separator/>"
"<placeholder name='Bookmarks'/>"
"</menu>"
@@ -225,6 +240,10 @@ struct _YelpWindowPrivate {
GtkActionGroup *action_group;
YelpApplication *application;
+ GtkWidget *bookmarks_editor;
+ /* no ref */
+ GtkListStore *bookmarks_store;
+
/* no refs on these, owned by containers */
YelpView *view;
GtkWidget *vbox;
@@ -280,6 +299,11 @@ static const GtkActionEntry entries[] = {
"<Control>D",
NULL,
G_CALLBACK (window_add_bookmark) },
+ { "EditBookmarks", NULL,
+ N_("_Edit Bookmarks"),
+ "<Control>B",
+ NULL,
+ G_CALLBACK (window_edit_bookmarks) },
{ "Find", NULL,
N_("Find in Page..."),
"<Control>F",
@@ -381,6 +405,11 @@ yelp_window_dispose (GObject *object)
priv->entry_color_animate = 0;
}
+ if (priv->bookmarks_editor != NULL) {
+ gtk_widget_destroy (GTK_WIDGET (priv->bookmarks_editor));
+ priv->bookmarks_editor = NULL;
+ }
+
G_OBJECT_CLASS (yelp_window_parent_class)->dispose (object);
}
@@ -729,6 +758,66 @@ window_add_bookmark (GtkAction *action,
}
static void
+window_edit_bookmarks (GtkAction *action,
+ YelpWindow *window)
+{
+ YelpWindowPrivate *priv = GET_PRIV (window);
+ GtkWidget *scroll, *list;
+ gchar *title;
+
+ if (priv->bookmarks_editor != NULL) {
+ gtk_window_present_with_time (GTK_WINDOW (priv->bookmarks_editor),
+ gtk_get_current_event_time ());
+ return;
+ }
+
+ priv->bookmarks_editor = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_transient_for (GTK_WINDOW (priv->bookmarks_editor),
+ GTK_WINDOW (window));
+ /* %s will be replaced with the name of a document */
+ title = g_strdup_printf (_("Bookmarks for %s"),
+ gtk_window_get_title (GTK_WINDOW (window)));
+ gtk_window_set_title (GTK_WINDOW (priv->bookmarks_editor), title);
+ g_free (title);
+ gtk_container_set_border_width (GTK_CONTAINER (priv->bookmarks_editor), 6);
+ gtk_window_set_icon_name (GTK_WINDOW (priv->bookmarks_editor), "bookmark");
+ gtk_window_set_default_size (GTK_WINDOW (priv->bookmarks_editor), 300, 300);
+ g_signal_connect (priv->bookmarks_editor, "delete-event",
+ G_CALLBACK (bookmarks_closed), window);
+
+ scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll),
+ GTK_SHADOW_IN);
+ gtk_container_add (GTK_CONTAINER (priv->bookmarks_editor), scroll);
+
+ priv->bookmarks_store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+ list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (priv->bookmarks_store));
+ gtk_container_add (GTK_CONTAINER (scroll), list);
+
+ g_signal_connect (list, "row-activated",
+ G_CALLBACK (bookmark_activated), window);
+ g_signal_connect (list, "key-release-event",
+ G_CALLBACK (bookmark_key_release), window);
+
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (list), FALSE);
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (list), 0, NULL,
+ gtk_cell_renderer_pixbuf_new (),
+ "icon-name", 1,
+ NULL);
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (list), 1, NULL,
+ gtk_cell_renderer_text_new (),
+ "text", 2,
+ NULL);
+
+ bookmarks_set_bookmarks (window);
+
+ gtk_widget_show_all (priv->bookmarks_editor);
+}
+
+static void
window_load_bookmark (GtkAction *action,
YelpWindow *window)
{
@@ -760,8 +849,11 @@ app_bookmarks_changed (YelpApplication *app,
g_object_get (priv->view, "yelp-uri", &uri, NULL);
this_doc_uri = yelp_uri_get_document_uri (uri);
- if (g_str_equal (this_doc_uri, doc_uri))
+ if (g_str_equal (this_doc_uri, doc_uri)) {
window_set_bookmarks (window, doc_uri);
+ if (priv->bookmarks_editor != NULL)
+ bookmarks_set_bookmarks (window);
+ }
g_free (this_doc_uri);
g_object_unref (uri);
@@ -812,6 +904,8 @@ window_set_bookmarks (YelpWindow *window,
entry->title = title;
entries = g_slist_insert_sorted (entries, entry, (GCompareFunc) entry_compare);
}
+ gtk_action_set_sensitive (gtk_action_group_get_action (priv->action_group, "EditBookmarks"),
+ entries != NULL);
for ( ; entries != NULL; entries = g_slist_delete_link (entries, entries)) {
GSList *cur;
GtkAction *bookmark;
@@ -1674,3 +1768,117 @@ hidden_key_press (GtkWidget *widget,
}
return FALSE;
}
+
+static gboolean
+bookmarks_closed (GtkWindow *bookmarks,
+ GdkEvent *event,
+ YelpWindow *window)
+{
+ YelpWindowPrivate *priv = GET_PRIV (window);
+
+ gtk_widget_destroy (GTK_WIDGET (bookmarks));
+ priv->bookmarks_editor = NULL;
+
+ return TRUE;
+}
+
+static void
+bookmarks_set_bookmarks (YelpWindow *window)
+{
+ GVariant *value;
+ GVariantIter *viter;
+ YelpUri *uri;
+ gchar *doc_uri;
+ GSList *entries = NULL;
+ gchar *page_id, *icon, *title; /* do not free */
+ YelpWindowPrivate *priv = GET_PRIV (window);
+
+ gtk_list_store_clear (priv->bookmarks_store);
+
+ g_object_get (priv->view, "yelp-uri", &uri, NULL);
+ doc_uri = yelp_uri_get_document_uri (uri);
+ value = yelp_application_get_bookmarks (priv->application, doc_uri);
+ g_free (doc_uri);
+ g_object_unref (uri);
+
+ g_variant_get (value, "a(sss)", &viter);
+ while (g_variant_iter_loop (viter, "(&s&s&s)", &page_id, &icon, &title)) {
+ YelpMenuEntry *entry = g_new0 (YelpMenuEntry, 1);
+ entry->page_id = page_id;
+ entry->icon = icon;
+ entry->title = title;
+ entries = g_slist_insert_sorted (entries, entry, (GCompareFunc) entry_compare);
+ }
+ for ( ; entries != NULL; entries = g_slist_delete_link (entries, entries)) {
+ GtkTreeIter iter;
+ YelpMenuEntry *entry = (YelpMenuEntry *) entries->data;
+ gtk_list_store_append (priv->bookmarks_store, &iter);
+ gtk_list_store_set (priv->bookmarks_store, &iter,
+ 0, entry->page_id,
+ 1, entry->icon,
+ 2, entry->title,
+ -1);
+ g_free (entry);
+ }
+ g_variant_iter_free (viter);
+ g_variant_unref (value);
+}
+
+static void
+bookmark_activated (GtkTreeView *view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ YelpWindow *window)
+{
+ GtkTreeIter iter;
+ YelpWindowPrivate *priv = GET_PRIV (window);
+
+ if (gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->bookmarks_store),
+ &iter, path)) {
+ YelpUri *base, *uri;
+ gchar *page_id, *xref;
+ gtk_tree_model_get (GTK_TREE_MODEL (priv->bookmarks_store), &iter,
+ 0, &page_id,
+ -1);
+ xref = g_strconcat ("xref:", page_id, NULL);
+ g_object_get (priv->view, "yelp-uri", &base, NULL);
+ uri = yelp_uri_new_relative (base, xref);
+
+ yelp_view_load_uri (priv->view, uri);
+
+ g_object_unref (base);
+ g_object_unref (uri);
+ g_free (xref);
+ g_free (page_id);
+ }
+}
+
+static gboolean
+bookmark_key_release (GtkTreeView *view,
+ GdkEventKey *event,
+ YelpWindow *window)
+{
+ if (event->keyval == GDK_Delete) {
+ YelpWindowPrivate *priv = GET_PRIV (window);
+ GtkTreeIter iter;
+ GtkTreeSelection *sel = gtk_tree_view_get_selection (view);
+
+ if (gtk_tree_selection_get_selected (sel, NULL, &iter)) {
+ YelpUri *uri;
+ gchar *doc_uri, *page_id;
+ gtk_tree_model_get (GTK_TREE_MODEL (priv->bookmarks_store), &iter,
+ 0, &page_id,
+ -1);
+ g_object_get (priv->view, "yelp-uri", &uri, NULL);
+ doc_uri = yelp_uri_get_document_uri (uri);
+ yelp_application_remove_bookmark (priv->application, doc_uri, page_id);
+ g_object_unref (uri);
+ g_free (doc_uri);
+ g_free (page_id);
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}