Quellcode durchsuchen

ENH: Update ctkFileDialog API adding support for setting selection mode

Jean-Christophe Fillion-Robin vor 7 Jahren
Ursprung
Commit
89071902e2

+ 37 - 0
Libs/Widgets/Testing/Cpp/ctkFileDialogTest1.cpp

@@ -23,6 +23,7 @@
 #include <QCheckBox>
 
 // CTK includes
+#include "ctkCoreTestingMacros.h"
 #include "ctkFileDialog.h"
 
 // STD includes
@@ -30,6 +31,38 @@
 #include <iostream>
 
 //-----------------------------------------------------------------------------
+int testSelectionMode(ctkFileDialog* fileDialog)
+{
+  fileDialog->setSelectionMode(QAbstractItemView::ExtendedSelection);
+  CHECK_INT(fileDialog->selectionMode(), static_cast<int>(QAbstractItemView::ExtendedSelection));
+
+  // Due to limitation of QFileDialog API, calling setFileMode resets
+  // the selection mode.
+
+  fileDialog->setSelectionMode(QAbstractItemView::ExtendedSelection);
+  fileDialog->setFileMode(QFileDialog::Directory);
+  CHECK_INT(fileDialog->selectionMode(), static_cast<int>(QAbstractItemView::SingleSelection));
+
+  fileDialog->setSelectionMode(QAbstractItemView::ExtendedSelection);
+  fileDialog->setFileMode(QFileDialog::DirectoryOnly);
+  CHECK_INT(fileDialog->selectionMode(), static_cast<int>(QAbstractItemView::SingleSelection));
+
+  fileDialog->setSelectionMode(QAbstractItemView::ExtendedSelection);
+  fileDialog->setFileMode(QFileDialog::ExistingFile);
+  CHECK_INT(fileDialog->selectionMode(), static_cast<int>(QAbstractItemView::SingleSelection));
+
+  fileDialog->setSelectionMode(QAbstractItemView::ExtendedSelection);
+  fileDialog->setFileMode(QFileDialog::ExistingFiles);
+  CHECK_INT(fileDialog->selectionMode(), static_cast<int>(QAbstractItemView::ExtendedSelection));
+
+  fileDialog->setSelectionMode(QAbstractItemView::ExtendedSelection);
+  fileDialog->setFileMode(QFileDialog::AnyFile);
+  CHECK_INT(fileDialog->selectionMode(), static_cast<int>(QAbstractItemView::SingleSelection));
+
+  return EXIT_SUCCESS;
+}
+
+//-----------------------------------------------------------------------------
 int ctkFileDialogTest1(int argc, char * argv [] )
 {
   QApplication app(argc, argv);
@@ -44,6 +77,9 @@ int ctkFileDialogTest1(int argc, char * argv [] )
     {
     return EXIT_FAILURE;
     }
+
+  CHECK_EXIT_SUCCESS(testSelectionMode(&fileDialog));
+
   // the following is only in interactive mode
   if (argc < 2 || QString(argv[1]) != "-I" )
     {
@@ -56,6 +92,7 @@ int ctkFileDialogTest1(int argc, char * argv [] )
     {
     return EXIT_FAILURE;
     }
+
   return EXIT_SUCCESS;
 
 }

+ 44 - 0
Libs/Widgets/ctkFileDialog.cpp

@@ -28,6 +28,7 @@
 #include <QLineEdit>
 #include <QListView>
 #include <QPushButton>
+#include <QTreeView>
 
 // CTK includes
 #include "ctkFileDialog.h"
@@ -45,6 +46,7 @@ public:
 
   QPushButton* acceptButton()const;
   QListView* listView()const;
+  QTreeView* treeView()const;
 
   bool AcceptButtonEnable;
   bool AcceptButtonState;
@@ -93,6 +95,15 @@ QListView* ctkFileDialogPrivate::listView()const
 }
 
 //------------------------------------------------------------------------------
+QTreeView* ctkFileDialogPrivate::treeView()const
+{
+  Q_Q(const ctkFileDialog);
+  QTreeView* treeView = q->findChild<QTreeView*>();
+  Q_ASSERT(treeView);
+  return treeView;
+}
+
+//------------------------------------------------------------------------------
 void ctkFileDialogPrivate::observeAcceptButton()
 {
   Q_Q(ctkFileDialog);
@@ -176,6 +187,39 @@ QWidget* ctkFileDialog::bottomWidget()const
 }
 
 //------------------------------------------------------------------------------
+void ctkFileDialog::setSelectionMode(QAbstractItemView::SelectionMode mode)
+{
+  Q_D(ctkFileDialog);
+  foreach(QAbstractItemView* view, QList<QAbstractItemView*>()
+          << d->listView()
+          << d->treeView()
+          )
+    {
+    view->setSelectionMode(mode);
+    }
+}
+
+//------------------------------------------------------------------------------
+QAbstractItemView::SelectionMode ctkFileDialog::selectionMode() const
+{
+  Q_D(const ctkFileDialog);
+  return d->listView()->selectionMode();
+}
+
+//------------------------------------------------------------------------------
+void ctkFileDialog::clearSelection()
+{
+  Q_D(ctkFileDialog);
+  foreach(QAbstractItemView* view, QList<QAbstractItemView*>()
+          << d->listView()
+          << d->treeView()
+          )
+    {
+    view->clearSelection();
+    }
+}
+
+//------------------------------------------------------------------------------
 void ctkFileDialog::setAcceptButtonEnable(bool enable)
 {
   Q_D(ctkFileDialog);

+ 20 - 0
Libs/Widgets/ctkFileDialog.h

@@ -22,6 +22,7 @@
 #define __ctkFileDialog_h
 
 // Qt includes
+#include <QAbstractItemView>
 #include <QFileDialog>
 
 // CTK includes
@@ -41,6 +42,7 @@ class ctkFileDialogPrivate;
 class CTK_WIDGETS_EXPORT ctkFileDialog : public QFileDialog
 {
   Q_OBJECT
+  Q_PROPERTY(QAbstractItemView::SelectionMode SelectionMode READ selectionMode WRITE setSelectionMode)
 
 public:
   // Superclass typedef
@@ -62,6 +64,21 @@ public:
   /// Return the extra widget if any
   Q_INVOKABLE QWidget* bottomWidget()const;
 
+  /// Set the selection mode the views operate in.
+  ///
+  /// \warning The selection mode must explicitly be set each time
+  /// QFileDialog::setFileMode(FileMode mode) is invoked. This is required
+  /// because the QFileDialog::setFileMode(FileMode mode) method is not virtual
+  /// and it internally resets the selection mode.
+  ///
+  /// \sa clearSelection()
+  void setSelectionMode(QAbstractItemView::SelectionMode mode);
+
+  /// Get the selection mode of the views.
+  ///
+  /// \sa setSelectionMode(QAbstractItemView::SelectionMode)
+  QAbstractItemView::SelectionMode selectionMode() const;
+
   /// Internally used
   bool eventFilter(QObject *obj, QEvent *event);
 
@@ -71,6 +88,9 @@ public Q_SLOTS:
   /// dialog if a value is not set in the extra bottom widget.
   void setAcceptButtonEnable(bool enable);
 
+  /// Deselect all selected directories or files.
+  void clearSelection();
+
 Q_SIGNALS:
   /// Signals QFileDialog::file[s]Selected() are fired only when the Ok button
   /// is pressed, fileSelectionChanged(QStringList) is emitted when the