mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
desktop: automatically reload completion-models
Instead of programatically reload the completion models, listen to the relevant signals in the models. To that goal, derive all the models from a base class. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
52d5125926
commit
38a784f5af
5 changed files with 83 additions and 36 deletions
|
@ -127,7 +127,6 @@ void TabDiveEquipment::updateData()
|
||||||
{
|
{
|
||||||
cylindersModel->updateDive(current_dive);
|
cylindersModel->updateDive(current_dive);
|
||||||
weightModel->updateDive(current_dive);
|
weightModel->updateDive(current_dive);
|
||||||
suitModel.updateModel();
|
|
||||||
|
|
||||||
ui.cylinders->view()->hideColumn(CylindersModel::DEPTH);
|
ui.cylinders->view()->hideColumn(CylindersModel::DEPTH);
|
||||||
bool is_ccr = current_dive && get_dive_dc(current_dive, dc_number)->divemode == CCR;
|
bool is_ccr = current_dive && get_dive_dc(current_dive, dc_number)->divemode == CCR;
|
||||||
|
|
|
@ -261,18 +261,12 @@ void MainTab::divesChanged(const QVector<dive *> &dives, DiveField field)
|
||||||
}
|
}
|
||||||
if (field.divesite)
|
if (field.divesite)
|
||||||
updateDiveSite(current_dive);
|
updateDiveSite(current_dive);
|
||||||
if (field.tags) {
|
if (field.tags)
|
||||||
tagModel.updateModel(); // TODO: Don't do this here
|
|
||||||
ui.tagWidget->setText(get_taglist_string(current_dive->tag_list));
|
ui.tagWidget->setText(get_taglist_string(current_dive->tag_list));
|
||||||
}
|
if (field.buddy)
|
||||||
if (field.buddy) {
|
|
||||||
buddyModel.updateModel(); // TODO: Don't do this here
|
|
||||||
ui.buddy->setText(current_dive->buddy);
|
ui.buddy->setText(current_dive->buddy);
|
||||||
}
|
if (field.divemaster)
|
||||||
if (field.divemaster) {
|
|
||||||
diveMasterModel.updateModel(); // TODO: Don't do this here
|
|
||||||
ui.divemaster->setText(current_dive->divemaster);
|
ui.divemaster->setText(current_dive->divemaster);
|
||||||
}
|
|
||||||
|
|
||||||
// If duration or depth changed, the profile needs to be replotted
|
// If duration or depth changed, the profile needs to be replotted
|
||||||
if (field.duration || field.depth)
|
if (field.duration || field.depth)
|
||||||
|
@ -499,9 +493,6 @@ void MainTab::updateDiveInfo()
|
||||||
|
|
||||||
void MainTab::reload()
|
void MainTab::reload()
|
||||||
{
|
{
|
||||||
buddyModel.updateModel();
|
|
||||||
diveMasterModel.updateModel();
|
|
||||||
tagModel.updateModel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainTab::refreshDisplayedDiveSite()
|
void MainTab::refreshDisplayedDiveSite()
|
||||||
|
|
|
@ -452,9 +452,9 @@ void QMLManager::selectSwipeRow(int row)
|
||||||
|
|
||||||
void QMLManager::updateAllGlobalLists()
|
void QMLManager::updateAllGlobalLists()
|
||||||
{
|
{
|
||||||
buddyModel.updateModel(); emit buddyListChanged();
|
emit buddyListChanged();
|
||||||
suitModel.updateModel(); emit suitListChanged();
|
emit suitListChanged();
|
||||||
divemasterModel.updateModel(); emit divemasterListChanged();
|
emit divemasterListChanged();
|
||||||
// TODO: It would be nice if we could export the list of locations via model/view instead of a Q_PROPERTY
|
// TODO: It would be nice if we could export the list of locations via model/view instead of a Q_PROPERTY
|
||||||
emit locationListChanged();
|
emit locationListChanged();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include "core/dive.h"
|
#include "core/dive.h"
|
||||||
#include "core/tag.h"
|
#include "core/tag.h"
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
|
||||||
#define SKIP_EMPTY Qt::SkipEmptyParts
|
#define SKIP_EMPTY Qt::SkipEmptyParts
|
||||||
|
@ -11,6 +10,24 @@
|
||||||
#define SKIP_EMPTY QString::SkipEmptyParts
|
#define SKIP_EMPTY QString::SkipEmptyParts
|
||||||
#endif
|
#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)
|
static QStringList getCSVList(char *dive::*item)
|
||||||
{
|
{
|
||||||
QSet<QString> set;
|
QSet<QString> set;
|
||||||
|
@ -26,17 +43,27 @@ static QStringList getCSVList(char *dive::*item)
|
||||||
return setList;
|
return setList;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BuddyCompletionModel::updateModel()
|
QStringList BuddyCompletionModel::getStrings()
|
||||||
{
|
{
|
||||||
setStringList(getCSVList(&dive::buddy));
|
return getCSVList(&dive::buddy);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiveMasterCompletionModel::updateModel()
|
bool BuddyCompletionModel::relevantDiveField(const DiveField &f)
|
||||||
{
|
{
|
||||||
setStringList(getCSVList(&dive::divemaster));
|
return f.buddy;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SuitCompletionModel::updateModel()
|
QStringList DiveMasterCompletionModel::getStrings()
|
||||||
|
{
|
||||||
|
return getCSVList(&dive::divemaster);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DiveMasterCompletionModel::relevantDiveField(const DiveField &f)
|
||||||
|
{
|
||||||
|
return f.divemaster;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList SuitCompletionModel::getStrings()
|
||||||
{
|
{
|
||||||
QStringList list;
|
QStringList list;
|
||||||
struct dive *dive;
|
struct dive *dive;
|
||||||
|
@ -47,18 +74,29 @@ void SuitCompletionModel::updateModel()
|
||||||
list.append(suit);
|
list.append(suit);
|
||||||
}
|
}
|
||||||
std::sort(list.begin(), list.end());
|
std::sort(list.begin(), list.end());
|
||||||
setStringList(list);
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TagCompletionModel::updateModel()
|
bool SuitCompletionModel::relevantDiveField(const DiveField &f)
|
||||||
|
{
|
||||||
|
return f.suit;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList TagCompletionModel::getStrings()
|
||||||
{
|
{
|
||||||
if (g_tag_list == NULL)
|
if (g_tag_list == NULL)
|
||||||
return;
|
return {};
|
||||||
QStringList list;
|
QStringList list;
|
||||||
struct tag_entry *current_tag_entry = g_tag_list;
|
struct tag_entry *current_tag_entry = g_tag_list;
|
||||||
while (current_tag_entry != NULL) {
|
while (current_tag_entry != NULL) {
|
||||||
list.append(QString(current_tag_entry->tag->name));
|
list.append(QString(current_tag_entry->tag->name));
|
||||||
current_tag_entry = current_tag_entry->next;
|
current_tag_entry = current_tag_entry->next;
|
||||||
}
|
}
|
||||||
setStringList(list);
|
std::sort(list.begin(), list.end());
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TagCompletionModel::relevantDiveField(const DiveField &f)
|
||||||
|
{
|
||||||
|
return f.tags;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,30 +2,49 @@
|
||||||
#ifndef COMPLETIONMODELS_H
|
#ifndef COMPLETIONMODELS_H
|
||||||
#define COMPLETIONMODELS_H
|
#define COMPLETIONMODELS_H
|
||||||
|
|
||||||
|
#include "core/subsurface-qt/divelistnotifier.h"
|
||||||
#include <QStringListModel>
|
#include <QStringListModel>
|
||||||
|
|
||||||
class BuddyCompletionModel : public QStringListModel {
|
struct dive;
|
||||||
|
|
||||||
|
class CompletionModelBase : public QStringListModel {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
CompletionModelBase();
|
||||||
|
private slots:
|
||||||
void updateModel();
|
void updateModel();
|
||||||
|
void divesChanged(const QVector<dive *> &dives, DiveField field);
|
||||||
|
protected:
|
||||||
|
virtual QStringList getStrings() = 0;
|
||||||
|
virtual bool relevantDiveField(const DiveField &f) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DiveMasterCompletionModel : public QStringListModel {
|
class BuddyCompletionModel final : public CompletionModelBase {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
private:
|
||||||
void updateModel();
|
QStringList getStrings() override;
|
||||||
|
bool relevantDiveField(const DiveField &f) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SuitCompletionModel : public QStringListModel {
|
class DiveMasterCompletionModel final : public CompletionModelBase {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
private:
|
||||||
void updateModel();
|
QStringList getStrings() override;
|
||||||
|
bool relevantDiveField(const DiveField &f) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TagCompletionModel : public QStringListModel {
|
class SuitCompletionModel final : public CompletionModelBase {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
private:
|
||||||
void updateModel();
|
QStringList getStrings() override;
|
||||||
|
bool relevantDiveField(const DiveField &f) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TagCompletionModel final : public CompletionModelBase {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QStringList getStrings() override;
|
||||||
|
bool relevantDiveField(const DiveField &f) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // COMPLETIONMODELS_H
|
#endif // COMPLETIONMODELS_H
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue