Mercurial > projects > qtd
diff demos/browser/urllineedit.d @ 45:71b382c10ef6
add coarse and incomplete QT browser port
author | mandel |
---|---|
date | Sun, 17 May 2009 18:49:59 +0000 |
parents | |
children | 7bfd46c330dc |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/demos/browser/urllineedit.d Sun May 17 18:49:59 2009 +0000 @@ -0,0 +1,378 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the demonstration applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +module urllineedit; + +import QtCore.QUrl; +import QtGui.QWidget; +import QtGui.QStyleOptionFrame; + +import browserapplication; +import searchlineedit; +import webview; + +import QtCore.QEvent; + +import QtGui.QApplication; +import QtGui.QCompleter; +import QtGui.QFocusEvent; +import QtGui.QHBoxLayout; +import QtGui.QLabel; +import QtGui.QLineEdit; +import QtGui.QPainter; +import QtGui.QStyle; +import QtGui.QStyleOptionFrameV2; + +import QtCore.QDebug; + + +/* +QT_BEGIN_NAMESPACE +class QLineEdit; +QT_END_NAMESPACE + +class ClearButton; +*/ +class ExLineEdit : public QWidget +{ + Q_OBJECT + +public: + this(QWidget *parent = null) +{ + super(parent); + + m_leftWidget = 0; + m_lineEdit = new QLineEdit(this); + m_clearButton = 0; + + setFocusPolicy(m_lineEdit.focusPolicy()); + setAttribute(Qt.WA_InputMethodEnabled); + setSizePolicy(m_lineEdit.sizePolicy()); + setBackgroundRole(m_lineEdit.backgroundRole()); + setMouseTracking(true); + setAcceptDrops(true); + setAttribute(Qt.WA_MacShowFocusRect, true); + QPalette p = m_lineEdit.palette(); + setPalette(p); + + // line edit + m_lineEdit.setFrame(false); + m_lineEdit.setFocusProxy(this); + m_lineEdit.setAttribute(Qt.WA_MacShowFocusRect, false); + QPalette clearPalette = m_lineEdit.palette(); + clearPalette.setBrush(QPalette::Base, QBrush(Qt.transparent)); + m_lineEdit.setPalette(clearPalette); + + // clearButton + m_clearButton = new ClearButton(this); + connect(m_clearButton, SIGNAL(clicked()), + m_lineEdit, SLOT(clear())); + connect(m_lineEdit, SIGNAL(textChanged(const QString&)), + m_clearButton, SLOT(textChanged(const QString&))); +} + + inline QLineEdit *lineEdit() { return m_lineEdit; } + + void setLeftWidget(QWidget *widget) +{ + m_leftWidget = widget; +} + + QWidget *leftWidget() +{ + return m_leftWidget; +} + + QSize sizeHint() +{ + m_lineEdit.setFrame(true); + QSize size = m_lineEdit.sizeHint(); + m_lineEdit.setFrame(false); + return size; +} + + QVariant inputMethodQuery(Qt.InputMethodQuery property) +{ + return m_lineEdit.inputMethodQuery(property); +} + +protected: + void focusInEvent(QFocusEvent *event) +{ + m_lineEdit.event(event); + QWidget::focusInEvent(event); +} + + void focusOutEvent(QFocusEvent *event) +{ + m_lineEdit.event(event); + + if (m_lineEdit.completer()) { + connect(m_lineEdit.completer(), SIGNAL(activated(QString)), + m_lineEdit, SLOT(setText(QString))); + connect(m_lineEdit.completer(), SIGNAL(highlighted(QString)), + m_lineEdit, SLOT(_q_completionHighlighted(QString))); + } + QWidget::focusOutEvent(event); +} + + void keyPressEvent(QKeyEvent *event) +{ + m_lineEdit.event(event); +} + + void paintEvent(QPaintEvent *event) +{ + QPainter p(this); + QStyleOptionFrameV2 panel; + initStyleOption(&panel); + style().drawPrimitive(QStyle::PE_PanelLineEdit, &panel, &p, this); +} + + void resizeEvent(QResizeEvent *event) +{ + Q_ASSERT(m_leftWidget); + updateGeometries(); + QWidget::resizeEvent(event); +} + + void inputMethodEvent(QInputMethodEvent *e) +{ + m_lineEdit.event(e); +} + + bool event(QEvent *event) +{ + if (event.type() == QEvent::ShortcutOverride) + return m_lineEdit.event(event); + return QWidget::event(event); +} + +protected: + void updateGeometries() +{ + QStyleOptionFrameV2 panel; + initStyleOption(&panel); + QRect rect = style().subElementRect(QStyle::SE_LineEditContents, &panel, this); + + int height = rect.height(); + int width = rect.width(); + + int m_leftWidgetHeight = m_leftWidget.height(); + m_leftWidget.setGeometry(rect.x() + 2, rect.y() + (height - m_leftWidgetHeight)/2, + m_leftWidget.width(), m_leftWidget.height()); + + int clearButtonWidth = this.height(); + m_lineEdit.setGeometry(m_leftWidget.x() + m_leftWidget.width(), 0, + width - clearButtonWidth - m_leftWidget.width(), this.height()); + + m_clearButton.setGeometry(this.width() - clearButtonWidth, 0, + clearButtonWidth, this.height()); +} + + void initStyleOption(QStyleOptionFrameV2 *option) +{ + option.initFrom(this); + option.rect = contentsRect(); + option.lineWidth = style().pixelMetric(QStyle::PM_DefaultFrameWidth, option, this); + option.midLineWidth = 0; + option.state |= QStyle::State_Sunken; + if (m_lineEdit.isReadOnly()) + option.state |= QStyle::State_ReadOnly; +version(QT_KEYPAD_NAVIGATION) + if (hasEditFocus()) + option.state |= QStyle::State_HasEditFocus; +} + option.features = QStyleOptionFrameV2::None; +} + + QWidget *m_leftWidget; + QLineEdit *m_lineEdit; + ClearButton *m_clearButton; +}; + +class UrlIconLabel : public QLabel +{ + +public: + this(QWidget *parent) +{ + super(parent); + m_webView = 0; + setMinimumWidth(16); + setMinimumHeight(16); +} + + + WebView *m_webView; + +protected: + void mousePressEvent(QMouseEvent *event) +{ + if (event.button() == Qt.LeftButton) + m_dragStartPos = event.pos(); + QLabel::mousePressEvent(event); +} + + void mouseMoveEvent(QMouseEvent *event) +{ + if (event.buttons() == Qt.LeftButton + && (event.pos() - m_dragStartPos).manhattanLength() > QApplication::startDragDistance() + && m_webView) { + QDrag *drag = new QDrag(this); + QMimeData *mimeData = new QMimeData; + mimeData.setText(QString::fromUtf8(m_webView.url().toEncoded())); + QList<QUrl> urls; + urls.append(m_webView.url()); + mimeData.setUrls(urls); + drag.setMimeData(mimeData); + drag.exec(); + } +} + +private: + QPoint m_dragStartPos; + +} + + +//class UrlIconLabel; +//class WebView; +class UrlLineEdit : public ExLineEdit +{ + Q_OBJECT + +public: + this(QWidget *parent = null) +{ + super(parent); + m_webView = 0; + m_iconLabel = 0; + // icon + m_iconLabel = new UrlIconLabel(this); + m_iconLabel.resize(16, 16); + setLeftWidget(m_iconLabel); + m_defaultBaseColor = palette().color(QPalette::Base); + + webViewIconChanged(); +} + void setWebView(WebView *webView) +{ + Q_ASSERT(!m_webView); + m_webView = webView; + m_iconLabel.m_webView = webView; + connect(webView, SIGNAL(urlChanged(const QUrl &)), + this, SLOT(webViewUrlChanged(const QUrl &))); + connect(webView, SIGNAL(loadFinished(bool)), + this, SLOT(webViewIconChanged())); + connect(webView, SIGNAL(iconChanged()), + this, SLOT(webViewIconChanged())); + connect(webView, SIGNAL(loadProgress(int)), + this, SLOT(update())); +} + +protected: + void paintEvent(QPaintEvent *event) +{ + QPalette p = palette(); + if (m_webView && m_webView.url().scheme() == QLatin1String("https")) { + QColor lightYellow(248, 248, 210); + p.setBrush(QPalette::Base, generateGradient(lightYellow)); + } else { + p.setBrush(QPalette::Base, m_defaultBaseColor); + } + setPalette(p); + ExLineEdit::paintEvent(event); + + QPainter painter(this); + QStyleOptionFrameV2 panel; + initStyleOption(&panel); + QRect backgroundRect = style().subElementRect(QStyle::SE_LineEditContents, &panel, this); + if (m_webView && !hasFocus()) { + int progress = m_webView.progress(); + QColor loadingColor = QColor(116, 192, 250); + painter.setBrush(generateGradient(loadingColor)); + painter.setPen(Qt.transparent); + int mid = backgroundRect.width() / 100 * progress; + QRect progressRect(backgroundRect.x(), backgroundRect.y(), mid, backgroundRect.height()); + painter.drawRect(progressRect); + } +} + + void focusOutEvent(QFocusEvent *event); +{ + if (m_lineEdit.text().isEmpty() && m_webView) + m_lineEdit.setText(QString::fromUtf8(m_webView.url().toEncoded())); + ExLineEdit::focusOutEvent(event); +} + +private slots: + void webViewUrlChanged(const QUrl &url) +{ + m_lineEdit.setText(QString::fromUtf8(url.toEncoded())); + m_lineEdit.setCursorPosition(0); +} + + void webViewIconChanged() +{ + QUrl url = (m_webView) ? m_webView.url() : QUrl(); + QIcon icon = BrowserApplication::instance().icon(url); + QPixmap pixmap(icon.pixmap(16, 16)); + m_iconLabel.setPixmap(pixmap); +} + +private: + QLinearGradient generateGradient(const QColor &color) +{ + QLinearGradient gradient(0, 0, 0, height()); + gradient.setColorAt(0, m_defaultBaseColor); + gradient.setColorAt(0.15, color.lighter(120)); + gradient.setColorAt(0.5, color); + gradient.setColorAt(0.85, color.lighter(120)); + gradient.setColorAt(1, m_defaultBaseColor); + return gradient; +} + + WebView *m_webView; + UrlIconLabel *m_iconLabel; + QColor m_defaultBaseColor; +}