3 #include <QDesktopServices>
6 #include "contentwindow.h"
8 /* Got ViewportItem and GraphicsView from maemobrowser in the qt examples. The
9 * whole point of this is to get a finger friendly web widget */
11 class ViewportItem : public QGraphicsWidget, public QAbstractKineticScroller {
15 ViewportItem() : QGraphicsWidget(), QAbstractKineticScroller(), m_widget(0), m_ignoreEvents(false) {
16 setFlag(QGraphicsItem::ItemHasNoContents, true);
17 setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
18 setFlag(QGraphicsItem::ItemClipsToShape, true);
19 setAttribute(Qt::WA_OpaquePaintEvent, true);
20 setFiltersChildEvents(true);
23 void setWidget(QGraphicsWidget *widget) {
25 m_widget->setParentItem(0);
30 m_widget->setParentItem(this);
31 m_widget->setAttribute(Qt::WA_OpaquePaintEvent, true);
33 if (qgraphicsitem_cast<QGraphicsWebView *>(m_widget)) {
34 connect(m_widget, SIGNAL(loadProgress(int)), this, SLOT(resizeWebViewToFrame()));
35 connect(m_widget, SIGNAL(loadFinished(bool)), this, SLOT(resizeWebViewToFrame()));
36 resizeWebViewToFrame();
42 bool sceneEventFilter(QGraphicsItem *i, QEvent *e) {
44 if (i && (i == m_widget) && !m_ignoreEvents && m_widget->isEnabled()) {
46 case QEvent::GraphicsSceneMousePress:
47 case QEvent::GraphicsSceneMouseMove:
48 case QEvent::GraphicsSceneMouseRelease:
49 /*case QEvent::GraphicsSceneMouseDoubleClick:*/ {
50 res = handleMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
57 // prevent text selection and image dragging
58 if (e->type() == QEvent::GraphicsSceneMouseMove)
60 return res ? true : QGraphicsWidget::sceneEventFilter(i, e);
63 QSize viewportSize() const {
64 return size().toSize();
67 QPoint maximumScrollPosition() const {
68 QSizeF s = m_widget ? m_widget->size() - size() : QSize(0, 0);
69 return QPoint(qMax(0, int(s.width())), qMax(0, int(s.height())));
72 QPoint scrollPosition() const {
73 return m_widget ? -m_widget->pos().toPoint() + m_overShoot : QPoint();
76 void setScrollPosition(const QPoint &p, const QPoint &overShoot) {
77 m_overShoot = overShoot;
79 m_widget->setPos(-p + m_overShoot);
82 void cancelLeftMouseButtonPress(const QPoint & /*globalPressPos*/) {
85 void sendEvent(QGraphicsItem *i, QEvent *e) {
86 m_ignoreEvents = true;
87 scene()->sendEvent(i, e);
88 m_ignoreEvents = false;
92 void resizeWebViewToFrame() {
93 if (QGraphicsWebView *view = qgraphicsitem_cast<QGraphicsWebView *>(m_widget)) {
94 if (view->page() && view->page()->mainFrame()) {
95 QSizeF s = view->page()->mainFrame()->contentsSize();
96 /* TODO: Figure out the proper way to
97 * get this 800 pixels. */
100 s = s.expandedTo(s2);
101 view->setGeometry(QRectF(view->geometry().topLeft(), s));
107 QGraphicsWidget *m_widget;
112 class GraphicsView : public QGraphicsView {
116 GraphicsView() : QGraphicsView(new QGraphicsScene()), viewport(0) {
117 setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
118 setOptimizationFlags(QGraphicsView::DontSavePainterState);
120 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
121 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
123 setFrameShape(QFrame::NoFrame);
124 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
126 viewport = new ViewportItem();
127 scene()->addItem(viewport);
130 ViewportItem *viewportItem() const {
135 void resizeEvent(QResizeEvent *e) {
136 QGraphicsView::resizeEvent(e);
137 setUpdatesEnabled(false);
142 QRectF rect(QPointF(0, 0), size());
143 scene()->setSceneRect(rect);
145 viewport->setGeometry(rect);
146 setUpdatesEnabled(true);
151 ViewportItem *viewport;
154 ContentWindow::ContentWindow(QWidget *parent, Entry *e) : QMainWindow(parent) {
155 setAttribute(Qt::WA_Maemo5StackedWindow);
157 QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
161 starred = new QAction(tr("Starred"), this);
162 starred->setCheckable(true);
163 starred->setChecked((entry->flags & ENTRY_FLAG_STARRED));
164 menuBar()->addAction(starred);
166 keepUnread = new QAction(tr("Keep unread"), this);
167 keepUnread->setCheckable(true);
168 keepUnread->setEnabled((entry->flags & ENTRY_FLAG_LOCKED) == 0);
169 menuBar()->addAction(keepUnread);
171 menuBar()->addAction(tr("See original"), this, SLOT(seeOriginal()));
173 setWindowTitle(entry->title);
175 GraphicsView *gv = new GraphicsView();
176 webview = new QGraphicsWebView();
177 gv->viewportItem()->setWidget(webview);
179 /* TODO: Configurable text size ?? */
180 webview->settings()->setFontSize(QWebSettings::MinimumFontSize, 22);
182 connect(webview, SIGNAL(loadFinished(bool)), SLOT(loadFinished(bool)));
183 connect(webview, SIGNAL(loadStarted()), SLOT(loadStarted()));
185 webview->setHtml(entry->content);
187 setCentralWidget(gv);
190 ContentWindow::~ContentWindow() {
194 void ContentWindow::loadStarted() {
195 setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true);
198 void ContentWindow::loadFinished(bool) {
199 setAttribute(Qt::WA_Maemo5ShowProgressIndicator, false);
202 void ContentWindow::seeOriginal() {
203 /* Attempt to launch external browser */
204 if(!QDesktopServices::openUrl(entry->link))
205 webview->setUrl(entry->link); /* Failed... Show inline */
208 void ContentWindow::closeEvent(QCloseEvent *event) {
209 entry->markRead(!keepUnread->isChecked());
210 entry->markStar(starred->isChecked());
211 QMainWindow::closeEvent(event);
214 #include "contentwindow.moc"