Import: unglobalize downloadTable

To make data flow more clear, unglobalize the downloadTable object.
Make it a subobject of DownloadThread. The difficult part was making
this compatible with QML, because somehow the pointer to the
download-table has to be passed to the DiveImportedModel. Desktop would
simply pass it to the constructor. But with objects generated in QML
this is not possible. Instead, pass the table in the repopulate()
function. This seems to make sense, but for this to work, we have to
declare pointer-to-dive-table as a Q_METATYPE. And this only works
if we use a typedef, because MOC removes the "struct" from "struct
dive_table". This leads to compilation errors, because dive_table is
the symbol-name of the global dive table! Sigh.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-12-10 14:49:32 +01:00 committed by Dirk Hohndel
parent a6a5cf61e2
commit bfe69239df
9 changed files with 38 additions and 35 deletions

View file

@ -273,10 +273,10 @@ struct divecomputer {
#define W_IDX_PRIMARY 0
#define W_IDX_SECONDARY 1
struct dive_table {
typedef struct dive_table {
int nr, allocated;
struct dive **dives;
};
} dive_table_t;
typedef struct dive_trip
{
@ -419,7 +419,7 @@ extern const struct units SI_units, IMPERIAL_units;
extern const struct units *get_units(void);
extern int run_survey, verbose, quit, force_root;
extern struct dive_table dive_table, downloadTable;
extern struct dive_table dive_table;
extern struct dive displayed_dive;
extern unsigned int dc_number;
extern struct dive *current_dive;
@ -751,10 +751,14 @@ extern void average_max_depth(struct diveplan *dive, int *avg_depth, int *max_de
#ifdef __cplusplus
}
/* Make pointers to dive and dive_trip "Qt metatypes" so that they can
* be passed through QVariants. */
/* Make pointers to dive, dive_trip and dive_table "Qt metatypes" so that they can
* be passed through QVariants and through QML.
* Note: we have to use the typedef "dive_table_t" instead of "struct dive_table",
* because MOC removes the "struct", but dive_table is already the name of a global
* variable, leading to compilation errors. */
Q_DECLARE_METATYPE(struct dive *);
Q_DECLARE_METATYPE(struct dive_trip *);
Q_DECLARE_METATYPE(dive_table_t *);
#endif

View file

@ -74,9 +74,6 @@ dive_trip_t *dive_trip_list;
unsigned int amount_selected;
// We need to stop using globals, really.
struct dive_table downloadTable;
#if DEBUG_SELECTION_TRACKING
void dump_selection(void)
{

View file

@ -59,9 +59,9 @@ static void updateRememberedDCs()
}
DownloadThread::DownloadThread()
DownloadThread::DownloadThread() : downloadTable({ 0 }),
m_data(DCDeviceData::instance())
{
m_data = DCDeviceData::instance();
}
void DownloadThread::run()
@ -80,7 +80,7 @@ void DownloadThread::run()
internalData->devname = "ftdi";
#endif
qDebug() << "Starting download from " << (internalData->bluetooth_mode ? "BT" : internalData->devname);
downloadTable.nr = 0;
clear_table(&downloadTable);
Q_ASSERT(internalData->download_table != nullptr);
const char *errorText;
@ -302,6 +302,11 @@ DCDeviceData *DownloadThread::data()
return m_data;
}
struct dive_table *DownloadThread::table()
{
return &downloadTable;
}
QString DCDeviceData::vendor() const
{
return data.vendor;

View file

@ -6,6 +6,7 @@
#include <QHash>
#include <QLoggingCategory>
#include "dive.h"
#include "libdivecomputer.h"
#include "connectionlistmodel.h"
#if BT_SUPPORT
@ -59,15 +60,18 @@ private:
class DownloadThread : public QThread {
Q_OBJECT
Q_PROPERTY(dive_table_t *table READ table CONSTANT)
public:
DownloadThread();
void run() override;
DCDeviceData *data();
struct dive_table *table();
QString error;
private:
struct dive_table downloadTable;
DCDeviceData *m_data;
};

View file

@ -1387,7 +1387,7 @@ const char *do_libdivecomputer_import(device_data_t *data)
/* TODO: Show the logfile to the user on error. */
dc_device_close(data->device);
data->device = NULL;
if (!downloadTable.nr)
if (!data->download_table->nr)
dev_info(data, translate("gettextFromC", "No new dives downloaded from dive computer"));
}
dc_iostream_close(data->iostream);