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);
111 menu->setAttribute(Qt::WA_DeleteOnClose);
113 QAction* pAddSessionAction =
new QAction(
"Add Session",
this);
114 connect(pAddSessionAction, &QAction::triggered, [=,
this]() {
116 QString text = QInputDialog::getText(
this, tr(
"Adding Session"),
117 tr(
"Please name new session:"), QLineEdit::Normal,
119 if (ok && !text.isEmpty()) {
124 pRemoveAction =
new QAction(
"Remove Subject",
this);
126 menu->addAction(pAddSessionAction);
127 menu->addAction(pRemoveAction);
128 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
132 QMenu* menu =
new QMenu(
this);
133 menu->setAttribute(Qt::WA_DeleteOnClose);
135 pRemoveAction =
new QAction(
"Remove Session",
this);
137 QMenu* pMoveMenu =
new QMenu(
"Move Session to ...");
140 for (
int i = 0; i < pModel->rowCount(); i++) {
141 if (pModel->item(i)->index() != pItem->data(
BIDS_ITEM_SUBJECT).value<QModelIndex>()) {
142 qDebug() <<
"Relative model index" << pModel->item(i)->index();
143 qDebug() <<
"Relative item index" << pItem->data(
BIDS_ITEM_SUBJECT).value<QModelIndex>();
144 QAction* pTargetAction =
new QAction(pModel->item(i)->text());
145 connect(pTargetAction, &QAction::triggered, [=,
this]() {
146 emit
onMoveSession(pModel->item(i)->index(), pItem->index());
148 pMoveMenu->addAction(pTargetAction);
152 if (!pMoveMenu->isEmpty()) {
153 menu->addMenu(pMoveMenu);
155 menu->addAction(pRemoveAction);
156 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
162 QMenu* menu =
new QMenu(
this);
163 menu->setAttribute(Qt::WA_DeleteOnClose);
165 pRemoveAction =
new QAction(
"Remove Data",
this);
167 QMenu* pMoveMenu =
new QMenu(
"Move Data to ...");
170 for (
int i = 0; i < pModel->rowCount(); i++) {
171 QMenu* pSubjectMenu =
new QMenu(pModel->item(i)->text());
172 for (
int j = 0; j < pModel->item(i)->rowCount(); j++) {
173 if (pModel->item(i)->child(j)->index() != pItem->data(
BIDS_ITEM_SESSION).value<QModelIndex>()) {
174 QAction* pTargetAction =
new QAction(pModel->item(i)->child(j)->text());
175 connect(pTargetAction, &QAction::triggered, [=,
this] {
176 emit
onMoveData(pModel->item(i)->child(j)->index(), pItem->index());
178 pSubjectMenu->addAction(pTargetAction);
181 if (!pSubjectMenu->isEmpty()) {
182 pMoveMenu->addMenu(pSubjectMenu);
186 if (!pMoveMenu->isEmpty()) {
187 menu->addMenu(pMoveMenu);
189 menu->addAction(pRemoveAction);
190 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
194 qDebug() <<
"DataManagerControlView::customMenuRequested - default";
195 QMenu* menu =
new QMenu(
this);
196 menu->setAttribute(Qt::WA_DeleteOnClose);
198 pRemoveAction =
new QAction(
"Remove",
this);
199 menu->addAction(pRemoveAction);
200 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
204 connect(pRemoveAction, &QAction::triggered, [=,
this]() {
207 msgBox.setText(
"Are you sure you want to remove " + pItem->text() +
"?");
208 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
209 msgBox.setDefaultButton(QMessageBox::No);
211 int ret = msgBox.exec();
213 if (ret == QMessageBox::Yes) {
214 emit
removeItem(m_pUi->m_pTreeView->indexAt(pos));
218 QMenu* menu =
new QMenu(
this);
219 menu->setAttribute(Qt::WA_DeleteOnClose);
221 QAction* pAddSubjectAction =
new QAction(
"Add Subject",
this);
222 connect(pAddSubjectAction, &QAction::triggered, [=,
this]() {
224 QString text = QInputDialog::getText(
this, tr(
"Adding Subject"),
225 tr(
"Please name new subject:"), QLineEdit::Normal,
227 if (ok && !text.isEmpty()) {
232 menu->addAction(pAddSubjectAction);
233 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
239void BidsView::onCurrentItemChanged(
const QItemSelection& selected,
240 const QItemSelection& deselected)
243 if (selected.indexes().empty()) {
249 if (QStandardItemModel* pModel = qobject_cast<QStandardItemModel*>(m_pUi->m_pTreeView->model())) {
250 if (QStandardItem* pItem = pModel->itemFromIndex(selected.indexes().first())) {
251 if (!pItem->data().isNull()) {
260void BidsView::onNewFileLoaded(
int iSubject,
263 m_pUi->m_pTreeView->selectionModel()->select(m_pUi->m_pTreeView->model()->index(iModel, 0, m_pUi->m_pTreeView->model()->index(iSubject, 0)),
264 QItemSelectionModel::ClearAndSelect);
269void BidsView::keyPressEvent(QKeyEvent* event)
271 switch (event->key()) {
273 if (m_pUi->m_pTreeView->model()->data(m_pUi->m_pTreeView->currentIndex(), Qt::ToolTipRole).toString() !=
"Subject item") {
274 emit
removeItem(m_pUi->m_pTreeView->currentIndex());
279 QWidget::keyPressEvent(event);
285void BidsView::onNewItemIndex(QModelIndex itemIndex)
287 m_pUi->m_pTreeView->selectionModel()->select(itemIndex, QItemSelectionModel::ClearAndSelect);
288 m_pUi->m_pTreeView->expand(itemIndex.parent());
290 m_pUi->m_pTreeView->expandAll();
331void BidsView::onModelReset()
333 m_pUi->m_pTreeView->expandAll();
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
Tree view of the BIDS dataset hierarchy backed by DISPLIB::BidsViewModel.
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)