Initial import of the code.
[grr] / src / contentwindow.cpp
1 #include <QMenuBar>
2 #include <QDebug>
3 #include <QDesktopServices>
4 #include <QtGui>
5 #include <QtWebKit>
6 #include "contentwindow.h"
7
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 */
10
11 class ViewportItem : public QGraphicsWidget, public QAbstractKineticScroller {
12         Q_OBJECT
13
14         public:
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);
21                 }
22
23                 void setWidget(QGraphicsWidget *widget) {
24                         if (m_widget) {
25                                 m_widget->setParentItem(0);
26                                 delete m_widget;
27                         }
28                         m_widget = widget;
29                         if (m_widget) {
30                                 m_widget->setParentItem(this);
31                                 m_widget->setAttribute(Qt::WA_OpaquePaintEvent, true);
32
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();
37                                 }
38                         }
39                 }
40
41         protected:
42                 bool sceneEventFilter(QGraphicsItem *i, QEvent *e) {
43                         bool res = false;
44                         if (i && (i == m_widget) && !m_ignoreEvents && m_widget->isEnabled()) {
45                                 switch (e->type()) {
46                                 case QEvent::GraphicsSceneMousePress:
47                                 case QEvent::GraphicsSceneMouseMove:
48                                 case QEvent::GraphicsSceneMouseRelease:
49                                 /*case QEvent::GraphicsSceneMouseDoubleClick:*/ {
50                                         res = handleMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
51                                         break;
52                                 }
53                                 default:
54                                         break;
55                                 }
56                         }
57                         // prevent text selection and image dragging
58                         if (e->type() == QEvent::GraphicsSceneMouseMove)
59                                 return true;
60                         return res ? true : QGraphicsWidget::sceneEventFilter(i, e);
61                 }
62
63                 QSize viewportSize() const {
64                         return size().toSize();
65                 }
66
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())));
70                 }
71
72                 QPoint scrollPosition() const {
73                         return m_widget ? -m_widget->pos().toPoint() + m_overShoot : QPoint();
74                 }
75
76                 void setScrollPosition(const QPoint &p, const QPoint &overShoot) {
77                         m_overShoot = overShoot;
78                         if (m_widget)
79                                 m_widget->setPos(-p + m_overShoot);
80                 }
81
82                 void cancelLeftMouseButtonPress(const QPoint & /*globalPressPos*/) {
83                 }
84
85                 void sendEvent(QGraphicsItem *i, QEvent *e) {
86                         m_ignoreEvents = true;
87                         scene()->sendEvent(i, e);
88                         m_ignoreEvents = false;
89                 }
90
91         private slots:
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. */
98                                         QSizeF s2 = size();
99                                         s2.setWidth(800);
100                                         s = s.expandedTo(s2);
101                                         view->setGeometry(QRectF(view->geometry().topLeft(), s));
102                                 }
103                         }
104                 }
105
106         private:
107                 QGraphicsWidget *m_widget;
108                 bool m_ignoreEvents;
109                 QPoint m_overShoot;
110 };
111
112 class GraphicsView : public QGraphicsView {
113         Q_OBJECT
114         
115         public:
116                 GraphicsView() : QGraphicsView(new QGraphicsScene()), viewport(0) {
117                         setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
118                         setOptimizationFlags(QGraphicsView::DontSavePainterState);
119
120                         setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
121                         setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
122
123                         setFrameShape(QFrame::NoFrame);
124                         setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
125
126                         viewport = new ViewportItem();
127                         scene()->addItem(viewport);
128                 }
129
130                 ViewportItem *viewportItem() const {
131                         return viewport;
132                 }
133
134         protected:
135                 void resizeEvent(QResizeEvent *e) {
136                         QGraphicsView::resizeEvent(e);
137                         setUpdatesEnabled(false);
138
139                         if (!viewport)
140                                 return;
141
142                         QRectF rect(QPointF(0, 0), size());
143                         scene()->setSceneRect(rect);
144
145                         viewport->setGeometry(rect);
146                         setUpdatesEnabled(true);
147                         update();
148                 }
149
150         private:
151                 ViewportItem *viewport;
152 };
153
154 ContentWindow::ContentWindow(QWidget *parent, Entry *e) : QMainWindow(parent) {
155         setAttribute(Qt::WA_Maemo5StackedWindow);
156
157         QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
158
159         entry = e;
160
161         starred = new QAction(tr("Starred"), this);
162         starred->setCheckable(true);
163         starred->setChecked((entry->flags & ENTRY_FLAG_STARRED));
164         menuBar()->addAction(starred);
165
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);
170
171         menuBar()->addAction(tr("See original"), this, SLOT(seeOriginal()));
172
173         setWindowTitle(entry->title);
174
175         GraphicsView *gv = new GraphicsView();
176         webview = new QGraphicsWebView();
177         gv->viewportItem()->setWidget(webview);
178
179         /* TODO: Configurable text size ?? */
180         webview->settings()->setFontSize(QWebSettings::MinimumFontSize, 22);
181
182         connect(webview, SIGNAL(loadFinished(bool)), SLOT(loadFinished(bool)));
183         connect(webview, SIGNAL(loadStarted()), SLOT(loadStarted()));
184
185         webview->setHtml(entry->content);
186
187         setCentralWidget(gv);
188 }
189
190 ContentWindow::~ContentWindow() {
191         delete(webview);
192 }
193
194 void ContentWindow::loadStarted() {
195         setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true);
196 }
197
198 void ContentWindow::loadFinished(bool) {
199         setAttribute(Qt::WA_Maemo5ShowProgressIndicator, false);
200 }
201
202 void ContentWindow::seeOriginal() {
203         /* Attempt to launch external browser */
204         if(!QDesktopServices::openUrl(entry->link))
205                 webview->setUrl(entry->link); /* Failed... Show inline */
206 }
207
208 void ContentWindow::closeEvent(QCloseEvent *event) {
209         entry->markRead(!keepUnread->isChecked());
210         entry->markStar(starred->isChecked());
211         QMainWindow::closeEvent(event);
212 }
213
214 #include "contentwindow.moc"