mirror of
https://github.com/stenzek/duckstation.git
synced 2025-06-06 19:45:33 +00:00
Qt: Eliminate heap allocations in GameListSortModel
More of an issue since the filter is now checking multiple fields.
This commit is contained in:
parent
b91d219524
commit
4bacbc8958
@ -29,6 +29,16 @@
|
|||||||
|
|
||||||
namespace StringUtil {
|
namespace StringUtil {
|
||||||
|
|
||||||
|
/// Returns the given character in uppercase.
|
||||||
|
ALWAYS_INLINE static char ToLower(char ch)
|
||||||
|
{
|
||||||
|
return ch + ((static_cast<u8>(ch) >= 'A' && static_cast<u8>(ch) <= 'Z') ? ('a' - 'A') : 0);
|
||||||
|
}
|
||||||
|
ALWAYS_INLINE static char ToUpper(char ch)
|
||||||
|
{
|
||||||
|
return ch - ((static_cast<u8>(ch) >= 'a' && static_cast<u8>(ch) <= 'z') ? ('a' - 'A') : 0);
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks if a wildcard matches a search string.
|
/// Checks if a wildcard matches a search string.
|
||||||
bool WildcardMatch(const char* subject, const char* mask, bool case_sensitive = true);
|
bool WildcardMatch(const char* subject, const char* mask, bool case_sensitive = true);
|
||||||
|
|
||||||
@ -81,6 +91,11 @@ static inline int CompareNoCase(std::string_view s1, std::string_view s2)
|
|||||||
const int compare_res = (compare_len > 0) ? Strncasecmp(s1.data(), s2.data(), compare_len) : 0;
|
const int compare_res = (compare_len > 0) ? Strncasecmp(s1.data(), s2.data(), compare_len) : 0;
|
||||||
return (compare_len != 0) ? compare_res : ((s1_len < s2_len) ? -1 : ((s1_len > s2_len) ? 1 : 0));
|
return (compare_len != 0) ? compare_res : ((s1_len < s2_len) ? -1 : ((s1_len > s2_len) ? 1 : 0));
|
||||||
}
|
}
|
||||||
|
static inline bool ContainsNoCase(std::string_view s1, std::string_view s2)
|
||||||
|
{
|
||||||
|
return (std::search(s1.begin(), s1.end(), s2.begin(), s2.end(),
|
||||||
|
[](char lhs, char rhs) { return (ToLower(lhs) == ToLower(rhs)); }) != s1.end());
|
||||||
|
}
|
||||||
|
|
||||||
/// Wrapper around std::from_chars
|
/// Wrapper around std::from_chars
|
||||||
template<typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
|
template<typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
|
||||||
@ -234,7 +249,7 @@ inline std::string ToChars(bool value, int base)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if the given character is whitespace.
|
/// Returns true if the given character is whitespace.
|
||||||
static inline bool IsWhitespace(char ch)
|
ALWAYS_INLINE static bool IsWhitespace(char ch)
|
||||||
{
|
{
|
||||||
return ((ch >= 0x09 && ch <= 0x0D) || // horizontal tab, line feed, vertical tab, form feed, carriage return
|
return ((ch >= 0x09 && ch <= 0x0D) || // horizontal tab, line feed, vertical tab, form feed, carriage return
|
||||||
ch == 0x20); // space
|
ch == 0x20); // space
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include <QtWidgets/QMenu>
|
#include <QtWidgets/QMenu>
|
||||||
#include <QtWidgets/QScrollBar>
|
#include <QtWidgets/QScrollBar>
|
||||||
#include <QtWidgets/QStyledItemDelegate>
|
#include <QtWidgets/QStyledItemDelegate>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
static constexpr float MIN_SCALE = 0.1f;
|
static constexpr float MIN_SCALE = 0.1f;
|
||||||
static constexpr float MAX_SCALE = 2.0f;
|
static constexpr float MAX_SCALE = 2.0f;
|
||||||
@ -938,9 +939,10 @@ public:
|
|||||||
m_filter_region = region;
|
m_filter_region = region;
|
||||||
invalidateRowsFilter();
|
invalidateRowsFilter();
|
||||||
}
|
}
|
||||||
void setFilterName(const QString& name)
|
void setFilterName(std::string name)
|
||||||
{
|
{
|
||||||
m_filter_name = name;
|
m_filter_name = std::move(name);
|
||||||
|
std::transform(m_filter_name.begin(), m_filter_name.end(), m_filter_name.begin(), StringUtil::ToLower);
|
||||||
invalidateRowsFilter();
|
invalidateRowsFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -970,11 +972,15 @@ public:
|
|||||||
if (m_filter_region != DiscRegion::Count && entry->region != m_filter_region)
|
if (m_filter_region != DiscRegion::Count && entry->region != m_filter_region)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!m_filter_name.isEmpty() &&
|
if (!m_filter_name.empty())
|
||||||
!QString::fromStdString(entry->path).contains(m_filter_name, Qt::CaseInsensitive) &&
|
{
|
||||||
!QString::fromStdString(entry->serial).contains(m_filter_name, Qt::CaseInsensitive) &&
|
if (!((!entry->IsDiscSet() && !entry->path.empty() && StringUtil::ContainsNoCase(entry->path, m_filter_name)) ||
|
||||||
!QString::fromStdString(entry->title).contains(m_filter_name, Qt::CaseInsensitive))
|
(!entry->serial.empty() && StringUtil::ContainsNoCase(entry->serial, m_filter_name)) ||
|
||||||
|
(!entry->title.empty() && StringUtil::ContainsNoCase(entry->title, m_filter_name))))
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
|
return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
|
||||||
}
|
}
|
||||||
@ -988,7 +994,7 @@ private:
|
|||||||
GameListModel* m_model;
|
GameListModel* m_model;
|
||||||
GameList::EntryType m_filter_type = GameList::EntryType::MaxCount;
|
GameList::EntryType m_filter_type = GameList::EntryType::MaxCount;
|
||||||
DiscRegion m_filter_region = DiscRegion::Count;
|
DiscRegion m_filter_region = DiscRegion::Count;
|
||||||
QString m_filter_name;
|
std::string m_filter_name;
|
||||||
bool m_merge_disc_sets = true;
|
bool m_merge_disc_sets = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1155,7 +1161,7 @@ void GameListWidget::initialize()
|
|||||||
m_sort_model->setFilterRegion((index == 0) ? DiscRegion::Count : static_cast<DiscRegion>(index - 1));
|
m_sort_model->setFilterRegion((index == 0) ? DiscRegion::Count : static_cast<DiscRegion>(index - 1));
|
||||||
});
|
});
|
||||||
connect(m_ui.searchText, &QLineEdit::textChanged, this,
|
connect(m_ui.searchText, &QLineEdit::textChanged, this,
|
||||||
[this](const QString& text) { m_sort_model->setFilterName(text); });
|
[this](const QString& text) { m_sort_model->setFilterName(text.toStdString()); });
|
||||||
connect(m_ui.searchText, &QLineEdit::returnPressed, this, &GameListWidget::onSearchReturnPressed);
|
connect(m_ui.searchText, &QLineEdit::returnPressed, this, &GameListWidget::onSearchReturnPressed);
|
||||||
|
|
||||||
GameListCenterIconStyleDelegate* center_icon_delegate = new GameListCenterIconStyleDelegate(this);
|
GameListCenterIconStyleDelegate* center_icon_delegate = new GameListCenterIconStyleDelegate(this);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user