| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 | 
// Qt include#include <QGridLayout>#include <QResizeEvent>#include <QPushButton>#include <QPixmap>#include <QFile>// ctk includes#include "ctkLogger.h"// ctkWidgets includes#include "ctkFlowLayout.h"//ctkDICOMCore includes#include "ctkDICOMModel.h"#include "ctkDICOMDatabase.h"// ctkDICOMWidgets includes#include "ctkDICOMThumbnailListWidget.h"#include "ui_ctkDICOMThumbnailListWidget.h"#include "ctkDICOMThumbnailWidget.h"// STD includes#include <iostream>static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMThumbnailListWidget");//----------------------------------------------------------------------------class ctkDICOMThumbnailListWidgetPrivate: public Ui_ctkDICOMThumbnailListWidget{public:  ctkDICOMThumbnailListWidgetPrivate(ctkDICOMThumbnailListWidget* parent): q_ptr(parent){      }  QString databaseDirectory;  void clearAllThumbnails();  void onPatientModelSelected(const QModelIndex &index);  void onStudyModelSelected(const QModelIndex &index);  void onSeriesModelSelected(const QModelIndex &index);  ctkDICOMThumbnailListWidget* const q_ptr;  Q_DECLARE_PUBLIC(ctkDICOMThumbnailListWidget);};//----------------------------------------------------------------------------// ctkDICOMThumbnailListWidgetPrivate methodsvoid ctkDICOMThumbnailListWidgetPrivate::onPatientModelSelected(const QModelIndex &index){    Q_Q(ctkDICOMThumbnailListWidget);    QModelIndex patientIndex = index;    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));    if(model){        model->fetchMore(patientIndex);        int studyCount = model->rowCount(patientIndex);        for(int i=0; i<studyCount; i++){            QModelIndex studyIndex = patientIndex.child(i, 0);            QModelIndex seriesIndex = studyIndex.child(0, 0);            QModelIndex imageIndex = seriesIndex.child(0, 0);            QString thumbnail = this->databaseDirectory +                                    "/thumbs/" + model->data(studyIndex ,ctkDICOMModel::UIDRole).toString() + "/" +                                    model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString() + "/" +                                    model->data(imageIndex, ctkDICOMModel::UIDRole).toString() + ".png";            if (QFile(thumbnail).exists()){                ctkDICOMThumbnailWidget* widget = new ctkDICOMThumbnailWidget(this->scrollAreaContentWidget);                widget->setText( model->data(studyIndex, Qt::DisplayRole).toString() );                QPixmap pix(thumbnail);                logger.debug("Setting pixmap to " + thumbnail);                widget->setPixmap(pix);                widget->setSourceIndex(studyIndex);                this->scrollAreaContentWidget->layout()->addWidget(widget);                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SIGNAL(selected(ctkDICOMThumbnailWidget)));            }else{                logger.error("No thumbnail file " + thumbnail);            }        }    }}void ctkDICOMThumbnailListWidgetPrivate::onStudyModelSelected(const QModelIndex &index){    Q_Q(ctkDICOMThumbnailListWidget);    QModelIndex studyIndex = index;    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));    if(model){        model->fetchMore(studyIndex);        int seriesCount = model->rowCount(studyIndex);        for(int i=0; i<seriesCount; i++){            QModelIndex seriesIndex = studyIndex.child(i, 0);            QModelIndex imageIndex = seriesIndex.child(0, 0);            QString thumbnail = this->databaseDirectory +                                    "/thumbs/" + model->data(studyIndex ,ctkDICOMModel::UIDRole).toString() + "/" +                                    model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString() + "/" +                                    model->data(imageIndex, ctkDICOMModel::UIDRole).toString() + ".png";            if (QFile(thumbnail).exists()){                ctkDICOMThumbnailWidget* widget = new ctkDICOMThumbnailWidget(this->scrollAreaContentWidget);                widget->setText( model->data(seriesIndex, Qt::DisplayRole).toString() );                QPixmap pix(thumbnail);                logger.debug("Setting pixmap to " + thumbnail);                widget->setPixmap(pix);                widget->setSourceIndex(seriesIndex);                this->scrollAreaContentWidget->layout()->addWidget(widget);                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SIGNAL(selected(ctkDICOMThumbnailWidget)));            }else{                logger.error("No thumbnail file " + thumbnail);            }        }    }}void ctkDICOMThumbnailListWidgetPrivate::onSeriesModelSelected(const QModelIndex &index){    Q_Q(ctkDICOMThumbnailListWidget);    QModelIndex studyIndex = index.parent();    QModelIndex seriesIndex = index;    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));    if(model){        model->fetchMore(seriesIndex);        QString thumbnailPath = this->databaseDirectory +                                "/thumbs/" + model->data(studyIndex ,ctkDICOMModel::UIDRole).toString() + "/" +                                model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString() + "/";        int imageCount = model->rowCount(seriesIndex);        logger.debug(QString("Thumbs: %1").arg(imageCount));        for (int i = 0 ; i < imageCount ; i++ )        {            QModelIndex imageIndex = seriesIndex.child(i,0);            QString thumbnail = thumbnailPath + model->data(imageIndex, ctkDICOMModel::UIDRole).toString() + ".png";            if (QFile(thumbnail).exists())            {                ctkDICOMThumbnailWidget* widget = new ctkDICOMThumbnailWidget(this->scrollAreaContentWidget);                QString widgetLabel = QString("Image %1").arg(i);                widget->setText( widgetLabel );                QPixmap pix(thumbnail);                logger.debug("Setting pixmap to " + thumbnail);                widget->setPixmap(pix);                widget->setSourceIndex(imageIndex);                this->scrollAreaContentWidget->layout()->addWidget(widget);                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SIGNAL(selected(ctkDICOMThumbnailWidget)));            }            else            {                logger.error("No thumbnail file " + thumbnail);            }        }    }}void ctkDICOMThumbnailListWidgetPrivate::clearAllThumbnails(){    Q_Q(ctkDICOMThumbnailListWidget);    // Remove previous displayed thumbnails    QLayoutItem* item;    while(item = this->scrollAreaContentWidget->layout()->takeAt(0)){        ctkDICOMThumbnailWidget* thumbnailWidget = qobject_cast<ctkDICOMThumbnailWidget*>(item->widget());        if(thumbnailWidget){            q->disconnect(thumbnailWidget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));            q->disconnect(thumbnailWidget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SIGNAL(selected(ctkDICOMThumbnailWidget)));        }        item->widget()->deleteLater();    }}//----------------------------------------------------------------------------// ctkDICOMThumbnailListWidget methods//----------------------------------------------------------------------------ctkDICOMThumbnailListWidget::ctkDICOMThumbnailListWidget(QWidget* _parent):Superclass(_parent), 									   d_ptr(new ctkDICOMThumbnailListWidgetPrivate(this)){    Q_D(ctkDICOMThumbnailListWidget);    d->setupUi(this);    d->scrollAreaContentWidget->setLayout(new ctkFlowLayout);}//----------------------------------------------------------------------------ctkDICOMThumbnailListWidget::~ctkDICOMThumbnailListWidget(){    Q_D(ctkDICOMThumbnailListWidget);    d->clearAllThumbnails();}//----------------------------------------------------------------------------void ctkDICOMThumbnailListWidget::setDatabaseDirectory(const QString &directory){    Q_D(ctkDICOMThumbnailListWidget);    d->databaseDirectory = directory;}//----------------------------------------------------------------------------void ctkDICOMThumbnailListWidget::selectThumbnail(int index){    Q_D(ctkDICOMThumbnailListWidget);    int count = d->scrollAreaContentWidget->layout()->count();    logger.debug("Select thumbnail " + QVariant(index).toString() + " of " + QVariant(count).toString());    if(index >= count)return;    for(int i=0; i<count; i++){        ctkDICOMThumbnailWidget* thumbnailWidget = qobject_cast<ctkDICOMThumbnailWidget*>(d->scrollAreaContentWidget->layout()->itemAt(i)->widget());        if(i == index){            thumbnailWidget->setSelected(true);        }else{            thumbnailWidget->setSelected(false);        }    }}//----------------------------------------------------------------------------void ctkDICOMThumbnailListWidget::onModelSelected(const QModelIndex &index){    Q_D(ctkDICOMThumbnailListWidget);    d->clearAllThumbnails();    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));    if(model){        QModelIndex index0 = index.sibling(index.row(), 0);        if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::PatientType ){            d->onPatientModelSelected(index0);        }else if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::StudyType ){            d->onStudyModelSelected(index0);        }else if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::SeriesType ){            d->onSeriesModelSelected(index0);        }    }    this->selectThumbnail(0);}//----------------------------------------------------------------------------void ctkDICOMThumbnailListWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget &widget){    Q_D(ctkDICOMThumbnailListWidget);    for(int i=0; i<d->scrollAreaContentWidget->layout()->count(); i++){        ctkDICOMThumbnailWidget* thumbnailWidget = qobject_cast<ctkDICOMThumbnailWidget*>(d->scrollAreaContentWidget->layout()->itemAt(i)->widget());        if(thumbnailWidget && (&widget != thumbnailWidget)){            thumbnailWidget->setSelected(false);        }    }}
 |