mirror of
https://gitlab.com/pholy/OSCAR-code.git
synced 2025-04-05 18:50:44 +00:00
Fix statistics print scaling
This commit is contained in:
parent
13bd8dfad9
commit
e6912fcf08
@ -28,6 +28,7 @@
|
||||
#include "Graphs/gGraphView.h"
|
||||
#include "Graphs/gLineChart.h"
|
||||
#include "sessionbar.h"
|
||||
#include "mytextbrowser.h"
|
||||
|
||||
namespace Ui {
|
||||
class Daily;
|
||||
@ -36,15 +37,6 @@ namespace Ui {
|
||||
class MainWindow;
|
||||
|
||||
|
||||
class MyTextBrowser:public QTextBrowser
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MyTextBrowser(QWidget * parent):QTextBrowser(parent) {}
|
||||
virtual ~MyTextBrowser() {}
|
||||
virtual QVariant loadResource(int type, const QUrl &url) Q_DECL_OVERRIDE;
|
||||
};
|
||||
|
||||
/*! \class Daily
|
||||
\brief SleepyHead's Daily view which displays the calendar and all the graphs relative to a selected Day
|
||||
*/
|
||||
|
@ -431,7 +431,7 @@ void MainWindow::OpenProfile(QString profileName)
|
||||
for (QList<Machine *>::iterator it = machines.begin(); it != machines.end(); ++it) {
|
||||
QString mclass=(*it)->loaderName();
|
||||
if (mclass == STR_MACH_ResMed) {
|
||||
qDebug() << "ResMed machine found.. dumbing down SleepyHead to suit it's dodgy summary system";
|
||||
qDebug() << "ResMed machine found.. locking SleepyHead preferences to suit it's summary system";
|
||||
|
||||
// Have to sacrifice these features to get access to summary data.
|
||||
p_profile->session->setCombineCloseSessions(0);
|
||||
@ -1383,16 +1383,43 @@ void MainWindow::on_actionPrint_Report_triggered()
|
||||
printer.setOutputFileName(filename);
|
||||
#endif
|
||||
printer.setPrintRange(QPrinter::AllPages);
|
||||
// if (ui->tabWidget->currentWidget() == ui->statisticsTab) {
|
||||
// printer.setOrientation(QPrinter::Landscape);
|
||||
// } else {
|
||||
printer.setOrientation(QPrinter::Portrait);
|
||||
//}
|
||||
printer.setFullPage(false); // This has nothing to do with scaling
|
||||
printer.setNumCopies(1);
|
||||
printer.setResolution(1200);
|
||||
//printer.setPaperSize(QPrinter::A4);
|
||||
//printer.setOutputFormat(QPrinter::PdfFormat);
|
||||
printer.setPageMargins(5, 5, 5, 5, QPrinter::Millimeter);
|
||||
QPrintDialog pdlg(&printer, this);
|
||||
|
||||
if (pdlg.exec() == QPrintDialog::Accepted) {
|
||||
|
||||
if (ui->tabWidget->currentWidget() == ui->statisticsTab) {
|
||||
ui->statisticsView->print(&printer);
|
||||
|
||||
QTextBrowser b;
|
||||
QPainter painter;
|
||||
painter.begin(&printer);
|
||||
|
||||
QRect rect = printer.pageRect();
|
||||
b.setHtml(ui->statisticsView->toHtml());
|
||||
b.resize(rect.width()/4, rect.height()/4);
|
||||
|
||||
double xscale = printer.pageRect().width()/double(b.width());
|
||||
double yscale = printer.pageRect().height()/double(b.height());
|
||||
double scale = qMin(xscale, yscale);
|
||||
painter.translate(printer.paperRect().x() + printer.pageRect().width()/2, printer.paperRect().y() + printer.pageRect().height()/2);
|
||||
painter.scale(scale, scale);
|
||||
painter.translate(-b.width()/2, -b.height()/2);
|
||||
//painter.translate(-printer.pageRect().width()/2, -printer.pageRect().height()/2);
|
||||
|
||||
b.render(&painter, QPoint(0,0));
|
||||
painter.end();
|
||||
|
||||
|
||||
} else if (ui->tabWidget->currentWidget() == ui->helpTab) {
|
||||
ui->helpBrowser->print(&printer);
|
||||
}
|
||||
|
@ -958,7 +958,7 @@
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="statisticsView"/>
|
||||
<widget class="MyTextBrowser" name="statisticsView"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_3">
|
||||
@ -3403,6 +3403,13 @@ p, li { white-space: pre-wrap; }
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>MyTextBrowser</class>
|
||||
<extends>QTextBrowser</extends>
|
||||
<header>mytextbrowser.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="Resources.qrc"/>
|
||||
</resources>
|
||||
|
16
sleepyhead/mytextbrowser.h
Normal file
16
sleepyhead/mytextbrowser.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef MYTEXTBROWSER_H
|
||||
#define MYTEXTBROWSER_H
|
||||
|
||||
#include <QTextBrowser>
|
||||
|
||||
class MyTextBrowser:public QTextBrowser
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MyTextBrowser(QWidget * parent):QTextBrowser(parent) {}
|
||||
virtual ~MyTextBrowser() {}
|
||||
virtual QVariant loadResource(int type, const QUrl &url) Q_DECL_OVERRIDE;
|
||||
};
|
||||
|
||||
|
||||
#endif // MYTEXTBROWSER_H
|
@ -230,7 +230,8 @@ HEADERS += \
|
||||
SleepLib/appsettings.h \
|
||||
SleepLib/loader_plugins/edfparser.h \
|
||||
aboutdialog.h \
|
||||
welcome.h
|
||||
welcome.h \
|
||||
mytextbrowser.h
|
||||
|
||||
FORMS += \
|
||||
daily.ui \
|
||||
|
@ -639,7 +639,7 @@ QString htmlHeader(bool showheader)
|
||||
+resizeHTMLPixmap(bobPixmap,64,64)+"<br/>"
|
||||
"<font size='+3'>" + STR_TR_SleepyHead + "</font><br/>"
|
||||
"<font size='+2'>" + QObject::tr("Usage Statistics") + "</font><br/>"
|
||||
"<font size='+1'>" + QObject::tr("(NOT approved for compliance reporting purposes)")+"<br/>";
|
||||
"<font size='+1' title=\""+QObject::tr("This is for legal reasons. Sorry, not sorry. Without manufacturer support and documentation, SleepyHead is unsuitable as a compliance/medical reporting tool.")+"\">" + QObject::tr("(NOT approved for compliance or medical reporting purposes)")+"</font><br/>";
|
||||
|
||||
if (!userinfo.isEmpty()) html += "<br/>"+userinfo+"<br/>";
|
||||
html += "</div><br/>";
|
||||
@ -756,190 +756,6 @@ struct RXChange {
|
||||
short highlight;
|
||||
};
|
||||
|
||||
//enum RXSortMode { RX_first, RX_last, RX_days, RX_ahi, RX_mode, RX_min, RX_max, RX_ps, RX_pshi, RX_maxipap, RX_per1, RX_per2, RX_weighted };
|
||||
//RXSortMode RXsort = RX_first;
|
||||
//bool RXorder = false;
|
||||
|
||||
/*bool operator<(const RXChange &c1, const RXChange &c2)
|
||||
{
|
||||
const RXChange *comp1 = &c1;
|
||||
const RXChange *comp2 = &c2;
|
||||
|
||||
if (RXorder) {
|
||||
switch (RXsort) {
|
||||
case RX_ahi:
|
||||
return comp1->ahi < comp2->ahi;
|
||||
|
||||
case RX_days:
|
||||
return comp1->days < comp2->days;
|
||||
|
||||
case RX_first:
|
||||
return comp1->first < comp2->first;
|
||||
|
||||
case RX_last:
|
||||
return comp1->last < comp2->last;
|
||||
|
||||
case RX_mode:
|
||||
return comp1->mode < comp2->mode;
|
||||
|
||||
case RX_min:
|
||||
return comp1->min < comp2->min;
|
||||
|
||||
case RX_max:
|
||||
return comp1->max < comp2->max;
|
||||
|
||||
case RX_ps:
|
||||
return comp1->ps < comp2->ps;
|
||||
|
||||
case RX_pshi:
|
||||
return comp1->pshi < comp2->pshi;
|
||||
|
||||
case RX_maxipap:
|
||||
return comp1->maxipap < comp2->maxipap;
|
||||
|
||||
case RX_per1:
|
||||
return comp1->per1 < comp2->per1;
|
||||
|
||||
case RX_per2:
|
||||
return comp1->per2 < comp2->per2;
|
||||
|
||||
case RX_weighted:
|
||||
return comp1->weighted < comp2->weighted;
|
||||
};
|
||||
} else {
|
||||
switch (RXsort) {
|
||||
case RX_ahi:
|
||||
return comp1->ahi > comp2->ahi;
|
||||
|
||||
case RX_days:
|
||||
return comp1->days > comp2->days;
|
||||
|
||||
case RX_first:
|
||||
return comp1->first > comp2->first;
|
||||
|
||||
case RX_last:
|
||||
return comp1->last > comp2->last;
|
||||
|
||||
case RX_mode:
|
||||
return comp1->mode > comp2->mode;
|
||||
|
||||
case RX_min:
|
||||
return comp1->min > comp2->min;
|
||||
|
||||
case RX_max:
|
||||
return comp1->max > comp2->max;
|
||||
|
||||
case RX_ps:
|
||||
return comp1->ps > comp2->ps;
|
||||
|
||||
case RX_pshi:
|
||||
return comp1->pshi > comp2->pshi;
|
||||
|
||||
case RX_maxipap:
|
||||
return comp1->maxipap > comp2->maxipap;
|
||||
|
||||
case RX_per1:
|
||||
return comp1->per1 > comp2->per1;
|
||||
|
||||
case RX_per2:
|
||||
return comp1->per2 > comp2->per2;
|
||||
|
||||
case RX_weighted:
|
||||
return comp1->weighted > comp2->weighted;
|
||||
};
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RXSort(const RXChange *comp1, const RXChange *comp2)
|
||||
{
|
||||
if (RXorder) {
|
||||
switch (RXsort) {
|
||||
case RX_ahi:
|
||||
return comp1->ahi < comp2->ahi;
|
||||
|
||||
case RX_days:
|
||||
return comp1->days < comp2->days;
|
||||
|
||||
case RX_first:
|
||||
return comp1->first < comp2->first;
|
||||
|
||||
case RX_last:
|
||||
return comp1->last < comp2->last;
|
||||
|
||||
case RX_mode:
|
||||
return comp1->mode < comp2->mode;
|
||||
|
||||
case RX_min:
|
||||
return comp1->min < comp2->min;
|
||||
|
||||
case RX_max:
|
||||
return comp1->max < comp2->max;
|
||||
|
||||
case RX_ps:
|
||||
return comp1->ps < comp2->ps;
|
||||
|
||||
case RX_pshi:
|
||||
return comp1->pshi < comp2->pshi;
|
||||
|
||||
case RX_maxipap:
|
||||
return comp1->maxipap < comp2->maxipap;
|
||||
|
||||
case RX_per1:
|
||||
return comp1->per1 < comp2->per1;
|
||||
|
||||
case RX_per2:
|
||||
return comp1->per2 < comp2->per2;
|
||||
|
||||
case RX_weighted:
|
||||
return comp1->weighted < comp2->weighted;
|
||||
};
|
||||
} else {
|
||||
switch (RXsort) {
|
||||
case RX_ahi:
|
||||
return comp1->ahi > comp2->ahi;
|
||||
|
||||
case RX_days:
|
||||
return comp1->days > comp2->days;
|
||||
|
||||
case RX_first:
|
||||
return comp1->first > comp2->first;
|
||||
|
||||
case RX_last:
|
||||
return comp1->last > comp2->last;
|
||||
|
||||
case RX_mode:
|
||||
return comp1->mode > comp2->mode;
|
||||
|
||||
case RX_min:
|
||||
return comp1->min > comp2->min;
|
||||
|
||||
case RX_max:
|
||||
return comp1->max > comp2->max;
|
||||
|
||||
case RX_ps:
|
||||
return comp1->ps > comp2->ps;
|
||||
|
||||
case RX_pshi:
|
||||
return comp1->pshi > comp2->pshi;
|
||||
|
||||
case RX_maxipap:
|
||||
return comp1->maxipap > comp2->maxipap;
|
||||
|
||||
case RX_per1:
|
||||
return comp1->per1 > comp2->per1;
|
||||
|
||||
case RX_per2:
|
||||
return comp1->per2 > comp2->per2;
|
||||
|
||||
case RX_weighted:
|
||||
return comp1->weighted > comp2->weighted;
|
||||
};
|
||||
}
|
||||
|
||||
return true;
|
||||
} */
|
||||
struct UsageData {
|
||||
UsageData() { ahi = 0; hours = 0; }
|
||||
UsageData(QDate d, EventDataType v, EventDataType h) { date = d; ahi = v; hours = h; }
|
||||
@ -957,7 +773,6 @@ bool operator <(const UsageData &c1, const UsageData &c2)
|
||||
if ((c1.ahi == c2.ahi) && (c1.date > c2.date)) { return true; }
|
||||
|
||||
return false;
|
||||
//return c1.value < c2.value;
|
||||
}
|
||||
|
||||
struct Period {
|
||||
@ -1052,9 +867,9 @@ QString Statistics::GenerateRXChanges()
|
||||
|
||||
|
||||
QString html = "<div align=center><br/>";
|
||||
html += QString("<table class=curved style=\"page-break-before:always;\" "+table_width+">");
|
||||
html += QString("<table class=curved style=\"page-break-before:always;\" "+table_width+" width=100%>");
|
||||
html += "<thead>";
|
||||
html += "<tr bgcolor='"+heading_color+"'><th colspan=10 align=center><font size=+2>" + tr("Changes to Prescription Settings") + "</font></th></tr>";
|
||||
html += "<tr bgcolor='"+heading_color+"'><th colspan=9 align=center><font size=+2>" + tr("Changes to Prescription Settings") + "</font></th></tr>";
|
||||
|
||||
// QString extratxt;
|
||||
|
||||
@ -1359,507 +1174,7 @@ QString Statistics::GenerateHTML()
|
||||
html += "</table>";
|
||||
html += "</div>";
|
||||
|
||||
/*
|
||||
QList<UsageData> AHI;
|
||||
|
||||
if (cpapdays > 0) {
|
||||
QDate first, last = lastcpap;
|
||||
CPAPMode mode = MODE_UNKNOWN, cmode = MODE_UNKNOWN;
|
||||
EventDataType cmin = 0, cmax = 0, cps = 0, cpshi = 0, cmaxipap = 0, min = 0, max = 0, maxipap = 0,
|
||||
ps = 0, pshi = 0;
|
||||
Machine *mach = nullptr, *lastmach = nullptr;
|
||||
QString last_prel_str, last_pressure_str, prel_str, pressure_str;
|
||||
QDate date = lastcpap;
|
||||
Day *day;
|
||||
bool lastchanged = false;
|
||||
QVector<RXChange> rxchange;
|
||||
EventDataType hours;
|
||||
|
||||
int compliant = 0;
|
||||
|
||||
do {
|
||||
day = p_profile->GetGoodDay(date, MT_CPAP);
|
||||
|
||||
|
||||
CPAPLoader * loader = nullptr;
|
||||
|
||||
if (day) loader = dynamic_cast<CPAPLoader *>(day->machine(MT_CPAP)->loader());
|
||||
|
||||
if (day && loader) {
|
||||
lastchanged = false;
|
||||
|
||||
hours = day->hours(MT_CPAP);
|
||||
|
||||
if (hours > p_profile->cpap->complianceHours()) {
|
||||
compliant++;
|
||||
}
|
||||
|
||||
EventDataType ahi = day->count(CPAP_Obstructive) + day->count(CPAP_Hypopnea) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway);
|
||||
|
||||
if (p_profile->general->calculateRDI()) { ahi += day->count(CPAP_RERA); }
|
||||
|
||||
ahi /= hours;
|
||||
AHI.push_back(UsageData(date, ahi, hours));
|
||||
|
||||
prel_str = day->getPressureRelief();
|
||||
pressure_str = day->getPressureSettings();
|
||||
|
||||
mode = (CPAPMode)(int)round(day->settings_wavg(CPAP_Mode));
|
||||
if (mode ==0) {
|
||||
mode = (CPAPMode)(int)round(day->settings_wavg(CPAP_Mode));
|
||||
}
|
||||
mach = day->machine(MT_CPAP);
|
||||
|
||||
min = max = ps = pshi = maxipap = 0;
|
||||
|
||||
if (mode == MODE_CPAP) {
|
||||
min = day->settings_min(CPAP_Pressure);
|
||||
} else if (mode == MODE_APAP) {
|
||||
min = day->settings_min(CPAP_PressureMin);
|
||||
max = day->settings_max(CPAP_PressureMax);
|
||||
} else if (mode == MODE_BILEVEL_FIXED) {
|
||||
min = day->settings_min(CPAP_EPAP);
|
||||
max = day->settings_max(CPAP_IPAP);
|
||||
ps = max-min;
|
||||
} else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
|
||||
min = day->settings_min(CPAP_EPAPLo);
|
||||
maxipap = max = day->settings_max(CPAP_IPAPHi);
|
||||
ps = day->settings_min(CPAP_PS);
|
||||
} else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { // Similar pressure control as ASV Variable EPAP
|
||||
min = day->settings_min(CPAP_EPAPLo);
|
||||
max = day->settings_min(CPAP_EPAPHi);
|
||||
ps = day->settings_min(CPAP_PSMin);
|
||||
pshi = day->settings_max(CPAP_PSMax);
|
||||
maxipap = max = day->settings_max(CPAP_IPAPHi);
|
||||
} else if (mode == MODE_ASV) {
|
||||
min = day->settings_min(CPAP_EPAP);
|
||||
ps = day->settings_min(CPAP_PSMin);
|
||||
pshi = day->settings_max(CPAP_PSMax);
|
||||
maxipap = min+pshi;
|
||||
} else if (mode == MODE_ASV_VARIABLE_EPAP) {
|
||||
min = day->settings_min(CPAP_EPAPLo);
|
||||
max = day->settings_max(CPAP_EPAPHi);
|
||||
ps = day->settings_min(CPAP_PSMin);
|
||||
pshi = day->settings_max(CPAP_PSMax);
|
||||
maxipap = max + pshi;
|
||||
|
||||
}
|
||||
|
||||
if (lastmach == nullptr) {
|
||||
lastmach = mach;
|
||||
cmode = mode;
|
||||
last_pressure_str = pressure_str;
|
||||
last_prel_str = prel_str;
|
||||
|
||||
}
|
||||
|
||||
if ((mode != cmode) || (pressure_str != last_pressure_str) || (prel_str != last_prel_str) || (mach != lastmach)) {
|
||||
first = date.addDays(1);
|
||||
int days = p_profile->countDays(MT_CPAP, first, last);
|
||||
RXChange rx;
|
||||
rx.first = first;
|
||||
rx.last = last;
|
||||
rx.days = days;
|
||||
rx.ahi = calcAHI(first, last);
|
||||
rx.fl = calcFL(first, last);
|
||||
rx.mode = cmode;
|
||||
rx.pressure_string = last_pressure_str;
|
||||
rx.pr_relief_string = last_prel_str;
|
||||
rx.min = cmin;
|
||||
rx.max = cmax;
|
||||
rx.ps = cps;
|
||||
rx.pshi = cpshi;
|
||||
rx.maxipap = cmaxipap;
|
||||
rx.machine = lastmach;
|
||||
rx.per1 = 0;
|
||||
rx.per2 = 0;
|
||||
|
||||
if (mode == MODE_APAP) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_Pressure, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = 0;
|
||||
} else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = p_profile->calcPercentile(CPAP_IPAP, percentile, MT_CPAP, first, last);
|
||||
} else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
|
||||
} else if (mode == MODE_ASV) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
|
||||
} else if (mode == MODE_ASV_VARIABLE_EPAP) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
|
||||
}
|
||||
|
||||
rx.weighted = float(rx.days) / float(cpapdays) * rx.ahi;
|
||||
rxchange.push_back(rx);
|
||||
|
||||
cmode = mode;
|
||||
cmin = min;
|
||||
cmax = max;
|
||||
cps = ps;
|
||||
cpshi = pshi;
|
||||
cmaxipap = maxipap;
|
||||
last_prel_str = prel_str;
|
||||
last_pressure_str = pressure_str;
|
||||
last = date;
|
||||
lastmach = mach;
|
||||
lastchanged = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
date = date.addDays(-1);
|
||||
} while (date >= firstcpap);
|
||||
|
||||
// Sort list by AHI
|
||||
qSort(AHI);
|
||||
|
||||
lastchanged = false;
|
||||
|
||||
// Add the final entry
|
||||
if (!lastchanged && (mach != nullptr)) {
|
||||
// last=date.addDays(1);
|
||||
first = firstcpap;
|
||||
int days = p_profile->countDays(MT_CPAP, first, last);
|
||||
RXChange rx;
|
||||
rx.first = first;
|
||||
rx.last = last;
|
||||
rx.days = days;
|
||||
rx.ahi = calcAHI(first, last);
|
||||
rx.fl = calcFL(first, last);
|
||||
rx.mode = mode;
|
||||
rx.min = min;
|
||||
rx.max = max;
|
||||
rx.ps = ps;
|
||||
rx.pshi = pshi;
|
||||
rx.maxipap = maxipap;
|
||||
rx.machine = mach;
|
||||
rx.pressure_string = pressure_str;
|
||||
rx.pr_relief_string = prel_str;
|
||||
|
||||
// Todo: Clean up by Calculating this crap later..
|
||||
if (mode == MODE_APAP) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_Pressure, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = 0;
|
||||
} else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = p_profile->calcPercentile(CPAP_IPAP, percentile, MT_CPAP, first, last);
|
||||
} else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
|
||||
} else if (mode == MODE_ASV) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
|
||||
} else if (mode == MODE_ASV_VARIABLE_EPAP) {
|
||||
rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
|
||||
rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
|
||||
}
|
||||
|
||||
rx.weighted = float(rx.days) / float(cpapdays);
|
||||
//rx.weighted=float(days)*rx.ahi;
|
||||
rxchange.push_back(rx);
|
||||
}
|
||||
|
||||
int rxthresh = 5;
|
||||
QVector<RXChange *> tmpRX;
|
||||
|
||||
for (int i = 0; i < rxchange.size(); i++) {
|
||||
RXChange &rx = rxchange[i];
|
||||
|
||||
if (rx.days >= rxthresh) {
|
||||
tmpRX.push_back(&rx);
|
||||
}
|
||||
}
|
||||
|
||||
QString recbox = "<html><head><style type='text/css'>"
|
||||
"p,a,td,body { font-family: '" + QApplication::font().family() + "'; }"
|
||||
"p,a,td,body { font-size: " + QString::number(QApplication::font().pointSize() + 2) + "px; }"
|
||||
"a:link,a:visited { color: inherit; text-decoration: none; }" //font-weight: normal;
|
||||
"a:hover { background-color: inherit; color: white; text-decoration:none; font-weight: bold; }"
|
||||
"</style></head><body>";
|
||||
recbox += "<table width=100% cellpadding=1 cellspacing=0>";
|
||||
int numdays = AHI.size();
|
||||
|
||||
if (numdays > 1) {
|
||||
int z = numdays / 2;
|
||||
|
||||
if (z > 4) { z = 4; }
|
||||
|
||||
recbox += QString("<tr><td colspan=2 align=center><b>%1</b></td></tr>").arg(
|
||||
tr("Usage Information"));
|
||||
recbox += QString("<tr><td>%1</td><td align=right>%2</td></tr>").arg(tr("Total Days")).arg(
|
||||
numdays);
|
||||
|
||||
if (p_profile->cpap->showComplianceInfo()) {
|
||||
recbox += QString("<tr><td>%1</td><td align=right>%2</td></tr>").arg(tr("Compliant Days")).arg(
|
||||
compliant);
|
||||
}
|
||||
|
||||
int highahi = 0;
|
||||
|
||||
for (int i = 0; i < numdays; i++) {
|
||||
if (AHI.at(i).ahi > 5.0) {
|
||||
highahi++;
|
||||
}
|
||||
}
|
||||
|
||||
recbox += QString("<tr><td>%1</td><td align=right>%2</td></tr>").arg(tr("Days AHI >5.0")).arg(
|
||||
highahi);
|
||||
|
||||
|
||||
recbox += QString("<tr><td colspan=2> </td></tr>");
|
||||
recbox += QString("<tr><td colspan=2 align=center><b>%1</b></td></tr>").arg(tr("Best %1").arg(
|
||||
ahitxt));
|
||||
|
||||
for (int i = 0; i < z; i++) {
|
||||
const UsageData &a = AHI.at(i);
|
||||
recbox += QString("<tr><td><a href='daily=%1'>%2</a></td><td align=right>%3</td></tr>")
|
||||
.arg(a.date.toString(Qt::ISODate))
|
||||
.arg(a.date.toString(Qt::SystemLocaleShortDate))
|
||||
.arg(a.ahi, 0, 'f', decimals);
|
||||
}
|
||||
|
||||
recbox += QString("<tr><td colspan=2> </td></tr>");
|
||||
recbox += QString("<tr><td colspan=2 align=center><b>%1</b></td></tr>").arg(
|
||||
tr("Worst %1").arg(ahitxt));
|
||||
|
||||
for (int i = 0; i < z; i++) {
|
||||
const UsageData &a = AHI.at((numdays - 1) - i);
|
||||
recbox += QString("<tr><td><a href='daily=%1'>%2</a></td><td align=right>%3</td></tr>")
|
||||
.arg(a.date.toString(Qt::ISODate))
|
||||
.arg(a.date.toString(Qt::SystemLocaleShortDate))
|
||||
.arg(a.ahi, 0, 'f', decimals);
|
||||
}
|
||||
|
||||
recbox += QString("<tr><td colspan=2> </td></tr>");
|
||||
}
|
||||
|
||||
|
||||
if (tmpRX.size() > 0) {
|
||||
RXsort = RX_ahi;
|
||||
qSort(tmpRX.begin(), tmpRX.end(), RXSort);
|
||||
tmpRX[0]->highlight = 4; // worst
|
||||
int ls = tmpRX.size() - 1;
|
||||
tmpRX[ls]->highlight = 1; //best
|
||||
QString modestr;
|
||||
|
||||
QString idxstr[2];
|
||||
int idx[2];
|
||||
idx[0]=ls;
|
||||
idx[1]=0;
|
||||
idxstr[0]=tr("Best RX Setting");
|
||||
idxstr[1]=tr("Worst RX Setting");
|
||||
|
||||
for (int i=0; i<2; ++i ) {
|
||||
int i2 = idx[i];
|
||||
if ((i==1) && (ls == 0)) break;
|
||||
CPAPMode mode = (CPAPMode)(int)p_profile->calcSettingsMax(CPAP_Mode, MT_CPAP, tmpRX[i2]->first, tmpRX[i2]->last);
|
||||
|
||||
if (mode == MODE_CPAP) {
|
||||
modestr = STR_TR_CPAP;
|
||||
} else if (mode == MODE_APAP) { // is AUTO?
|
||||
modestr = STR_TR_APAP;
|
||||
} else if (mode == MODE_BILEVEL_FIXED) {
|
||||
modestr = STR_TR_BiLevel;
|
||||
} else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
|
||||
modestr = QObject::tr("Auto Bi-Level");
|
||||
} else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
|
||||
modestr = QObject::tr("Auto Bi-Level");
|
||||
} else if (mode == MODE_ASV) {
|
||||
modestr = QObject::tr("ASV Fixed EPAP");
|
||||
} else if (mode == MODE_ASV_VARIABLE_EPAP) {
|
||||
modestr = QObject::tr("ASV Auto EPAP");
|
||||
} else modestr = STR_TR_Unknown;
|
||||
|
||||
|
||||
recbox += QString("<tr><td colspan=2><table width=100% border=0 cellpadding=1 cellspacing=0><tr><td colspan=2 align=center><b>%3</b></td></tr>")
|
||||
.arg(idxstr[i]);
|
||||
recbox += QString("<tr><td valign=top>") + STR_TR_Start + "<br/>" + STR_TR_End +
|
||||
QString("</td><td align=right><a href='overview=%1,%2'>%3<br/>%4</a></td></tr>")
|
||||
.arg(tmpRX[i2]->first.toString(Qt::ISODate))
|
||||
.arg(tmpRX[i2]->last.toString(Qt::ISODate))
|
||||
.arg(tmpRX[i2]->first.toString(Qt::SystemLocaleShortDate))
|
||||
.arg(tmpRX[i2]->last.toString(Qt::SystemLocaleShortDate));
|
||||
recbox += QString("<tr><td><b>%1</b></td><td align=right><b>%2</b></td></tr>").arg(ahitxt).arg(tmpRX[i2]->ahi, 0, 'f', decimals);
|
||||
recbox += QString("<tr><td>%1</td><td align=right>%2</td></tr>").arg(STR_TR_Mode).arg(modestr);
|
||||
if (mode == MODE_CPAP) {
|
||||
recbox += QString("<tr><td>")+QObject::tr("Fixed")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
} else if (mode == MODE_APAP) {
|
||||
recbox += QString("<tr><td>")+QObject::tr("Min")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
recbox += QString("<tr><td>")+QObject::tr("Max")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
} else if (mode == MODE_BILEVEL_FIXED) {
|
||||
recbox += QString("<tr><td>")+QObject::tr("EPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
recbox += QString("<tr><td>")+QObject::tr("IPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
} else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
|
||||
recbox += QString("<tr><td>")+QObject::tr("Min EPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
recbox += QString("<tr><td>")+QObject::tr("Max IPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
recbox += QString("<tr><td>")+QObject::tr("PS")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->ps, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
} else if (mode == MODE_ASV) {
|
||||
recbox += QString("<tr><td>")+QObject::tr("EPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
recbox += QString("<tr><td>")+QObject::tr("PS")+QString("</td><td align=right>%1-%2%3</td></tr>").arg(tmpRX[i2]->ps, 0, 'f', 1).arg(tmpRX[i2]->pshi, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
// recbox += QString("<tr><td>")+QObject::tr("Max IPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->maxipap, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
} else if (mode == MODE_ASV_VARIABLE_EPAP) {
|
||||
recbox += QString("<tr><td>")+QObject::tr("EPAP")+QString("</td><td align=right>%1-%2%3</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
recbox += QString("<tr><td>")+QObject::tr("PS")+QString("</td><td align=right>%1-%2%3</td></tr>").arg(tmpRX[i2]->ps, 0, 'f', 1).arg(tmpRX[i2]->pshi, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
// recbox += QString("<tr><td>")+QObject::tr("Max IPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->maxipap, 0, 'f', 1).arg(STR_UNIT_CMH2O);
|
||||
}
|
||||
recbox += "</table><br/></td></tr>";
|
||||
}
|
||||
}
|
||||
|
||||
recbox += "</table>";
|
||||
recbox += "</body></html>";
|
||||
mainwin->setRecBoxHTML(recbox); */
|
||||
|
||||
/*RXsort=RX_min;
|
||||
RXorder=true;
|
||||
qSort(rxchange.begin(),rxchange.end());*/
|
||||
|
||||
/* html += "<div align=center><br/>";
|
||||
html += QString("<table class=curved style=\"page-break-before:always;\" "+table_width+">");
|
||||
html += "<thead>";
|
||||
html += "<tr bgcolor='"+heading_color+"'><th colspan=10 align=center><font size=+2>" + tr("Changes to Prescription Settings") + "</font></th></tr>";
|
||||
|
||||
QString extratxt;
|
||||
|
||||
QString tooltip;
|
||||
QStringList hdrlist;
|
||||
hdrlist.push_back(STR_TR_First);
|
||||
hdrlist.push_back(STR_TR_Last);
|
||||
hdrlist.push_back(tr("Days"));
|
||||
hdrlist.push_back(ahitxt);
|
||||
hdrlist.push_back(STR_TR_FL);
|
||||
if (p_profile->hasChannel(CPAP_SensAwake)) {
|
||||
hdrlist.push_back(STR_TR_SA);
|
||||
}
|
||||
hdrlist.push_back(STR_TR_Machine);
|
||||
hdrlist.push_back(tr("Pressure Relief"));
|
||||
hdrlist.push_back(STR_TR_Mode);
|
||||
hdrlist.push_back(tr("Pressure Settings"));
|
||||
|
||||
html+="<tr>\n";
|
||||
for (int i=0; i < hdrlist.size(); ++i) {
|
||||
html+=QString(" <th align=left><b>%1</b></th>\n").arg(hdrlist.at(i));
|
||||
}
|
||||
html+="</tr>\n";
|
||||
html += "</thead>";
|
||||
html += "<tfoot>";
|
||||
html += "<tr><td colspan=10 align=center>";
|
||||
html += QString("<i>") +
|
||||
tr("Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.").
|
||||
arg(rxthresh) + QString("</i><br/>");
|
||||
|
||||
html += "</td></tr>";
|
||||
html += "</tfoot>";
|
||||
|
||||
|
||||
for (int i = 0; i < rxchange.size(); i++) {
|
||||
RXChange rx = rxchange.at(i);
|
||||
QString color;
|
||||
|
||||
if (rx.highlight == 1) {
|
||||
color = "#c0ffc0";
|
||||
} else if (rx.highlight == 2) {
|
||||
color = "#e0ffe0";
|
||||
} else if (rx.highlight == 3) {
|
||||
color = "#ffe0e0";
|
||||
} else if (rx.highlight == 4) {
|
||||
color = "#ffc0c0";
|
||||
} else { color = ""; }
|
||||
|
||||
QString machstr;
|
||||
|
||||
if (!rx.machine->brand().isEmpty()) {
|
||||
machstr += rx.machine->brand();
|
||||
}
|
||||
|
||||
if (!rx.machine->model().isEmpty()) {
|
||||
machstr += " " + rx.machine->model();
|
||||
}
|
||||
|
||||
if (!rx.machine->serial().isEmpty()) {
|
||||
machstr += " (" + rx.machine->serial() + ")<br/>";
|
||||
}
|
||||
|
||||
mode = rx.mode;
|
||||
extratxt = "<table border=0 width=100%><tr>"; //cellpadding=0 cellspacing=0
|
||||
|
||||
// tooltip=QString("%1 %2% ").arg(machstr).arg(percentile*100.0)+STR_TR_EPAP+
|
||||
// QString("=%1<br/>%2% ").arg(rx.per1,0,'f',decimals).arg(percentile*100.0)+
|
||||
// STR_TR_IPAP+QString("=%1").arg(rx.per2,0,'f',decimals);
|
||||
tooltip = QString("%1").arg(machstr);
|
||||
|
||||
extratxt += "<td colspan=2>"+rx.pressure_string+"</td>";
|
||||
// if (mode == MODE_CPAP) {
|
||||
// extratxt += "<td colspan=2>"+QString(tr("Fixed %1 %2")+"</td>").arg(rx.min, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
|
||||
// } else if (mode == MODE_APAP) {
|
||||
// extratxt += "<td colspan=2>"+QString(tr("%1 - %2 %3")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
|
||||
// } else if (mode == MODE_BILEVEL_FIXED) {
|
||||
// extratxt += "<td colspan=2>"+QString(tr("EPAP %1 %3 IPAP %2 %3")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
|
||||
// } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
|
||||
// extratxt += "<td colspan=2>"+QString(tr("PS %4 over %1 - %2 %3")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units()).arg(rx.ps, 4, 'f', 1);
|
||||
// } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
|
||||
// extratxt += "<td colspan=2>"+QString(tr("EPAP %1-%2, PS %3-%4 %5")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(rx.ps, 4, 'f', 1).arg(rx.pshi, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
|
||||
// } else if (mode == MODE_ASV) {
|
||||
// extratxt += "<td colspan=2>"+QString(tr("EPAP %1, PS %2-%3 %4")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.ps, 4, 'f', 1).arg(rx.pshi, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
|
||||
// tooltip = QString("%1 %2% ").arg(machstr).arg(percentile * 100.0) +
|
||||
// STR_TR_EPAP +
|
||||
// QString("=%1<br/>%2% ").arg(rx.per1, 0, 'f', decimals)
|
||||
// .arg(percentile * 100.0)
|
||||
// + STR_TR_IPAP + QString("=%1").arg(rx.per2, 0, 'f', decimals);
|
||||
// } else if (mode == MODE_ASV_VARIABLE_EPAP) {
|
||||
// extratxt += "<td colspan=2>"+QString(tr("EPAP %1-%2, PS %3-%4 %5")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(rx.ps, 4, 'f', 1).arg(rx.pshi, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
|
||||
// tooltip = QString("%1 %2% ").arg(machstr).arg(percentile * 100.0) +
|
||||
// STR_TR_EPAP +
|
||||
// QString("=%1<br/>%2% ").arg(rx.per1, 0, 'f', decimals)
|
||||
// .arg(percentile * 100.0)
|
||||
// + STR_TR_IPAP + QString("=%1").arg(rx.per2, 0, 'f', decimals);
|
||||
// } else {
|
||||
// extratxt += "";
|
||||
// tooltip = "";
|
||||
// }
|
||||
|
||||
extratxt += "</tr></table>";
|
||||
|
||||
QString tooltipshow, tooltiphide;
|
||||
|
||||
if (!tooltip.isEmpty()) {
|
||||
tooltipshow = QString("tooltip.show(\"%1\");").arg(tooltip);
|
||||
tooltiphide = "tooltip.hide();";
|
||||
}
|
||||
|
||||
QString datarowclass;
|
||||
if (rx.highlight == 0) datarowclass="class=datarow";
|
||||
html += QString("<tr %6 bgcolor='%1' onmouseover='ChangeColor(this, \"#eeeeee\"); %2' onmouseout='ChangeColor(this, \"%1\"); %3' onclick='alert(\"overview=%4,%5\");'>")
|
||||
.arg(color)
|
||||
.arg(tooltipshow)
|
||||
.arg(tooltiphide)
|
||||
.arg(rx.first.toString(Qt::ISODate))
|
||||
.arg(rx.last.toString(Qt::ISODate))
|
||||
.arg(datarowclass);
|
||||
|
||||
|
||||
html += QString("<td>%1</td>").arg(rx.first.toString(Qt::SystemLocaleShortDate));
|
||||
html += QString("<td>%1</td>").arg(rx.last.toString(Qt::SystemLocaleShortDate));
|
||||
html += QString("<td>%1</td>").arg(rx.days);
|
||||
html += QString("<td>%1</td>").arg(rx.ahi, 0, 'f', decimals);
|
||||
html += QString("<td>%1</td>").arg(rx.fl, 0, 'f', decimals); // Not the best way to do this.. Todo: Add an extra field for data..
|
||||
|
||||
if (p_profile->hasChannel(CPAP_SensAwake)) {
|
||||
html += QString("<td>%1</td>").arg(calcSA(rx.first, rx.last), 0, 'f', decimals);
|
||||
}
|
||||
html += QString("<td>%1</td>").arg(rx.machine->loaderName());
|
||||
html += QString("<td>%1</td>").arg(rx.pr_relief_string);
|
||||
html += QString("<td>%1</td>").arg(schema::channel[CPAP_Mode].option(int(rx.mode)));
|
||||
html += QString("<td>%1</td>").arg(extratxt);
|
||||
html += "</tr>";
|
||||
}
|
||||
|
||||
html += "</table>";
|
||||
html += "</div>";
|
||||
|
||||
} */
|
||||
html += GenerateRXChanges();
|
||||
html += GenerateMachineList();
|
||||
|
||||
|
@ -178,7 +178,7 @@ QString Welcome::GenerateCPAPHTML()
|
||||
comp = equal;
|
||||
}
|
||||
|
||||
html += tr("You had an AHI of %1, which is <b>%2</b> your %3 day average of %4.").arg(ahi,0,'f',2).arg(comp).arg(averagedays).arg(ahidays,0,'f',2);
|
||||
html += tr("You had an AHI of %1, which is %2 your %3 day average of %4.").arg(ahi,0,'f',2).arg(comp).arg(averagedays).arg(ahidays,0,'f',2);
|
||||
|
||||
html += "<br/>";
|
||||
|
||||
@ -230,7 +230,7 @@ QString Welcome::GenerateCPAPHTML()
|
||||
comp = equal;
|
||||
}
|
||||
|
||||
html += tr("Your average leaks were %1 %2, which is <b>%3</b> your %4 day average of %5.").arg(leak,0,'f',2).arg(schema::channel[CPAP_Leak].units()).arg(comp).arg(averagedays).arg(leakdays,0,'f',2);
|
||||
html += tr("Your average leaks were %1 %2, which is %3 your %4 day average of %5.").arg(leak,0,'f',2).arg(schema::channel[CPAP_Leak].units()).arg(comp).arg(averagedays).arg(leakdays,0,'f',2);
|
||||
|
||||
html += "<br/>";
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user