diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2013-07-28 00:17:20 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2013-07-28 09:24:02 +0800 |
commit | 83134a75c34502e784161ee21b803c2082d1a446 (patch) | |
tree | 1cec752355546f7f2d5954e22b5ed29c1caaff6f | |
parent | 826372c35155cb47f940905e27b304e9ef63441d (diff) | |
download | gsoc2013-evolution-83134a75c34502e784161ee21b803c2082d1a446.tar gsoc2013-evolution-83134a75c34502e784161ee21b803c2082d1a446.tar.gz gsoc2013-evolution-83134a75c34502e784161ee21b803c2082d1a446.tar.bz2 gsoc2013-evolution-83134a75c34502e784161ee21b803c2082d1a446.tar.lz gsoc2013-evolution-83134a75c34502e784161ee21b803c2082d1a446.tar.xz gsoc2013-evolution-83134a75c34502e784161ee21b803c2082d1a446.tar.zst gsoc2013-evolution-83134a75c34502e784161ee21b803c2082d1a446.zip |
EWebView: Add an "image-save" action.
There's now enough hooks in EWebView that it can take over image saving
from EMailDisplay / EMailReader, with the added perk that a "Save Image"
pop-up menu item now appears for images in ALL preview panes.
-rw-r--r-- | e-util/e-web-view.c | 17 | ||||
-rw-r--r-- | e-util/widgets.error.xml | 5 | ||||
-rw-r--r-- | mail/e-mail-display.c | 60 | ||||
-rw-r--r-- | mail/e-mail-reader.c | 128 |
4 files changed, 27 insertions, 183 deletions
diff --git a/e-util/e-web-view.c b/e-util/e-web-view.c index a762c45513..bc0b2648ce 100644 --- a/e-util/e-web-view.c +++ b/e-util/e-web-view.c @@ -125,6 +125,7 @@ static const gchar *ui = " <menuitem action='uri-copy'/>" " <menuitem action='mailto-copy'/>" " <menuitem action='image-copy'/>" +" <menuitem action='image-save'/>" " </placeholder>" " <placeholder name='custom-actions-3'/>" " <separator/>" @@ -270,6 +271,13 @@ action_image_copy_cb (GtkAction *action, e_web_view_cursor_image_copy (web_view); } +static void +action_image_save_cb (GtkAction *action, + EWebView *web_view) +{ + e_web_view_cursor_image_save (web_view); +} + static GtkActionEntry uri_entries[] = { { "uri-copy", @@ -314,7 +322,14 @@ static GtkActionEntry image_entries[] = { N_("_Copy Image"), NULL, N_("Copy the image to the clipboard"), - G_CALLBACK (action_image_copy_cb) } + G_CALLBACK (action_image_copy_cb) }, + + { "image-save", + GTK_STOCK_SAVE, + N_("Save _Image..."), + NULL, + N_("Save the image to a file"), + G_CALLBACK (action_image_save_cb) } }; static GtkActionEntry selection_entries[] = { diff --git a/e-util/widgets.error.xml b/e-util/widgets.error.xml index 60dc78080f..74fbd9f9a1 100644 --- a/e-util/widgets.error.xml +++ b/e-util/widgets.error.xml @@ -19,6 +19,11 @@ <secondary xml:space="preserve">{0}</secondary> </error> + <error id="no-image-save" type="warning"> + <_primary>Unable to save image.</_primary> + <secondary xml:space="preserve">{0}</secondary> + </error> + <error id="no-load-signature" type="error"> <_primary>Could not load signature.</_primary> <secondary xml:space="preserve">{0}</secondary> diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c index 46cf48a306..1793ae74cd 100644 --- a/mail/e-mail-display.c +++ b/mail/e-mail-display.c @@ -89,15 +89,6 @@ static const gchar *ui = " </popup>" "</ui>"; -static const gchar *image_ui = -"<ui>" -" <popup name='context'>" -" <placeholder name='custom-actions-2'>" -" <menuitem action='image-save'/>" -" </placeholder>" -" </popup>" -"</ui>"; - static GtkActionEntry mailto_entries[] = { { "add-to-address-book", @@ -138,16 +129,6 @@ static GtkActionEntry mailto_entries[] = { NULL } }; -static GtkActionEntry image_entries[] = { - - { "image-save", - GTK_STOCK_SAVE, - N_("Save _Image..."), - NULL, - N_("Save the image to a file"), - NULL /* Handled by EMailReader */ }, -}; - G_DEFINE_TYPE ( EMailDisplay, e_mail_display, @@ -1288,13 +1269,9 @@ static gboolean mail_display_button_press_event (GtkWidget *widget, GdkEventButton *event) { - WebKitHitTestResult *hit_test; - WebKitHitTestResultContext context; - gchar *image_src; - gboolean visible; - GtkAction *action; - GList *extensions, *iter; EWebView *web_view = E_WEB_VIEW (widget); + WebKitHitTestResult *hit_test; + GList *list, *link; if (event->button != 3) goto chainup; @@ -1302,29 +1279,10 @@ mail_display_button_press_event (GtkWidget *widget, hit_test = webkit_web_view_get_hit_test_result ( WEBKIT_WEB_VIEW (web_view), event); - g_object_get ( - G_OBJECT (hit_test), - "context", &context, - "image-uri", &image_src, - NULL); - - if ((context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE)) { - visible = image_src && g_str_has_prefix (image_src, "cid:"); - if (!visible && image_src) - visible = mail_display_image_exists_in_cache (image_src); - - if (image_src != NULL) - g_free (image_src); - - action = e_web_view_get_action (web_view, "image-save"); - if (action != NULL) - gtk_action_set_visible (action, visible); - } - - extensions = e_extensible_list_extensions ( + list = e_extensible_list_extensions ( E_EXTENSIBLE (web_view), E_TYPE_EXTENSION); - for (iter = extensions; iter; iter = g_list_next (iter)) { - EExtension *extension = iter->data; + for (link = list; link != NULL; link = g_list_next (link)) { + EExtension *extension = link->data; if (!E_IS_MAIL_DISPLAY_POPUP_EXTENSION (extension)) continue; @@ -1332,7 +1290,7 @@ mail_display_button_press_event (GtkWidget *widget, e_mail_display_popup_extension_update_actions ( E_MAIL_DISPLAY_POPUP_EXTENSION (extension), hit_test); } - g_list_free (extensions); + g_list_free (list); g_object_unref (hit_test); @@ -1698,12 +1656,6 @@ e_mail_display_init (EMailDisplay *display) ui_manager = e_web_view_get_ui_manager (E_WEB_VIEW (display)); gtk_ui_manager_add_ui_from_string (ui_manager, ui, -1, NULL); - actions = e_web_view_get_action_group (E_WEB_VIEW (display), "image"); - gtk_action_group_add_actions ( - actions, image_entries, - G_N_ELEMENTS (image_entries), display); - gtk_ui_manager_add_ui_from_string (ui_manager, image_ui, -1, NULL); - e_web_view_install_request_handler ( E_WEB_VIEW (display), E_TYPE_MAIL_REQUEST); e_web_view_install_request_handler ( diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index 5122aa2247..ecf07c50f9 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -271,128 +271,6 @@ exit: } static void -attachment_load_finish (EAttachment *attachment, - GAsyncResult *result, - GFile *file) -{ - EShell *shell; - GtkWindow *parent; - - e_attachment_load_finish (attachment, result, NULL); - - shell = e_shell_get_default (); - parent = e_shell_get_active_window (shell); - - e_attachment_save_async ( - attachment, file, (GAsyncReadyCallback) - e_attachment_save_handle_error, parent); - - g_object_unref (file); -} - -static void -action_mail_image_save_cb (GtkAction *action, - EMailReader *reader) -{ - EShell *shell; - EMailBackend *backend; - EMailDisplay *display; - EWebView *web_view; - EMailPartList *parts; - const gchar *image_src; - CamelMimePart *part; - CamelMimeMessage *message; - EAttachment *attachment; - GFile *file; - - backend = e_mail_reader_get_backend (reader); - shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend)); - - display = e_mail_reader_get_mail_display (reader); - if (display == NULL) - return; - - web_view = E_WEB_VIEW (display); - image_src = e_web_view_get_cursor_image_src (web_view); - if (image_src == NULL) - return; - - parts = e_mail_display_get_part_list (display); - g_return_if_fail (parts != NULL); - - message = e_mail_part_list_get_message (parts); - g_return_if_fail (message != NULL); - - if (g_str_has_prefix (image_src, "cid:")) { - part = camel_mime_message_get_part_by_content_id ( - message, image_src + 4); - g_return_if_fail (part != NULL); - - g_object_ref (part); - } else { - CamelStream *image_stream; - CamelDataWrapper *dw; - CamelDataCache *cache; - const gchar *filename; - const gchar *user_cache_dir; - - /* Open cache and find the file there */ - user_cache_dir = e_get_user_cache_dir (); - cache = camel_data_cache_new (user_cache_dir, NULL); - image_stream = camel_data_cache_get ( - cache, "http", image_src, NULL); - if (image_stream == NULL) { - g_object_unref (cache); - return; - } - - filename = strrchr (image_src, '/'); - if (filename != NULL) { - if (strchr (filename, '?') == NULL) - filename++; - else - filename = NULL; - } - - part = camel_mime_part_new (); - if (filename != NULL) - camel_mime_part_set_filename (part, filename); - - dw = camel_data_wrapper_new (); - camel_data_wrapper_set_mime_type ( - dw, "application/octet-stream"); - camel_data_wrapper_construct_from_stream_sync ( - dw, image_stream, NULL, NULL); - camel_medium_set_content (CAMEL_MEDIUM (part), dw); - g_object_unref (dw); - - camel_mime_part_set_encoding ( - part, CAMEL_TRANSFER_ENCODING_BASE64); - - g_object_unref (image_stream); - g_object_unref (cache); - } - - file = e_shell_run_save_dialog ( - shell, _("Save Image"), - camel_mime_part_get_filename (part), - NULL, NULL, NULL); - if (file == NULL) { - g_object_unref (part); - return; - } - - attachment = e_attachment_new (); - e_attachment_set_mime_part (attachment, part); - - e_attachment_load_async ( - attachment, (GAsyncReadyCallback) - attachment_load_finish, file); - - g_object_unref (part); -} - -static void action_mail_charset_cb (GtkRadioAction *action, GtkRadioAction *current, EMailReader *reader) @@ -3957,12 +3835,6 @@ e_mail_reader_init (EMailReader *reader, action, "activate", G_CALLBACK (action_search_folder_sender_cb), reader); - action_name = "image-save"; - action = e_mail_display_get_action (display, action_name); - g_signal_connect ( - action, "activate", - G_CALLBACK (action_mail_image_save_cb), reader); - #ifndef G_OS_WIN32 /* Lockdown integration. */ |