X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-sidebar-bookmarks.c;h=fa252d898c7879e2726860ea2983cb4f5d5fbcfb;hb=648a3193781bad3fe1cf5e581c8b6ccf1bc2ee15;hp=7a0d777606c3d5410a9b8b24e6a10da9b5abb2f2;hpb=180cf6fef2318791abb3583f4c3f3bc176a204d8;p=evince.git diff --git a/shell/ev-sidebar-bookmarks.c b/shell/ev-sidebar-bookmarks.c index 7a0d7776..fa252d89 100644 --- a/shell/ev-sidebar-bookmarks.c +++ b/shell/ev-sidebar-bookmarks.c @@ -26,6 +26,7 @@ #include "ev-document.h" #include "ev-sidebar-page.h" +#include "ev-utils.h" enum { PROP_0, @@ -50,6 +51,11 @@ struct _EvSidebarBookmarksPrivate { GtkWidget *tree_view; GtkWidget *del_button; GtkWidget *add_button; + + /* Popup menu */ + GtkWidget *popup; + GtkUIManager *ui_manager; + GtkActionGroup *action_group; }; static void ev_sidebar_bookmarks_page_iface_init (EvSidebarPageInterface *iface); @@ -63,6 +69,94 @@ G_DEFINE_TYPE_EXTENDED (EvSidebarBookmarks, static guint signals[N_SIGNALS]; +static const gchar popup_menu_ui[] = + "\n" + " \n" + " \n" + " \n" + " \n" + "\n"; + +static gint +ev_sidebar_bookmarks_get_selected_page (EvSidebarBookmarks *sidebar_bookmarks, + GtkTreeSelection *selection) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + guint page; + + gtk_tree_model_get (model, &iter, + COLUMN_PAGE, &page, + -1); + return page; + } + + return -1; +} + +static void +ev_bookmarks_popup_cmd_open_bookmark (GtkAction *action, + EvSidebarBookmarks *sidebar_bookmarks) +{ + EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv; + GtkTreeSelection *selection; + gint page; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view)); + page = ev_sidebar_bookmarks_get_selected_page (sidebar_bookmarks, selection); + ev_document_model_set_page (priv->model, page); +} + +static void +ev_bookmarks_popup_cmd_rename_bookmark (GtkAction *action, + EvSidebarBookmarks *sidebar_bookmarks) +{ + EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv; + GtkTreeView *tree_view = GTK_TREE_VIEW (priv->tree_view); + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + + + selection = gtk_tree_view_get_selection (tree_view); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + GtkTreePath *path; + + path = gtk_tree_model_get_path (model, &iter); + gtk_tree_view_set_cursor (tree_view, path, + gtk_tree_view_get_column (tree_view, 0), + TRUE); + gtk_tree_path_free (path); + } +} + +static void +ev_bookmarks_popup_cmd_remove_bookmark (GtkAction *action, + EvSidebarBookmarks *sidebar_bookmarks) +{ + EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv; + GtkTreeSelection *selection; + gint page; + EvBookmark bm; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view)); + page = ev_sidebar_bookmarks_get_selected_page (sidebar_bookmarks, selection); + bm.page = page; + bm.title = NULL; + ev_bookmarks_delete (priv->bookmarks, &bm); +} + +static const GtkActionEntry popup_entries[] = { + { "OpenBookmark", GTK_STOCK_OPEN, N_("_Open Bookmark"), NULL, + NULL, G_CALLBACK (ev_bookmarks_popup_cmd_open_bookmark) }, + { "RenameBookmark", NULL, N_("_Rename Bookmark"), NULL, + NULL, G_CALLBACK (ev_bookmarks_popup_cmd_rename_bookmark) }, + { "RemoveBookmark", NULL, N_("_Remove Bookmark"), NULL, + NULL, G_CALLBACK (ev_bookmarks_popup_cmd_remove_bookmark) } +}; + static gint compare_bookmarks (EvBookmark *a, EvBookmark *b) @@ -85,8 +179,10 @@ ev_sidebar_bookmarks_update (EvSidebarBookmarks *sidebar_bookmarks) model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree_view))); gtk_list_store_clear (model); - if (!priv->bookmarks) + if (!priv->bookmarks) { + g_object_set (priv->tree_view, "has-tooltip", FALSE, NULL); return; + } items = ev_bookmarks_get_bookmarks (priv->bookmarks); items = g_list_sort (items, (GCompareFunc)compare_bookmarks); @@ -100,6 +196,7 @@ ev_sidebar_bookmarks_update (EvSidebarBookmarks *sidebar_bookmarks) -1); } g_list_free (items); + g_object_set (priv->tree_view, "has-tooltip", TRUE, NULL); } static void @@ -109,25 +206,6 @@ ev_sidebar_bookmarks_changed (EvBookmarks *bookmarks, ev_sidebar_bookmarks_update (sidebar_bookmarks); } -static gint -ev_sidebar_bookmarks_get_selected_page (EvSidebarBookmarks *sidebar_bookmarks, - GtkTreeSelection *selection) -{ - GtkTreeModel *model; - GtkTreeIter iter; - - if (gtk_tree_selection_get_selected (selection, &model, &iter)) { - guint page; - - gtk_tree_model_get (model, &iter, - COLUMN_PAGE, &page, - -1); - return page; - } - - return -1; -} - static void ev_sidebar_bookmarks_selection_changed (GtkTreeSelection *selection, EvSidebarBookmarks *sidebar_bookmarks) @@ -201,6 +279,109 @@ ev_sidebar_bookmarks_bookmark_renamed (GtkCellRendererText *renderer, ev_bookmarks_update (priv->bookmarks, &bm); } +static gboolean +ev_sidebar_bookmarks_query_tooltip (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + EvSidebarBookmarks *sidebar_bookmarks) +{ + EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv; + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreePath *path = NULL; + EvDocument *document; + guint page; + gchar *page_label; + gchar *text; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree_view)); + if (!gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (priv->tree_view), + &x, &y, keyboard_tip, + &model, &path, &iter)) + return FALSE; + + gtk_tree_model_get (model, &iter, + COLUMN_PAGE, &page, + -1); + + document = ev_document_model_get_document (priv->model); + page_label = ev_document_get_page_label (document, page); + text = g_strdup_printf (_("Page %s"), page_label); + gtk_tooltip_set_text (tooltip, text); + g_free (text); + g_free (page_label); + + gtk_tree_view_set_tooltip_row (GTK_TREE_VIEW (priv->tree_view), + tooltip, path); + gtk_tree_path_free (path); + + return TRUE; +} + +static gboolean +ev_sidebar_bookmarks_popup_menu_show (EvSidebarBookmarks *sidebar_bookmarks, + gint x, + gint y, + gboolean keyboard_mode) +{ + EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv; + GtkTreeView *tree_view = GTK_TREE_VIEW (sidebar_bookmarks->priv->tree_view); + GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view); + + if (keyboard_mode) { + if (!gtk_tree_selection_get_selected (selection, NULL, NULL)) + return FALSE; + } else { + GtkTreePath *path; + + if (!gtk_tree_view_get_path_at_pos (tree_view, x, y, &path, NULL, NULL, NULL)) + return FALSE; + + g_signal_handlers_block_by_func (selection, + ev_sidebar_bookmarks_selection_changed, + sidebar_bookmarks); + gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE); + g_signal_handlers_unblock_by_func (selection, + ev_sidebar_bookmarks_selection_changed, + sidebar_bookmarks); + gtk_tree_path_free (path); + } + + if (!priv->popup) + priv->popup = gtk_ui_manager_get_widget (priv->ui_manager, "/BookmarksPopup"); + + gtk_menu_popup (GTK_MENU (priv->popup), + NULL, NULL, + keyboard_mode ? ev_gui_menu_position_tree_selection : NULL, + keyboard_mode ? tree_view : NULL, + keyboard_mode ? 0 : 3, + gtk_get_current_event_time ()); + return TRUE; +} + +static gboolean +ev_sidebar_bookmarks_button_press (GtkWidget *widget, + GdkEventButton *event, + EvSidebarBookmarks *sidebar_bookmarks) +{ + if (event->button != 3) + return FALSE; + + return ev_sidebar_bookmarks_popup_menu_show (sidebar_bookmarks, event->x, event->y, FALSE); +} + +static gboolean +ev_sidebar_bookmarks_popup_menu (GtkWidget *widget) +{ + EvSidebarBookmarks *sidebar_bookmarks = EV_SIDEBAR_BOOKMARKS (widget); + gint x, y; + + gtk_widget_get_pointer (widget, &x, &y); + return ev_sidebar_bookmarks_popup_menu_show (sidebar_bookmarks, x, y, TRUE); +} + static void ev_sidebar_bookmarks_dispose (GObject *object) { @@ -217,6 +398,16 @@ ev_sidebar_bookmarks_dispose (GObject *object) priv->bookmarks = NULL; } + if (priv->action_group) { + g_object_unref (priv->action_group); + priv->action_group = NULL; + } + + if (priv->ui_manager) { + g_object_unref (priv->ui_manager); + priv->ui_manager = NULL; + } + G_OBJECT_CLASS (ev_sidebar_bookmarks_parent_class)->dispose (object); } @@ -249,6 +440,13 @@ ev_sidebar_bookmarks_init (EvSidebarBookmarks *sidebar_bookmarks) model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_UINT); priv->tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); g_object_unref (model); + g_signal_connect (priv->tree_view, "query-tooltip", + G_CALLBACK (ev_sidebar_bookmarks_query_tooltip), + sidebar_bookmarks); + g_signal_connect (priv->tree_view, + "button-press-event", + G_CALLBACK (ev_sidebar_bookmarks_button_press), + sidebar_bookmarks); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->tree_view), FALSE); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view)); g_signal_connect (selection, "changed", @@ -291,6 +489,17 @@ ev_sidebar_bookmarks_init (EvSidebarBookmarks *sidebar_bookmarks) gtk_box_pack_end (GTK_BOX (sidebar_bookmarks), hbox, FALSE, TRUE, 0); gtk_widget_show (hbox); gtk_widget_show (GTK_WIDGET (sidebar_bookmarks)); + + /* Popup menu */ + priv->action_group = gtk_action_group_new ("BookmarsPopupActions"); + gtk_action_group_set_translation_domain (priv->action_group, NULL); + gtk_action_group_add_actions (priv->action_group, popup_entries, + G_N_ELEMENTS (popup_entries), + sidebar_bookmarks); + priv->ui_manager = gtk_ui_manager_new (); + gtk_ui_manager_insert_action_group (priv->ui_manager, + priv->action_group, 0); + gtk_ui_manager_add_ui_from_string (priv->ui_manager, popup_menu_ui, -1, NULL); } static void @@ -316,11 +525,14 @@ ev_sidebar_bookmarks_get_property (GObject *object, static void ev_sidebar_bookmarks_class_init (EvSidebarBookmarksClass *klass) { - GObjectClass *g_object_class = G_OBJECT_CLASS (klass); + GObjectClass *g_object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); g_object_class->get_property = ev_sidebar_bookmarks_get_property; g_object_class->dispose = ev_sidebar_bookmarks_dispose; + widget_class->popup_menu = ev_sidebar_bookmarks_popup_menu; + g_type_class_add_private (g_object_class, sizeof (EvSidebarBookmarksPrivate)); g_object_class_override_property (g_object_class, PROP_WIDGET, "main-widget");