2011-06-28 15:25:20 +00:00
/*
2011-06-26 08:30:44 +00:00
Daily Panel
Copyright ( c ) 2011 Mark Watkins < jedimark @ users . sourceforge . net >
License : GPL
2011-06-28 15:25:20 +00:00
*/
2011-06-26 08:30:44 +00:00
# include "daily.h"
# include "ui_daily.h"
# include <QTextCharFormat>
# include <QTextBlock>
# include <QColorDialog>
2011-07-28 11:09:53 +00:00
# include <QSpacerItem>
2011-06-26 08:30:44 +00:00
# include <QBuffer>
# include <QPixmap>
2011-07-27 09:21:53 +00:00
# include <QMessageBox>
2011-07-28 11:09:53 +00:00
# include <QResizeEvent>
2011-06-26 08:30:44 +00:00
# include "SleepLib/session.h"
# include "Graphs/graphdata_custom.h"
# include "Graphs/gLineOverlay.h"
# include "Graphs/gFlagsLine.h"
# include "Graphs/gFooBar.h"
# include "Graphs/gXAxis.h"
# include "Graphs/gYAxis.h"
# include "Graphs/gCandleStick.h"
# include "Graphs/gBarChart.h"
2011-06-28 15:25:20 +00:00
# include "Graphs/gpiechart.h"
2011-06-26 08:30:44 +00:00
2011-07-28 13:49:03 +00:00
const int min_height = 100 ;
2011-07-28 12:13:28 +00:00
const int default_height = 150 ;
2011-07-22 13:46:17 +00:00
Daily : : Daily ( QWidget * parent , QGLWidget * shared ) :
2011-06-26 08:30:44 +00:00
QWidget ( parent ) ,
ui ( new Ui : : Daily )
{
ui - > setupUi ( this ) ;
QString prof = pref [ " Profile " ] . toString ( ) ;
profile = Profiles : : Get ( prof ) ;
if ( ! profile ) {
2011-07-27 09:21:53 +00:00
QMessageBox : : critical ( this , " Profile Error " , QString ( " Couldn't get profile '%1'.. Have to abort! " ) . arg ( pref [ " Profile " ] . toString ( ) ) ) ;
exit ( - 1 ) ;
2011-06-26 08:30:44 +00:00
}
gSplitter = new QSplitter ( Qt : : Vertical , ui - > scrollArea ) ;
2011-07-28 12:13:28 +00:00
gSplitter - > setStyleSheet ( " QSplitter::handle { background-color: 'light grey'; } " ) ;
2011-07-28 13:56:45 +00:00
gSplitter - > setHandleWidth ( 3 ) ;
2011-07-28 12:13:28 +00:00
ui - > scrollArea - > setVerticalScrollBarPolicy ( Qt : : ScrollBarAlwaysOn ) ;
ui - > scrollArea - > setHorizontalScrollBarPolicy ( Qt : : ScrollBarAlwaysOff ) ;
2011-07-28 11:09:53 +00:00
ui - > scrollArea - > setWidget ( gSplitter ) ;
//ui->graphSizer->addWidget(gSplitter);
ui - > scrollArea - > setAutoFillBackground ( false ) ;
gSplitter - > setAutoFillBackground ( false ) ;
ui - > scrollArea - > setWidgetResizable ( true ) ;
2011-07-28 12:13:28 +00:00
//gSplitter->setMinimumHeight(1600);
2011-07-28 11:09:53 +00:00
//gSplitter->setMinimumWidth(600);
2011-06-26 08:30:44 +00:00
2011-07-27 09:21:53 +00:00
SF = new gGraphWindow ( gSplitter , tr ( " Event Flags " ) , shared ) ;
2011-07-22 13:46:17 +00:00
FRW = new gGraphWindow ( gSplitter , tr ( " Flow Rate " ) , SF ) ;
PRD = new gGraphWindow ( gSplitter , tr ( " Pressure " ) , SF ) ;
LEAK = new gGraphWindow ( gSplitter , tr ( " Leaks " ) , SF ) ;
MP = new gGraphWindow ( gSplitter , tr ( " Mask Pressure " ) , SF ) ;
SNORE = new gGraphWindow ( gSplitter , tr ( " Snore " ) , SF ) ;
FLG = new gGraphWindow ( gSplitter , tr ( " Flow Limitation " ) , SF ) ;
MV = new gGraphWindow ( gSplitter , tr ( " Minute Ventilation " ) , SF ) ;
TV = new gGraphWindow ( gSplitter , tr ( " Tidal Volume " ) , SF ) ;
RR = new gGraphWindow ( gSplitter , tr ( " Respiratory Rate " ) , SF ) ;
PTB = new gGraphWindow ( gSplitter , tr ( " Patient Trig Breaths " ) , SF ) ;
PULSE = new gGraphWindow ( gSplitter , tr ( " Pulse & SpO2 " ) , SF ) ;
2011-07-27 09:21:53 +00:00
TAP = new gGraphWindow ( NULL , " " , ( QGLWidget * ) NULL ) ;
TAP_EAP = new gGraphWindow ( NULL , " " , ( QGLWidget * ) NULL ) ;
TAP_IAP = new gGraphWindow ( NULL , " " , ( QGLWidget * ) NULL ) ;
G_AHI = new gGraphWindow ( NULL , " " , ( QGLWidget * ) NULL ) ;
2011-07-22 13:46:17 +00:00
/*QGLFormat fmt;
fmt . setDepth ( false ) ;
fmt . setDirectRendering ( false ) ;
fmt . setAlpha ( true ) ;
fmt . setDoubleBuffer ( false ) ;
fmt . setRgba ( true ) ;
//fmt.setDefaultFormat(fmt);
offscreen_context = new QGLContext ( fmt ) ; */
2011-06-26 08:30:44 +00:00
SF - > SetLeftMargin ( SF - > GetLeftMargin ( ) + gYAxis : : Margin ) ;
SF - > SetBlockZoom ( true ) ;
SF - > AddLayer ( new gXAxis ( ) ) ;
2011-07-28 13:49:03 +00:00
SF - > setMinimumHeight ( min_height ) ;
2011-06-28 09:19:35 +00:00
2011-07-22 13:46:17 +00:00
fg = new gFlagsGroup ( ) ;
2011-07-27 15:28:46 +00:00
fg - > AddLayer ( new gFlagsLine ( CPAP_CSR , QColor ( " light green " ) , " CSR " , false , FT_Span ) ) ;
2011-07-27 09:21:53 +00:00
fg - > AddLayer ( new gFlagsLine ( CPAP_ClearAirway , QColor ( " purple " ) , " CA " , true ) ) ;
fg - > AddLayer ( new gFlagsLine ( CPAP_Obstructive , QColor ( " #40c0ff " ) , " OA " , true ) ) ;
fg - > AddLayer ( new gFlagsLine ( CPAP_Hypopnea , QColor ( " blue " ) , " H " , true ) ) ;
fg - > AddLayer ( new gFlagsLine ( CPAP_FlowLimit , QColor ( " black " ) , " FL " ) ) ;
fg - > AddLayer ( new gFlagsLine ( CPAP_RERA , QColor ( " gold " ) , " RE " ) ) ;
fg - > AddLayer ( new gFlagsLine ( CPAP_VSnore , QColor ( " red " ) , " VS " ) ) ;
//fg->AddLayer(AddCPAP(new gFlagsLine(flags[8],QColor("dark green"),"U0E"));
fg - > AddLayer ( new gFlagsLine ( CPAP_Apnea , QColor ( " dark green " ) , " A " ) ) ;
//fg->AddLayer(AddCPAP(new gFlagsLine(flags[10],QColor("red"),"VS2"));
SF - > AddLayer ( AddCPAP ( fg ) ) ;
2011-07-22 13:46:17 +00:00
// SF Foobar must go last
2011-06-27 07:45:59 +00:00
SF - > AddLayer ( new gFooBar ( 10 , QColor ( " orange " ) , QColor ( " dark grey " ) , true ) ) ;
2011-06-26 08:30:44 +00:00
2011-07-10 16:20:51 +00:00
2011-06-26 08:30:44 +00:00
PRD - > AddLayer ( new gXAxis ( ) ) ;
PRD - > AddLayer ( new gYAxis ( ) ) ;
2011-06-28 09:19:35 +00:00
//PRD->AddLayer(new gFooBar());
2011-07-10 14:23:07 +00:00
bool square = true ;
2011-07-27 09:21:53 +00:00
PRD - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_Pressure , QColor ( " dark green " ) , square ) ) ) ;
PRD - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_EAP , Qt : : blue , square ) ) ) ;
PRD - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_IAP , Qt : : red , square ) ) ) ;
2011-07-28 13:49:03 +00:00
PRD - > setMinimumHeight ( min_height ) ;
2011-06-26 08:30:44 +00:00
2011-06-27 10:23:24 +00:00
LEAK - > AddLayer ( new gXAxis ( ) ) ;
LEAK - > AddLayer ( new gYAxis ( ) ) ;
2011-06-28 09:19:35 +00:00
//LEAK->AddLayer(new gFooBar());
2011-07-27 09:21:53 +00:00
LEAK - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_Leak , QColor ( " purple " ) , true ) ) ) ;
2011-06-27 10:23:24 +00:00
2011-07-28 13:49:03 +00:00
LEAK - > setMinimumHeight ( min_height ) ;
2011-06-27 10:23:24 +00:00
2011-06-26 08:30:44 +00:00
2011-07-27 09:21:53 +00:00
MP - > AddLayer ( new gYAxis ( ) ) ;
2011-07-10 17:49:02 +00:00
MP - > AddLayer ( new gXAxis ( ) ) ;
2011-07-27 09:21:53 +00:00
gLineChart * g = new gLineChart ( CPAP_MaskPressure , Qt : : blue , false ) ;
AddCPAP ( g ) ;
2011-07-10 17:49:02 +00:00
g - > ReportEmpty ( true ) ;
MP - > AddLayer ( g ) ;
2011-07-28 13:49:03 +00:00
MP - > setMinimumHeight ( min_height ) ;
2011-07-10 17:49:02 +00:00
2011-06-28 09:19:35 +00:00
//FRW->AddLayer(new gFooBar());
2011-06-27 10:23:24 +00:00
FRW - > AddLayer ( new gYAxis ( ) ) ;
FRW - > AddLayer ( new gXAxis ( ) ) ;
2011-07-27 15:28:46 +00:00
FRW - > AddLayer ( AddCPAP ( new gLineOverlayBar ( CPAP_CSR , QColor ( " light green " ) , " CSR " , FT_Span ) ) ) ;
2011-07-27 09:21:53 +00:00
g = new gLineChart ( CPAP_FlowRate , Qt : : black , false ) ;
2011-06-26 08:30:44 +00:00
g - > ReportEmpty ( true ) ;
2011-07-27 09:21:53 +00:00
AddCPAP ( g ) ;
2011-06-26 08:30:44 +00:00
FRW - > AddLayer ( g ) ;
2011-07-27 09:21:53 +00:00
FRW - > AddLayer ( AddCPAP ( new gLineOverlayBar ( CPAP_Hypopnea , QColor ( " blue " ) , " H " ) ) ) ;
2011-07-27 15:28:46 +00:00
FRW - > AddLayer ( AddCPAP ( new gLineOverlayBar ( PRS1_PressurePulse , QColor ( " red " ) , " PR " , FT_Dot ) ) ) ;
2011-07-27 09:21:53 +00:00
FRW - > AddLayer ( AddCPAP ( new gLineOverlayBar ( CPAP_RERA , QColor ( " gold " ) , " RE " ) ) ) ;
//FRW->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_Unknown0E,QColor("dark green"),"U0E")));
FRW - > AddLayer ( AddCPAP ( new gLineOverlayBar ( CPAP_VSnore , QColor ( " red " ) , " VS " ) ) ) ;
FRW - > AddLayer ( AddCPAP ( new gLineOverlayBar ( CPAP_FlowLimit , QColor ( " black " ) , " FL " ) ) ) ;
FRW - > AddLayer ( AddCPAP ( new gLineOverlayBar ( CPAP_Obstructive , QColor ( " #40c0ff " ) , " OA " ) ) ) ;
FRW - > AddLayer ( AddCPAP ( new gLineOverlayBar ( CPAP_ClearAirway , QColor ( " purple " ) , " CA " ) ) ) ;
2011-07-28 13:49:03 +00:00
FRW - > setMinimumHeight ( min_height ) ;
2011-07-27 09:21:53 +00:00
2011-06-26 08:30:44 +00:00
SNORE - > AddLayer ( new gXAxis ( ) ) ;
SNORE - > AddLayer ( new gYAxis ( ) ) ;
2011-07-27 09:21:53 +00:00
SNORE - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_Snore , Qt : : black , true ) ) ) ;
2011-07-28 13:49:03 +00:00
SNORE - > setMinimumHeight ( min_height ) ;
2011-06-26 08:30:44 +00:00
2011-06-30 12:07:11 +00:00
FLG - > AddLayer ( new gXAxis ( ) ) ;
FLG - > AddLayer ( new gYAxis ( ) ) ;
2011-07-27 09:21:53 +00:00
FLG - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_FlowLimitGraph , Qt : : black , true ) ) ) ;
2011-07-28 13:49:03 +00:00
FLG - > setMinimumHeight ( min_height ) ;
2011-06-30 12:07:11 +00:00
2011-06-30 04:55:20 +00:00
MV - > AddLayer ( new gXAxis ( ) ) ;
MV - > AddLayer ( new gYAxis ( ) ) ;
2011-07-27 09:21:53 +00:00
MV - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_MinuteVentilation , QColor ( 0x20 , 0x20 , 0x7f ) , true ) ) ) ;
2011-07-28 13:49:03 +00:00
MV - > setMinimumHeight ( min_height ) ;
2011-06-30 04:55:20 +00:00
TV - > AddLayer ( new gXAxis ( ) ) ;
TV - > AddLayer ( new gYAxis ( ) ) ;
2011-07-27 09:21:53 +00:00
TV - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_TidalVolume , QColor ( 0x7f , 0x20 , 0x20 ) , true ) ) ) ;
2011-07-28 13:49:03 +00:00
TV - > setMinimumHeight ( min_height ) ;
2011-06-30 04:55:20 +00:00
RR - > AddLayer ( new gXAxis ( ) ) ;
RR - > AddLayer ( new gYAxis ( ) ) ;
2011-07-27 09:21:53 +00:00
RR - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_RespiratoryRate , Qt : : gray , true ) ) ) ;
2011-07-28 13:49:03 +00:00
RR - > setMinimumHeight ( min_height ) ;
2011-06-30 04:55:20 +00:00
2011-07-12 12:43:10 +00:00
PTB - > AddLayer ( new gXAxis ( ) ) ;
PTB - > AddLayer ( new gYAxis ( ) ) ;
2011-07-27 09:21:53 +00:00
PTB - > AddLayer ( AddCPAP ( new gLineChart ( CPAP_PatientTriggeredBreaths , Qt : : gray , true ) ) ) ;
2011-07-28 13:49:03 +00:00
PTB - > setMinimumHeight ( min_height ) ;
2011-07-12 12:43:10 +00:00
2011-06-26 08:30:44 +00:00
PULSE - > AddLayer ( new gXAxis ( ) ) ;
PULSE - > AddLayer ( new gYAxis ( ) ) ;
2011-06-28 09:19:35 +00:00
// PULSE->AddLayer(new gFooBar());
2011-07-27 09:21:53 +00:00
PULSE - > AddLayer ( AddOXI ( new gLineChart ( OXI_Pulse , Qt : : red , true ) ) ) ;
2011-06-26 08:30:44 +00:00
2011-07-28 13:49:03 +00:00
PULSE - > setMinimumHeight ( min_height ) ;
2011-06-26 08:30:44 +00:00
2011-07-04 11:37:26 +00:00
// SPO2=new gGraphWindow(gSplitter,tr("SpO2"),SF);
2011-06-30 07:27:04 +00:00
// SPO2->AddLayer(new gXAxis());
// SPO2->AddLayer(new gYAxis());
2011-06-28 09:19:35 +00:00
// SPO2->AddLayer(new gFooBar());
2011-07-27 09:21:53 +00:00
PULSE - > AddLayer ( AddOXI ( new gLineChart ( OXI_SPO2 , Qt : : blue , true ) ) ) ;
2011-07-28 13:49:03 +00:00
// SPO2->setMinimumHeight(min_height);
2011-06-30 07:27:04 +00:00
// SPO2->LinkZoom(PULSE);
// PULSE->LinkZoom(SPO2);
// SPO2->hide();
2011-06-26 08:30:44 +00:00
PULSE - > hide ( ) ;
2011-07-27 09:21:53 +00:00
//AddCPAPData(tap_eap=new TAPData(CPAP_EAP));
//AddCPAPData(tap_iap=new TAPData(CPAP_IAP));
//AddCPAPData(tap=new TAPData(CPAP_Pressure));
2011-06-26 08:30:44 +00:00
//TAP->SetMargins(20,15,5,50);
2011-07-27 09:21:53 +00:00
//TAP->SetMargins(0,0,0,0);
//TAP->AddLayer(new gCandleStick(tap));
2011-06-28 15:25:20 +00:00
//TAP->AddLayer(new gPieChart(tap));
2011-06-26 08:30:44 +00:00
2011-07-27 09:21:53 +00:00
//TAP_EAP->SetMargins(0,0,0,0);
//TAP_EAP->AddLayer(new gCandleStick(tap_eap));
2011-06-26 08:30:44 +00:00
2011-07-27 09:21:53 +00:00
//TAP_IAP->SetMargins(0,0,0,0);
//TAP_IAP->AddLayer(new gCandleStick(tap_iap));
2011-06-26 08:30:44 +00:00
2011-07-22 13:46:17 +00:00
2011-07-28 07:32:02 +00:00
G_AHI - > SetMargins ( 0 , 0 , 0 , 0 ) ;
gPieChart * l = new gPieChart ( Qt : : black ) ;
l - > AddSlice ( CPAP_Hypopnea , QColor ( 0x40 , 0x40 , 0xff , 0xff ) , " H " ) ;
l - > AddSlice ( CPAP_Obstructive , QColor ( 0x40 , 0xaf , 0xbf , 0xff ) , " OA " ) ;
l - > AddSlice ( CPAP_ClearAirway , QColor ( 0xb2 , 0x54 , 0xcd , 0xff ) , " CA " ) ;
l - > AddSlice ( CPAP_RERA , QColor ( 0xff , 0xff , 0x80 , 0xff ) , " RE " ) ;
l - > AddSlice ( CPAP_FlowLimit , QColor ( 0x40 , 0x40 , 0x40 , 0xff ) , " FL " ) ;
2011-07-28 13:56:45 +00:00
G_AHI - > AddLayer ( AddCPAP ( l ) ) ;
2011-06-29 04:53:18 +00:00
G_AHI - > SetGradientBackground ( false ) ;
2011-07-22 13:46:17 +00:00
2011-06-26 08:30:44 +00:00
//G_AHI->setMaximumSize(2000,30);
//TAP->setMaximumSize(2000,30);
2011-07-27 09:21:53 +00:00
G_AHI - > hide ( ) ;
2011-07-28 07:32:02 +00:00
/*TAP->hide();
2011-07-27 09:21:53 +00:00
TAP_IAP - > hide ( ) ;
TAP_EAP - > hide ( ) ; */
2011-07-17 07:03:26 +00:00
NoData = new QLabel ( tr ( " No data " ) , gSplitter ) ;
2011-06-26 08:30:44 +00:00
NoData - > setAlignment ( Qt : : AlignCenter ) ;
2011-06-27 15:00:00 +00:00
QFont font ( " FreeSans " , 20 ) ; //NoData->font();
2011-06-26 08:30:44 +00:00
//font.setBold(true);
NoData - > setFont ( font ) ;
NoData - > hide ( ) ;
gSplitter - > addWidget ( NoData ) ;
2011-07-28 11:09:53 +00:00
int i = gSplitter - > indexOf ( NoData ) ;
gSplitter - > setStretchFactor ( i , 1 ) ;
2011-07-15 13:07:12 +00:00
gGraphWindow * graphs [ ] = { SF , FRW , MP , MV , TV , PTB , RR , PRD , LEAK , FLG , SNORE } ;
int ss = sizeof ( graphs ) / sizeof ( gGraphWindow * ) ;
for ( int i = 0 ; i < ss ; i + + ) {
AddGraph ( graphs [ i ] ) ;
2011-07-28 11:09:53 +00:00
int j = gSplitter - > indexOf ( graphs [ i ] ) ;
2011-07-28 13:49:03 +00:00
gSplitter - > setStretchFactor ( j , 10 ) ;
2011-07-15 13:07:12 +00:00
for ( int j = 0 ; j < ss ; j + + ) {
if ( graphs [ i ] ! = graphs [ j ] )
graphs [ i ] - > LinkZoom ( graphs [ j ] ) ;
}
}
2011-07-28 13:49:03 +00:00
2011-07-04 11:37:26 +00:00
AddGraph ( PULSE ) ;
2011-07-28 13:49:03 +00:00
2011-07-15 13:07:12 +00:00
// AddGraph(SPO2);
2011-07-28 12:13:28 +00:00
spacer = new QWidget ( gSplitter ) ;
2011-07-28 13:49:03 +00:00
//spacer->setMaximumHeight(default_height);
2011-07-28 12:13:28 +00:00
gSplitter - > addWidget ( spacer ) ;
i = gSplitter - > indexOf ( spacer ) ;
gSplitter - > setStretchFactor ( i , 1 ) ;
2011-07-28 13:49:03 +00:00
i = gSplitter - > indexOf ( FRW ) ;
gSplitter - > setStretchFactor ( i , 15 ) ;
2011-06-26 08:30:44 +00:00
2011-07-28 14:20:59 +00:00
2011-07-28 11:09:53 +00:00
//gSplitter->refresh();
2011-06-28 15:25:20 +00:00
2011-07-28 11:29:35 +00:00
gSplitter - > setChildrenCollapsible ( false ) ; // We set this per widget..
//gSplitter->setCollapsible(gSplitter->indexOf(SF),false);
2011-07-28 11:09:53 +00:00
//gSplitter->setStretchFactor(gSplitter->indexOf(SF),0);
2011-07-23 07:56:13 +00:00
2011-07-28 11:09:53 +00:00
gSplitter - > layout ( ) ;
2011-06-26 08:30:44 +00:00
2011-07-28 14:20:59 +00:00
splitter_sizes = gSplitter - > sizes ( ) ;
2011-06-26 08:30:44 +00:00
QTextCharFormat format = ui - > calendar - > weekdayTextFormat ( Qt : : Saturday ) ;
format . setForeground ( QBrush ( Qt : : black , Qt : : SolidPattern ) ) ;
ui - > calendar - > setWeekdayTextFormat ( Qt : : Saturday , format ) ;
ui - > calendar - > setWeekdayTextFormat ( Qt : : Sunday , format ) ;
2011-06-28 01:51:21 +00:00
ui - > tabWidget - > setCurrentWidget ( ui - > details ) ;
2011-06-26 08:30:44 +00:00
}
Daily : : ~ Daily ( )
{
// Save any last minute changes..
if ( previous_date . isValid ( ) )
Unload ( previous_date ) ;
delete gSplitter ;
delete ui ;
}
2011-07-04 11:37:26 +00:00
void Daily : : AddGraph ( gGraphWindow * w )
{
Graphs . push_back ( w ) ;
gSplitter - > addWidget ( w ) ;
w - > SetSplitter ( gSplitter ) ;
}
2011-07-28 11:09:53 +00:00
void Daily : : resizeEvent ( QResizeEvent * event )
{
2011-07-28 12:13:28 +00:00
//const QSize &size=event->size();
// gSplitter->setMinimumWidth(size.width()-280);
2011-07-28 11:09:53 +00:00
}
2011-07-04 11:37:26 +00:00
2011-06-26 08:30:44 +00:00
void Daily : : ReloadGraphs ( )
{
QDate d = profile - > LastDay ( ) ;
if ( ! d . isValid ( ) ) {
d = ui - > calendar - > selectedDate ( ) ;
}
on_calendar_currentPageChanged ( d . year ( ) , d . month ( ) ) ;
ui - > calendar - > setSelectedDate ( d ) ;
Load ( d ) ;
}
void Daily : : on_calendar_currentPageChanged ( int year , int month )
{
QDate d ( year , month , 1 ) ;
int dom = d . daysInMonth ( ) ;
for ( int i = 1 ; i < = dom ; i + + ) {
d = QDate ( year , month , i ) ;
this - > UpdateCalendarDay ( d ) ;
}
}
void Daily : : UpdateEventsTree ( QTreeWidget * tree , Day * day )
{
tree - > clear ( ) ;
2011-06-27 10:55:55 +00:00
if ( ! day ) return ;
2011-07-27 09:53:29 +00:00
//return;
2011-06-26 08:30:44 +00:00
tree - > setColumnCount ( 1 ) ; // 1 visible common.. (1 hidden)
QTreeWidgetItem * root = NULL ; //new QTreeWidgetItem((QTreeWidget *)0,QStringList("Stuff"));
map < MachineCode , QTreeWidgetItem * > mcroot ;
map < MachineCode , int > mccnt ;
2011-07-05 05:33:06 +00:00
int total_events = 0 ;
2011-06-26 08:30:44 +00:00
2011-07-27 09:21:53 +00:00
2011-06-26 08:30:44 +00:00
for ( vector < Session * > : : iterator s = day - > begin ( ) ; s ! = day - > end ( ) ; s + + ) {
2011-07-27 09:21:53 +00:00
map < MachineCode , vector < EventList * > > : : iterator m ;
2011-06-26 08:30:44 +00:00
2011-07-01 10:10:44 +00:00
//QTreeWidgetItem * sroot;
2011-06-26 08:30:44 +00:00
2011-07-27 09:21:53 +00:00
for ( m = ( * s ) - > eventlist . begin ( ) ; m ! = ( * s ) - > eventlist . end ( ) ; m + + ) {
2011-06-26 08:30:44 +00:00
MachineCode code = m - > first ;
2011-07-27 09:53:29 +00:00
if ( ( code ! = CPAP_Obstructive )
& & ( code ! = CPAP_Hypopnea )
& & ( code ! = CPAP_Apnea )
& & ( code ! = CPAP_ClearAirway )
& & ( code ! = CPAP_CSR )
& & ( code ! = CPAP_RERA )
& & ( code ! = CPAP_FlowLimit )
& & ( code ! = PRS1_PressurePulse )
& & ( code ! = CPAP_VSnore ) ) continue ;
2011-06-26 08:30:44 +00:00
QTreeWidgetItem * mcr ;
if ( mcroot . find ( code ) = = mcroot . end ( ) ) {
2011-07-05 05:33:06 +00:00
int cnt = day - > count ( code ) ;
total_events + = cnt ;
2011-06-26 08:30:44 +00:00
QString st = DefaultMCLongNames [ m - > first ] ;
if ( st . isEmpty ( ) ) {
2011-07-05 05:33:06 +00:00
st = " Fixme " + QString : : number ( ( int ) code ) ;
2011-06-26 08:30:44 +00:00
}
2011-07-05 05:33:06 +00:00
st + = " ( " + QString : : number ( cnt ) + " ) " ;
2011-06-26 08:30:44 +00:00
QStringList l ( st ) ;
l . append ( " " ) ;
mcroot [ code ] = mcr = new QTreeWidgetItem ( root , l ) ;
mccnt [ code ] = 0 ;
} else {
mcr = mcroot [ code ] ;
}
2011-07-27 09:21:53 +00:00
for ( unsigned z = 0 ; z < m - > second . size ( ) ; z + + ) {
for ( int o = 0 ; o < m - > second [ z ] - > count ( ) ; o + + ) {
qint64 t = m - > second [ z ] - > time ( o ) ;
if ( code = = CPAP_CSR ) {
t - = ( m - > second [ z ] - > data ( o ) / 2 ) * 1000 ;
}
QStringList a ;
QDateTime d = QDateTime : : fromMSecsSinceEpoch ( t ) ;
QString s = QString ( " #%1: %2 " ) . arg ( ( int ) mccnt [ code ] , ( int ) 3 , ( int ) 10 , QChar ( ' 0 ' ) ) . arg ( d . toString ( " HH:mm:ss " ) ) ;
a . append ( s ) ;
a . append ( d . toString ( " yyyy-MM-dd HH:mm:ss " ) ) ;
mcr - > addChild ( new QTreeWidgetItem ( a ) ) ;
2011-06-26 08:30:44 +00:00
}
2011-07-28 12:13:28 +00:00
} }
2011-06-26 08:30:44 +00:00
}
int cnt = 0 ;
for ( map < MachineCode , QTreeWidgetItem * > : : iterator m = mcroot . begin ( ) ; m ! = mcroot . end ( ) ; m + + ) {
tree - > insertTopLevelItem ( cnt + + , m - > second ) ;
}
2011-07-05 05:33:06 +00:00
//tree->insertTopLevelItem(cnt++,new QTreeWidgetItem(QStringList("[Total Events ("+QString::number(total_events)+")]")));
2011-06-26 08:30:44 +00:00
tree - > sortByColumn ( 0 , Qt : : AscendingOrder ) ;
//tree->expandAll();
}
void Daily : : UpdateCalendarDay ( QDate date )
{
QTextCharFormat bold ;
QTextCharFormat cpapcol ;
QTextCharFormat normal ;
2011-07-03 12:08:30 +00:00
QTextCharFormat oxiday ;
2011-06-26 08:30:44 +00:00
bold . setFontWeight ( QFont : : Bold ) ;
cpapcol . setForeground ( QBrush ( Qt : : blue , Qt : : SolidPattern ) ) ;
cpapcol . setFontWeight ( QFont : : Bold ) ;
2011-07-03 12:08:30 +00:00
oxiday . setForeground ( QBrush ( Qt : : red , Qt : : SolidPattern ) ) ;
oxiday . setFontWeight ( QFont : : Bold ) ;
bool hascpap = profile - > GetDay ( date , MT_CPAP ) ! = NULL ;
bool hasoxi = profile - > GetDay ( date , MT_OXIMETER ) ! = NULL ;
if ( hascpap ) {
if ( hasoxi ) {
ui - > calendar - > setDateTextFormat ( date , oxiday ) ;
} else {
ui - > calendar - > setDateTextFormat ( date , cpapcol ) ;
}
2011-06-26 08:30:44 +00:00
} else if ( profile - > GetDay ( date ) ) {
ui - > calendar - > setDateTextFormat ( date , bold ) ;
} else {
ui - > calendar - > setDateTextFormat ( date , normal ) ;
}
ui - > calendar - > setHorizontalHeaderFormat ( QCalendarWidget : : ShortDayNames ) ;
}
void Daily : : on_calendar_selectionChanged ( )
{
if ( previous_date . isValid ( ) )
Unload ( previous_date ) ;
Load ( ui - > calendar - > selectedDate ( ) ) ;
}
2011-07-28 14:20:59 +00:00
void Daily : : ResetGraphLayout ( )
{
gSplitter - > setSizes ( splitter_sizes ) ;
}
2011-06-26 08:30:44 +00:00
void Daily : : Load ( QDate date )
{
2011-07-27 10:47:50 +00:00
static Day * lastcpapday = NULL ;
2011-06-26 08:30:44 +00:00
previous_date = date ;
Day * cpap = profile - > GetDay ( date , MT_CPAP ) ;
2011-07-28 12:13:28 +00:00
Day * oxi = profile - > GetDay ( date , MT_OXIMETER ) ;
2011-07-01 10:10:44 +00:00
// Day *sleepstage=profile->GetDay(date,MT_SLEEPSTAGE);
2011-06-26 08:30:44 +00:00
2011-07-28 07:32:02 +00:00
if ( ! pref [ " MemoryHog " ] . toBool ( ) ) {
if ( lastcpapday & & ( lastcpapday ! = cpap ) ) {
for ( vector < Session * > : : iterator s = lastcpapday - > begin ( ) ; s ! = lastcpapday - > end ( ) ; s + + ) {
( * s ) - > TrashEvents ( ) ;
}
2011-07-27 10:47:50 +00:00
}
}
lastcpapday = cpap ;
2011-07-05 05:33:06 +00:00
QString html = " <html><head><style type='text/css'>p,a,td,body { font-family: 'FreeSans', 'Sans Serif'; } p,a,td,body { font-size: 12px; } </style> "
" </head> "
" <body leftmargin=0 rightmargin=0 topmargin=0 marginwidth=0 marginheight=0> "
" <table cellspacing=0 cellpadding=2 border=0 width='100%'> \n " ;
2011-06-26 08:30:44 +00:00
QString tmp ;
2011-07-03 11:49:47 +00:00
const int gwwidth = 240 ;
2011-06-27 07:45:59 +00:00
const int gwheight = 25 ;
2011-07-28 12:13:28 +00:00
UpdateOXIGraphs ( oxi ) ;
2011-07-22 13:46:17 +00:00
UpdateCPAPGraphs ( cpap ) ;
2011-07-28 12:13:28 +00:00
UpdateEventsTree ( ui - > treeWidget , cpap ) ;
2011-06-26 08:30:44 +00:00
2011-07-28 12:13:28 +00:00
if ( ! cpap & & ! oxi ) {
2011-07-28 11:29:35 +00:00
gSplitter - > setMinimumHeight ( 0 ) ;
2011-07-27 09:21:53 +00:00
NoData - > setText ( tr ( " No data for " ) + date . toString ( Qt : : SystemLocaleLongDate ) ) ;
2011-07-28 12:22:34 +00:00
NoData - > show ( ) ;
2011-07-28 11:29:35 +00:00
for ( unsigned i = 0 ; i < Graphs . size ( ) ; i + + ) {
Graphs [ i ] - > hide ( ) ;
}
2011-07-28 12:13:28 +00:00
spacer - > hide ( ) ;
2011-07-27 09:21:53 +00:00
} else {
2011-07-28 12:22:34 +00:00
NoData - > hide ( ) ;
2011-07-28 12:13:28 +00:00
int vis = 1 ;
2011-07-28 11:29:35 +00:00
for ( unsigned i = 0 ; i < Graphs . size ( ) ; i + + ) {
if ( Graphs [ i ] - > isEmpty ( ) ) {
Graphs [ i ] - > hide ( ) ;
} else {
Graphs [ i ] - > show ( ) ;
2011-07-28 12:13:28 +00:00
vis + + ;
2011-07-28 11:29:35 +00:00
}
}
2011-07-28 12:13:28 +00:00
gSplitter - > setMinimumHeight ( vis * default_height ) ;
spacer - > show ( ) ;
2011-07-27 09:21:53 +00:00
}
2011-07-28 14:20:59 +00:00
2011-07-27 09:21:53 +00:00
gSplitter - > update ( ) ;
RedrawGraphs ( ) ;
2011-07-28 12:13:28 +00:00
QString epr , modestr ;
2011-06-26 08:30:44 +00:00
float iap90 , eap90 ;
CPAPMode mode = MODE_UNKNOWN ;
PRTypes pr ;
QString a ;
if ( cpap ) {
mode = ( CPAPMode ) cpap - > summary_max ( CPAP_Mode ) ;
pr = ( PRTypes ) cpap - > summary_max ( CPAP_PressureReliefType ) ;
if ( pr = = PR_NONE )
epr = tr ( " No Pressure Relief " ) ;
else {
2011-07-05 05:33:06 +00:00
epr = PressureReliefNames [ pr ] + QString ( " x%1 " ) . arg ( ( int ) cpap - > summary_max ( CPAP_PressureReliefSetting ) ) ;
2011-06-26 08:30:44 +00:00
}
modestr = CPAPModeNames [ mode ] ;
float ahi = ( cpap - > count ( CPAP_Obstructive ) + cpap - > count ( CPAP_Hypopnea ) + cpap - > count ( CPAP_ClearAirway ) ) / cpap - > hours ( ) ;
float csr = ( 100.0 / cpap - > hours ( ) ) * ( cpap - > sum ( CPAP_CSR ) / 3600.0 ) ;
float oai = cpap - > count ( CPAP_Obstructive ) / cpap - > hours ( ) ;
float hi = cpap - > count ( CPAP_Hypopnea ) / cpap - > hours ( ) ;
float cai = cpap - > count ( CPAP_ClearAirway ) / cpap - > hours ( ) ;
float rei = cpap - > count ( CPAP_RERA ) / cpap - > hours ( ) ;
float vsi = cpap - > count ( CPAP_VSnore ) / cpap - > hours ( ) ;
float fli = cpap - > count ( CPAP_FlowLimit ) / cpap - > hours ( ) ;
2011-07-22 13:46:17 +00:00
2011-07-27 09:21:53 +00:00
float p90 = cpap - > percentile ( CPAP_Pressure , 0.9 ) ;
eap90 = cpap - > percentile ( CPAP_EAP , 0.9 ) ;
iap90 = cpap - > percentile ( CPAP_IAP , 0.9 ) ;
2011-06-26 08:30:44 +00:00
QString submodel = tr ( " Unknown Model " ) ;
2011-06-30 10:56:22 +00:00
//html+="<tr><td colspan=4 align=center><i>"+tr("Machine Information")+"</i></td></tr>\n";
2011-06-26 08:30:44 +00:00
if ( cpap - > machine - > properties . find ( " SubModel " ) ! = cpap - > machine - > properties . end ( ) )
submodel = " <br> " + cpap - > machine - > properties [ " SubModel " ] ;
2011-06-30 10:56:22 +00:00
html + = " <tr><td colspan=4 align=center><b> " + cpap - > machine - > properties [ " Brand " ] + " </b> <br> " + cpap - > machine - > properties [ " Model " ] + " " + cpap - > machine - > properties [ " ModelNumber " ] + submodel + " </td></tr> \n " ;
2011-06-26 08:30:44 +00:00
if ( pref . Exists ( " ShowSerialNumbers " ) & & pref [ " ShowSerialNumbers " ] . toBool ( ) ) {
2011-06-30 10:56:22 +00:00
html + = " <tr><td colspan=4 align=center> " + cpap - > machine - > properties [ " Serial " ] + " </td></tr> \n " ;
2011-06-26 08:30:44 +00:00
}
2011-06-30 10:56:22 +00:00
html + = " <tr><td align='center'><b>Date</b></td><td align='center'><b> " + tr ( " Sleep " ) + " </b></td><td align='center'><b> " + tr ( " Wake " ) + " </b></td><td align='center'><b> " + tr ( " Hours " ) + " </b></td></tr> " ;
2011-07-02 14:35:50 +00:00
int tt = cpap - > total_time ( ) / 1000 ;
QDateTime date = QDateTime : : fromMSecsSinceEpoch ( cpap - > first ( ) ) ;
QDateTime date2 = QDateTime : : fromMSecsSinceEpoch ( cpap - > last ( ) ) ;
2011-07-05 05:33:06 +00:00
html + = QString ( " <tr><td align='center'>%1</td><td align='center'>%2</td><td align='center'>%3</td><td align='center'>%4</td></tr> \n "
" <tr><td colspan=4 align=center><hr></td></tr> \n " )
. arg ( date . date ( ) . toString ( Qt : : SystemLocaleShortDate ) )
. arg ( date . toString ( " HH:mm " ) )
. arg ( date2 . toString ( " HH:mm " ) )
. arg ( QString ( ) . sprintf ( " %02i:%02i " , tt / 3600 , tt % 60 ) ) ;
2011-06-26 08:30:44 +00:00
2011-06-30 09:37:24 +00:00
QString cs ;
if ( cpap - > machine - > GetClass ( ) ! = " PRS1 " ) {
cs = " 4 align=center> " ;
} else cs = " 2> " ;
2011-07-05 05:33:06 +00:00
html + = " <tr><td colspan= " + cs + " <table cellspacing=0 cellpadding=2 border=0 width='100%'> "
" <tr><td align='right' bgcolor='#F88017'><b><font color='black'> " + tr ( " AHI " ) + " </font></b></td><td bgcolor='#F88017'><b><font color='black'> " + QString ( ) . sprintf ( " %.2f " , ahi ) + " </font></b></td></tr> \n "
" <tr><td align='right' bgcolor='#4040ff'><b><font color='white'> " + tr ( " Hypopnea " ) + " </font></b></td><td bgcolor='#4040ff'><font color='white'> " + QString ( ) . sprintf ( " %.2f " , hi ) + " </font></td></tr> \n "
" <tr><td align='right' bgcolor='#40afbf'><b> " + tr ( " Obstructive " ) + " </b></td><td bgcolor='#40afbf'> " + QString ( ) . sprintf ( " %.2f " , oai ) + " </td></tr> \n "
" <tr><td align='right' bgcolor='#b254cd'><b> " + tr ( " ClearAirway " ) + " </b></td><td bgcolor='#b254cd'> " + QString ( ) . sprintf ( " %.2f " , cai ) + " </td></tr> \n "
" </table></td> " ;
2011-06-30 09:37:24 +00:00
if ( cpap - > machine - > GetClass ( ) = = " PRS1 " ) {
2011-07-05 05:33:06 +00:00
html + = " <td colspan=2><table cellspacing=0 cellpadding=2 border=0 width='100%'> "
" <tr><td align='right' bgcolor='#ffff80'><b> " + tr ( " RERA " ) + " </b></td><td bgcolor='#ffff80'> " + QString ( ) . sprintf ( " %.2f " , rei ) + " </td></tr> \n "
" <tr><td align='right' bgcolor='#404040'><b><font color='white'> " + tr ( " FlowLimit " ) + " </font></b></td><td bgcolor='#404040'><font color='white'> " + a . sprintf ( " %.2f " , fli ) + " </font></td></tr> \n "
" <tr><td align='right' bgcolor='#ff4040'><b> " + tr ( " Vsnore " ) + " </b></td><td bgcolor='#ff4040'> " + QString ( ) . sprintf ( " %.2f " , vsi ) + " </td></tr> \n "
" <tr><td align='right' bgcolor='#80ff80'><b> " + tr ( " PB/CSR " ) + " </b></td><td bgcolor='#80ff80'> " + QString ( ) . sprintf ( " %.2f " , csr ) + " %</td></tr> \n "
" </table></td> " ;
2011-06-26 08:30:44 +00:00
}
2011-07-05 05:33:06 +00:00
html + = " </tr> \n <tr><td colspan=4 align=center><i> " + tr ( " Event Breakdown " ) + " </i></td></tr> \n " ;
2011-07-28 13:56:45 +00:00
if ( 1 ) { // AHI Pie Chart
2011-07-28 07:32:02 +00:00
G_AHI - > setFixedSize ( gwwidth , gwheight ) ;
2011-06-29 14:19:38 +00:00
QPixmap pixmap = G_AHI - > renderPixmap ( 120 , 120 , false ) ; //gwwidth,gwheight,false);
2011-06-26 08:30:44 +00:00
QByteArray byteArray ;
QBuffer buffer ( & byteArray ) ; // use buffer to store pixmap into byteArray
buffer . open ( QIODevice : : WriteOnly ) ;
pixmap . save ( & buffer , " PNG " ) ;
2011-07-28 07:32:02 +00:00
html + = " <tr><td colspan=4 align=center><img src= \" data:image/png;base64, " + byteArray . toBase64 ( ) + " \" ></td></tr> \n " ;
2011-06-26 08:30:44 +00:00
}
2011-07-05 05:33:06 +00:00
html + = " </table> "
" <table cellspacing=0 cellpadding=0 border=0 width='100%'> \n "
" <tr height='2'><td colspan=4 height='2'><hr></td></tr> \n " ;
2011-06-26 08:30:44 +00:00
if ( mode = = MODE_BIPAP ) {
2011-07-05 05:33:06 +00:00
html + = " <tr><td colspan=4 align='center'><i> " + tr ( " 90% EPAP " ) + QString ( ) . sprintf ( " %.2f " , eap90 ) + tr ( " cmH2O " ) + " </td></tr> \n "
2011-07-11 01:58:51 +00:00
" <tr><td colspan=4 align='center'><i> " + tr ( " 90% IPAP " ) + QString ( ) . sprintf ( " %.2f " , iap90 ) + tr ( " cmH2O " ) + " </td></tr> \n " ;
2011-06-26 08:30:44 +00:00
} else if ( mode = = MODE_APAP ) {
2011-07-24 17:58:41 +00:00
html + = ( " <tr><td colspan=4 align='center'><i> " ) + tr ( " 90% Pressure " ) + QString ( ) . sprintf ( " %.2f " , p90 ) + ( " </i></td></tr> \n " ) ; //cpap->summary_weighted_avg(CPAP_PressurePercentValue)
2011-06-26 08:30:44 +00:00
} else if ( mode = = MODE_CPAP ) {
2011-07-05 05:33:06 +00:00
html + = ( " <tr><td colspan=4 align='center'><i> " ) + tr ( " Pressure " ) + QString ( ) . sprintf ( " %.2f " , cpap - > summary_min ( CPAP_PressureMin ) ) + ( " </i></td></tr> \n " ) ;
2011-06-26 08:30:44 +00:00
}
2011-06-30 10:56:22 +00:00
//html+=("<tr><td colspan=4 align=center> </td></tr>\n");
2011-06-26 08:30:44 +00:00
2011-06-30 10:56:22 +00:00
html + = ( " <tr><td> </td><td><b>Min</b></td><td><b>Avg</b></td><td><b>Max</b></td></tr> " ) ;
2011-06-26 08:30:44 +00:00
if ( mode = = MODE_APAP ) {
2011-06-30 10:56:22 +00:00
html + = " <tr><td align=left> " + tr ( " Pressure: " ) + " </td><td> " + a . sprintf ( " %.2f " , cpap - > summary_min ( CPAP_PressureMinAchieved ) ) ;
html + = ( " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_weighted_avg ( CPAP_PressureAverage ) ) ;
html + = ( " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_max ( CPAP_PressureMaxAchieved ) ) + ( " </td></tr> " ) ;
2011-06-26 08:30:44 +00:00
2011-06-30 10:56:22 +00:00
// html+=wxT("<tr><td><b>")+_("90% Pressure")+wxT("</b></td><td>")+wxString::Format(wxT("%.1fcmH2O"),p90)+wxT("</td></tr>\n");
2011-06-26 08:30:44 +00:00
} else if ( mode = = MODE_BIPAP ) {
2011-06-30 10:56:22 +00:00
html + = ( " <tr><td align=left> " + tr ( " EPAP: " ) + " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_min ( BIPAP_EAPMin ) ) ;
html + = ( " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_weighted_avg ( BIPAP_EAPAverage ) ) ;
html + = ( " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_max ( BIPAP_EAPMax ) ) + ( " </td></tr> " ) ;
2011-06-26 08:30:44 +00:00
2011-07-02 15:48:55 +00:00
html + = ( " <tr><td align=left> " + tr ( " IPAP: " ) + " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_min ( BIPAP_IAPMin ) ) ;
2011-06-30 10:56:22 +00:00
html + = ( " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_weighted_avg ( BIPAP_IAPAverage ) ) ;
html + = ( " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_max ( BIPAP_IAPMax ) ) + ( " </td></tr> " ) ;
2011-06-26 08:30:44 +00:00
2011-07-12 12:43:10 +00:00
html + = ( " <tr><td align=left> " + tr ( " PS: " ) + " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_min ( BIPAP_PSMin ) ) ;
html + = ( " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_weighted_avg ( BIPAP_PSAverage ) ) ;
html + = ( " </td><td> " ) + a . sprintf ( " %.2f " , cpap - > summary_max ( BIPAP_PSMax ) ) + ( " </td></tr> " ) ;
2011-06-26 08:30:44 +00:00
}
2011-06-30 10:56:22 +00:00
html + = " <tr><td align=left> " + tr ( " Leak: " ) ;
html + = " </td><td> " + a . sprintf ( " %.2f " , cpap - > summary_min ( CPAP_LeakMinimum ) ) ;
html + = " </td><td> " + a . sprintf ( " %.2f " , cpap - > summary_weighted_avg ( CPAP_LeakAverage ) ) ;
html + = " </td><td> " + a . sprintf ( " %.2f " , cpap - > summary_max ( CPAP_LeakMaximum ) ) + ( " </td><tr> " ) ;
html + = " <tr><td align=left> " + tr ( " Snore: " ) ;
html + = " </td><td> " + a . sprintf ( " %.2f " , cpap - > summary_min ( CPAP_SnoreMinimum ) ) ;
html + = " </td><td> " + a . sprintf ( " %.2f " , cpap - > summary_avg ( CPAP_SnoreAverage ) ) ;
html + = " </td><td> " + a . sprintf ( " %.2f " , cpap - > summary_max ( CPAP_SnoreMaximum ) ) + ( " </td><tr> " ) ;
2011-07-10 17:49:02 +00:00
2011-06-26 08:30:44 +00:00
} else {
html + = " <tr><td colspan=4 align=center><i> " + tr ( " No CPAP data available " ) + " </i></td></tr> " ;
html + = " <tr><td colspan=4> </td></tr> \n " ;
}
2011-07-10 16:20:51 +00:00
// Instead of doing this, check whether any data exists..
// and show based on this factor.
2011-07-11 04:54:53 +00:00
bool merge_oxi_graphs = true ;
if ( ! merge_oxi_graphs ) {
2011-07-27 09:21:53 +00:00
//spo2->isEmpty() ? SPO2->hide() : SPO2->show();
//pulse->isEmpty() ? PULSE->hide() : PULSE->show();
2011-07-11 04:54:53 +00:00
} else {
2011-07-27 09:21:53 +00:00
//pulse->isEmpty() && spo2->isEmpty() ? PULSE->hide() : PULSE->show();
2011-07-11 04:54:53 +00:00
}
2011-06-30 07:27:04 +00:00
2011-06-26 08:30:44 +00:00
if ( oxi ) {
2011-06-30 10:56:22 +00:00
html + = " <tr><td> " + tr ( " Pulse: " ) ;
html + = " </td><td> " + a . sprintf ( " %.2fbpm " , oxi - > summary_min ( OXI_PulseMin ) ) ;
html + = " </td><td> " + a . sprintf ( " %.2fbpm " , oxi - > summary_avg ( OXI_PulseAverage ) ) ;
html + = " </td><td> " + a . sprintf ( " %.2fbpm " , oxi - > summary_max ( OXI_PulseMax ) ) + " </td><tr> " ;
2011-06-26 08:30:44 +00:00
2011-06-30 10:56:22 +00:00
html + = " <tr><td> " + tr ( " SpO2: " ) ;
html + = " </td><td> " + a . sprintf ( " %.2f%% " , oxi - > summary_min ( OXI_SPO2Min ) ) ;
html + = " </td><td> " + a . sprintf ( " %.2f%% " , oxi - > summary_avg ( OXI_SPO2Average ) ) ;
html + = " </td><td> " + a . sprintf ( " %.2f%% " , oxi - > summary_max ( OXI_SPO2Max ) ) + " </td><tr> " ;
2011-06-26 08:30:44 +00:00
2011-06-30 10:56:22 +00:00
//html+=wxT("<tr><td colspan=4> </td></tr>\n");
2011-06-26 08:30:44 +00:00
2011-07-11 04:54:53 +00:00
//PULSE->show();
2011-06-30 07:27:04 +00:00
//SPO2->show();
2011-06-26 08:30:44 +00:00
} else {
2011-07-11 04:54:53 +00:00
//PULSE->hide();
2011-06-30 07:27:04 +00:00
//SPO2->hide();
2011-06-26 08:30:44 +00:00
}
if ( cpap ) {
if ( mode = = MODE_BIPAP ) {
} else if ( mode = = MODE_APAP ) {
2011-06-30 10:56:22 +00:00
html + = ( " <tr><td colspan=4 align=center><i> " ) + tr ( " Time@Pressure " ) + ( " </i></td></tr> \n " ) ;
2011-06-26 08:30:44 +00:00
2011-07-28 11:09:53 +00:00
//TAP->setFixedSize(gwwidth,gwheight);
//QPixmap pixmap=TAP->renderPixmap(gwwidth,gwheight,false);
//QByteArray byteArray;
//QBuffer buffer(&byteArray); // use buffer to store pixmap into byteArray
//buffer.open(QIODevice::WriteOnly);
//pixmap.save(&buffer, "PNG");
//html+="<tr><td colspan=4 align=center><img src=\"data:image/png;base64," + byteArray.toBase64() + "\"></td></tr>\n";
2011-06-26 08:30:44 +00:00
}
2011-06-30 10:56:22 +00:00
html + = " </table><hr height=2><table cellpadding=0 cellspacing=0 border=0 width=100%> " ;
html + = " <tr><td align=center>SessionID</td><td align=center>Date</td><td align=center>Start</td><td align=center>End</td></tr> " ;
2011-07-02 14:35:50 +00:00
QDateTime fd , ld ;
2011-07-21 03:03:20 +00:00
bool corrupted_waveform = false ;
2011-06-26 08:30:44 +00:00
for ( vector < Session * > : : iterator s = cpap - > begin ( ) ; s ! = cpap - > end ( ) ; s + + ) {
2011-07-02 14:35:50 +00:00
fd = QDateTime : : fromMSecsSinceEpoch ( ( * s ) - > first ( ) ) ;
ld = QDateTime : : fromMSecsSinceEpoch ( ( * s ) - > last ( ) ) ;
2011-07-21 03:03:20 +00:00
if ( ( ( * s ) - > summary . find ( CPAP_BrokenWaveform ) ! = ( * s ) - > summary . end ( ) ) & & ( * s ) - > summary [ CPAP_BrokenWaveform ] . toBool ( ) ) corrupted_waveform = true ;
2011-07-20 16:01:31 +00:00
tmp . sprintf ( ( " <tr><td align=center>%08i</td><td align=center> " + fd . date ( ) . toString ( Qt : : SystemLocaleShortDate ) + " </td><td align=center> " + fd . toString ( " HH:mm " ) + " </td><td align=center> " + ld . toString ( " HH:mm " ) + " </td></tr> " ) . toLatin1 ( ) , ( * s ) - > session ( ) ) ;
2011-06-26 08:30:44 +00:00
html + = tmp ;
}
2011-06-30 10:56:22 +00:00
html + = " </table> " ;
2011-07-21 03:03:20 +00:00
if ( corrupted_waveform ) {
html + = " <hr><div align=center><i>One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.</i></div> " ;
}
2011-06-26 08:30:44 +00:00
}
html + = " </html> " ;
ui - > webView - > setHtml ( html ) ;
ui - > JournalNotes - > clear ( ) ;
Session * journal = GetJournalSession ( date ) ;
if ( journal ) {
ui - > JournalNotes - > setHtml ( journal - > summary [ GEN_Notes ] . toString ( ) ) ;
}
2011-07-28 12:13:28 +00:00
2011-06-26 08:30:44 +00:00
}
void Daily : : Unload ( QDate date )
{
Session * journal = GetJournalSession ( date ) ;
if ( ! ui - > JournalNotes - > toPlainText ( ) . isEmpty ( ) ) {
QString jhtml = ui - > JournalNotes - > toHtml ( ) ;
if ( journal ) {
if ( journal - > summary [ GEN_Notes ] ! = jhtml ) {
journal - > summary [ GEN_Notes ] = jhtml ;
journal - > SetChanged ( true ) ;
}
} else {
journal = CreateJournalSession ( date ) ;
journal - > summary [ GEN_Notes ] = jhtml ;
journal - > SetChanged ( true ) ;
}
}
if ( journal ) {
Machine * jm = profile - > GetMachine ( MT_JOURNAL ) ;
if ( jm ) jm - > SaveSession ( journal ) ;
}
UpdateCalendarDay ( date ) ;
}
void Daily : : on_JournalNotesItalic_clicked ( )
{
QTextCursor cursor = ui - > JournalNotes - > textCursor ( ) ;
if ( ! cursor . hasSelection ( ) )
cursor . select ( QTextCursor : : WordUnderCursor ) ;
QTextCharFormat format = cursor . charFormat ( ) ;
format . setFontItalic ( ! format . fontItalic ( ) ) ;
cursor . mergeCharFormat ( format ) ;
//ui->JournalNotes->mergeCurrentCharFormat(format);
}
void Daily : : on_JournalNotesBold_clicked ( )
{
QTextCursor cursor = ui - > JournalNotes - > textCursor ( ) ;
if ( ! cursor . hasSelection ( ) )
cursor . select ( QTextCursor : : WordUnderCursor ) ;
QTextCharFormat format = cursor . charFormat ( ) ;
int fw = format . fontWeight ( ) ;
if ( fw ! = QFont : : Bold )
format . setFontWeight ( QFont : : Bold ) ;
else
format . setFontWeight ( QFont : : Normal ) ;
cursor . mergeCharFormat ( format ) ;
//ui->JournalNotes->mergeCurrentCharFormat(format);
}
void Daily : : on_JournalNotesFontsize_activated ( int index )
{
QTextCursor cursor = ui - > JournalNotes - > textCursor ( ) ;
if ( ! cursor . hasSelection ( ) )
cursor . select ( QTextCursor : : WordUnderCursor ) ;
QTextCharFormat format = cursor . charFormat ( ) ;
QFont font = format . font ( ) ;
int fontsize = 10 ;
if ( index = = 1 ) fontsize = 15 ;
else if ( index = = 2 ) fontsize = 25 ;
font . setPointSize ( fontsize ) ;
format . setFont ( font ) ;
cursor . mergeCharFormat ( format ) ;
}
void Daily : : on_JournalNotesColour_clicked ( )
{
2011-06-27 15:00:00 +00:00
QColor col = QColorDialog : : getColor ( Qt : : black , this , tr ( " Pick a Colour " ) ) ; //,QColorDialog::NoButtons);
2011-06-26 08:30:44 +00:00
if ( ! col . isValid ( ) ) return ;
QTextCursor cursor = ui - > JournalNotes - > textCursor ( ) ;
if ( ! cursor . hasSelection ( ) )
cursor . select ( QTextCursor : : WordUnderCursor ) ;
QBrush b ( col ) ;
QPalette newPalette = palette ( ) ;
newPalette . setColor ( QPalette : : ButtonText , col ) ;
ui - > JournalNotesColour - > setPalette ( newPalette ) ;
QTextCharFormat format = cursor . charFormat ( ) ;
format . setForeground ( b ) ;
cursor . setCharFormat ( format ) ;
}
Session * Daily : : CreateJournalSession ( QDate date )
{
Machine * m = profile - > GetMachine ( MT_JOURNAL ) ;
if ( ! m ) {
m = new Machine ( profile , 0 ) ;
m - > SetClass ( " Journal " ) ;
m - > properties [ " Brand " ] = " Virtual " ;
m - > SetType ( MT_JOURNAL ) ;
profile - > AddMachine ( m ) ;
}
Session * sess = new Session ( m , 0 ) ;
QDateTime dt ;
dt . setDate ( date ) ;
dt . setTime ( QTime ( 17 , 0 ) ) ; //5pm to make sure it goes in the right day
2011-07-02 14:35:50 +00:00
sess - > set_first ( dt . toMSecsSinceEpoch ( ) ) ;
2011-06-26 08:30:44 +00:00
dt = dt . addSecs ( 3600 ) ;
2011-07-02 14:35:50 +00:00
sess - > set_last ( dt . toMSecsSinceEpoch ( ) ) ;
2011-06-26 08:30:44 +00:00
sess - > SetChanged ( true ) ;
m - > AddSession ( sess , profile ) ;
return sess ;
}
Session * Daily : : GetJournalSession ( QDate date ) // Get the first journal session
{
Day * journal = profile - > GetDay ( date , MT_JOURNAL ) ;
if ( ! journal )
return NULL ; //CreateJournalSession(date);
vector < Session * > : : iterator s ;
s = journal - > begin ( ) ;
if ( s ! = journal - > end ( ) )
return * s ;
return NULL ;
}
void Daily : : on_EnergySlider_sliderMoved ( int position )
{
Session * s = GetJournalSession ( previous_date ) ;
if ( ! s )
s = CreateJournalSession ( previous_date ) ;
s - > summary [ GEN_Energy ] = position ;
s - > SetChanged ( true ) ;
}
void Daily : : UpdateCPAPGraphs ( Day * day )
{
//if (!day) return;
if ( day ) {
day - > OpenEvents ( ) ;
}
2011-07-27 09:21:53 +00:00
for ( list < gLayer * > : : iterator g = CPAPData . begin ( ) ; g ! = CPAPData . end ( ) ; g + + ) {
( * g ) - > SetDay ( day ) ;
2011-06-26 08:30:44 +00:00
}
} ;
void Daily : : UpdateOXIGraphs ( Day * day )
{
//if (!day) return;
2011-07-27 10:47:50 +00:00
2011-06-26 08:30:44 +00:00
if ( day ) {
day - > OpenEvents ( ) ;
}
2011-07-27 09:21:53 +00:00
for ( list < gLayer * > : : iterator g = OXIData . begin ( ) ; g ! = OXIData . end ( ) ; g + + ) {
( * g ) - > SetDay ( day ) ;
2011-06-26 08:30:44 +00:00
}
2011-06-27 07:45:59 +00:00
}
void Daily : : RedrawGraphs ( )
{
2011-07-24 16:34:53 +00:00
for ( unsigned i = 0 ; i < Graphs . size ( ) ; i + + ) {
2011-07-27 09:21:53 +00:00
Graphs [ i ] - > ResetBounds ( ) ;
2011-07-22 13:46:17 +00:00
Graphs [ i ] - > updateGL ( ) ;
2011-06-27 07:45:59 +00:00
}
}
2011-06-26 08:30:44 +00:00
void Daily : : on_treeWidget_itemSelectionChanged ( )
{
2011-06-27 10:55:55 +00:00
if ( ui - > treeWidget - > selectedItems ( ) . size ( ) = = 0 ) return ;
2011-06-26 08:30:44 +00:00
QTreeWidgetItem * item = ui - > treeWidget - > selectedItems ( ) . at ( 0 ) ;
2011-06-27 07:51:37 +00:00
if ( ! item ) return ;
2011-06-26 08:30:44 +00:00
QDateTime d ;
if ( ! item - > text ( 1 ) . isEmpty ( ) ) {
d = d . fromString ( item - > text ( 1 ) , " yyyy-MM-dd HH:mm:ss " ) ;
2011-07-27 09:21:53 +00:00
double st = ( d . addSecs ( - 180 ) ) . toMSecsSinceEpoch ( ) ;
double et = ( d . addSecs ( 180 ) ) . toMSecsSinceEpoch ( ) ;
2011-06-26 08:30:44 +00:00
FRW - > SetXBounds ( st , et ) ;
2011-07-11 04:54:53 +00:00
MP - > SetXBounds ( st , et ) ;
2011-06-26 08:30:44 +00:00
SF - > SetXBounds ( st , et ) ;
PRD - > SetXBounds ( st , et ) ;
LEAK - > SetXBounds ( st , et ) ;
SNORE - > SetXBounds ( st , et ) ;
2011-07-01 05:11:33 +00:00
MV - > SetXBounds ( st , et ) ;
TV - > SetXBounds ( st , et ) ;
RR - > SetXBounds ( st , et ) ;
FLG - > SetXBounds ( st , et ) ;
2011-06-26 08:30:44 +00:00
}
}
2011-06-28 01:51:21 +00:00
void Daily : : on_JournalNotesUnderline_clicked ( )
{
QTextCursor cursor = ui - > JournalNotes - > textCursor ( ) ;
if ( ! cursor . hasSelection ( ) )
cursor . select ( QTextCursor : : WordUnderCursor ) ;
QTextCharFormat format = cursor . charFormat ( ) ;
format . setFontUnderline ( ! format . fontUnderline ( ) ) ;
cursor . mergeCharFormat ( format ) ;
//ui->JournalNotes->mergeCurrentCharFormat(format);
}