ソースを参照

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));
 }
 
 //-----------------------------------------------------------------------------