From e2caa922c952b7a7c7ba25dc29de8d33843db786 Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Wed, 21 Apr 2010 19:45:13 +0200 Subject: added QWebView to the testapp --- testapp/main.cpp | 188 +++++++++++++++++++++++---------- testapp/plotwidget.cpp | 16 ++- testapp/plotwidget.h | 4 +- testapp/qscrollareakineticscroller.cpp | 18 ++-- testapp/qscrollareakineticscroller.h | 4 +- testapp/settingswidget.cpp | 123 +++++++++++++-------- testapp/settingswidget.h | 13 ++- testapp/testapp.pro | 5 +- 8 files changed, 246 insertions(+), 125 deletions(-) (limited to 'testapp') diff --git a/testapp/main.cpp b/testapp/main.cpp index 92fe4f3..c54d98d 100644 --- a/testapp/main.cpp +++ b/testapp/main.cpp @@ -2,93 +2,173 @@ #include #include #include -#include #include #include #include #include #include #include +#include +#include #ifdef Q_WS_MAEMO_5 # include #endif #include "qscrollareakineticscroller.h" +#include "qwebviewkineticscroller.h" #include "settingswidget.h" #include "plotwidget.h" -int main(int argc, char **argv) +bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event) { - QApplication a(argc, argv); - - QListWidget *list = new QListWidget(); + return QCoreApplication::sendSpontaneousEvent(receiver, event); +} - for (int i = 0; i < 1000; ++i) - new QListWidgetItem(QString("This is a test text %1 %2").arg(i).arg(QString("--------").left(i % 8)), list); +class MainWindow : public QMainWindow +{ + Q_OBJECT +public: + MainWindow(bool smallscreen) + : QMainWindow() + { + m_list = new QListWidget(); + m_list_scroller = installKineticScroller(m_list); - // remove the old kinetic scroller if any - QAbstractKineticScroller *oldScroller = list->property("kineticScroller").value(); - oldScroller->setEnabled(false); + for (int i = 0; i < 1000; ++i) + new QListWidgetItem(QString("This is a test text %1 %2").arg(i).arg(QString("--------").left(i % 8)), m_list); - // set a new kinetic scroller - QScrollAreaKineticScroller *newScroller = new QScrollAreaKineticScroller(); - newScroller->setWidget(list); + m_web = new QWebView(); + m_web_scroller = installKineticScroller(m_web); -#if defined(Q_WS_MAEMO_5) || defined(Q_WS_S60) || defined(Q_WS_WINCE) - bool smallScreen = true; -#else - bool smallScreen = false; -#endif + QTimer::singleShot(1000, this, SLOT(loadUrl())); - QWidget *settings = new SettingsWidget(newScroller, smallScreen); - QWidget *plot = new PlotWidget(newScroller); + m_settings = new SettingsWidget(smallscreen); + m_plot = new PlotWidget(smallscreen); - if (smallScreen) { - QMainWindow *top = new QMainWindow(); QStackedWidget *stack = new QStackedWidget(); - stack->addWidget(list); - stack->addWidget(settings); - stack->addWidget(plot); - top->setCentralWidget(stack); + stack->addWidget(m_list); + stack->addWidget(m_web); - QActionGroup *pages = new QActionGroup(top); + QActionGroup *pages = new QActionGroup(this); pages->setExclusive(true); - QSignalMapper *mapper = new QSignalMapper(top); - QObject::connect(mapper, SIGNAL(mapped(int)), stack, SLOT(setCurrentIndex(int))); + QSignalMapper *mapper = new QSignalMapper(this); + connect(mapper, SIGNAL(mapped(int)), stack, SLOT(setCurrentIndex(int))); + + createAction("List", pages, mapper, 0, true); + createAction("Web", pages, mapper, 1); + + if (smallscreen) { + stack->addWidget(m_settings); + stack->addWidget(m_plot); + + createAction("Settings", pages, mapper, 2); + createAction("Plot", pages, mapper, 3); + + setCentralWidget(stack); + } else { + QSplitter *split = new QSplitter(); + split->addWidget(stack); + split->addWidget(m_settings); + split->addWidget(m_plot); + setCentralWidget(split); + } + menuBar()->addMenu(QLatin1String("Pages"))->addActions(pages->actions()); + connect(stack, SIGNAL(currentChanged(int)), this, SLOT(pageChanged(int))); + pageChanged(0); + } - QAction *a = new QAction(QLatin1String("List"), pages); - a->setCheckable(true); - a->setChecked(true); - mapper->setMapping(a, 0); - QObject::connect(a, SIGNAL(toggled(bool)), mapper, SLOT(map())); +private slots: + void pageChanged(int page) + { + if (page < 0 || page > 1) + return; + switch (page) { + case 0: + m_settings->setKineticScroller(m_list_scroller); + m_plot->setKineticScroller(m_list_scroller); + break; + case 1: + m_settings->setKineticScroller(m_web_scroller); + m_plot->setKineticScroller(m_web_scroller); + break; + default: + break; + } + } - a = new QAction(QLatin1String("Config"), pages); - a->setCheckable(true); - a->setChecked(false); - a->setMenuRole(QAction::NoRole); - mapper->setMapping(a, 1); - QObject::connect(a, SIGNAL(toggled(bool)), mapper, SLOT(map())); + void loadUrl() + { + m_web->load(QUrl("http://www.heise.de")); + } - a = new QAction(QLatin1String("Plot"), pages); +private: + QAction *createAction(const char *text, QActionGroup *group, QSignalMapper *mapper, int mapping, bool checked = false) + { + QAction *a = new QAction(QLatin1String(text), group); a->setCheckable(true); - a->setChecked(false); - mapper->setMapping(a, 2); - QObject::connect(a, SIGNAL(toggled(bool)), mapper, SLOT(map())); - - top->menuBar()->addMenu("Pages")->addActions(pages->actions()); - top->showMaximized(); - } else { - QSplitter *split = new QSplitter(); - split->addWidget(list); - split->addWidget(settings); - split->addWidget(plot); - split->show(); + a->setChecked(checked); #if defined(Q_WS_MAC) - split->raise(); + a->setMenuRole(QAction::NoRole); +#endif + mapper->setMapping(a, mapping); + connect(a, SIGNAL(toggled(bool)), mapper, SLOT(map())); + return a; + } + + QKineticScroller *installKineticScroller(QWidget *w) + { +#if defined(Q_WS_MAEMO_5) + // remove the old kinetic scroller if any + QAbstractKineticScroller *oldScroller = w->property("kineticScroller").value(); + oldScroller->setEnabled(false); #endif + // set a new kinetic scroller + if (QAbstractScrollArea *area = qobject_cast(w)) { + QScrollAreaKineticScroller *newScroller = new QScrollAreaKineticScroller(); + newScroller->setWidget(area); + return newScroller; + } else if (QWebView *web = qobject_cast(w)) { + QWebViewKineticScroller *newScroller = new QWebViewKineticScroller(); + newScroller->setWidget(web); + return newScroller; + } else { + return 0; + } } +private: + QListWidget *m_list; + QWebView *m_web; + QKineticScroller *m_list_scroller, *m_web_scroller; + SettingsWidget *m_settings; + PlotWidget *m_plot; +}; + +int main(int argc, char **argv) +{ + QApplication a(argc, argv); + +#if defined(Q_WS_MAEMO_5) || defined(Q_WS_S60) || defined(Q_WS_WINCE) + bool smallscreen = true; +#else + bool smallscreen = false; +#endif + + if (a.arguments().contains(QLatin1String("--small"))) + smallscreen = true; + + MainWindow *mw = new MainWindow(smallscreen); + if (smallscreen) + mw->showMaximized(); + else + mw->show(); +#if defined(Q_WS_MAC) + mw->raise(); +#endif + return a.exec(); } + +#include "main.moc" diff --git a/testapp/plotwidget.cpp b/testapp/plotwidget.cpp index 43c179b..faab904 100644 --- a/testapp/plotwidget.cpp +++ b/testapp/plotwidget.cpp @@ -50,12 +50,10 @@ #include "plotwidget.h" #include "qkineticscroller.h" -PlotWidget::PlotWidget(QKineticScroller *scroller) - : QWidget(), m_scroller(scroller) +PlotWidget::PlotWidget(bool /*smallscreen*/) + : QWidget(), m_scroller(0) { setWindowTitle(QLatin1String("Plot")); - m_scroller->registerDebugHook(debugHook, this); - m_clear = new QPushButton(QLatin1String("Clear"), this); #if defined(Q_WS_MAEMO_5) m_clear->setStyle(new QPlastiqueStyle()); @@ -77,6 +75,16 @@ PlotWidget::PlotWidget(QKineticScroller *scroller) m_legend->setText(legend); } +void PlotWidget::setKineticScroller(QKineticScroller *scroller) +{ + if (m_scroller) + m_scroller->registerDebugHook(0, 0); + m_scroller = scroller; + reset(); + if (m_scroller) + m_scroller->registerDebugHook(debugHook, this); +} + void PlotWidget::debugHook(void *user, const QPointF &releaseVelocity, const QPointF &contentPosition, const QPointF &overshootPosition) { PlotItem pi = { releaseVelocity, contentPosition, overshootPosition }; diff --git a/testapp/plotwidget.h b/testapp/plotwidget.h index 12fefe3..42d0b7c 100644 --- a/testapp/plotwidget.h +++ b/testapp/plotwidget.h @@ -55,7 +55,9 @@ class PlotWidget : public QWidget Q_OBJECT public: - PlotWidget(QKineticScroller *scroller); + PlotWidget(bool smallscreen = false); + + void setKineticScroller(QKineticScroller *scroller); public slots: void reset(); diff --git a/testapp/qscrollareakineticscroller.cpp b/testapp/qscrollareakineticscroller.cpp index ce41610..dbe20dc 100644 --- a/testapp/qscrollareakineticscroller.cpp +++ b/testapp/qscrollareakineticscroller.cpp @@ -58,21 +58,13 @@ #include "qgraphicsview.h" #include "qgraphicsitem.h" - - #include QT_BEGIN_NAMESPACE +bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event); -bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event) -{ - return QCoreApplication::sendSpontaneousEvent(receiver, event); -} - - - -class Q_GUI_EXPORT QScrollAreaKineticScrollerPrivate +class QScrollAreaKineticScrollerPrivate { public: QScrollAreaKineticScroller *q_ptr; @@ -192,10 +184,12 @@ bool QScrollAreaKineticScroller::eventFilter(QObject *o, QEvent *e) if (te->touchPoints().count() == (idx + 1)) { res = handleInput(type, te->touchPoints().at(idx).pos() - d->lastOvershoot, timestamp); - if (type == InputPress) + if (type == InputPress) { d->touchActive = true; - else if (type == InputRelease) + e->accept(); + } else if (type == InputRelease) { d->touchActive = false; + } } break; } diff --git a/testapp/qscrollareakineticscroller.h b/testapp/qscrollareakineticscroller.h index 77b0caf..200df09 100644 --- a/testapp/qscrollareakineticscroller.h +++ b/testapp/qscrollareakineticscroller.h @@ -85,8 +85,6 @@ private: QT_END_NAMESPACE -Q_DECLARE_METATYPE(QScrollAreaKineticScroller *) - QT_END_HEADER -#endif // QKINETICSCROLLER_H +#endif // QSCROLLAREAKINETICSCROLLER_H diff --git a/testapp/settingswidget.cpp b/testapp/settingswidget.cpp index 77b5cd9..e0f5b95 100644 --- a/testapp/settingswidget.cpp +++ b/testapp/settingswidget.cpp @@ -68,8 +68,8 @@ class MetricItemUpdater : public QObject { Q_OBJECT public: - MetricItemUpdater(MetricItem *item, QKineticScroller *scroller) - : m_item(item), m_scroller(scroller) + MetricItemUpdater(MetricItem *item) + : m_item(item), m_scroller(0) { if (m_item->min.type() == QVariant::PointF) { m_slider = new QSlider(Qt::Horizontal); @@ -109,14 +109,28 @@ public: if (m_slider2) connect(m_slider2, SIGNAL(valueChanged(int)), this, SLOT(sliderChanged(int))); - m_default_value = m_scroller->scrollMetric(m_item->metric); - valueChanged(m_default_value); - m_slider->setMinimum(0); if (m_slider2) m_slider2->setMinimum(0); } + void setKineticScroller(QKineticScroller *scroller) + { + m_scroller = scroller; + m_slider->setEnabled(scroller); + if (m_slider2) + m_slider2->setEnabled(scroller); + m_nameLabel->setEnabled(scroller); + m_valueLabel->setEnabled(scroller); + m_resetButton->setEnabled(scroller); + + if (!m_scroller) + return; + + m_default_value = m_scroller->scrollMetric(m_item->metric); + valueChanged(m_default_value); + } + QWidget *nameLabel() { return m_nameLabel; } QWidget *valueLabel() { return m_valueLabel; } QWidget *valueControl() { return m_control; } @@ -173,14 +187,16 @@ private slots: default: break; } m_valueLabel->setText(text); - m_scroller->setScrollMetric(m_item->metric, m_value); + if (m_scroller) + m_scroller->setScrollMetric(m_item->metric, m_value); m_resetButton->setEnabled(m_value != m_default_value); } void reset() { - m_scroller->setScrollMetric(m_item->metric, m_value); + if (m_scroller) + m_scroller->setScrollMetric(m_item->metric, m_value); valueChanged(m_default_value); } @@ -247,19 +263,6 @@ void SettingsWidget::addToGrid(QGridLayout *grid, QWidget *label, int widgetCoun va_end(args); } -QGridLayout *SettingsWidget::createMetricsItemGrid() -{ - QGridLayout *grid = new QGridLayout(); - grid->setVerticalSpacing(m_smallscreen ? 4 : 2); - - for (int i = 0; i < QKineticScroller::ScrollMetricCount; i++) { - MetricItemUpdater *u = new MetricItemUpdater(items + i, m_scroller); - u->setParent(this); - addToGrid(grid, u->nameLabel(), 3, u->valueControl(), u->valueLabel(), u->resetButton()); - } - return grid; -} - class HackScroller : public QKineticScroller { public: using QKineticScroller::viewportSize; @@ -271,8 +274,8 @@ public: using QAbstractSpinBox::lineEdit; }; -SettingsWidget::SettingsWidget(QKineticScroller *scroller, bool smallscreen) - : QScrollArea(), m_scroller(scroller), m_smallscreen(smallscreen) +SettingsWidget::SettingsWidget(bool smallscreen) + : QScrollArea(), m_scroller(0), m_smallscreen(smallscreen) { setWindowTitle(QLatin1String("Settings")); QWidget *view = new QWidget(); @@ -283,23 +286,20 @@ SettingsWidget::SettingsWidget(QKineticScroller *scroller, bool smallscreen) grp = new QGroupBox(QLatin1String("General")); grid = new QGridLayout(); grid->setVerticalSpacing(smallscreen ? 4 : 2); - QCheckBox *onoff = new QCheckBox(QLatin1String("Enabled")); - onoff->setChecked(m_scroller->isEnabled()); - connect(onoff, SIGNAL(toggled(bool)), this, SLOT(enabledChanged(bool))); - addToGrid(grid, onoff, 0); - - QSpinBox *dpi = new QSpinBox(); - dpi->setRange(10, 1000); - dpi->setSuffix(QLatin1String(" dpi")); - dpi->setValue(m_scroller->dpi()); - connect(dpi, SIGNAL(valueChanged(int)), this, SLOT(dpiChanged(int))); - addToGrid(grid, new QLabel("DPI"), 1, dpi); + m_onoff = new QCheckBox(QLatin1String("Enabled")); + connect(m_onoff, SIGNAL(toggled(bool)), this, SLOT(enabledChanged(bool))); + addToGrid(grid, m_onoff, 0); + + m_dpi = new QSpinBox(); + m_dpi->setRange(10, 1000); + m_dpi->setSuffix(QLatin1String(" dpi")); + connect(m_dpi, SIGNAL(valueChanged(int)), this, SLOT(dpiChanged(int))); + addToGrid(grid, new QLabel("DPI"), 1, m_dpi); m_hospolicy = new QComboBox(); m_hospolicy->addItem("When Scrollable", QKineticScroller::OvershootWhenScrollable); m_hospolicy->addItem("Always On", QKineticScroller::OvershootAlwaysOn); m_hospolicy->addItem("Always Off", QKineticScroller::OvershootAlwaysOff); - m_hospolicy->setCurrentIndex(m_hospolicy->findData(m_scroller->horizontalOvershootPolicy())); connect(m_hospolicy, SIGNAL(currentIndexChanged(int)), this, SLOT(overshootPolicyChanged(int))); addToGrid(grid, new QLabel("Horizontal Overshoot Policy"), 1, m_hospolicy); @@ -307,7 +307,6 @@ SettingsWidget::SettingsWidget(QKineticScroller *scroller, bool smallscreen) m_vospolicy->addItem("When Scrollable", QKineticScroller::OvershootWhenScrollable); m_vospolicy->addItem("Always On", QKineticScroller::OvershootAlwaysOn); m_vospolicy->addItem("Always Off", QKineticScroller::OvershootAlwaysOff); - m_vospolicy->setCurrentIndex(m_vospolicy->findData(m_scroller->verticalOvershootPolicy())); connect(m_vospolicy, SIGNAL(currentIndexChanged(int)), this, SLOT(overshootPolicyChanged(int))); addToGrid(grid, new QLabel("Vertical Overshoot Policy"), 1, m_vospolicy); @@ -315,20 +314,24 @@ SettingsWidget::SettingsWidget(QKineticScroller *scroller, bool smallscreen) layout->addWidget(grp); grp = new QGroupBox(QLatin1String("Scroll Metrics")); - grp->setLayout(createMetricsItemGrid()); + grid = new QGridLayout(); + grid->setVerticalSpacing(m_smallscreen ? 4 : 2); + + for (int i = 0; i < QKineticScroller::ScrollMetricCount; i++) { + MetricItemUpdater *u = new MetricItemUpdater(items + i); + u->setParent(this); + addToGrid(grid, u->nameLabel(), 3, u->valueControl(), u->valueLabel(), u->resetButton()); + m_metrics.append(u); + } + grp->setLayout(grid); layout->addWidget(grp); grp = new QGroupBox(QLatin1String("Scroll To")); grid = new QGridLayout(); grid->setVerticalSpacing(m_smallscreen ? 4 : 2); - QSizeF vp = static_cast(m_scroller)->viewportSize(); - QPointF maxc = static_cast(m_scroller)->maximumContentPosition(); - m_scrollx = new QSpinBox(); - m_scrollx->setRange(int(-vp.width()), int(maxc.x() + vp.width())); m_scrolly = new QSpinBox(); - m_scrolly->setRange(int(-vp.height()), int(maxc.y() + vp.height())); m_scrolltime = new QSpinBox(); m_scrolltime->setRange(0, 10000); m_scrolltime->setValue(1000); @@ -363,21 +366,48 @@ SettingsWidget::SettingsWidget(QKineticScroller *scroller, bool smallscreen) setWidgetResizable(true); } +void SettingsWidget::setKineticScroller(QKineticScroller *scroller) +{ + m_scroller = scroller; + //setEnabled(m_scroller); + + QMutableListIterator it(m_metrics); + while (it.hasNext()) + it.next()->setKineticScroller(m_scroller); + + if (!m_scroller) + return; + + m_onoff->setChecked(m_scroller->isEnabled()); + m_dpi->setValue(m_scroller->dpi()); + m_hospolicy->setCurrentIndex(m_hospolicy->findData(m_scroller->horizontalOvershootPolicy())); + m_vospolicy->setCurrentIndex(m_vospolicy->findData(m_scroller->verticalOvershootPolicy())); + + + QSizeF vp = static_cast(m_scroller)->viewportSize(); + QPointF maxc = static_cast(m_scroller)->maximumContentPosition(); + + m_scrollx->setRange(int(-vp.width()), int(maxc.x() + vp.width())); + m_scrolly->setRange(int(-vp.height()), int(maxc.y() + vp.height())); +} + void SettingsWidget::enabledChanged(bool on) { - m_scroller->setEnabled(on); + if (m_scroller) + m_scroller->setEnabled(on); } void SettingsWidget::dpiChanged(int dpi) { - m_scroller->setDpi(dpi); + if (m_scroller) + m_scroller->setDpi(dpi); } void SettingsWidget::overshootPolicyChanged(int index) { - if (sender() == m_hospolicy) + if (sender() == m_hospolicy && m_scroller) m_scroller->setHorizontalOvershootPolicy(static_cast(m_hospolicy->itemData(index).toInt())); - else if (sender() == m_vospolicy) + else if (sender() == m_vospolicy && m_scroller) m_scroller->setVerticalOvershootPolicy(static_cast(m_hospolicy->itemData(index).toInt())); } @@ -389,7 +419,8 @@ void SettingsWidget::scrollTo() return; if ((sender() == m_scrolltime) && !m_scrolltime->hasFocus()) return; - + if (!m_scroller) + return; m_scroller->scrollTo(QPointF(m_scrollx->value(), m_scrolly->value()), m_scrolltime->value()); } diff --git a/testapp/settingswidget.h b/testapp/settingswidget.h index 6e05163..ec7a180 100644 --- a/testapp/settingswidget.h +++ b/testapp/settingswidget.h @@ -45,17 +45,21 @@ #include class QKineticScroller; - class QGridLayout; class QSpinBox; class QComboBox; +class QCheckBox; + +class MetricItemUpdater; class SettingsWidget : public QScrollArea { Q_OBJECT public: - SettingsWidget(QKineticScroller *scroller, bool smallscreen = false); + SettingsWidget(bool smallscreen = false); + + void setKineticScroller(QKineticScroller *scroller); private slots: void enabledChanged(bool on); @@ -64,12 +68,13 @@ private slots: void scrollTo(); private: - QGridLayout *createMetricsItemGrid(); void addToGrid(QGridLayout *grid, QWidget *label, int widgetCount, ...); QKineticScroller *m_scroller; - QSpinBox *m_scrollx, *m_scrolly, *m_scrolltime; + QCheckBox *m_onoff; + QSpinBox *m_dpi, *m_scrollx, *m_scrolly, *m_scrolltime; QComboBox *m_hospolicy, *m_vospolicy; + QList m_metrics; bool m_smallscreen; }; diff --git a/testapp/testapp.pro b/testapp/testapp.pro index a9546ff..c478231 100644 --- a/testapp/testapp.pro +++ b/testapp/testapp.pro @@ -8,10 +8,13 @@ DEPENDPATH += . ../scroller INCLUDEPATH += . ../scroller LIBS += -L../scroller -lscroller +QT += webkit + # Input -HEADERS += plotwidget.h qscrollareakineticscroller.h settingswidget.h +HEADERS += plotwidget.h qscrollareakineticscroller.h qwebviewkineticscroller.h settingswidget.h SOURCES += main.cpp \ plotwidget.cpp \ qscrollareakineticscroller.cpp \ + qwebviewkineticscroller.cpp \ settingswidget.cpp macx:LIBS += -frameworks Cocoa -- cgit v1.2.3