2011-03-03 18:29:20 +01:00
|
|
|
/* ============================================================
|
|
|
|
* QupZilla - WebKit based browser
|
2012-01-01 15:29:55 +01:00
|
|
|
* Copyright (C) 2010-2012 David Rosca <nowrep@gmail.com>
|
2011-03-03 18:29:20 +01:00
|
|
|
*
|
|
|
|
* This program 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.
|
|
|
|
*
|
|
|
|
* This program 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
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
* ============================================================ */
|
2011-03-02 16:57:41 +01:00
|
|
|
#include "webview.h"
|
|
|
|
#include "webpage.h"
|
2012-01-21 20:20:48 +01:00
|
|
|
#include "webhistorywrapper.h"
|
2011-03-02 16:57:41 +01:00
|
|
|
#include "mainapplication.h"
|
2012-01-21 20:20:48 +01:00
|
|
|
#include "globalfunctions.h"
|
2011-04-25 20:56:45 +02:00
|
|
|
#include "iconprovider.h"
|
2012-01-21 20:20:48 +01:00
|
|
|
#include "historymodel.h"
|
|
|
|
#include "autofillmodel.h"
|
|
|
|
#include "downloadmanager.h"
|
|
|
|
#include "sourceviewer.h"
|
|
|
|
#include "siteinfo.h"
|
2011-10-21 23:26:34 +02:00
|
|
|
#include "searchenginesmanager.h"
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
WebView::WebView(QWidget* parent)
|
|
|
|
: QWebView(parent)
|
2011-10-30 17:20:22 +01:00
|
|
|
, m_currentZoom(100)
|
|
|
|
, m_isLoading(false)
|
2012-01-21 20:20:48 +01:00
|
|
|
, m_progress(0)
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
connect(this, SIGNAL(loadStarted()), this, SLOT(slotLoadStarted()));
|
|
|
|
connect(this, SIGNAL(loadProgress(int)), this, SLOT(slotLoadProgress(int)));
|
|
|
|
connect(this, SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished()));
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
connect(this, SIGNAL(iconChanged()), this, SLOT(slotIconChanged()));
|
2011-10-24 17:46:45 +02:00
|
|
|
|
2011-10-29 18:37:28 +02:00
|
|
|
// Zoom levels same as in firefox
|
2011-03-02 16:57:41 +01:00
|
|
|
m_zoomLevels << 30 << 50 << 67 << 80 << 90 << 100 << 110 << 120 << 133 << 150 << 170 << 200 << 240 << 300;
|
2011-11-05 21:27:01 +01:00
|
|
|
|
|
|
|
qApp->installEventFilter(this);
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
QIcon WebView::icon() const
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
if (url().scheme() == "qupzilla") {
|
|
|
|
return QIcon(":icons/qupzilla.png");
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-07-11 20:30:49 +02:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (!QWebView::icon().isNull()) {
|
|
|
|
return QWebView::icon();
|
2011-07-11 20:30:49 +02:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (!m_siteIcon.isNull() && m_siteIconUrl.host() == url().host()) {
|
|
|
|
return m_siteIcon;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
return _iconForUrl(url());
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
QString WebView::title() const
|
2011-12-04 16:54:57 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
QString title = QWebView::title();
|
2011-12-04 16:54:57 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (title.isEmpty()) {
|
|
|
|
title = url().toString(QUrl::RemoveFragment);
|
2011-12-04 16:54:57 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (title.isEmpty() || title == "about:blank") {
|
|
|
|
return tr("No Named Page");
|
2011-12-04 16:54:57 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
return title;
|
2011-12-04 16:54:57 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
QUrl WebView::url() const
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
QUrl returnUrl = QWebView::url();
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (returnUrl.isEmpty()) {
|
|
|
|
returnUrl = m_aboutToLoadUrl;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
2011-12-20 18:58:42 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
return returnUrl;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::load(const QUrl &url)
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
if (url.scheme() == "javascript") {
|
|
|
|
page()->mainFrame()->evaluateJavaScript(url.toString());
|
2011-03-02 16:57:41 +01:00
|
|
|
return;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (isUrlValid(url)) {
|
|
|
|
QWebView::load(url);
|
|
|
|
emit urlChanged(url);
|
|
|
|
m_aboutToLoadUrl = url;
|
2011-10-15 16:37:32 +02:00
|
|
|
return;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-10-15 16:37:32 +02:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
QUrl searchUrl = mApp->searchEnginesManager()->searchUrl(url.toString());
|
|
|
|
QWebView::load(searchUrl);
|
|
|
|
emit urlChanged(searchUrl);
|
|
|
|
m_aboutToLoadUrl = searchUrl;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
bool WebView::isLoading() const
|
2011-04-04 17:03:41 +02:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
return m_isLoading;
|
2011-04-04 17:03:41 +02:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
int WebView::loadProgress() const
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
return m_progress;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
bool WebView::isUrlValid(const QUrl &url)
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
if (url.scheme() == "data" || url.scheme() == "qrc" || url.scheme() == "mailto") {
|
|
|
|
return true;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (url.scheme() == "qupzilla" || url.scheme() == "file") {
|
|
|
|
return !url.path().isEmpty();
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (url.isValid() && !url.host().isEmpty() && !url.scheme().isEmpty()) {
|
|
|
|
return true;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
2012-01-21 20:20:48 +01:00
|
|
|
|
|
|
|
return false;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
QUrl WebView::guessUrlFromString(const QString &string)
|
|
|
|
{
|
|
|
|
QString trimmedString = string.trimmed();
|
|
|
|
|
|
|
|
// Check the most common case of a valid url with scheme and host first
|
|
|
|
QUrl url = QUrl::fromEncoded(trimmedString.toUtf8(), QUrl::TolerantMode);
|
2011-11-06 17:01:23 +01:00
|
|
|
if (url.isValid() && !url.scheme().isEmpty() && !url.host().isEmpty()) {
|
2011-03-02 16:57:41 +01:00
|
|
|
return url;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
|
|
|
// Absolute files that exists
|
2011-11-06 17:01:23 +01:00
|
|
|
if (QDir::isAbsolutePath(trimmedString) && QFile::exists(trimmedString)) {
|
2011-03-02 16:57:41 +01:00
|
|
|
return QUrl::fromLocalFile(trimmedString);
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
|
|
|
// If the string is missing the scheme or the scheme is not valid prepend a scheme
|
|
|
|
QString scheme = url.scheme();
|
|
|
|
if (scheme.isEmpty() || scheme.contains(QLatin1Char('.')) || scheme == QLatin1String("localhost")) {
|
|
|
|
// Do not do anything for strings such as "foo", only "foo.com"
|
|
|
|
int dotIndex = trimmedString.indexOf(QLatin1Char('.'));
|
|
|
|
if (dotIndex != -1 || trimmedString.startsWith(QLatin1String("localhost"))) {
|
|
|
|
const QString hostscheme = trimmedString.left(dotIndex).toLower();
|
|
|
|
QByteArray scheme = (hostscheme == QLatin1String("ftp")) ? "ftp" : "http";
|
|
|
|
trimmedString = QLatin1String(scheme) + QLatin1String("://") + trimmedString;
|
|
|
|
}
|
|
|
|
url = QUrl::fromEncoded(trimmedString.toUtf8(), QUrl::TolerantMode);
|
|
|
|
}
|
|
|
|
|
2011-11-06 17:01:23 +01:00
|
|
|
if (url.isValid()) {
|
2011-03-02 16:57:41 +01:00
|
|
|
return url;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
|
|
|
return QUrl();
|
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::addNotification(QWidget* notif)
|
2011-03-03 14:25:02 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
emit showNotification(notif);
|
2011-03-03 14:25:02 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::applyZoom()
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
setZoomFactor(qreal(m_currentZoom) / 100.0);
|
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::zoomIn()
|
|
|
|
{
|
|
|
|
int i = m_zoomLevels.indexOf(m_currentZoom);
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (i < m_zoomLevels.count() - 1) {
|
|
|
|
m_currentZoom = m_zoomLevels[i + 1];
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
applyZoom();
|
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::zoomOut()
|
|
|
|
{
|
|
|
|
int i = m_zoomLevels.indexOf(m_currentZoom);
|
|
|
|
|
|
|
|
if (i > 0) {
|
|
|
|
m_currentZoom = m_zoomLevels[i - 1];
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
applyZoom();
|
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::zoomReset()
|
|
|
|
{
|
|
|
|
m_currentZoom = 100;
|
|
|
|
applyZoom();
|
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::reload()
|
|
|
|
{
|
|
|
|
if (QWebView::url().isEmpty() && !m_aboutToLoadUrl.isEmpty()) {
|
|
|
|
load(m_aboutToLoadUrl);
|
|
|
|
return;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
QWebView::reload();
|
|
|
|
}
|
2012-01-09 12:39:34 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::back()
|
|
|
|
{
|
|
|
|
QWebHistory* history = page()->history();
|
2012-01-09 12:39:34 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (WebHistoryWrapper::canGoBack(history)) {
|
|
|
|
WebHistoryWrapper::goBack(history);
|
2011-10-21 23:26:34 +02:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
emit urlChanged(url());
|
|
|
|
emit iconChanged();
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
2012-01-21 20:20:48 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::forward()
|
|
|
|
{
|
|
|
|
QWebHistory* history = page()->history();
|
|
|
|
|
|
|
|
if (WebHistoryWrapper::canGoForward(history)) {
|
|
|
|
WebHistoryWrapper::goForward(history);
|
|
|
|
|
|
|
|
emit urlChanged(url());
|
|
|
|
emit iconChanged();
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
2012-01-21 20:20:48 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::selectAll()
|
|
|
|
{
|
|
|
|
triggerPageAction(QWebPage::SelectAll);
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::slotLoadStarted()
|
2011-07-21 17:16:53 +02:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
m_isLoading = true;
|
|
|
|
m_progress = 0;
|
2011-07-21 17:16:53 +02:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::slotLoadProgress(int progress)
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
m_progress = progress;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::slotLoadFinished()
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
m_isLoading = false;
|
|
|
|
m_progress = 100;
|
|
|
|
|
|
|
|
if (m_lastUrl != url()) {
|
|
|
|
mApp->history()->addHistoryEntry(this);
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
2012-01-21 20:20:48 +01:00
|
|
|
|
|
|
|
mApp->autoFill()->completePage(qobject_cast<WebPage*>(page()));
|
|
|
|
|
|
|
|
m_lastUrl = url();
|
|
|
|
}
|
|
|
|
|
|
|
|
void WebView::slotIconChanged()
|
|
|
|
{
|
|
|
|
m_siteIcon = icon();
|
|
|
|
m_siteIconUrl = url();
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void WebView::openUrlInNewWindow()
|
|
|
|
{
|
2011-03-17 17:03:04 +01:00
|
|
|
if (QAction* action = qobject_cast<QAction*>(sender())) {
|
2012-01-21 23:19:38 +01:00
|
|
|
mApp->makeNewWindow(Qz::BW_NewWindow, action->data().toUrl());
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void WebView::sendLinkByMail()
|
|
|
|
{
|
2011-03-17 17:03:04 +01:00
|
|
|
if (QAction* action = qobject_cast<QAction*>(sender())) {
|
2011-11-06 17:01:23 +01:00
|
|
|
QDesktopServices::openUrl(QUrl("mailto:?body=" + action->data().toString()));
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void WebView::copyLinkToClipboard()
|
|
|
|
{
|
2011-03-17 17:03:04 +01:00
|
|
|
if (QAction* action = qobject_cast<QAction*>(sender())) {
|
2011-03-02 16:57:41 +01:00
|
|
|
QApplication::clipboard()->setText(action->data().toString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::downloadLinkToDisk()
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2011-03-24 22:31:38 +01:00
|
|
|
if (QAction* action = qobject_cast<QAction*>(sender())) {
|
|
|
|
DownloadManager* dManager = mApp->downManager();
|
|
|
|
QNetworkRequest request(action->data().toUrl());
|
2012-01-21 20:20:48 +01:00
|
|
|
dManager->download(request, qobject_cast<WebPage*>(page()), false);
|
2011-03-24 22:31:38 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void WebView::copyImageToClipboard()
|
|
|
|
{
|
|
|
|
triggerPageAction(QWebPage::CopyImageToClipboard);
|
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::openActionUrl()
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2011-03-17 17:03:04 +01:00
|
|
|
if (QAction* action = qobject_cast<QAction*>(sender())) {
|
2012-01-21 20:20:48 +01:00
|
|
|
load(action->data().toUrl());
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::showSource(QWebFrame* frame, const QString &selectedHtml)
|
2011-07-19 22:04:08 +02:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
if (!frame) {
|
|
|
|
frame = page()->mainFrame();
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
SourceViewer* source = new SourceViewer(frame, selectedHtml);
|
|
|
|
qz_centerWidgetToParent(source, this);
|
|
|
|
source->show();
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void WebView::showSiteInfo()
|
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
SiteInfo* s = new SiteInfo(this, this);
|
|
|
|
s->show();
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::printPage(QWebFrame* frame)
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
QPrintPreviewDialog* dialog = new QPrintPreviewDialog(this);
|
|
|
|
dialog->resize(800, 750);
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
if (!frame) {
|
|
|
|
connect(dialog, SIGNAL(paintRequested(QPrinter*)), this, SLOT(print(QPrinter*)));
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2012-01-21 20:20:48 +01:00
|
|
|
else {
|
|
|
|
connect(dialog, SIGNAL(paintRequested(QPrinter*)), frame, SLOT(print(QPrinter*)));
|
|
|
|
}
|
|
|
|
|
|
|
|
dialog->exec();
|
|
|
|
dialog->deleteLater();
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::copyText()
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
if (!selectedText().isEmpty()) {
|
|
|
|
QApplication::clipboard()->setText(selectedText());
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
QUrl WebView::lastUrl()
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
return m_lastUrl;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
|
2011-03-17 17:03:04 +01:00
|
|
|
void WebView::wheelEvent(QWheelEvent* event)
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
|
|
|
if (event->modifiers() & Qt::ControlModifier) {
|
|
|
|
int numDegrees = event->delta() / 8;
|
|
|
|
int numSteps = numDegrees / 15;
|
2011-11-06 17:01:23 +01:00
|
|
|
if (numSteps == 1) {
|
2011-03-02 16:57:41 +01:00
|
|
|
zoomIn();
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
|
|
|
else {
|
2011-03-02 16:57:41 +01:00
|
|
|
zoomOut();
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
event->accept();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
QWebView::wheelEvent(event);
|
2012-01-02 13:56:52 +01:00
|
|
|
}
|
|
|
|
|
2011-12-24 12:21:23 +01:00
|
|
|
void WebView::mousePressEvent(QMouseEvent* event)
|
|
|
|
{
|
|
|
|
switch (event->button()) {
|
|
|
|
case Qt::XButton1:
|
|
|
|
back();
|
2012-01-14 09:54:51 +01:00
|
|
|
event->accept();
|
2011-12-24 12:21:23 +01:00
|
|
|
break;
|
2012-01-21 20:20:48 +01:00
|
|
|
|
2011-12-24 12:21:23 +01:00
|
|
|
case Qt::XButton2:
|
|
|
|
forward();
|
2012-01-14 09:54:51 +01:00
|
|
|
event->accept();
|
2011-12-24 12:21:23 +01:00
|
|
|
break;
|
2012-01-21 20:20:48 +01:00
|
|
|
|
2011-12-24 12:21:23 +01:00
|
|
|
default:
|
2012-01-21 20:20:48 +01:00
|
|
|
QWebView::mousePressEvent(event);
|
2011-12-24 12:21:23 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void WebView::keyPressEvent(QKeyEvent* event)
|
|
|
|
{
|
|
|
|
switch (event->key()) {
|
|
|
|
case Qt::Key_C:
|
|
|
|
if (event->modifiers() == Qt::ControlModifier) {
|
|
|
|
copyText();
|
2012-01-14 09:54:51 +01:00
|
|
|
event->accept();
|
2011-12-24 12:21:23 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Qt::Key_A:
|
|
|
|
if (event->modifiers() == Qt::ControlModifier) {
|
|
|
|
selectAll();
|
2012-01-14 09:54:51 +01:00
|
|
|
event->accept();
|
2011-12-24 12:21:23 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
QWebView::keyPressEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void WebView::resizeEvent(QResizeEvent* event)
|
|
|
|
{
|
|
|
|
QWebView::resizeEvent(event);
|
2012-01-21 20:20:48 +01:00
|
|
|
emit viewportResized(page()->viewportSize());
|
2011-12-24 12:21:23 +01:00
|
|
|
}
|
|
|
|
|
2012-01-21 20:20:48 +01:00
|
|
|
void WebView::setZoom(int zoom)
|
2011-12-24 12:21:23 +01:00
|
|
|
{
|
2012-01-21 20:20:48 +01:00
|
|
|
m_currentZoom = zoom;
|
|
|
|
applyZoom();
|
2011-12-24 12:21:23 +01:00
|
|
|
}
|
|
|
|
|
2011-11-05 21:27:01 +01:00
|
|
|
///
|
2011-12-17 14:30:54 +01:00
|
|
|
// This function was taken and modified from QTestBrowser to fix bug #33 with flightradar24.com
|
2011-11-05 21:27:01 +01:00
|
|
|
// You can find original source and copyright here:
|
|
|
|
// http://gitorious.org/+qtwebkit-developers/webkit/qtwebkit/blobs/qtwebkit-2.2/Tools/QtTestBrowser/launcherwindow.cpp
|
|
|
|
///
|
|
|
|
bool WebView::eventFilter(QObject* obj, QEvent* event)
|
|
|
|
{
|
2011-12-24 12:21:23 +01:00
|
|
|
if (obj != this) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2011-11-05 21:27:01 +01:00
|
|
|
if (event->type() == QEvent::MouseButtonPress ||
|
2011-11-06 17:01:23 +01:00
|
|
|
event->type() == QEvent::MouseButtonRelease ||
|
|
|
|
event->type() == QEvent::MouseButtonDblClick ||
|
|
|
|
event->type() == QEvent::MouseMove) {
|
2011-11-05 21:27:01 +01:00
|
|
|
|
|
|
|
QMouseEvent* ev = static_cast<QMouseEvent*>(event);
|
|
|
|
if (ev->type() == QEvent::MouseMove
|
2011-11-06 17:01:23 +01:00
|
|
|
&& !(ev->buttons() & Qt::LeftButton)) {
|
2011-11-05 21:27:01 +01:00
|
|
|
return false;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-11-05 21:27:01 +01:00
|
|
|
|
|
|
|
QTouchEvent::TouchPoint touchPoint;
|
|
|
|
touchPoint.setState(Qt::TouchPointMoved);
|
|
|
|
if ((ev->type() == QEvent::MouseButtonPress
|
2011-11-06 17:01:23 +01:00
|
|
|
|| ev->type() == QEvent::MouseButtonDblClick)) {
|
2011-11-05 21:27:01 +01:00
|
|
|
touchPoint.setState(Qt::TouchPointPressed);
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
|
|
|
else if (ev->type() == QEvent::MouseButtonRelease) {
|
2011-11-05 21:27:01 +01:00
|
|
|
touchPoint.setState(Qt::TouchPointReleased);
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-11-05 21:27:01 +01:00
|
|
|
|
|
|
|
touchPoint.setId(0);
|
|
|
|
touchPoint.setScreenPos(ev->globalPos());
|
|
|
|
touchPoint.setPos(ev->pos());
|
|
|
|
touchPoint.setPressure(1);
|
|
|
|
|
|
|
|
// If the point already exists, update it. Otherwise create it.
|
2011-11-06 17:01:23 +01:00
|
|
|
if (m_touchPoints.size() > 0 && !m_touchPoints[0].id()) {
|
2011-11-05 21:27:01 +01:00
|
|
|
m_touchPoints[0] = touchPoint;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
|
|
|
else if (m_touchPoints.size() > 1 && !m_touchPoints[1].id()) {
|
2011-11-05 21:27:01 +01:00
|
|
|
m_touchPoints[1] = touchPoint;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
|
|
|
else {
|
2011-11-05 21:27:01 +01:00
|
|
|
m_touchPoints.append(touchPoint);
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-11-05 21:27:01 +01:00
|
|
|
|
|
|
|
if (!m_touchPoints.isEmpty()) {
|
|
|
|
QEvent::Type type = QEvent::TouchUpdate;
|
|
|
|
if (m_touchPoints.size() == 1) {
|
2011-11-06 17:01:23 +01:00
|
|
|
if (m_touchPoints[0].state() == Qt::TouchPointReleased) {
|
2011-11-05 21:27:01 +01:00
|
|
|
type = QEvent::TouchEnd;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
|
|
|
else if (m_touchPoints[0].state() == Qt::TouchPointPressed) {
|
2011-11-05 21:27:01 +01:00
|
|
|
type = QEvent::TouchBegin;
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-11-05 21:27:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
QTouchEvent touchEv(type);
|
|
|
|
touchEv.setTouchPoints(m_touchPoints);
|
|
|
|
QCoreApplication::sendEvent(page(), &touchEv);
|
|
|
|
|
|
|
|
// After sending the event, remove all touchpoints that were released
|
2011-11-06 17:01:23 +01:00
|
|
|
if (m_touchPoints[0].state() == Qt::TouchPointReleased) {
|
2011-11-05 21:27:01 +01:00
|
|
|
m_touchPoints.removeAt(0);
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
|
|
|
if (m_touchPoints.size() > 1 && m_touchPoints[1].state() == Qt::TouchPointReleased) {
|
2011-11-05 21:27:01 +01:00
|
|
|
m_touchPoints.removeAt(1);
|
2011-11-06 17:01:23 +01:00
|
|
|
}
|
2011-11-05 21:27:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2011-11-06 12:05:16 +01:00
|
|
|
|
|
|
|
return QWebView::eventFilter(obj, event);
|
2011-11-05 21:27:01 +01:00
|
|
|
}
|
|
|
|
|