mirror of
https://gitlab.com/pholy/OSCAR-code.git
synced 2025-04-13 09:10:45 +00:00
Sorry, massive list of small changes - debugging, sleepyhead deleteion, etc
This commit is contained in:
parent
4db2d4efd9
commit
590032e76d
20
README
20
README
@ -1,8 +1,8 @@
|
|||||||
OpenSource CPAP Analysis Reporter - OSCAR
|
OpenSource CPAP Analysis Reporter - OSCAR
|
||||||
|
|
||||||
OSCAR started as a maintenance fork of SleepyHead version 1.1.0 when that was abandoned by Mark Watkins.
|
OSCAR is a derivative of SleepyHead version 1.1.0,created when that was abandoned by Mark Watkins.
|
||||||
|
|
||||||
SleepyHead was cross platform, opensource sleep tracking program for reviewing CPAP and Oximetry data,
|
SleepyHead was a cross platform, opensource sleep tracking program for reviewing CPAP and Oximetry data,
|
||||||
which are devices used in the treatment of Sleep Disorders like Obstructive Sleep Apnea. It was released
|
which are devices used in the treatment of Sleep Disorders like Obstructive Sleep Apnea. It was released
|
||||||
under the GPL version 3 license. See the file COPYING for those details.
|
under the GPL version 3 license. See the file COPYING for those details.
|
||||||
|
|
||||||
@ -10,14 +10,17 @@ SleepyHead was written by Mark Watkins (aka Jedimark), an Australian software de
|
|||||||
|
|
||||||
SleepyHead was copyright (C) 2011-2018 by Mark Watkins <mark@jedimark.net>
|
SleepyHead was copyright (C) 2011-2018 by Mark Watkins <mark@jedimark.net>
|
||||||
|
|
||||||
Most of OSCAR is copyright (c) 2011-2018 by Mark Watkins <mark@jedimark.net>
|
|
||||||
Portions of OSCAR are copyright (c) 2019 by Nightowl Software <michaelnightowl99@gmail.com>
|
Portions of OSCAR are copyright (c) 2019 by Nightowl Software <michaelnightowl99@gmail.com>
|
||||||
|
|
||||||
Requirements:
|
Requirements: (Linux package names are given, Windows and Mac should be similar)
|
||||||
-------------
|
-------------
|
||||||
Qt5.9 SDK with help (Qt5.9 from http://qt.io/download-open-source recommended)
|
Qt5.9 SDK with help (Qt5.9 from http://qt.io/download-open-source recommended)
|
||||||
Qt5.7 SDL without help is possible (for Debian Stretch)
|
The help modules are libqt5help5, qttools5-dev and qttools5-dev-tools
|
||||||
Linux needs libudev-dev for qserialport to compile
|
|
||||||
|
Qt5.7 SDK without help is possible (for Debian Stretch)
|
||||||
|
|
||||||
|
All systems need qt5-default, libqt5serialport5, libqt5serailport5-dev and libqt5opengl5-dev
|
||||||
|
Linux also needs libudev-dev and zlib1g-dev
|
||||||
|
|
||||||
OSX needs Xcode and commandline tools from AppStore,
|
OSX needs Xcode and commandline tools from AppStore,
|
||||||
|
|
||||||
@ -31,7 +34,7 @@ Recommend shadow building to not cruft up the source code folder:
|
|||||||
cd ..
|
cd ..
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
qmake ../oscr-code/OSCAR_QT.pro
|
qmake ../oscar-code/OSCAR_QT.pro
|
||||||
make
|
make
|
||||||
|
|
||||||
You may need to add a -spec option to qmake to suit your platform.
|
You may need to add a -spec option to qmake to suit your platform.
|
||||||
@ -59,9 +62,6 @@ in redistribution of derivatives.
|
|||||||
|
|
||||||
It is built using Qt SDK (Open Source Edition), available from http://qt.io.
|
It is built using Qt SDK (Open Source Edition), available from http://qt.io.
|
||||||
|
|
||||||
It also uses QuaZip, by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package
|
|
||||||
http://sourceforge.net/projects/quazip/
|
|
||||||
|
|
||||||
Redistribution of derivatives ( a note added by Mark Watins )
|
Redistribution of derivatives ( a note added by Mark Watins )
|
||||||
-----------------------------
|
-----------------------------
|
||||||
Mark Watkins created this software to help lessen the exploitation of others. Seeing his work being used to exploit others
|
Mark Watkins created this software to help lessen the exploitation of others. Seeing his work being used to exploit others
|
||||||
|
@ -331,6 +331,7 @@ gGraphView::gGraphView(QWidget *parent, gGraphView *shared)
|
|||||||
|
|
||||||
this->setMouseTracking(true);
|
this->setMouseTracking(true);
|
||||||
m_emptytext = STR_Empty_NoData;
|
m_emptytext = STR_Empty_NoData;
|
||||||
|
this->setEmptyImage(QPixmap(":/icons/logo.png"));
|
||||||
InitGraphGlobals(); // FIXME: sstangl: handle error return.
|
InitGraphGlobals(); // FIXME: sstangl: handle error return.
|
||||||
#ifdef ENABLE_THREADED_DRAWING
|
#ifdef ENABLE_THREADED_DRAWING
|
||||||
m_idealthreads = QThread::idealThreadCount();
|
m_idealthreads = QThread::idealThreadCount();
|
||||||
@ -1387,9 +1388,18 @@ void gGraphView::paintGL()
|
|||||||
strings_drawn_this_frame = 0;
|
strings_drawn_this_frame = 0;
|
||||||
strings_cached_this_frame = 0;
|
strings_cached_this_frame = 0;
|
||||||
|
|
||||||
|
// qDebug() << "About to call renderGraphs from paintGL()";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
graphs_drawn = renderGraphs(painter);
|
graphs_drawn = renderGraphs(painter);
|
||||||
|
|
||||||
|
// qDebug() << "Finished call renderGraphs from paintGL()";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
if (!graphs_drawn) { // No graphs drawn? show something useful :)
|
if (!graphs_drawn) { // No graphs drawn? show something useful :)
|
||||||
|
qDebug() << "No graphs drawn";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
QString txt;
|
QString txt;
|
||||||
if (m_showAuthorMessage) {
|
if (m_showAuthorMessage) {
|
||||||
if (emptyText() == STR_Empty_Brick) {
|
if (emptyText() == STR_Empty_Brick) {
|
||||||
@ -1399,18 +1409,38 @@ void gGraphView::paintGL()
|
|||||||
txt = QObject::tr("There is no data to graph");
|
txt = QObject::tr("There is no data to graph");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
qDebug() << txt;
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
// int x2, y2;
|
// int x2, y2;
|
||||||
// GetTextExtent(m_emptytext, x2, y2, bigfont);
|
// GetTextExtent(m_emptytext, x2, y2, bigfont);
|
||||||
// int tp2, tp1;
|
// int tp2, tp1;
|
||||||
|
|
||||||
if (!m_emptyimage.isNull()) {
|
if (this->m_emptyimage.isNull() )
|
||||||
painter.drawPixmap(width() /2 - m_emptyimage.width() /2, height() /2 - m_emptyimage.height() /2 , m_emptyimage);
|
qDebug() << "m_emptyimage is NULL";
|
||||||
|
else
|
||||||
|
qDebug() << "m_emptyimage is not NULL";
|
||||||
|
sleep(3);
|
||||||
|
|
||||||
|
if (! this->m_emptyimage.isNull()) {
|
||||||
|
int x = width()/2 - this->m_emptyimage.width()/2;
|
||||||
|
int y = height()/2 - this->m_emptyimage.height()/2;
|
||||||
|
// qDebug() << "size is " + QString::number(m_emptyimage.width()) + " by " + QString::number(m_emptyimage.height());
|
||||||
|
// qDebug() << "x-pos: " + QString::number(x) + " y-pos: " + QString::number(y);
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
|
QRectF target(QRect(x, y, this->m_emptyimage.width(), this->m_emptyimage.height()));
|
||||||
|
QRectF source(QRect(0, 0, this->m_emptyimage.width(), this->m_emptyimage.height()));
|
||||||
|
|
||||||
|
painter.drawPixmap(target, this->m_emptyimage, source);
|
||||||
|
|
||||||
// tp2 = height() /2 + m_emptyimage.height()/2 + y2;
|
// tp2 = height() /2 + m_emptyimage.height()/2 + y2;
|
||||||
|
|
||||||
} /*else {
|
} /*else {
|
||||||
|
|
||||||
tp2 = height() / 2 + y2;
|
tp2 = height() / 2 + y2;
|
||||||
}*/
|
}*/
|
||||||
|
// qDebug() << "Break 9";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
QColor col = Qt::black;
|
QColor col = Qt::black;
|
||||||
painter.setPen(col);
|
painter.setPen(col);
|
||||||
|
|
||||||
@ -1418,12 +1448,27 @@ void gGraphView::paintGL()
|
|||||||
// painter.drawText((width() / 2) - x2 / 2, tp2, m_emptytext);
|
// painter.drawText((width() / 2) - x2 / 2, tp2, m_emptytext);
|
||||||
|
|
||||||
QRectF rec(0,0,width(),0);
|
QRectF rec(0,0,width(),0);
|
||||||
|
// if (defaultfont == nullptr)
|
||||||
|
// qDebug() << "Default font is NULL";
|
||||||
|
// else
|
||||||
|
// qDebug() << "Default font is not NULL";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
painter.setFont(*defaultfont);
|
painter.setFont(*defaultfont);
|
||||||
rec = painter.boundingRect(rec, Qt::AlignHCenter | Qt::AlignBottom, txt);
|
rec = painter.boundingRect(rec, Qt::AlignHCenter | Qt::AlignBottom, txt);
|
||||||
rec.moveBottom(height()-5);
|
rec.moveBottom(height()-5);
|
||||||
|
|
||||||
|
// qDebug() << "Break 8";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
painter.drawText(rec, Qt::AlignHCenter | Qt::AlignBottom, txt);
|
painter.drawText(rec, Qt::AlignHCenter | Qt::AlignBottom, txt);
|
||||||
|
// qDebug() << "Break 7";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// qDebug() << "Break 1";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
if (AppSetting->lineCursorMode()) {
|
if (AppSetting->lineCursorMode()) {
|
||||||
emit updateCurrentTime(graphs_drawn ? m_currenttime : 0.0F);
|
emit updateCurrentTime(graphs_drawn ? m_currenttime : 0.0F);
|
||||||
} else {
|
} else {
|
||||||
@ -1431,8 +1476,14 @@ void gGraphView::paintGL()
|
|||||||
}
|
}
|
||||||
AppSetting->usePixmapCaching() ? DrawTextQueCached(painter) :DrawTextQue(painter);
|
AppSetting->usePixmapCaching() ? DrawTextQueCached(painter) :DrawTextQue(painter);
|
||||||
|
|
||||||
|
// qDebug() << "Break 2";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
m_tooltip->paint(painter);
|
m_tooltip->paint(painter);
|
||||||
|
|
||||||
|
// qDebug() << "Break 3";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
#ifdef DEBUG_EFFICIENCY
|
#ifdef DEBUG_EFFICIENCY
|
||||||
const int rs = 20;
|
const int rs = 20;
|
||||||
static double ring[rs] = {0};
|
static double ring[rs] = {0};
|
||||||
@ -1482,6 +1533,9 @@ void gGraphView::paintGL()
|
|||||||
|
|
||||||
painter.end();
|
painter.end();
|
||||||
|
|
||||||
|
// qDebug() << "Break 4";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
#ifndef BROKEN_OPENGL_BUILD
|
#ifndef BROKEN_OPENGL_BUILD
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5,4,0)
|
#if QT_VERSION < QT_VERSION_CHECK(5,4,0)
|
||||||
swapBuffers();
|
swapBuffers();
|
||||||
@ -1493,6 +1547,9 @@ void gGraphView::paintGL()
|
|||||||
redrawtimer->start();
|
redrawtimer->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// qDebug() << "Break 5";
|
||||||
|
// sleep(3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString gGraphView::getRangeString()
|
QString gGraphView::getRangeString()
|
||||||
|
@ -82,7 +82,7 @@ protected:
|
|||||||
enum FlagType { FT_Bar, FT_Dot, FT_Span };
|
enum FlagType { FT_Bar, FT_Dot, FT_Span };
|
||||||
|
|
||||||
|
|
||||||
void setEmptyImage(QString text, QPixmap pixmap);
|
//void setEmptyImage(QString text, QPixmap pixmap);
|
||||||
|
|
||||||
class MyLabel:public QWidget
|
class MyLabel:public QWidget
|
||||||
{
|
{
|
||||||
|
@ -267,7 +267,7 @@ class Day
|
|||||||
return (c * 60.0) / minutes;
|
return (c * 60.0) / minutes;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \brief SleepyyHead Events Index, AHI combined with SleepyHead detected events.. :)
|
//! \brief SleepyyHead Events Index, AHI combined with OSCAR detected events.. :)
|
||||||
EventDataType calcSHEI() {
|
EventDataType calcSHEI() {
|
||||||
EventDataType c = count(CPAP_Hypopnea) + count(CPAP_Obstructive) + count(CPAP_Apnea) + count(CPAP_ClearAirway) + count(CPAP_UserFlag1) + count(CPAP_UserFlag2);
|
EventDataType c = count(CPAP_Hypopnea) + count(CPAP_Obstructive) + count(CPAP_Apnea) + count(CPAP_ClearAirway) + count(CPAP_UserFlag1) + count(CPAP_UserFlag2);
|
||||||
EventDataType minutes = hours(MT_CPAP) * 60.0;
|
EventDataType minutes = hours(MT_CPAP) * 60.0;
|
||||||
|
@ -561,6 +561,7 @@ const QString Machine::getEventsPath()
|
|||||||
}
|
}
|
||||||
const QString Machine::getBackupPath()
|
const QString Machine::getBackupPath()
|
||||||
{
|
{
|
||||||
|
qDebug() << "Backup Path is " + getDataPath() + "Backup/";
|
||||||
return getDataPath() + "Backup/";
|
return getDataPath() + "Backup/";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ class BoundsError {};
|
|||||||
//! \brief Exception class for to trap old database versions.
|
//! \brief Exception class for to trap old database versions.
|
||||||
class OldDBVersion {};
|
class OldDBVersion {};
|
||||||
|
|
||||||
const quint32 magic = 0xC73216AB; // Magic number for SleepyHead Data Files.. Don't touch!
|
const quint32 magic = 0xC73216AB; // Magic number for OSCAR Data Files.. Don't touch!
|
||||||
|
|
||||||
//const int max_number_event_fields=10;
|
//const int max_number_event_fields=10;
|
||||||
// This should probably move somewhere else
|
// This should probably move somewhere else
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
@ -194,6 +195,10 @@ bool Preferences::Open(QString filename)
|
|||||||
QDomElement root = doc.documentElement();
|
QDomElement root = doc.documentElement();
|
||||||
|
|
||||||
if (root.tagName() != STR_AppName) {
|
if (root.tagName() != STR_AppName) {
|
||||||
|
if (root.tagName() == "SleepyHead" ) {
|
||||||
|
QMessageBox::warning(nullptr, STR_MessageBox_Error, QObject::tr( "You must run the OSCAR Migration Tool"), QMessageBox::Ok);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,7 +164,7 @@ bool Profile::OpenMachines()
|
|||||||
QDomElement root = doc.firstChild().toElement();
|
QDomElement root = doc.firstChild().toElement();
|
||||||
|
|
||||||
if (root.tagName().toLower() != "machines") {
|
if (root.tagName().toLower() != "machines") {
|
||||||
//qDebug() << "No Machines Tag in Profiles.xml";
|
qDebug() << "No Machines Tag in machines.xml";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,7 +480,7 @@ void UpdaterWindow::ParseUpdatesXML(QIODevice *dev)
|
|||||||
|
|
||||||
for (it = updatesparser.packages.begin(); it!=updatesparser.packages.end(); ++it) {
|
for (it = updatesparser.packages.begin(); it!=updatesparser.packages.end(); ++it) {
|
||||||
const PackageUpdate & update = it.value();
|
const PackageUpdate & update = it.value();
|
||||||
if (it.key() == UPDATE_SleepyHead) {
|
if (it.key() == UPDATE_OSCAR) {
|
||||||
if (compareVersion(update.versionString)>0) {
|
if (compareVersion(update.versionString)>0) {
|
||||||
updateList.push_back(update);
|
updateList.push_back(update);
|
||||||
}
|
}
|
||||||
@ -501,14 +501,14 @@ void UpdaterWindow::ParseUpdatesXML(QIODevice *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (updateList.size()==0) {
|
if (updateList.size()==0) {
|
||||||
mainwin->Notify(tr("No updates were found for your platform."), tr("SleepyHead Updates"), 5000);
|
mainwin->Notify(tr("No updates were found for your platform."), tr("OSCAR Updates"), 5000);
|
||||||
PREF[STR_GEN_UpdatesLastChecked] = QDateTime::currentDateTime();
|
PREF[STR_GEN_UpdatesLastChecked] = QDateTime::currentDateTime();
|
||||||
close();
|
close();
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (QMessageBox::question(mainwin, tr("SleepyHead Updates"),
|
if (QMessageBox::question(mainwin, tr("OSCAR Updates"),
|
||||||
tr("New SleepyHead Updates are avilable:")+"\n\n"+
|
tr("New OSCAR Updates are avilable:")+"\n\n"+
|
||||||
tr("Would you like to download and install them now?"),
|
tr("Would you like to download and install them now?"),
|
||||||
QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
|
QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
|
||||||
|
|
||||||
|
@ -30,9 +30,9 @@ enum RequestMode { RM_None, RM_CheckUpdates, RM_GetFile };
|
|||||||
|
|
||||||
|
|
||||||
/*! \class UpdaterWindow
|
/*! \class UpdaterWindow
|
||||||
\brief Auto-Update Module for SleepyHead
|
\brief Auto-Update Module for OSCAR
|
||||||
|
|
||||||
This class handles the complete Auto-Update procedure for SleepyHead, it does the network checks,
|
This class handles the complete Auto-Update procedure for OSCAR, it does the network checks,
|
||||||
parses the update.xml from SourceForge host, checks for any new updates, and provides the UI
|
parses the update.xml from SourceForge host, checks for any new updates, and provides the UI
|
||||||
and mechanisms to download and replace the binaries according to what is specified in update.xml.
|
and mechanisms to download and replace the binaries according to what is specified in update.xml.
|
||||||
*/
|
*/
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* SleepyHead AboutDialog Implementation
|
/* OSCAR AboutDialog Implementation
|
||||||
*
|
*
|
||||||
* Date created: 7/5/2018
|
* Date created: 7/5/2018
|
||||||
*
|
*
|
||||||
@ -93,7 +93,7 @@ QString AboutDialog::getCredits()
|
|||||||
QString AboutDialog::getRelnotes()
|
QString AboutDialog::getRelnotes()
|
||||||
{
|
{
|
||||||
QFile clfile(":/docs/release_notes.html");
|
QFile clfile(":/docs/release_notes.html");
|
||||||
QString changeLog = tr("Sorry, could not locate changelog.");
|
QString changeLog = tr("Sorry, could not locate Release Notes.");
|
||||||
if (clfile.open(QIODevice::ReadOnly)) {
|
if (clfile.open(QIODevice::ReadOnly)) {
|
||||||
//Todo, write XML parser and only show the latest..
|
//Todo, write XML parser and only show the latest..
|
||||||
//QTextStream ts(&clfile);
|
//QTextStream ts(&clfile);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* SleepyHead AboutDialog Header
|
/* OSCAR AboutDialog Header
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018 Mark Watkins <mark@jedimark.net>
|
* Copyright (c) 2018 Mark Watkins <mark@jedimark.net>
|
||||||
*
|
*
|
||||||
|
@ -69,6 +69,7 @@ void Daily::setSidebarVisible(bool visible)
|
|||||||
Daily::Daily(QWidget *parent,gGraphView * shared)
|
Daily::Daily(QWidget *parent,gGraphView * shared)
|
||||||
:QWidget(parent), ui(new Ui::Daily)
|
:QWidget(parent), ui(new Ui::Daily)
|
||||||
{
|
{
|
||||||
|
qDebug() << "Creating new Daily object";
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
// Remove Incomplete Extras Tab
|
// Remove Incomplete Extras Tab
|
||||||
@ -132,8 +133,12 @@ Daily::Daily(QWidget *parent,gGraphView * shared)
|
|||||||
ui->graphMainArea->setAutoFillBackground(false);
|
ui->graphMainArea->setAutoFillBackground(false);
|
||||||
|
|
||||||
GraphView=new gGraphView(ui->graphFrame,shared);
|
GraphView=new gGraphView(ui->graphFrame,shared);
|
||||||
|
// qDebug() << "New GraphView object created in Daily";
|
||||||
|
// sleep(3);
|
||||||
GraphView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
|
GraphView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
|
||||||
|
|
||||||
|
GraphView->setEmptyImage(QPixmap(":/icons/logo.png"));
|
||||||
|
|
||||||
snapGV=new gGraphView(GraphView);
|
snapGV=new gGraphView(GraphView);
|
||||||
snapGV->setMinimumSize(172,172);
|
snapGV->setMinimumSize(172,172);
|
||||||
snapGV->hideSplitter();
|
snapGV->hideSplitter();
|
||||||
@ -196,6 +201,14 @@ Daily::Daily(QWidget *parent,gGraphView * shared)
|
|||||||
graphlist[schema::channel[code].code()] = new gGraph(schema::channel[code].code(), GraphView, schema::channel[code].label(), channelInfo(code), default_height);
|
graphlist[schema::channel[code].code()] = new gGraph(schema::channel[code].code(), GraphView, schema::channel[code].label(), channelInfo(code), default_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( p_profile == nullptr ) {
|
||||||
|
qDebug() << "In daily, p_profile is NULL";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (p_profile->general == nullptr ) {
|
||||||
|
qDebug() << "In daily, p_profile->general is NULL";
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (p_profile->general->calculateRDI()) {
|
if (p_profile->general->calculateRDI()) {
|
||||||
AHI=new gGraph("AHI", GraphView,STR_TR_RDI, channelInfo(CPAP_RDI), default_height);
|
AHI=new gGraph("AHI", GraphView,STR_TR_RDI, channelInfo(CPAP_RDI), default_height);
|
||||||
} else {
|
} else {
|
||||||
@ -406,6 +419,8 @@ Daily::Daily(QWidget *parent,gGraphView * shared)
|
|||||||
ui->weightSpinBox->setDecimals(3);
|
ui->weightSpinBox->setDecimals(3);
|
||||||
ui->weightSpinBox->setSuffix(STR_UNIT_KG);
|
ui->weightSpinBox->setSuffix(STR_UNIT_KG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GraphView->setEmptyImage(QPixmap(":/icons/logo.png"));
|
||||||
GraphView->setEmptyText(STR_Empty_NoData);
|
GraphView->setEmptyText(STR_Empty_NoData);
|
||||||
previous_date=QDate();
|
previous_date=QDate();
|
||||||
|
|
||||||
@ -418,8 +433,8 @@ Daily::Daily(QWidget *parent,gGraphView * shared)
|
|||||||
connect(GraphView, SIGNAL(updateCurrentTime(double)), this, SLOT(on_LineCursorUpdate(double)));
|
connect(GraphView, SIGNAL(updateCurrentTime(double)), this, SLOT(on_LineCursorUpdate(double)));
|
||||||
connect(GraphView, SIGNAL(updateRange(double,double)), this, SLOT(on_RangeUpdate(double,double)));
|
connect(GraphView, SIGNAL(updateRange(double,double)), this, SLOT(on_RangeUpdate(double,double)));
|
||||||
connect(GraphView, SIGNAL(GraphsChanged()), this, SLOT(updateGraphCombo()));
|
connect(GraphView, SIGNAL(GraphsChanged()), this, SLOT(updateGraphCombo()));
|
||||||
|
// qDebug() << "Finished making new Daily object";
|
||||||
GraphView->setEmptyImage(QPixmap(":/icons/logo.png"));
|
// sleep(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
Daily::~Daily()
|
Daily::~Daily()
|
||||||
@ -444,7 +459,11 @@ Daily::~Daily()
|
|||||||
|
|
||||||
void Daily::showEvent(QShowEvent *)
|
void Daily::showEvent(QShowEvent *)
|
||||||
{
|
{
|
||||||
|
// qDebug() << "Start showEvent in Daily object";
|
||||||
|
// sleep(3);
|
||||||
RedrawGraphs();
|
RedrawGraphs();
|
||||||
|
// qDebug() << "Finished showEvent Daily object";
|
||||||
|
// sleep(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Daily::doToggleSession(Session * sess)
|
void Daily::doToggleSession(Session * sess)
|
||||||
@ -522,6 +541,8 @@ void Daily::Link_clicked(const QUrl &url)
|
|||||||
|
|
||||||
void Daily::ReloadGraphs()
|
void Daily::ReloadGraphs()
|
||||||
{
|
{
|
||||||
|
// qDebug() << "Start ReloadGraphs Daily object";
|
||||||
|
// sleep(3);
|
||||||
GraphView->setDay(nullptr);
|
GraphView->setDay(nullptr);
|
||||||
|
|
||||||
ui->splitter->setVisible(true);
|
ui->splitter->setVisible(true);
|
||||||
@ -547,6 +568,8 @@ void Daily::ReloadGraphs()
|
|||||||
Load(d);
|
Load(d);
|
||||||
ui->calButton->setText(ui->calendar->selectedDate().toString(Qt::TextDate));
|
ui->calButton->setText(ui->calendar->selectedDate().toString(Qt::TextDate));
|
||||||
graphView()->redraw();
|
graphView()->redraw();
|
||||||
|
// qDebug() << "Finished ReloadGraphs in Daily object";
|
||||||
|
// sleep(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Daily::hideSpaceHogs()
|
void Daily::hideSpaceHogs()
|
||||||
@ -1578,6 +1601,8 @@ void Daily::Load(QDate date)
|
|||||||
ui->BMI->display(0);
|
ui->BMI->display(0);
|
||||||
ui->BMI->setVisible(false);
|
ui->BMI->setVisible(false);
|
||||||
ui->BMIlabel->setVisible(false);
|
ui->BMIlabel->setVisible(false);
|
||||||
|
ui->toggleGraphs->setVisible(false);
|
||||||
|
ui->toggleEvents->setVisible(false);
|
||||||
|
|
||||||
BookmarksChanged=false;
|
BookmarksChanged=false;
|
||||||
Session *journal=GetJournalSession(date);
|
Session *journal=GetJournalSession(date);
|
||||||
@ -2291,11 +2316,12 @@ void Daily::updateCube()
|
|||||||
{
|
{
|
||||||
//brick..
|
//brick..
|
||||||
if ((GraphView->visibleGraphs()==0)) {
|
if ((GraphView->visibleGraphs()==0)) {
|
||||||
ui->toggleGraphs->setArrowType(Qt::UpArrow);
|
ui->toggleGraphs->setVisible(false);
|
||||||
ui->toggleGraphs->setToolTip(tr("Show all graphs"));
|
// ui->toggleGraphs->setArrowType(Qt::UpArrow);
|
||||||
ui->toggleGraphs->blockSignals(true);
|
// ui->toggleGraphs->setToolTip(tr("Show all graphs"));
|
||||||
ui->toggleGraphs->setChecked(true);
|
// ui->toggleGraphs->blockSignals(true);
|
||||||
ui->toggleGraphs->blockSignals(false);
|
// ui->toggleGraphs->setChecked(true);
|
||||||
|
// ui->toggleGraphs->blockSignals(false);
|
||||||
|
|
||||||
if (ui->graphCombo->count() > 0) {
|
if (ui->graphCombo->count() > 0) {
|
||||||
GraphView->setEmptyText(STR_Empty_NoGraphs);
|
GraphView->setEmptyText(STR_Empty_NoGraphs);
|
||||||
@ -2312,11 +2338,12 @@ void Daily::updateCube()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ui->toggleGraphs->setArrowType(Qt::DownArrow);
|
ui->toggleGraphs->setVisible(false);
|
||||||
ui->toggleGraphs->setToolTip(tr("Hide all graphs"));
|
// ui->toggleGraphs->setArrowType(Qt::DownArrow);
|
||||||
ui->toggleGraphs->blockSignals(true);
|
// ui->toggleGraphs->setToolTip(tr("Hide all graphs"));
|
||||||
ui->toggleGraphs->setChecked(false);
|
// ui->toggleGraphs->blockSignals(true);
|
||||||
ui->toggleGraphs->blockSignals(false);
|
// ui->toggleGraphs->setChecked(false);
|
||||||
|
// ui->toggleGraphs->blockSignals(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2325,6 +2352,12 @@ void Daily::on_toggleGraphs_clicked(bool checked)
|
|||||||
{
|
{
|
||||||
QString s;
|
QString s;
|
||||||
QIcon *icon=checked ? icon_off : icon_on;
|
QIcon *icon=checked ? icon_off : icon_on;
|
||||||
|
if (ui->graphCombo == nullptr )
|
||||||
|
qDebug() << "ToggleGraphs clicked with null graphCombo ptr";
|
||||||
|
else
|
||||||
|
qDebug() << "ToggleGraphs clicked with non-null graphCombo ptr";
|
||||||
|
return;
|
||||||
|
/*
|
||||||
for (int i=0;i<ui->graphCombo->count();i++) {
|
for (int i=0;i<ui->graphCombo->count();i++) {
|
||||||
s=ui->graphCombo->itemText(i);
|
s=ui->graphCombo->itemText(i);
|
||||||
ui->graphCombo->setItemIcon(i,*icon);
|
ui->graphCombo->setItemIcon(i,*icon);
|
||||||
@ -2337,7 +2370,7 @@ void Daily::on_toggleGraphs_clicked(bool checked)
|
|||||||
updateCube();
|
updateCube();
|
||||||
GraphView->updateScale();
|
GraphView->updateScale();
|
||||||
GraphView->redraw();
|
GraphView->redraw();
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void Daily::updateGraphCombo()
|
void Daily::updateGraphCombo()
|
||||||
@ -2384,6 +2417,12 @@ void Daily::on_toggleEvents_clicked(bool checked)
|
|||||||
QString s;
|
QString s;
|
||||||
QIcon *icon=checked ? icon_on : icon_off;
|
QIcon *icon=checked ? icon_on : icon_off;
|
||||||
|
|
||||||
|
if (ui->toggleEvents == nullptr )
|
||||||
|
qDebug() << "ToggleEvents clicked with null toggleEvents ptr";
|
||||||
|
else
|
||||||
|
qDebug() << "ToggleEvents clicked with non-null toggleEvents ptr";
|
||||||
|
return;
|
||||||
|
/*
|
||||||
ui->toggleEvents->setArrowType(checked ? Qt::DownArrow : Qt::UpArrow);
|
ui->toggleEvents->setArrowType(checked ? Qt::DownArrow : Qt::UpArrow);
|
||||||
ui->toggleEvents->setToolTip(checked ? tr("Hide all events") : tr("Show all events"));
|
ui->toggleEvents->setToolTip(checked ? tr("Hide all events") : tr("Show all events"));
|
||||||
// ui->toggleEvents->blockSignals(true);
|
// ui->toggleEvents->blockSignals(true);
|
||||||
@ -2399,6 +2438,7 @@ void Daily::on_toggleEvents_clicked(bool checked)
|
|||||||
|
|
||||||
updateCube();
|
updateCube();
|
||||||
GraphView->redraw();
|
GraphView->redraw();
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
//void Daily::on_sessionWidget_itemSelectionChanged()
|
//void Daily::on_sessionWidget_itemSelectionChanged()
|
||||||
@ -2418,6 +2458,6 @@ void Daily::on_splitter_2_splitterMoved(int, int)
|
|||||||
{
|
{
|
||||||
int size = ui->splitter_2->sizes()[0];
|
int size = ui->splitter_2->sizes()[0];
|
||||||
if (size == 0) return;
|
if (size == 0) return;
|
||||||
qDebug() << "Left Panel width set to " << size;
|
// qDebug() << "Left Panel width set to " << size;
|
||||||
AppSetting->setDailyPanelWidth(size);
|
AppSetting->setDailyPanelWidth(size);
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ class MainWindow;
|
|||||||
|
|
||||||
|
|
||||||
/*! \class Daily
|
/*! \class Daily
|
||||||
\brief SleepyHead's Daily view which displays the calendar and all the graphs relative to a selected Day
|
\brief OSCAR's Daily view which displays the calendar and all the graphs relative to a selected Day
|
||||||
*/
|
*/
|
||||||
class Daily : public QWidget
|
class Daily : public QWidget
|
||||||
{
|
{
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body leftmargin=5 topmargin=10 rightmargin=5 bottommargin=5 vertical-align=center align=center style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
<body leftmargin=5 topmargin=10 rightmargin=5 bottommargin=5 vertical-align=center align=center style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||||
<p style="-qt-paragraph-type:empty; margin:0; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p>
|
<p style="-qt-paragraph-type:empty; margin:0; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p>
|
||||||
<p><span style=" font-size:20pt;">Welcome to Open Source CPAP Analysis Reporter</span></p>
|
<p><span style=" font-size:20pt;">Welcome to the Open Source CPAP Analysis Reporter</span></p>
|
||||||
<p class="centre" align=center; style="font-size:11pt;"><br /></p>
|
<p class="centre" align=center; style="font-size:11pt;"><br /></p>
|
||||||
<p>This software has been designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</p>
|
<p>This software has been designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</p>
|
||||||
<p class="centre" ><br /></p>
|
<p class="centre" ><br /></p>
|
||||||
@ -28,8 +28,8 @@
|
|||||||
<hr />
|
<hr />
|
||||||
<p>OSCAR is free (as in freedom) software, released under the <span style=" font-style:italic;">GNU Public License v3</span>, and comes with no warranty, and without ANY claims to fitness for any purpose.</p>
|
<p>OSCAR is free (as in freedom) software, released under the <span style=" font-style:italic;">GNU Public License v3</span>, and comes with no warranty, and without ANY claims to fitness for any purpose.</p>
|
||||||
<p class="centre" ><br /></p>
|
<p class="centre" ><br /></p>
|
||||||
<p>OSCAR is copyright ©2011-2018 <a href="http://jedimark.net"><span style=" text-decoration: underline; color:#0000ff;">Mark Watkins</span></a></p>
|
<p>Portions of OSCAR are ©2019 Nightowl Software and members of the apnea community as listed in the git log</p>
|
||||||
<p>and portions ©2019 Nightowl Software</p>
|
<p>OSCAR is a derivative of the SleeyHead program which is copyright ©2011-2018 Mark Watkins</p>
|
||||||
<p class="centre" style="font-size:11pt;"><br /></p>
|
<p class="centre" style="font-size:11pt;"><br /></p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<body>
|
<body>
|
||||||
<p version="1.1.1-testing-1">
|
<p>
|
||||||
|
<b>OSCAR is based on SleepyHead v1.1.0-unstable-0</b>
|
||||||
|
Which was written and copyright 2011-2018 © Mark Watkins
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
<b>Changes and fixes in OSCAR v1.0.0-beta-1</b>
|
<b>Changes and fixes in OSCAR v1.0.0-beta-1</b>
|
||||||
<list>
|
<list>
|
||||||
<li>This is a Community Release, prepared without Mark Watkin's assistance</li>
|
<li>Portions of OSCAR are © 2019 by Nightowl Software</li>
|
||||||
|
<li>and members of the apnea community</li>
|
||||||
<li>The Donation and Update features have been removed</li>
|
<li>The Donation and Update features have been removed</li>
|
||||||
<li>The Glossary, FAQ, and Wiki features are not yet implemented</li>
|
<li>The Glossary, FAQ, and Wiki features are not yet implemented</li>
|
||||||
<li>The Help Pages require Qt 5.9 to build; Qt 5.7 is the oldest supported</li>
|
<li>The Help Pages require Qt 5.9 to build; Qt 5.7 is the oldest supported</li>
|
||||||
@ -19,10 +25,5 @@
|
|||||||
</p>
|
</p>
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<p version="1.1.0-unstable-0">
|
|
||||||
<b>OSCAR is based on SleepyHead v1.1.0-unstable-0</b>
|
|
||||||
Which was written and copyright 2011-2018 © Mark Watkins
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* SleepyHead Help Header
|
/* OSCAR Help Header
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018 Mark Watkins <mark@jedimark.net>
|
* Copyright (c) 2018 Mark Watkins <mark@jedimark.net>
|
||||||
*
|
*
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* SleepyHead Logger module implementation
|
/* OSCAR Logger module implementation
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2018 Mark Watkins <mark@jedimark.net>
|
* Copyright (c) 2011-2018 Mark Watkins <mark@jedimark.net>
|
||||||
*
|
*
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* SleepyHead Main
|
/* OSCAR Main
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2018 Mark Watkins <mark@jedimark.net>
|
* Copyright (c) 2011-2018 Mark Watkins <mark@jedimark.net>
|
||||||
*
|
*
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* SleepyHead MainWindow Implementation
|
/* OSCAR MainWindow Implementation
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2018 Mark Watkins <mark@jedimark.net>
|
* Copyright (c) 2011-2018 Mark Watkins <mark@jedimark.net>
|
||||||
*
|
*
|
||||||
@ -84,6 +84,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
|
|
||||||
// Nifty Notification popups in System Tray (uses Growl on Mac)
|
// Nifty Notification popups in System Tray (uses Growl on Mac)
|
||||||
if (QSystemTrayIcon::isSystemTrayAvailable() && QSystemTrayIcon::supportsMessages()) {
|
if (QSystemTrayIcon::isSystemTrayAvailable() && QSystemTrayIcon::supportsMessages()) {
|
||||||
|
qDebug() << "Using System Tray for Menu";
|
||||||
systray = new QSystemTrayIcon(QIcon(":/icons/logo.png"), this);
|
systray = new QSystemTrayIcon(QIcon(":/icons/logo.png"), this);
|
||||||
systray->show();
|
systray->show();
|
||||||
systraymenu = new QMenu(this);
|
systraymenu = new QMenu(this);
|
||||||
@ -96,6 +97,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
systraymenu->addSeparator();
|
systraymenu->addSeparator();
|
||||||
systraymenu->addAction(tr("E&xit"), this, SLOT(close()));
|
systraymenu->addAction(tr("E&xit"), this, SLOT(close()));
|
||||||
} else { // if not available, the messages will popup in the taskbar
|
} else { // if not available, the messages will popup in the taskbar
|
||||||
|
qDebug() << "No System Tray menues";
|
||||||
systray = nullptr;
|
systray = nullptr;
|
||||||
systraymenu = nullptr;
|
systraymenu = nullptr;
|
||||||
}
|
}
|
||||||
@ -254,6 +256,7 @@ void MainWindow::closeEvent(QCloseEvent * event)
|
|||||||
DestroyGraphGlobals();
|
DestroyGraphGlobals();
|
||||||
|
|
||||||
if (systraymenu) delete systraymenu;
|
if (systraymenu) delete systraymenu;
|
||||||
|
if (systray) delete systray;
|
||||||
|
|
||||||
disconnect(logger, SIGNAL(outputLog(QString)), this, SLOT(logMessage(QString)));
|
disconnect(logger, SIGNAL(outputLog(QString)), this, SLOT(logMessage(QString)));
|
||||||
shutdownLogger();
|
shutdownLogger();
|
||||||
@ -408,8 +411,11 @@ bool MainWindow::OpenProfile(QString profileName, bool skippassword)
|
|||||||
progress->setMessage(QObject::tr("Loading profile \"%1\"...").arg(profileName));
|
progress->setMessage(QObject::tr("Loading profile \"%1\"...").arg(profileName));
|
||||||
progress->open();
|
progress->open();
|
||||||
|
|
||||||
#ifdef LOCK_RESMED_SESSIONS
|
|
||||||
QList<Machine *> machines = p_profile->GetMachines(MT_CPAP);
|
QList<Machine *> machines = p_profile->GetMachines(MT_CPAP);
|
||||||
|
if (machines.isEmpty()) {
|
||||||
|
qDebug() << "No machines in profile";
|
||||||
|
} else {
|
||||||
|
#ifdef LOCK_RESMED_SESSIONS
|
||||||
for (QList<Machine *>::iterator it = machines.begin(); it != machines.end(); ++it) {
|
for (QList<Machine *>::iterator it = machines.begin(); it != machines.end(); ++it) {
|
||||||
QString mclass=(*it)->loaderName();
|
QString mclass=(*it)->loaderName();
|
||||||
if (mclass == STR_MACH_ResMed) {
|
if (mclass == STR_MACH_ResMed) {
|
||||||
@ -428,6 +434,7 @@ bool MainWindow::OpenProfile(QString profileName, bool skippassword)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Todo: move this to AHIWIndow check to profile Load function...
|
// Todo: move this to AHIWIndow check to profile Load function...
|
||||||
if (p_profile->cpap->AHIWindow() < 30.0) {
|
if (p_profile->cpap->AHIWindow() < 30.0) {
|
||||||
@ -460,6 +467,7 @@ bool MainWindow::OpenProfile(QString profileName, bool skippassword)
|
|||||||
// Reload everything profile related
|
// Reload everything profile related
|
||||||
if (daily) {
|
if (daily) {
|
||||||
qCritical() << "OpenProfile called with active Daily object!";
|
qCritical() << "OpenProfile called with active Daily object!";
|
||||||
|
qDebug() << "Abandon opening Profile";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
welcome = new Welcome(ui->tabWidget);
|
welcome = new Welcome(ui->tabWidget);
|
||||||
@ -471,7 +479,7 @@ bool MainWindow::OpenProfile(QString profileName, bool skippassword)
|
|||||||
|
|
||||||
if (overview) {
|
if (overview) {
|
||||||
qCritical() << "OpenProfile called with active Overview object!";
|
qCritical() << "OpenProfile called with active Overview object!";
|
||||||
|
qDebug() << "Abandon opening Profile";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
overview = new Overview(ui->tabWidget, daily->graphView());
|
overview = new Overview(ui->tabWidget, daily->graphView());
|
||||||
@ -486,14 +494,19 @@ bool MainWindow::OpenProfile(QString profileName, bool skippassword)
|
|||||||
AppSetting->setProfileName(p_profile->user->userName());
|
AppSetting->setProfileName(p_profile->user->userName());
|
||||||
setWindowTitle(STR_TR_OSCAR + QString(" %1 (" + tr("Profile") + ": %2)").arg(getBranchVersion()).arg(AppSetting->profileName()));
|
setWindowTitle(STR_TR_OSCAR + QString(" %1 (" + tr("Profile") + ": %2)").arg(getBranchVersion()).arg(AppSetting->profileName()));
|
||||||
|
|
||||||
ui->oximetryButton->setDisabled(false);
|
bool noMachines = (machines.isEmpty());
|
||||||
ui->dailyButton->setDisabled(false);
|
|
||||||
ui->overviewButton->setDisabled(false);
|
|
||||||
ui->statisticsButton->setDisabled(false);
|
|
||||||
ui->importButton->setDisabled(false);
|
ui->importButton->setDisabled(false);
|
||||||
|
ui->oximetryButton->setDisabled(false);
|
||||||
|
ui->dailyButton->setDisabled(noMachines);
|
||||||
|
ui->overviewButton->setDisabled(noMachines);
|
||||||
|
ui->statisticsButton->setDisabled(noMachines);
|
||||||
|
ui->tabWidget->setTabEnabled(2, !noMachines); // daily, STR_TR_Daily);
|
||||||
|
ui->tabWidget->setTabEnabled(3, !noMachines); // overview, STR_TR_Overview);
|
||||||
|
ui->tabWidget->setTabEnabled(4, !noMachines); // overview, STR_TR_Overview);
|
||||||
|
|
||||||
progress->close();
|
progress->close();
|
||||||
delete progress;
|
delete progress;
|
||||||
|
qDebug() << "Finished opening Profile";
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1051,15 +1064,15 @@ QString MainWindow::getWelcomeHTML()
|
|||||||
tr("(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)")
|
tr("(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)")
|
||||||
+ "</p>" +
|
+ "</p>" +
|
||||||
|
|
||||||
// tr("SleepyHead's Online <a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide\">Users Guide</a><br/>")
|
// tr("OSCAR's Online <a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=OSCAR_Users_Guide\">Users Guide</a><br/>")
|
||||||
// +
|
// +
|
||||||
// tr("<a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions\">Frequently Asked Questions</a><br/>")
|
// tr("<a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions\">Frequently Asked Questions</a><br/>")
|
||||||
// +
|
// +
|
||||||
// tr("<a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary\">Glossary of Sleep Disorder Terms</a><br/>")
|
// tr("<a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary\">Glossary of Sleep Disorder Terms</a><br/>")
|
||||||
// +
|
// +
|
||||||
// tr("<a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page\">SleepyHead Wiki</a><br/>")
|
// tr("<a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page\">OSCAR Wiki</a><br/>")
|
||||||
// +
|
// +
|
||||||
// tr("SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/>")
|
// tr("OSCAR's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/>")
|
||||||
// +
|
// +
|
||||||
"<p><h3>" + tr("Further Information") + "</h3></p>"
|
"<p><h3>" + tr("Further Information") + "</h3></p>"
|
||||||
"<p>" +
|
"<p>" +
|
||||||
@ -1259,15 +1272,17 @@ void MainWindow::on_oximetryButton_clicked()
|
|||||||
void MainWindow::CheckForUpdates()
|
void MainWindow::CheckForUpdates()
|
||||||
{
|
{
|
||||||
qDebug() << "procedure <CheckForUpdates> called";
|
qDebug() << "procedure <CheckForUpdates> called";
|
||||||
|
#ifndef NO_UPDATER
|
||||||
on_actionCheck_for_Updates_triggered();
|
on_actionCheck_for_Updates_triggered();
|
||||||
|
#else
|
||||||
|
QMessageBox::information(nullptr, STR_MessageBox_Information, tr("Updates are not yet implemented"));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionCheck_for_Updates_triggered()
|
void MainWindow::on_actionCheck_for_Updates_triggered()
|
||||||
{
|
{
|
||||||
#ifdef NO_UPDATER
|
|
||||||
qDebug() << "procedure <on_actionCheck_for_Updates_triggered> called";
|
qDebug() << "procedure <on_actionCheck_for_Updates_triggered> called";
|
||||||
QMessageBox::information(nullptr, STR_MessageBox_Information, tr("Updates are not yet implemented"));
|
#ifndef NO_UPDATER
|
||||||
#else
|
|
||||||
UpdaterWindow *w = new UpdaterWindow(this);
|
UpdaterWindow *w = new UpdaterWindow(this);
|
||||||
w->checkForUpdates();
|
w->checkForUpdates();
|
||||||
#endif
|
#endif
|
||||||
@ -1436,8 +1451,8 @@ void MainWindow::on_action_CycleTabs_triggered()
|
|||||||
|
|
||||||
void MainWindow::on_actionOnline_Users_Guide_triggered()
|
void MainWindow::on_actionOnline_Users_Guide_triggered()
|
||||||
{
|
{
|
||||||
// QDesktopServices::openUrl(QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide"));
|
// QDesktopServices::openUrl(QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=OSCAR_Users_Guide"));
|
||||||
QMessageBox::information(nullptr, STR_MessageBox_Information, tr("The User's Guide is not yet implemented"));
|
QMessageBox::information(nullptr, STR_MessageBox_Information, tr("The User's Guide is not yet available"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_action_Frequently_Asked_Questions_triggered()
|
void MainWindow::on_action_Frequently_Asked_Questions_triggered()
|
||||||
@ -1830,12 +1845,11 @@ void MainWindow::on_actionRebuildCPAP(QAction *action)
|
|||||||
bool backups = (dirCount(bpath) > 0) ? true : false;
|
bool backups = (dirCount(bpath) > 0) ? true : false;
|
||||||
|
|
||||||
if (backups) {
|
if (backups) {
|
||||||
if (QMessageBox::question(this,
|
if (QMessageBox::question(this, STR_MessageBox_Question,
|
||||||
STR_MessageBox_Question,
|
|
||||||
tr("Are you sure you want to rebuild all CPAP data for the following machine:\n\n") +
|
tr("Are you sure you want to rebuild all CPAP data for the following machine:\n\n") +
|
||||||
mach->brand() + " " + mach->model() + " " +
|
mach->brand() + " " + mach->model() + " " +
|
||||||
mach->modelnumber() + " (" + mach->serial() + ")\n\n" +
|
mach->modelnumber() + " (" + mach->serial() + ")\n\n" +
|
||||||
tr("Please note, that this could result in loss of graph data if OSCAR's backups have been disabled or interfered with in any way."),
|
tr("Please note, that this could result in loss of data if OSCAR's backups have been disabled."),
|
||||||
QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
|
QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2311,6 +2325,8 @@ void MainWindow::GenerateStatistics()
|
|||||||
|
|
||||||
void MainWindow::JumpDaily()
|
void MainWindow::JumpDaily()
|
||||||
{
|
{
|
||||||
|
qDebug() << "Set current Widget to Daily";
|
||||||
|
sleep(3);
|
||||||
ui->tabWidget->setCurrentWidget(daily);
|
ui->tabWidget->setCurrentWidget(daily);
|
||||||
}
|
}
|
||||||
void MainWindow::JumpOverview()
|
void MainWindow::JumpOverview()
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* SleepyHead MainWindow Headers
|
/* OSCAR MainWindow Headers
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011-2018 Mark Watkins <mark@jedimark.net>
|
* Copyright (C) 2011-2018 Mark Watkins <mark@jedimark.net>
|
||||||
*
|
*
|
||||||
@ -34,17 +34,17 @@ class MainWindow;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*! \mainpage SleepyHead
|
/*! \mainpage OSCAR
|
||||||
|
|
||||||
\section intro_sec Introduction
|
\section intro_sec Introduction
|
||||||
|
|
||||||
OpenSource CPAP Reviewer (OSCAR) is a program derived from the SleepyHead program written by Mark Watkins.
|
Open Source CPAP Analysis Reporter (OSCAR) is a program derived from the SleepyHead program written by Mark Watkins.
|
||||||
|
|
||||||
SleepyHead is Cross-Platform Open-Source software for reviewing data from %CPAP machines, which are used in the treatment of Sleep Disorders.
|
SleepyHead was a Cross-Platform Open-Source software for reviewing data from %CPAP machines, which are used in the treatment of Sleep Disorders.
|
||||||
|
|
||||||
SleepyHead was created by <a href="http://jedimark64.blogspot.com">Mark Watkins</a> (JediMark), an Australian software developer.
|
SleepyHead was created by <a href="http://jedimark64.blogspot.com">Mark Watkins</a> (JediMark), an Australian software developer.
|
||||||
|
|
||||||
This document is an attempt to provide a little technical insight into SleepyHead's program internals.
|
This document is an attempt to provide a little technical insight into OSCAR's program internals.
|
||||||
|
|
||||||
\section project_info Further Information
|
\section project_info Further Information
|
||||||
The project was hosted on sourceforge, and it's original project page can be reached at <a href="http://sourceforge.net/projects/sleepyhead">http://sourceforge.net/projects/sleepyhead</a>.
|
The project was hosted on sourceforge, and it's original project page can be reached at <a href="http://sourceforge.net/projects/sleepyhead">http://sourceforge.net/projects/sleepyhead</a>.
|
||||||
@ -52,7 +52,7 @@ class MainWindow;
|
|||||||
There was also a <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Main_Page">SleepyHead Wiki</a> containing further information
|
There was also a <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Main_Page">SleepyHead Wiki</a> containing further information
|
||||||
|
|
||||||
\section structure Program Structure
|
\section structure Program Structure
|
||||||
SleepyHead is written in C++ using Qt Toolkit library, and comprises of 3 main components
|
OSCAR is written in C++ using Qt Toolkit library, and comprises of 3 main components
|
||||||
\list
|
\list
|
||||||
\li The SleepLib Database, a specialized database for working with multiple sources of Sleep machine data.
|
\li The SleepLib Database, a specialized database for working with multiple sources of Sleep machine data.
|
||||||
\li A custom designed, high performance and interactive OpenGL Graphing Library.
|
\li A custom designed, high performance and interactive OpenGL Graphing Library.
|
||||||
@ -77,7 +77,7 @@ class Overview;
|
|||||||
|
|
||||||
/*! \class MainWindow
|
/*! \class MainWindow
|
||||||
\author Mark Watkins
|
\author Mark Watkins
|
||||||
\brief The Main Application window for SleepyHead
|
\brief The Main Application window for OSCAR
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class MainWindow : public QMainWindow
|
class MainWindow : public QMainWindow
|
||||||
@ -106,7 +106,7 @@ class MainWindow : public QMainWindow
|
|||||||
void CloseProfile();
|
void CloseProfile();
|
||||||
bool OpenProfile(QString name, bool skippassword = false);
|
bool OpenProfile(QString name, bool skippassword = false);
|
||||||
|
|
||||||
/*! \fn Notify(QString s,int ms=5000, QString title="SleepyHead v"+VersionString());
|
/*! \fn Notify(QString s,int ms=5000, QString title="OSCAR v"+VersionString());
|
||||||
\brief Pops up a message box near the system tray
|
\brief Pops up a message box near the system tray
|
||||||
\param QString string
|
\param QString string
|
||||||
\param title
|
\param title
|
||||||
@ -131,7 +131,7 @@ class MainWindow : public QMainWindow
|
|||||||
Overview *getOverview() { return overview; }
|
Overview *getOverview() { return overview; }
|
||||||
|
|
||||||
/*! \fn void RestartApplication(bool force_login=false);
|
/*! \fn void RestartApplication(bool force_login=false);
|
||||||
\brief Closes down SleepyHead and restarts it
|
\brief Closes down OSCAR and restarts it
|
||||||
\param bool force_login
|
\param bool force_login
|
||||||
|
|
||||||
If force_login is set, it will return to the login menu even if it's set to skip
|
If force_login is set, it will return to the login menu even if it's set to skip
|
||||||
|
@ -24,7 +24,7 @@ extern MainWindow *mainwin;
|
|||||||
|
|
||||||
|
|
||||||
NewProfile::NewProfile(QWidget *parent, const QString *user) :
|
NewProfile::NewProfile(QWidget *parent, const QString *user) :
|
||||||
QDialog(parent),
|
QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint),
|
||||||
ui(new Ui::NewProfile)
|
ui(new Ui::NewProfile)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
@ -106,7 +106,7 @@ QString NewProfile::getIntroHTML()
|
|||||||
{
|
{
|
||||||
return "<html>"
|
return "<html>"
|
||||||
"<body>"
|
"<body>"
|
||||||
"<div align=center><h1>" + tr("Welcome to Open Source CPAP Reviewer") + "</h1></div>"
|
"<div align=center><h1>" + tr("Welcome to the Open Source CPAP Analysis Reporter") + "</h1></div>"
|
||||||
|
|
||||||
"<p>" + tr("This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.")
|
"<p>" + tr("This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.")
|
||||||
+ "</p>"
|
+ "</p>"
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#
|
#
|
||||||
#-------------------------------------------------
|
#-------------------------------------------------
|
||||||
|
|
||||||
|
message(Platform is $$QMAKESPEC )
|
||||||
|
|
||||||
lessThan(QT_MAJOR_VERSION,5)|lessThan(QT_MINOR_VERSION,9) {
|
lessThan(QT_MAJOR_VERSION,5)|lessThan(QT_MINOR_VERSION,9) {
|
||||||
message("You need Qt 5.9 to build OSCAR with Help Pages")
|
message("You need Qt 5.9 to build OSCAR with Help Pages")
|
||||||
DEFINES += helpless
|
DEFINES += helpless
|
||||||
@ -51,7 +53,7 @@ contains(DEFINES, STATIC) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TARGET = Oscar
|
TARGET = OSCAR
|
||||||
unix:!macx:!haiku {
|
unix:!macx:!haiku {
|
||||||
TARGET.path=/usr/bin
|
TARGET.path=/usr/bin
|
||||||
}
|
}
|
||||||
@ -63,9 +65,11 @@ gitinfotarget.depends = FORCE
|
|||||||
|
|
||||||
win32 {
|
win32 {
|
||||||
system("$$_PRO_FILE_PWD_/update_gitinfo.bat");
|
system("$$_PRO_FILE_PWD_/update_gitinfo.bat");
|
||||||
|
message("Updating gitinfo.h for Windows build")
|
||||||
gitinfotarget.commands = "$$_PRO_FILE_PWD_/update_gitinfo.bat"
|
gitinfotarget.commands = "$$_PRO_FILE_PWD_/update_gitinfo.bat"
|
||||||
} else {
|
} else {
|
||||||
system("/bin/bash $$_PRO_FILE_PWD_/update_gitinfo.sh");
|
system("/bin/bash $$_PRO_FILE_PWD_/update_gitinfo.sh");
|
||||||
|
message("Updating gitinfo.h for non-Windows build")
|
||||||
gitinfotarget.commands = "/bin/bash $$_PRO_FILE_PWD_/update_gitinfo.sh"
|
gitinfotarget.commands = "/bin/bash $$_PRO_FILE_PWD_/update_gitinfo.sh"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,12 +86,12 @@ QMAKE_EXTRA_TARGETS += gitinfotarget
|
|||||||
message("Finished generating help files");
|
message("Finished generating help files");
|
||||||
}
|
}
|
||||||
|
|
||||||
QMAKE_TARGET_PRODUCT = Oscar
|
QMAKE_TARGET_PRODUCT = OSCAR
|
||||||
QMAKE_TARGET_COMPANY = Nightowl Software
|
QMAKE_TARGET_COMPANY = Nightowl Software
|
||||||
QMAKE_TARGET_COPYRIGHT = Copyright (c)2011-2018 Mark Watkins & (c) 2019 Nightowl Software
|
QMAKE_TARGET_COPYRIGHT = Copyright (c)2011-2018 Mark Watkins & (c) 2019 Nightowl Software
|
||||||
QMAKE_TARGET_DESCRIPTION = "OpenSource CPAP Analysis Reporter"
|
QMAKE_TARGET_DESCRIPTION = "OpenSource CPAP Analysis Reporter"
|
||||||
VERSION = 1.0.0
|
VERSION = 1.0.0
|
||||||
# RC_ICONS = ./icons/logo-v3.0.ico
|
RC_ICONS = ./icons/logo.ico
|
||||||
|
|
||||||
macx {
|
macx {
|
||||||
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7
|
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7
|
||||||
@ -128,6 +132,7 @@ macx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TRANSLATIONS = $$files($$PWD/../Translations/*.ts)
|
TRANSLATIONS = $$files($$PWD/../Translations/*.ts)
|
||||||
|
|
||||||
qtPrepareTool(LRELEASE, lrelease)
|
qtPrepareTool(LRELEASE, lrelease)
|
||||||
|
|
||||||
for(file, TRANSLATIONS) {
|
for(file, TRANSLATIONS) {
|
||||||
|
@ -1115,7 +1115,7 @@ void OximeterImport::setInformation()
|
|||||||
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
|
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
|
||||||
+tr("OSCAR gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.")+"</p>"
|
+tr("OSCAR gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.")+"</p>"
|
||||||
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
|
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
|
||||||
+tr("OSCAR is currently compatible with Contec CMS50D+, CMS50E, CMS50F and CMS50I serial oximeters.<br/>(Note: Direct importing from bluetooth models is <span style=\" font-weight:600;\">probaby not</span> possible yet)")+"</p>"
|
+tr("OSCAR is currently compatible with Contec CMS50D+, CMS50E, CMS50F and CMS50I serial oximeters.<br/>(Note: Direct importing from bluetooth models is <span style=\" font-weight:600;\">probably not</span> possible yet)")+"</p>"
|
||||||
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
|
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
|
||||||
+tr("You may wish to note, other companies, such as Pulox, simply rebadge Contec CMS50's under new names, such as the Pulox PO-200, PO-300, PO-400. These should also work.")+"</p>"
|
+tr("You may wish to note, other companies, such as Pulox, simply rebadge Contec CMS50's under new names, such as the Pulox PO-200, PO-300, PO-400. These should also work.")+"</p>"
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* SleepyHead Preferences Dialog Implementation
|
/* OSCAR Preferences Dialog Implementation
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2018 Mark Watkins <mark@jedimark.net>
|
* Copyright (c) 2011-2018 Mark Watkins <mark@jedimark.net>
|
||||||
*
|
*
|
||||||
@ -38,7 +38,7 @@ typedef QMessageBox::StandardButtons StandardButtons;
|
|||||||
QHash<schema::ChanType, QString> channeltype;
|
QHash<schema::ChanType, QString> channeltype;
|
||||||
|
|
||||||
PreferencesDialog::PreferencesDialog(QWidget *parent, Profile *_profile) :
|
PreferencesDialog::PreferencesDialog(QWidget *parent, Profile *_profile) :
|
||||||
QDialog(parent),
|
QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint),
|
||||||
ui(new Ui::PreferencesDialog),
|
ui(new Ui::PreferencesDialog),
|
||||||
profile(_profile)
|
profile(_profile)
|
||||||
{
|
{
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
<customwidget>
|
<customwidget>
|
||||||
<class>QWebView</class>
|
<class>QWebView</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
<header>QtWebKit/QWebView</header>
|
<header>QWebView</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
@ -653,7 +653,7 @@ QString Statistics::htmlFooter(bool showinfo)
|
|||||||
if (showinfo) {
|
if (showinfo) {
|
||||||
html += "<hr/><div align=center><font size='-1'><i>";
|
html += "<hr/><div align=center><font size='-1'><i>";
|
||||||
html += tr("This report was generated by OSCAR v%1").arg(ShortVersionString) + "<br/>"
|
html += tr("This report was generated by OSCAR v%1").arg(ShortVersionString) + "<br/>"
|
||||||
+tr("OSCAR is free open-source CPAP review software");
|
+tr("OSCAR is free open-source CPAP report software");
|
||||||
html += "</i></font></div>";
|
html += "</i></font></div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -990,7 +990,7 @@ QString Statistics::GenerateHTML()
|
|||||||
// html += QString("<tr><td align=center>") +
|
// html += QString("<tr><td align=center>") +
|
||||||
html += QString( "<p><font size=\"+3\"><br />" + tr("I can haz data?!?") + "</font></p>"+
|
html += QString( "<p><font size=\"+3\"><br />" + tr("I can haz data?!?") + "</font></p>"+
|
||||||
"<p><img src='qrc:/icons/logo.png' width=\"100\" height=\"100\"></p>"
|
"<p><img src='qrc:/icons/logo.png' width=\"100\" height=\"100\"></p>"
|
||||||
"<p><i>"+tr("Oscar has to data to report :(")+"</i></p>");
|
"<p><i>"+tr("Oscar has no data to report :(")+"</i></p>");
|
||||||
|
|
||||||
// "</table></div>";
|
// "</table></div>";
|
||||||
html += htmlFooter(havedata);
|
html += htmlFooter(havedata);
|
||||||
|
@ -45,11 +45,16 @@ void Welcome::refreshPage()
|
|||||||
ui->S9Warning->setVisible(showCardWarning);
|
ui->S9Warning->setVisible(showCardWarning);
|
||||||
|
|
||||||
if (!b) {
|
if (!b) {
|
||||||
|
qDebug() << "No machines in Profile";
|
||||||
|
// sleep(3);
|
||||||
ui->cpapIcon->setPixmap(pixmap);
|
ui->cpapIcon->setPixmap(pixmap);
|
||||||
}
|
}
|
||||||
ui->dailyButton->setEnabled(b);
|
ui->dailyButton->setEnabled(b);
|
||||||
ui->overviewButton->setEnabled(b);
|
ui->overviewButton->setEnabled(b);
|
||||||
ui->statisticsButton->setEnabled(b);
|
ui->statisticsButton->setEnabled(b);
|
||||||
|
// ui->tabWidget->setTabEnabled(2, b);
|
||||||
|
// ui->tabWidget->setTabEnabled(3, b);
|
||||||
|
// ui->tabWidget->setTabEnabled(4, b);
|
||||||
|
|
||||||
ui->cpapInfo->setHtml(GenerateCPAPHTML());
|
ui->cpapInfo->setHtml(GenerateCPAPHTML());
|
||||||
ui->oxiInfo->setHtml(GenerateOxiHTML());
|
ui->oxiInfo->setHtml(GenerateOxiHTML());
|
||||||
|
@ -125,7 +125,7 @@
|
|||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Welcome To Open Source CPAP Reviewer</string>
|
<string>Welcome to the Open Source CPAP Analysis Reporter</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
|
Loading…
Reference in New Issue
Block a user