From c2cf251dfe808e1a4e336dbf1cddc645d63c2e2f Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Sun, 26 Jul 2009 18:51:13 +0200 Subject: A lot of fixes here: - CTRL + click browsing - mouse wheel gestures - cleaning a bit web* classes This has been possible restoring some code from rekonq 0.1 web classes implementation. --- src/application.cpp | 2 +- src/mainview.cpp | 9 ++++++--- src/webpage.cpp | 30 ++++++++++++++++++++++++++++++ src/webpage.h | 37 +++++++++++++++++++++++++++++-------- src/webview.cpp | 17 +++++++++++++++++ src/webview.h | 2 +- 6 files changed, 84 insertions(+), 13 deletions(-) diff --git a/src/application.cpp b/src/application.cpp index 60d5ee48..cc34d946 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -97,7 +97,7 @@ int Application::newInstance() { for (int i = 0; i < args->count(); ++i) { - loadUrl(args->arg(i), Rekonq::NewTab); + loadUrl(args->arg(i), Rekonq::NewTab); } args->clear(); } diff --git a/src/mainview.cpp b/src/mainview.cpp index f059e42b..bc33c1c0 100644 --- a/src/mainview.cpp +++ b/src/mainview.cpp @@ -309,9 +309,12 @@ void MainView::slotCurrentChanged(int index) this, SIGNAL(loadProgress(int))); } - connect(webView->page(), SIGNAL(statusBarMessage(const QString&)), this, SIGNAL(showStatusBarMessage(const QString&))); - connect(webView->page(), SIGNAL(linkHovered(const QString&, const QString&, const QString&)), this, SIGNAL(linkHovered(const QString&))); - connect(webView, SIGNAL(loadProgress(int)), this, SIGNAL(loadProgress(int))); + connect(webView->page(), SIGNAL(statusBarMessage(const QString&)), + this, SIGNAL(showStatusBarMessage(const QString&))); + connect(webView->page(), SIGNAL(linkHovered(const QString&, const QString&, const QString&)), + this, SIGNAL(linkHovered(const QString&))); + connect(webView, SIGNAL(loadProgress(int)), + this, SIGNAL(loadProgress(int))); emit setCurrentTitle(webView->title()); m_urlBars->setCurrentIndex(index); diff --git a/src/webpage.cpp b/src/webpage.cpp index bb6f0d9c..771b7f04 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -73,6 +73,8 @@ WebPage::WebPage(QObject *parent) : QWebPage(parent) + , m_keyboardModifiers(Qt::NoModifier) + , m_pressedButtons(Qt::NoButton) { setForwardUnsupportedContent(true); @@ -84,6 +86,34 @@ WebPage::WebPage(QObject *parent) } +bool WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type) +{ + if (m_keyboardModifiers & Qt::ControlModifier || m_pressedButtons == Qt::MidButton) + { + Application::instance()->loadUrl(request.url(), Rekonq::NewTab); + m_keyboardModifiers = Qt::NoModifier; + m_pressedButtons = Qt::NoButton; + return false; + } + + if (frame == mainFrame()) + { + return QWebPage::acceptNavigationRequest(frame, request, type); + } + else + { + // if frame doesn't exists (perhaps) we are pointing to a blank target.. + if (!frame) + { + Application::instance()->loadUrl(request.url(), Rekonq::NewTab); + return false; + } + } + + return QWebPage::acceptNavigationRequest(frame, request, type); +} + + WebPage *WebPage::createWindow(QWebPage::WebWindowType type) { kDebug() << "WebPage createWindow slot"; diff --git a/src/webpage.h b/src/webpage.h index cdfb8f00..6a74c7bf 100644 --- a/src/webpage.h +++ b/src/webpage.h @@ -50,21 +50,42 @@ public slots: protected: WebPage *createWindow(WebWindowType type); virtual WebPage *newWindow(WebWindowType type); - - QString chooseFile(QWebFrame *frame, const QString &suggestedFile); - void javaScriptAlert(QWebFrame *frame, const QString &msg); - bool javaScriptConfirm(QWebFrame *frame, const QString &msg); - bool javaScriptPrompt(QWebFrame *frame, const QString &msg, const QString &defaultValue, QString *result); + virtual bool acceptNavigationRequest(QWebFrame *frame, + const QNetworkRequest &request, + NavigationType type); + + QString chooseFile(QWebFrame *frame, + const QString &suggestedFile); + + void javaScriptAlert(QWebFrame *frame, + const QString &msg); + + bool javaScriptConfirm(QWebFrame *frame, + const QString &msg); + + bool javaScriptPrompt(QWebFrame *frame, + const QString &msg, + const QString &defaultValue, QString *result); + + QObject *createPlugin(const QString &classId, + const QUrl &url, + const QStringList ¶mNames, + const QStringList ¶mValues); - QObject *createPlugin(const QString &classId, const QUrl &url, const QStringList ¶mNames, const QStringList ¶mValues); - -protected Q_SLOTS: + +protected Q_SLOTS: virtual void slotHandleUnsupportedContent(QNetworkReply *reply); virtual void slotDownloadRequested(const QNetworkRequest &request); private: + friend class WebView; + void viewErrorPage(QNetworkReply *); + + // keyboard/mouse modifiers + Qt::KeyboardModifiers m_keyboardModifiers; + Qt::MouseButtons m_pressedButtons; }; #endif diff --git a/src/webview.cpp b/src/webview.cpp index f001f664..e39cdacb 100644 --- a/src/webview.cpp +++ b/src/webview.cpp @@ -298,6 +298,9 @@ void WebView::keyPressEvent(QKeyEvent *event) void WebView::mousePressEvent(QMouseEvent *event) { + m_page->m_pressedButtons = event->buttons(); + m_page->m_keyboardModifiers = event->modifiers(); + switch(event->button()) { case Qt::XButton1: @@ -312,6 +315,20 @@ void WebView::mousePressEvent(QMouseEvent *event) } +void WebView::wheelEvent(QWheelEvent *event) +{ + if (QApplication::keyboardModifiers() & Qt::ControlModifier) + { + int numDegrees = event->delta() / 8; + int numSteps = numDegrees / 15; + setTextSizeMultiplier(textSizeMultiplier() + numSteps * 0.1); + event->accept(); + return; + } + QWebView::wheelEvent(event); +} + + void WebView::slotGooWikiSearch() { KAction *a = qobject_cast(sender()); diff --git a/src/webview.h b/src/webview.h index ea80ef1a..ffdc874c 100644 --- a/src/webview.h +++ b/src/webview.h @@ -58,8 +58,8 @@ protected: * to make switch tab */ void keyPressEvent(QKeyEvent *event); + void wheelEvent(QWheelEvent *event); - private slots: void setProgress(int progress); void loadFinished(); -- cgit v1.2.1