From e6912fcf08b9349e1b88db56e872157ea64f47f6 Mon Sep 17 00:00:00 2001
From: Mark Watkins <mark@jedimark.net>
Date: Tue, 29 May 2018 13:48:59 +1000
Subject: [PATCH] Fix statistics print scaling

---
 sleepyhead/daily.h         |  10 +-
 sleepyhead/mainwindow.cpp  |  33 +-
 sleepyhead/mainwindow.ui   |   9 +-
 sleepyhead/mytextbrowser.h |  16 +
 sleepyhead/sleepyhead.pro  |   3 +-
 sleepyhead/statistics.cpp  | 691 +------------------------------------
 sleepyhead/welcome.cpp     |   4 +-
 7 files changed, 62 insertions(+), 704 deletions(-)
 create mode 100644 sleepyhead/mytextbrowser.h

diff --git a/sleepyhead/daily.h b/sleepyhead/daily.h
index 43aa3d71..82610ea2 100644
--- a/sleepyhead/daily.h
+++ b/sleepyhead/daily.h
@@ -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
     */
diff --git a/sleepyhead/mainwindow.cpp b/sleepyhead/mainwindow.cpp
index 15c91a89..ff64b909 100644
--- a/sleepyhead/mainwindow.cpp
+++ b/sleepyhead/mainwindow.cpp
@@ -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);
-        printer.setOrientation(QPrinter::Portrait);
+//        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);
             }
diff --git a/sleepyhead/mainwindow.ui b/sleepyhead/mainwindow.ui
index 03845ce2..87350c36 100644
--- a/sleepyhead/mainwindow.ui
+++ b/sleepyhead/mainwindow.ui
@@ -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>
diff --git a/sleepyhead/mytextbrowser.h b/sleepyhead/mytextbrowser.h
new file mode 100644
index 00000000..296e67a2
--- /dev/null
+++ b/sleepyhead/mytextbrowser.h
@@ -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
diff --git a/sleepyhead/sleepyhead.pro b/sleepyhead/sleepyhead.pro
index da8e584e..b6190339 100644
--- a/sleepyhead/sleepyhead.pro
+++ b/sleepyhead/sleepyhead.pro
@@ -230,7 +230,8 @@ HEADERS  += \
     SleepLib/appsettings.h \
     SleepLib/loader_plugins/edfparser.h \
     aboutdialog.h \
-    welcome.h
+    welcome.h \
+    mytextbrowser.h
 
 FORMS += \
     daily.ui \
diff --git a/sleepyhead/statistics.cpp b/sleepyhead/statistics.cpp
index 45145d6e..0f1222ee 100644
--- a/sleepyhead/statistics.cpp
+++ b/sleepyhead/statistics.cpp
@@ -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 &gt;5.0")).arg(
-                          highahi);
-
-
-            recbox += QString("<tr><td colspan=2>&nbsp;</td></tr>");
-            recbox += QString("<tr><td colspan=2 align=center><b>%1</b></td></tr>").arg(tr("Best&nbsp;%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>&nbsp;</td></tr>");
-            recbox += QString("<tr><td colspan=2 align=center><b>%1</b></td></tr>").arg(
-                          tr("Worst&nbsp;%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>&nbsp;</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&nbsp;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&nbsp;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();
 
diff --git a/sleepyhead/welcome.cpp b/sleepyhead/welcome.cpp
index 6116185a..f8ecadff 100644
--- a/sleepyhead/welcome.cpp
+++ b/sleepyhead/welcome.cpp
@@ -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/>";