9#include <simgear/package/Package.hxx>
12 QSortFilterProxyModel(pr)
14 m_ratings = {4, 4, 4, 4};
15 setSourceModel(source);
16 setSortCaseSensitivity(Qt::CaseInsensitive);
17 setFilterCaseSensitivity(Qt::CaseInsensitive);
23 setDynamicSortFilter(
true);
47 m_filterProps =
new SGPropertyNode;
49#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
50 Q_FOREACH (QString term, s.split(QRegularExpression(
"\\W+"), Qt::SkipEmptyParts)) {
52 Q_FOREACH (QString term, s.split(QRegularExpression(
"\\W+"), QString::SkipEmptyParts)) {
54 m_filterProps->getNode(
"all-of/text", index++,
true)->setStringValue(term.toStdString());
63 auto sourceIndex = qobject_cast<AircraftItemModel*>(sourceModel())->indexOfAircraftURI(uri);
64 auto ourIndex = mapFromSource(sourceIndex);
65 if (!sourceIndex.isValid() || !ourIndex.isValid()) {
69 return ourIndex.row();
74 qobject_cast<AircraftItemModel*>(sourceModel())->selectVariantForAircraftURI(uri);
79 if (e == m_ratingsFilter) {
92 const int unfilteredCount = sourceModel()->rowCount();
93 if (m_ratingsFilter) {
94 return tr(
"(%1 of %2 aircraft)").arg(rowCount()).arg(unfilteredCount);
97 return tr(
"(%1 aircraft)").arg(unfilteredCount);
107 if (e == m_onlyShowInstalled) {
111 m_onlyShowInstalled = e;
117 if (e == m_onlyShowWithUpdate)
120 m_onlyShowWithUpdate = e;
126 if (e == m_onlyShowFavourites)
129 m_onlyShowFavourites = e;
131 setDynamicSortFilter(
false);
142 QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
145 if (!filterAircraft(index)) {
149 if (m_onlyShowInstalled) {
157 if (m_onlyShowWithUpdate) {
172 if (m_onlyShowFavourites) {
179 if (m_filterString.isEmpty() && !m_onlyShowInstalled && m_ratingsFilter) {
180 for (
int i=0;
i<m_ratings.size(); ++
i) {
190bool AircraftProxyModel::filterAircraft(
const QModelIndex &sourceIndex)
const
192 if (m_filterString.isEmpty()) {
196 simgear::pkg::PackageRef pkg = sourceIndex.data(
AircraftPackageRefRole).value<simgear::pkg::PackageRef>();
198 return pkg->matches(m_filterProps.ptr());
201 QString baseName = sourceIndex.data(Qt::DisplayRole).toString();
202 if (baseName.contains(m_filterString, Qt::CaseInsensitive)) {
207 if (longDesc.contains(m_filterString, Qt::CaseInsensitive)) {
212 for (
int variant = 0; variant < variantCount; ++variant) {
214 if (desc.contains(m_filterString, Qt::CaseInsensitive)) {
225 m_ratingsFilter = settings.value(
"enable-ratings-filter",
true).toBool();
226 QVariantList vRatings = settings.value(
"ratings-filter").toList();
227 if (vRatings.size() == 4) {
228 for (
int i=0;
i < 4; ++
i) {
229 m_ratings[
i] = vRatings.at(
i).toInt();
239 settings.setValue(
"enable-ratings-filter", m_ratingsFilter);
240 QVariantList vRatings;
241 for (
int i=0;
i < 4; ++
i) {
242 vRatings.append(m_ratings.at(
i));
244 settings.setValue(
"ratings-filter", vRatings);
262 const int c = QString::compare(variantLeft, variantRight, Qt::CaseInsensitive);
266 return QString::localeAwareCompare(uriLeft, uriRight) < 0;
const int AircraftVariantCountRole
const int AircraftRatingRole
const int AircraftVariantDescriptionRole
const int AircraftLongDescriptionRole
const int AircraftPackageRefRole
const int AircraftURIRole
const int AircraftIsFavouriteRole
const int AircraftPackageStatusRole
void setRatingFilterEnabled(bool e)
Q_INVOKABLE void saveRatingsSettings()
void ratingsFilterEnabledChanged()
void setRatings(QList< int > ratings)
void setHaveUpdateFilterEnabled(bool e)
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
void setInstalledFilterEnabled(bool e)
Q_INVOKABLE void loadRatingsSettings()
void summaryTextChanged()
AircraftProxyModel(QObject *pr, QAbstractItemModel *source)
Q_INVOKABLE void setAircraftFilterString(QString s)
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override
Custom sorting based on aircraft variants and URI.
void setShowFavourites(bool e)
Q_INVOKABLE int indexForURI(QUrl uri) const
Compute the row (index in QML / ListView speak) based on an aircraft URI.
Q_INVOKABLE void selectVariantForAircraftURI(QUrl uri)
static FavouriteAircraftData * instance()