mirror of
https://github.com/subsurface/subsurface.git
synced 2024-12-11 03:21:29 +00:00
556ecd5a9b
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>
97 lines
2.2 KiB
C++
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;
|
|
}
|