diff -r 000000000000 -r dd21522fd290 webengine/osswebengine/WebKit/qt/QtLauncher/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/osswebengine/WebKit/qt/QtLauncher/main.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,368 @@ +/* + * Copyright (C) 2006 George Staikos + * Copyright (C) 2006 Dirk Mueller + * Copyright (C) 2006 Zack Rusin + * Copyright (C) 2006 Simon Hausmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include + +#include +#include + + + +class InfoWidget :public QProgressBar { + Q_OBJECT +public: + InfoWidget(QWidget *parent) + : QProgressBar(parent), m_progress(0) + { + setMinimum(0); + setMaximum(100); + } + QSize sizeHint() const + { + QSize size(100, 20); + return size; + } +public slots: + void startLoad() + { + setValue(m_progress); + show(); + } + void changeLoad(int change) + { + m_progress = change; + setValue(change); + } + void endLoad() + { + QTimer::singleShot(1000, this, SLOT(hide())); + m_progress = 0; + } + +protected: + int m_progress; +}; + +class HoverLabel : public QWidget { + Q_OBJECT +public: + HoverLabel(QWidget *parent=0) + : QWidget(parent), + m_animating(false), + m_percent(0) + { + m_timer.setInterval(1000/30); + m_hideTimer.setInterval(500); + m_hideTimer.setSingleShot(true); + connect(&m_timer, SIGNAL(timeout()), + this, SLOT(update())); + connect(&m_hideTimer, SIGNAL(timeout()), + this, SLOT(hide())); + } + +public slots: + void setHoverLink(const QString &link) { + m_link = link; + if (m_link.isEmpty()) { + m_hideTimer.start(); + } else { + m_hideTimer.stop(); + m_oldSize = m_newSize; + m_newSize = sizeForFont(); + resetAnimation(); + updateSize(); + show(); + repaint(); + } + } + QSize sizeForFont() const { + QFont f = font(); + QFontMetrics fm(f); + return QSize(fm.width(m_link) + 10, fm.height() + 6); + } + QSize sizeHint() const { + if (!m_animating) + return sizeForFont(); + else + return (m_newSize.width() > m_oldSize.width()) ? m_newSize : m_oldSize; + } + void updateSize() { + QRect r = geometry(); + QSize newSize = sizeHint(); + r = QRect(r.x(), r.y(), newSize.width(), newSize.height()); + setGeometry(r); + } + void resetAnimation() { + m_animating = true; + m_percent = 0; + if (!m_timer.isActive()) + m_timer.start(); + } +protected: + void paintEvent(QPaintEvent *e) { + QPainter p(this); + p.setClipRect(e->rect()); + p.setPen(QPen(Qt::black, 1)); + QLinearGradient gradient(rect().topLeft(), rect().bottomLeft()); + gradient.setColorAt(0, QColor(255, 255, 255, 220)); + gradient.setColorAt(1, QColor(193, 193, 193, 220)); + p.setBrush(QBrush(gradient)); + QSize size; + { + //draw a nicely rounded corner rectangle. to avoid unwanted + // borders we move the coordinates outsize the our clip region + size = interpolate(m_oldSize, m_newSize, m_percent); + QRect r(-1, 0, size.width(), size.height()+2); + const int roundness = 20; + QPainterPath path; + path.moveTo(r.x(), r.y()); + path.lineTo(r.topRight().x()-roundness, r.topRight().y()); + path.cubicTo(r.topRight().x(), r.topRight().y(), + r.topRight().x(), r.topRight().y(), + r.topRight().x(), r.topRight().y() + roundness); + path.lineTo(r.bottomRight()); + path.lineTo(r.bottomLeft()); + path.closeSubpath(); + p.setRenderHint(QPainter::Antialiasing); + p.drawPath(path); + } + if (m_animating) { + if (qFuzzyCompare(m_percent, 1)) { + m_animating = false; + m_percent = 0; + m_timer.stop(); + } else { + m_percent += 0.1; + if (m_percent >= 0.99) { + m_percent = 1; + } + } + } + + QString txt; + QFontMetrics fm(fontMetrics()); + txt = fm.elidedText(m_link, Qt::ElideRight, size.width()-5); + p.drawText(5, height()-6, txt); + } + +private: + QSize interpolate(const QSize &src, const QSize &dst, qreal percent) { + int widthDiff = int((dst.width() - src.width()) * percent); + int heightDiff = int((dst.height() - src.height()) * percent); + return QSize(src.width() + widthDiff, + src.height() + heightDiff); + } + QString m_link; + bool m_animating; + QTimer m_timer; + QTimer m_hideTimer; + QSize m_oldSize; + QSize m_newSize; + qreal m_percent; +}; + +class SearchEdit; + +class ClearButton : public QPushButton { + Q_OBJECT +public: + ClearButton(QWidget *w) + : QPushButton(w) + { + setMinimumSize(24, 24); + setFixedSize(24, 24); + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + } + void paintEvent(QPaintEvent *event) + { + Q_UNUSED(event); + QPainter painter(this); + int height = parentWidget()->geometry().height(); + int width = height; //parentWidget()->geometry().width(); + + painter.setRenderHint(QPainter::Antialiasing, true); + painter.setPen(Qt::lightGray); + painter.setBrush(isDown() ? + QColor(140, 140, 190) : + underMouse() ? QColor(220, 220, 255) : QColor(200, 200, 230) + ); + painter.drawEllipse(4, 4, width - 8, height - 8); + painter.setPen(Qt::white); + int border = 8; + painter.drawLine(border, border, width - border, height - border); + painter.drawLine(border, height - border, width - border, border); + } +}; + +class SearchEdit : public QLineEdit +{ + Q_OBJECT +public: + SearchEdit(const QString &str, QWidget *parent = 0) + : QLineEdit(str, parent) + { + setMinimumSize(QSize(400, 24)); + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + setStyleSheet(":enabled { padding-right: 27px }"); + clearButton = new ClearButton(this); + clearButton->setGeometry(QRect(geometry().right() - 27, + geometry().top() - 2, + geometry().right(), geometry().bottom())); + clearButton->setVisible(true); +#ifndef QT_NO_CURSOR + clearButton->setCursor(Qt::ArrowCursor); +#endif +#ifndef QT_NO_TOOLTIP + clearButton->setToolTip("Clear"); +#endif + connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); + } + ~SearchEdit() { } +protected: + virtual void paintEvent(QPaintEvent *e) { + QLineEdit::paintEvent(e); + if(text().isEmpty()) + clearButton->setVisible(false); + else + clearButton->setVisible(true); + } + virtual void resizeEvent(QResizeEvent *) { + clearButton->setParent(this); + clearButton->setGeometry(QRect(width()-27, + 0, + 24, 24)); + } + virtual void moveEvent(QMoveEvent *) { + clearButton->setParent(this); + clearButton->setGeometry(QRect(width()-27, 1, + 24, 24)); + } + + QPushButton *clearButton; +}; + +class MainWindow : public QMainWindow +{ + Q_OBJECT +public: + MainWindow(const QUrl &url) + { + page = new QWebPage(this); + InfoWidget *info = new InfoWidget(page); + info->setGeometry(20, 20, info->sizeHint().width(), + info->sizeHint().height()); + connect(page, SIGNAL(loadStarted(QWebFrame*)), + info, SLOT(startLoad())); + connect(page, SIGNAL(loadProgressChanged(int)), + info, SLOT(changeLoad(int))); + connect(page, SIGNAL(loadFinished(QWebFrame*)), + info, SLOT(endLoad())); + connect(page, SIGNAL(loadFinished(QWebFrame*)), + this, SLOT(loadFinished())); + connect(page, SIGNAL(titleChanged(const QString&)), + this, SLOT(setWindowTitle(const QString&))); + connect(page, SIGNAL(hoveringOverLink(const QString&, const QString&)), + this, SLOT(showLinkHover(const QString&, const QString&))); + + + setCentralWidget(page); + + QToolBar *bar = addToolBar("Navigation"); + urlEdit = new SearchEdit(url.toString()); + connect(urlEdit, SIGNAL(returnPressed()), + SLOT(changeLocation())); + bar->addAction("Go back", page, SLOT(goBack())); + bar->addAction("Stop", page, SLOT(stop())); + bar->addAction("Go forward", page, SLOT(goForward())); + bar->addWidget(urlEdit); + + hoverLabel = new HoverLabel(this); + hoverLabel->hide(); + + page->open(url); + + info->raise(); + } +protected slots: + void changeLocation() + { + QUrl url(urlEdit->text()); + page->open(url); + } + void loadFinished() + { + urlEdit->setText(page->url().toString()); + } + void showLinkHover(const QString &link, const QString &toolTip) + { + //statusBar()->showMessage(link); + hoverLabel->setHoverLink(link); +#ifndef QT_NO_TOOLTIP + if (!toolTip.isEmpty()) + QToolTip::showText(QCursor::pos(), toolTip); +#endif + } +protected: + void resizeEvent(QResizeEvent *) { + QSize hoverSize = hoverLabel->sizeHint(); + hoverLabel->setGeometry(0, height()-hoverSize.height(), + 300, hoverSize.height()); + } +private: + QWebPage *page; + QLineEdit *urlEdit; + HoverLabel *hoverLabel; +}; + +#include "main.moc" + +int main(int argc, char **argv) +{ + QString url = QString("%1/%2").arg(QDir::homePath()).arg(QLatin1String("index.html")); + QApplication app(argc, argv); + + QWebSettings settings = QWebSettings::global(); + settings.setAttribute(QWebSettings::PluginsEnabled); + QWebSettings::setGlobal(settings); + + const QStringList args = app.arguments(); + if (args.count() > 1) + url = args.at(1); + + QUrl qurl(url); + if (qurl.scheme().isEmpty()) + qurl = QUrl::fromLocalFile(QFileInfo(url).absoluteFilePath()); + MainWindow window(qurl); + window.show(); + + return app.exec(); +}