瀏覽代碼

ENH: ctkDirectoryButton: add "directory" property, change relationship with QPushButton from IS-A into HAS-A

Julien Finet 15 年之前
父節點
當前提交
846a621503
共有 2 個文件被更改,包括 80 次插入30 次删除
  1. 66 26
      Libs/Widgets/ctkDirectoryButton.cpp
  2. 14 4
      Libs/Widgets/ctkDirectoryButton.h

+ 66 - 26
Libs/Widgets/ctkDirectoryButton.cpp

@@ -19,6 +19,8 @@
 =========================================================================*/
 
 // Qt includes
+#include <QHBoxLayout>
+#include <QPushButton>
 #include <QStyle>
 
 // CTK includes
@@ -30,92 +32,130 @@ class ctkDirectoryButtonPrivate: public ctkPrivate<ctkDirectoryButton>
 public:
   ctkDirectoryButtonPrivate();
   void init();
-  QString Caption;
-  ctkDirectoryButton::Options _Options;
+
+  QDir         Directory;
+  QPushButton* PushButton;
+  QString      DialogCaption;
+  ctkDirectoryButton::Options DialogOptions;
 };
 
 //-----------------------------------------------------------------------------
 ctkDirectoryButtonPrivate::ctkDirectoryButtonPrivate()
 {
-  this->_Options = ctkDirectoryButton::ShowDirsOnly;
+  this->DialogOptions = ctkDirectoryButton::ShowDirsOnly;
 }
 
 //-----------------------------------------------------------------------------
 void ctkDirectoryButtonPrivate::init()
 {
   CTK_P(ctkDirectoryButton);
-  QObject::connect(p, SIGNAL(clicked()), p, SLOT(browse()));
+  this->PushButton = new QPushButton(p);
+  QObject::connect(this->PushButton, SIGNAL(clicked()), p, SLOT(browse()));
+  QHBoxLayout* l = new QHBoxLayout(p);
+  l->addWidget(this->PushButton);
+  l->setContentsMargins(0,0,0,0);
+  p->setLayout(l);
 }
 
 //-----------------------------------------------------------------------------
 ctkDirectoryButton::ctkDirectoryButton(QWidget * parentWidget)
-  :QPushButton(parentWidget)
+  :QWidget(parentWidget)
 {
   CTK_INIT_PRIVATE(ctkDirectoryButton);
-  this->setIcon(this->style()->standardIcon(QStyle::SP_DirIcon));
-  ctk_d()->init();
+  CTK_D(ctkDirectoryButton);
+  d->init();
+  d->PushButton->setIcon(this->style()->standardIcon(QStyle::SP_DirIcon));
 }
     
 //-----------------------------------------------------------------------------
-ctkDirectoryButton::ctkDirectoryButton(const QString & text, QWidget * parentWidget)
-  :QPushButton(text, parentWidget)
+ctkDirectoryButton::ctkDirectoryButton(const QString& dir, 
+                                       QWidget * parentWidget)
+  :QWidget(parentWidget)
 {
   CTK_INIT_PRIVATE(ctkDirectoryButton);
-  this->setIcon(this->style()->standardIcon(QStyle::SP_DirIcon));
-  ctk_d()->init();
+  CTK_D(ctkDirectoryButton);
+  d->init();
+  d->Directory = QDir(dir);
+  d->PushButton->setText(d->Directory.path());
+  d->PushButton->setIcon(this->style()->standardIcon(QStyle::SP_DirIcon));
 }
 
 //-----------------------------------------------------------------------------
 ctkDirectoryButton::ctkDirectoryButton(
-  const QIcon & icon, const QString & text, QWidget * parentWidget)
-  :QPushButton(icon, text, parentWidget)
+  const QIcon & icon, const QString& dir, QWidget * parentWidget)
+  :QWidget(parentWidget)
 {
   CTK_INIT_PRIVATE(ctkDirectoryButton);
-  ctk_d()->init();
+  CTK_D(ctkDirectoryButton);
+  d->init();
+  d->Directory = QDir(dir);
+  d->PushButton->setText(d->Directory.path());
+  d->PushButton->setIcon(icon);
+}
+
+//-----------------------------------------------------------------------------
+void ctkDirectoryButton::setDirectory(const QString& dir)
+{
+  CTK_D(ctkDirectoryButton);
+  QDir newDirectory(dir);
+  if (d->Directory == newDirectory )
+    {
+    return;
+    }
+  d->Directory = newDirectory;
+  d->PushButton->setText(d->Directory.path());
+  emit directoryChanged(d->Directory.path());
+}
+
+//-----------------------------------------------------------------------------
+QString ctkDirectoryButton::directory()const
+{
+  CTK_D(const ctkDirectoryButton);
+  return d->Directory.path();
 }
 
 //-----------------------------------------------------------------------------
