diff options
author | Shaun McCance <shaunm@gnome.org> | 2010-05-27 15:07:19 -0500 |
---|---|---|
committer | Shaun McCance <shaunm@gnome.org> | 2010-05-27 15:07:19 -0500 |
commit | 64ea4e594c0dbc2de41e0d83c51282408ec62e08 (patch) | |
tree | 252efd5c1bf3fd4d1c9ccdd6162bebc57cd3ba1d | |
parent | 58fdaa84920387da8b34a4ec1148a5f5f6034f0a (diff) | |
download | yelp-64ea4e594c0dbc2de41e0d83c51282408ec62e08.tar.gz |
[yelp-window] First round on the bookmarks editor
-rw-r--r-- | src/yelp-application.c | 26 | ||||
-rw-r--r-- | src/yelp-application.h | 3 | ||||
-rw-r--r-- | src/yelp-window.c | 210 |
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; +} |