Bladeren bron

Browser: Add a special context menu for images

Now, right-clicking on an image allows you to open that image in this
tab or a new tab. You can also copy the image URL, and even copy the
image itself to the clipboard! :^)

Copying to the clipboard will not work in a multi-process context yet,
since we need to send the image bitmap across the IPC boundary and this
patch does not do that.
Andreas Kling 4 jaren geleden
bovenliggende
commit
44f9637e20
2 gewijzigde bestanden met toevoegingen van 31 en 0 verwijderingen
  1. 26 0
      Applications/Browser/Tab.cpp
  2. 5 0
      Applications/Browser/Tab.h

+ 26 - 0
Applications/Browser/Tab.cpp

@@ -187,6 +187,32 @@ Tab::Tab(Type type)
         m_link_context_menu->popup(screen_position, m_link_context_menu_default_action);
         m_link_context_menu->popup(screen_position, m_link_context_menu_default_action);
     };
     };
 
 
+    m_image_context_menu = GUI::Menu::construct();
+    m_image_context_menu->add_action(GUI::Action::create("Open image", [this](auto&) {
+        hooks().on_link_click(m_image_context_menu_url, "", 0);
+    }));
+    m_image_context_menu->add_action(GUI::Action::create("Open image in new tab", [this](auto&) {
+        hooks().on_link_click(m_image_context_menu_url, "_blank", 0);
+    }));
+    m_image_context_menu->add_separator();
+    m_image_context_menu->add_action(GUI::Action::create("Copy image", [this](auto&) {
+        if (m_image_context_menu_bitmap.is_valid())
+            GUI::Clipboard::the().set_bitmap(*m_image_context_menu_bitmap.bitmap());
+    }));
+    m_image_context_menu->add_action(GUI::Action::create("Copy image URL", [this](auto&) {
+        GUI::Clipboard::the().set_plain_text(m_image_context_menu_url.to_string());
+    }));
+    m_image_context_menu->add_separator();
+    m_image_context_menu->add_action(GUI::Action::create("Download", [this](auto&) {
+        start_download(m_image_context_menu_url);
+    }));
+
+    hooks().on_image_context_menu_request = [this](auto& image_url, auto& screen_position, const Gfx::ShareableBitmap& shareable_bitmap) {
+        m_image_context_menu_url = image_url;
+        m_image_context_menu_bitmap = shareable_bitmap;
+        m_image_context_menu->popup(screen_position);
+    };
+
     hooks().on_link_middle_click = [this](auto& href, auto&, auto) {
     hooks().on_link_middle_click = [this](auto& href, auto&, auto) {
         hooks().on_link_click(href, "_blank", 0);
         hooks().on_link_click(href, "_blank", 0);
     };
     };

+ 5 - 0
Applications/Browser/Tab.h

@@ -29,6 +29,7 @@
 #include "History.h"
 #include "History.h"
 #include <AK/URL.h>
 #include <AK/URL.h>
 #include <LibGUI/Widget.h>
 #include <LibGUI/Widget.h>
+#include <LibGfx/ShareableBitmap.h>
 #include <LibHTTP/HttpJob.h>
 #include <LibHTTP/HttpJob.h>
 #include <LibWeb/Forward.h>
 #include <LibWeb/Forward.h>
 
 
@@ -104,6 +105,10 @@ private:
     RefPtr<GUI::Action> m_link_context_menu_default_action;
     RefPtr<GUI::Action> m_link_context_menu_default_action;
     URL m_link_context_menu_url;
     URL m_link_context_menu_url;
 
 
+    RefPtr<GUI::Menu> m_image_context_menu;
+    Gfx::ShareableBitmap m_image_context_menu_bitmap;
+    URL m_image_context_menu_url;
+
     RefPtr<GUI::Menu> m_tab_context_menu;
     RefPtr<GUI::Menu> m_tab_context_menu;
     RefPtr<GUI::Menu> m_page_context_menu;
     RefPtr<GUI::Menu> m_page_context_menu;