19#include "ui_bidsview.h"
28#include <QStandardItemModel>
33#include <QInputDialog>
47, m_pUi(std::make_unique<Ui::BidsViewWidget>())
50 m_pUi->m_pTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
51 connect(m_pUi->m_pTreeView, &QTreeView::customContextMenuRequested,
52 this, &BidsView::customMenuRequested, Qt::UniqueConnection);
65 m_pUi->m_pTreeView->setModel(pModel);
67 connect(m_pUi->m_pTreeView->selectionModel(), &QItemSelectionModel::selectionChanged,
68 this, &BidsView::onCurrentItemChanged, Qt::UniqueConnection);
72 this, &BidsView::onNewItemIndex);
80 connect(
this, SIGNAL(
onAddSession(QModelIndex,
const QString&)),
81 pBidsModel, SLOT(addSessionToSubject(QModelIndex,
const QString&)));
90 connect(pBidsModel, &BidsViewModel::modelReset,
91 this, &BidsView::onModelReset);
96void BidsView::customMenuRequested(QPoint pos)
98 QString sToolTip = m_pUi->m_pTreeView->model()->data(m_pUi->m_pTreeView->indexAt(pos), Qt::ToolTipRole).toString();
102 QAction* pRemoveAction;
104 if (m_pUi->m_pTreeView->indexAt(pos).isValid()) {
105 QStandardItem* pItem = pModel->itemFromIndex(m_pUi->m_pTreeView->indexAt(pos));
109 QMenu* menu =
new QMenu(
this);
110 menu->setAttribute(Qt::WA_DeleteOnClose);
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);
132 menu->setAttribute(Qt::WA_DeleteOnClose);
134 pRemoveAction =
new QAction(
"Remove Session",
this);
136 QMenu* pMoveMenu =
new QMenu(
"Move Session to ...");
139 for (
int i = 0; i < pModel->rowCount(); i++) {
140 if (pModel->item(i)->index() != pItem->data(
BIDS_ITEM_SUBJECT).value<QModelIndex>()) {
141 qDebug() <<
"Relative model index" << pModel->item(i)->index();
142 qDebug() <<
"Relative item index" << pItem->data(
BIDS_ITEM_SUBJECT).value<QModelIndex>();
143 QAction* pTargetAction =
new QAction(pModel->item(i)->text());
144 connect(pTargetAction, &QAction::triggered, [=,
this]() {
145 emit
onMoveSession(pModel->item(i)->index(), pItem->index());
147 pMoveMenu->addAction(pTargetAction);
151 if (!pMoveMenu->isEmpty()) {
152 menu->addMenu(pMoveMenu);
154 menu->addAction(pRemoveAction);
155 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
161 QMenu* menu =
new QMenu(
this);
162 menu->setAttribute(Qt::WA_DeleteOnClose);
164 pRemoveAction =
new QAction(
"Remove Data",
this);
166 QMenu* pMoveMenu =
new QMenu(
"Move Data to ...");
169 for (
int i = 0; i < pModel->rowCount(); i++) {
170 QMenu* pSubjectMenu =
new QMenu(pModel->item(i)->text());
171 for (
int j = 0; j < pModel->item(i)->rowCount(); j++) {
172 if (pModel->item(i)->child(j)->index() != pItem->data(
BIDS_ITEM_SESSION).value<QModelIndex>()) {
173 QAction* pTargetAction =
new QAction(pModel->item(i)->child(j)->text());
174 connect(pTargetAction, &QAction::triggered, [=,
this] {
175 emit
onMoveData(pModel->item(i)->child(j)->index(), pItem->index());
177 pSubjectMenu->addAction(pTargetAction);
180 if (!pSubjectMenu->isEmpty()) {
181 pMoveMenu->addMenu(pSubjectMenu);
185 if (!pMoveMenu->isEmpty()) {
186 menu->addMenu(pMoveMenu);
188 menu->addAction(pRemoveAction);
189 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
193 qDebug() <<
"DataManagerControlView::customMenuRequested - default";
194 QMenu* menu =
new QMenu(
this);
195 menu->setAttribute(Qt::WA_DeleteOnClose);
197 pRemoveAction =
new QAction(
"Remove",
this);
198 menu->addAction(pRemoveAction);
199 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
203 connect(pRemoveAction, &QAction::triggered, [=,
this]() {
206 msgBox.setText(
"Are you sure you want to remove " + pItem->text() +
"?");
207 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
208 msgBox.setDefaultButton(QMessageBox::No);
210 int ret = msgBox.exec();
212 if (ret == QMessageBox::Yes) {
213 emit
removeItem(m_pUi->m_pTreeView->indexAt(pos));
217 QMenu* menu =
new QMenu(
this);
218 menu->setAttribute(Qt::WA_DeleteOnClose);
220 QAction* pAddSubjectAction =
new QAction(
"Add Subject",
this);
221 connect(pAddSubjectAction, &QAction::triggered, [=,
this]() {
223 QString text = QInputDialog::getText(
this, tr(
"Adding Subject"),
224 tr(
"Please name new subject:"), QLineEdit::Normal,
226 if (ok && !text.isEmpty()) {
231 menu->addAction(pAddSubjectAction);
232 menu->popup(m_pUi->m_pTreeView->viewport()->mapToGlobal(pos));
238void BidsView::onCurrentItemChanged(
const QItemSelection& selected,
239 const QItemSelection& deselected)
242 if (selected.indexes().empty()) {
248 if (QStandardItemModel* pModel = qobject_cast<QStandardItemModel*>(m_pUi->m_pTreeView->model())) {
249 if (QStandardItem* pItem = pModel->itemFromIndex(selected.indexes().first())) {
250 if (!pItem->data().isNull()) {
259void BidsView::onNewFileLoaded(
int iSubject,
262 m_pUi->m_pTreeView->selectionModel()->select(m_pUi->m_pTreeView->model()->index(iModel, 0, m_pUi->m_pTreeView->model()->index(iSubject, 0)),
263 QItemSelectionModel::ClearAndSelect);
268void BidsView::keyPressEvent(QKeyEvent* event)
270 switch (event->key()) {
272 if (m_pUi->m_pTreeView->model()->data(m_pUi->m_pTreeView->currentIndex(), Qt::ToolTipRole).toString() !=
"Subject item") {
273 emit
removeItem(m_pUi->m_pTreeView->currentIndex());
278 QWidget::keyPressEvent(event);
284void BidsView::onNewItemIndex(QModelIndex itemIndex)
286 m_pUi->m_pTreeView->selectionModel()->select(itemIndex, QItemSelectionModel::ClearAndSelect);
287 m_pUi->m_pTreeView->expand(itemIndex.parent());
289 m_pUi->m_pTreeView->expandAll();
330void BidsView::onModelReset()
332 m_pUi->m_pTreeView->expandAll();
QStandardItemModel mirroring the BIDS dataset hierarchy (subjects / sessions / runs / derivatives).
#define BIDS_ITEM_SESSION
#define BIDS_ITEM_SUBJECT
constexpr auto BIDS_FUNCTIONALDATA
constexpr auto BIDS_ANATOMICALDATA
constexpr auto BIDS_SUBJECT
constexpr auto BIDS_BEHAVIORALDATA
constexpr auto BIDS_SESSION
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)