Skip to content
This repository was archived by the owner on Dec 25, 2022. It is now read-only.

Commit a2684b6

Browse files
committed
Context menu for links
This patch implements a context menu for links. In the future, we could even check for the modifiers and open links in new windows, or private windows - but not today.
1 parent dd0931e commit a2684b6

8 files changed

+64
-3
lines changed

BrowserWindow.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,16 @@ void BrowserWindow::debug_request(String const& request, String const& argument)
244244
}
245245

246246
void BrowserWindow::new_tab()
247+
{
248+
new_tab_with_url(QUrl());
249+
}
250+
251+
void BrowserWindow::new_tab_with_url(const QUrl &url)
247252
{
248253
auto tab = make<Tab>(this);
249254
auto tab_ptr = tab.ptr();
255+
if (!url.isEmpty())
256+
tab->navigate(url.toString());
250257
m_tabs.append(std::move(tab));
251258

252259
if (m_current_tab == nullptr) {

BrowserWindow.h

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public slots:
3131
void tab_title_changed(int index, QString const&);
3232
void tab_favicon_changed(int index, QIcon icon);
3333
void new_tab();
34+
void new_tab_with_url(QUrl const&);
3435
void close_tab(int index);
3536
void close_current_tab();
3637
void open_next_tab();

PageClientLadybird.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "SimpleWebView.h"
1212
#include <LibCore/System.h>
1313
#include <LibGfx/Painter.h>
14+
#include <LibGfx/Point.h>
1415
#include <LibJS/Runtime/ConsoleObject.h>
1516
#include <LibWeb/DOM/Document.h>
1617
#include <LibWeb/HTML/BrowsingContext.h>
@@ -162,8 +163,13 @@ void PageClientLadybird::page_did_request_context_menu(Gfx::IntPoint const&)
162163
{
163164
}
164165

165-
void PageClientLadybird::page_did_request_link_context_menu(Gfx::IntPoint const&, AK::URL const&, String const&, unsigned)
166+
void PageClientLadybird::page_did_request_link_context_menu(Gfx::IntPoint const& position, AK::URL const& url, String const&, unsigned modifiers)
166167
{
168+
auto view_offset = QPoint(m_view.horizontalScrollBar()->value(), m_view.verticalScrollBar()->value());
169+
auto position_in_page = IntPoint_to_QPoint(position);
170+
auto position_in_view = position_in_page - view_offset;
171+
auto qurl = qurl_from_akurl(url);
172+
emit m_view.link_content_menu(position_in_view, qurl, modifiers);
167173
}
168174

169175
void PageClientLadybird::page_did_request_image_context_menu(Gfx::IntPoint const&, AK::URL const&, String const&, unsigned, Gfx::Bitmap const*)

SimpleWebView.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
#include <QCursor>
6060
#include <QIcon>
6161
#include <QLineEdit>
62+
#include <QMenu>
6263
#include <QMessageBox>
6364
#include <QMouseEvent>
6465
#include <QPaintEvent>

SimpleWebView.h

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ class SimpleWebView final : public QAbstractScrollArea {
6767
void link_hovered(QString, int timeout = 0);
6868
void link_unhovered();
6969
void load_started(const URL&);
70+
void link_content_menu(QPoint &local_position, const QUrl&, unsigned modifiers);
71+
void loadStarted(const URL&);
7072
void title_changed(QString);
7173
void favicon_changed(QIcon);
7274

Tab.cpp

+24-1
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
#include "BrowserWindow.h"
1010
#include "History.h"
1111
#include "Settings.h"
12-
#include <QCoreApplication>
12+
#include <QClipboard>
1313
#include <QFont>
1414
#include <QFontMetrics>
15+
#include <QGuiApplication>
1516
#include <QPoint>
1617
#include <QResizeEvent>
18+
#include <QUrl>
1719

1820
extern String s_serenity_resource_root;
1921
extern Browser::Settings* s_settings;
@@ -76,6 +78,27 @@ Tab::Tab(BrowserWindow* window)
7678
m_back_action->setEnabled(m_history.can_go_back());
7779
m_forward_action->setEnabled(m_history.can_go_forward());
7880
});
81+
82+
QObject::connect(m_view, &SimpleWebView::link_content_menu, [this] (QPoint &local_position, const QUrl& url, unsigned ){
83+
auto global_position = this->mapToGlobal(local_position);
84+
auto menu = QMenu();
85+
86+
auto copy_link_action = new QAction(tr("Copy Link"));
87+
auto open_link_in_tab_action = new QAction(tr("Open link in a new tab"));
88+
89+
menu.addAction(open_link_in_tab_action);
90+
menu.addAction(copy_link_action);
91+
auto res = menu.exec(global_position);
92+
93+
if (res == copy_link_action) {
94+
QClipboard *clipboard = QGuiApplication::clipboard();
95+
clipboard->setText(url.toString());
96+
qDebug() << "Copied to clipboard text:" << url.toString();
97+
} else if (res == open_link_in_tab_action){
98+
auto browser_window = static_cast<BrowserWindow*>(m_window);
99+
return browser_window->new_tab_with_url(url);
100+
}
101+
});
79102
QObject::connect(m_location_edit, &QLineEdit::returnPressed, this, &Tab::location_edit_return_pressed);
80103
QObject::connect(m_view, &SimpleWebView::title_changed, this, &Tab::page_title_changed);
81104
QObject::connect(m_view, &SimpleWebView::favicon_changed, this, &Tab::page_favicon_changed);

Utilities.cpp

+15-1
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
* SPDX-License-Identifier: BSD-2-Clause
55
*/
66

7-
#define AK_DONT_REPLACE_STD
87

98
#include "Utilities.h"
9+
#include <LibGfx/Point.h>
10+
#include <QPoint>
1011

1112
AK::String akstring_from_qstring(QString const& qstring)
1213
{
@@ -17,3 +18,16 @@ QString qstring_from_akstring(AK::String const& akstring)
1718
{
1819
return QString::fromUtf8(akstring.characters(), akstring.length());
1920
}
21+
22+
QUrl qurl_from_akurl(AK::URL const& akurl)
23+
{
24+
return QUrl(qstring_from_akstring(akurl.to_string()));
25+
}
26+
27+
QPoint IntPoint_to_QPoint(Gfx::IntPoint const& position)
28+
{
29+
auto p = QPoint();
30+
p.setX(position.x());
31+
p.setY(position.y());
32+
return p;
33+
}

Utilities.h

+7
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,15 @@
66

77
#pragma once
88

9+
#define AK_DONT_REPLACE_STD
10+
#include <AK/URL.h>
11+
#include <LibGfx/Forward.h>
912
#include <AK/String.h>
1013
#include <QString>
14+
#include <QPoint>
15+
#include <QUrl>
1116

1217
AK::String akstring_from_qstring(QString const&);
1318
QString qstring_from_akstring(AK::String const&);
19+
QUrl qurl_from_akurl(AK::URL const& akurl);
20+
QPoint IntPoint_to_QPoint(Gfx::IntPoint const& position);

0 commit comments

Comments
 (0)