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

Commit 353c900

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 9db8c19 commit 353c900

8 files changed

+64
-3
lines changed

BrowserWindow.cpp

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

238238
void BrowserWindow::new_tab()
239+
{
240+
new_tab_with_url(QUrl());
241+
}
242+
243+
void BrowserWindow::new_tab_with_url(const QUrl &url)
239244
{
240245
auto tab = make<Tab>(this);
241246
auto tab_ptr = tab.ptr();
247+
if (!url.isEmpty())
248+
tab->navigate(url.toString());
242249
m_tabs.append(std::move(tab));
243250

244251
if (m_current_tab == nullptr) {

BrowserWindow.h

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

PageClientLadybird.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "WebView.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>
@@ -157,8 +158,13 @@ void PageClientLadybird::page_did_request_context_menu(Gfx::IntPoint const&)
157158
{
158159
}
159160

160-
void PageClientLadybird::page_did_request_link_context_menu(Gfx::IntPoint const&, AK::URL const&, String const&, unsigned)
161+
void PageClientLadybird::page_did_request_link_context_menu(Gfx::IntPoint const& position, AK::URL const& url, String const&, unsigned modifiers)
161162
{
163+
auto view_offset = QPoint(m_view.horizontalScrollBar()->value(), m_view.verticalScrollBar()->value());
164+
auto position_in_page = IntPoint_to_QPoint(position);
165+
auto position_in_view = position_in_page - view_offset;
166+
auto qurl = qurl_from_akurl(url);
167+
emit m_view.link_content_menu(position_in_view, qurl, modifiers);
162168
}
163169

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

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(QMainWindow* 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, &WebView::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, &WebView::title_changed, this, &Tab::page_title_changed);
81104
QObject::connect(m_view, &WebView::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);

WebView.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
#include <QCursor>
5858
#include <QIcon>
5959
#include <QLineEdit>
60+
#include <QMenu>
6061
#include <QMessageBox>
6162
#include <QMouseEvent>
6263
#include <QPaintEvent>

WebView.h

+2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class WebView final : public QAbstractScrollArea {
6363
void link_hovered(QString, int timeout = 0);
6464
void link_unhovered();
6565
void load_started(const URL&);
66+
void link_content_menu(QPoint &local_position, const QUrl&, unsigned modifiers);
67+
void loadStarted(const URL&);
6668
void title_changed(QString);
6769
void favicon_changed(QIcon);
6870

0 commit comments

Comments
 (0)