mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
filter: connect fulltext filter to frontend
There are now three filter modes: 1) Dive site 2) Fulltext 3) Normal When doing a fulltext search, get the dives that match the fulltext filter and then apply the other filters on that list. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
68d6a75ea3
commit
2bd4c6f6ec
3 changed files with 46 additions and 16 deletions
|
@ -21,14 +21,14 @@ ShownChange DiveFilter::updateAll() const
|
||||||
#include "desktop-widgets/mapwidget.h"
|
#include "desktop-widgets/mapwidget.h"
|
||||||
#include "desktop-widgets/mainwindow.h"
|
#include "desktop-widgets/mainwindow.h"
|
||||||
#include "desktop-widgets/divelistview.h"
|
#include "desktop-widgets/divelistview.h"
|
||||||
|
#include "core/fulltext.h"
|
||||||
#include "core/qthelper.h"
|
#include "core/qthelper.h"
|
||||||
#include "core/trip.h"
|
#include "core/trip.h"
|
||||||
#include "core/divesite.h"
|
#include "core/divesite.h"
|
||||||
#include "qt-models/filtermodels.h"
|
#include "qt-models/filtermodels.h"
|
||||||
|
|
||||||
void DiveFilter::updateDiveStatus(dive *d, ShownChange &change) const
|
void DiveFilter::updateDiveStatus(dive *d, bool newStatus, ShownChange &change) const
|
||||||
{
|
{
|
||||||
bool newStatus = showDive(d);
|
|
||||||
if (filter_dive(d, newStatus)) {
|
if (filter_dive(d, newStatus)) {
|
||||||
if (newStatus)
|
if (newStatus)
|
||||||
change.newShown.push_back(d);
|
change.newShown.push_back(d);
|
||||||
|
@ -40,9 +40,17 @@ void DiveFilter::updateDiveStatus(dive *d, ShownChange &change) const
|
||||||
ShownChange DiveFilter::update(const QVector<dive *> &dives) const
|
ShownChange DiveFilter::update(const QVector<dive *> &dives) const
|
||||||
{
|
{
|
||||||
dive *old_current = current_dive;
|
dive *old_current = current_dive;
|
||||||
|
|
||||||
ShownChange res;
|
ShownChange res;
|
||||||
for (dive *d: dives)
|
bool doDS = diveSiteMode();
|
||||||
updateDiveStatus(d, res);
|
bool doFullText = filterData.fullText.doit();
|
||||||
|
for (dive *d: dives) {
|
||||||
|
// There are three modes: divesite, fulltext, normal
|
||||||
|
bool newStatus = doDS ? dive_sites.contains(d->dive_site) :
|
||||||
|
doFullText ? fulltext_dive_matches(d, filterData.fullText, filterData.fulltextStringMode) && showDive(d) :
|
||||||
|
showDive(d);
|
||||||
|
updateDiveStatus(d, newStatus, res);
|
||||||
|
}
|
||||||
res.currentChanged = old_current != current_dive;
|
res.currentChanged = old_current != current_dive;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -50,9 +58,28 @@ ShownChange DiveFilter::update(const QVector<dive *> &dives) const
|
||||||
ShownChange DiveFilter::updateAll() const
|
ShownChange DiveFilter::updateAll() const
|
||||||
{
|
{
|
||||||
dive *old_current = current_dive;
|
dive *old_current = current_dive;
|
||||||
|
|
||||||
ShownChange res;
|
ShownChange res;
|
||||||
for (int i = 0; i < dive_table.nr; ++i)
|
int i;
|
||||||
updateDiveStatus(get_dive(i), res);
|
dive *d;
|
||||||
|
// There are three modes: divesite, fulltext, normal
|
||||||
|
if (diveSiteMode()) {
|
||||||
|
for_each_dive(i, d) {
|
||||||
|
bool newStatus = dive_sites.contains(d->dive_site);
|
||||||
|
updateDiveStatus(d, newStatus, res);
|
||||||
|
}
|
||||||
|
} else if (filterData.fullText.doit()) {
|
||||||
|
FullTextResult ft = fulltext_find_dives(filterData.fullText, filterData.fulltextStringMode);
|
||||||
|
for_each_dive(i, d) {
|
||||||
|
bool newStatus = ft.dive_matches(d) && showDive(d);
|
||||||
|
updateDiveStatus(d, newStatus, res);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for_each_dive(i, d) {
|
||||||
|
bool newStatus = showDive(d);
|
||||||
|
updateDiveStatus(d, newStatus, res);
|
||||||
|
}
|
||||||
|
}
|
||||||
res.currentChanged = old_current != current_dive;
|
res.currentChanged = old_current != current_dive;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -161,9 +188,6 @@ DiveFilter::DiveFilter() : diveSiteRefCount(0)
|
||||||
|
|
||||||
bool DiveFilter::showDive(const struct dive *d) const
|
bool DiveFilter::showDive(const struct dive *d) const
|
||||||
{
|
{
|
||||||
if (diveSiteMode())
|
|
||||||
return dive_sites.contains(d->dive_site);
|
|
||||||
|
|
||||||
if (!filterData.validFilter)
|
if (!filterData.validFilter)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
|
@ -13,12 +13,6 @@ struct ShownChange {
|
||||||
bool currentChanged;
|
bool currentChanged;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class StringFilterMode {
|
|
||||||
SUBSTRING = 0,
|
|
||||||
STARTSWITH = 1,
|
|
||||||
EXACT = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
// The dive filter for mobile is currently much simpler than for desktop.
|
// The dive filter for mobile is currently much simpler than for desktop.
|
||||||
// Therefore, for now we have two completely separate implementations.
|
// Therefore, for now we have two completely separate implementations.
|
||||||
// This should be unified in the future.
|
// This should be unified in the future.
|
||||||
|
@ -36,6 +30,7 @@ private:
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
#include "fulltext.h"
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
|
@ -72,12 +67,14 @@ struct FilterData {
|
||||||
QStringList suit;
|
QStringList suit;
|
||||||
QStringList dnotes;
|
QStringList dnotes;
|
||||||
QStringList equipment;
|
QStringList equipment;
|
||||||
|
FullTextQuery fullText;
|
||||||
Mode tagsMode = Mode::ALL_OF;
|
Mode tagsMode = Mode::ALL_OF;
|
||||||
Mode peopleMode = Mode::ALL_OF;
|
Mode peopleMode = Mode::ALL_OF;
|
||||||
Mode locationMode = Mode::ANY_OF;
|
Mode locationMode = Mode::ANY_OF;
|
||||||
Mode dnotesMode = Mode::ALL_OF;
|
Mode dnotesMode = Mode::ALL_OF;
|
||||||
Mode suitMode = Mode::ANY_OF;
|
Mode suitMode = Mode::ANY_OF;
|
||||||
Mode equipmentMode = Mode::ALL_OF;
|
Mode equipmentMode = Mode::ALL_OF;
|
||||||
|
StringFilterMode fulltextStringMode = StringFilterMode::STARTSWITH;
|
||||||
StringFilterMode tagsStringMode = StringFilterMode::SUBSTRING;
|
StringFilterMode tagsStringMode = StringFilterMode::SUBSTRING;
|
||||||
StringFilterMode peopleStringMode = StringFilterMode::SUBSTRING;
|
StringFilterMode peopleStringMode = StringFilterMode::SUBSTRING;
|
||||||
StringFilterMode locationStringMode = StringFilterMode::SUBSTRING;
|
StringFilterMode locationStringMode = StringFilterMode::SUBSTRING;
|
||||||
|
@ -102,7 +99,7 @@ public:
|
||||||
ShownChange updateAll() const; // Update filter status of all dives and return dives whose status changed
|
ShownChange updateAll() const; // Update filter status of all dives and return dives whose status changed
|
||||||
private:
|
private:
|
||||||
DiveFilter();
|
DiveFilter();
|
||||||
void updateDiveStatus(dive *d, ShownChange &change) const;
|
void updateDiveStatus(dive *d, bool newStatus, ShownChange &change) const;
|
||||||
bool showDive(const struct dive *d) const; // Should that dive be shown?
|
bool showDive(const struct dive *d) const; // Should that dive be shown?
|
||||||
|
|
||||||
QVector<dive_site *> dive_sites;
|
QVector<dive_site *> dive_sites;
|
||||||
|
|
|
@ -78,6 +78,12 @@ FilterWidget2::FilterWidget2(QWidget* parent) :
|
||||||
connect(ui.toTime, &QDateTimeEdit::timeChanged,
|
connect(ui.toTime, &QDateTimeEdit::timeChanged,
|
||||||
this, &FilterWidget2::updateFilter);
|
this, &FilterWidget2::updateFilter);
|
||||||
|
|
||||||
|
connect(ui.fullText, &QLineEdit::textChanged,
|
||||||
|
this, &FilterWidget2::updateFilter);
|
||||||
|
|
||||||
|
connect(ui.fulltextStringMode, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||||
|
this, &FilterWidget2::updateFilter);
|
||||||
|
|
||||||
connect(ui.tags, &QLineEdit::textChanged,
|
connect(ui.tags, &QLineEdit::textChanged,
|
||||||
this, &FilterWidget2::updateFilter);
|
this, &FilterWidget2::updateFilter);
|
||||||
|
|
||||||
|
@ -170,6 +176,7 @@ void FilterWidget2::clearFilter()
|
||||||
ui.suitMode->setCurrentIndex((int)filterData.suitMode);
|
ui.suitMode->setCurrentIndex((int)filterData.suitMode);
|
||||||
ui.dnotesMode->setCurrentIndex((int)filterData.dnotesMode);
|
ui.dnotesMode->setCurrentIndex((int)filterData.dnotesMode);
|
||||||
ui.equipmentMode->setCurrentIndex((int)filterData.equipmentMode);
|
ui.equipmentMode->setCurrentIndex((int)filterData.equipmentMode);
|
||||||
|
ui.fulltextStringMode->setCurrentIndex((int)filterData.fulltextStringMode);
|
||||||
ui.tagsStringMode->setCurrentIndex((int)filterData.tagsStringMode);
|
ui.tagsStringMode->setCurrentIndex((int)filterData.tagsStringMode);
|
||||||
ui.peopleStringMode->setCurrentIndex((int)filterData.peopleStringMode);
|
ui.peopleStringMode->setCurrentIndex((int)filterData.peopleStringMode);
|
||||||
ui.locationStringMode->setCurrentIndex((int)filterData.locationStringMode);
|
ui.locationStringMode->setCurrentIndex((int)filterData.locationStringMode);
|
||||||
|
@ -214,6 +221,7 @@ void FilterWidget2::updateFilter()
|
||||||
filterData.fromTime = ui.fromTime->time();
|
filterData.fromTime = ui.fromTime->time();
|
||||||
filterData.toDate = ui.toDate->dateTime();
|
filterData.toDate = ui.toDate->dateTime();
|
||||||
filterData.toTime = ui.toTime->time();
|
filterData.toTime = ui.toTime->time();
|
||||||
|
filterData.fullText = ui.fullText->text();
|
||||||
filterData.tags = ui.tags->text().split(",", QString::SkipEmptyParts);
|
filterData.tags = ui.tags->text().split(",", QString::SkipEmptyParts);
|
||||||
filterData.people = ui.people->text().split(",", QString::SkipEmptyParts);
|
filterData.people = ui.people->text().split(",", QString::SkipEmptyParts);
|
||||||
filterData.location = ui.location->text().split(",", QString::SkipEmptyParts);
|
filterData.location = ui.location->text().split(",", QString::SkipEmptyParts);
|
||||||
|
@ -226,6 +234,7 @@ void FilterWidget2::updateFilter()
|
||||||
filterData.suitMode = (FilterData::Mode)ui.suitMode->currentIndex();
|
filterData.suitMode = (FilterData::Mode)ui.suitMode->currentIndex();
|
||||||
filterData.dnotesMode = (FilterData::Mode)ui.dnotesMode->currentIndex();
|
filterData.dnotesMode = (FilterData::Mode)ui.dnotesMode->currentIndex();
|
||||||
filterData.equipmentMode = (FilterData::Mode)ui.equipmentMode->currentIndex();
|
filterData.equipmentMode = (FilterData::Mode)ui.equipmentMode->currentIndex();
|
||||||
|
filterData.fulltextStringMode = (StringFilterMode)ui.fulltextStringMode->currentIndex();
|
||||||
filterData.tagsStringMode = (StringFilterMode)ui.tagsStringMode->currentIndex();
|
filterData.tagsStringMode = (StringFilterMode)ui.tagsStringMode->currentIndex();
|
||||||
filterData.peopleStringMode = (StringFilterMode)ui.peopleStringMode->currentIndex();
|
filterData.peopleStringMode = (StringFilterMode)ui.peopleStringMode->currentIndex();
|
||||||
filterData.locationStringMode = (StringFilterMode)ui.locationStringMode->currentIndex();
|
filterData.locationStringMode = (StringFilterMode)ui.locationStringMode->currentIndex();
|
||||||
|
|
Loading…
Add table
Reference in a new issue