subsurface/qt-models/completionmodels.cpp
Berthold Stoeger 556ecd5a9b core: use C++-primitives for g_tag_list
The old code was leaking memory. Use std::unique_ptr<> for
ownership management.

This is still very primitive and divetags are kept during
application lifetime. There should probably be some form
of reference counting. And the taglist should not be global,
but attached to the divelog.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2024-04-23 07:47:11 +07:00

97 lines
2.2 KiB
C++

// SPDX-License-Identifier: GPL-2.0
#include "qt-models/completionmodels.h"
#include "core/dive.h"
#include "core/tag.h"
#include <QSet>
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
#define SKIP_EMPTY Qt::SkipEmptyParts
#else
#define SKIP_EMPTY QString::SkipEmptyParts
#endif
CompletionModelBase::CompletionModelBase()
{
connect(&diveListNotifier, &DiveListNotifier::dataReset, this, &CompletionModelBase::updateModel);
connect(&diveListNotifier, &DiveListNotifier::divesImported, this, &CompletionModelBase::updateModel);
connect(&diveListNotifier, &DiveListNotifier::divesChanged, this, &CompletionModelBase::divesChanged);
}
void CompletionModelBase::updateModel()
{
setStringList(getStrings());
}
void CompletionModelBase::divesChanged(const QVector<dive *> &, DiveField field)
{
if (relevantDiveField(field))
updateModel();
}
static QStringList getCSVList(char *dive::*item)
{
QSet<QString> set;
struct dive *dive;
int i = 0;
for_each_dive (i, dive) {
QString str(dive->*item);
for (const QString &value: str.split(",", SKIP_EMPTY))
set.insert(value.trimmed());
}
QStringList setList = set.values();
std::sort(setList.begin(), setList.end());
return setList;
}
QStringList BuddyCompletionModel::getStrings()
{
return getCSVList(&dive::buddy);
}
bool BuddyCompletionModel::relevantDiveField(const DiveField &f)
{
return f.buddy;
}
QStringList DiveGuideCompletionModel::getStrings()
{
return getCSVList(&dive::diveguide);
}
bool DiveGuideCompletionModel::relevantDiveField(const DiveField &f)
{
return f.diveguide;
}
QStringList SuitCompletionModel::getStrings()
{
QStringList list;
struct dive *dive;
int i = 0;
for_each_dive (i, dive) {
QString suit(dive->suit);
if (!list.contains(suit))
list.append(suit);
}
std::sort(list.begin(), list.end());
return list;
}
bool SuitCompletionModel::relevantDiveField(const DiveField &f)
{
return f.suit;
}
QStringList TagCompletionModel::getStrings()
{
QStringList list;
for (const std::unique_ptr<divetag> &tag: g_tag_list)
list.append(QString::fromStdString(tag->name));
std::sort(list.begin(), list.end());
return list;
}
bool TagCompletionModel::relevantDiveField(const DiveField &f)
{
return f.tags;
}