소스 검색

ENH: Expose name filters conversion to the public API

The name filters are typically used in QFileDialogs. ctkUtils now contains
tools to convert them to standard wildcar extensions or regular expressions
Julien Finet 14 년 전
부모
커밋
b83ee8139f
3개의 변경된 파일104개의 추가작업 그리고 77개의 파일을 삭제
  1. 79 0
      Libs/Core/ctkUtils.cpp
  2. 22 0
      Libs/Core/ctkUtils.h
  3. 3 77
      Libs/Widgets/ctkPathLineEdit.cpp

+ 79 - 0
Libs/Core/ctkUtils.cpp

@@ -18,6 +18,11 @@
 
 =========================================================================*/
 
+// Qt includes
+#include <QRegExp>
+#include <QString>
+#include <QStringList>
+
 #include "ctkUtils.h"
 
 // STD includes
@@ -71,3 +76,77 @@ void ctk::stlVectorToQList(const std::vector<std::string>& vector,
   std::transform(vector.begin(),vector.end(),std::back_inserter(list),&QString::fromStdString);
 }
 
+//-----------------------------------------------------------------------------
+const char *ctkNameFilterRegExp =
+  "^(.*)\\(([a-zA-Z0-9_.*? +;#\\-\\[\\]@\\{\\}/!<>\\$%&=^~:\\|]*)\\)$";
+
+//-----------------------------------------------------------------------------
+QStringList ctk::nameFilterToExtensions(const QString& nameFilter)
+{
+  QRegExp regexp(QString::fromLatin1(ctkNameFilterRegExp));
+  int i = regexp.indexIn(nameFilter);
+  if (i < 0)
+    {
+    return QStringList();
+    }
+  QString f = regexp.cap(2);
+  return f.split(QLatin1Char(' '), QString::SkipEmptyParts);
+}
+
+//-----------------------------------------------------------------------------
+QStringList ctk::nameFiltersToExtensions(const QStringList& nameFilters)
+{
+  QStringList extensions;
+  foreach(const QString& nameFilter, nameFilters)
+    {
+    extensions << nameFilterToExtensions(nameFilter);
+    }
+  return extensions;
+}
+
+//-----------------------------------------------------------------------------
+QString ctk::extensionToRegExp(const QString& extension)
+{
+  // typically *.jpg
+  QRegExp extensionExtractor("\\*\\.(\\w+)");
+  int pos = extensionExtractor.indexIn(extension);
+  if (pos < 0)
+    {
+    return QString();
+    }
+  return ".*\\." + extensionExtractor.cap(1) + "?$";
+}
+
+//-----------------------------------------------------------------------------
+QRegExp ctk::nameFiltersToRegExp(const QStringList& nameFilters)
+{
+  QString pattern;
+  foreach(const QString& nameFilter, nameFilters)
+    {
+    foreach(const QString& extension, nameFilterToExtensions(nameFilter))
+      {
+      QString regExpExtension = extensionToRegExp(extension);
+      if (!regExpExtension.isEmpty())
+        {
+        if (pattern.isEmpty())
+          {
+          pattern = "(";
+          }
+        else
+          {
+          pattern += "|";
+          }
+        pattern +=regExpExtension;
+        }
+      }
+    }
+  if (pattern.isEmpty())
+    {
+    pattern = ".+";
+    }
+  else
+    {
+    pattern += ")";
+    }
+  return QRegExp(pattern);
+}

+ 22 - 0
Libs/Core/ctkUtils.h

@@ -43,6 +43,28 @@ void CTK_CORE_EXPORT qListToSTLVector(const QStringList& list, std::vector<std::
 /// Convert a Vector of string to QStringList
 void CTK_CORE_EXPORT stlVectorToQList(const std::vector<std::string>& vector, QStringList& list);
 
+///
+/// Convert a nameFilter to a list of file extensions:
+/// "Images (*.png *.jpg *.tiff)" -> "*.png", "*.jpg", "*.tiff"
+/// \sa nameFiltersToExtensions
+QStringList CTK_CORE_EXPORT nameFilterToExtensions(const QString& nameFilter);
+
+///
+/// Convert a nameFilter to a list of file extensions:
+/// "Images (*.png *.jpg *.tiff)", "Text (*.txt)" -> "*.png", "*.jpg", "*.tiff", "*.txt"
+QStringList CTK_CORE_EXPORT nameFiltersToExtensions(const QStringList& nameFilters);
+
+///
+/// Convert a wildcar extension filter ("*.jpg") into a regular expression string
+/// "*.jpg" -> ".*\\.jpg?$"
+QString CTK_CORE_EXPORT extensionToRegExp(const QString& extension);
+
+///
+/// Convert a list of wildcar extension filters ("*.jpg")
+/// into a regular expression string
+/// "*.jpg", "*.txt" -> "(.*\\.jpg?$|.*\\.txt?$)"
+QRegExp CTK_CORE_EXPORT nameFiltersToRegExp(const QStringList& nameFilters);
+
 }
 
 #endif

