summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/webview.cpp111
-rw-r--r--src/webview.h19
2 files changed, 128 insertions, 2 deletions
diff --git a/src/webview.cpp b/src/webview.cpp
index 1815e871..834ddcd9 100644
--- a/src/webview.cpp
+++ b/src/webview.cpp
@@ -52,12 +52,18 @@
#include <QtGui/QClipboard>
#include <QtGui/QKeyEvent>
#include <QtGui/QAction>
+#include <QtCore/QTimer>
WebView::WebView(QWidget* parent)
: QWebView(parent)
, m_page(new WebPage(this))
, m_progress(0)
+ , m_scrollTimer(new QTimer(this))
+ , m_scrollDirection(WebView::NoScroll)
+ , m_scrollSpeedVertical(0)
+ , m_scrollSpeedHorizontal(0)
+
{
setPage(m_page);
@@ -65,6 +71,10 @@ WebView::WebView(QWidget* parent)
connect(this, SIGNAL(loadProgress(int)), this, SLOT(slotUpdateProgress(int)));
connect(this, SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished(bool)));
connect(this, SIGNAL(selectionChanged()), this, SLOT(selectionChanged()));
+
+ connect(m_scrollTimer, SIGNAL(timeout()), this, SLOT(scrollFrameChanged()));
+ m_scrollTimer->setInterval(50);
+
}
@@ -107,6 +117,7 @@ void WebView::setStatusBarText(const QString &string)
m_statusBarText = string;
}
+
void WebView::contextMenuEvent(QContextMenuEvent *event)
{
QWebHitTestResult result = page()->mainFrame()->hitTestContent(event->pos());
@@ -329,8 +340,82 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)
}
+void WebView::stopScrollAnimation()
+{
+ m_scrollTimer->stop();
+ m_scrollSpeedVertical = 0;
+ m_scrollSpeedHorizontal = 0;
+ m_scrollDirection = WebView::NoScroll;
+}
+
+
+void WebView::startScrollAnimation(ScrollDirection direction)
+{
+ // if no scrollspeed, set the requested direction, otherwise it's just a slowdown or speedup
+ if (m_scrollSpeedVertical == 0 && (direction == WebView::Up || direction == WebView::Down))
+ m_scrollDirection |= direction;
+ if (m_scrollSpeedHorizontal == 0 && (direction == WebView::Left || direction == WebView::Right))
+ m_scrollDirection |= direction;
+
+ // update scrollspeed
+ switch (direction)
+ {
+ case WebView::Up:
+ --m_scrollSpeedVertical;
+ break;
+ case WebView::Down:
+ ++m_scrollSpeedVertical;
+ break;
+ case WebView::Left:
+ --m_scrollSpeedHorizontal;
+ break;
+ case WebView::Right:
+ ++m_scrollSpeedHorizontal;
+ break;
+ default:
+ break;
+ }
+
+ if (!m_scrollTimer->isActive())
+ m_scrollTimer->start();
+
+ return;
+}
+
+
+void WebView::scrollFrameChanged()
+{
+ // clear finished scrolling
+ if (m_scrollSpeedVertical == 0)
+ m_scrollDirection &= ~WebView::Up | ~WebView::Down;
+ if (m_scrollSpeedHorizontal == 0)
+ m_scrollDirection &= ~WebView::Left | ~WebView::Right;
+
+ // all scrolling finished
+ if (m_scrollDirection == WebView::NoScroll)
+ {
+ m_scrollTimer->stop();
+ return;
+ }
+
+ // do the scrolling
+ page()->currentFrame()->scroll(m_scrollSpeedHorizontal, m_scrollSpeedVertical);
+
+ // check if we reached the end
+ int y = page()->currentFrame()->scrollPosition().y();
+ int x = page()->currentFrame()->scrollPosition().x();
+
+ if (y == 0 || y == page()->currentFrame()->scrollBarMaximum(Qt::Vertical))
+ m_scrollSpeedVertical = 0;
+ if (x == 0 || x == page()->currentFrame()->scrollBarMaximum(Qt::Horizontal))
+ m_scrollSpeedHorizontal = 0;
+}
+
+
void WebView::mousePressEvent(QMouseEvent *event)
{
+ stopScrollAnimation();
+
m_page->m_pressedButtons = event->buttons();
m_page->m_keyboardModifiers = event->modifiers();
@@ -359,6 +444,8 @@ void WebView::mouseMoveEvent(QMouseEvent *event)
void WebView::wheelEvent(QWheelEvent *event)
{
+ stopScrollAnimation();
+
if (QApplication::keyboardModifiers() & Qt::ControlModifier)
{
int numDegrees = event->delta() / 8;
@@ -430,7 +517,6 @@ void WebView::openLinkInNewTab()
}
-// HACK short term hack: remove this function, unuseful in kdewebkit porting
void WebView::keyPressEvent(QKeyEvent *event)
{
if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_C))
@@ -438,6 +524,27 @@ void WebView::keyPressEvent(QKeyEvent *event)
triggerPageAction(QWebPage::Copy);
return;
}
+
+ if (event->modifiers() == Qt::ShiftModifier)
+ {
+ switch (event->key())
+ {
+ case Qt::Key_Down:
+ startScrollAnimation(WebView::Down);
+ return;
+ case Qt::Key_Up:
+ startScrollAnimation(WebView::Up);
+ return;
+ case Qt::Key_Left:
+ startScrollAnimation(WebView::Left);
+ return;
+ case Qt::Key_Right:
+ startScrollAnimation(WebView::Right);
+ return;
+ default:
+ break;
+ }
+ }
+
QWebView::keyPressEvent(event);
}
-
diff --git a/src/webview.h b/src/webview.h
index 3388348d..d3f58f2e 100644
--- a/src/webview.h
+++ b/src/webview.h
@@ -37,13 +37,24 @@
// Forward Declarations
class WebPage;
+class QTimer;
class WebView : public QWebView
{
Q_OBJECT
+ Q_ENUMS(ScrollDirection)
public:
+ enum ScrollDirection
+ {
+ NoScroll = 0,
+ Up = 2,
+ Down = 4,
+ Left = 6,
+ Right = 16
+ };
+
explicit WebView(QWidget *parent = 0);
~WebView();
@@ -71,10 +82,18 @@ private slots:
void openLinkInNewWindow();
void openLinkInNewTab();
+ void startScrollAnimation(ScrollDirection direction);
+ void stopScrollAnimation();
+ void scrollFrameChanged();
+
private:
WebPage *m_page;
int m_progress;
QString m_statusBarText;
+ QTimer *m_scrollTimer;
+ int m_scrollDirection;
+ int m_scrollSpeedVertical;
+ int m_scrollSpeedHorizontal;
};
#endif