OSCAR-code/sleepyhead/preferencesdialog.cpp
Sean Stangl 9dbe702a40 Standardize project modelines and include license and copyright.
Signed-off-by: Mark Watkins <jedimark@users.sourceforge.net>
2014-04-10 13:29:53 +10:00

873 lines
33 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=8 sts=4 et sw=4 tw=99:
*
* Preferences Dialog
*
* Copyright (c) 2011-2014 Mark Watkins <jedimark@users.sourceforge.net>
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of the Linux
* distribution for more details. */
#include <QLabel>
#include <QColorDialog>
#include <QMessageBox>
#include <QStatusBar>
#include <QProcess>
#include <QDesktopServices>
#include <QFileDialog>
#include <QTextStream>
#include <QCalendarWidget>
#include "preferencesdialog.h"
#include "common_gui.h"
#include <Graphs/gGraphView.h>
#include <mainwindow.h>
#include "ui_preferencesdialog.h"
#include "SleepLib/machine_common.h"
extern QFont * defaultfont;
extern QFont * mediumfont;
extern QFont * bigfont;
extern MainWindow * mainwin;
MaskProfile masks[]={
{Mask_Unknown,QObject::tr("Unspecified"),{{4,25},{8,25},{12,25},{16,25},{20,25}}},
{Mask_NasalPillows,QObject::tr("Nasal Pillows"),{{4,20},{8,29},{12,37},{16,43},{20,49}}},
{Mask_Hybrid,QObject::tr("Hybrid F/F Mask"),{{4,20},{8,29},{12,37},{16,43},{20,49}}},
{Mask_StandardNasal,QObject::tr("Nasal Interface"),{{4,20},{8,29},{12,37},{16,43},{20,49}}},
{Mask_FullFace,QObject::tr("Full-Face Mask"),{{4,20},{8,29},{12,37},{16,43},{20,49}}},
};
const int num_masks=sizeof(masks)/sizeof(MaskProfile);
PreferencesDialog::PreferencesDialog(QWidget *parent,Profile * _profile) :
QDialog(parent),
ui(new Ui::PreferencesDialog),
profile(_profile)
{
ui->setupUi(this);
ui->leakProfile->setRowCount(5);
ui->leakProfile->setColumnCount(2);
ui->leakProfile->horizontalHeader()->setStretchLastSection(true);
ui->leakProfile->setColumnWidth(0,100);
ui->maskTypeCombo->clear();
//ui->customEventGroupbox->setEnabled(false);
QString masktype=tr("Nasal Pillows");
//masktype=PROFILEMaskType
for (int i=0;i<num_masks;i++) {
ui->maskTypeCombo->addItem(masks[i].name);
/*if (masktype==masks[i].name) {
ui->maskTypeCombo->setCurrentIndex(i);
on_maskTypeCombo_activated(i);
}*/
}
QLocale locale=QLocale::system();
QString shortformat=locale.dateFormat(QLocale::ShortFormat);
if (!shortformat.toLower().contains("yyyy")) {
shortformat.replace("yy","yyyy");
}
ui->startedUsingMask->setDisplayFormat(shortformat);
Qt::DayOfWeek dow=firstDayOfWeekFromLocale();
ui->startedUsingMask->calendarWidget()->setFirstDayOfWeek(dow);
ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->colourTab));
// Stop both calendar drop downs highlighting weekends in red
QTextCharFormat format = ui->startedUsingMask->calendarWidget()->weekdayTextFormat(Qt::Saturday);
format.setForeground(QBrush(Qt::black, Qt::SolidPattern));
ui->startedUsingMask->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format);
ui->startedUsingMask->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format);
//ui->leakProfile->setColumnWidth(1,ui->leakProfile->width()/2);
{
QString filename=PROFILE.Get("{DataFolder}/ImportLocations.txt");
QFile file(filename);
file.open(QFile::ReadOnly);
QTextStream textStream(&file);
while (1) {
QString line = textStream.readLine();
if (line.isNull())
break;
else if (line.isEmpty())
continue;
else {
importLocations.append(line);
}
};
file.close();
}
importModel=new QStringListModel(importLocations,this);
ui->importListWidget->setModel(importModel);
//ui->tabWidget->removeTab(3);
Q_ASSERT(profile!=NULL);
ui->tabWidget->setCurrentIndex(0);
//i=ui->timeZoneCombo->findText((*profile)["TimeZone"].toString());
//ui->timeZoneCombo->setCurrentIndex(i);
ui->spo2Drop->setValue(profile->oxi->spO2DropPercentage());
ui->spo2DropTime->setValue(profile->oxi->spO2DropDuration());
ui->pulseChange->setValue(profile->oxi->pulseChangeBPM());
ui->pulseChangeTime->setValue(profile->oxi->pulseChangeDuration());
ui->oxiDiscardThreshold->setValue(profile->oxi->oxiDiscardThreshold());
ui->AddRERAtoAHI->setChecked(profile->general->calculateRDI());
ui->timeEdit->setTime(profile->session->daySplitTime());
int val=profile->session->combineCloseSessions();
ui->combineSlider->setValue(val);
if (val>0) {
ui->combineLCD->display(val);
} else ui->combineLCD->display(STR_GEN_Off);
val=profile->session->ignoreShortSessions();
ui->IgnoreSlider->setValue(val);
if (val>0) {
ui->IgnoreLCD->display(val);
} else ui->IgnoreLCD->display(STR_GEN_Off);
ui->applicationFont->setCurrentFont(QApplication::font());
//ui->applicationFont->setFont(QApplication::font());
ui->applicationFontSize->setValue(QApplication::font().pointSize());
ui->applicationFontBold->setChecked(QApplication::font().weight()==QFont::Bold);
ui->applicationFontItalic->setChecked(QApplication::font().italic());
ui->graphFont->setCurrentFont(*defaultfont);
//ui->graphFont->setFont(*defaultfont);
ui->graphFontSize->setValue(defaultfont->pointSize());
ui->graphFontBold->setChecked(defaultfont->weight()==QFont::Bold);
ui->graphFontItalic->setChecked(defaultfont->italic());
ui->titleFont->setCurrentFont(*mediumfont);
//ui->titleFont->setFont(*mediumfont);
ui->titleFontSize->setValue(mediumfont->pointSize());
ui->titleFontBold->setChecked(mediumfont->weight()==QFont::Bold);
ui->titleFontItalic->setChecked(mediumfont->italic());
ui->bigFont->setCurrentFont(*bigfont);
//ui->bigFont->setFont(*bigfont);
ui->bigFontSize->setValue(bigfont->pointSize());
ui->bigFontBold->setChecked(bigfont->weight()==QFont::Bold);
ui->bigFontItalic->setChecked(bigfont->italic());
ui->startedUsingMask->setDate(profile->cpap->maskStartDate());
ui->leakModeCombo->setCurrentIndex(profile->cpap->leakMode());
int mt=(int)profile->cpap->maskType();
ui->maskTypeCombo->setCurrentIndex(mt);
on_maskTypeCombo_activated(mt);
ui->maskDescription->setText(profile->cpap->maskDescription());
ui->useAntiAliasing->setChecked(profile->appearance->antiAliasing());
ui->usePixmapCaching->setChecked(profile->appearance->usePixmapCaching());
ui->useSquareWavePlots->setChecked(profile->appearance->squareWavePlots());
ui->enableGraphSnapshots->setChecked(profile->appearance->graphSnapshots());
ui->graphTooltips->setChecked(profile->appearance->graphTooltips());
ui->allowYAxisScaling->setChecked(profile->appearance->allowYAxisScaling());
ui->skipLoginScreen->setChecked(PREF[STR_GEN_SkipLogin].toBool());
ui->allowEarlyUpdates->setChecked(PREF[STR_PREF_AllowEarlyUpdates].toBool());
ui->clockDrift->setValue(profile->cpap->clockDrift());
ui->skipEmptyDays->setChecked(profile->general->skipEmptyDays());
ui->enableMultithreading->setChecked(profile->session->multithreading());
ui->cacheSessionData->setChecked(profile->session->cacheSessions());
ui->animationsAndTransitionsCheckbox->setChecked(profile->appearance->animations());
ui->complianceGroupbox->setChecked(profile->cpap->showComplianceInfo());
ui->complianceHours->setValue(profile->cpap->complianceHours());
ui->prefCalcMiddle->setCurrentIndex(profile->general->prefCalcMiddle());
ui->prefCalcMax->setCurrentIndex(profile->general->prefCalcMax());
float f=profile->general->prefCalcPercentile();
ui->prefCalcPercentile->setValue(f);
ui->tooltipTimeoutSlider->setValue(profile->general->tooltipTimeout()/50);
ui->tooltipMS->display(profile->general->tooltipTimeout());
ui->scrollDampeningSlider->setValue(profile->general->scrollDampening()/10);
if (profile->general->scrollDampening()>0)
ui->scrollDampDisplay->display(profile->general->scrollDampening());
else ui->scrollDampDisplay->display(STR_TR_Off);
bool bcd=profile->session->backupCardData();
ui->createSDBackups->setChecked(bcd);
ui->compressSDBackups->setEnabled(bcd);
ui->compressSDBackups->setChecked(profile->session->compressBackupData());
ui->compressSessionData->setChecked(profile->session->compressSessionData());
ui->graphHeight->setValue(profile->appearance->graphHeight());
if (!PREF.contains(STR_GEN_UpdatesAutoCheck)) PREF[STR_GEN_UpdatesAutoCheck]=true;
ui->automaticallyCheckUpdates->setChecked(PREF[STR_GEN_UpdatesAutoCheck].toBool());
if (!PREF.contains(STR_GEN_UpdateCheckFrequency)) PREF[STR_GEN_UpdateCheckFrequency]=3;
ui->updateCheckEvery->setValue(PREF[STR_GEN_UpdateCheckFrequency].toInt());
if (PREF.contains(STR_GEN_UpdatesLastChecked)) {
RefreshLastChecked();
} else ui->updateLastChecked->setText("Never");
ui->overlayFlagsCombo->setCurrentIndex(profile->appearance->overlayType());
ui->overviewLinecharts->setCurrentIndex(profile->appearance->overviewLinechartMode());
ui->oximetryGroupBox->setChecked(profile->oxi->oximetryEnabled());
ui->oximetrySync->setChecked(profile->oxi->syncOximetry());
int ot=ui->oximetryType->findText(profile->oxi->oximeterType(),Qt::MatchExactly);
if (ot<0) ot=0;
ui->oximetryType->setCurrentIndex(ot);
ui->ahiGraphWindowSize->setEnabled(false);
ui->ahiGraphWindowSize->setValue(profile->cpap->AHIWindow());
ui->ahiGraphZeroReset->setChecked(profile->cpap->AHIReset());
ui->customEventGroupbox->setChecked(profile->cpap->userEventFlagging());
ui->apneaDuration->setValue(profile->cpap->userEventDuration());
ui->apneaFlowRestriction->setValue(profile->cpap->userFlowRestriction());
ui->userEventDuplicates->setChecked(profile->cpap->userEventDuplicates());
ui->userEventDuplicates->setVisible(false);
ui->eventTable->setColumnWidth(0,40);
ui->eventTable->setColumnWidth(1,55);
ui->eventTable->setColumnHidden(3,true);
int row=0;
QTableWidgetItem *item;
QHash<QString, schema::Channel *>::iterator ci;
for (ci=schema::channel.names.begin();ci!=schema::channel.names.end();ci++) {
if (ci.value()->type()==schema::DATA) {
ui->eventTable->insertRow(row);
int id=ci.value()->id();
ui->eventTable->setItem(row,3,new QTableWidgetItem(QString::number(id)));
item=new QTableWidgetItem(ci.value()->description());
ui->eventTable->setItem(row,2,item);
QCheckBox *c=new QCheckBox(ui->eventTable);
c->setChecked(true);
QLabel *pb=new QLabel(ui->eventTable);
pb->setText("foo");
ui->eventTable->setCellWidget(row,0,c);
ui->eventTable->setCellWidget(row,1,pb);
QColor a=ci.value()->defaultColor();//(rand() % 255, rand() % 255, rand() % 255, 255);
QPalette p(a,a,a,a,a,a,a);
pb->setPalette(p);
pb->setAutoFillBackground(true);
pb->setBackgroundRole(QPalette::Background);
row++;
}
}
/* QLocale locale=QLocale::system();
QString shortformat=locale.dateFormat(QLocale::ShortFormat);
if (!shortformat.toLower().contains("yyyy")) {
shortformat.replace("yy","yyyy");
}*/
graphFilterModel=new MySortFilterProxyModel(this);
graphModel=new QStandardItemModel(this);
graphFilterModel->setSourceModel(graphModel);
graphFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
graphFilterModel->setFilterKeyColumn(0);
ui->graphView->setModel(graphFilterModel);
resetGraphModel();
// tree->sortByColumn(0,Qt::AscendingOrder);
}
PreferencesDialog::~PreferencesDialog()
{
disconnect(graphModel,SIGNAL(itemChanged(QStandardItem*)),this,SLOT(graphModel_changed(QStandardItem*)));
delete ui;
}
void PreferencesDialog::on_eventTable_doubleClicked(const QModelIndex &index)
{
int row=index.row();
int col=index.column();
bool ok;
int id=ui->eventTable->item(row,3)->text().toInt(&ok);
if (col==1) {
QWidget *w=ui->eventTable->cellWidget(row,col);
QColorDialog a;
QColor color=w->palette().background().color();
a.setCurrentColor(color);
if (a.exec()==QColorDialog::Accepted) {
QColor c=a.currentColor();
QPalette p(c,c,c,c,c,c,c);
w->setPalette(p);
m_new_colors[id]=c;
//qDebug() << "Color accepted" << col << id;
}
}
}
bool PreferencesDialog::Save()
{
bool recalc_events=false;
bool needs_restart=false;
if (ui->ahiGraphZeroReset->isChecked()!=profile->cpap->AHIReset()) recalc_events=true;
if (ui->useSquareWavePlots->isChecked()!=profile->appearance->squareWavePlots()) {
needs_restart=true;
}
if ((profile->session->daySplitTime()!=ui->timeEdit->time()) ||
(profile->session->combineCloseSessions()!=ui->combineSlider->value()) ||
(profile->session->ignoreShortSessions()!=ui->IgnoreSlider->value())) {
needs_restart=true;
}
if (profile->general->calculateRDI() != ui->AddRERAtoAHI->isChecked()) {
//recalc_events=true;
needs_restart=true;
}
if ((profile->general->prefCalcMiddle()!=ui->prefCalcMiddle->currentIndex())
|| (profile->general->prefCalcMax()!=ui->prefCalcMax->currentIndex())
|| (profile->general->prefCalcPercentile()!=ui->prefCalcPercentile->value())) {
needs_restart=true;
}
if (profile->cpap->userEventFlagging() &&
(profile->cpap->userEventDuration()!=ui->apneaDuration->value() ||
profile->cpap->userEventDuplicates()!=ui->userEventDuplicates->isChecked() ||
profile->cpap->userFlowRestriction()!=ui->apneaFlowRestriction->value()))
recalc_events=true;
// Restart if turning user event flagging on/off
if (profile->cpap->userEventFlagging()!=ui->customEventGroupbox->isChecked()) {
// if (profile->cpap->userEventFlagging()) {
// Don't bother recalculating, just switch off
needs_restart=true;
//} else
recalc_events=true;
}
if (profile->session->compressSessionData()!=ui->compressSessionData->isChecked())
recalc_events=true;
if (recalc_events) {
if (PROFILE.countDays(MT_CPAP,PROFILE.FirstDay(),PROFILE.LastDay())>0) {
if (QMessageBox::question(this,tr("Data Reindex Required"),tr("A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.\n\nAre you sure you want to make these changes?"),QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) {
return false;
}
} else recalc_events=false;
} else if (needs_restart) {
if (QMessageBox::question(this,tr("Restart Required"),tr("One or more of the changes you have made will require this application to be restarted,\nin order for these changes to come into effect.\n\nWould you like do this now?"),QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) {
return false;
}
}
profile->appearance->setAllowYAxisScaling(ui->allowYAxisScaling->isChecked());
profile->appearance->setGraphTooltips(ui->graphTooltips->isChecked());
profile->appearance->setAntiAliasing(ui->useAntiAliasing->isChecked());
profile->appearance->setUsePixmapCaching(ui->usePixmapCaching->isChecked());
profile->appearance->setSquareWavePlots(ui->useSquareWavePlots->isChecked());
profile->appearance->setGraphSnapshots(ui->enableGraphSnapshots->isChecked());
profile->general->setSkipEmptyDays(ui->skipEmptyDays->isChecked());
profile->general->setTooltipTimeout(ui->tooltipTimeoutSlider->value()*50);
profile->general->setScrollDampening(ui->scrollDampeningSlider->value()*10);
profile->session->setMultithreading(ui->enableMultithreading->isChecked());
profile->session->setCacheSessions(ui->cacheSessionData->isChecked());
profile->cpap->setMaskDescription(ui->maskDescription->text());
profile->appearance->setAnimations(ui->animationsAndTransitionsCheckbox->isChecked());
profile->cpap->setShowComplianceInfo(ui->complianceGroupbox->isChecked());
profile->cpap->setComplianceHours(ui->complianceHours->value());
profile->cpap->setMaskStartDate(ui->startedUsingMask->date());
profile->appearance->setGraphHeight(ui->graphHeight->value());
profile->general->setPrefCalcMiddle(ui->prefCalcMiddle->currentIndex());
profile->general->setPrefCalcMax(ui->prefCalcMax->currentIndex());
profile->general->setPrefCalcPercentile(ui->prefCalcPercentile->value());
profile->general->setCalculateRDI(ui->AddRERAtoAHI->isChecked());
profile->session->setBackupCardData(ui->createSDBackups->isChecked());
profile->session->setCompressBackupData(ui->compressSDBackups->isChecked());
profile->session->setCompressSessionData(ui->compressSessionData->isChecked());
profile->session->setCombineCloseSessions(ui->combineSlider->value());
profile->session->setIgnoreShortSessions(ui->IgnoreSlider->value());
profile->session->setDaySplitTime(ui->timeEdit->time());
profile->cpap->setClockDrift(ui->clockDrift->value());
profile->appearance->setOverlayType((OverlayDisplayType)ui->overlayFlagsCombo->currentIndex());
profile->appearance->setOverviewLinechartMode((OverviewLinechartModes)ui->overviewLinecharts->currentIndex());
profile->cpap->setLeakMode(ui->leakModeCombo->currentIndex());
profile->cpap->setMaskType((MaskType)ui->maskTypeCombo->currentIndex());
profile->oxi->setOximetryEnabled(ui->oximetryGroupBox->isChecked());
profile->oxi->setSyncOximetry(ui->oximetrySync->isChecked());
int oxigrp=ui->oximetrySync->isChecked() ? 0 : 1;
gGraphView *gv=mainwin->getDaily()->graphView();
gGraph *g=gv->findGraph(STR_TR_PulseRate);
if (g) {
g->setGroup(oxigrp);
}
g=gv->findGraph(STR_TR_SpO2);
if (g) {
g->setGroup(oxigrp);
}
g=gv->findGraph(STR_TR_Plethy);
if (g) {
g->setGroup(oxigrp);
}
profile->oxi->setOximeterType(ui->oximetryType->currentText());
profile->oxi->setSpO2DropPercentage(ui->spo2Drop->value());
profile->oxi->setSpO2DropDuration(ui->spo2DropTime->value());
profile->oxi->setPulseChangeBPM(ui->pulseChange->value());
profile->oxi->setPulseChangeDuration(ui->pulseChangeTime->value());
profile->oxi->setOxiDiscardThreshold(ui->oxiDiscardThreshold->value());
profile->cpap->setAHIWindow(ui->ahiGraphWindowSize->value());
profile->cpap->setAHIReset(ui->ahiGraphZeroReset->isChecked());
profile->cpap->setUserEventFlagging(ui->customEventGroupbox->isChecked());
profile->cpap->setUserEventDuration(ui->apneaDuration->value());
profile->cpap->setUserFlowRestriction(ui->apneaFlowRestriction->value());
profile->cpap->setUserEventDuplicates(ui->userEventDuplicates->isChecked());
PREF[STR_GEN_SkipLogin]=ui->skipLoginScreen->isChecked();
PREF[STR_GEN_UpdatesAutoCheck]=ui->automaticallyCheckUpdates->isChecked();
PREF[STR_GEN_UpdateCheckFrequency]=ui->updateCheckEvery->value();
PREF[STR_PREF_AllowEarlyUpdates]=ui->allowEarlyUpdates->isChecked();
PREF["Fonts_Application_Name"]=ui->applicationFont->currentText();
PREF["Fonts_Application_Size"]=ui->applicationFontSize->value();
PREF["Fonts_Application_Bold"]=ui->applicationFontBold->isChecked();
PREF["Fonts_Application_Italic"]=ui->applicationFontItalic->isChecked();
PREF["Fonts_Graph_Name"]=ui->graphFont->currentText();
PREF["Fonts_Graph_Size"]=ui->graphFontSize->value();
PREF["Fonts_Graph_Bold"]=ui->graphFontBold->isChecked();
PREF["Fonts_Graph_Italic"]=ui->graphFontItalic->isChecked();
PREF["Fonts_Title_Name"]=ui->titleFont->currentText();
PREF["Fonts_Title_Size"]=ui->titleFontSize->value();
PREF["Fonts_Title_Bold"]=ui->titleFontBold->isChecked();
PREF["Fonts_Title_Italic"]=ui->titleFontItalic->isChecked();
PREF["Fonts_Big_Name"]=ui->bigFont->currentText();
PREF["Fonts_Big_Size"]=ui->bigFontSize->value();
PREF["Fonts_Big_Bold"]=ui->bigFontBold->isChecked();
PREF["Fonts_Big_Italic"]=ui->bigFontItalic->isChecked();
QFont font=ui->applicationFont->currentFont();
font.setPointSize(ui->applicationFontSize->value());
font.setWeight(ui->applicationFontBold->isChecked()?QFont::Bold : QFont::Normal);
font.setItalic(ui->applicationFontItalic->isChecked());
QApplication::setFont(font);
*defaultfont=ui->graphFont->currentFont();
defaultfont->setPointSize(ui->graphFontSize->value());
defaultfont->setWeight(ui->graphFontBold->isChecked()?QFont::Bold : QFont::Normal);
defaultfont->setItalic(ui->graphFontItalic->isChecked());
*mediumfont=ui->titleFont->currentFont();
mediumfont->setPointSize(ui->titleFontSize->value());
mediumfont->setWeight(ui->titleFontBold->isChecked()?QFont::Bold : QFont::Normal);
mediumfont->setItalic(ui->titleFontItalic->isChecked());
*bigfont=ui->bigFont->currentFont();
bigfont->setPointSize(ui->bigFontSize->value());
bigfont->setWeight(ui->bigFontBold->isChecked()?QFont::Bold : QFont::Normal);
bigfont->setItalic(ui->bigFontItalic->isChecked());
// Process color changes
for (QHash<int,QColor>::iterator i=m_new_colors.begin();i!=m_new_colors.end();i++) {
schema::Channel &chan=schema::channel[i.key()];
if (!chan.isNull()) {
qDebug() << "TODO: Change" << chan.code() << "color to" << i.value();
chan.setDefaultColor(i.value());
}
}
//qDebug() << "TODO: Save channels.xml to update channel data";
{
QString filename=PROFILE.Get("{DataFolder}/ImportLocations.txt");
QFile file(filename);
file.open(QFile::WriteOnly);
QTextStream ts(&file);
for (int i=0;i<importLocations.size();i++) {
ts << importLocations[i] << endl;
//file.write(importLocations[i].toUtf8());
}
file.close();
}
//PROFILE.Save();
PREF.Save();
if (recalc_events) {
// send a signal instead?
mainwin->reprocessEvents(needs_restart);
} else if (needs_restart) {
mainwin->RestartApplication();
} else {
mainwin->getDaily()->LoadDate(mainwin->getDaily()->getDate());
}
return true;
}
void PreferencesDialog::on_combineSlider_valueChanged(int position)
{
if (position>0) {
ui->combineLCD->display(position);
} else ui->combineLCD->display(STR_GEN_Off);
}
void PreferencesDialog::on_IgnoreSlider_valueChanged(int position)
{
if (position>0) {
ui->IgnoreLCD->display(position);
} else ui->IgnoreLCD->display(STR_GEN_Off);
}
#include "mainwindow.h"
extern MainWindow * mainwin;
void PreferencesDialog::RefreshLastChecked()
{
ui->updateLastChecked->setText(PREF[STR_GEN_UpdatesLastChecked].toDateTime().toString(Qt::SystemLocaleLongDate));
}
void PreferencesDialog::on_checkForUpdatesButton_clicked()
{
mainwin->CheckForUpdates();
}
void PreferencesDialog::on_addImportLocation_clicked()
{
QString dir=QFileDialog::getExistingDirectory(this,tr("Add this Location to the Import List"),"",QFileDialog::ShowDirsOnly);
if (!dir.isEmpty()) {
if (!importLocations.contains(dir)) {
importLocations.append(dir);
importModel->setStringList(importLocations);
}
}
}
void PreferencesDialog::on_removeImportLocation_clicked()
{
if (ui->importListWidget->currentIndex().isValid()) {
QString dir=ui->importListWidget->currentIndex().data().toString();
importModel->removeRow(ui->importListWidget->currentIndex().row());
importLocations.removeAll(dir);
}
}
void PreferencesDialog::on_graphView_activated(const QModelIndex &index)
{
QString a=index.data().toString();
qDebug() << "Could do something here with" << a;
}
void PreferencesDialog::on_graphFilter_textChanged(const QString &arg1)
{
graphFilterModel->setFilterFixedString(arg1);
}
MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent)
:QSortFilterProxyModel(parent)
{
}
bool MySortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
if (source_parent == qobject_cast<QStandardItemModel*>(sourceModel())->invisibleRootItem()->index()) {
// always accept children of rootitem, since we want to filter their children
return true;
}
return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
}
void PreferencesDialog::graphModel_changed(QStandardItem * item)
{
QModelIndex index=item->index();
gGraphView *gv=NULL;
bool ok;
const QModelIndex & row=index.sibling(index.row(),0);
bool checked=row.data(Qt::CheckStateRole)!=0;
//QString name=row.data().toString();
int group=row.data(Qt::UserRole+1).toInt();
int id=row.data(Qt::UserRole+2).toInt();
switch(group) {
case 0: gv=mainwin->getDaily()->graphView(); break;
case 1: gv=mainwin->getOverview()->graphView(); break;
case 2: gv=mainwin->getOximetry()->graphView(); break;
default: ;
}
if (!gv)
return;
gGraph *graph=(*gv)[id];
if (!graph)
return;
if (graph->visible()!=checked) {
graph->setVisible(checked);
}
EventDataType val;
if (index.column()==1) {
val=index.data().toDouble(&ok);
if (!ok) {
graphModel->setData(index,QString::number(graph->rec_miny,'f',1));
ui->graphView->update();
} else {
//if ((val < graph->rec_maxy) || (val==0)) {
graph->setRecMinY(val);
/*} else {
graphModel->setData(index,QString::number(graph->rec_miny,'f',1));
ui->graphView->update();
} */
}
} else if (index.column()==2) {
val=index.data().toDouble(&ok);
if (!ok) {
graphModel->setData(index,QString::number(graph->rec_maxy,'f',1));
ui->graphView->update();
} else {
//if ((val > graph->rec_miny) || (val==0)) {
graph->setRecMaxY(val);
/*} else {
graphModel->setData(index,QString::number(graph->rec_maxy,'f',1));
ui->graphView->update();
}*/
}
}
gv->updateScale();
// qDebug() << name << checked;
}
void PreferencesDialog::resetGraphModel()
{
graphModel->clear();
QStandardItem *daily=new QStandardItem(tr("Daily Graphs"));
QStandardItem *overview=new QStandardItem(tr("Overview Graphs"));
daily->setEditable(false);
overview->setEditable(false);
graphModel->appendRow(daily);
graphModel->appendRow(overview);
ui->graphView->setAlternatingRowColors(true);
// ui->graphView->setFirstColumnSpanned(0,daily->index(),true); // Crashes on windows.. Why do I need this again?
graphModel->setColumnCount(3);
QStringList headers;
headers.append(tr("Graph"));
headers.append(STR_TR_Min);
headers.append(STR_TR_Max);
graphModel->setHorizontalHeaderLabels(headers);
ui->graphView->setColumnWidth(0,250);
ui->graphView->setColumnWidth(1,50);
ui->graphView->setColumnWidth(2,50);
gGraphView *gv=mainwin->getDaily()->graphView();
for (int i=0;i<gv->size();i++) {
QList<QStandardItem *> items;
QString title=(*gv)[i]->title();
QStandardItem *it=new QStandardItem(title);
it->setCheckable(true);
it->setCheckState((*gv)[i]->visible() ? Qt::Checked : Qt::Unchecked);
it->setEditable(false);
it->setData(0,Qt::UserRole+1);
it->setData(i,Qt::UserRole+2);
items.push_back(it);
if (title!=STR_TR_EventFlags) {
it=new QStandardItem(QString::number((*gv)[i]->rec_miny,'f',1));
it->setEditable(true);
items.push_back(it);
it=new QStandardItem(QString::number((*gv)[i]->rec_maxy,'f',1));
it->setEditable(true);
items.push_back(it);
} else {
it=new QStandardItem(tr("N/A")); // not applicable.
it->setEditable(false);
items.push_back(it);
items.push_back(it->clone());
}
daily->insertRow(i,items);
}
gv=mainwin->getOverview()->graphView();
for (int i=0;i<gv->size();i++) {
QList<QStandardItem *> items;
QStandardItem *it=new QStandardItem((*gv)[i]->title());
it->setCheckable(true);
it->setCheckState((*gv)[i]->visible() ? Qt::Checked : Qt::Unchecked);
it->setEditable(false);
items.push_back(it);
it->setData(1,Qt::UserRole+1);
it->setData(i,Qt::UserRole+2);
it=new QStandardItem(QString::number((*gv)[i]->rec_miny,'f',1));
it->setEditable(true);
items.push_back(it);
it=new QStandardItem(QString::number((*gv)[i]->rec_maxy,'f',1));
it->setEditable(true);
items.push_back(it);
overview->insertRow(i,items);
}
if (mainwin->getOximetry()) {
QStandardItem *oximetry=new QStandardItem(tr("Oximetry Graphs"));
graphModel->appendRow(oximetry);
oximetry->setEditable(false);
gv=mainwin->getOximetry()->graphView();
for (int i=0;i<gv->size();i++) {
QList<QStandardItem *> items;
QStandardItem *it=new QStandardItem((*gv)[i]->title());
it->setCheckable(true);
it->setCheckState((*gv)[i]->visible() ? Qt::Checked : Qt::Unchecked);
it->setEditable(false);
it->setData(2,Qt::UserRole+1);
it->setData(i,Qt::UserRole+2);
items.push_back(it);
it=new QStandardItem(QString::number((*gv)[i]->rec_miny,'f',1));
it->setEditable(true);
items.push_back(it);
it=new QStandardItem(QString::number((*gv)[i]->rec_maxy,'f',1));
it->setEditable(true);
items.push_back(it);
oximetry->insertRow(i,items);
}
}
connect(graphModel,SIGNAL(itemChanged(QStandardItem*)),this,SLOT(graphModel_changed(QStandardItem*)));
ui->graphView->expandAll();
}
void PreferencesDialog::on_resetGraphButton_clicked()
{
if (QMessageBox::question(this,tr("Confirmation"),tr("Are you sure you want to reset your graph preferences to the defaults?"),QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes) {
gGraphView *gv[3];
gv[0]=mainwin->getDaily()->graphView();
gv[1]=mainwin->getOverview()->graphView();
gv[2]=mainwin->getOximetry()->graphView();
for (int j=0;j<3;j++) {
if (gv[j]!=NULL) {
for (int i=0;i<gv[j]->size();i++) {
gGraph *g=(*(gv[j]))[i];
g->setRecMaxY(0);
g->setRecMinY(0);
g->setVisible(true);
}
gv[j]->updateScale();
}
}
resetGraphModel();
ui->graphView->update();
}
}
/*void PreferencesDialog::on_genOpWidget_itemActivated(QListWidgetItem *item)
{
item->setCheckState(item->checkState()==Qt::Checked ? Qt::Unchecked : Qt::Checked);
} */
void PreferencesDialog::on_maskTypeCombo_activated(int index)
{
if (index<num_masks) {
QTableWidgetItem *item;
for (int i=0;i<5;i++) {
MaskProfile & mp=masks[index];
item=ui->leakProfile->item(i,0);
QString val=QString::number(mp.pflow[i][0],'f',2);
if (!item) {
item=new QTableWidgetItem(val);
ui->leakProfile->setItem(i,0,item);
} else item->setText(val);
val=QString::number(mp.pflow[i][1],'f',2);
item=ui->leakProfile->item(i,1);
if (!item) {
item=new QTableWidgetItem(val);
ui->leakProfile->setItem(i,1,item);
} else item->setText(val);
}
}
}
void PreferencesDialog::on_createSDBackups_toggled(bool checked)
{
if (profile->session->backupCardData() && !checked) {
QList<Machine *> mach=PROFILE.GetMachines(MT_CPAP);
bool haveS9=false;
for (int i=0;i<mach.size();i++) {
if (mach[i]->GetClass()==STR_MACH_ResMed) {
haveS9=true;
break;
}
}
if (haveS9 && QMessageBox::question(this,tr("This may not be a good idea"),tr("ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).")+" "+tr("If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.")+" "+tr("If you need to conserve disk space, please remember to carry out manual backups.")+" "+tr("Are you sure you want to disable these backups?"),QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) {
ui->createSDBackups->setChecked(true);
return;
}
}
if (!checked) ui->compressSDBackups->setChecked(false);
ui->compressSDBackups->setEnabled(checked);
}
void PreferencesDialog::on_okButton_clicked()
{
if (Save())
accept();
}
void PreferencesDialog::on_scrollDampeningSlider_valueChanged(int value)
{
if (value>0)
ui->scrollDampDisplay->display(value*10);
else ui->scrollDampDisplay->display(STR_TR_Off);
}
void PreferencesDialog::on_tooltipTimeoutSlider_valueChanged(int value)
{
ui->tooltipMS->display(value*50);
}