mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
mobile: remove collapsed model that we no longer use
The dive list now uses the mobile list model. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
b382445e59
commit
edeaf7fa57
3 changed files with 2 additions and 209 deletions
|
@ -299,7 +299,6 @@ void QMLManager::applicationStateChanged(Qt::ApplicationState state)
|
||||||
|
|
||||||
void QMLManager::openLocalThenRemote(QString url)
|
void QMLManager::openLocalThenRemote(QString url)
|
||||||
{
|
{
|
||||||
CollapsedDiveListSortModel::instance()->setSourceModel(nullptr);
|
|
||||||
DiveListModel::instance()->clear();
|
DiveListModel::instance()->clear();
|
||||||
setNotificationText(tr("Open local dive data file"));
|
setNotificationText(tr("Open local dive data file"));
|
||||||
QByteArray fileNamePrt = QFile::encodeName(url);
|
QByteArray fileNamePrt = QFile::encodeName(url);
|
||||||
|
@ -338,8 +337,6 @@ void QMLManager::openLocalThenRemote(QString url)
|
||||||
qPrefPartialPressureGas::set_po2(git_prefs.pp_graphs.po2);
|
qPrefPartialPressureGas::set_po2(git_prefs.pp_graphs.po2);
|
||||||
process_loaded_dives();
|
process_loaded_dives();
|
||||||
DiveListModel::instance()->reload();
|
DiveListModel::instance()->reload();
|
||||||
CollapsedDiveListSortModel::instance()->setSourceModel(DiveListModel::instance());
|
|
||||||
CollapsedDiveListSortModel::instance()->updateFilterState();
|
|
||||||
appendTextToLog(QStringLiteral("%1 dives loaded from cache").arg(dive_table.nr));
|
appendTextToLog(QStringLiteral("%1 dives loaded from cache").arg(dive_table.nr));
|
||||||
setNotificationText(tr("%1 dives loaded from local dive data file").arg(dive_table.nr));
|
setNotificationText(tr("%1 dives loaded from local dive data file").arg(dive_table.nr));
|
||||||
}
|
}
|
||||||
|
@ -1420,8 +1417,8 @@ void QMLManager::selectDive(int id)
|
||||||
}
|
}
|
||||||
if (amount_selected == 0)
|
if (amount_selected == 0)
|
||||||
qWarning("QManager::selectDive() called with unknown id");
|
qWarning("QManager::selectDive() called with unknown id");
|
||||||
else
|
// else
|
||||||
CollapsedDiveListSortModel::instance()->updateSelectionState();
|
// FIXME: CollapsedDiveListSortModel::instance()->updateSelectionState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QMLManager::deleteDive(int id)
|
void QMLManager::deleteDive(int id)
|
||||||
|
@ -2147,7 +2144,6 @@ void QMLManager::setFilter(const QString filterText, int index)
|
||||||
case 2: mode = FilterData::Mode::TAGS; break;
|
case 2: mode = FilterData::Mode::TAGS; break;
|
||||||
}
|
}
|
||||||
DiveListSortModel::instance()->setFilter(filterText, mode);
|
DiveListSortModel::instance()->setFilter(filterText, mode);
|
||||||
CollapsedDiveListSortModel::instance()->updateFilterState();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QMLManager::setShowNonDiveComputers(bool show)
|
void QMLManager::setShowNonDiveComputers(bool show)
|
||||||
|
|
|
@ -12,175 +12,6 @@
|
||||||
|
|
||||||
// the DiveListSortModel creates the sorted, filtered list of dives that the user
|
// the DiveListSortModel creates the sorted, filtered list of dives that the user
|
||||||
// can flip through horizontally
|
// can flip through horizontally
|
||||||
// the CollapsedDiveListSortModel creates the vertical dive list which is a second
|
|
||||||
// filter on top of the one applied to the DiveListSortModel
|
|
||||||
|
|
||||||
CollapsedDiveListSortModel::CollapsedDiveListSortModel()
|
|
||||||
{
|
|
||||||
setSourceModel(DiveListSortModel::instance());
|
|
||||||
// make sure that we after changes to the underlying model (and therefore the dive list
|
|
||||||
// we update the filter state
|
|
||||||
connect(DiveListModel::instance(), &DiveListModel::rowsInserted, this, &CollapsedDiveListSortModel::updateFilterState);
|
|
||||||
connect(DiveListModel::instance(), &DiveListModel::rowsMoved, this, &CollapsedDiveListSortModel::updateFilterState);
|
|
||||||
connect(DiveListModel::instance(), &DiveListModel::rowsRemoved, this, &CollapsedDiveListSortModel::updateFilterState);
|
|
||||||
}
|
|
||||||
|
|
||||||
CollapsedDiveListSortModel *CollapsedDiveListSortModel::instance()
|
|
||||||
{
|
|
||||||
static CollapsedDiveListSortModel self;
|
|
||||||
return &self;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CollapsedDiveListSortModel::setSourceModel(QAbstractItemModel *sourceModel)
|
|
||||||
{
|
|
||||||
QSortFilterProxyModel::setSourceModel(sourceModel);
|
|
||||||
// make sure we sort descending and have the filters correct
|
|
||||||
setDynamicSortFilter(true);
|
|
||||||
setSortRole(DiveListModel::DiveDateRole);
|
|
||||||
sort(0, Qt::DescendingOrder);
|
|
||||||
updateFilterState();
|
|
||||||
}
|
|
||||||
|
|
||||||
// In QtQuick ListView, section headings can only be strings. To identify dives
|
|
||||||
// that belong to the same trip, a string containing the trip-id is passed in.
|
|
||||||
// To format the trip heading, the string is then converted back with this function.
|
|
||||||
static dive_trip *tripIdToObject(const QString &s)
|
|
||||||
{
|
|
||||||
if (s.isEmpty())
|
|
||||||
return nullptr;
|
|
||||||
int id = s.toInt();
|
|
||||||
dive_trip **trip = std::find_if(&trip_table.trips[0], &trip_table.trips[trip_table.nr],
|
|
||||||
[id] (const dive_trip *t) { return t->id == id; });
|
|
||||||
if (trip == &trip_table.trips[trip_table.nr]) {
|
|
||||||
fprintf(stderr, "Warning: unknown trip id passed through QML: %d\n", id);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return *trip;
|
|
||||||
}
|
|
||||||
|
|
||||||
// the trip title is designed to be location (# dives)
|
|
||||||
// or, if there is no location name date range (# dives)
|
|
||||||
// where the date range is given as "month year" or "month-month year" or "month year - month year"
|
|
||||||
QString CollapsedDiveListSortModel::tripTitle(const QString §ion)
|
|
||||||
{
|
|
||||||
const dive_trip *dt = tripIdToObject(section);
|
|
||||||
if (!dt)
|
|
||||||
return QString();
|
|
||||||
QString numDives = tr("(%n dive(s))", "", dt->dives.nr);
|
|
||||||
int shown = trip_shown_dives(dt);
|
|
||||||
QString shownDives = shown != dt->dives.nr ? QStringLiteral(" ") + tr("(%L1 shown)").arg(shown) : QString();
|
|
||||||
QString title(dt->location);
|
|
||||||
|
|
||||||
if (title.isEmpty()) {
|
|
||||||
// so use the date range
|
|
||||||
QDateTime firstTime = QDateTime::fromMSecsSinceEpoch(1000*trip_date(dt), Qt::UTC);
|
|
||||||
QString firstMonth = firstTime.toString("MMM");
|
|
||||||
QString firstYear = firstTime.toString("yyyy");
|
|
||||||
QDateTime lastTime = QDateTime::fromMSecsSinceEpoch(1000*dt->dives.dives[0]->when, Qt::UTC);
|
|
||||||
QString lastMonth = lastTime.toString("MMM");
|
|
||||||
QString lastYear = lastTime.toString("yyyy");
|
|
||||||
if (lastMonth == firstMonth && lastYear == firstYear)
|
|
||||||
title = firstMonth + " " + firstYear;
|
|
||||||
else if (lastMonth != firstMonth && lastYear == firstYear)
|
|
||||||
title = firstMonth + "-" + lastMonth + " " + firstYear;
|
|
||||||
else
|
|
||||||
title = firstMonth + " " + firstYear + " - " + lastMonth + " " + lastYear;
|
|
||||||
}
|
|
||||||
return QStringLiteral("%1 %2%3").arg(title, numDives, shownDives);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString CollapsedDiveListSortModel::tripShortDate(const QString §ion)
|
|
||||||
{
|
|
||||||
const dive_trip *dt = tripIdToObject(section);
|
|
||||||
if (!dt)
|
|
||||||
return QString();
|
|
||||||
QDateTime firstTime = QDateTime::fromMSecsSinceEpoch(1000*trip_date(dt), Qt::UTC);
|
|
||||||
QString firstMonth = firstTime.toString("MMM");
|
|
||||||
return QStringLiteral("%1\n'%2").arg(firstMonth,firstTime.toString("yy"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void CollapsedDiveListSortModel::setActiveTrip(const QString &trip)
|
|
||||||
{
|
|
||||||
m_activeTrip = trip;
|
|
||||||
// we can't update the filter state from the this function as that is called from
|
|
||||||
// a slot in the QML code which could cause the object that is executing the slot
|
|
||||||
// to be destroyed before this function returns.
|
|
||||||
// Instead do this asynchronously
|
|
||||||
QtConcurrent::run(QThreadPool::globalInstance(),
|
|
||||||
[]{
|
|
||||||
CollapsedDiveListSortModel::instance()->updateFilterState();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
QString CollapsedDiveListSortModel::activeTrip() const
|
|
||||||
{
|
|
||||||
return m_activeTrip;
|
|
||||||
}
|
|
||||||
|
|
||||||
// tell us if this dive is the first dive in a trip that has at least one
|
|
||||||
// dive that isn't hidden (even if this dive is hidden)
|
|
||||||
static bool isFirstInNotCompletelyHiddenTrip(struct dive *d)
|
|
||||||
{
|
|
||||||
struct dive_trip *dt = d->divetrip;
|
|
||||||
if (dt->dives.nr > 0 && dt->dives.dives[0] == d) {
|
|
||||||
// ok, this is the first dive in its trip
|
|
||||||
int i = -1;
|
|
||||||
while (++i < dt->dives.nr)
|
|
||||||
if (!dt->dives.dives[i]->hidden_by_filter)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// the mobile app allows only one selected dive
|
|
||||||
// that means there are either zero or exactly one expanded trip -
|
|
||||||
bool CollapsedDiveListSortModel::isExpanded(struct dive_trip *dt) const
|
|
||||||
{
|
|
||||||
return !m_activeTrip.isEmpty() && dt == tripIdToObject(m_activeTrip);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CollapsedDiveListSortModel::updateFilterState()
|
|
||||||
{
|
|
||||||
// now do something clever to show the right dives
|
|
||||||
// first make sure that the underlying filtering is taken care of
|
|
||||||
DiveListSortModel::instance()->updateFilterState();
|
|
||||||
int i;
|
|
||||||
struct dive *d;
|
|
||||||
for_each_dive(i, d) {
|
|
||||||
CollapsedState state = DontShow;
|
|
||||||
struct dive_trip *dt = d->divetrip;
|
|
||||||
|
|
||||||
// we show the dives that are outside of a trip or inside of the one expanded trip
|
|
||||||
if (!d->hidden_by_filter && (dt == nullptr || isExpanded(dt)))
|
|
||||||
state = ShowDive;
|
|
||||||
// we mark the first dive of a trip that contains any unfiltered dives as ShowTrip or ShowDiveAndTrip (if this is the one expanded trip)
|
|
||||||
if (dt != nullptr && isFirstInNotCompletelyHiddenTrip(d))
|
|
||||||
state = (state == ShowDive) ? ShowDiveAndTrip : ShowTrip;
|
|
||||||
d->collapsed = state;
|
|
||||||
}
|
|
||||||
// everything up to here can be done even if we don't have a source model
|
|
||||||
if (sourceModel() != nullptr) {
|
|
||||||
DiveListModel *dlm = DiveListModel::instance();
|
|
||||||
dlm->dataChanged(dlm->index(0,0), dlm->index(dlm->rowCount() - 1, 0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CollapsedDiveListSortModel::updateSelectionState()
|
|
||||||
{
|
|
||||||
QVector<int> changedRoles = { DiveListModel::SelectedRole };
|
|
||||||
dataChanged(index(0,0), index(rowCount() - 1, 0), changedRoles);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CollapsedDiveListSortModel::filterAcceptsRow(int source_row, const QModelIndex &) const
|
|
||||||
{
|
|
||||||
// get the corresponding dive from the DiveListModel and check if we should show it
|
|
||||||
const dive *d = DiveListModel::instance()->getDive(source_row);
|
|
||||||
if (verbose > 1)
|
|
||||||
qDebug() << "FAR source row" << source_row << "dive" << (d ? QString::number(d->number) : "NULL") << "is" << (d != nullptr && d->collapsed != DontShow) <<
|
|
||||||
(d != nullptr ? QString::number(d->collapsed) : "");
|
|
||||||
return d != nullptr && d->collapsed != DontShow;
|
|
||||||
}
|
|
||||||
|
|
||||||
DiveListSortModel::DiveListSortModel()
|
DiveListSortModel::DiveListSortModel()
|
||||||
{
|
{
|
||||||
setSourceModel(DiveListModel::instance());
|
setSourceModel(DiveListModel::instance());
|
||||||
|
@ -220,7 +51,6 @@ void DiveListSortModel::setFilter(QString f, FilterData::Mode mode)
|
||||||
data.tags = f.split(",", QString::SkipEmptyParts);
|
data.tags = f.split(",", QString::SkipEmptyParts);
|
||||||
}
|
}
|
||||||
DiveFilter::instance()->setFilter(data);
|
DiveFilter::instance()->setFilter(data);
|
||||||
CollapsedDiveListSortModel::instance()->updateFilterState();
|
|
||||||
invalidateFilter();
|
invalidateFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -395,7 +225,6 @@ QVariant DiveListModel::data(const QModelIndex &index, int role) const
|
||||||
case StartPressureRole: return getStartPressure(d);
|
case StartPressureRole: return getStartPressure(d);
|
||||||
case EndPressureRole: return getEndPressure(d);
|
case EndPressureRole: return getEndPressure(d);
|
||||||
case FirstGasRole: return getFirstGas(d);
|
case FirstGasRole: return getFirstGas(d);
|
||||||
case CollapsedRole: return d->collapsed;
|
|
||||||
case SelectedRole: return d->selected;
|
case SelectedRole: return d->selected;
|
||||||
}
|
}
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
@ -435,7 +264,6 @@ QHash<int, QByteArray> DiveListModel::roleNames() const
|
||||||
roles[StartPressureRole] = "startPressure";
|
roles[StartPressureRole] = "startPressure";
|
||||||
roles[EndPressureRole] = "endPressure";
|
roles[EndPressureRole] = "endPressure";
|
||||||
roles[FirstGasRole] = "firstGas";
|
roles[FirstGasRole] = "firstGas";
|
||||||
roles[CollapsedRole] = "collapsed";
|
|
||||||
roles[SelectedRole] = "selected";
|
roles[SelectedRole] = "selected";
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,36 +8,6 @@
|
||||||
#include "core/divefilter.h"
|
#include "core/divefilter.h"
|
||||||
#include "core/subsurface-qt/diveobjecthelper.h"
|
#include "core/subsurface-qt/diveobjecthelper.h"
|
||||||
|
|
||||||
class CollapsedDiveListSortModel : public QSortFilterProxyModel
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
static CollapsedDiveListSortModel *instance();
|
|
||||||
void setSourceModel(QAbstractItemModel *sourceModel);
|
|
||||||
Q_INVOKABLE QString tripTitle(const QString &trip);
|
|
||||||
Q_INVOKABLE QString tripShortDate(const QString &trip);
|
|
||||||
Q_INVOKABLE void setActiveTrip(const QString &trip);
|
|
||||||
Q_INVOKABLE QString activeTrip() const;
|
|
||||||
// super subtle optimization alert - in order to reduce the number of model accesses from QML,
|
|
||||||
// the two states where we show the dive in question have odd numbers
|
|
||||||
enum CollapsedState {
|
|
||||||
DontShow = 0,
|
|
||||||
ShowDive = 1,
|
|
||||||
ShowTrip = 2,
|
|
||||||
ShowDiveAndTrip = 3
|
|
||||||
};
|
|
||||||
void updateFilterState();
|
|
||||||
void updateSelectionState();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
CollapsedDiveListSortModel();
|
|
||||||
bool isExpanded(struct dive_trip *dt) const;
|
|
||||||
QString m_activeTrip;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DiveListSortModel : public QSortFilterProxyModel
|
class DiveListSortModel : public QSortFilterProxyModel
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -106,7 +76,6 @@ public:
|
||||||
StartPressureRole,
|
StartPressureRole,
|
||||||
EndPressureRole,
|
EndPressureRole,
|
||||||
FirstGasRole,
|
FirstGasRole,
|
||||||
CollapsedRole,
|
|
||||||
SelectedRole,
|
SelectedRole,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue