I'm still looking for some icon. For now, only red square is shown.remotes/origin/falkon
parent
22e195b621
commit
e5240bcc8e
8 changed files with 519 additions and 0 deletions
@ -0,0 +1,15 @@ |
|||||||
|
TARGET = $$qtLibraryTarget(AutoScroll) |
||||||
|
# OS/2 allows only 8 chars in TARGET |
||||||
|
os2: TARGET = AutoScrl |
||||||
|
|
||||||
|
SOURCES += autoscrollplugin.cpp \ |
||||||
|
autoscroller.cpp \ |
||||||
|
framescroller.cpp |
||||||
|
|
||||||
|
HEADERS += autoscrollplugin.h \ |
||||||
|
autoscroller.h \ |
||||||
|
framescroller.h |
||||||
|
|
||||||
|
RESOURCES += autoscroll.qrc |
||||||
|
|
||||||
|
include(../../plugins.pri) |
||||||
@ -0,0 +1,4 @@ |
|||||||
|
<RCC> |
||||||
|
<qresource prefix="/autoscroll"> |
||||||
|
</qresource> |
||||||
|
</RCC> |
||||||
@ -0,0 +1,179 @@ |
|||||||
|
/* ============================================================
|
||||||
|
* QupZilla - WebKit based browser |
||||||
|
* Copyright (C) 2014 David Rosca <nowrep@gmail.com> |
||||||
|
* |
||||||
|
* 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/>.
|
||||||
|
* ============================================================ */ |
||||||
|
#include "autoscroller.h" |
||||||
|
#include "framescroller.h" |
||||||
|
#include "webview.h" |
||||||
|
#include "webpage.h" |
||||||
|
|
||||||
|
#include <QMouseEvent> |
||||||
|
#include <QWebFrame> |
||||||
|
#include <QLabel> |
||||||
|
#include <QDebug> |
||||||
|
|
||||||
|
AutoScroller::AutoScroller(const QString &settings, QObject* parent) |
||||||
|
: QObject(parent) |
||||||
|
, m_view(0) |
||||||
|
{ |
||||||
|
Q_UNUSED(settings) |
||||||
|
|
||||||
|
m_indicator = new QLabel; |
||||||
|
m_indicator->resize(30, 30); |
||||||
|
m_indicator->setStyleSheet("QLabel{background-color: red;}"); |
||||||
|
m_indicator->installEventFilter(this); |
||||||
|
|
||||||
|
m_frameScroller = new FrameScroller(this); |
||||||
|
} |
||||||
|
|
||||||
|
bool AutoScroller::mouseMove(QObject* obj, QMouseEvent* event) |
||||||
|
{ |
||||||
|
Q_UNUSED(obj) |
||||||
|
|
||||||
|
if (m_indicator->isVisible()) { |
||||||
|
QRect rect = indicatorGlobalRect(); |
||||||
|
int xlength = 0; |
||||||
|
int ylength = 0; |
||||||
|
|
||||||
|
if (rect.left() > event->globalPos().x()) { |
||||||
|
xlength = event->globalPos().x() - rect.left(); |
||||||
|
} |
||||||
|
else if (rect.right() < event->globalPos().x()) { |
||||||
|
xlength = event->globalPos().x() - rect.right(); |
||||||
|
} |
||||||
|
if (rect.top() > event->globalPos().y()) { |
||||||
|
ylength = event->globalPos().y() - rect.top(); |
||||||
|
} |
||||||
|
else if (rect.bottom() < event->globalPos().y()) { |
||||||
|
ylength = event->globalPos().y() - rect.bottom(); |
||||||
|
} |
||||||
|
|
||||||
|
m_frameScroller->startScrolling(xlength, ylength); |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool AutoScroller::mousePress(QObject* obj, QMouseEvent* event) |
||||||
|
{ |
||||||
|
bool middleButton = event->buttons() == Qt::MiddleButton; |
||||||
|
WebView* view = qobject_cast<WebView*>(obj); |
||||||
|
Q_ASSERT(view); |
||||||
|
|
||||||
|
// Start?
|
||||||
|
if (m_view != view && middleButton) { |
||||||
|
return showIndicator(view, event->pos()); |
||||||
|
} |
||||||
|
else if (!m_indicator->isVisible() && middleButton) { |
||||||
|
return showIndicator(view, event->pos()); |
||||||
|
} |
||||||
|
|
||||||
|
// Stop
|
||||||
|
if (m_indicator->isVisible()) { |
||||||
|
stopScrolling(); |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool AutoScroller::mouseRelease(QObject* obj, QMouseEvent* event) |
||||||
|
{ |
||||||
|
Q_UNUSED(obj) |
||||||
|
|
||||||
|
if (m_indicator->isVisible()) { |
||||||
|
if (!indicatorGlobalRect().contains(event->globalPos())) { |
||||||
|
stopScrolling(); |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool AutoScroller::eventFilter(QObject* obj, QEvent* event) |
||||||
|
{ |
||||||
|
if (obj == m_indicator) { |
||||||
|
switch (event->type()) { |
||||||
|
case QEvent::Enter: |
||||||
|
m_frameScroller->stopScrolling(); |
||||||
|
break; |
||||||
|
|
||||||
|
case QEvent::Wheel: |
||||||
|
case QEvent::Hide: |
||||||
|
case QEvent::MouseButtonPress: |
||||||
|
stopScrolling(); |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool AutoScroller::showIndicator(WebView* view, const QPoint &pos) |
||||||
|
{ |
||||||
|
QWebFrame* frame = view->page()->frameAt(pos); |
||||||
|
|
||||||
|
if (!frame) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
const QWebHitTestResult res = frame->hitTestContent(pos); |
||||||
|
|
||||||
|
if (res.isContentEditable() || !res.linkUrl().isEmpty()) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool vertical = frame->scrollBarGeometry(Qt::Vertical).isValid(); |
||||||
|
bool horizontal = frame->scrollBarGeometry(Qt::Horizontal).isValid(); |
||||||
|
|
||||||
|
if (!vertical && !horizontal) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
m_view = view; |
||||||
|
|
||||||
|
QPoint p; |
||||||
|
p.setX(pos.x() - m_indicator->width() / 2); |
||||||
|
p.setY(pos.y() - m_indicator->height() / 2); |
||||||
|
|
||||||
|
m_indicator->setParent(view->parentWidget()); |
||||||
|
m_indicator->move(p); |
||||||
|
m_indicator->show(); |
||||||
|
|
||||||
|
m_frameScroller->setFrame(frame); |
||||||
|
|
||||||
|
m_view->grabMouse(); |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
void AutoScroller::stopScrolling() |
||||||
|
{ |
||||||
|
m_view->releaseMouse(); |
||||||
|
|
||||||
|
m_indicator->hide(); |
||||||
|
m_indicator->setParent(0); |
||||||
|
m_frameScroller->stopScrolling(); |
||||||
|
} |
||||||
|
|
||||||
|
QRect AutoScroller::indicatorGlobalRect() const |
||||||
|
{ |
||||||
|
QPoint pos = m_indicator->parentWidget()->mapToGlobal(m_indicator->geometry().topLeft()); |
||||||
|
return QRect(pos.x(), pos.y(), m_indicator->width(), m_indicator->height()); |
||||||
|
} |
||||||
@ -0,0 +1,54 @@ |
|||||||
|
/* ============================================================
|
||||||
|
* QupZilla - WebKit based browser |
||||||
|
* Copyright (C) 2014 David Rosca <nowrep@gmail.com> |
||||||
|
* |
||||||
|
* 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/>.
|
||||||
|
* ============================================================ */ |
||||||
|
#ifndef AUTOSCROLLER_H |
||||||
|
#define AUTOSCROLLER_H |
||||||
|
|
||||||
|
#include <QObject> |
||||||
|
#include <QPoint> |
||||||
|
|
||||||
|
class QMouseEvent; |
||||||
|
class QLabel; |
||||||
|
class QRect; |
||||||
|
|
||||||
|
class WebView; |
||||||
|
class FrameScroller; |
||||||
|
|
||||||
|
class AutoScroller : public QObject |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
public: |
||||||
|
explicit AutoScroller(const QString &settings, QObject* parent = 0); |
||||||
|
|
||||||
|
bool mouseMove(QObject* obj, QMouseEvent* event); |
||||||
|
bool mousePress(QObject* obj, QMouseEvent* event); |
||||||
|
bool mouseRelease(QObject* obj, QMouseEvent* event); |
||||||
|
|
||||||
|
private: |
||||||
|
bool eventFilter(QObject* obj, QEvent* event); |
||||||
|
|
||||||
|
bool showIndicator(WebView* view, const QPoint &pos); |
||||||
|
void stopScrolling(); |
||||||
|
|
||||||
|
QRect indicatorGlobalRect() const; |
||||||
|
|
||||||
|
WebView* m_view; |
||||||
|
QLabel* m_indicator; |
||||||
|
FrameScroller* m_frameScroller; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // AUTOSCROLLER_H
|
||||||
@ -0,0 +1,103 @@ |
|||||||
|
/* ============================================================
|
||||||
|
* QupZilla - WebKit based browser |
||||||
|
* Copyright (C) 2014 David Rosca <nowrep@gmail.com> |
||||||
|
* |
||||||
|
* 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/>.
|
||||||
|
* ============================================================ */ |
||||||
|
#include "autoscrollplugin.h" |
||||||
|
#include "autoscroller.h" |
||||||
|
#include "qupzilla.h" |
||||||
|
#include "pluginproxy.h" |
||||||
|
#include "mainapplication.h" |
||||||
|
|
||||||
|
#include <QTranslator> |
||||||
|
|
||||||
|
AutoScrollPlugin::AutoScrollPlugin() |
||||||
|
: QObject() |
||||||
|
, m_scroller(0) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
PluginSpec AutoScrollPlugin::pluginSpec() |
||||||
|
{ |
||||||
|
PluginSpec spec; |
||||||
|
spec.name = "AutoScroll"; |
||||||
|
spec.info = "AutoScroll plugin"; |
||||||
|
spec.description = "Provides support for autoscroll with middle mouse button"; |
||||||
|
spec.version = "0.1.0"; |
||||||
|
spec.author = "David Rosca <nowrep@gmail.com>"; |
||||||
|
spec.icon = QPixmap(":/autoscroll/data/icon.png"); |
||||||
|
spec.hasSettings = false; |
||||||
|
|
||||||
|
return spec; |
||||||
|
} |
||||||
|
|
||||||
|
void AutoScrollPlugin::init(InitState state, const QString &settingsPath) |
||||||
|
{ |
||||||
|
Q_UNUSED(state) |
||||||
|
|
||||||
|
m_scroller = new AutoScroller(settingsPath, this); |
||||||
|
|
||||||
|
QZ_REGISTER_EVENT_HANDLER(PluginProxy::MouseMoveHandler); |
||||||
|
QZ_REGISTER_EVENT_HANDLER(PluginProxy::MousePressHandler); |
||||||
|
QZ_REGISTER_EVENT_HANDLER(PluginProxy::MouseReleaseHandler); |
||||||
|
} |
||||||
|
|
||||||
|
void AutoScrollPlugin::unload() |
||||||
|
{ |
||||||
|
m_scroller->deleteLater(); |
||||||
|
} |
||||||
|
|
||||||
|
bool AutoScrollPlugin::testPlugin() |
||||||
|
{ |
||||||
|
return (QupZilla::VERSION == QLatin1String("1.7.0")); |
||||||
|
} |
||||||
|
|
||||||
|
QTranslator* AutoScrollPlugin::getTranslator(const QString &locale) |
||||||
|
{ |
||||||
|
QTranslator* translator = new QTranslator(this); |
||||||
|
translator->load(locale, ":/autoscroll/locale/"); |
||||||
|
return translator; |
||||||
|
} |
||||||
|
|
||||||
|
bool AutoScrollPlugin::mouseMove(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event) |
||||||
|
{ |
||||||
|
if (type == Qz::ON_WebView) { |
||||||
|
return m_scroller->mouseMove(obj, event); |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool AutoScrollPlugin::mousePress(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event) |
||||||
|
{ |
||||||
|
if (type == Qz::ON_WebView) { |
||||||
|
return m_scroller->mousePress(obj, event); |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool AutoScrollPlugin::mouseRelease(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event) |
||||||
|
{ |
||||||
|
if (type == Qz::ON_WebView) { |
||||||
|
return m_scroller->mouseRelease(obj, event); |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
#if QT_VERSION < 0x050000 |
||||||
|
Q_EXPORT_PLUGIN2(AutoScroll, AutoScrollPlugin) |
||||||
|
#endif |
||||||
@ -0,0 +1,52 @@ |
|||||||
|
/* ============================================================
|
||||||
|
* QupZilla - WebKit based browser |
||||||
|
* Copyright (C) 2014 David Rosca <nowrep@gmail.com> |
||||||
|
* |
||||||
|
* 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/>.
|
||||||
|
* ============================================================ */ |
||||||
|
#ifndef AUTOSCROLLPLUGIN_H |
||||||
|
#define AUTOSCROLLPLUGIN_H |
||||||
|
|
||||||
|
#include "plugininterface.h" |
||||||
|
|
||||||
|
class AutoScroller; |
||||||
|
|
||||||
|
class AutoScrollPlugin : public QObject, public PluginInterface |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
Q_INTERFACES(PluginInterface) |
||||||
|
|
||||||
|
#if QT_VERSION >= 0x050000 |
||||||
|
Q_PLUGIN_METADATA(IID "QupZilla.Browser.plugin.TestPlugin") |
||||||
|
#endif |
||||||
|
|
||||||
|
public: |
||||||
|
explicit AutoScrollPlugin(); |
||||||
|
PluginSpec pluginSpec(); |
||||||
|
|
||||||
|
void init(InitState state, const QString &settingsPath); |
||||||
|
void unload(); |
||||||
|
bool testPlugin(); |
||||||
|
|
||||||
|
QTranslator* getTranslator(const QString &locale); |
||||||
|
|
||||||
|
bool mouseMove(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event); |
||||||
|
bool mousePress(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event); |
||||||
|
bool mouseRelease(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event); |
||||||
|
|
||||||
|
private: |
||||||
|
AutoScroller* m_scroller; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // TESTPLUGIN_H
|
||||||
@ -0,0 +1,63 @@ |
|||||||
|
/* ============================================================
|
||||||
|
* QupZilla - WebKit based browser |
||||||
|
* Copyright (C) 2014 David Rosca <nowrep@gmail.com> |
||||||
|
* |
||||||
|
* 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/>.
|
||||||
|
* ============================================================ */ |
||||||
|
#include "framescroller.h" |
||||||
|
|
||||||
|
#include <QTimer> |
||||||
|
#include <QWebFrame> |
||||||
|
#include <QtCore/qmath.h> |
||||||
|
|
||||||
|
FrameScroller::FrameScroller(QObject* parent) |
||||||
|
: QObject(parent) |
||||||
|
, m_frame(0) |
||||||
|
, m_lengthX(0) |
||||||
|
, m_lengthY(0) |
||||||
|
{ |
||||||
|
m_timer = new QTimer(this); |
||||||
|
m_timer->setInterval(20); |
||||||
|
connect(m_timer, SIGNAL(timeout()), this, SLOT(scrollStep())); |
||||||
|
} |
||||||
|
|
||||||
|
void FrameScroller::setFrame(QWebFrame* frame) |
||||||
|
{ |
||||||
|
m_frame = frame; |
||||||
|
} |
||||||
|
|
||||||
|
void FrameScroller::startScrolling(int lengthX, int lengthY) |
||||||
|
{ |
||||||
|
Q_ASSERT(m_frame); |
||||||
|
|
||||||
|
m_lengthX = lengthX; |
||||||
|
m_lengthY = lengthY; |
||||||
|
|
||||||
|
if (m_lengthX == 0 && m_lengthY == 0) { |
||||||
|
m_timer->stop(); |
||||||
|
} |
||||||
|
else if (!m_timer->isActive()) { |
||||||
|
m_timer->start(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void FrameScroller::stopScrolling() |
||||||
|
{ |
||||||
|
m_timer->stop(); |
||||||
|
} |
||||||
|
|
||||||
|
void FrameScroller::scrollStep() |
||||||
|
{ |
||||||
|
m_frame->scroll(qCeil(m_lengthX / 8.0), qCeil(m_lengthY / 8.0)); |
||||||
|
} |
||||||
@ -0,0 +1,49 @@ |
|||||||
|
/* ============================================================
|
||||||
|
* QupZilla - WebKit based browser |
||||||
|
* Copyright (C) 2014 David Rosca <nowrep@gmail.com> |
||||||
|
* |
||||||
|
* 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/>.
|
||||||
|
* ============================================================ */ |
||||||
|
#ifndef FRAMESCROLLER_H |
||||||
|
#define FRAMESCROLLER_H |
||||||
|
|
||||||
|
#include <QObject> |
||||||
|
|
||||||
|
class QTimer; |
||||||
|
class QWebFrame; |
||||||
|
|
||||||
|
class FrameScroller : public QObject |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
explicit FrameScroller(QObject* parent = 0); |
||||||
|
|
||||||
|
void setFrame(QWebFrame* frame); |
||||||
|
|
||||||
|
void startScrolling(int lengthX, int lengthY); |
||||||
|
void stopScrolling(); |
||||||
|
|
||||||
|
private slots: |
||||||
|
void scrollStep(); |
||||||
|
|
||||||
|
private: |
||||||
|
QWebFrame* m_frame; |
||||||
|
QTimer* m_timer; |
||||||
|
|
||||||
|
int m_lengthX; |
||||||
|
int m_lengthY; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // FRAMESCROLLER_H
|
||||||
Loading…
Reference in new issue