mirror-kde-plasma-desktop/kcms/keyboard/layoutsearchmodel.cpp
Tobias Fella dc7b9473f7 kcms/keyboard: Refactor and fix LayoutDialog
The list had a few problems, notably an erratic sorting that randomly change during and after searching for a layout.
While at it, refactor some code and port the models to C++.
2026-11-03 09:46:31 +00:00

92 lines
2.6 KiB
C++

/*
SPDX-FileCopyrightText: 2025 Bharadwaj Raju <bharadwaj.raju777@protonmail.com>
SPDX-FileCopyrightText: 2026 Tobias Fella <tobias.fella@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "layoutsearchmodel.h"
#include <KFuzzyMatcher>
#include "layoutmodel.h"
using namespace Qt::Literals::StringLiterals;
LayoutSearchModel::LayoutSearchModel(QObject *parent)
: QSortFilterProxyModel(parent)
{
setSortRole(LayoutModel::Roles::DescriptionRole);
sort(0);
}
QString LayoutSearchModel::searchString() const
{
return m_searchString;
}
void LayoutSearchModel::setSearchString(const QString &searchString)
{
if (searchString == m_searchString) {
return;
}
beginFilterChange();
m_searchString = searchString;
endFilterChange();
sort(-1);
sort(0);
Q_EMIT searchStringChanged();
}
QString LayoutSearchModel::getFullName(const QModelIndex &idx) const
{
const auto shortName = idx.data(LayoutModel::Roles::ShortNameRole).toString();
const auto description = idx.data(LayoutModel::Roles::DescriptionRole).toString();
const auto variantName = idx.data(LayoutModel::Roles::VariantNameRole).toString();
return shortName + " - "_L1 + description + " - "_L1 + variantName;
}
bool LayoutSearchModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
const auto index = sourceModel()->index(sourceRow, 0, sourceParent);
if (!index.data(LayoutModel::Roles::VariantNameRole).toString().trimmed().isEmpty()) {
return false;
}
if (m_searchString.isEmpty()) {
return true;
}
if (getFullName(index).contains(m_searchString, Qt::CaseInsensitive)) {
return true;
}
const auto shortName = index.data(LayoutModel::ShortNameRole).toString();
for (auto i = 0; i < sourceModel()->rowCount(); i++) {
const auto sourceIndex = sourceModel()->index(i, 0, sourceParent);
const auto sourceShortName = sourceIndex.data(LayoutModel::ShortNameRole).toString();
if (sourceShortName == shortName && getFullName(sourceIndex).contains(m_searchString, Qt::CaseInsensitive)) {
return true;
}
}
return false;
}
bool LayoutSearchModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
auto leftScore = KFuzzyMatcher::match(m_searchString, getFullName(left)).score;
auto rightScore = KFuzzyMatcher::match(m_searchString, getFullName(right)).score;
if (leftScore == rightScore) {
return QSortFilterProxyModel::lessThan(left, right);
}
return leftScore > rightScore;
}
#include "moc_layoutsearchmodel.cpp"