Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-window.c
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2007-01-07 16:28:00 (GMT)
committer Carlos Garcia Campos <carlosgc@src.gnome.org>2007-01-07 16:28:00 (GMT)
commit6b9aeb5d0b86d0002db107ad79af550a4e39f07a (patch)
tree1a26d73986f440d54647da1e1064b79990415859 /shell/ev-window.c
parent560065af6f0b02dcb360c3115398f992354865e8 (diff)
Add image handling support. Fixes bugs #310008 and #325047. Images
2007-01-07 Carlos Garcia Campos <carlosgc@gnome.org> * configure.ac: * data/evince-ui.xml: * pdf/ev-poppler.cc: (pdf_document_images_get_images), (pdf_document_document_images_iface_init): * backend/Makefile.am: * backend/ev-document-images.[ch]: * backend/ev-image.[ch]: * lib/ev-file-helpers.[ch]: (ev_tmp_filename): * shell/ev-jobs.[ch]: (ev_job_render_new), (ev_job_render_run), (ev_job_xfer_run): * shell/ev-pixbuf-cache.[ch]: (dispose_cache_job_info), (move_one_job), (copy_job_to_job_info), (add_job_if_needed), (ev_pixbuf_cache_get_image_mapping): * shell/ev-window.c: (view_menu_link_popup), (view_menu_image_popup), (view_menu_popup_cb), (ev_window_dispose), (image_save_dialog_response_cb), (ev_view_popup_cmd_save_image_as), (ev_view_popup_cmd_copy_image): * shell/ev-view-private.h: * shell/ev-view.c: (ev_view_get_image_at_location), (ev_view_do_popup_menu), (ev_view_popup_menu), (ev_view_button_press_event), (ev_view_drag_data_get), (ev_view_drag_motion), (ev_view_drag_data_received), (ev_view_motion_notify_event), (ev_view_button_release_event), (ev_view_finalize), (ev_view_class_init): Add image handling support. Fixes bugs #310008 and #325047. Images selection is not supported yet. svn path=/trunk/; revision=2194
Diffstat (limited to 'shell/ev-window.c')
-rw-r--r--shell/ev-window.c186
1 files changed, 156 insertions, 30 deletions
diff --git a/shell/ev-window.c b/shell/ev-window.c
index ec97987..c0adf8e 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -70,6 +70,7 @@
#include "ev-utils.h"
#include "ev-debug.h"
#include "ev-history.h"
+#include "ev-image.h"
#ifdef WITH_GNOME_PRINT
#include "ev-print-job.h"
@@ -151,9 +152,10 @@ struct _EvWindowPrivate {
GtkWidget *fullscreen_popup;
guint fullscreen_timeout_id;
- /* Popup link */
+ /* Popup view */
GtkWidget *view_popup;
EvLink *link;
+ EvImage *image;
/* Popup attachment */
GtkWidget *attachment_popup;
@@ -242,6 +244,10 @@ static void ev_view_popup_cmd_open_link_new_window (GtkAction *actio
EvWindow *window);
static void ev_view_popup_cmd_copy_link_address (GtkAction *action,
EvWindow *window);
+static void ev_view_popup_cmd_save_image_as (GtkAction *action,
+ EvWindow *window);
+static void ev_view_popup_cmd_copy_image (GtkAction *action,
+ EvWindow *window);
static void ev_attachment_popup_cmd_open_attachment (GtkAction *action,
EvWindow *window);
static void ev_attachment_popup_cmd_save_attachment_as (GtkAction *action,
@@ -3290,18 +3296,13 @@ ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_sidebar,
}
}
-static gboolean
-view_menu_popup_cb (EvView *view,
- EvLink *link,
- EvWindow *ev_window)
+static void
+view_menu_link_popup (EvWindow *ev_window,
+ EvLink *link)
{
- GtkWidget *popup;
gboolean show_external = FALSE;
gboolean show_internal = FALSE;
GtkAction *action;
-
- if (ev_view_get_presentation (EV_VIEW (ev_window->priv->view)))
- return FALSE;
if (ev_window->priv->link)
g_object_unref (ev_window->priv->link);
@@ -3311,26 +3312,23 @@ view_menu_popup_cb (EvView *view,
else
ev_window->priv->link = NULL;
- popup = ev_window->priv->view_popup;
-
if (ev_window->priv->link) {
EvLinkAction *ev_action;
ev_action = ev_link_get_action (link);
- if (!ev_action)
- return FALSE;
-
- switch (ev_link_action_get_action_type (ev_action)) {
- case EV_LINK_ACTION_TYPE_GOTO_DEST:
- case EV_LINK_ACTION_TYPE_GOTO_REMOTE:
- show_internal = TRUE;
- break;
- case EV_LINK_ACTION_TYPE_EXTERNAL_URI:
- case EV_LINK_ACTION_TYPE_LAUNCH:
- show_external = TRUE;
- break;
- default:
- break;
+ if (ev_action) {
+ switch (ev_link_action_get_action_type (ev_action)) {
+ case EV_LINK_ACTION_TYPE_GOTO_DEST:
+ case EV_LINK_ACTION_TYPE_GOTO_REMOTE:
+ show_internal = TRUE;
+ break;
+ case EV_LINK_ACTION_TYPE_EXTERNAL_URI:
+ case EV_LINK_ACTION_TYPE_LAUNCH:
+ show_external = TRUE;
+ break;
+ default:
+ break;
+ }
}
}
@@ -3349,9 +3347,49 @@ view_menu_popup_cb (EvView *view,
action = gtk_action_group_get_action (ev_window->priv->view_popup_action_group,
"OpenLinkNewWindow");
gtk_action_set_visible (action, show_internal);
+}
- gtk_menu_popup (GTK_MENU (popup), NULL, NULL,
- NULL, NULL,
+static void
+view_menu_image_popup (EvWindow *ev_window,
+ EvImage *image)
+{
+ GtkAction *action;
+ gboolean show_image = FALSE;
+
+ if (ev_window->priv->image)
+ g_object_unref (ev_window->priv->image);
+
+ if (image)
+ ev_window->priv->image = g_object_ref (image);
+ else
+ ev_window->priv->image = NULL;
+
+ show_image = (ev_window->priv->image != NULL);
+
+ action = gtk_action_group_get_action (ev_window->priv->view_popup_action_group,
+ "SaveImageAs");
+ gtk_action_set_visible (action, show_image);
+
+ action = gtk_action_group_get_action (ev_window->priv->view_popup_action_group,
+ "CopyImage");
+ gtk_action_set_visible (action, show_image);
+}
+
+static gboolean
+view_menu_popup_cb (EvView *view,
+ GObject *object,
+ EvWindow *ev_window)
+{
+ if (ev_view_get_presentation (EV_VIEW (ev_window->priv->view)))
+ return FALSE;
+
+ view_menu_link_popup (ev_window,
+ EV_IS_LINK (object) ? EV_LINK (object) : NULL);
+ view_menu_image_popup (ev_window,
+ EV_IS_IMAGE (object) ? EV_IMAGE (object) : NULL);
+
+ gtk_menu_popup (GTK_MENU (ev_window->priv->view_popup),
+ NULL, NULL, NULL, NULL,
3, gtk_get_current_event_time ());
return TRUE;
}
@@ -3617,6 +3655,11 @@ ev_window_dispose (GObject *object)
priv->link = NULL;
}
+ if (priv->image) {
+ g_object_unref (priv->image);
+ priv->image = NULL;
+ }
+
if (priv->attach_list) {
g_list_foreach (priv->attach_list,
(GFunc) g_object_unref,
@@ -3848,8 +3891,11 @@ static const GtkActionEntry view_popup_entries [] = {
{ "OpenLinkNewWindow", NULL, N_("Open in New _Window"), NULL,
NULL, G_CALLBACK (ev_view_popup_cmd_open_link_new_window) },
{ "CopyLinkAddress", NULL, N_("_Copy Link Address"), NULL,
- NULL,
- G_CALLBACK (ev_view_popup_cmd_copy_link_address) },
+ NULL, G_CALLBACK (ev_view_popup_cmd_copy_link_address) },
+ { "SaveImageAs", NULL, N_("_Save Image As..."), NULL,
+ NULL, G_CALLBACK (ev_view_popup_cmd_save_image_as) },
+ { "CopyImage", NULL, N_("Copy _Image"), NULL,
+ NULL, G_CALLBACK (ev_view_popup_cmd_copy_image) },
};
static const GtkActionEntry attachment_popup_entries [] = {
@@ -4229,6 +4275,86 @@ ev_view_popup_cmd_copy_link_address (GtkAction *action, EvWindow *window)
}
static void
+image_save_dialog_response_cb (GtkWidget *fc,
+ gint response_id,
+ EvWindow *ev_window)
+{
+ gchar *uri;
+ gchar *filename;
+ GError *error = NULL;
+
+ if (response_id != GTK_RESPONSE_OK) {
+ gtk_widget_destroy (fc);
+ return;
+ }
+
+ uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc));
+ filename = g_filename_from_uri (uri, NULL, NULL);
+ g_free (uri);
+
+ /* FIXME: allow saving in other image formats than png */
+ gdk_pixbuf_save (ev_image_get_pixbuf (ev_window->priv->image),
+ filename, "png", &error, NULL);
+
+ if (error) {
+ ev_window_error_dialog (GTK_WINDOW (fc),
+ _("The image could not be saved."),
+ error);
+ g_error_free (error);
+ }
+
+ g_free (filename);
+
+ gtk_widget_destroy (fc);
+}
+
+static void
+ev_view_popup_cmd_save_image_as (GtkAction *action, EvWindow *window)
+{
+ GtkWidget *fc;
+ GtkFileFilter *filter;
+
+ if (!window->priv->image)
+ return;
+
+ fc = gtk_file_chooser_dialog_new (_("Save Image"),
+ GTK_WINDOW (window),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_OK,
+ NULL);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK);
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("Images"));
+ gtk_file_filter_add_pixbuf_formats (filter);
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (fc), filter);
+
+ g_signal_connect (fc, "response",
+ G_CALLBACK (image_save_dialog_response_cb),
+ window);
+
+ gtk_widget_show (fc);
+}
+
+static void
+ev_view_popup_cmd_copy_image (GtkAction *action, EvWindow *window)
+{
+ GtkClipboard *clipboard;
+
+ if (!window->priv->image)
+ return;
+
+ clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window),
+ GDK_SELECTION_CLIPBOARD);
+ gtk_clipboard_set_image (clipboard,
+ ev_image_get_pixbuf (window->priv->image));
+}
+
+static void
ev_attachment_popup_cmd_open_attachment (GtkAction *action, EvWindow *window)
{
GList *l;
@@ -4317,7 +4443,7 @@ ev_attachment_popup_cmd_save_attachment_as (GtkAction *action, EvWindow *window)
attachment = (EvAttachment *) window->priv->attach_list->data;
fc = gtk_file_chooser_dialog_new (
- _("Save a Copy"),
+ _("Save Attachment"),
GTK_WINDOW (window),
attachment ? GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
GTK_STOCK_CANCEL,