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