mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-17 20:06:15 +00:00
Moved code around to make possible to compile the C part alone.
The C code should be compilable without the need to compile the Gui part, too. This is expecially good for unit testing as we can test all the algorithms without a window appearing out of nowhere. Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
9598462830
commit
55d010bad8
6 changed files with 169 additions and 144 deletions
|
@ -102,6 +102,8 @@ SET(SUBSURFACE_CORE_LIB_SRCS
|
||||||
linux.c
|
linux.c
|
||||||
#gettextfrommoc should be added because we are using it on the c-code.
|
#gettextfrommoc should be added because we are using it on the c-code.
|
||||||
gettextfromc.cpp
|
gettextfromc.cpp
|
||||||
|
#dirk ported some core functionality to c++.
|
||||||
|
qthelper.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
#the interface, in C++
|
#the interface, in C++
|
||||||
|
@ -192,7 +194,7 @@ ADD_DEPENDENCIES(subsurface_corelib version)
|
||||||
|
|
||||||
ENABLE_TESTING()
|
ENABLE_TESTING()
|
||||||
ADD_EXECUTABLE( TestUnitConversion tests/testunitconversion.cpp )
|
ADD_EXECUTABLE( TestUnitConversion tests/testunitconversion.cpp )
|
||||||
TARGET_LINK_LIBRARIES( TestUnitConversion ${QT_LIBRARIES})
|
TARGET_LINK_LIBRARIES( TestUnitConversion ${QT_LIBRARIES} ${SUBSURFACE_LINK_LIBRARIES} -lzip -ldivecomputer subsurface_corelib)
|
||||||
ADD_TEST( NAME TestUnitConversion COMMAND TestUnitConversion)
|
ADD_TEST( NAME TestUnitConversion COMMAND TestUnitConversion)
|
||||||
|
|
||||||
ADD_EXECUTABLE( TestProfile tests/testprofile.cpp )
|
ADD_EXECUTABLE( TestProfile tests/testprofile.cpp )
|
||||||
|
|
139
qt-gui.cpp
139
qt-gui.cpp
|
@ -9,8 +9,6 @@
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
#include <libxslt/documents.h>
|
|
||||||
|
|
||||||
#include "dive.h"
|
#include "dive.h"
|
||||||
#include "divelist.h"
|
#include "divelist.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
|
@ -45,11 +43,6 @@
|
||||||
// this will create a warning when executing lupdate
|
// this will create a warning when executing lupdate
|
||||||
#define translate(_context, arg) gettextFromC::instance()->tr(arg)
|
#define translate(_context, arg) gettextFromC::instance()->tr(arg)
|
||||||
|
|
||||||
const char *default_dive_computer_vendor;
|
|
||||||
const char *default_dive_computer_product;
|
|
||||||
const char *default_dive_computer_device;
|
|
||||||
DiveComputerList dcList;
|
|
||||||
|
|
||||||
static QApplication *application = NULL;
|
static QApplication *application = NULL;
|
||||||
static MainWindow *window = NULL;
|
static MainWindow *window = NULL;
|
||||||
|
|
||||||
|
@ -197,34 +190,6 @@ const QString get_dc_nickname(const char *model, uint32_t deviceid)
|
||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_dc_nickname(struct dive *dive)
|
|
||||||
{
|
|
||||||
if (!dive)
|
|
||||||
return;
|
|
||||||
|
|
||||||
struct divecomputer *dc = &dive->dc;
|
|
||||||
|
|
||||||
while (dc) {
|
|
||||||
if (dc->model && *dc->model && dc->deviceid &&
|
|
||||||
!dcList.getExact(dc->model, dc->deviceid)) {
|
|
||||||
// we don't have this one, yet
|
|
||||||
const DiveComputerNode *existNode = dcList.get(dc->model);
|
|
||||||
if (existNode) {
|
|
||||||
// we already have this model but a different deviceid
|
|
||||||
QString simpleNick(dc->model);
|
|
||||||
if (dc->deviceid == 0)
|
|
||||||
simpleNick.append(" (unknown deviceid)");
|
|
||||||
else
|
|
||||||
simpleNick.append(" (").append(QString::number(dc->deviceid, 16)).append(")");
|
|
||||||
dcList.addDC(dc->model, dc->deviceid, simpleNick);
|
|
||||||
} else {
|
|
||||||
dcList.addDC(dc->model, dc->deviceid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dc = dc->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString get_depth_string(int mm, bool showunit, bool showdecimal)
|
QString get_depth_string(int mm, bool showunit, bool showdecimal)
|
||||||
{
|
{
|
||||||
if (prefs.units.length == units::METERS) {
|
if (prefs.units.length == units::METERS) {
|
||||||
|
@ -358,55 +323,6 @@ double get_screen_dpi()
|
||||||
return mydesk->physicalDpiX();
|
return mydesk->physicalDpiX();
|
||||||
}
|
}
|
||||||
|
|
||||||
int is_default_dive_computer(const char *vendor, const char *product)
|
|
||||||
{
|
|
||||||
return default_dive_computer_vendor && !strcmp(vendor, default_dive_computer_vendor) &&
|
|
||||||
default_dive_computer_product && !strcmp(product, default_dive_computer_product);
|
|
||||||
}
|
|
||||||
|
|
||||||
int is_default_dive_computer_device(const char *name)
|
|
||||||
{
|
|
||||||
return default_dive_computer_device && !strcmp(name, default_dive_computer_device);
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_default_dive_computer(const char *vendor, const char *product)
|
|
||||||
{
|
|
||||||
QSettings s;
|
|
||||||
|
|
||||||
if (!vendor || !*vendor)
|
|
||||||
return;
|
|
||||||
if (!product || !*product)
|
|
||||||
return;
|
|
||||||
if (is_default_dive_computer(vendor, product))
|
|
||||||
return;
|
|
||||||
if (default_dive_computer_vendor)
|
|
||||||
free((void *)default_dive_computer_vendor);
|
|
||||||
if (default_dive_computer_product)
|
|
||||||
free((void *)default_dive_computer_product);
|
|
||||||
default_dive_computer_vendor = strdup(vendor);
|
|
||||||
default_dive_computer_product = strdup(product);
|
|
||||||
s.beginGroup("DiveComputer");
|
|
||||||
s.setValue("dive_computer_vendor", vendor);
|
|
||||||
s.setValue("dive_computer_product", product);
|
|
||||||
s.endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_default_dive_computer_device(const char *name)
|
|
||||||
{
|
|
||||||
QSettings s;
|
|
||||||
|
|
||||||
if (!name || !*name)
|
|
||||||
return;
|
|
||||||
if (is_default_dive_computer_device(name))
|
|
||||||
return;
|
|
||||||
if (default_dive_computer_device)
|
|
||||||
free((void *)default_dive_computer_device);
|
|
||||||
default_dive_computer_device = strdup(name);
|
|
||||||
s.beginGroup("DiveComputer");
|
|
||||||
s.setValue("dive_computer_device", name);
|
|
||||||
s.endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString getSubsurfaceDataPath(QString folderToFind)
|
QString getSubsurfaceDataPath(QString folderToFind)
|
||||||
{
|
{
|
||||||
QString execdir;
|
QString execdir;
|
||||||
|
@ -440,28 +356,6 @@ QString getSubsurfaceDataPath(QString folderToFind)
|
||||||
return QString("");
|
return QString("");
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_device_node(const char *model, uint32_t deviceid, const char *serial, const char *firmware, const char *nickname)
|
|
||||||
{
|
|
||||||
dcList.addDC(model, deviceid, nickname, serial, firmware);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool compareDC(const DiveComputerNode &a, const DiveComputerNode &b)
|
|
||||||
{
|
|
||||||
return a.deviceId < b.deviceId;
|
|
||||||
}
|
|
||||||
|
|
||||||
void call_for_each_dc(void *f, void (*callback)(void *, const char *, uint32_t,
|
|
||||||
const char *, const char *, const char *))
|
|
||||||
{
|
|
||||||
QList<DiveComputerNode> values = dcList.dcMap.values();
|
|
||||||
qSort(values.begin(), values.end(), compareDC);
|
|
||||||
for (int i = 0; i < values.size(); i++) {
|
|
||||||
const DiveComputerNode *node = &values.at(i);
|
|
||||||
callback(f, node->model.toUtf8().data(), node->deviceId, node->nickName.toUtf8().data(),
|
|
||||||
node->serialNumber.toUtf8().data(), node->firmware.toUtf8().data());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int gettimezoneoffset()
|
int gettimezoneoffset()
|
||||||
{
|
{
|
||||||
QDateTime dt1 = QDateTime::currentDateTime();
|
QDateTime dt1 = QDateTime::currentDateTime();
|
||||||
|
@ -530,36 +424,3 @@ QString get_trip_date_string(timestamp_t when, int nr)
|
||||||
.arg(monthname(tm.tm_mon))
|
.arg(monthname(tm.tm_mon))
|
||||||
.arg(tm.tm_year + 1900);
|
.arg(tm.tm_year + 1900);
|
||||||
}
|
}
|
||||||
|
|
||||||
static xmlDocPtr get_stylesheet_doc(const xmlChar *uri, xmlDictPtr, int, void *, xsltLoadType)
|
|
||||||
{
|
|
||||||
QFile f(QLatin1String(":/xslt/") + (const char *)uri);
|
|
||||||
if (!f.open(QIODevice::ReadOnly))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Load and parse the data */
|
|
||||||
QByteArray source = f.readAll();
|
|
||||||
|
|
||||||
xmlDocPtr doc = xmlParseMemory(source, source.size());
|
|
||||||
return doc;
|
|
||||||
}
|
|
||||||
|
|
||||||
xsltStylesheetPtr get_stylesheet(const char *name)
|
|
||||||
{
|
|
||||||
// this needs to be done only once, but doesn't hurt to run every time
|
|
||||||
xsltSetLoaderFunc(get_stylesheet_doc);
|
|
||||||
|
|
||||||
// get main document:
|
|
||||||
xmlDocPtr doc = get_stylesheet_doc((const xmlChar *)name, NULL, 0, NULL, XSLT_LOAD_START);
|
|
||||||
if (!doc)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
// xsltSetGenericErrorFunc(stderr, NULL);
|
|
||||||
xsltStylesheetPtr xslt = xsltParseStylesheetDoc(doc);
|
|
||||||
if (!xslt) {
|
|
||||||
xmlFreeDoc(doc);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return xslt;
|
|
||||||
}
|
|
||||||
|
|
148
qthelper.cpp
148
qthelper.cpp
|
@ -1,12 +1,19 @@
|
||||||
#include "qthelper.h"
|
#include "qthelper.h"
|
||||||
#include "qt-ui/mainwindow.h"
|
|
||||||
#include "qt-gui.h"
|
#include "qt-gui.h"
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
#define tr(_arg) MainWindow::instance()->information()->tr(_arg)
|
#include <QDebug>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <libxslt/documents.h>
|
||||||
|
|
||||||
|
#define tr(_arg) QObject::tr(_arg)
|
||||||
|
|
||||||
|
const char *default_dive_computer_vendor;
|
||||||
|
const char *default_dive_computer_product;
|
||||||
|
const char *default_dive_computer_device;
|
||||||
|
DiveComputerList dcList;
|
||||||
|
|
||||||
DiveComputerList::DiveComputerList()
|
DiveComputerList::DiveComputerList()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -265,3 +272,136 @@ int getUniqID(struct dive *d)
|
||||||
ids.insert(id);
|
ids.insert(id);
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" void create_device_node(const char *model, uint32_t deviceid, const char *serial, const char *firmware, const char *nickname)
|
||||||
|
{
|
||||||
|
dcList.addDC(model, deviceid, nickname, serial, firmware);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" bool compareDC(const DiveComputerNode &a, const DiveComputerNode &b)
|
||||||
|
{
|
||||||
|
return a.deviceId < b.deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void call_for_each_dc(void *f, void (*callback)(void *, const char *, uint32_t,
|
||||||
|
const char *, const char *, const char *))
|
||||||
|
{
|
||||||
|
QList<DiveComputerNode> values = dcList.dcMap.values();
|
||||||
|
qSort(values.begin(), values.end(), compareDC);
|
||||||
|
for (int i = 0; i < values.size(); i++) {
|
||||||
|
const DiveComputerNode *node = &values.at(i);
|
||||||
|
callback(f, node->model.toUtf8().data(), node->deviceId, node->nickName.toUtf8().data(),
|
||||||
|
node->serialNumber.toUtf8().data(), node->firmware.toUtf8().data());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static xmlDocPtr get_stylesheet_doc(const xmlChar *uri, xmlDictPtr, int, void *, xsltLoadType)
|
||||||
|
{
|
||||||
|
QFile f(QLatin1String(":/xslt/") + (const char *)uri);
|
||||||
|
if (!f.open(QIODevice::ReadOnly))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Load and parse the data */
|
||||||
|
QByteArray source = f.readAll();
|
||||||
|
|
||||||
|
xmlDocPtr doc = xmlParseMemory(source, source.size());
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" xsltStylesheetPtr get_stylesheet(const char *name)
|
||||||
|
{
|
||||||
|
// this needs to be done only once, but doesn't hurt to run every time
|
||||||
|
xsltSetLoaderFunc(get_stylesheet_doc);
|
||||||
|
|
||||||
|
// get main document:
|
||||||
|
xmlDocPtr doc = get_stylesheet_doc((const xmlChar *)name, NULL, 0, NULL, XSLT_LOAD_START);
|
||||||
|
if (!doc)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// xsltSetGenericErrorFunc(stderr, NULL);
|
||||||
|
xsltStylesheetPtr xslt = xsltParseStylesheetDoc(doc);
|
||||||
|
if (!xslt) {
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return xslt;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" int is_default_dive_computer(const char *vendor, const char *product)
|
||||||
|
{
|
||||||
|
return default_dive_computer_vendor && !strcmp(vendor, default_dive_computer_vendor) &&
|
||||||
|
default_dive_computer_product && !strcmp(product, default_dive_computer_product);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" int is_default_dive_computer_device(const char *name)
|
||||||
|
{
|
||||||
|
return default_dive_computer_device && !strcmp(name, default_dive_computer_device);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_default_dive_computer(const char *vendor, const char *product)
|
||||||
|
{
|
||||||
|
QSettings s;
|
||||||
|
|
||||||
|
if (!vendor || !*vendor)
|
||||||
|
return;
|
||||||
|
if (!product || !*product)
|
||||||
|
return;
|
||||||
|
if (is_default_dive_computer(vendor, product))
|
||||||
|
return;
|
||||||
|
if (default_dive_computer_vendor)
|
||||||
|
free((void *)default_dive_computer_vendor);
|
||||||
|
if (default_dive_computer_product)
|
||||||
|
free((void *)default_dive_computer_product);
|
||||||
|
default_dive_computer_vendor = strdup(vendor);
|
||||||
|
default_dive_computer_product = strdup(product);
|
||||||
|
s.beginGroup("DiveComputer");
|
||||||
|
s.setValue("dive_computer_vendor", vendor);
|
||||||
|
s.setValue("dive_computer_product", product);
|
||||||
|
s.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_default_dive_computer_device(const char *name)
|
||||||
|
{
|
||||||
|
QSettings s;
|
||||||
|
|
||||||
|
if (!name || !*name)
|
||||||
|
return;
|
||||||
|
if (is_default_dive_computer_device(name))
|
||||||
|
return;
|
||||||
|
if (default_dive_computer_device)
|
||||||
|
free((void *)default_dive_computer_device);
|
||||||
|
default_dive_computer_device = strdup(name);
|
||||||
|
s.beginGroup("DiveComputer");
|
||||||
|
s.setValue("dive_computer_device", name);
|
||||||
|
s.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void set_dc_nickname(struct dive *dive)
|
||||||
|
{
|
||||||
|
if (!dive)
|
||||||
|
return;
|
||||||
|
|
||||||
|
struct divecomputer *dc = &dive->dc;
|
||||||
|
|
||||||
|
while (dc) {
|
||||||
|
if (dc->model && *dc->model && dc->deviceid &&
|
||||||
|
!dcList.getExact(dc->model, dc->deviceid)) {
|
||||||
|
// we don't have this one, yet
|
||||||
|
const DiveComputerNode *existNode = dcList.get(dc->model);
|
||||||
|
if (existNode) {
|
||||||
|
// we already have this model but a different deviceid
|
||||||
|
QString simpleNick(dc->model);
|
||||||
|
if (dc->deviceid == 0)
|
||||||
|
simpleNick.append(" (unknown deviceid)");
|
||||||
|
else
|
||||||
|
simpleNick.append(" (").append(QString::number(dc->deviceid, 16)).append(")");
|
||||||
|
dcList.addDC(dc->model, dc->deviceid, simpleNick);
|
||||||
|
} else {
|
||||||
|
dcList.addDC(dc->model, dc->deviceid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dc = dc->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
9
tests/testprofile.cpp
Normal file
9
tests/testprofile.cpp
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include "testprofile.h"
|
||||||
|
#include "dive.h"
|
||||||
|
|
||||||
|
void TestProfile::testRedCeiling()
|
||||||
|
{
|
||||||
|
parse_file("../dives/deep.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
QTEST_MAIN(TestProfile)
|
12
tests/testprofile.h
Normal file
12
tests/testprofile.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#ifndef TESTPROFILE_H
|
||||||
|
#define TESTPROFILE_H
|
||||||
|
|
||||||
|
#include <QtTest>
|
||||||
|
|
||||||
|
class TestProfile : public QObject{
|
||||||
|
Q_OBJECT
|
||||||
|
private slots:
|
||||||
|
void testRedCeiling();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -20,6 +20,7 @@ void TestUnitConversion::testUnitConversions()
|
||||||
QCOMPARE(IS_FP_SAME(bar_to_atm(1.013), 1), true);
|
QCOMPARE(IS_FP_SAME(bar_to_atm(1.013), 1), true);
|
||||||
QCOMPARE(IS_FP_SAME(mbar_to_atm(1013), 1), true);
|
QCOMPARE(IS_FP_SAME(mbar_to_atm(1013), 1), true);
|
||||||
QCOMPARE(mbar_to_PSI(1013), (int)15);
|
QCOMPARE(mbar_to_PSI(1013), (int)15);
|
||||||
|
get_units();
|
||||||
}
|
}
|
||||||
|
|
||||||
QTEST_MAIN(TestUnitConversion)
|
QTEST_MAIN(TestUnitConversion)
|
||||||
|
|
Loading…
Add table
Reference in a new issue