3 #include <QDesktopServices>
7 #include <QtGui/QX11Info>
11 #include "contentwindow.h"
13 /* Got ViewportItem and GraphicsView from maemobrowser in the qt examples. The
14 * whole point of this is to get a finger friendly web widget */
16 class ViewportItem : public QGraphicsWidget, public QAbstractKineticScroller {
20 ViewportItem() : QGraphicsWidget(), QAbstractKineticScroller(), m_widget(0), m_ignoreEvents(false) {
21 setFlag(QGraphicsItem::ItemHasNoContents, true);
22 setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
23 setFlag(QGraphicsItem::ItemClipsToShape, true);
24 setAttribute(Qt::WA_OpaquePaintEvent, true);
25 setFiltersChildEvents(true);
28 void setWidget(QGraphicsWidget *widget) {
30 m_widget->setParentItem(0);
35 m_widget->setParentItem(this);
36 m_widget->setAttribute(Qt::WA_OpaquePaintEvent, true);
38 if (qgraphicsitem_cast<QGraphicsWebView *>(m_widget)) {
39 connect(m_widget, SIGNAL(loadProgress(int)), this, SLOT(resizeWebViewToFrame()));
40 connect(m_widget, SIGNAL(loadFinished(bool)), this, SLOT(resizeWebViewToFrame()));
41 resizeWebViewToFrame();
47 bool sceneEventFilter(QGraphicsItem *i, QEvent *e) {
49 if (i && (i == m_widget) && !m_ignoreEvents && m_widget->isEnabled()) {
51 case QEvent::GraphicsSceneMousePress:
52 case QEvent::GraphicsSceneMouseMove:
53 case QEvent::GraphicsSceneMouseRelease:
54 res = handleMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
60 // prevent text selection and image dragging
61 if (e->type() == QEvent::GraphicsSceneMouseMove)
63 return res ? true : QGraphicsWidget::sceneEventFilter(i, e);
66 void keyPressEvent(QKeyEvent *e) {
71 y = m_widget->y() - 50;
72 h = (m_widget->size() - size()).height();
73 m_widget->setY(y < -h ? -h : y);
77 y = m_widget->y() + 50;
78 m_widget->setY(y > 0 ? 0 : y);
82 x = m_widget->x() - 50;
83 w = (m_widget->size() - size()).width();
84 m_widget->setX(x < -w ? -w : x);
88 x = m_widget->x() + 50;
89 m_widget->setX(x > 0 ? 0 : x);
93 if(qgraphicsitem_cast<QGraphicsWebView *>(m_widget)) {
94 QGraphicsWebView *wv = (QGraphicsWebView *)m_widget;
95 wv->setZoomFactor(wv->zoomFactor() * 1.25);
96 resizeWebViewToFrame();
101 if(qgraphicsitem_cast<QGraphicsWebView *>(m_widget)) {
102 QGraphicsWebView *wv = (QGraphicsWebView *)m_widget;
103 wv->setZoomFactor(wv->zoomFactor() / 1.25);
104 resizeWebViewToFrame();
110 QSize viewportSize() const {
111 return size().toSize();
114 QPoint maximumScrollPosition() const {
115 QSizeF s = m_widget ? m_widget->size() - size() : QSize(0, 0);
116 return QPoint(qMax(0, int(s.width())), qMax(0, int(s.height())));
119 QPoint scrollPosition() const {
120 return m_widget ? -m_widget->pos().toPoint() + m_overShoot : QPoint();
123 void setScrollPosition(const QPoint &p, const QPoint &overShoot) {
124 m_overShoot = overShoot;
126 m_widget->setPos(-p + m_overShoot);
129 void cancelLeftMouseButtonPress(const QPoint & /*globalPressPos*/) {
132 void sendEvent(QGraphicsItem *i, QEvent *e) {
133 m_ignoreEvents = true;
134 scene()->sendEvent(i, e);
135 m_ignoreEvents = false;
139 void resizeWebViewToFrame() {
140 if (QGraphicsWebView *view = qgraphicsitem_cast<QGraphicsWebView *>(m_widget)) {
141 if (view->page() && view->page()->mainFrame()) {
142 QSizeF s = view->page()->mainFrame()->contentsSize();
143 /* TODO: Figure out the proper way to
144 * get this 800 pixels. */
147 s = s.expandedTo(s2);
148 view->setGeometry(QRectF(view->geometry().topLeft(), s));
154 QGraphicsWidget *m_widget;
159 class GraphicsView : public QGraphicsView {
163 GraphicsView() : QGraphicsView(new QGraphicsScene()), viewport(0) {
164 setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
165 setOptimizationFlags(QGraphicsView::DontSavePainterState);
167 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
168 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
170 setFrameShape(QFrame::NoFrame);
171 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
173 viewport = new ViewportItem();
174 scene()->addItem(viewport);
177 ViewportItem *viewportItem() const {
182 void resizeEvent(QResizeEvent *e) {
183 QGraphicsView::resizeEvent(e);
184 setUpdatesEnabled(false);
189 QRectF rect(QPointF(0, 0), size());
190 scene()->setSceneRect(rect);
192 viewport->setGeometry(rect);
193 setUpdatesEnabled(true);
198 ViewportItem *viewport;
201 ContentWindow::ContentWindow(QWidget *parent, Entry *e) : QMainWindow(parent) {
202 setAttribute(Qt::WA_Maemo5StackedWindow);
204 QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
208 starred = new QAction(tr("Starred"), this);
209 starred->setCheckable(true);
210 starred->setChecked((entry->flags & ENTRY_FLAG_STARRED));
211 menuBar()->addAction(starred);
213 shared = new QAction(tr("Shared"), this);
214 shared->setCheckable(true);
215 shared->setChecked((entry->flags & ENTRY_FLAG_SHARED));
216 menuBar()->addAction(shared);
218 keepUnread = new QAction(tr("Keep unread"), this);
219 keepUnread->setCheckable(true);
220 keepUnread->setEnabled((entry->flags & ENTRY_FLAG_LOCKED) == 0);
221 menuBar()->addAction(keepUnread);
223 menuBar()->addAction(tr("See original"), this, SLOT(seeOriginal()));
225 setWindowTitle(entry->title);
227 GraphicsView *gv = new GraphicsView();
228 webview = new QGraphicsWebView();
229 gv->viewportItem()->setWidget(webview);
231 /* TODO: Configurable text size ?? */
232 webview->settings()->setFontSize(QWebSettings::MinimumFontSize, 22);
234 connect(webview, SIGNAL(loadFinished(bool)), SLOT(loadFinished(bool)));
235 connect(webview, SIGNAL(loadStarted()), SLOT(loadStarted()));
237 webview->setHtml(entry->content);
239 setCentralWidget(gv);
240 gv->viewportItem()->setFocus();
241 gv->viewportItem()->grabKeyboard();
246 ContentWindow::~ContentWindow() {
250 void ContentWindow::loadStarted() {
251 setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true);
254 void ContentWindow::loadFinished(bool) {
255 setAttribute(Qt::WA_Maemo5ShowProgressIndicator, false);
258 void ContentWindow::seeOriginal() {
259 /* Attempt to launch external browser */
260 if(!QDesktopServices::openUrl(entry->link))
261 webview->setUrl(entry->link); /* Failed... Show inline */
264 void ContentWindow::closeEvent(QCloseEvent *event) {
266 entry->markRead(!keepUnread->isChecked());
267 entry->markStar(starred->isChecked());
268 entry->markShared(shared->isChecked());
269 QMainWindow::closeEvent(event);
272 void ContentWindow::grabZoomKeys(bool grab) {
276 unsigned long val = (grab) ? 1 : 0;
277 Atom atom = XInternAtom(QX11Info::display(), "_HILDON_ZOOM_KEY_ATOM", False);
281 XChangeProperty (QX11Info::display(), winId(), atom, XA_INTEGER, 32, PropModeReplace,
282 reinterpret_cast<unsigned char *>(&val), 1);
285 #include "contentwindow.moc"