mirror of
https://gitlab.com/pholy/OSCAR-code.git
synced 2025-04-05 02:30:44 +00:00
Stop using inconsistent PRS1 Summary duration field, added PRS1 Large Leak span
This commit is contained in:
parent
acfffbc980
commit
a6dbdf3d15
@ -149,7 +149,10 @@ void gLineOverlayBar::paint(gGraph &w, int left, int topp, int width, int height
|
||||
x1 = width + left;
|
||||
}
|
||||
|
||||
quads->add(x2, start_py, x1, start_py, x1, start_py + height, x2, start_py + height,
|
||||
quads->add(x2, start_py,
|
||||
x1, start_py,
|
||||
x1, start_py + height,
|
||||
x2, start_py + height,
|
||||
m_flag_color.rgba());
|
||||
|
||||
if (quads->full()) {
|
||||
|
@ -205,6 +205,8 @@ QString STR_TR_RespRate; // Respiratory Rate
|
||||
QString STR_TR_Snore;
|
||||
QString STR_TR_Leak;
|
||||
QString STR_TR_Leaks;
|
||||
QString STR_TR_LargeLeak;
|
||||
QString STR_TR_LL;
|
||||
QString STR_TR_TotalLeaks;
|
||||
QString STR_TR_UnintentionalLeaks;
|
||||
QString STR_TR_MaskPressure;
|
||||
@ -359,6 +361,8 @@ void initializeStrings()
|
||||
STR_TR_Snore = QObject::tr("Snore");
|
||||
STR_TR_Leak = QObject::tr("Leak");
|
||||
STR_TR_Leaks = QObject::tr("Leaks");
|
||||
STR_TR_LargeLeak = QObject::tr("Large Leak");
|
||||
STR_TR_LL = QObject::tr("LL"); // Large Leak
|
||||
STR_TR_TotalLeaks = QObject::tr("Total Leaks");
|
||||
STR_TR_UnintentionalLeaks = QObject::tr("Unintentional Leaks");
|
||||
STR_TR_MaskPressure = QObject::tr("MaskPressure");
|
||||
|
@ -212,6 +212,8 @@ extern QString STR_TR_TidalVolume;
|
||||
extern QString STR_TR_RespRate; // Respiratory Rate
|
||||
extern QString STR_TR_Snore;
|
||||
extern QString STR_TR_Leak;
|
||||
extern QString STR_TR_LargeLeak;
|
||||
extern QString STR_TR_LL;
|
||||
extern QString STR_TR_Leaks;
|
||||
extern QString STR_TR_TotalLeaks;
|
||||
extern QString STR_TR_UnintentionalLeaks;
|
||||
|
@ -721,13 +721,17 @@ bool PRS1Loader::ParseSummary(Machine *mach, qint32 sequence, quint32 timestamp,
|
||||
session->settings[PRS1_SysOneResistSet] = (int)data[offset + 0x0a] & 7;
|
||||
}
|
||||
|
||||
|
||||
// up to this point appears to be correct, everything after is pretty much crap
|
||||
// Summary files vary too much between Families/versions
|
||||
|
||||
|
||||
unsigned duration;
|
||||
|
||||
// up to this point appears to be correct for 0x01 & 0x00
|
||||
if (size < 59) {
|
||||
duration = data[offset + 0x12] | (data[offset + 0x13] << 8);
|
||||
duration *= 2;
|
||||
session->really_set_last(qint64(timestamp + duration) * 1000L);
|
||||
// duration = data[offset + 0x12] | (data[offset + 0x13] << 8);
|
||||
// duration *= 2;
|
||||
// session->really_set_last(qint64(timestamp + duration) * 1000L);
|
||||
|
||||
if (max > 0) {
|
||||
session->setMin(CPAP_Pressure, min);
|
||||
@ -737,25 +741,25 @@ bool PRS1Loader::ParseSummary(Machine *mach, qint32 sequence, quint32 timestamp,
|
||||
} else {
|
||||
|
||||
// 0X28 & 0X29 is length on r5
|
||||
if (family == 0 && familyVersion >= 4) {
|
||||
offset += 12;
|
||||
}
|
||||
// if (family == 0 && familyVersion >= 4) {
|
||||
// offset += 12;
|
||||
// }
|
||||
|
||||
// on some 60 series it's one off. or was the original 60 series patch wrong?
|
||||
// I verified this comment below against several data samples compared with encore reports.
|
||||
//duration=data[0x1B] | data[0x1C] << 8) // Session length in seconds
|
||||
|
||||
|
||||
duration = data[offset + 0x14] | (data[offset + 0x15] << 8);
|
||||
// duration = data[offset + 0x14] | (data[offset + 0x15] << 8);
|
||||
|
||||
if (!duration) {
|
||||
qDebug() << "!duration exit";
|
||||
delete session;
|
||||
return false;
|
||||
}
|
||||
// if (!duration) {
|
||||
// qDebug() << "!duration exit";
|
||||
// delete session;
|
||||
// return false;
|
||||
// }
|
||||
|
||||
session->really_set_last(qint64(timestamp + duration) * 1000L);
|
||||
float hours = float(duration) / 3600.0;
|
||||
// session->really_set_last(qint64(timestamp + duration) * 1000L);
|
||||
// float hours = float(duration) / 3600.0;
|
||||
|
||||
// Not using these because sometimes this summary is broken.
|
||||
//EventDataType minp,maxp,avgp,p90p;
|
||||
@ -765,41 +769,42 @@ bool PRS1Loader::ParseSummary(Machine *mach, qint32 sequence, quint32 timestamp,
|
||||
//p90p=float(data[offset+0x18])/10.0;
|
||||
//avgp=float(data[offset+0x19])/10.0;
|
||||
|
||||
short minp = data[offset + 0x16];
|
||||
short maxp = data[offset + 0x17];
|
||||
short medp = data[offset + 0x19];
|
||||
short p90p = data[offset + 0x18];
|
||||
// Nope.. positions are too variant between models.. calculate the hard way during machine->Save()..
|
||||
// short minp = data[offset + 0x16];
|
||||
// short maxp = data[offset + 0x17];
|
||||
// short medp = data[offset + 0x19];
|
||||
// short p90p = data[offset + 0x18];
|
||||
|
||||
if (family < 5) {
|
||||
if (minp > 0) { session->setMin(CPAP_Pressure, EventDataType(minp) * 0.10); }
|
||||
// if (family < 5) {
|
||||
// if (minp > 0) { session->setMin(CPAP_Pressure, EventDataType(minp) * 0.10); }
|
||||
// if (maxp > 0) { session->setMax(CPAP_Pressure, EventDataType(maxp) * 0.10); }
|
||||
// if (medp > 0) { session->setWavg(CPAP_Pressure, EventDataType(medp) * 0.10); } // ??
|
||||
|
||||
if (maxp > 0) { session->setMax(CPAP_Pressure, EventDataType(maxp) * 0.10); }
|
||||
|
||||
if (medp > 0) { session->setWavg(CPAP_Pressure, EventDataType(medp) * 0.10); } // ??
|
||||
|
||||
session->m_gain[CPAP_Pressure] = 0.1;
|
||||
session->m_valuesummary[CPAP_Pressure][minp] = 5;
|
||||
session->m_valuesummary[CPAP_Pressure][medp] = 46;
|
||||
session->m_valuesummary[CPAP_Pressure][p90p] = 44;
|
||||
session->m_valuesummary[CPAP_Pressure][maxp] = 5;
|
||||
}
|
||||
// session->m_gain[CPAP_Pressure] = 0.1;
|
||||
// session->m_valuesummary[CPAP_Pressure][minp] = 5;
|
||||
// session->m_valuesummary[CPAP_Pressure][medp] = 46;
|
||||
// session->m_valuesummary[CPAP_Pressure][p90p] = 44;
|
||||
// session->m_valuesummary[CPAP_Pressure][maxp] = 5;
|
||||
// }
|
||||
|
||||
// if (p90p>0) {
|
||||
// session->set90p(CPAP_Pressure,p90p);
|
||||
// }
|
||||
|
||||
int oc, cc, hc, rc, fc;
|
||||
session->setCount(CPAP_Obstructive, oc = (int)data[offset + 0x1C] | (data[offset + 0x1D] << 8));
|
||||
session->setCount(CPAP_ClearAirway, cc = (int)data[offset + 0x20] | (data[offset + 0x21] << 8));
|
||||
session->setCount(CPAP_Hypopnea, hc = (int)data[offset + 0x2A] | (data[offset + 0x2B] << 8));
|
||||
session->setCount(CPAP_RERA, rc = (int)data[offset + 0x2E] | (data[offset + 0x2F] << 8));
|
||||
session->setCount(CPAP_FlowLimit, fc = (int)data[offset + 0x30] | (data[offset + 0x31] << 8));
|
||||
// I can't rely on the position of any of this!
|
||||
|
||||
session->setCph(CPAP_Obstructive, float(oc / hours));
|
||||
session->setCph(CPAP_ClearAirway, float(cc / hours));
|
||||
session->setCph(CPAP_Hypopnea, float(hc / hours));
|
||||
session->setCph(CPAP_RERA, float(rc / hours));
|
||||
session->setCph(CPAP_FlowLimit, float(fc / hours));
|
||||
// int oc, cc, hc, rc, fc;
|
||||
// session->setCount(CPAP_Obstructive, oc = (int)data[offset + 0x1C] | (data[offset + 0x1D] << 8));
|
||||
// session->setCount(CPAP_ClearAirway, cc = (int)data[offset + 0x20] | (data[offset + 0x21] << 8));
|
||||
// session->setCount(CPAP_Hypopnea, hc = (int)data[offset + 0x2A] | (data[offset + 0x2B] << 8));
|
||||
// session->setCount(CPAP_RERA, rc = (int)data[offset + 0x2E] | (data[offset + 0x2F] << 8));
|
||||
// session->setCount(CPAP_FlowLimit, fc = (int)data[offset + 0x30] | (data[offset + 0x31] << 8));
|
||||
|
||||
// session->setCph(CPAP_Obstructive, float(oc / hours));
|
||||
// session->setCph(CPAP_ClearAirway, float(cc / hours));
|
||||
// session->setCph(CPAP_Hypopnea, float(hc / hours));
|
||||
// session->setCph(CPAP_RERA, float(rc / hours));
|
||||
// session->setCph(CPAP_FlowLimit, float(fc / hours));
|
||||
}
|
||||
|
||||
// Set recommended Graph values..
|
||||
@ -1416,16 +1421,17 @@ bool PRS1Loader::Parse002(qint32 sequence, quint32 timestamp, unsigned char *buf
|
||||
//session->AddEvent(new Event(t,CPAP_CSR, data, 2));
|
||||
break;
|
||||
|
||||
case 0x10: // Unknown
|
||||
data[0] = buffer[pos++]; // << 8) | buffer[pos];
|
||||
case 0x10: // Unknown, Large Leak
|
||||
data[0] = buffer[pos + 1] << 8 | buffer[pos];
|
||||
pos += 2;
|
||||
data[1] = buffer[pos++];
|
||||
data[2] = buffer[pos++];
|
||||
|
||||
if (!Code[20]) {
|
||||
if (!(Code[20] = session->AddEventList(PRS1_10, EVL_Event))) { return false; }
|
||||
}
|
||||
|
||||
Code[20]->AddEvent(t, data[0]);
|
||||
tt = t - qint64(data[1]) * 1000L;
|
||||
Code[20]->AddEvent(tt, data[0]);
|
||||
break;
|
||||
|
||||
case 0x0f: // Cheyne Stokes Respiration
|
||||
@ -1653,6 +1659,11 @@ bool PRS1Loader::OpenFile(Machine *mach, QString filename)
|
||||
|
||||
bool PRS1Loader::OpenWaveforms(SessionID sid, QString filename)
|
||||
{
|
||||
|
||||
if (sid == 1532) {
|
||||
int i=5;
|
||||
}
|
||||
|
||||
Session *session = new_sessions[sid];
|
||||
//int sequence,seconds,br,htype,version,numsignals;
|
||||
QFile file(filename);
|
||||
@ -1788,7 +1799,7 @@ bool PRS1Loader::OpenWaveforms(SessionID sid, QString filename)
|
||||
wdur[i] += diff;
|
||||
}
|
||||
|
||||
} else if (diff > 0 && wlength[0] > 0) {
|
||||
} else if ((diff > 0) && (wlength[0] > 0)) {
|
||||
qDebug() << "Timestamp resync" << block << diff << corrupt << duration << timestamp - lasttimestamp
|
||||
<< filename;
|
||||
|
||||
@ -1821,7 +1832,7 @@ bool PRS1Loader::OpenWaveforms(SessionID sid, QString filename)
|
||||
//a->setMin(v*5);
|
||||
}
|
||||
|
||||
session->updateLast(start + (qint64(wdur[i]) * 1000L));
|
||||
session->updateLast((start + qint64(wdur[i])) * 1000L);
|
||||
wlength[i] = 0;
|
||||
wdur[i] = 0;
|
||||
}
|
||||
@ -1881,7 +1892,7 @@ bool PRS1Loader::OpenWaveforms(SessionID sid, QString filename)
|
||||
} else if (wc[i] == CPAP_MaskPressure) {
|
||||
}
|
||||
|
||||
session->updateLast(start + qint64(wdur[i]) * 1000L);
|
||||
session->updateLast((start + qint64(wdur[i])) * 1000L);
|
||||
}
|
||||
|
||||
// lousy family 5 check to see if already has RespRate
|
||||
|
@ -23,7 +23,7 @@
|
||||
//********************************************************************************************
|
||||
// Please INCREMENT the following value when making changes to this loaders implementation.
|
||||
//
|
||||
const int prs1_data_version = 10;
|
||||
const int prs1_data_version = 11;
|
||||
//
|
||||
//********************************************************************************************
|
||||
|
||||
|
@ -189,10 +189,19 @@ void init()
|
||||
"PressurePulse", QObject::tr("Pressure Pulse"),
|
||||
QObject::tr("A pulse of pressure 'pinged' to detect a closed airway."),
|
||||
QObject::tr("PP"), QObject::tr("events/hr"), DEFAULT, QColor("dark red")));
|
||||
|
||||
// This Large Leak record is just a flag marker, used by Intellipap for one
|
||||
schema::channel.add(GRP_CPAP, new Channel(CPAP_LeakFlag = 0x100a, DATA, SESSION,
|
||||
"LeakFlag", QObject::tr("Large Leak"),
|
||||
QObject::tr("A large mask leak affecting machine performance."),
|
||||
QObject::tr("LL"), QObject::tr("events/hr"), DEFAULT, QColor("dark blue")));
|
||||
QObject::tr("LL"), QObject::tr("events/hr"), DEFAULT, QColor("light gray")));
|
||||
|
||||
// The following is a Large Leak record that references a waveform span
|
||||
schema::channel.add(GRP_CPAP, new Channel(PRS1_10 = 0x1158, DATA, SESSION,
|
||||
"LeakFlagSpan", QObject::tr("Large Leak"),
|
||||
QObject::tr("A large mask leak affecting machine performance."),
|
||||
QObject::tr("LL"), QObject::tr("events/hr"), DEFAULT, QColor("light gray")));
|
||||
|
||||
schema::channel.add(GRP_CPAP, new Channel(CPAP_NRI = 0x100b, DATA, SESSION, "NRI",
|
||||
QObject::tr("Non Responding Event"),
|
||||
QObject::tr("A type of respiratory event that won't respond to a pressure increase."),
|
||||
@ -420,7 +429,6 @@ void init()
|
||||
PRS1_0C = schema::channel["PRS1_0C"].id();
|
||||
PRS1_0E = schema::channel["PRS1_0E"].id();
|
||||
PRS1_0F = schema::channel["PRS1_0F"].id();
|
||||
PRS1_10 = schema::channel["PRS1_10"].id();
|
||||
PRS1_12 = schema::channel["PRS1_12"].id();
|
||||
PRS1_FlexMode = schema::channel["FlexMode"].id();
|
||||
PRS1_FlexSet = schema::channel["FlexSet"].id();
|
||||
|
@ -68,6 +68,7 @@ QColor COLOR_Hypopnea = Qt::blue;
|
||||
QColor COLOR_Obstructive = COLOR_Aqua;
|
||||
QColor COLOR_Apnea = Qt::darkGreen;
|
||||
QColor COLOR_CSR = COLOR_LightGreen;
|
||||
QColor COLOR_LargeLeak = COLOR_LightGray;
|
||||
QColor COLOR_ClearAirway = QColor("#b254cd");
|
||||
QColor COLOR_RERA = COLOR_Gold;
|
||||
QColor COLOR_VibratorySnore = QColor("#ff4040");
|
||||
|
@ -23,6 +23,7 @@ extern QColor COLOR_Hypopnea;
|
||||
extern QColor COLOR_Obstructive;
|
||||
extern QColor COLOR_Apnea;
|
||||
extern QColor COLOR_CSR;
|
||||
extern QColor COLOR_LargeLeak;
|
||||
extern QColor COLOR_ClearAirway;
|
||||
extern QColor COLOR_RERA;
|
||||
extern QColor COLOR_VibratorySnore;
|
||||
|
@ -184,7 +184,9 @@ Daily::Daily(QWidget *parent,gGraphView * shared)
|
||||
|
||||
gFlagsGroup *fg=new gFlagsGroup();
|
||||
SF->AddLayer(AddCPAP(fg));
|
||||
fg->AddLayer((new gFlagsLine(CPAP_CSR, COLOR_CSR, STR_TR_PB,false,FT_Span)));
|
||||
fg->AddLayer((new gFlagsLine(CPAP_CSR, COLOR_CSR, STR_TR_PB, false, FT_Span)));
|
||||
fg->AddLayer((new gFlagsLine(PRS1_10, COLOR_LargeLeak, STR_TR_LL, false, FT_Span)));
|
||||
|
||||
fg->AddLayer((new gFlagsLine(CPAP_ClearAirway, COLOR_ClearAirway, STR_TR_CA,false)));
|
||||
fg->AddLayer((new gFlagsLine(CPAP_Obstructive, COLOR_Obstructive, STR_TR_OA,true)));
|
||||
fg->AddLayer((new gFlagsLine(CPAP_Apnea, COLOR_Apnea, STR_TR_UA)));
|
||||
@ -215,7 +217,8 @@ Daily::Daily(QWidget *parent,gGraphView * shared)
|
||||
gLineOverlaySummary *los=new gLineOverlaySummary(tr("Selection AHI"),5,-4);
|
||||
AddCPAP(l);
|
||||
FRW->AddLayer(new gXGrid());
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_CSR, COLOR_CSR, STR_TR_CSR,FT_Span)));
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_CSR, COLOR_CSR, STR_TR_CSR, FT_Span)));
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(PRS1_10, COLOR_LargeLeak, STR_TR_LL, FT_Span)));
|
||||
FRW->AddLayer(l);
|
||||
FRW->AddLayer(new gYAxis(),LayerLeft,gYAxis::Margin);
|
||||
FRW->AddLayer(new gXAxis(),LayerBottom,0,20);
|
||||
@ -223,13 +226,12 @@ Daily::Daily(QWidget *parent,gGraphView * shared)
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_PressurePulse,COLOR_PressurePulse,STR_TR_PP,FT_Dot)));
|
||||
//FRW->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_Pressure, COLOR_White,STR_TR_P,FT_Dot)));
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(PRS1_0B,COLOR_Blue,"0B",FT_Dot)));
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(PRS1_10,COLOR_Orange,"10",FT_Dot)));
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(PRS1_0E,COLOR_DarkRed,"0E",FT_Dot)));
|
||||
if (PROFILE.general->calculateRDI())
|
||||
if (PROFILE.general->calculateRDI()) {
|
||||
FRW->AddLayer(AddCPAP(los->add(new gLineOverlayBar(CPAP_RERA, COLOR_RERA, STR_TR_RE))));
|
||||
else
|
||||
} else {
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_RERA, COLOR_RERA, STR_TR_RE)));
|
||||
|
||||
}
|
||||
FRW->AddLayer(AddCPAP(los->add(new gLineOverlayBar(CPAP_Apnea, COLOR_Apnea, STR_TR_UA))));
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_VSnore, COLOR_VibratorySnore, STR_TR_VS)));
|
||||
FRW->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_FlowLimit, COLOR_FlowLimit, STR_TR_FL)));
|
||||
@ -1286,8 +1288,8 @@ void Daily::Load(QDate date)
|
||||
{ CPAP_VSnore, COLOR_VibratorySnore, Qt::black, vs=cpap->count(CPAP_VSnore)/cpap->hours() },
|
||||
{ CPAP_VSnore2, COLOR_VibratorySnore, Qt::black, vs2=cpap->count(CPAP_VSnore2)/cpap->hours() },
|
||||
{ CPAP_LeakFlag, COLOR_LeakFlag, Qt::black, lki=cpap->count(CPAP_LeakFlag)/hours },
|
||||
{ PRS1_10, COLOR_LeakFlag, Qt::black, lk2=cpap->count(PRS1_10)/hours },
|
||||
{ CPAP_CSR, COLOR_CSR, Qt::black, csr=(100.0/cpap->hours())*(cpap->sum(CPAP_CSR)/3600.0) }
|
||||
{ PRS1_10, COLOR_LargeLeak, Qt::black, lk2=(100.0/cpap->hours())*(cpap->sum(PRS1_10)/3600.0) },
|
||||
{ CPAP_CSR, COLOR_CSR, Qt::black, csr=(100.0/cpap->hours())*(cpap->sum(CPAP_CSR)/3600.0) }
|
||||
};
|
||||
int numchans=sizeof(chans)/sizeof(ChannelInfo);
|
||||
|
||||
|
@ -8,9 +8,9 @@ Important: One id code per item, DO NOT CHANGE ID NUMBERS!!!
|
||||
<channels language="en" version="1.0">
|
||||
<group name="CPAP">
|
||||
<!-- Channel List -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<channel id="0x111e" class="data" name="TestChan1" details="Respiratory Rate" label="Mark's Resp. Rate" unit="breaths/min" color="black"/>
|
||||
<channel id="0x111f" class="data" name="TestChan2" details="Tidal Volume" label="Tidal Volume" unit="L/min" color="blue"/>
|
||||
|
||||
@ -22,7 +22,6 @@ Important: One id code per item, DO NOT CHANGE ID NUMBERS!!!
|
||||
<channel id="0x1155" class="data" name="PRS1_0B" details="Unknown 0B" label="U0B" unit="?" color="light blue"/>
|
||||
<channel id="0x1156" class="data" name="PRS1_0C" details="Unknown 0C" label="U0C" unit="?" color="black"/>
|
||||
<channel id="0x1157" class="data" name="PRS1_0E" details="Unknown 0E" label="U0E" unit="?" color="dark green"/>
|
||||
<channel id="0x1158" class="data" name="PRS1_10" details="Unknown 10" label="U10" unit="?" color="black"/>
|
||||
<channel id="0x1159" class="data" name="PRS1_12" details="PRS1 Unknown 12" label="U12" unit="" color="black"/>
|
||||
<channel id="0x1160" class="data" name="RMS9_E01" details="RMS9 Empty 1" label="E01" unit="" color="black"/>
|
||||
<channel id="0x1161" class="data" name="RMS9_E02" details="RMS9 Empty 2" label="E02" unit="" color="black"/>
|
||||
|
@ -317,7 +317,6 @@ void MainWindow::Startup()
|
||||
#ifdef Q_OS_UNIX
|
||||
# include <stdio.h>
|
||||
# include <unistd.h>
|
||||
# include <sys/statfs.h>
|
||||
|
||||
# if defined(Q_OS_MAC) || defined(Q_OS_BSD4)
|
||||
# include <sys/mount.h>
|
||||
@ -502,7 +501,7 @@ void MainWindow::on_action_Import_Data_triggered()
|
||||
QLabel label(tr("Please wait, SleepyHead is importing data..."));
|
||||
layout.addWidget(&label,1);
|
||||
layout.addWidget(qprogress,1);
|
||||
dlg.show();
|
||||
//dlg.show();
|
||||
for (int i = 0; i < importFrom.size(); i++) {
|
||||
QString dir = importFrom[i];
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user