-void ctkDirectoryButton::setCaption(const QString& captionTitle)
+void ctkDirectoryButton::setCaption(const QString& caption)
 {
   CTK_D(ctkDirectoryButton);
-  d->Caption = captionTitle;
+  d->DialogCaption = caption;
 }
 
 //-----------------------------------------------------------------------------
 const QString& ctkDirectoryButton::caption()const
 {
   CTK_D(const ctkDirectoryButton);
-  return d->Caption;
+  return d->DialogCaption;
 }
 
 //-----------------------------------------------------------------------------
 void ctkDirectoryButton::ctkDirectoryButton::setOptions(const Options& dialogOptions)
 {
   CTK_D(ctkDirectoryButton);
-  d->_Options = dialogOptions;
+  d->DialogOptions = dialogOptions;
 }
 
 //-----------------------------------------------------------------------------
 const ctkDirectoryButton::Options& ctkDirectoryButton::options()const
 {
   CTK_D(const ctkDirectoryButton);
-  return d->_Options;
+  return d->DialogOptions;
 }
 
 //-----------------------------------------------------------------------------
 void ctkDirectoryButton::browse()
 {
   CTK_D(ctkDirectoryButton);
-  QString directory = 
+  QString dir = 
     QFileDialog::getExistingDirectory(
       this, 
-      d->Caption.isEmpty() ? this->toolTip() : d->Caption, 
-      this->text(), 
-      QFlags<QFileDialog::Option>(int(d->_Options)));
-  if (directory.isEmpty())
+      d->DialogCaption.isEmpty() ? this->toolTip() : d->DialogCaption, 
+      d->Directory.path(), 
+      QFlags<QFileDialog::Option>(int(d->DialogOptions)));
+  // An empty directory means that the user cancelled the dialog.
+  if (dir.isEmpty())
     {
     return;
     }
-  this->setText(directory);
-  emit directoryChanged(directory);
+  this->setDirectory(dir);
 }

+ 14 - 4
Libs/Widgets/ctkDirectoryButton.h

@@ -22,7 +22,7 @@
 #define __ctkDirectoryButton_h
 
 // Qt includes
-#include <QPushButton>
+#include <QDir>
 #include <QFileDialog>
 
 // CTK includes
@@ -30,9 +30,10 @@
 #include "CTKWidgetsExport.h"
 class ctkDirectoryButtonPrivate;
 
-class CTK_WIDGETS_EXPORT ctkDirectoryButton: public QPushButton
+class CTK_WIDGETS_EXPORT ctkDirectoryButton: public QWidget
 {
   Q_OBJECT
+  Q_PROPERTY(QString directory READ directory WRITE setDirectory)
   Q_PROPERTY(QString caption READ caption WRITE setCaption)
   Q_PROPERTY(Options options READ options WRITE setOptions)
   // QFileDialog::Options is not a meta-type, we need to create our own.
@@ -53,9 +54,15 @@ public:
   Q_DECLARE_FLAGS(Options, Option)
     
   ctkDirectoryButton(QWidget * parent = 0);
-  ctkDirectoryButton(const QString & text, QWidget * parent = 0);
-  ctkDirectoryButton(const QIcon & icon, const QString & text, QWidget * parent = 0);
+  ctkDirectoryButton(const QString& directory, QWidget * parent = 0);
+  ctkDirectoryButton(const QIcon& icon, const QString& directory, QWidget * parent = 0);
 
+  void setDirectory(const QString& directory);
+  QString directory()const;
+  
+  ///
+  /// The title of the file dialog used to select a new directory
+  /// If caption is not set, internally use QWidget::tooltip()
   void setCaption(const QString& caption);
   const QString& caption()const;
   
@@ -66,6 +73,9 @@ public slots:
   void browse();
 
 signals:
+  ///
+  /// directoryChanged is emitted when the current directory changes
+  ///if you want a directoryChanged signal as a utility. Feel free to add it
   void directoryChanged(const QString&);
 
 private: