19#include "ui_bidsview.h"
28#include <QStandardItemModel>
33#include <QInputDialog>
47, m_pUi(new Ui::BidsViewWidget)
50 m_pUi->m_pTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
51 connect(m_pUi->m_pTreeView, &QTreeView::customContextMenuRequested,
52 this, &BidsView::customMenuRequested, Qt::UniqueConnection);
66 m_pUi->m_pTreeView->setModel(pModel);
68 connect(m_pUi->m_pTreeView->selectionModel(), &QItemSelectionModel::selectionChanged,
69 this, &BidsView::onCurrentItemChanged, Qt::UniqueConnection);
73 this, &BidsView::onNewItemIndex);
81 connect(
this, SIGNAL(
onAddSession(QModelIndex,
const QString&)),
82 pBidsModel, SLOT(addSessionToSubject(QModelIndex,
const QString&)));
91 connect(pBidsModel, &BidsViewModel::modelReset,
92 this, &BidsView::onModelReset);
97void BidsView::customMenuRequested(QPoint pos)
99 QString sToolTip = m_pUi->m_pTreeView->model()->data(m_pUi->m_pTreeView->indexAt(pos), Qt::ToolTipRole).toString();
103 QAction* pRemoveAction;
105 if(m_pUi->m_pTreeView->indexAt(pos).isValid()){
106 QStandardItem* pItem = pModel->itemFromIndex(m_pUi->m_pTreeView->indexAt(pos));
110 QMenu *menu =
new QMenu(
this);
112 QAction* pAddSessionAction =
new QAction(
"Add Session",
this);
113 connect(pAddSessionAction, &QAction::triggered, [=,
this]() {
115 QString text = QInputDialog::getText(
this, tr(
"Adding Session"),
116 tr(
"Please name new session:"), QLineEdit::Normal,
118 if (ok && !text.isEmpty()){
123 pRemoveAction =
new QAction(
"Remove Subject",
this);
125 menu->addAction(pAddSessionAction);
126 menu->addAction(pRemoveAction);
127 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
131 QMenu *menu =
new QMenu(
this);
133 pRemoveAction =
new QAction(
"Remove Session",
this);
135 QMenu* pMoveMenu =
new QMenu(
"Move Session to ...");
138 for(
int i = 0; i < pModel->rowCount(); i++){
139 if(pModel->item(i)->index() != pItem->data(
BIDS_ITEM_SUBJECT).value<QModelIndex>()){
140 qDebug() <<
"Relative model index" << pModel->item(i)->index();
141 qDebug() <<
"Relative item index" << pItem->data(
BIDS_ITEM_SUBJECT).value<QModelIndex>();
142 QAction* pTargetAction =
new QAction(pModel->item(i)->text());
143 connect(pTargetAction, &QAction::triggered, [=,
this] () {
144 emit
onMoveSession(pModel->item(i)->index(), pItem->index());
146 pMoveMenu->addAction(pTargetAction);
150 if (!pMoveMenu->isEmpty()){
151 menu->addMenu(pMoveMenu);
153 menu->addAction(pRemoveAction);
154 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
160 QMenu *menu =
new QMenu(
this);
162 pRemoveAction =
new QAction(
"Remove Data",
this);
164 QMenu* pMoveMenu =
new QMenu(
"Move Data to ...");
167 for(
int i = 0; i < pModel->rowCount(); i++){
168 QMenu* pSubjectMenu =
new QMenu(pModel->item(i)->text());
169 for (
int j = 0; j < pModel->item(i)->rowCount(); j++){
170 if(pModel->item(i)->child(j)->index() != pItem->data(
BIDS_ITEM_SESSION).value<QModelIndex>()){
171 QAction* pTargetAction =
new QAction(pModel->item(i)->child(j)->text());
172 connect(pTargetAction, &QAction::triggered, [=,
this] {
173 emit
onMoveData(pModel->item(i)->child(j)->index(), pItem->index());
175 pSubjectMenu->addAction(pTargetAction);
178 if(!pSubjectMenu->isEmpty()){
179 pMoveMenu->addMenu(pSubjectMenu);
183 if (!pMoveMenu->isEmpty()){
184 menu->addMenu(pMoveMenu);
186 menu->addAction(pRemoveAction);
187 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
191 qDebug() <<
"DataManagerControlView::customMenuRequested - default";
192 QMenu *menu =
new QMenu(
this);
194 pRemoveAction =
new QAction(
"Remove",
this);
195 menu->addAction(pRemoveAction);
196 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
200 connect(pRemoveAction, &QAction::triggered, [=,
this]() {
203 msgBox.setText(
"Are you sure you want to remove " + pItem->text() +
"?");
204 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
205 msgBox.setDefaultButton(QMessageBox::No);
207 int ret = msgBox.exec();
209 if(ret == QMessageBox::Yes) {
210 emit
removeItem(m_pUi->m_pTreeView->indexAt(pos));
214 QMenu *menu =
new QMenu(
this);
216 QAction* pAddSubjectAction =
new QAction(
"Add Subject",
this);
217 connect(pAddSubjectAction, &QAction::triggered, [=,
this]() {
219 QString text = QInputDialog::getText(
this, tr(
"Adding Subject"),
220 tr(
"Please name new subject:"), QLineEdit::Normal,
222 if (ok && !text.isEmpty()){
227 menu->addAction(pAddSubjectAction);
228 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
234void BidsView::onCurrentItemChanged(
const QItemSelection &selected,
235 const QItemSelection &deselected)
238 if(selected.indexes().empty()) {
244 if(QStandardItemModel *pModel = qobject_cast<QStandardItemModel *>(m_pUi->m_pTreeView->model())) {
245 if(QStandardItem* pItem = pModel->itemFromIndex(selected.indexes().first())) {
246 if(!pItem->data().isNull()) {
255void BidsView::onNewFileLoaded(
int iSubject,
258 m_pUi->m_pTreeView->selectionModel()->select(m_pUi->m_pTreeView->model()->index(iModel, 0, m_pUi->m_pTreeView->model()->index(iSubject, 0)),
259 QItemSelectionModel::ClearAndSelect);
264void BidsView::keyPressEvent(QKeyEvent *event)
266 switch (event->key()) {
268 if(m_pUi->m_pTreeView->model()->data(m_pUi->m_pTreeView->currentIndex(), Qt::ToolTipRole).toString() !=
"Subject item") {
269 emit
removeItem(m_pUi->m_pTreeView->currentIndex());
274 QWidget::keyPressEvent(event);
280void BidsView::onNewItemIndex(QModelIndex itemIndex)
282 m_pUi->m_pTreeView->selectionModel()->select(itemIndex, QItemSelectionModel::ClearAndSelect);
283 m_pUi->m_pTreeView->expand(itemIndex.parent());
285 m_pUi->m_pTreeView->expandAll();
328void BidsView::onModelReset()
330 m_pUi->m_pTreeView->expandAll();
Tree view of the BIDS dataset hierarchy backed by BidsViewModel.
QStandardItemModel mirroring the BIDS dataset hierarchy (subjects / sessions / runs / derivatives).
#define BIDS_ITEM_SESSION
#define BIDS_ITEM_SUBJECT
#define BIDS_BEHAVIORALDATA
#define BIDS_FUNCTIONALDATA
#define BIDS_ANATOMICALDATA
2-D display widgets and visualisation helpers (charts, topography, colour maps).
AbstractView(QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void onAddSession(QModelIndex subjectIndex, const QString &sSessionName)
void onAddSubject(const QString &sSubjectName)
virtual void loadSettings()
void onMoveSession(QModelIndex subjectIndex, QModelIndex sessionIndex)
void selectedItemChanged(const QModelIndex &pIndex)
BidsView(QWidget *parent=0)
void onMoveData(QModelIndex sessionIndex, QModelIndex dataIndex)
void setModel(QAbstractItemModel *pModel)
virtual void updateGuiMode(GuiMode mode)
virtual void saveSettings()
void selectedModelChanged(const QVariant &data)
virtual void updateProcessingMode(ProcessingMode mode)
void removeItem(const QModelIndex &pIndex)
QStandardItemModel mirroring the BIDS dataset hierarchy (subjects / sessions / runs / derivatives).
QModelIndex moveSessionToSubject(QModelIndex subjectIndex, QModelIndex sessionIndex)
void newItemIndex(QModelIndex itemIndex)
QModelIndex moveDataToSession(QModelIndex sessionIndex, QModelIndex dataIndex)
QModelIndex addSubject(const QString &sSubjectName)