diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp index 693e62d26..bcf96a85f 100755 --- a/src/browser/BrowserOptionDialog.cpp +++ b/src/browser/BrowserOptionDialog.cpp @@ -67,7 +67,6 @@ void BrowserOptionDialog::loadSettings() // hide unimplemented options // TODO: fix this m_ui->showNotification->hide(); - m_ui->bestMatchOnly->hide(); if (settings.sortByUsername()) { m_ui->sortByUsername->setChecked(true); diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp index e391a75ae..af35315a0 100644 --- a/src/browser/BrowserService.cpp +++ b/src/browser/BrowserService.cpp @@ -530,21 +530,30 @@ QList BrowserService::sortEntries(QList& pwEntries, const QStrin const QString submitUrl = url.toString(QUrl::StripTrailingSlash); const QString baseSubmitUrl = url.toString(QUrl::StripTrailingSlash | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment); - QMultiMap priorities; - for (const Entry* entry : pwEntries) { + // Build map of prioritized entries + QMultiMap priorities; + for (Entry* entry : pwEntries) { priorities.insert(sortPriority(entry, host, submitUrl, baseSubmitUrl), entry); } + QList results; QString field = BrowserSettings::sortByTitle() ? "Title" : "UserName"; - std::sort(pwEntries.begin(), pwEntries.end(), [&priorities, &field](const Entry* left, const Entry* right) { - int res = priorities.key(left) - priorities.key(right); - if (res == 0) { - return QString::localeAwareCompare(left->attributes()->value(field), right->attributes()->value(field)) < 0; + for (int i = 100; i >= 0; i -= 5) { + if (priorities.count(i) > 0) { + // Sort same priority entries by Title or UserName + auto entries = priorities.values(i); + std::sort(entries.begin(), entries.end(), [&priorities, &field](Entry* left, Entry* right) { + return QString::localeAwareCompare(left->attributes()->value(field), right->attributes()->value(field)) < 0; + }); + results << entries; + if (BrowserSettings::bestMatchOnly() && !pwEntries.isEmpty()) { + // Early out once we find the highest batch of matches + break; + } } - return res < 0; - }); + } - return pwEntries; + return results; } bool BrowserService::confirmEntries(QList& pwEntriesToConfirm, const QString& url, const QString& host, const QString& submitHost, const QString& realm) diff --git a/src/browser/BrowserSettings.h b/src/browser/BrowserSettings.h index eb59fa5ac..7047d22b3 100755 --- a/src/browser/BrowserSettings.h +++ b/src/browser/BrowserSettings.h @@ -32,7 +32,7 @@ public: static bool showNotification(); //TODO!! static void setShowNotification(bool showNotification); - static bool bestMatchOnly(); //TODO!! + static bool bestMatchOnly(); static void setBestMatchOnly(bool bestMatchOnly); static bool unlockDatabase(); static void setUnlockDatabase(bool unlockDatabase); @@ -46,7 +46,7 @@ public: static void setAlwaysAllowAccess(bool alwaysAllowAccess); static bool alwaysAllowUpdate(); static void setAlwaysAllowUpdate(bool alwaysAllowUpdate); - static bool searchInAllDatabases();//TODO!! + static bool searchInAllDatabases(); static void setSearchInAllDatabases(bool searchInAllDatabases); static bool supportKphFields(); static void setSupportKphFields(bool supportKphFields);