Browse Source

preliminary implementation of text search

nherlambang 14 years ago
parent
commit
50d3612383

+ 73 - 1
Libs/DICOM/Core/ctkDICOMFilterProxyModel.cpp

@@ -20,6 +20,13 @@
 
 #include "ctkDICOMFilterProxyModel.h"
 
+#include "ctkDICOMModel.h"
+
+//logger
+#include <ctkLogger.h>
+static ctkLogger logger("org.commontk.DICOM.Core.ctkDICOMFilterProxyModel");
+
+
 //----------------------------------------------------------------------------
 class ctkDICOMFilterProxyModelPrivate
 {
@@ -30,7 +37,10 @@ protected:
 public:
   ctkDICOMFilterProxyModelPrivate(ctkDICOMFilterProxyModel* parent = 0);
 
-
+  QString searchTextName;
+  QString searchTextStudy;
+  QString searchTextSeries;
+  QString searchTextID;
 };
 
 //----------------------------------------------------------------------------
@@ -49,3 +59,65 @@ ctkDICOMFilterProxyModel::ctkDICOMFilterProxyModel(QObject *parent):Superclass(p
 ctkDICOMFilterProxyModel::~ctkDICOMFilterProxyModel(){
 
 }
+
+//----------------------------------------------------------------------------
+void ctkDICOMFilterProxyModel::setNameSearchText(const QString &text){
+    Q_D(ctkDICOMFilterProxyModel);
+    d->searchTextName = text;
+    this->invalidateFilter();
+}
+
+//----------------------------------------------------------------------------
+void ctkDICOMFilterProxyModel::setStudySearchText(const QString &text){
+    Q_D(ctkDICOMFilterProxyModel);
+    d->searchTextStudy = text;
+    this->invalidateFilter();
+}
+
+//----------------------------------------------------------------------------
+void ctkDICOMFilterProxyModel::setSeriesSearchText(const QString &text){
+    Q_D(ctkDICOMFilterProxyModel);
+    d->searchTextSeries = text;
+    this->invalidateFilter();
+}
+
+//----------------------------------------------------------------------------
+void ctkDICOMFilterProxyModel::setIdSearchText(const QString &text){
+    Q_D(ctkDICOMFilterProxyModel);
+    d->searchTextID = text;
+    this->invalidateFilter();
+}
+
+bool ctkDICOMFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const{
+    Q_D(const ctkDICOMFilterProxyModel);
+
+    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(this->sourceModel()));
+
+    if(model){
+        QModelIndex index = model->index(source_row, 0, source_parent);
+        if(model->data(index, ctkDICOMModel::TypeRole) == ctkDICOMModel::PatientType){
+            QRegExp regExp = QRegExp(d->searchTextName);
+            if(model->data(index, Qt::DisplayRole).toString().contains(regExp)){
+                return true;
+            }else{
+                return false;
+            }
+        }else if(model->data(index, ctkDICOMModel::TypeRole) == ctkDICOMModel::StudyType){
+            QRegExp regExp = QRegExp(d->searchTextStudy);
+            if(model->data(index, Qt::DisplayRole).toString().contains(regExp)){
+                return true;
+            }else{
+                return false;
+            }
+        }else if(model->data(index, ctkDICOMModel::TypeRole) == ctkDICOMModel::SeriesType){
+            QRegExp regExp = QRegExp(d->searchTextSeries);
+            if(model->data(index, Qt::DisplayRole).toString().contains(regExp)){
+                return true;
+            }else{
+                return false;
+            }
+        }
+    }
+
+    return true;
+}

+ 8 - 0
Libs/DICOM/Core/ctkDICOMFilterProxyModel.h

@@ -36,12 +36,20 @@ public:
     explicit ctkDICOMFilterProxyModel(QObject* parent = 0);
     virtual ~ctkDICOMFilterProxyModel();
 
+    virtual bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const;
+
 protected:
     QScopedPointer<ctkDICOMFilterProxyModelPrivate> d_ptr;
 
 private:
     Q_DECLARE_PRIVATE(ctkDICOMFilterProxyModel);
     Q_DISABLE_COPY(ctkDICOMFilterProxyModel);
