Ver código fonte

ENH: Add ctkDirectoryButton, a pushbutton that display a directory and popups a QFileDialog::GetExistingDirectory dialog.

Julien Finet 15 anos atrás
pai
commit
675016f22e

+ 3 - 0
Libs/Widgets/CMakeLists.txt

@@ -30,6 +30,8 @@ SET(KIT_SRCS
   ctkConsoleWidget.h
   ctkCoordinatesWidget.cpp
   ctkCoordinatesWidget.h
+  ctkDirectoryButton.cpp
+  ctkDirectoryButton.h
   ctkDoubleRangeSlider.cpp
   ctkDoubleRangeSlider.h
   ctkDoubleSlider.cpp
@@ -73,6 +75,7 @@ SET(KIT_MOC_SRCS
   ctkColorPickerButton.h
   ctkConsoleWidget.h
   ctkCoordinatesWidget.h
+  ctkDirectoryButton.h
   ctkDoubleRangeSlider.h
   ctkDoubleSlider.h
   ctkDynamicSpacer.h

+ 3 - 0
Libs/Widgets/Plugins/CMakeLists.txt

@@ -21,6 +21,8 @@ SET(PLUGIN_SRCS
   ctkColorPickerButtonPlugin.h
   ctkCoordinatesWidgetPlugin.cpp
   ctkCoordinatesWidgetPlugin.h
+  ctkDirectoryButtonPlugin.cpp
+  ctkDirectoryButtonPlugin.h
   ctkDoubleRangeSliderPlugin.cpp
   ctkDoubleRangeSliderPlugin.h
   ctkDoubleSliderPlugin.cpp
@@ -53,6 +55,7 @@ SET(PLUGIN_MOC_SRCS
   ctkCollapsibleGroupBoxPlugin.h
   ctkColorPickerButtonPlugin.h
   ctkCoordinatesWidgetPlugin.h
+  ctkDirectoryButtonPlugin.h
   ctkDoubleRangeSliderPlugin.h
   ctkDoubleSliderPlugin.h
   ctkDynamicSpacerPlugin.h

+ 63 - 0
Libs/Widgets/Plugins/ctkDirectoryButtonPlugin.cpp

@@ -0,0 +1,63 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc. 
+  All rights reserved.
+  Distributed under a BSD License. See LICENSE.txt file.
+
+  This software is distributed "AS IS" WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the above copyright notice for more information.
+
+=========================================================================*/
+
+// CTK includes
+#include "ctkDirectoryButtonPlugin.h"
+#include "ctkDirectoryButton.h"
+
+//-----------------------------------------------------------------------------
+ctkDirectoryButtonPlugin::ctkDirectoryButtonPlugin(QObject *_parent)
+        : QObject(_parent)
+{
+
+}
+
+//-----------------------------------------------------------------------------
+QWidget *ctkDirectoryButtonPlugin::createWidget(QWidget *_parent)
+{
+  ctkDirectoryButton* _widget = new ctkDirectoryButton(_parent);
+  return _widget;
+}
+
+//-----------------------------------------------------------------------------
+QString ctkDirectoryButtonPlugin::domXml() const
+{
+  return "<widget class=\"ctkDirectoryButton\" \
+          name=\"CTKDirectoryButton\">\n"
+          "</widget>\n";
+}
+
+// --------------------------------------------------------------------------
+QIcon ctkDirectoryButtonPlugin::icon() const
+{
+  return QIcon(":/Icons/pushbutton.png");
+}
+
+//-----------------------------------------------------------------------------
+QString ctkDirectoryButtonPlugin::includeFile() const
+{
+  return "ctkDirectoryButton.h";
+}
+
+//-----------------------------------------------------------------------------
+bool ctkDirectoryButtonPlugin::isContainer() const
+{
+  return false;
+}
+
+//-----------------------------------------------------------------------------
+QString ctkDirectoryButtonPlugin::name() const
+{
+  return "ctkDirectoryButton";
+}

+ 38 - 0
Libs/Widgets/Plugins/ctkDirectoryButtonPlugin.h

@@ -0,0 +1,38 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc. 
+  All rights reserved.
+  Distributed under a BSD License. See LICENSE.txt file.
+
+  This software is distributed "AS IS" WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __ctkDirectoryButtonPlugin_h
+#define __ctkDirectoryButtonPlugin_h
+
+// CTK includes
+#include "ctkWidgetsAbstractPlugin.h"
+
+class CTK_WIDGETS_PLUGINS_EXPORT ctkDirectoryButtonPlugin :
+  public QObject,
+  public ctkWidgetsAbstractPlugin
+{
+  Q_OBJECT
+
+public:
+  ctkDirectoryButtonPlugin(QObject *_parent = 0);
+  
+  QWidget *createWidget(QWidget *_parent);
+  QString  domXml() const;
+  QIcon    icon() const;
+  QString  includeFile() const;
+  bool     isContainer() const;
+  QString  name() const;
+};
+
+#endif

+ 2 - 0
Libs/Widgets/Plugins/ctkWidgetsPlugins.h

@@ -30,6 +30,7 @@
 #include "ctkCollapsibleGroupBoxPlugin.h"
 #include "ctkColorPickerButtonPlugin.h"
 #include "ctkCoordinatesWidgetPlugin.h"
+#include "ctkDirectoryButtonPlugin.h"
 #include "ctkDoubleRangeSliderPlugin.h"
 #include "ctkDoubleSliderPlugin.h"
 #include "ctkDynamicSpacerPlugin.h"
@@ -56,6 +57,7 @@ public:
             << new ctkCollapsibleGroupBoxPlugin
             << new ctkColorPickerButtonPlugin
             << new ctkCoordinatesWidgetPlugin
+            << new ctkDirectoryButtonPlugin
             << new ctkDoubleRangeSliderPlugin
             << new ctkDoubleSliderPlugin
             << new ctkDynamicSpacerPlugin

+ 101 - 0
Libs/Widgets/ctkDirectoryButton.cpp

@@ -0,0 +1,101 @@
+// Qt includes
+#include <QStyle>
+
+// CTK includes
+#include "ctkDirectoryButton.h"
+
+//-----------------------------------------------------------------------------
+class ctkDirectoryButtonPrivate: public ctkPrivate<ctkDirectoryButton>
+{
+public:
+  ctkDirectoryButtonPrivate();
+  void init();
+  QString Caption;
+  QFileDialog::Options Options;
+};
+
+//-----------------------------------------------------------------------------
+ctkDirectoryButtonPrivate::ctkDirectoryButtonPrivate()
+{
+  this->Options = QFileDialog::ShowDirsOnly;
+}
+
+//-----------------------------------------------------------------------------
+void ctkDirectoryButtonPrivate::init()
+{
+  CTK_P(ctkDirectoryButton);
+  QObject::connect(p, SIGNAL(clicked()), p, SLOT(browse()));
+}
+
+//-----------------------------------------------------------------------------
+ctkDirectoryButton::ctkDirectoryButton(QWidget * parentWidget)
+  :QPushButton(parentWidget)
+{
+  CTK_INIT_PRIVATE(ctkDirectoryButton);
+  this->setIcon(this->style()->standardIcon(QStyle::SP_DirIcon));
+  ctk_d()->init();
+}
+    
+//-----------------------------------------------------------------------------
+ctkDirectoryButton::ctkDirectoryButton(const QString & text, QWidget * parentWidget)
+  :QPushButton(text, parentWidget)
+{
+  CTK_INIT_PRIVATE(ctkDirectoryButton);
+  this->setIcon(this->style()->standardIcon(QStyle::SP_DirIcon));
+  ctk_d()->init();
+}
+
+//-----------------------------------------------------------------------------
+ctkDirectoryButton::ctkDirectoryButton(
+  const QIcon & icon, const QString & text, QWidget * parentWidget)
+  :QPushButton(icon, text, parentWidget)
+{
+  CTK_INIT_PRIVATE(ctkDirectoryButton);
+  ctk_d()->init();
+}
+
+//-----------------------------------------------------------------------------
+void ctkDirectoryButton::setCaption(const QString& captionTitle)
+{
+  CTK_D(ctkDirectoryButton);
+  d->Caption = captionTitle;
+}
+
+//-----------------------------------------------------------------------------
+const QString& ctkDirectoryButton::caption()const
+{
+  CTK_D(const ctkDirectoryButton);
+  return d->Caption;
+}
+
+//-----------------------------------------------------------------------------
+void ctkDirectoryButton::ctkDirectoryButton::setOptions(const QFileDialog::Options& dialogOptions)
+{
+  CTK_D(ctkDirectoryButton);
+  d->Options = dialogOptions;
+}
+
+//-----------------------------------------------------------------------------
+const QFileDialog::Options& ctkDirectoryButton::options()const
+{
+  CTK_D(const ctkDirectoryButton);
+  return d->Options;
+}
+
+//-----------------------------------------------------------------------------
+void ctkDirectoryButton::browse()
+{
+  CTK_D(ctkDirectoryButton);
+  QString directory = 
+    QFileDialog::getExistingDirectory(
+      this, 
+      d->Caption.isEmpty() ? this->toolTip() : d->Caption, 
+      this->text(), 
+      d->Options);
+  if (directory.isEmpty())
+    {
+    return;
+    }
+  this->setText(directory);
+  emit directoryChanged(directory);
+}

+ 53 - 0
Libs/Widgets/ctkDirectoryButton.h

@@ -0,0 +1,53 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc. 
+  All rights reserved.
+  Distributed under a BSD License. See LICENSE.txt file.
+
+  This software is distributed "AS IS" WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __ctkDirectoryButton_h
+#define __ctkDirectoryButton_h
+
+// Qt includes
+#include <QPushButton>
+#include <QFileDialog>
+
+// CTK includes
+#include <ctkPimpl.h>
+#include "CTKWidgetsExport.h"
+class ctkDirectoryButtonPrivate;
+
+class CTK_WIDGETS_EXPORT ctkDirectoryButton: public QPushButton
+{
+  Q_OBJECT
+  Q_PROPERTY(QString caption READ caption WRITE setCaption)
+  Q_PROPERTY(QFileDialog::Options options READ options WRITE setOptions)
+public: 
+  ctkDirectoryButton(QWidget * parent = 0);
+  ctkDirectoryButton(const QString & text, QWidget * parent = 0);
+  ctkDirectoryButton(const QIcon & icon, const QString & text, QWidget * parent = 0);
+
+  void setCaption(const QString& caption);
+  const QString& caption()const;
+  
+  void setOptions(const QFileDialog::Options& options);
+  const QFileDialog::Options& options()const;
+
+public slots:
+  void browse();
+
+signals:
+  void directoryChanged(const QString&);
+
+private:
+  CTK_DECLARE_PRIVATE(ctkDirectoryButton);
+};
+
+#endif