/*========================================================================= medInria Copyright (c) INRIA 2013 - 2018. All rights reserved. See LICENSE.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =========================================================================*/ #include #include #include #include #include #include class medSaveModifiedDialogPrivate { public: QTreeWidget *treeWidget; QPushButton *quitButton; QPushButton *saveQuitButton; QPushButton *cancelButton; bool quitRequested; unsigned int counter; QMutex mutex; }; /*********************************/ class medSaveModifiedDialogCheckListItem : public QTreeWidgetItem { public : medSaveModifiedDialogCheckListItem(QTreeWidgetItem *root, const medDataIndex &index, const QString &name, const QString &studyName, const QString &seriesName, const QString &file, const QImage &thumb) : QTreeWidgetItem(), medIndex(index) { root->addChild(this); setFlags(flags() | Qt::ItemIsUserCheckable); setIcon(1, QIcon(QPixmap::fromImage(thumb))); setText(2, name); setText(3, studyName); setText(4, seriesName); setText(5, file); setCheckState(0, Qt::Checked); } const medDataIndex& getIndex() const { return medIndex; } ~medSaveModifiedDialogCheckListItem() {} private: medDataIndex medIndex; }; /***********************************************/ medSaveModifiedDialog::medSaveModifiedDialog(QWidget *parent) : QDialog(parent), d (new medSaveModifiedDialogPrivate) { QLabel *label = new QLabel(this); label->setText(tr("The following datasets have been created. Do you want to save them ?")); d->saveQuitButton = new QPushButton(tr("Save and Quit"),this); d->cancelButton = new QPushButton(tr("Cancel"),this); d->quitButton = new QPushButton(tr("Quit without saving"),this); d->treeWidget = new QTreeWidget(this); d->treeWidget->setColumnCount(6); d->quitRequested = false; QStringList headers; headers << tr("Select") <treeWidget->setHeaderLabels(headers); QHBoxLayout *hlayout = new QHBoxLayout; hlayout->addWidget(d->saveQuitButton); hlayout->addWidget(d->cancelButton); hlayout->addWidget(d->quitButton); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(label); layout->addWidget(d->treeWidget); layout->addLayout(hlayout); for(medDatabaseNonPersistentItem *item : medDatabaseNonPersistentController::instance().items()) { if ((item->studyName() != "") && (item->seriesName() != "")) new medSaveModifiedDialogCheckListItem(d->treeWidget->invisibleRootItem(), item->index(), item->name(), item->studyName(), item->seriesName(), item->file(), item->thumb()); } d->treeWidget->resizeColumnToContents(0); connect (d->saveQuitButton, SIGNAL(clicked()), this, SLOT(saveAndQuit())); connect (d->cancelButton,SIGNAL(clicked()), this, SLOT(reject())); connect (d->quitButton,SIGNAL(clicked()), this, SLOT(accept())); connect (&medDataManager::instance(), SIGNAL(dataImported(medDataIndex,QUuid)),this, SLOT(updateCounter())); setModal(true); } medSaveModifiedDialog::~medSaveModifiedDialog() { delete d; d = nullptr; } void medSaveModifiedDialog::saveAndQuit() { QList list; d->counter = 0; for (int i = 0; i < d->treeWidget->topLevelItemCount(); ++i) { medSaveModifiedDialogCheckListItem * checkListItem = dynamic_cast (d->treeWidget->topLevelItem(i)); if (checkListItem->checkState(0) == Qt::Checked) { d->counter++; list.append(checkListItem->getIndex()); } } medDataManager &mdm = medDataManager::instance(); for(medDataIndex index : list) { mdm.makePersistent(index); } if (d->counter != 0) d->quitRequested = true; else this->accept(); } void medSaveModifiedDialog::updateCounter() { d->mutex.lock(); d->counter--; d->mutex.unlock(); if(d->counter == 0) { if (d->quitRequested) this->accept(); else this->onUpdateTree(); } } void medSaveModifiedDialog::onUpdateTree() { d->treeWidget->clear(); for(medDatabaseNonPersistentItem *item : medDatabaseNonPersistentController::instance().items()) { d->treeWidget->insertTopLevelItem(0,new medSaveModifiedDialogCheckListItem(d->treeWidget->invisibleRootItem(), item->index(), item->name(), item->studyName(), item->seriesName(), item->file(), item->thumb())); } d->treeWidget->update(); d->treeWidget->resizeColumnToContents(0); d->treeWidget->showMaximized(); }