소스 검색

ENH: Added option to filter displayed metadata items by regexp

Regular expressions can be now used to filter any number of tags. Useful for remote assistance: user receives a regular expression
from the developer that lists all the relevant tags and only those.

For example: this filter lists 3 specific tags:

  regexp:0008,1030|0020,0010|0020,0011

[0008,1030]	StudyDescription	p4	LO	2
[0020,0010]	StudyID		SH	0
[0020,0011]	SeriesNumber	500	IS	4
Andras Lasso 8 년 전
부모
커밋
85a6a495a5

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 5 - 1
Libs/DICOM/Widgets/Resources/UI/ctkDICOMObjectListWidget.ui


+ 25 - 5
Libs/DICOM/Widgets/ctkDICOMObjectListWidget.cpp

@@ -93,6 +93,7 @@ public:
   void populateDICOMObjectTreeView(const QString& fileName);
   void setPathLabel(const QString& currentFile);
   QString dicomObjectModelAsString(QAbstractItemModel* dicomObjectModel, QModelIndex parent = QModelIndex(), int indent = 0, QString rowPrefix = QString());
+  void setFilterExpressionInModel(qRecursiveTreeProxyFilter* filterModel, const QString& expr);
 
   QString endOfLine;
   QString currentFile;
@@ -122,6 +123,21 @@ ctkDICOMObjectListWidgetPrivate::~ctkDICOMObjectListWidgetPrivate()
 }
 
 //----------------------------------------------------------------------------
+void ctkDICOMObjectListWidgetPrivate::setFilterExpressionInModel(qRecursiveTreeProxyFilter* filterModel, const QString& expr)
+{
+  const QString regexpPrefix("regexp:");
+  if (expr.startsWith(regexpPrefix))
+    {
+    filterModel->setFilterRegExp(expr.right(expr.length() - regexpPrefix.length()));
+    }
+  else
+    {
+    filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
+    filterModel->setFilterWildcard(expr);
+    }
+}
+
+//----------------------------------------------------------------------------
 void ctkDICOMObjectListWidgetPrivate::populateDICOMObjectTreeView(const QString& fileName)
 {
   this->dicomObjectModel->setFile(fileName);
@@ -189,7 +205,6 @@ ctkDICOMObjectListWidget::ctkDICOMObjectListWidget(QWidget* _parent):Superclass(
   d->dicomObjectModel = new ctkDICOMObjectModel(this);
   d->filterModel = new qRecursiveTreeProxyFilter(this);
   d->filterModel->setSourceModel(d->dicomObjectModel);
-  d->filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
 
   d->fileSliderWidget->setMaximum(1);
   d->fileSliderWidget->setMinimum(1);
@@ -206,8 +221,7 @@ ctkDICOMObjectListWidget::ctkDICOMObjectListWidget(QWidget* _parent):Superclass(
   connect(d->copyMetadataPushButton, SIGNAL(clicked(bool)), this, SLOT(copyMetadata()));
   connect(d->copyAllFilesMetadataPushButton, SIGNAL(clicked(bool)), this, SLOT(copyAllFilesMetadata()));
 
-  QObject::connect(d->metadataSearchBox, SIGNAL(textChanged(QString)),
-    d->filterModel, SLOT(setFilterWildcard(QString)));
+  QObject::connect(d->metadataSearchBox, SIGNAL(textChanged(QString)), this, SLOT(setFilterExpression(QString)));
   QObject::connect(d->metadataSearchBox, SIGNAL(textChanged(QString)), this, SLOT(onFilterChanged()));
 }
 
@@ -317,8 +331,7 @@ QString ctkDICOMObjectListWidget::metadataAsText(bool allFiles /*=false*/)
 
       qRecursiveTreeProxyFilter* afilterModel = new qRecursiveTreeProxyFilter();
       afilterModel->setSourceModel(aDicomObjectModel);
-      afilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
-      afilterModel->setFilterWildcard(d->metadataSearchBox->text());
+      d->setFilterExpressionInModel(afilterModel, d->metadataSearchBox->text());
 
       QString thisFileMetadata = d->dicomObjectModelAsString(afilterModel, QModelIndex(), 0, fileName + "\t");
 
@@ -381,3 +394,10 @@ void ctkDICOMObjectListWidget::onFilterChanged()
     }
   d->metadataSearchBox->setPalette(palette);
 }
+
+//------------------------------------------------------------------------------
+void ctkDICOMObjectListWidget::setFilterExpression(const QString& expr)
+{
+  Q_D(ctkDICOMObjectListWidget);
+  d->setFilterExpressionInModel(d->filterModel, expr);
+}

+ 1 - 0
Libs/DICOM/Widgets/ctkDICOMObjectListWidget.h

@@ -66,6 +66,7 @@ public Q_SLOTS:
 
 protected Q_SLOTS:
   void itemDoubleClicked(const QModelIndex&);
+  void setFilterExpression(const QString& expr);
   void onFilterChanged();
   void updateWidget();
   void copyPath();