+ 3 - 77
Libs/Widgets/ctkPathLineEdit.cpp

@@ -32,81 +32,7 @@
 
 // CTK includes
 #include "ctkPathLineEdit.h"
-
-//-----------------------------------------------------------------------------
-const char *qt_file_dialog_filter_reg_exp =
-"^(.*)\\(([a-zA-Z0-9_.*? +;#\\-\\[\\]@\\{\\}/!<>\\$%&=^~:\\|]*)\\)$";
-
-//-----------------------------------------------------------------------------
-QStringList filterNameExtensions(const QString& filterName)
-{
-  QRegExp regexp(QString::fromLatin1(qt_file_dialog_filter_reg_exp));
-  int i = regexp.indexIn(filterName);
-  if (i < 0)
-    {
-    return QStringList();
-    }
-  QString f = regexp.cap(2);
-  return f.split(QLatin1Char(' '), QString::SkipEmptyParts);
-}
-
-//-----------------------------------------------------------------------------
-QStringList filterNamesExtensions(const QStringList& filterNames)
-{
-  QStringList extensions;
-  foreach(const QString& filterName, filterNames)
-    {
-    extensions << filterNameExtensions(filterName);
-    }
-  return extensions;
-}
-
-//-----------------------------------------------------------------------------
-QString extensionToRegExp(const QString& extension)
-{
-  // typically *.jpg
-  QRegExp extensionExtractor("\\*\\.(\\w+)");
-  int pos = extensionExtractor.indexIn(extension);
-  if (pos < 0)
-    {
-    return QString();
-    }
-  return ".*\\." + extensionExtractor.cap(1) + "?$";
-}
-
-//-----------------------------------------------------------------------------
-QRegExp filterNamesToRegExpExtensions(const QStringList& filterNames)
-{
-  QString pattern;
-  foreach(QString filterName, filterNames)
-    {
-    foreach(QString extension, filterNameExtensions(filterName))
-      {
-      QString regExpExtension = extensionToRegExp(extension);
-      if (!regExpExtension.isEmpty())
-        {
-        if (pattern.isEmpty())
-          {
-          pattern = "(";
-          }
-        else
-          {
-          pattern += "|";
-          }
-        pattern +=regExpExtension;
-        }
-      }
-    }
-  if (pattern.isEmpty())
-    {
-    pattern = ".+";
-    }
-  else
-    {
-    pattern += ")";
-    }
-  return QRegExp(pattern);
-}
+#include "ctkUtils.h"
 
 //-----------------------------------------------------------------------------
 class ctkPathLineEditPrivate
@@ -172,7 +98,7 @@ void ctkPathLineEditPrivate::updateFilter()
   // help completion for the QComboBox::QLineEdit
   QCompleter *newCompleter = new QCompleter(q);
   newCompleter->setModel(new QDirModel(
-                           filterNamesExtensions(this->NameFilters),
+                           ctk::nameFiltersToExtensions(this->NameFilters),
                            this->Filters | QDir::NoDotAndDotDot | QDir::AllDirs,
                            QDir::Name|QDir::DirsLast, newCompleter));
   this->ComboBox->setCompleter(newCompleter);
@@ -230,7 +156,7 @@ void ctkPathLineEdit::setNameFilters(const QStringList &nameFilters)
   d->updateFilter();
   d->ComboBox->lineEdit()->setValidator(
     new QRegExpValidator(
-      filterNamesToRegExpExtensions(d->NameFilters), this));
+      ctk::nameFiltersToRegExp(d->NameFilters), this));
 }
 
 //-----------------------------------------------------------------------------