From 997d64c9743149b2b400891b09ab99e9613bf273 Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Fri, 27 Nov 2009 02:21:04 +0100 Subject: Last structure change, promised! Anyway, this moving/renaming helped me finding lots of strange circulary dependencies and easily solve them :) We have also a more organized structure, hopefully letting people work on different areas altogether. --- src/urlbar/lineedit.cpp | 69 ++++++++++ src/urlbar/lineedit.h | 55 ++++++++ src/urlbar/urlbar.cpp | 342 ++++++++++++++++++++++++++++++++++++++++++++++++ src/urlbar/urlbar.h | 99 ++++++++++++++ 4 files changed, 565 insertions(+) create mode 100644 src/urlbar/lineedit.cpp create mode 100644 src/urlbar/lineedit.h create mode 100644 src/urlbar/urlbar.cpp create mode 100644 src/urlbar/urlbar.h (limited to 'src/urlbar') diff --git a/src/urlbar/lineedit.cpp b/src/urlbar/lineedit.cpp new file mode 100644 index 00000000..f3c93e8e --- /dev/null +++ b/src/urlbar/lineedit.cpp @@ -0,0 +1,69 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2009 by Andrea Diamantini +* Copyright (C) 2009 by Paweł Prażak +* Copyright (C) 2009 by Lionel Chauvin +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* ============================================================ */ + + +// Self Includes +#include "lineedit.h" +#include "lineedit.moc" + +// Qt Includes +#include +#include +#include + + +LineEdit::LineEdit(QWidget* parent) + : KLineEdit(parent) +{ + setMinimumWidth(200); + setFocusPolicy(Qt::WheelFocus); + setHandleSignals(true); + setClearButtonShown(true); +} + + +LineEdit::~LineEdit() +{ +} + + +void LineEdit::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Escape) + { + clearFocus(); + event->accept(); + } + + KLineEdit::keyPressEvent(event); +} + + +void LineEdit::mouseDoubleClickEvent(QMouseEvent *) +{ + selectAll(); +} diff --git a/src/urlbar/lineedit.h b/src/urlbar/lineedit.h new file mode 100644 index 00000000..67ded052 --- /dev/null +++ b/src/urlbar/lineedit.h @@ -0,0 +1,55 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2009 by Andrea Diamantini +* Copyright (C) 2009 by Paweł Prażak +* Copyright (C) 2009 by Lionel Chauvin +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* ============================================================ */ + + +#ifndef LINEEDIT_H +#define LINEEDIT_H + + +// KDE Includes +#include + +// Forward Declarations +class QContextMenuEvent; +class QFocusEvent; +class QKeyEvent; + + +class LineEdit : public KLineEdit +{ + Q_OBJECT + +public: + explicit LineEdit(QWidget *parent = 0); + virtual ~LineEdit(); + +protected: + virtual void keyPressEvent(QKeyEvent*); + virtual void mouseDoubleClickEvent(QMouseEvent *); +}; + +#endif // LINEEDIT_H diff --git a/src/urlbar/urlbar.cpp b/src/urlbar/urlbar.cpp new file mode 100644 index 00000000..2adfcd17 --- /dev/null +++ b/src/urlbar/urlbar.cpp @@ -0,0 +1,342 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2008-2009 by Andrea Diamantini +* Copyright (C) 2009 by Domrachev Alexandr +* Copyright (C) 2009 by Paweł Prażak +* Copyright (C) 2009 by Lionel Chauvin +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* ============================================================ */ + + +// Self Includes +#include "urlbar.h" +#include "urlbar.moc" + +// Local Includes +#include "application.h" +#include "historymodels.h" +#include "lineedit.h" +#include "mainwindow.h" +#include "webview.h" + +// KDE Includes +#include +#include +#include + +// Qt Includes +#include +#include +#include + + +QColor UrlBar::s_defaultBaseColor; + + +UrlBar::UrlBar(QWidget *parent) + : KHistoryComboBox(true, parent) + , m_lineEdit(new LineEdit) + , m_progress(0) +{ + setUrlDropsEnabled(true); + setAutoDeleteCompletionObject(true); + + //cosmetic + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + setMinimumWidth(180); + + setTrapReturnKey(true); + + setupLineEdit(); + + // add every item to history + connect(this, SIGNAL(returnPressed(const QString&)), SLOT(activated(const QString&))); + connect(completionBox(), SIGNAL(activated(const QString&)), SLOT(activated(const QString&))); + + connect(this, SIGNAL(cleared()), SLOT(cleared())); + + // setup completion box + setCompletionObject( Application::historyManager()->completionObject() ); + + // set dropdown list background + QPalette p = view()->palette(); + p.setColor(QPalette::Base, palette().color(QPalette::Base)); + view()->setPalette(p); + + // load urls on activated urlbar signal + connect(this, SIGNAL(activated(const KUrl&)), Application::instance(), SLOT(loadUrl(const KUrl&))); +} + + +UrlBar::~UrlBar() +{ +} + + +void UrlBar::selectAll() const +{ + lineEdit()->selectAll(); +} + + +KUrl UrlBar::url() const +{ + return m_currentUrl; +} + + +KLineEdit *UrlBar::lineEdit() const +{ + return m_lineEdit; +} + + +void UrlBar::setupLineEdit() +{ + // Make m_lineEdit background transparent + QPalette p = m_lineEdit->palette(); + p.setColor(QPalette::Base, Qt::transparent); + m_lineEdit->setPalette(p); + + if (!s_defaultBaseColor.isValid()) + { + s_defaultBaseColor = palette().color(QPalette::Base); + } + + setLineEdit(m_lineEdit); + + // Make the lineedit consume the Qt::Key_Enter event... + lineEdit()->setTrapReturnKey(true); + + lineEdit()->setHandleSignals(true); + + // clear the URL bar + lineEdit()->clear(); +} + + +void UrlBar::setUrl(const QUrl& url) +{ + if(url.scheme() == "about") + { + m_currentUrl = ""; + setFocus(); + } + else + m_currentUrl = url; + + updateUrl(); +} + + +void UrlBar::setProgress(int progress) +{ + m_progress = progress; + repaint(); +} + + +void UrlBar::updateUrl() +{ + // Don't change my typed url... + // FIXME this is not a proper solution (also if it works...) + if(hasFocus()) + { + kDebug() << "Don't change my typed url..."; + return; + } + + KIcon icon; + if(m_currentUrl.isEmpty()) icon = KIcon("arrow-right"); + else icon = Application::icon(m_currentUrl); + + if (count()) + { + changeUrl(0, icon, m_currentUrl); + } + else + { + insertUrl(0, icon, m_currentUrl); + } + + setCurrentIndex(0); + + // important security consideration: always display the beginning + // of the url rather than its end to prevent spoofing attempts. + // Must be AFTER setCurrentIndex + if (!hasFocus()) + { + lineEdit()->setCursorPosition(0); + } +} + + +void UrlBar::activated(const QString& url) +{ + if (url.isEmpty()) + return; + + setUrl(url); + + Application::historyManager()->addHistoryEntry(url); + + emit activated(m_currentUrl); +} + + +void UrlBar::cleared() +{ + // clear the history on user's request from context menu + clear(); + Application::historyManager()->clear(); +} + + +void UrlBar::loadFinished(bool) +{ + // reset progress bar after small delay + m_progress = 0; + QTimer::singleShot(200, this, SLOT(repaint())); +} + + +void UrlBar::updateProgress(int progress) +{ + m_progress = progress; + repaint(); +} + + +void UrlBar::paintEvent(QPaintEvent *event) +{ + // set background color of UrlBar + QPalette p = palette(); + p.setColor(QPalette::Base, s_defaultBaseColor); + setPalette(p); + + KHistoryComboBox::paintEvent(event); + + if (!hasFocus()) + { + QPainter painter(this); + + QColor loadingColor; + if (m_currentUrl.scheme() == QLatin1String("https")) + { + loadingColor = QColor(248, 248, 100); + } + else + { + loadingColor = QColor(116, 192, 250); + } + painter.setBrush(generateGradient(loadingColor, height())); + painter.setPen(Qt::transparent); + + QRect backgroundRect = lineEdit()->frameGeometry(); + int mid = backgroundRect.width() * m_progress / 100; + QRect progressRect(backgroundRect.x(), backgroundRect.y(), mid, backgroundRect.height()); + painter.drawRect(progressRect); + painter.end(); + } +} + + +void UrlBar::focusOutEvent(QFocusEvent *event) +{ + // set back last loaded url in case user cleared it + if (!m_currentUrl.equals(KUrl(lineEdit()->text()))) setUrl(m_currentUrl); + + KHistoryComboBox::focusOutEvent(event); +} + + +QSize UrlBar::sizeHint() const +{ + return lineEdit()->sizeHint(); +} + + +QLinearGradient UrlBar::generateGradient(const QColor &color, int height) +{ + QColor base = s_defaultBaseColor; + base.setAlpha(0); + QColor barColor = color; + barColor.setAlpha(200); + QLinearGradient gradient(0, 0, 0, height); + gradient.setColorAt(0, base); + gradient.setColorAt(0.25, barColor.lighter(120)); + gradient.setColorAt(0.5, barColor); + gradient.setColorAt(0.75, barColor.lighter(120)); + gradient.setColorAt(1, base); + return gradient; +} + + +void UrlBar::setBackgroundColor(QColor c) +{ + s_defaultBaseColor=c; + repaint(); +} + + +bool UrlBar::isLoading() +{ + if(m_progress == 0) + { + return false; + } + return true; +} + +void UrlBar::keyPressEvent(QKeyEvent *event) +{ + QString currentText = m_lineEdit->text().trimmed(); + if ((event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) + && !currentText.startsWith(QLatin1String("http://"), Qt::CaseInsensitive)) + { + QString append; + if (event->modifiers() == Qt::ControlModifier) + { + append = QLatin1String(".com"); + } + else if (event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) + { + append = QLatin1String(".org"); + } + else if (event->modifiers() == Qt::ShiftModifier) + { + append = QLatin1String(".net"); + } + + QUrl url(QLatin1String("http://www.") + currentText); + QString host = url.host(); + if (!host.endsWith(append, Qt::CaseInsensitive)) + { + host += append; + url.setHost(host); + m_lineEdit->setText(url.toString()); + } + } + + KHistoryComboBox::keyPressEvent(event); +} + diff --git a/src/urlbar/urlbar.h b/src/urlbar/urlbar.h new file mode 100644 index 00000000..0e8bab26 --- /dev/null +++ b/src/urlbar/urlbar.h @@ -0,0 +1,99 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2008-2009 by Andrea Diamantini +* Copyright (C) 2009 by Domrachev Alexandr +* Copyright (C) 2009 by Paweł Prażak +* Copyright (C) 2009 by Lionel Chauvin +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* ============================================================ */ + + +#ifndef URLBAR_H +#define URLBAR_H + + +// Local Includes +#include "lineedit.h" + +// KDE Includes +#include +#include + +// Qt Includes +#include + +// Forward Declarations +class QLinearGradient; +class QWidget; +class KCompletion; + + +class UrlBar : public KHistoryComboBox +{ + Q_OBJECT + +public: + UrlBar(QWidget *parent = 0); + ~UrlBar(); + + void selectAll() const; + KUrl url() const; + QSize sizeHint() const; + void setBackgroundColor(QColor); + bool isLoading(); + + void setProgress(int progress); + +signals: + void activated(const KUrl&); + +public slots: + void setUrl(const QUrl &url); + void updateProgress(int progress); + void updateUrl(); + +private slots: + void activated(const QString& url); + void loadFinished(bool); + void cleared(); + +protected: + virtual void paintEvent(QPaintEvent *event); + virtual void focusOutEvent(QFocusEvent *event); + virtual void keyPressEvent(QKeyEvent *event); + +private: + void setupLineEdit(); + + KLineEdit *lineEdit() const; + + static QLinearGradient generateGradient(const QColor &color, int height); + + static QColor s_defaultBaseColor; + + LineEdit *m_lineEdit; + + KUrl m_currentUrl; + int m_progress; +}; + +#endif -- cgit v1.2.1