From ad7ffa0af03718829c62621aceaaac959932ac14 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Wed, 25 Sep 2019 20:49:13 +0200 Subject: Import: Make DownloadThread a subobject of DiveImportedModel Currently, desktop and mobile are accessing the DownloadThread and the DiveImportedModel concurrently. This makes a big data flow mess. To achieve a more hierarchical data flow, start by making the DownloadThread a subobject of DiveImportedModel. Start the download by calling a function in DiveImportedModel. Route the finished signal through DiveImportedModel. Thus, the model can reload itself with the new data. Signed-off-by: Berthold Stoeger --- qt-models/diveimportedmodel.cpp | 12 ++++++++++++ qt-models/diveimportedmodel.h | 13 ++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) (limited to 'qt-models') diff --git a/qt-models/diveimportedmodel.cpp b/qt-models/diveimportedmodel.cpp index c5180dda8..504931b85 100644 --- a/qt-models/diveimportedmodel.cpp +++ b/qt-models/diveimportedmodel.cpp @@ -8,6 +8,7 @@ DiveImportedModel::DiveImportedModel(QObject *o) : QAbstractTableModel(o), diveTable(nullptr), sitesTable(nullptr) { + connect(&thread, &QThread::finished, this, &DiveImportedModel::downloadThreadFinished); } int DiveImportedModel::columnCount(const QModelIndex&) const @@ -129,6 +130,17 @@ void DiveImportedModel::clearTable() endRemoveRows(); } +void DiveImportedModel::downloadThreadFinished() +{ + repopulate(thread.table(), thread.sites()); + emit downloadFinished(); +} + +void DiveImportedModel::startDownload() +{ + thread.start(); +} + void DiveImportedModel::repopulate(dive_table_t *table, struct dive_site_table *sites) { beginResetModel(); diff --git a/qt-models/diveimportedmodel.h b/qt-models/diveimportedmodel.h index 532f5b899..49cbdf10c 100644 --- a/qt-models/diveimportedmodel.h +++ b/qt-models/diveimportedmodel.h @@ -4,6 +4,7 @@ #include #include #include "core/divesite.h" +#include "core/downloadfromdcthread.h" class DiveImportedModel : public QAbstractTableModel { @@ -20,8 +21,10 @@ public: Qt::ItemFlags flags(const QModelIndex &index) const; Q_INVOKABLE void clearTable(); QHash roleNames() const; - Q_INVOKABLE void repopulate(dive_table_t *table, dive_site_table_t *sites); Q_INVOKABLE void recordDives(); + Q_INVOKABLE void startDownload(); + + DownloadThread thread; public slots: void changeSelected(QModelIndex clickedIndex); @@ -29,7 +32,15 @@ slots: void selectAll(); void selectNone(); +private +slots: + void downloadThreadFinished(); + +signals: + void downloadFinished(); + private: + void repopulate(dive_table_t *table, dive_site_table_t *sites); int firstIndex; int lastIndex; std::vector checkStates; // char instead of bool to avoid silly pessimization of std::vector. -- cgit v1.2.3-70-g09d2