+
+public slots:
+    void setNameSearchText(const QString& text);
+    void setStudySearchText(const QString& text);
+    void setSeriesSearchText(const QString& text);
+    void setIdSearchText(const QString& text);
 };
 
 #endif

+ 1 - 0
Libs/DICOM/Widgets/CMakeLists.txt

@@ -55,6 +55,7 @@ SET(KIT_MOC_SRCS
   ctkDICOMThumbnailWidget.h
   ctkDICOMThumbnailListWidget.h
   ctkDICOMImportWidget.h
+  ctkDICOMQueryWidget.h
   ctkDICOMQueryRetrieveWidget.h
   ctkDICOMThumbnailGenerator.h
   )

+ 7 - 7
Libs/DICOM/Widgets/Resources/UI/ctkDICOMQueryWidget.ui

@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>279</width>
-    <height>121</height>
+    <height>159</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -43,7 +43,7 @@
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_7">
        <item>
-        <widget class="QLineEdit" name="NameSearch"/>
+        <widget class="QLineEdit" name="nameSearch"/>
        </item>
       </layout>
      </widget>
@@ -56,7 +56,7 @@
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_8">
        <item>
-        <widget class="QLineEdit" name="StudySearch"/>
+        <widget class="QLineEdit" name="studySearch"/>
        </item>
       </layout>
      </widget>
@@ -69,7 +69,7 @@
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_9">
        <item>
-        <widget class="QLineEdit" name="SeriesSearch"/>
+        <widget class="QLineEdit" name="seriesSearch"/>
        </item>
       </layout>
      </widget>
@@ -82,7 +82,7 @@
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_10">
        <item>
-        <widget class="QLineEdit" name="IdSearch"/>
+        <widget class="QLineEdit" name="idSearch"/>
        </item>
       </layout>
      </widget>
@@ -107,7 +107,7 @@
         </property>
         <layout class="QVBoxLayout" name="verticalLayout_2">
          <item>
-          <widget class="ctkDateRangeWidget" name="DateRangeWidget" native="true"/>
+          <widget class="ctkDateRangeWidget" name="dateRangeWidget" native="true"/>
          </item>
          <item>
           <spacer name="verticalSpacer">
@@ -135,7 +135,7 @@
         </property>
         <layout class="QVBoxLayout" name="verticalLayout_5">
          <item>
-          <widget class="ctkModalityWidget" name="ModalityWidget" native="true">
+          <widget class="ctkModalityWidget" name="modalityWidget" native="true">
            <property name="sizePolicy">
             <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
              <horstretch>0</horstretch>

+ 6 - 0
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -46,6 +46,7 @@
 #include "ctkDICOMAppWidget.h"
 #include "ctkDICOMQueryResultsTabWidget.h"
 #include "ctkDICOMQueryRetrieveWidget.h"
+#include "ctkDICOMQueryWidget.h"
 #include "ctkDICOMImportWidget.h"
 #include "ctkDICOMThumbnailWidget.h"
 #include "ctkDICOMThumbnailGenerator.h"
@@ -157,6 +158,11 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
   connect(d->imagePreview, SIGNAL(requestNextImage()), this, SLOT(onNextImage()));
   connect(d->imagePreview, SIGNAL(requestPreviousImage()), this, SLOT(onPreviousImage()));
 
+  connect(d->searchOption, SIGNAL(nameSearchTextChanged(QString)), &(d->dicomProxyModel), SLOT(setNameSearchText(QString)));
+  connect(d->searchOption, SIGNAL(studySearchTextChanged(QString)), &(d->dicomProxyModel), SLOT(setStudySearchText(QString)));
+  connect(d->searchOption, SIGNAL(seriesSearchTextChanged(QString)), &(d->dicomProxyModel), SLOT(setSeriesSearchText(QString)));
+  connect(d->searchOption, SIGNAL(idSearchTextChanged(QString)), &(d->dicomProxyModel), SLOT(setIdSearchText(QString)));
+
 }
 
 //----------------------------------------------------------------------------

+ 26 - 9
Libs/DICOM/Widgets/ctkDICOMQueryWidget.cpp

@@ -7,6 +7,12 @@
 // STD includes
 #include <iostream>
 
