Mercurial > projects > qtd
diff demos/browser/webview.d @ 73:7bfd46c330dc
more porting
author | mandel |
---|---|
date | Fri, 22 May 2009 10:59:00 +0000 |
parents | 71b382c10ef6 |
children | 37caa90ce503 |
line wrap: on
line diff
--- a/demos/browser/webview.d Wed May 20 22:44:31 2009 +0000 +++ b/demos/browser/webview.d Fri May 22 10:59:00 2009 +0000 @@ -38,8 +38,19 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +module webview; + +import qt.gui.QClipboard; +import qt.gui.QMenu; +import qt.gui.QMessageBox; +import qt.gui.QMouseEvent; + +import qt.core.QDebug; +import qt.core.QBuffer; import QtWebKit.QWebView; +import QtWebKit.QWebHitTestResult; +import QtUiTools.QUiLoader; import browserapplication; import browsermainwindow; @@ -47,308 +58,278 @@ import downloadmanager; import networkaccessmanager; import tabwidget; -import webview; - -import QtGui.QClipboard; -import QtGui.QMenu; -import QtGui.QMessageBox; -import QtGui.QMouseEvent; - -import QtWebKit.QWebHitTestResult; - -import QtUiTools.QUiLoader; - -import QtCore.QDebug; -import QtCore.QBuffer; - -/* -QT_BEGIN_NAMESPACE -class QAuthenticator; -class QMouseEvent; -class QNetworkProxy; -class QNetworkReply; -class QSslError; -QT_END_NAMESPACE - -class BrowserMainWindow; -*/ - -class WebPage : public QWebPage { - Q_OBJECT - -signals: - void loadingUrl(const QUrl &url); - -public: - this(QObject *parent = null) -{ - super(parent); - m_keyboardModifiers = Qt.NoModifier; - m_pressedButtons = Qt.NoButton; - m_openInNewTab = false; - setNetworkAccessManager(BrowserApplication::networkAccessManager()); - connect(this, SIGNAL(unsupportedContent(QNetworkReply *)), - this, SLOT(handleUnsupportedContent(QNetworkReply *))); -} - BrowserMainWindow *mainWindow() -{ - QObject *w = this.parent(); - while (w) { - if (BrowserMainWindow *mw = qobject_cast<BrowserMainWindow*>(w)) - return mw; - w = w.parent(); - } - return BrowserApplication::instance().mainWindow(); -} - -protected: - bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type); -{ - // ctrl open in new tab - // ctrl-shift open in new tab and select - // ctrl-alt open in new window - if (type == QWebPage::NavigationTypeLinkClicked - && (m_keyboardModifiers & Qt.ControlModifier - || m_pressedButtons == Qt.MidButton)) { - bool newWindow = (m_keyboardModifiers & Qt.AltModifier); - WebView *webView; - if (newWindow) { - BrowserApplication::instance().newMainWindow(); - BrowserMainWindow *newMainWindow = BrowserApplication::instance().mainWindow(); - webView = newMainWindow.currentTab(); - newMainWindow.raise(); - newMainWindow.activateWindow(); - webView.setFocus(); - } else { - bool selectNewTab = (m_keyboardModifiers & Qt.ShiftModifier); - webView = mainWindow().tabWidget().newTab(selectNewTab); - } - webView.load(request); - m_keyboardModifiers = Qt.NoModifier; - m_pressedButtons = Qt.NoButton; - return false; - } - if (frame == mainFrame()) { - m_loadingUrl = request.url(); - emit loadingUrl(m_loadingUrl); - } - return QWebPage::acceptNavigationRequest(frame, request, type); -} - -QWebPage *createWindow(QWebPage::WebWindowType type) -{ - Q_UNUSED(type); - if (m_keyboardModifiers & Qt.ControlModifier || m_pressedButtons == Qt.MidButton) - m_openInNewTab = true; - if (m_openInNewTab) { - m_openInNewTab = false; - return mainWindow().tabWidget().newTab().page(); - } - BrowserApplication::instance().newMainWindow(); - BrowserMainWindow *mainWindow = BrowserApplication::instance().mainWindow(); - return mainWindow.currentTab().page(); -} - -version(QT_NO_UITOOLS) {} else -{ - QObject *createPlugin(const QString &classId, const QUrl &url, const QStringList ¶mNames, const QStringList ¶mValues); - { - Q_UNUSED(url); - Q_UNUSED(paramNames); - Q_UNUSED(paramValues); - QUiLoader loader; - return loader.createWidget(classId, view()); - } -} - -private slots: - void handleUnsupportedContent(QNetworkReply *reply) +class WebPage : public QWebPage { - if (reply.error() == QNetworkReply::NoError) { - BrowserApplication::downloadManager().handleUnsupportedContent(reply); - return; - } - - QFile file(QLatin1String(":/notfound.html")); - bool isOpened = file.open(QIODevice::ReadOnly); - Q_ASSERT(isOpened); - QString title = tr("Error loading page: %1").arg(reply.url().toString()); - QString html = QString(QLatin1String(file.readAll())) - .arg(title) - .arg(reply.errorString()) - .arg(reply.url().toString()); - - QBuffer imageBuffer; - imageBuffer.open(QBuffer::ReadWrite); - QIcon icon = view().style().standardIcon(QStyle::SP_MessageBoxWarning, 0, view()); - QPixmap pixmap = icon.pixmap(QSize(32,32)); - if (pixmap.save(&imageBuffer, "PNG")) { - html.replace(QLatin1String("IMAGE_BINARY_DATA_HERE"), - QString(QLatin1String(imageBuffer.buffer().toBase64()))); - } - - QList<QWebFrame*> frames; - frames.append(mainFrame()); - while (!frames.isEmpty()) { - QWebFrame *frame = frames.takeFirst(); - if (frame.url() == reply.url()) { - frame.setHtml(html, reply.url()); - return; - } - QList<QWebFrame *> children = frame.childFrames(); - foreach(QWebFrame *frame, children) - frames.append(frame); - } - if (m_loadingUrl == reply.url()) { - mainFrame().setHtml(html, reply.url()); - } -} - -private: - friend class WebView; - - // set the webview mousepressedevent - Qt.KeyboardModifiers m_keyboardModifiers; - Qt.MouseButtons m_pressedButtons; - bool m_openInNewTab; - QUrl m_loadingUrl; -}; - -class WebView : public QWebView { - Q_OBJECT + mixin Signal!("loadingUrl", QUrl url); public: - WebView(QWidget *parent = null) - : QWebView(parent) - , m_progress(0) - , m_page(new WebPage(this)) -{ - setPage(m_page); - connect(page(), SIGNAL(statusBarMessage(const QString&)), - SLOT(setStatusBarText(const QString&))); - connect(this, SIGNAL(loadProgress(int)), - this, SLOT(setProgress(int))); - connect(this, SIGNAL(loadFinished(bool)), - this, SLOT(loadFinished())); - connect(page(), SIGNAL(loadingUrl(const QUrl&)), - this, SIGNAL(urlChanged(const QUrl &))); - connect(page(), SIGNAL(downloadRequested(const QNetworkRequest &)), - this, SLOT(downloadRequested(const QNetworkRequest &))); - page().setForwardUnsupportedContent(true); -} - - WebPage *webPage() const { return m_page; } - - void loadUrl(const QUrl &url) -{ - m_initialUrl = url; - load(url); -} - - QUrl url() const -{ - QUrl url = QWebView::url(); - if (!url.isEmpty()) - return url; - - return m_initialUrl; -} - - QString lastStatusBarText() const -{ - return m_statusBarText; -} - - inline int progress() const { return m_progress; } + this(QObject parent = null) + { + super(parent); + m_keyboardModifiers = Qt.NoModifier; + m_pressedButtons = Qt.NoButton; + m_openInNewTab = false; + setNetworkAccessManager(BrowserApplication.networkAccessManager()); + this.unsupportedContent.connect(&this.handleUnsupportedContent); + } + + BrowserMainWindow mainWindow() + { + QObject w = this.parent(); + while (w) { + if (BrowserMainWindow mw = qobject_cast<BrowserMainWindow>(w)) + return mw; + w = w.parent(); + } + return BrowserApplication.instance().mainWindow(); + } protected: - void mousePressEvent(QMouseEvent *event); -{ - m_page.m_pressedButtons = event.buttons(); - m_page.m_keyboardModifiers = event.modifiers(); - QWebView::mousePressEvent(event); -} + + bool acceptNavigationRequest(QWebFrame frame, QNetworkRequest request, NavigationType type); + { + // ctrl open in new tab + // ctrl-shift open in new tab and select + // ctrl-alt open in new window + if (type == QWebPage.NavigationTypeLinkClicked + && (m_keyboardModifiers & Qt.ControlModifier + || m_pressedButtons == Qt.MidButton)) { + bool newWindow = (m_keyboardModifiers & Qt.AltModifier); + WebView webView; + if (newWindow) { + BrowserApplication.instance().newMainWindow(); + BrowserMainWindow newMainWindow = BrowserApplication.instance().mainWindow(); + webView = newMainWindow.currentTab(); + newMainWindow.raise(); + newMainWindow.activateWindow(); + webView.setFocus(); + } else { + bool selectNewTab = (m_keyboardModifiers & Qt.ShiftModifier); + webView = mainWindow().tabWidget().newTab(selectNewTab); + } + webView.load(request); + m_keyboardModifiers = Qt.NoModifier; + m_pressedButtons = Qt.NoButton; + return false; + } + if (frame == mainFrame()) { + m_loadingUrl = request.url(); + emit loadingUrl(m_loadingUrl); + } + return QWebPage.acceptNavigationRequest(frame, request, type); + } + + QWebPage createWindow(QWebPage.WebWindowType type) + { + //Q_UNUSED(type); + if (m_keyboardModifiers & Qt.ControlModifier || m_pressedButtons == Qt.MidButton) + m_openInNewTab = true; + if (m_openInNewTab) { + m_openInNewTab = false; + return mainWindow().tabWidget().newTab().page(); + } + BrowserApplication.instance().newMainWindow(); + BrowserMainWindow mainWindow = BrowserApplication.instance().mainWindow(); + return mainWindow.currentTab().page(); + } - void mouseReleaseEvent(QMouseEvent *event) -{ - QWebView::mouseReleaseEvent(event); - if (!event.isAccepted() && (m_page.m_pressedButtons & Qt.MidButton)) { - QUrl url(QApplication::clipboard().text(QClipboard::Selection)); - if (!url.isEmpty() && url.isValid() && !url.scheme().isEmpty()) { - setUrl(url); - } - } -} + version(QT_NO_UITOOLS) {} else + { + QObject createPlugin(const QString &classId, const QUrl &url, const QStringList ¶mNames, const QStringList ¶mValues); + { + //Q_UNUSED(url); + //Q_UNUSED(paramNames); + //Q_UNUSED(paramValues); + QUiLoader loader; + return loader.createWidget(classId, view()); + } + } + +private: + + void handleUnsupportedContent(QNetworkReply reply) + { + if (reply.error() == QNetworkReply.NoError) { + BrowserApplication.downloadManager().handleUnsupportedContent(reply); + return; + } + + QFile file(QLatin1String(":/notfound.html")); + bool isOpened = file.open(QIODevice.ReadOnly); + Q_ASSERT(isOpened); + QString title = tr("Error loading page: %1").arg(reply.url().toString()); + QString html = QString(QLatin1String(file.readAll())) + .arg(title) + .arg(reply.errorString()) + .arg(reply.url().toString()); - void contextMenuEvent(QContextMenuEvent *event) + QBuffer imageBuffer; + imageBuffer.open(QBuffer.ReadWrite); + QIcon icon = view().style().standardIcon(QStyle.SP_MessageBoxWarning, 0, view()); + QPixmap pixmap = icon.pixmap(QSize(32,32)); + if (pixmap.save(&imageBuffer, "PNG")) { + html.replace(QLatin1String("IMAGE_BINARY_DATA_HERE"), + QString(QLatin1String(imageBuffer.buffer().toBase64()))); + } + + QList<QWebFrame*> frames; + frames.append(mainFrame()); + while (!frames.isEmpty()) { + QWebFrame frame = frames.takeFirst(); + if (frame.url() == reply.url()) { + frame.setHtml(html, reply.url()); + return; + } + QList<QWebFrame > children = frame.childFrames(); + foreach(QWebFrame frame, children) + frames.append(frame); + } + if (m_loadingUrl == reply.url()) { + mainFrame().setHtml(html, reply.url()); + } + } + +private: + + // set the webview mousepressedevent + Qt.KeyboardModifiers m_keyboardModifiers; + Qt.MouseButtons m_pressedButtons; + bool m_openInNewTab; + QUrl m_loadingUrl; +}; + +class WebView : public QWebView { - QWebHitTestResult r = page().mainFrame().hitTestContent(event.pos()); - if (!r.linkUrl().isEmpty()) { - QMenu menu(this); - menu.addAction(pageAction(QWebPage::OpenLinkInNewWindow)); - menu.addAction(tr("Open in New Tab"), this, SLOT(openLinkInNewTab())); - menu.addSeparator(); - menu.addAction(pageAction(QWebPage::DownloadLinkToDisk)); - // Add link to bookmarks... - menu.addSeparator(); - menu.addAction(pageAction(QWebPage::CopyLinkToClipboard)); - if (page().settings().testAttribute(QWebSettings::DeveloperExtrasEnabled)) - menu.addAction(pageAction(QWebPage::InspectElement)); - menu.exec(mapToGlobal(event.pos())); - return; - } - QWebView::contextMenuEvent(event); -} +public: + + WebView(QWidget parent = null) + { + super(parent); + m_progress = 0; + m_page = new WebPage(this); + setPage(m_page); + page().statusBarMessage.connect(&setStatusBarText); + this.loadProgress.connect(&this.setProgress); + this.loadFinished.connect(&this.loadFinished); + page().loadingUrl.connect(&this.urlChanged); + page().downloadRequested.connect(&this.downloadRequested); + page().setForwardUnsupportedContent(true); + } + + WebPage webPage() { return m_page; } + + void loadUrl(QUrl url) + { + m_initialUrl = url; + load(url); + } + + QUrl url() const + { + QUrl url = QWebView.url(); + if (!url.isEmpty()) + return url; + return m_initialUrl; + } + + QString lastStatusBarText() + { + return m_statusBarText; + } + + int progress() const { return m_progress; } + +protected: - void wheelEvent(QWheelEvent *event) -{ - if (QApplication::keyboardModifiers() & Qt.ControlModifier) { - int numDegrees = event.delta() / 8; - int numSteps = numDegrees / 15; - setTextSizeMultiplier(textSizeMultiplier() + numSteps * 0.1); - event.accept(); - return; - } - QWebView::wheelEvent(event); -} + void mousePressEvent(QMouseEvent event); + { + m_page.m_pressedButtons = event.buttons(); + m_page.m_keyboardModifiers = event.modifiers(); + QWebView.mousePressEvent(event); + } + + void mouseReleaseEvent(QMouseEvent event) + { + QWebView.mouseReleaseEvent(event); + if (!event.isAccepted() && (m_page.m_pressedButtons & Qt.MidButton)) { + QUrl url(QApplication.clipboard().text(QClipboard.Selection)); + if (!url.isEmpty() && url.isValid() && !url.scheme().isEmpty()) { + setUrl(url); + } + } + } + + void contextMenuEvent(QContextMenuEvent event) + { + QWebHitTestResult r = page().mainFrame().hitTestContent(event.pos()); + if (!r.linkUrl().isEmpty()) { + QMenu menu(this); + menu.addAction(pageAction(QWebPage.OpenLinkInNewWindow)); + menu.addAction(tr("Open in New Tab"), this, SLOT(openLinkInNewTab())); + menu.addSeparator(); + menu.addAction(pageAction(QWebPage.DownloadLinkToDisk)); + // Add link to bookmarks... + menu.addSeparator(); + menu.addAction(pageAction(QWebPage.CopyLinkToClipboard)); + if (page().settings().testAttribute(QWebSettings.DeveloperExtrasEnabled)) + menu.addAction(pageAction(QWebPage.InspectElement)); + menu.exec(mapToGlobal(event.pos())); + return; + } + QWebView.contextMenuEvent(event); + } + + void wheelEvent(QWheelEvent event) + { + if (QApplication.keyboardModifiers() & Qt.ControlModifier) { + int numDegrees = event.delta() / 8; + int numSteps = numDegrees / 15; + setTextSizeMultiplier(textSizeMultiplier() + numSteps * 0.1); + event.accept(); + return; + } + QWebView.wheelEvent(event); + } -private slots: - void setProgress(int progress) -{ - m_progress = progress; -} +private: + + void setProgress(int progress) + { + m_progress = progress; + } - void loadFinished() -{ - if (100 != m_progress) { - qWarning() << "Recieved finished signal while progress is still:" << progress() - << "Url:" << url(); - } - m_progress = 0; -} + void loadFinished() + { + if (100 != m_progress) { + qWarning() << "Received finished signal while progress is still:" << progress() << "Url:" << url(); + } + m_progress = 0; + } - void setStatusBarText(const QString &string) -{ - m_statusBarText = string; -} + void setStatusBarText(QString string) + { + m_statusBarText = string; + } - void downloadRequested(const QNetworkRequest &request) -{ - BrowserApplication::downloadManager().download(request); -} + void downloadRequested(QNetworkRequest request) + { + BrowserApplication.downloadManager().download(request); + } - void openLinkInNewTab() -{ - m_page.m_openInNewTab = true; - pageAction(QWebPage::OpenLinkInNewWindow).trigger(); -} + void openLinkInNewTab() + { + m_page.m_openInNewTab = true; + pageAction(QWebPage.OpenLinkInNewWindow).trigger(); + } + private: - QString m_statusBarText; - QUrl m_initialUrl; - int m_progress; - WebPage *m_page; + + QString m_statusBarText; + QUrl m_initialUrl; + int m_progress; + WebPage m_page; }