Files
zeal/src/libs/ui/widgets/webview.cpp
T

176 lines
4.5 KiB
C++
Raw Normal View History

2015-08-30 23:46:15 -04:00
/****************************************************************************
**
2016-03-24 05:29:35 -04:00
** Copyright (C) 2015-2016 Oleg Shparber
2015-08-30 23:46:15 -04:00
** Copyright (C) 2013-2014 Jerzy Kozera
** Contact: https://go.zealdocs.org/l/contact
2015-08-30 23:46:15 -04:00
**
** This file is part of Zeal.
**
** Zeal is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** Zeal is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
2016-05-01 22:13:18 -04:00
** along with Zeal. If not, see <https://www.gnu.org/licenses/>.
2015-08-30 23:46:15 -04:00
**
****************************************************************************/
#include "webview.h"
2015-01-04 18:02:35 -08:00
#include "../mainwindow.h"
2017-11-25 15:19:53 +02:00
#include <core/application.h>
#include <QApplication>
#include <QWebFrame>
2017-02-17 19:58:11 -05:00
#include <QWheelEvent>
using namespace Zeal::WidgetUi;
2018-01-04 02:05:47 +02:00
WebView::WebView(QWidget *parent)
: QWebView(parent)
{
2017-11-25 15:19:53 +02:00
setAttribute(Qt::WA_AcceptTouchEvents, false);
page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks);
page()->setNetworkAccessManager(Core::Application::instance()->networkManager());
}
2017-11-18 21:02:30 +02:00
int WebView::zoomLevel() const
2015-01-06 23:15:17 -08:00
{
2017-11-18 21:02:30 +02:00
return m_zoomLevel;
2015-01-06 23:15:17 -08:00
}
2017-11-18 21:02:30 +02:00
void WebView::setZoomLevel(int level)
2015-01-06 23:15:17 -08:00
{
2017-11-18 21:02:30 +02:00
if (level == m_zoomLevel) {
return;
}
level = qMax(0, level);
level = qMin(level, availableZoomLevels().size() - 1);
m_zoomLevel = level;
setZoomFactor(availableZoomLevels().at(level) / 100.0);
emit zoomLevelChanged();
}
const QVector<int> &WebView::availableZoomLevels()
{
static const QVector<int> zoomLevels = {30, 40, 50, 67, 80, 90, 100,
110, 120, 133, 150, 170, 200,
220, 233, 250, 270, 285, 300};
return zoomLevels;
}
const int WebView::defaultZoomLevel()
{
static const int level = availableZoomLevels().indexOf(100);
return level;
}
void WebView::zoomIn()
{
setZoomLevel(m_zoomLevel + 1);
}
void WebView::zoomOut()
{
setZoomLevel(m_zoomLevel - 1);
}
void WebView::resetZoom()
{
setZoomLevel(defaultZoomLevel());
2015-01-06 23:15:17 -08:00
}
QWebView *WebView::createWindow(QWebPage::WebWindowType type)
{
Q_UNUSED(type)
MainWindow *mw = qobject_cast<MainWindow *>(qApp->activeWindow());
mw->createTab();
return this;
}
2014-11-20 15:09:25 +08:00
void WebView::mousePressEvent(QMouseEvent *event)
{
switch (event->button()) {
case Qt::BackButton:
back();
event->accept();
break;
case Qt::ForwardButton:
forward();
event->accept();
break;
case Qt::LeftButton:
if (!(event->modifiers() & Qt::ControlModifier || event->modifiers() & Qt::ShiftModifier))
break;
case Qt::MiddleButton:
m_clickedLink = clickedLink(event->pos());
if (m_clickedLink.isValid())
event->accept();
break;
default:
break;
}
QWebView::mousePressEvent(event);
}
void WebView::mouseReleaseEvent(QMouseEvent *event)
{
switch (event->button()) {
case Qt::LeftButton:
if (!(event->modifiers() & Qt::ControlModifier || event->modifiers() & Qt::ShiftModifier))
break;
case Qt::MiddleButton:
if (m_clickedLink == clickedLink(event->pos()) && m_clickedLink.isValid()) {
QWebView *webView = createWindow(QWebPage::WebBrowserWindow);
webView->load(m_clickedLink);
event->accept();
}
break;
default:
break;
}
QWebView::mouseReleaseEvent(event);
}
void WebView::wheelEvent(QWheelEvent *event)
{
2014-11-21 21:32:28 +01:00
if (event->modifiers() & Qt::ControlModifier) {
2017-11-18 21:02:30 +02:00
const QPoint angleDelta = event->angleDelta();
int delta = qAbs(angleDelta.x()) > qAbs(angleDelta.y()) ? angleDelta.x() : angleDelta.y();
const int direction = delta > 0 ? 1 : -1;
int levelDelta = 0;
while (delta * direction >= 120) {
levelDelta += direction;
delta -= 120 * direction;
}
setZoomLevel(m_zoomLevel + levelDelta);
event->accept();
return;
2014-11-20 15:09:25 +08:00
}
2017-11-18 21:02:30 +02:00
QWebView::wheelEvent(event);
2014-11-20 15:09:25 +08:00
}
2015-01-06 23:15:17 -08:00
QUrl WebView::clickedLink(const QPoint &pos) const
{
QWebFrame *frame = page()->frameAt(pos);
if (!frame)
return QUrl();
return frame->hitTestContent(pos).linkUrl();
}