diff options
Diffstat (limited to 'src/urlbar')
-rw-r--r-- | src/urlbar/completionwidget.cpp | 9 | ||||
-rw-r--r-- | src/urlbar/listitem.cpp | 59 | ||||
-rw-r--r-- | src/urlbar/listitem.h | 20 | ||||
-rw-r--r-- | src/urlbar/urlresolver.cpp | 248 | ||||
-rw-r--r-- | src/urlbar/urlresolver.h | 31 |
5 files changed, 261 insertions, 106 deletions
diff --git a/src/urlbar/completionwidget.cpp b/src/urlbar/completionwidget.cpp index b77e2d7c..a9203bf7 100644 --- a/src/urlbar/completionwidget.cpp +++ b/src/urlbar/completionwidget.cpp @@ -153,13 +153,10 @@ void CompletionWidget::activateCurrentListItem() //update text of the url bar bar->blockSignals(true); //without compute suggestions - if (!widget->inherits("SearchListItem")) - bar->setQUrl( widget->url() ); - else - bar->setQUrl( _typedString ); + bar->setQUrl(widget->text()); bar->blockSignals(false); bar->setFocus(); - bar->setCursorPosition( bar->text().length() ); + bar->setCursorPosition(bar->text().length()); } @@ -240,7 +237,7 @@ bool CompletionWidget::eventFilter(QObject *obj, QEvent *ev) if( _currentIndex == -1) _currentIndex = 0; child = findChild<ListItem *>(QString::number(_currentIndex)); - if(child && _typedString == w->text()) + if(child) { emit chosenUrl(child->url(), Rekonq::CurrentTab); } diff --git a/src/urlbar/listitem.cpp b/src/urlbar/listitem.cpp index f10cefd7..e9bb6fbb 100644 --- a/src/urlbar/listitem.cpp +++ b/src/urlbar/listitem.cpp @@ -139,6 +139,12 @@ KUrl ListItem::url() } +QString ListItem::text() +{ + return m_url.url(); +} + + void ListItem::nextItemSubChoice() { //will be override @@ -161,6 +167,7 @@ TypeIconLabel::TypeIconLabel(int type, QWidget *parent) 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")); + if (type & UrlSearchItem::Suggestion) hLayout->addWidget(getIcon("help-hint")); } @@ -297,6 +304,12 @@ SearchListItem::SearchListItem(const UrlSearchItem &item, const QString &text, Q } +QString SearchListItem::text() +{ + return m_text; +} + + QString SearchListItem::searchItemTitle(QString engine, QString text) { return QString(i18nc("%1=search engine, e.g. Google, Wikipedia %2=text to search for", "Search %1 for <b>%2</b>", engine, Qt::escape(text))); @@ -390,6 +403,42 @@ void EngineBar::selectNextEngine() // --------------------------------------------------------------- +SuggestionListItem::SuggestionListItem(const UrlSearchItem &item, const QString &text, QWidget *parent) + : ListItem(item, parent) + , m_text(item.title) +{ + QHBoxLayout *hLayout = new QHBoxLayout; + hLayout->setSpacing(4); + + QString query = item.title; + KService::Ptr engine = SearchEngine::fromString(query); + if (engine) + { + query = query.remove(0, text.indexOf(SearchEngine::delimiter()) + 1); + } + else + { + engine = qobject_cast<CompletionWidget *>(parent)->searchEngine(); + } + + m_url = SearchEngine::buildQuery(engine, query); + + hLayout->addWidget(new IconLabel(SearchEngine::buildQuery(engine, ""), this)); + hLayout->addWidget(new TextLabel(item.title, text, this)); + hLayout->addWidget(new TypeIconLabel(item.type, this)); + + setLayout(hLayout); +} + + +QString SuggestionListItem::text() +{ + return m_text; +} + +// --------------------------------------------------------------- + + BrowseListItem::BrowseListItem(const UrlSearchItem &item, const QString &text, QWidget *parent) : ListItem(item, parent) { @@ -427,7 +476,15 @@ ListItem *ListItemFactory::create(const UrlSearchItem &item, const QString &text } else { - newItem = new PreviewListItem(item, text, parent); + + if (item.type & UrlSearchItem::Suggestion) + { + newItem = new SuggestionListItem(item, text, parent); + } + else + { + newItem = new PreviewListItem(item, text, parent); + } } } diff --git a/src/urlbar/listitem.h b/src/urlbar/listitem.h index dcb4f76d..06a02b80 100644 --- a/src/urlbar/listitem.h +++ b/src/urlbar/listitem.h @@ -61,7 +61,8 @@ public: void deactivate(); KUrl url(); - + virtual QString text(); + public slots: virtual void nextItemSubChoice(); @@ -153,6 +154,7 @@ class SearchListItem : public ListItem public: explicit SearchListItem(const UrlSearchItem &item, const QString &text, QWidget *parent = 0); + QString text(); public slots: virtual void nextItemSubChoice(); @@ -174,6 +176,22 @@ private: // ------------------------------------------------------------------------- +class SuggestionListItem : public ListItem +{ + Q_OBJECT + +public: + SuggestionListItem(const UrlSearchItem &item, const QString &text, QWidget *parent = 0); + QString text(); + +private: + QString m_text; +}; + + +// ------------------------------------------------------------------------- + + class PreviewListItem : public ListItem { Q_OBJECT diff --git a/src/urlbar/urlresolver.cpp b/src/urlbar/urlresolver.cpp index ed4dcb4e..0505dad1 100644 --- a/src/urlbar/urlresolver.cpp +++ b/src/urlbar/urlresolver.cpp @@ -45,7 +45,7 @@ // defines #define MAX_ELEMENTS 10 - +#define MIN_SUGGESTIONS 3 // NOTE // default kurifilter plugin list (at least in my box): @@ -63,7 +63,8 @@ QRegExp UrlResolver::_browseRegexp; QRegExp UrlResolver::_searchEnginesRegexp; UrlResolver::UrlResolver(const QString &typedUrl) - : _typedString(typedUrl.trimmed()) + : QObject() + , _typedString(typedUrl.trimmed()) { if ( _browseRegexp.isEmpty() ) { @@ -110,20 +111,9 @@ UrlResolver::UrlResolver(const QString &typedUrl) UrlSearchList UrlResolver::orderedSearchItems() { - // NOTE - // the logic here is : "we wanna suggest (at least) 10 elements" - // so we have (more or less) 2 from first results (1 from QUrl Resolutions, 1 from - // search engines). - // There are 8 remaining: if bookmarkResults + historyResults <= 8, catch all, else - // catch first 4 results from the two resulting lists :) - - QTime myTime; - myTime.start(); - - UrlSearchList list; - if( _typedString == QL1S("about:") ) { + UrlSearchList list; UrlSearchItem home(UrlSearchItem::Browse, QString("about:home"), QL1S("home") ); list << home; UrlSearchItem favs(UrlSearchItem::Browse, QString("about:favorites"), QL1S("favorites") ); @@ -136,148 +126,189 @@ UrlSearchList UrlResolver::orderedSearchItems() list << hist; UrlSearchItem down(UrlSearchItem::Browse, QString("about:downloads"), QL1S("downloads") ); list << down; - + return list; } + _computedListsCount = 0; + + //compute lists + computeSuggestions(); + computeQurlFromUserInput(); + computeWebSearches(); + computeBookmarks(); + computeHistory(); + + QTime time; + time.start(); + + while (_computedListsCount < 5 && time.msec() < 1000) + { + Application::instance()->processEvents(QEventLoop::WaitForMoreEvents | QEventLoop::ExcludeUserInputEvents); + } + + return orderLists(); +} + + +UrlSearchList UrlResolver::orderLists() +{ + // NOTE + // the logic here is : "we wanna suggest (at least) 10 elements" + // so we have (more or less) 2 from first results (1 from QUrl Resolutions, 1 from + // search engines). + // There are 8 remaining: if bookmarkResults + historyResults <= 8, catch all, else + // catch first 4 results from the two resulting lists :) + + QTime myTime; + myTime.start(); + + UrlSearchList list; + if(_browseRegexp.indexIn(_typedString) != -1) { - list << qurlFromUserInputResolution(); - list << webSearchesResolution(); + list << _qurlFromUserInput; + list << _webSearches; } else { - list << webSearchesResolution(); - list << qurlFromUserInputResolution(); + list << _webSearches; + list << _qurlFromUserInput; } //find the history items that match the typed string - UrlSearchList historyList = historyResolution(); - UrlSearchItem privileged = privilegedItem(&historyList); - int historyResults = historyList.count(); + UrlSearchItem privileged = privilegedItem(&_history); + int historyCount = _history.count(); //find the bookmarks items that match the typed string - UrlSearchList bookmarksList = bookmarksResolution(); if (privileged.type == UrlSearchItem::Undefined) { - privileged = privilegedItem(&bookmarksList); + privileged = privilegedItem(&_bookmarks); } - else if(privileged.type == UrlSearchItem::History && bookmarksList.removeOne(privileged)) + else if(privileged.type == UrlSearchItem::History && _bookmarks.removeOne(privileged)) { privileged.type |= UrlSearchItem::Bookmark; } - int bookmarksResults = bookmarksList.count(); + int bookmarksCount = _bookmarks.count(); if (privileged.type != UrlSearchItem::Undefined) { list.prepend(privileged); } + + int availableEntries = MAX_ELEMENTS - list.count() - MIN_SUGGESTIONS; - int availableEntries = MAX_ELEMENTS - list.count(); - - UrlSearchList commonList; - int commonResutls = 0; + UrlSearchList common; + int commonCount = 0; //prefer items which are history items als well bookmarks item //if there are more than 1000 bookmark results, the performance impact is noticeable - if(bookmarksResults < 1000) + if(bookmarksCount < 1000) { //add as many items to the common list as there are available entries in the dropdown list UrlSearchItem urlSearchItem; - for(int i = 0; i < historyList.count(); i++) + for(int i = 0; i < _history.count(); i++) { - if (bookmarksList.removeOne(historyList.at(i))) + if (_bookmarks.removeOne(_history.at(i))) { - urlSearchItem = historyList.takeAt(i); + urlSearchItem = _history.takeAt(i); urlSearchItem.type |= UrlSearchItem::Bookmark; - commonList << urlSearchItem; - commonResutls++; - if(commonResutls >= availableEntries) + common << urlSearchItem; + commonCount++; + if(commonCount >= availableEntries) { break; } } } - commonResutls = commonList.count(); - if(commonResutls >= availableEntries) + commonCount = common.count(); + if(commonCount >= availableEntries) { - commonList = commonList.mid(0, availableEntries); - historyList = UrlSearchList(); - bookmarksList = UrlSearchList(); + common = common.mid(0, availableEntries); + _history = UrlSearchList(); + _bookmarks = UrlSearchList(); availableEntries = 0; } else //remove all items from the history and bookmarks list up to the remaining entries in the dropdown list { - availableEntries -= commonResutls; - if(historyResults >= availableEntries) + availableEntries -= commonCount; + if(historyCount >= availableEntries) { - historyList = historyList.mid(0, availableEntries); + _history = _history.mid(0, availableEntries); } - if(bookmarksResults >= availableEntries) + if(bookmarksCount >= availableEntries) { - bookmarksList = bookmarksList.mid(0, availableEntries); + _bookmarks = _bookmarks.mid(0, availableEntries); } } } else //if there are too many bookmarks items, remove all items up to the remaining entries in the dropdown list { - - if(historyResults >= availableEntries) + + if(historyCount >= availableEntries) { - historyList = historyList.mid(0, availableEntries); + _history = _history.mid(0, availableEntries); } - if(bookmarksResults >= availableEntries) + if(bookmarksCount >= availableEntries) { - bookmarksList = bookmarksList.mid(0, availableEntries); + _bookmarks = _bookmarks.mid(0, availableEntries); } UrlSearchItem urlSearchItem; - for(int i = 0; i < historyList.count(); i++) + for(int i = 0; i < _history.count(); i++) { - if (bookmarksList.removeOne(historyList.at(i))) + if (_bookmarks.removeOne(_history.at(i))) { - urlSearchItem = historyList.takeAt(i); + urlSearchItem = _history.takeAt(i); urlSearchItem.type |= UrlSearchItem::Bookmark; - commonList << urlSearchItem; + common << urlSearchItem; } } - availableEntries -= commonList.count(); + availableEntries -= common.count(); } - historyResults = historyList.count(); - bookmarksResults = bookmarksList.count(); - commonResutls = commonList.count(); - + historyCount = _history.count(); + bookmarksCount = _bookmarks.count(); + commonCount = common.count(); + //now fill the list to MAX_ELEMENTS if(availableEntries > 0) { int historyEntries = ((int) (availableEntries / 2)) + availableEntries % 2; int bookmarksEntries = availableEntries - historyEntries; - if (historyResults >= historyEntries && bookmarksResults >= bookmarksEntries) + if (historyCount >= historyEntries && bookmarksCount >= bookmarksEntries) { - historyList = historyList.mid(0, historyEntries); - bookmarksList = bookmarksList.mid(0, bookmarksEntries); + _history = _history.mid(0, historyEntries); + _bookmarks = _bookmarks.mid(0, bookmarksEntries); } - else if (historyResults < historyEntries && bookmarksResults >= bookmarksEntries) + else if (historyCount < historyEntries && bookmarksCount >= bookmarksEntries) { - if(historyResults + bookmarksResults > availableEntries) + if(historyCount + bookmarksCount > availableEntries) { - bookmarksList = bookmarksList.mid(0, availableEntries - historyResults); + _bookmarks = _bookmarks.mid(0, availableEntries - historyCount); } } - else if (historyResults >= historyEntries && bookmarksResults < bookmarksEntries) + else if (historyCount >= historyEntries && bookmarksCount < bookmarksEntries) { - if(historyResults + bookmarksResults > availableEntries) + if(historyCount + bookmarksCount > availableEntries) { - historyList = historyList.mid(0, availableEntries - bookmarksResults); + _history = _history.mid(0, availableEntries - bookmarksCount); } } } - - list = list + historyList + commonList + bookmarksList; + + availableEntries -= _history.count(); + availableEntries -= _bookmarks.count(); + + if (_suggestions.count() > availableEntries + MIN_SUGGESTIONS) + { + _suggestions = _suggestions.mid(0, availableEntries + MIN_SUGGESTIONS); + } + + list = list + _history + common + _bookmarks + _suggestions; qWarning() << "orderedSearchItems leave: " << " elapsed: " << myTime.elapsed(); return list; @@ -288,60 +319,93 @@ UrlSearchList UrlResolver::orderedSearchItems() // PRIVATE ENGINES -// STEP 1 = QUrl from User Input (easily the best solution... ) -UrlSearchList UrlResolver::qurlFromUserInputResolution() +//QUrl from User Input (easily the best solution... ) +void UrlResolver::computeQurlFromUserInput() { - UrlSearchList list; - QString url2 = _typedString; - QUrl urlFromUserInput = QUrl::fromUserInput(url2); + QString url = _typedString; + QUrl urlFromUserInput = QUrl::fromUserInput(url); if (urlFromUserInput.isValid()) { QString gTitle = i18nc("Browse a website", "Browse"); UrlSearchItem gItem(UrlSearchItem::Browse, urlFromUserInput.toString(), gTitle); - list << gItem; + _qurlFromUserInput << gItem; } - return list; + _computedListsCount++; } -// STEP 2 = Web Searches -UrlSearchList UrlResolver::webSearchesResolution() +//webSearches +void UrlResolver::computeWebSearches() { - return UrlSearchList() << UrlSearchItem(UrlSearchItem::Search, QString(), QString()); + _webSearches = (UrlSearchList() << UrlSearchItem(UrlSearchItem::Search, QString(), QString())); + _computedListsCount++; } -// STEP 3 = history completion -UrlSearchList UrlResolver::historyResolution() +//history +void UrlResolver::computeHistory() { QList<HistoryItem> found = Application::historyManager()->find(_typedString); qSort(found); - UrlSearchList list; Q_FOREACH(const HistoryItem &i, found) { if (_searchEnginesRegexp.indexIn(i.url) == -1) //filter all urls that are search engine results { UrlSearchItem gItem(UrlSearchItem::History, i.url, i.title); - list << gItem; + _history << gItem; } } - return list; + + _computedListsCount++; } -// STEP 4 = bookmarks completion -UrlSearchList UrlResolver::bookmarksResolution() +// bookmarks +void UrlResolver::computeBookmarks() { - UrlSearchList list; QList<KBookmark> found = Application::bookmarkProvider()->find(_typedString); + Q_FOREACH(const KBookmark &b, found) { UrlSearchItem gItem(UrlSearchItem::Bookmark, b.url().url(), b.fullText()); - list << gItem; + _bookmarks << gItem; } - return list; + + _computedListsCount++; +} + + +//opensearch suggestion +void UrlResolver::computeSuggestions() +{ + if (Application::opensearchManager()->isSuggestionAvailable()) + { + connect(Application::opensearchManager(), + SIGNAL(suggestionReceived(const QStringList &)), + this, + SLOT(suggestionsReceived(const QStringList &))); + + Application::opensearchManager()->requestSuggestion(_typedString); + } + else + { + _computedListsCount++; + } +} + + +void UrlResolver::suggestionsReceived(const QStringList &suggestion) +{ + + foreach (QString s, suggestion) + { + UrlSearchItem gItem(UrlSearchItem::Suggestion, s, s); + _suggestions << gItem; + } + + _computedListsCount++; } diff --git a/src/urlbar/urlresolver.h b/src/urlbar/urlresolver.h index c79ce184..f72d6731 100644 --- a/src/urlbar/urlresolver.h +++ b/src/urlbar/urlresolver.h @@ -38,6 +38,7 @@ // Qt Includes #include <QString> #include <QList> +#include <QStringList> class UrlSearchItem { @@ -50,6 +51,7 @@ public: Browse = 0x00000010, History = 0x00000100, Bookmark = 0x00001000, + Suggestion = 0x00010000, }; int type; @@ -93,8 +95,10 @@ typedef QList <UrlSearchItem> UrlSearchList; // ---------------------------------------------------------------------- -class UrlResolver +class UrlResolver : public QObject { + Q_OBJECT + public: UrlResolver(const QString &typedUrl); @@ -103,14 +107,29 @@ public: private: QString _typedString; - UrlSearchList webSearchesResolution(); - UrlSearchList historyResolution(); - UrlSearchList qurlFromUserInputResolution(); - UrlSearchList bookmarksResolution(); + UrlSearchList _webSearches; + UrlSearchList _qurlFromUserInput; + UrlSearchList _history; + UrlSearchList _bookmarks; + UrlSearchList _suggestions; + + void computeWebSearches(); + void computeHistory(); + void computeQurlFromUserInput(); + void computeBookmarks(); + void computeSuggestions(); + + int _computedListsCount; + UrlSearchItem privilegedItem(UrlSearchList* list); - + UrlSearchList orderLists(); + static QRegExp _browseRegexp; static QRegExp _searchEnginesRegexp; + +private slots: + void suggestionsReceived(const QStringList &suggestion); + }; // ------------------------------------------------------------------------------ |