v2.0.0
Loading...
Searching...
No Matches
bidsviewmodel.cpp
Go to the documentation of this file.
1//=============================================================================================================
13
14//=============================================================================================================
15// INCLUDES
16//=============================================================================================================
17
18#include "bidsviewmodel.h"
19#include <iostream>
20
21//=============================================================================================================
22// QT INCLUDES
23//=============================================================================================================
24
25#include <QtDebug>
26
27//=============================================================================================================
28// USED NAMESPACES
29//=============================================================================================================
30
31using namespace DISPLIB;
32
33//=============================================================================================================
34// DEFINE MEMBER METHODS
35//=============================================================================================================
36
38: QStandardItemModel(pParent)
39{
40}
41
42//=============================================================================================================
43
47
48//=============================================================================================================
49
50void BidsViewModel::addData(QModelIndex selectedItem,
51 QStandardItem* pNewItem,
52 int iDataType)
53{
54 switch (iDataType) {
58 if (!selectedItem.isValid()) {
59 addDataToSession(addSessionToSubject(addSubject("sub-01"), "ses-01"), pNewItem, iDataType);
60 } else {
61 if (itemFromIndex(selectedItem)->data(BIDS_ITEM_TYPE).value<int>() != BIDS_SUBJECT) {
62 addDataToSession(itemFromIndex(selectedItem)->data(BIDS_ITEM_SESSION).value<QModelIndex>(),
63 pNewItem,
64 iDataType);
65 } else {
66 qDebug() << "[BidsViewModel::addData] Prompt user to select a session";
67 }
68 }
69 break;
70 }
71 case BIDS_EVENT:
72 case BIDS_AVERAGE: {
73 if (!selectedItem.isValid()) {
74 QStandardItem* pItem = new QStandardItem("Unknown");
75 pItem->setEditable(false);
76 pItem->setDragEnabled(true);
77
78 addDataToSession(addSessionToSubject(addSubject("sub-01"), "ses-01"), pItem, BIDS_UNKNOWN);
79 addToData(pNewItem,
80 indexFromItem(pItem),
81 iDataType);
82 } else {
83 addToData(pNewItem,
84 selectedItem,
85 iDataType);
86 }
87 break;
88 }
89 }
90}
91
92//=============================================================================================================
93
94void BidsViewModel::addToData(QStandardItem* pNewAvgItem,
95 const QModelIndex& parentIndex,
96 int iDataType)
97{
98 QStandardItem* selectedData = itemFromIndex(parentIndex);
99 selectedData->setChild(selectedData->rowCount(),
100 pNewAvgItem);
101
102 pNewAvgItem->setData(itemFromIndex(parentIndex)->data(BIDS_ITEM_SUBJECT), BIDS_ITEM_SUBJECT);
103 pNewAvgItem->setData(itemFromIndex(parentIndex)->data(BIDS_ITEM_SESSION), BIDS_ITEM_SESSION);
104 pNewAvgItem->setData(QVariant::fromValue(iDataType), BIDS_ITEM_TYPE);
105
106 emit newItemIndex(pNewAvgItem->index());
107}
108
109//=============================================================================================================
110
111QModelIndex BidsViewModel::addSubject(const QString& sSubjectName)
112{
113 //Ensure subject name follow BIDS format
114 QString sNewSubjectName;
115
116 if (!sSubjectName.startsWith("sub-")) {
117 sNewSubjectName = "sub-" + sSubjectName;
118 } else {
119 sNewSubjectName = sSubjectName;
120 }
121
122 sNewSubjectName.remove(" ");
123
124 //Add subject to model
125 QStandardItem* pSubjectItem = new QStandardItem(sNewSubjectName);
126 appendRow(pSubjectItem);
127
128 pSubjectItem->setData(QVariant::fromValue(BIDS_SUBJECT), BIDS_ITEM_TYPE);
129 pSubjectItem->setData(QVariant::fromValue(pSubjectItem->index()), BIDS_ITEM_SUBJECT);
130
131 emit newItemIndex(pSubjectItem->index());
132
133 return pSubjectItem->index();
134}
135
136//=============================================================================================================
137
138QModelIndex BidsViewModel::addSessionToSubject(const QString& sSubjectName,
139 const QString& sSessionName)
140{
141 //Ensure session name follow BIDS format
142 QString sNewSessionName;
143
144 if (!sSessionName.startsWith("ses-")) {
145 sNewSessionName = "ses-" + sSessionName;
146 } else {
147 sNewSessionName = sSessionName;
148 }
149
150 sNewSessionName.remove(" ");
151
152 QList<QStandardItem*> listItems = findItems(sSubjectName);
153 bool bRepeat = false;
154
155 //Check for repeated names, no names
156 if (listItems.size() > 1) {
157 qWarning() << "[BidsViewModel::addSessionToSubject] Multiple subjects with same name";
158 bRepeat = true;
159 } else if (listItems.size() == 0) {
160 qWarning() << "[BidsViewModel::addSessionToSubject] No Subject found with name:" << sSubjectName;
161 return QModelIndex();
162 }
163
164 // Stays null when the loop body never runs, which the return below guards
165 // against; dereferencing it unconditionally would be undefined.
166 QStandardItem* pNewSessionItem = nullptr;
167
168 //Add session to subjects with mathcing names. Renames them if multiple.
169 for (int i = 0; i < listItems.size(); i++) {
170 QStandardItem* pSubjectItem = listItems.at(i);
171
172 if (bRepeat) {
173 pSubjectItem->setText(pSubjectItem->text() + QString::number(i + 1));
174 }
175
176 pNewSessionItem = new QStandardItem(sNewSessionName);
177 pSubjectItem->setChild(pSubjectItem->rowCount(),
178 pNewSessionItem);
179
180 pNewSessionItem->setData(QVariant::fromValue(BIDS_SESSION), BIDS_ITEM_TYPE);
181 pNewSessionItem->setData(QVariant::fromValue(pSubjectItem->index()), BIDS_ITEM_SUBJECT);
182 pNewSessionItem->setData(QVariant::fromValue(pNewSessionItem->index()), BIDS_ITEM_SESSION);
183
184 emit newItemIndex(pNewSessionItem->index());
185 }
186
187 if (!pNewSessionItem) {
188 return QModelIndex();
189 }
190
191 return pNewSessionItem->index();
192}
193
194//=============================================================================================================
195
196QModelIndex BidsViewModel::addSessionToSubject(QModelIndex subjectIndex,
197 const QString& sSessionName)
198{
199 //Ensure session name follow BIDS format
200 QString sNewSessionName;
201
202 if (!sSessionName.startsWith("ses-")) {
203 sNewSessionName = "ses-" + sSessionName;
204 } else {
205 sNewSessionName = sSessionName;
206 }
207
208 sNewSessionName.remove(" ");
209
210 QStandardItem* pSubjectItem = itemFromIndex(subjectIndex);
211 QStandardItem* pNewSessionItem = new QStandardItem(sNewSessionName);
212 pSubjectItem->setChild(pSubjectItem->rowCount(),
213 pNewSessionItem);
214
215 pNewSessionItem->setData(QVariant::fromValue(BIDS_SESSION), BIDS_ITEM_TYPE);
216 pNewSessionItem->setData(QVariant::fromValue(subjectIndex), BIDS_ITEM_SUBJECT);
217 pNewSessionItem->setData(QVariant::fromValue(pNewSessionItem->index()), BIDS_ITEM_SESSION);
218
219 emit newItemIndex(pNewSessionItem->index());
220
221 return pNewSessionItem->index();
222}
223
224//=============================================================================================================
225
226QModelIndex BidsViewModel::addDataToSession(QModelIndex sessionIndex,
227 QStandardItem* pNewItem,
228 int iDataType)
229{
230 QStandardItem* pSessionItem = itemFromIndex(sessionIndex);
231 bool bFolder = false;
232 int iFolder;
233
234 QString sFolderName;
235
236 switch (iDataType) {
238 sFolderName = "func";
239 break;
241 sFolderName = "anat";
242 break;
244 sFolderName = "beh";
245 break;
246 default:
247 sFolderName = "unknown";
248 }
249
250 for (iFolder = 0; iFolder < pSessionItem->rowCount(); iFolder++) {
251 if (pSessionItem->child(iFolder)->text() == sFolderName) {
252 bFolder = true;
253 break;
254 }
255 }
256
257 if (!bFolder) {
258 QStandardItem* pFunctionalItem = new QStandardItem(sFolderName);
259 pFunctionalItem->setData(QVariant::fromValue(BIDS_FOLDER), BIDS_ITEM_TYPE);
260 pFunctionalItem->setData(QVariant::fromValue(sessionIndex), BIDS_ITEM_SESSION);
261 pFunctionalItem->setData(itemFromIndex(sessionIndex)->data(BIDS_ITEM_SUBJECT), BIDS_ITEM_SUBJECT);
262
263 pSessionItem->setChild(pSessionItem->rowCount(),
264 pFunctionalItem);
265 pFunctionalItem->setChild(pFunctionalItem->rowCount(),
266 pNewItem);
267 } else {
268 pSessionItem->child(iFolder)->setChild(pSessionItem->child(iFolder)->rowCount(),
269 pNewItem);
270 }
271
272 pNewItem->setData(QVariant::fromValue(iDataType), BIDS_ITEM_TYPE);
273 pNewItem->setData(QVariant::fromValue(sessionIndex), BIDS_ITEM_SESSION);
274 pNewItem->setData(itemFromIndex(sessionIndex)->data(BIDS_ITEM_SUBJECT), BIDS_ITEM_SUBJECT);
275
276 emit newItemIndex(pNewItem->index());
277
278 return pNewItem->index();
279}
280
281//=============================================================================================================
282
283QModelIndex BidsViewModel::moveSessionToSubject(QModelIndex subjectIndex,
284 QModelIndex sessionIndex)
285{
286 beginResetModel();
287
288 QStandardItem* subjectItem = itemFromIndex(subjectIndex);
289 QStandardItem* sessionItem = itemFromIndex(sessionIndex);
290
291 sessionItem->parent()->takeRow(sessionItem->row());
292
293 subjectItem->setChild(subjectItem->rowCount(), sessionItem);
294 subjectItem->setData(subjectIndex, BIDS_ITEM_SUBJECT);
295
296 for (int i = 0; i < sessionItem->rowCount(); i++) {
297 sessionItem->child(i)->setData(subjectIndex, BIDS_ITEM_SUBJECT);
298 for (int j = 0; j < sessionItem->child(i)->rowCount(); j++) {
299 sessionItem->child(i)->child(j)->setData(subjectIndex, BIDS_ITEM_SUBJECT);
300 }
301 }
302
303 endResetModel();
304
305 emit newItemIndex(sessionItem->index());
306
307 return sessionItem->index();
308}
309
310//=============================================================================================================
311
312QModelIndex BidsViewModel::moveDataToSession(QModelIndex sessionIndex,
313 QModelIndex dataIndex)
314{
315 beginResetModel();
316
317 QStandardItem* dataItem = itemFromIndex(dataIndex);
318
319 if (dataItem->parent()->rowCount() < 2) {
320 QStandardItem* parent = dataItem->parent();
321
322 dataItem->parent()->takeRow(dataItem->row()).first();
323 parent->parent()->takeRow(parent->row()).first();
324 } else {
325 dataItem->parent()->takeRow(dataItem->row()).first();
326 }
327
328 QModelIndex newIndex;
329 // switch(dataItem->data(ITEM_TYPE).value<int>()){
330 // case FUNCTIONALDATA:{
331 // newIndex = addDataToSession(sessionIndex,
332 // dataItem,
333 // FUNCTIONALDATA);
334 // break;
335 // }
336 // default:{
337 // qWarning() << "[BidsViewModel::moveDataToSession] Move not supported for this type of data";
338 // }
339 // }
340
341 newIndex = addDataToSession(sessionIndex,
342 dataItem,
343 dataItem->data(BIDS_ITEM_TYPE).value<int>());
344
345 endResetModel();
346
347 emit newItemIndex(sessionIndex);
348 emit newItemIndex(newIndex);
349
350 return newIndex;
351}
352
353//=============================================================================================================
354
355bool BidsViewModel::removeItem(QModelIndex itemIndex)
356{
357 if (!itemIndex.isValid()) {
358 return false;
359 }
360
361 beginResetModel();
362
363 QStandardItem* pItem = itemFromIndex(itemIndex);
364
365 qInfo() << "Deleting" << pItem->text();
366
367 switch (pItem->data(BIDS_ITEM_TYPE).value<int>()) {
368 case BIDS_SUBJECT:
369 if (removeRows(itemIndex.row(), 1, itemIndex.parent())) {
370 endResetModel();
371 }
372 return true;
373 case BIDS_SESSION:
374 if (removeRows(itemIndex.row(), 1, itemIndex.parent())) {
375 endResetModel();
376 }
377 return true;
381 if (removeRows(itemIndex.row(), 1, itemIndex.parent())) {
382 endResetModel();
383 }
384 return true;
385 case BIDS_AVERAGE:
386 case BIDS_EVENT:
387 case BIDS_DIPOLE:
388 if (removeRows(itemIndex.row(), 1, itemIndex.parent())) {
389 endResetModel();
390 }
391 return true;
392 default:
393 if (removeRows(itemIndex.row(), 1, itemIndex.parent())) {
394 endResetModel();
395 }
396 return true;
397 }
398}
QStandardItemModel mirroring the BIDS dataset hierarchy (subjects / sessions / runs / derivatives).
#define BIDS_ITEM_SESSION
#define BIDS_ITEM_SUBJECT
#define BIDS_ITEM_TYPE
#define BIDS_FOLDER
#define BIDS_BEHAVIORALDATA
#define BIDS_FUNCTIONALDATA
#define BIDS_SUBJECT
#define BIDS_SESSION
#define BIDS_AVERAGE
#define BIDS_ANATOMICALDATA
#define BIDS_UNKNOWN
#define BIDS_DIPOLE
#define BIDS_EVENT
2-D display widgets and visualisation helpers (charts, topography, colour maps).
QModelIndex addDataToSession(QModelIndex sessionIndex, QStandardItem *pNewItem, int iDataType)
bool removeItem(QModelIndex itemIndex)
BidsViewModel(QObject *pParent=nullptr)
QModelIndex moveSessionToSubject(QModelIndex subjectIndex, QModelIndex sessionIndex)
void newItemIndex(QModelIndex itemIndex)
QModelIndex moveDataToSession(QModelIndex sessionIndex, QModelIndex dataIndex)
QModelIndex addSubject(const QString &sSubjectName)
void addToData(QStandardItem *pNewItem, const QModelIndex &parentIndex, int iDataType)
QModelIndex addSessionToSubject(const QString &sSubjectName, const QString &sSessionName)
void addData(QModelIndex selectedItem, QStandardItem *pNewItem, int iDataType)