+
+//logger
+#include <ctkLogger.h>
+static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMQueryWidget");
+
+
 //----------------------------------------------------------------------------
 class ctkDICOMQueryWidgetPrivate: public Ui_ctkDICOMQueryWidget
 {
@@ -28,11 +34,22 @@ ctkDICOMQueryWidget::ctkDICOMQueryWidget(QWidget* _parent):Superclass(_parent),
   Q_D(ctkDICOMQueryWidget);
   
   d->setupUi(this);
+
+  connect(d->nameSearch, SIGNAL(textChanged(QString)), this, SIGNAL(nameSearchTextChanged(QString)));
+  connect(d->studySearch, SIGNAL(textChanged(QString)), this, SIGNAL(studySearchTextChanged(QString)));
+  connect(d->seriesSearch, SIGNAL(textChanged(QString)), this, SIGNAL(seriesSearchTextChanged(QString)));
+  connect(d->idSearch, SIGNAL(textChanged(QString)), this, SIGNAL(idSearchTextChanged(QString)));
 }
 
 //----------------------------------------------------------------------------
 ctkDICOMQueryWidget::~ctkDICOMQueryWidget()
 {
+    Q_D(ctkDICOMQueryWidget);
+
+    disconnect(d->nameSearch, SIGNAL(textChanged(QString)), this, SIGNAL(nameSearchTextChanged(QString)));
+    disconnect(d->studySearch, SIGNAL(textChanged(QString)), this, SIGNAL(studySearchTextChanged(QString)));
+    disconnect(d->seriesSearch, SIGNAL(textChanged(QString)), this, SIGNAL(seriesSearchTextChanged(QString)));
+    disconnect(d->idSearch, SIGNAL(textChanged(QString)), this, SIGNAL(idSearchTextChanged(QString)));
 }
 
 
@@ -43,22 +60,22 @@ QMap<QString,QVariant> ctkDICOMQueryWidget::parameters()
 
   QMap<QString,QVariant> parameters;
 
-  parameters["Name"] = d->NameSearch->text();
-  parameters["Study"] = d->StudySearch->text();
-  parameters["Series"] = d->SeriesSearch->text();
-  parameters["ID"] = d->IdSearch->text();
+  parameters["Name"] = d->nameSearch->text();
+  parameters["Study"] = d->studySearch->text();
+  parameters["Series"] = d->seriesSearch->text();
+  parameters["ID"] = d->idSearch->text();
 
-  if ( !d->ModalityWidget->areAllModalitiesSelected() )
+  if ( !d->modalityWidget->areAllModalitiesSelected() )
   { // some PACS (conquest) don't seem to accept list of modalities,
     // so don't include the list at all when all modalities are desired
     // TODO: think about how to fix this for conquest at the query level
-    parameters["Modalities"] = d->ModalityWidget->selectedModalities();
+    parameters["Modalities"] = d->modalityWidget->selectedModalities();
   }
 
-  if ( !d->DateRangeWidget->isAnyDate() )
+  if ( !d->dateRangeWidget->isAnyDate() )
   {
-    QDate startDate = d->DateRangeWidget->startDateTime().date();
-    QDate endDate = d->DateRangeWidget->endDateTime().date();
+    QDate startDate = d->dateRangeWidget->startDateTime().date();
+    QDate endDate = d->dateRangeWidget->endDateTime().date();
     parameters["StartDate"] = startDate.toString("yyyyMMdd");
     parameters["EndDate"] = endDate.toString("yyyyMMdd");
   }

+ 7 - 0
Libs/DICOM/Widgets/ctkDICOMQueryWidget.h

@@ -30,6 +30,7 @@ class ctkDICOMQueryWidgetPrivate;
 
 class CTK_DICOM_WIDGETS_EXPORT ctkDICOMQueryWidget : public QWidget
 {
+    Q_OBJECT
 public:
   typedef QWidget Superclass;
   explicit ctkDICOMQueryWidget(QWidget* parent=0);
@@ -44,6 +45,12 @@ protected:
 private:
   Q_DECLARE_PRIVATE(ctkDICOMQueryWidget);
   Q_DISABLE_COPY(ctkDICOMQueryWidget);
+
+signals:
+  void nameSearchTextChanged(const QString& text);
+  void studySearchTextChanged(const QString& text);
+  void seriesSearchTextChanged(const QString& text);
+  void idSearchTextChanged(const QString& text);
 };
 
 #endif