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