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

Commit 9d27920

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 db88d39 commit 9d27920

File tree

5 files changed

+53
-2
lines changed

5 files changed

+53
-2
lines changed

BrowserWindow.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,16 @@ void BrowserWindow::debug_request(String const& request, String const& argument)
195195
}
196196

197197
void BrowserWindow::new_tab()
198+
{
199+
new_tab_with_url(QUrl());
200+
}
201+
202+
void BrowserWindow::new_tab_with_url(const QUrl &url)
198203
{
199204
auto tab = make<Tab>(this);
200205
auto tab_ptr = tab.ptr();
206+
if (!url.isEmpty())
207+
tab->navigate(url.toString());
201208
m_tabs.append(std::move(tab));
202209

203210
if (m_current_tab == nullptr) {

BrowserWindow.h

Lines changed: 1 addition & 0 deletions
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

Tab.cpp

Lines changed: 24 additions & 1 deletion
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;
@@ -71,6 +73,27 @@ Tab::Tab(QMainWindow* window)
7173
m_location_edit->setText(url.to_string().characters());
7274
m_history.push(url, m_title.toUtf8().data());
7375
});
76+
77+
QObject::connect(m_view, &WebView::linkContentMenu, [this] (QPoint &localPosition, const QUrl& url, unsigned ){
78+
auto global_position = this->mapToGlobal(localPosition);
79+
auto menu = QMenu();
80+
81+
auto copyLinkAction = new QAction(tr("Copy Link"));
82+
auto openLinkInTabAction = new QAction(tr("Open link in a new tab"));
83+
84+
menu.addAction(copyLinkAction);
85+
menu.addAction(openLinkInTabAction);
86+
auto res = menu.exec(global_position);
87+
88+
if (res == copyLinkAction) {
89+
QClipboard *clipboard = QGuiApplication::clipboard();
90+
clipboard->setText(url.toString());
91+
qDebug() << "Copied to clipboard text:" << url.toString();
92+
} else if (res == openLinkInTabAction){
93+
auto browser_window = static_cast<BrowserWindow*>(m_window);
94+
return browser_window->new_tab_with_url(url);
95+
}
96+
});
7497
QObject::connect(m_location_edit, &QLineEdit::returnPressed, this, &Tab::location_edit_return_pressed);
7598
QObject::connect(m_view, &WebView::title_changed, this, &Tab::page_title_changed);
7699
QObject::connect(m_view, &WebView::favicon_changed, this, &Tab::page_favicon_changed);

WebView.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,14 @@
5757
#include <QCursor>
5858
#include <QIcon>
5959
#include <QLineEdit>
60+
#include <QMenu>
6061
#include <QMessageBox>
6162
#include <QMouseEvent>
6263
#include <QPaintEvent>
6364
#include <QPainter>
6465
#include <QScrollBar>
6566
#include <QTextEdit>
67+
#include <QToolTip>
6668
#include <QVBoxLayout>
6769

6870
AK::String akstring_from_qstring(QString const& qstring)
@@ -75,6 +77,11 @@ QString qstring_from_akstring(AK::String const& akstring)
7577
return QString::fromUtf8(akstring.characters(), akstring.length());
7678
}
7779

80+
QUrl qurl_from_akurl(AK::URL const& akurl)
81+
{
82+
return QUrl(qstring_from_akstring(akurl.to_string()));
83+
}
84+
7885
String s_serenity_resource_root = [] {
7986
auto const* source_dir = getenv("SERENITY_SOURCE_DIR");
8087
if (source_dir) {
@@ -219,8 +226,20 @@ class HeadlessBrowserPageClient final : public Web::PageClient {
219226
{
220227
}
221228

222-
virtual void page_did_request_link_context_menu(Gfx::IntPoint const&, AK::URL const&, String const&, unsigned) override
229+
QPoint IntPoint_to_QPoint(Gfx::IntPoint const& position){
230+
auto p = QPoint();
231+
p.setX(position.x());
232+
p.setY(position.y());
233+
return p;
234+
}
235+
236+
virtual void page_did_request_link_context_menu(Gfx::IntPoint const& position, AK::URL const &url, AK::String const&, unsigned modifiers) override
223237
{
238+
auto view_offset = QPoint(m_view.horizontalScrollBar()->value(), m_view.verticalScrollBar()->value());
239+
auto position_in_page = IntPoint_to_QPoint(position);
240+
auto position_in_view = position_in_page - view_offset;
241+
auto qurl = qurl_from_akurl(url);
242+
emit m_view.linkContentMenu(position_in_view, qurl, modifiers);
224243
}
225244

226245
virtual void page_did_request_image_context_menu(Gfx::IntPoint const&, AK::URL const&, String const&, unsigned, Gfx::Bitmap const*) override

WebView.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class WebView final : public QAbstractScrollArea {
4949
signals:
5050
void linkHovered(QString, int timeout = 0);
5151
void linkUnhovered();
52+
void linkContentMenu(QPoint &localPosition, const QUrl&, unsigned modifiers);
5253
void loadStarted(const URL&);
5354
void title_changed(QString);
5455
void favicon_changed(QIcon);

0 commit comments

Comments
 (0)