view 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 source

/****************************************************************************
**
** 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;
}