2 * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
3 * Copyright (C) 2006 George Staikos <staikos@kde.org>
4 * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
5 * Copyright (C) 2006 Zack Rusin <zack@kde.org>
6 * Copyright (C) 2006 Simon Hausmann <hausmann@kde.org>
7 * Copyright (C) 2009 Kenneth Christiansen <kenneth@webkit.org>
8 * Copyright (C) 2009 Antonio Gomes <antonio.gomes@openbossa.org>
9 * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
11 * All rights reserved.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
22 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
23 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
26 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
30 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #include <QGraphicsScene>
38 #include <QGraphicsView>
39 #include <QGraphicsWidget>
40 #include <QNetworkRequest>
41 #include <QTextStream>
44 #include <QtNetwork/QNetworkProxy>
46 #include <qwebelement.h>
47 #include <qwebframe.h>
48 #include <qgraphicswebview.h>
50 #include <qwebsettings.h>
53 static QUrl urlFromUserInput(const QString& string)
55 QString input(string);
57 if (fi.exists() && fi.isRelative())
58 input = fi.absoluteFilePath();
60 #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
61 return QUrl::fromUserInput(input);
67 class WebView : public QGraphicsWebView {
69 Q_PROPERTY(qreal yRotation READ yRotation WRITE setYRotation)
72 WebView(QGraphicsItem* parent = 0)
73 : QGraphicsWebView(parent)
76 void setYRotation(qreal angle)
78 #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
79 QRectF r = boundingRect();
80 setTransform(QTransform()
81 .translate(r.width() / 2, r.height() / 2)
82 .rotate(angle, Qt::YAxis)
83 .translate(-r.width() / 2, -r.height() / 2));
87 qreal yRotation() const
96 class WebPage : public QWebPage {
100 WebPage(QObject* parent = 0)
105 virtual QWebPage* createWindow(QWebPage::WebWindowType);
110 QUrl proxyUrl = urlFromUserInput(qgetenv("http_proxy"));
112 if (proxyUrl.isValid() && !proxyUrl.host().isEmpty()) {
113 int proxyPort = (proxyUrl.port() > 0) ? proxyUrl.port() : 8080;
114 networkAccessManager()->setProxy(QNetworkProxy(QNetworkProxy::HttpProxy, proxyUrl.host(), proxyPort));
119 class MainView : public QGraphicsView {
123 MainView(QWidget* parent)
124 : QGraphicsView(parent)
127 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
128 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
130 setFrameShape(QFrame::NoFrame);
131 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
134 void setMainWidget(QGraphicsWidget* widget)
136 QRectF rect(QRect(QPoint(0, 0), size()));
137 widget->setGeometry(rect);
138 m_mainWidget = widget;
141 void resizeEvent(QResizeEvent* event)
143 QGraphicsView::resizeEvent(event);
146 QRectF rect(QPoint(0, 0), event->size());
147 m_mainWidget->setGeometry(rect);
152 m_mainWidget->setCursor(Qt::WaitCursor);
157 m_mainWidget->unsetCursor();
163 #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
164 QSizeF center = m_mainWidget->boundingRect().size() / 2;
165 QPointF centerPoint = QPointF(center.width(), center.height());
166 m_mainWidget->setTransformOriginPoint(centerPoint);
168 m_mainWidget->setRotation(m_mainWidget->rotation() ? 0 : 180);
174 #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
175 QSizeF center = m_mainWidget->boundingRect().size() / 2;
176 QPointF centerPoint = QPointF(center.width(), center.height());
177 m_mainWidget->setTransformOriginPoint(centerPoint);
179 QPropertyAnimation* animation = new QPropertyAnimation(m_mainWidget, "rotation", this);
180 animation->setDuration(1000);
182 int rotation = int(m_mainWidget->rotation());
184 animation->setStartValue(rotation);
185 animation->setEndValue(rotation + 180 - (rotation % 180));
187 animation->start(QAbstractAnimation::DeleteWhenStopped);
200 QGraphicsWidget* m_mainWidget;
203 class SharedScene : public QSharedData {
207 m_scene = new QGraphicsScene;
208 m_item = new WebView;
209 m_item->setPage((m_page = new WebPage));
211 m_scene->addItem(m_item);
212 m_scene->setActiveWindow(m_item);
222 QGraphicsScene* scene() const { return m_scene; }
223 WebView* webView() const { return m_item; }
226 QGraphicsScene* m_scene;
231 class MainWindow : public QMainWindow {
235 MainWindow(QExplicitlySharedDataPointer<SharedScene> other)
237 , view(new MainView(this))
245 , view(new MainView(this))
246 , scene(new SharedScene())
253 setAttribute(Qt::WA_DeleteOnClose);
255 view->setScene(scene->scene());
257 setCentralWidget(view);
259 view->setMainWidget(scene->webView());
261 connect(scene->webView(), SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool)));
262 connect(scene->webView(), SIGNAL(titleChanged(const QString&)), this, SLOT(setWindowTitle(const QString&)));
263 connect(scene->webView()->page(), SIGNAL(windowCloseRequested()), this, SLOT(close()));
265 #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
266 QStateMachine *machine = new QStateMachine(this);
267 QState *s0 = new QState(machine);
268 s0->assignProperty(scene->webView(), "yRotation", 0);
270 QState *s1 = new QState(machine);
271 s1->assignProperty(scene->webView(), "yRotation", 90);
273 QAbstractTransition *t1 = s0->addTransition(view, SIGNAL(flipRequest()), s1);
274 QPropertyAnimation *yRotationAnim = new QPropertyAnimation(scene->webView(), "yRotation", this);
275 yRotationAnim->setDuration(1000);
276 t1->addAnimation(yRotationAnim);
278 QState *s2 = new QState(machine);
279 s2->assignProperty(scene->webView(), "yRotation", -90);
280 s1->addTransition(s1, SIGNAL(polished()), s2);
282 QAbstractTransition *t2 = s2->addTransition(s0);
283 t2->addAnimation(yRotationAnim);
285 machine->setInitialState(s0);
293 void load(const QString& url)
295 QUrl deducedUrl = urlFromUserInput(url);
296 if (!deducedUrl.isValid())
297 deducedUrl = QUrl("http://" + url + "/");
299 urlEdit->setText(deducedUrl.toEncoded());
300 scene->webView()->load(deducedUrl);
301 scene->webView()->setFocus(Qt::OtherFocusReason);
304 QWebPage* page() const
306 return scene->webView()->page();
310 void changeLocation()
312 load(urlEdit->text());
315 void loadFinished(bool)
317 QUrl url = scene->webView()->url();
318 urlEdit->setText(url.toString());
320 QUrl::FormattingOptions opts;
321 opts |= QUrl::RemoveScheme;
322 opts |= QUrl::RemoveUserInfo;
323 opts |= QUrl::StripTrailingSlash;
324 QString s = url.toString(opts);
328 //FIXME: something missing here
332 void newWindow(const QString &url = QString())
334 MainWindow* mw = new MainWindow();
341 MainWindow* mw = new MainWindow(scene);
347 view->setWaitCursor();
362 view->animatedFlip();
367 view->animatedYFlip();
373 QWebPage* page = scene->webView()->page();
374 urlEdit = new QLineEdit(this);
375 urlEdit->setSizePolicy(QSizePolicy::Expanding, urlEdit->sizePolicy().verticalPolicy());
376 connect(urlEdit, SIGNAL(returnPressed()), SLOT(changeLocation()));
378 QToolBar* bar = addToolBar("Navigation");
379 bar->addAction(page->action(QWebPage::Back));
380 bar->addAction(page->action(QWebPage::Forward));
381 bar->addAction(page->action(QWebPage::Reload));
382 bar->addAction(page->action(QWebPage::Stop));
383 bar->addWidget(urlEdit);
385 QMenu* fileMenu = menuBar()->addMenu("&File");
386 fileMenu->addAction("New Window", this, SLOT(newWindow()));
387 fileMenu->addAction("Clone view", this, SLOT(clone()));
388 fileMenu->addAction("Close", this, SLOT(close()));
390 QMenu* viewMenu = menuBar()->addMenu("&View");
391 viewMenu->addAction(page->action(QWebPage::Stop));
392 viewMenu->addAction(page->action(QWebPage::Reload));
394 QMenu* testMenu = menuBar()->addMenu("&Tests");
395 testMenu->addAction("Set Wait Cursor", this, SLOT(setWaitCursor()), QKeySequence("Ctrl+W"));
396 testMenu->addAction("Reset Cursor", this, SLOT(resetCursor()), QKeySequence("Ctrl+Shift+W"));
398 QMenu* fxMenu = menuBar()->addMenu("&Effects");
399 fxMenu->addAction("Flip", this, SLOT(flip()));
400 fxMenu->addAction("Animated Flip", this, SLOT(animatedFlip()), QKeySequence("Ctrl+R"));
401 fxMenu->addAction("Animated Y-Flip", this, SLOT(animatedYFlip()), QKeySequence("Ctrl+Y"));
406 QExplicitlySharedDataPointer<SharedScene> scene;
411 QWebPage* WebPage::createWindow(QWebPage::WebWindowType)
413 MainWindow* mw = new MainWindow;
418 int main(int argc, char** argv)
420 QApplication app(argc, argv);
421 QString url = QString("file://%1/%2").arg(QDir::homePath()).arg(QLatin1String("index.html"));
423 app.setApplicationName("GQVLauncher");
425 QWebSettings::setObjectCacheCapacities((16 * 1024 * 1024) / 8, (16 * 1024 * 1024) / 8, 16 * 1024 * 1024);
426 QWebSettings::setMaximumPagesInCache(4);
427 QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
428 QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
429 QWebSettings::globalSettings()->setAttribute(QWebSettings::LocalStorageEnabled, true);
431 const QStringList args = app.arguments();
432 if (args.count() > 1)
435 MainWindow* window = new MainWindow;
438 for (int i = 2; i < args.count(); i++)
439 window->newWindow(args.at(i));