mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-25 02:43:02 -07:00
[Card] Add a setting for the language used in card search
Localized card names and texts can now be searched too, controlled by a 'Language used in card search' toggle (English, selected card language, or both) on the general settings page. Untranslated cards always keep matching in English. Removed the redundant local copy of the URL templates list in the localized picture loader while here.
This commit is contained in:
parent
1c93309952
commit
e029173e29
20 changed files with 360 additions and 52 deletions
|
|
@ -65,7 +65,13 @@ void CardSearchModel::updateSearchResults(const QString &query)
|
|||
continue;
|
||||
}
|
||||
|
||||
const QString lowerName = card->getName().toLower();
|
||||
// The completer suggestions match against the same languages the card
|
||||
// search uses, so typing a localized name finds the card.
|
||||
QString matchName = card->getName();
|
||||
if (searchLanguageMode != CardSearchLanguage::English && !searchLanguage.isEmpty() && searchLanguage != "en") {
|
||||
matchName = card->getLocalizedName(searchLanguage);
|
||||
}
|
||||
const QString lowerName = matchName.toLower();
|
||||
if (!lowerName.contains(lowerQuery)) {
|
||||
continue;
|
||||
}
|
||||
|
|
@ -79,11 +85,17 @@ void CardSearchModel::updateSearchResults(const QString &query)
|
|||
}
|
||||
}
|
||||
|
||||
auto sortByDistanceThenLength = [](const SearchResult &a, const SearchResult &b) {
|
||||
auto sortByDistanceThenLength = [this](const SearchResult &a, const SearchResult &b) {
|
||||
QString nameA = a.card->getName();
|
||||
QString nameB = b.card->getName();
|
||||
if (searchLanguageMode != CardSearchLanguage::English && !searchLanguage.isEmpty() && searchLanguage != "en") {
|
||||
nameA = a.card->getLocalizedName(searchLanguage);
|
||||
nameB = b.card->getLocalizedName(searchLanguage);
|
||||
}
|
||||
if (a.distance != b.distance) {
|
||||
return a.distance < b.distance;
|
||||
}
|
||||
return a.card->getName().size() < b.card->getName().size();
|
||||
return nameA.size() < nameB.size();
|
||||
};
|
||||
|
||||
std::sort(prefixMatches.begin(), prefixMatches.end(), sortByDistanceThenLength);
|
||||
|
|
|
|||
|
|
@ -27,6 +27,15 @@ public:
|
|||
|
||||
void updateSearchResults(const QString &query); // Update results based on input
|
||||
|
||||
void setSearchLanguage(const QString &searchLang, CardSearchLanguage mode)
|
||||
{
|
||||
if (searchLanguage == searchLang && searchLanguageMode == mode) {
|
||||
return;
|
||||
}
|
||||
searchLanguage = searchLang;
|
||||
searchLanguageMode = mode;
|
||||
}
|
||||
|
||||
private:
|
||||
struct SearchResult
|
||||
{
|
||||
|
|
@ -36,6 +45,8 @@ private:
|
|||
|
||||
CardDatabaseDisplayModel *sourceModel;
|
||||
QList<SearchResult> searchResults;
|
||||
QString searchLanguage;
|
||||
CardSearchLanguage searchLanguageMode = CardSearchLanguage::English;
|
||||
};
|
||||
|
||||
#endif // CARD_SEARCH_MODEL_H
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@ bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex
|
|||
}
|
||||
|
||||
if (filterString != nullptr) {
|
||||
if (filterTree != nullptr && !filterTree->acceptsCard(info)) {
|
||||
if (filterTree != nullptr && !filterTree->acceptsCard(info, searchLanguage, searchLanguageMode)) {
|
||||
return false;
|
||||
}
|
||||
return filterString->check(info);
|
||||
|
|
@ -190,7 +190,9 @@ bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex
|
|||
|
||||
bool CardDatabaseDisplayModel::rowMatchesCardName(CardInfoPtr info) const
|
||||
{
|
||||
if (!cardName.isEmpty() && !info->getName().contains(cardName, Qt::CaseInsensitive)) {
|
||||
if (!cardName.isEmpty() && !info->getName().contains(cardName, Qt::CaseInsensitive) &&
|
||||
searchLanguageMode != CardSearchLanguage::English && !searchLanguage.isEmpty() && searchLanguage != "en" &&
|
||||
!info->getLocalizedName(searchLanguage).contains(cardName, Qt::CaseInsensitive)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -199,7 +201,7 @@ bool CardDatabaseDisplayModel::rowMatchesCardName(CardInfoPtr info) const
|
|||
}
|
||||
|
||||
if (filterTree != nullptr) {
|
||||
return filterTree->acceptsCard(info);
|
||||
return filterTree->acceptsCard(info, searchLanguage, searchLanguageMode);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -235,6 +237,29 @@ void CardDatabaseDisplayModel::setFilterTree(FilterTree *_filterTree)
|
|||
invalidate();
|
||||
}
|
||||
|
||||
void CardDatabaseDisplayModel::setStringFilter(const QString &_src)
|
||||
{
|
||||
delete filterString;
|
||||
filterString = new FilterString(_src);
|
||||
filterString->setSearchLanguage(searchLanguage, searchLanguageMode);
|
||||
dirty();
|
||||
}
|
||||
|
||||
void CardDatabaseDisplayModel::setSearchLanguage(const QString &searchLang, CardSearchLanguage mode)
|
||||
{
|
||||
if (searchLanguage == searchLang && searchLanguageMode == mode) {
|
||||
return;
|
||||
}
|
||||
|
||||
searchLanguage = searchLang;
|
||||
searchLanguageMode = mode;
|
||||
|
||||
if (filterString != nullptr) {
|
||||
filterString->setSearchLanguage(searchLanguage, searchLanguageMode);
|
||||
}
|
||||
dirty();
|
||||
}
|
||||
|
||||
void CardDatabaseDisplayModel::filterTreeChanged()
|
||||
{
|
||||
invalidate();
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QTimer>
|
||||
#include <libcockatrice/card/card_localization.h>
|
||||
#include <libcockatrice/filters/filter_string.h>
|
||||
|
||||
class FilterTree;
|
||||
|
|
@ -32,6 +33,8 @@ private:
|
|||
FilterString *filterString;
|
||||
int loadedRowCount;
|
||||
QTimer dirtyTimer;
|
||||
QString searchLanguage;
|
||||
CardSearchLanguage searchLanguageMode = CardSearchLanguage::English;
|
||||
|
||||
/** The translation table that will be used for sanitizeCardName. */
|
||||
static QMap<wchar_t, wchar_t> characterTranslation;
|
||||
|
|
@ -55,17 +58,13 @@ public:
|
|||
cardName = sanitizeCardName(_cardName, characterTranslation);
|
||||
dirty();
|
||||
}
|
||||
void setStringFilter(const QString &_src)
|
||||
{
|
||||
delete filterString;
|
||||
filterString = new FilterString(_src);
|
||||
dirty();
|
||||
}
|
||||
void setStringFilter(const QString &_src);
|
||||
void setCardNameSet(const QSet<QString> &_cardNameSet)
|
||||
{
|
||||
cardNameSet = _cardNameSet;
|
||||
dirty();
|
||||
}
|
||||
void setSearchLanguage(const QString &searchLang, CardSearchLanguage mode);
|
||||
|
||||
void dirty()
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue