From ee9fc135d6ee214e999aebebb59459fce9147b38 Mon Sep 17 00:00:00 2001 From: lionelc Date: Thu, 15 Apr 2010 18:36:07 +0200 Subject: introduce search listitem --- src/urlbar/listitem.cpp | 404 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 310 insertions(+), 94 deletions(-) (limited to 'src/urlbar/listitem.cpp') diff --git a/src/urlbar/listitem.cpp b/src/urlbar/listitem.cpp index 18e8352d..ef09d4f3 100644 --- a/src/urlbar/listitem.cpp +++ b/src/urlbar/listitem.cpp @@ -36,7 +36,10 @@ #include #include #include -#include +#include +#include +#include + // Qt Includes #include @@ -45,111 +48,203 @@ #include #include #include -#include #include +#include +#include ListItem::ListItem(const UrlSearchItem &item, QWidget *parent) : QWidget(parent) + , m_option() + , m_url(item.url) { setAutoFillBackground(true); + + m_option.initFrom(this); + m_option.direction = Qt::LeftToRight; + + QPalette p(palette()); + p.setColor(QPalette::Base, Qt::white); // TODO: choose the correct color - QPalette p = palette(); - p.setColor(QPalette::Base, Qt::white); // TODO: choose the correct color p.setColor(QPalette::AlternateBase, QColor(247,247,247)); // TODO: choose the correct color setPalette(p); - - // ---------------------------------------- - + QHBoxLayout *hLayout = new QHBoxLayout; - - QLabel *previewLabelIcon = new QLabel; - previewLabelIcon->setFixedSize(45,33); - hLayout->addWidget(previewLabelIcon); + hLayout->setSpacing(4); + setLayout(hLayout); - // pixmap should ever exists - QPixmap pixmapIcon = Application::icon(item.url).pixmap(16); - - QString path = KStandardDirs::locateLocal("cache", QString("thumbs/") + guessNameFromUrl(item.url) + ".png", true); - if(QFile::exists(path)) - { - QLabel *previewLabel = new QLabel(previewLabelIcon); - previewLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); - QPixmap preview; - preview.load(path); - - previewLabel->setFixedSize(38,29); - previewLabel->setPixmap(preview.scaled(38,29, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); - } + deactivate(); +} - QLabel *iconLabel = new QLabel(previewLabelIcon); - iconLabel->setPixmap(pixmapIcon); - iconLabel->move(27, 16); - - //title and url - QVBoxLayout *vLayout = new QVBoxLayout; - hLayout->addLayout(vLayout); - - QLabel *titleLabel = new QLabel("" + item.title + ""); - titleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - QLabel *urlLabel = new QLabel("" + item.url.url() + ""); - urlLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - vLayout->addWidget(titleLabel); - vLayout->addWidget(urlLabel); - //type icon +ListItem::~ListItem() +{ + disconnect(); +} + - if (item.type & UrlSearchItem::Browse) - { - insertIcon(hLayout, "applications-internet"); - } + +void ListItem::activate() +{ + m_option.state |= QStyle::State_Selected; + update(); +} + + +void ListItem::deactivate() +{ + m_option.state &= ~QStyle::State_Selected; + update(); +} + + +void ListItem::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); - if (item.type & UrlSearchItem::Search) - { - insertIcon(hLayout, "edit-find"); - } - - if (item.type & UrlSearchItem::Bookmark) + if( m_option.state.testFlag(QStyle::State_Selected) || m_option.state.testFlag(QStyle::State_MouseOver)) { - insertIcon(hLayout, "rating"); + QPainter painter(this); + m_option.rect=QRect(QPoint(),size()); + style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &m_option, &painter, this); } + + QWidget::paintEvent(event); +} - if (item.type & UrlSearchItem::History) - { - insertIcon(hLayout, "view-history"); - } - setLayout(hLayout); - - _option.initFrom(this); - _option.direction = Qt::LeftToRight; - - deactivate(); +void ListItem::enterEvent(QEvent *e) +{ + m_option.state |= QStyle::State_MouseOver; + update(); + QWidget::enterEvent(e); } -ListItem::~ListItem() +void ListItem::leaveEvent(QEvent *e) { - disconnect(); + m_option.state &= ~QStyle::State_MouseOver; + update(); + QWidget::enterEvent(e); +} + + +void ListItem::mousePressEvent(QMouseEvent *e) +{ + emit itemClicked(this, e->button()); + QWidget::mousePressEvent(e); +} + + +KUrl ListItem::url() +{ + return m_url; +} + +void ListItem::nextItemSubChoice() +{ + //will be override } -void ListItem::insertIcon(QLayout *layout, QString icon) +TypeIcon::TypeIcon(int type, QWidget *parent) +:QLabel(parent) +{ + setMinimumWidth(40); + QHBoxLayout *hLayout = new QHBoxLayout; + hLayout->setMargin(0); + hLayout->setAlignment(Qt::AlignRight); + setLayout(hLayout); + + if (type & UrlSearchItem::Search) hLayout->addWidget(getIcon("edit-find")); + if (type & UrlSearchItem::Browse) hLayout->addWidget(getIcon("applications-internet")); + if (type & UrlSearchItem::Bookmark) hLayout->addWidget(getIcon("rating")); + if (type & UrlSearchItem::History) hLayout->addWidget(getIcon("view-history")); +} + + +QLabel *TypeIcon::getIcon(QString icon) { QLabel *iconLabel = new QLabel; - QPixmap pixmap = KIcon(icon).pixmap(18); + iconLabel->setFixedSize(16,16); + QPixmap pixmap = KIcon(icon).pixmap(16); iconLabel->setPixmap(pixmap); - iconLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); - layout->addWidget(iconLabel); + return iconLabel; +} + + + +ItemIcon::ItemIcon(QString icon, QWidget *parent) +:QLabel(parent) +{ + QPixmap pixmapIcon = KIcon(QWebSettings::iconForUrl(icon)).pixmap(16); + if (pixmapIcon.isNull()) + { + pixmapIcon = KIcon("text-html").pixmap(16); + } + + setFixedSize(16,16); + setPixmap(pixmapIcon); +} + + +ItemText::ItemText(QString text, QString underlined, QWidget *parent) +:QLabel(underlineText(text,underlined), parent) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); +} + + +QString ItemText::underlineText(QString text, QString textToUnderline) +{ + QString t = text; + t = t.replace(QRegExp("("+textToUnderline+")", Qt::CaseInsensitive), "\\1"); + return t; +} + + +//-------------------------------------------------------------------------------------------- + + +PreviewListItem::PreviewListItem(const UrlSearchItem &item, const QString &text, QWidget *parent) +:ListItem(item, parent) +{ + QLabel *previewLabelIcon = new QLabel; + previewLabelIcon->setFixedSize(45,33); + new ItemPreview(item.url.url(), 38, 29, previewLabelIcon); + ItemIcon* icon = new ItemIcon(item.url.url(), previewLabelIcon); + icon->move(27, 16); + layout()->addWidget(previewLabelIcon); + + QVBoxLayout *vLayout = new QVBoxLayout; + vLayout->setMargin(0); + ((QHBoxLayout *)layout())->addLayout(vLayout); + vLayout->addWidget(new ItemText(item.title, text)); + vLayout->addWidget(new ItemText("" + item.url.url() + "", text)); + layout()->addWidget(new TypeIcon(item.type)); +} + + +ItemPreview::ItemPreview(QString url, int width, int height, QWidget *parent) +:QLabel(parent) +{ + setFixedSize(width, height); + setFrameStyle(QFrame::StyledPanel | QFrame::Raised); + + QString path = KStandardDirs::locateLocal("cache", QString("thumbs/") + guessNameFromUrl(url) + ".png", true); + if(QFile::exists(path)) + { + QPixmap preview; + preview.load(path); + setPixmap(preview.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + } } //TODO: REMOVE DUPLICATE CODE WITH PREVIEWIMAGE -QString ListItem::guessNameFromUrl(KUrl url) +QString ItemPreview::guessNameFromUrl(QUrl url) { - QString name = url.url();// toString( QUrl::RemoveScheme | QUrl::RemoveUserInfo | QUrl::StripTrailingSlash ); + QString name = url.toString( QUrl::RemoveScheme | QUrl::RemoveUserInfo | QUrl::StripTrailingSlash ); // TODO learn Regular Expressions :) // and implement something better here.. @@ -165,52 +260,173 @@ QString ListItem::guessNameFromUrl(KUrl url) return name; } +//-------------------------------------------------------------------------------------------- +QString SearchListItem::m_currentEngine = ""; -void ListItem::activate() +SearchListItem::SearchListItem(const UrlSearchItem &item, const QString &text, QWidget *parent) + :ListItem(item, parent) + ,m_text(text) { - _option.state |= QStyle::State_Selected; - update(); + if (m_currentEngine == "") m_currentEngine = EngineBar::defaultEngine(); + + m_iconLabel = new ItemIcon("edit-find", this); //TODO: get the default engine icon + m_titleLabel = new ItemText(searchItemTitle(m_currentEngine, text), text); + m_engineBar = new EngineBar(text, m_currentEngine, this); + + layout()->addWidget(m_iconLabel); + layout()->addWidget(m_titleLabel); + layout()->addWidget(new QLabel("Engines: ")); + layout()->addWidget(m_engineBar); + layout()->addWidget(new TypeIcon(item.type)); + + connect(m_engineBar, SIGNAL(searchEngineChanged(QString, QString)), this, SLOT(changeSearchEngine(QString, QString))); } -void ListItem::deactivate() +QString SearchListItem::searchItemTitle(QString engine, QString text) { - _option.state &= ~QStyle::State_Selected; - update(); + return QString("Search "+ engine +" for "+text+""); } -void ListItem::paintEvent(QPaintEvent *event) +void SearchListItem::changeSearchEngine(QString url, QString engine) { - Q_UNUSED(event); + m_titleLabel->setText(searchItemTitle(engine,m_text)); + m_iconLabel->setPixmap(Application::icon(url).pixmap(16)); + m_url = KUrl(url); + m_currentEngine = engine; +} + + +void SearchListItem::nextItemSubChoice() +{ + m_engineBar->selectNextEngine(); +} + + +EngineBar::EngineBar(QString text, QString selectedEngine, QWidget *parent) +:KToolBar(parent) +{ + setIconSize(QSize(16,16)); + setToolButtonStyle(Qt::ToolButtonIconOnly); + + m_engineGroup = new QActionGroup(this); + m_engineGroup->setExclusive(true); + + KConfig config("kuriikwsfilterrc"); //Share with konqueror + KConfigGroup cg = config.group("General"); + QStringList favoriteEngines; + favoriteEngines << "wikipedia" << "google"; //defaults + favoriteEngines = cg.readEntry("FavoriteSearchEngines", favoriteEngines); + QString defaultEngine = cg.readEntry("DefaultSearchEngine", "google"); + KService::Ptr service; + + service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(defaultEngine)); + m_engineGroup->addAction(newEngineAction(service, selectedEngine, text)); - if( _option.state.testFlag(QStyle::State_Selected) || _option.state.testFlag(QStyle::State_MouseOver) ) + Q_FOREACH(const QString &engine, favoriteEngines) { - QPainter painter(this); - _option.rect = QRect(QPoint(),size()); - style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &_option, &painter, this); + if(!engine.isEmpty()) + { + service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(engine)); + if(service && service->desktopEntryName()!=defaultEngine) + { + m_engineGroup->addAction(newEngineAction(service, selectedEngine, text)); + } + } } + + addActions(m_engineGroup->actions()); } -void ListItem::enterEvent(QEvent *e) +QString EngineBar::defaultEngine() +{ + KConfig config("kuriikwsfilterrc"); //Share with konqueror + KConfigGroup cg = config.group("General"); + QString d = cg.readEntry("DefaultSearchEngine", "google"); + KService::Ptr service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(d)); + return service->name(); +} + + +KAction *EngineBar::newEngineAction(KService::Ptr service, QString selectedEngine, QString text) { - _option.state |= QStyle::State_MouseOver; - update(); - QWidget::enterEvent(e); + QString url = service->property("Query").toString(); + url = url.replace("\\{@}",text); + KAction *a = new KAction(Application::icon(url), service->name(), this); + a->setCheckable(true); + if (service->name()==selectedEngine) a->setChecked(true); + a->setData(QStringList() << url << service->name()); + connect(a, SIGNAL(triggered(bool)), this, SLOT(changeSearchEngine())); + + return a; } -void ListItem::leaveEvent(QEvent *e) +void EngineBar::changeSearchEngine() { - _option.state &= ~QStyle::State_MouseOver; - update(); - QWidget::enterEvent(e); + KAction *a = qobject_cast(sender()); + QStringList list = a->data().toStringList(); + emit searchEngineChanged(list.first(), list.last()); } -void ListItem::mousePressEvent(QMouseEvent *e) +void EngineBar::selectNextEngine() { - emit itemClicked(this, e->button()); - QWidget::mousePressEvent(e); + QList e = m_engineGroup->actions(); + int i = 0; + while(iisChecked()) + { + i++; + } + + if (i+1 == e.count()) + { + e.at(0)->setChecked(true); + e.at(0)->trigger(); + } + else + { + e.at(i+1)->setChecked(true); + e.at(i+1)->trigger(); + } } + + +//-------------------------------------------------------------------------------------------- + + +BrowseListItem::BrowseListItem(const UrlSearchItem &item, const QString &text, QWidget *parent) +:ListItem(item, parent) +{ + QString url = text; + layout()->addWidget(new ItemIcon(item.url.url())); + layout()->addWidget(new ItemText("Browse http://" + url.remove("http://") + "", text)); + layout()->addWidget(new TypeIcon(item.type)); +} + + +//-------------------------------------------------------------------------------------------- + + +ListItem *ListItemFactory::create(const UrlSearchItem &item, const QString &text, QWidget *parent) +{ + ListItem *newItem; + + if (item.type & UrlSearchItem::Browse) + { + newItem = new BrowseListItem(item, text, parent); + } + else if (item.type & UrlSearchItem::Search) + { + newItem = new SearchListItem(item, text, parent); + } + else + { + newItem = new PreviewListItem(item, text, parent); + } + + return newItem; +} + -- cgit v1.2.1