Преглед изворни кода

Cleanup ctkDateRangeWidget

Expose startDateTime/endDateTime in meta object system
Expose setAnyDate/setToday/setYesterday/setLastWeek/setLastMonth
Change includeTime into displayTime
Support displayTime
Add comments
Connect startDateTimeChanged/endDateTimeChanged signals
Add more code coverage in unit test
Julien Finet пре 14 година
родитељ
комит
9021b4f7f2

+ 84 - 69
Libs/Widgets/Resources/UI/ctkDateRangeWidget.ui

@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>207</width>
-    <height>233</height>
+    <width>100</width>
+    <height>186</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -20,8 +20,62 @@
    <string>ctkSliderSpinBoxWidget</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="margin">
+    <number>0</number>
+   </property>
    <item>
-    <widget class="QFrame" name="frame_4">
+    <widget class="QRadioButton" name="AnyDateRadioButton">
+     <property name="text">
+      <string>Any Date</string>
+     </property>
+     <property name="checked">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="TodayRadioButton">
+     <property name="text">
+      <string>Today</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="YesterdayRadioButton">
+     <property name="text">
+      <string>Yesterday</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="LastWeekRadioButton">
+     <property name="text">
+      <string>Last Week</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="LastMonthRadioButton">
+     <property name="text">
+      <string>Last Month</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="SelectRangeRadioButton">
+     <property name="text">
+      <string>Select Range</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QFrame" name="DateRangeWidget">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
      <property name="frameShape">
       <enum>QFrame::StyledPanel</enum>
      </property>
@@ -29,63 +83,17 @@
       <enum>QFrame::Raised</enum>
      </property>
      <layout class="QVBoxLayout" name="verticalLayout_2">
-      <item>
-       <widget class="QRadioButton" name="AnyDate">
-        <property name="text">
-         <string>Any Date</string>
-        </property>
-        <property name="checked">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QRadioButton" name="Today">
-        <property name="text">
-         <string>Today</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QRadioButton" name="Yesterday">
-        <property name="text">
-         <string>Yesterday</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QRadioButton" name="LastWeek">
-        <property name="text">
-         <string>Last Week</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QRadioButton" name="LastMonth">
-        <property name="text">
-         <string>Last Month</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QRadioButton" name="SelectRange">
-        <property name="text">
-         <string>Select Range</string>
-        </property>
-       </widget>
-      </item>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
       <item>
        <widget class="QDateTimeEdit" name="StartDate">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="date">
-         <date>
-          <year>2010</year>
-          <month>1</month>
-          <day>1</day>
-         </date>
-        </property>
         <property name="displayFormat">
          <string>MMM/dd/yyyy</string>
         </property>
@@ -96,16 +104,6 @@
       </item>
       <item>
        <widget class="QDateTimeEdit" name="EndDate">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="date">
-         <date>
-          <year>2010</year>
-          <month>12</month>
-          <day>31</day>
-         </date>
-        </property>
         <property name="displayFormat">
          <string>MMM/dd/yyyy</string>
         </property>
@@ -120,5 +118,22 @@
   </layout>
  </widget>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>SelectRangeRadioButton</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>DateRangeWidget</receiver>
+   <slot>setVisible(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>31</x>
+     <y>119</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>43</x>
+     <y>162</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
 </ui>

+ 147 - 8
Libs/Widgets/Testing/Cpp/ctkDateRangeWidgetTest1.cpp

@@ -20,6 +20,7 @@
 
 // Qt includes
 #include <QApplication>
+#include <QSignalSpy>
 #include <QTimer>
 
 // CTK includes
@@ -34,15 +35,153 @@ int ctkDateRangeWidgetTest1(int argc, char * argv [] )
 {
   QApplication app(argc, argv);
 
+  QDateTime today = QDateTime(QDate::currentDate());
+  QDateTime tomorrow = today.addDays(1);
+  QDateTime yesterday = today.addDays(-1);
+  QDateTime lastWeek = today.addDays(-7);
+  QDateTime lastMonth = today.addMonths(-1);
   ctkDateRangeWidget dateRange;
+  
+  if (dateRange.displayTime())
+    {
+    std::cerr << "ctkDateRangeWidget::ctkDateRangeWidget(): "
+              << "wrong default displayTime()" << std::endl;
+    return EXIT_FAILURE;
+    }
+  if (!dateRange.isAnyDate())
+    {
+    std::cerr << "ctkDateRangeWidget::ctkDateRangeWidget(): "
+              << "default date range failed: " 
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+  
+  dateRange.setToday();
+  if (dateRange.isAnyDate() ||
+      dateRange.startDateTime() != today ||
+      dateRange.endDateTime() != tomorrow)
+    {
+    std::cerr << "ctkDateRangeWidget::setToday(): "
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  dateRange.setYesterday();
+  if (dateRange.isAnyDate() ||
+      dateRange.startDateTime() != yesterday ||
+      dateRange.endDateTime() != today)
+    {
+    std::cerr << "ctkDateRangeWidget::setYesterday(): "
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  dateRange.setLastWeek();
+  if (dateRange.isAnyDate() ||
+      dateRange.startDateTime() != lastWeek ||
+      dateRange.endDateTime() != today)
+    {
+    std::cerr << "ctkDateRangeWidget::setLastWeek(): "
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  dateRange.setLastMonth();
+  if (dateRange.isAnyDate() ||
+      dateRange.startDateTime() != lastMonth ||
+      dateRange.endDateTime() != today)
+    {
+    std::cerr << "ctkDateRangeWidget::setLastMonth(): "
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  dateRange.setAnyDate();
+  if (!dateRange.isAnyDate() ||
+      dateRange.startDateTime() == lastMonth ||
+      dateRange.endDateTime() == today)
+    {
+    std::cerr << "ctkDateRangeWidget::setAnyDate(): "
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  dateRange.setDateTimeRange(QDateTime(QDate(-2, -9,12345678)),
+                             QDateTime(QDate(2010, 15, 32)));
+  if (!dateRange.isAnyDate() ||
+      dateRange.startDateTime() == lastMonth ||
+      dateRange.endDateTime() == today)
+    {
+    std::cerr << "ctkDateRangeWidget::setDateTimeRange(): "
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  dateRange.setDateTimeRange(today, tomorrow);
+  if (dateRange.isAnyDate() ||
+      !dateRange.startDateTime().isValid() ||
+      !dateRange.endDateTime().isValid())
+    {
+    std::cerr << "ctkDateRangeWidget::setDateTimeRange(): "
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  QDateTime oldStart = dateRange.startDateTime();
+  QDateTime oldEnd = dateRange.endDateTime();
+  dateRange.setSelectRange();
+  if (dateRange.startDateTime() != oldStart ||
+      dateRange.endDateTime() != oldEnd)
+    {
+    std::cerr << "ctkDateRangeWidget::setSelectRange(): "
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+  
+  dateRange.setDisplayTime(true);
+  if (!dateRange.displayTime())
+    {
+    std::cerr << "ctkDateRangeWidget::setSelectRange(): "
+              << qPrintable(dateRange.startDateTime().toString()) << " "
+              << qPrintable(dateRange.endDateTime().toString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  QSignalSpy startSpy(&dateRange, SIGNAL(startDateTimeChanged(const QDateTime&)));
+  QSignalSpy endSpy(&dateRange, SIGNAL(endDateTimeChanged(const QDateTime&)));
+
+  dateRange.setLastWeek();  
+  if (startSpy.count() != 1 || endSpy.count() != 1)
+    {
+    std::cerr << "ctkDateRangeWidget::setLastWeek(): "
+              << startSpy.count() << " " << endSpy.count() << std::endl;
+    return EXIT_FAILURE;
+    }
+  startSpy.clear();
+  endSpy.clear();
+
+  dateRange.setLastMonth();  
+  if (startSpy.count() != 1 || endSpy.count() != 0)
+    {
+    std::cerr << "ctkDateRangeWidget::setLastMonth(): "
+              << startSpy.count() << " " << endSpy.count() << std::endl;
+    return EXIT_FAILURE;
+    }
+  
   dateRange.show();
-  dateRange.onToday();
-  dateRange.onYesterday();
-  dateRange.onAnyDate();
-  dateRange.onLastMonth();
-  dateRange.onLastWeek();
-  dateRange.onSelectRange();
-
-  return EXIT_SUCCESS;
+  if (argc < 2 || QString(argv[1]) != "-I" )
+    {
+    QTimer::singleShot(200, &app, SLOT(quit()));
+    }
+  return app.exec();
 }
 

+ 135 - 79
Libs/Widgets/ctkDateRangeWidget.cpp

@@ -39,8 +39,16 @@ protected:
   ctkDateRangeWidget* const q_ptr;
 public:
   ctkDateRangeWidgetPrivate(ctkDateRangeWidget& object);
-
-  bool          includeTime;
+  /// Automatically select the right radio button based on the date range
+  void autoselectRadioButton();
+
+  /// ForceSelectRange is set to true when the user expressively requested
+  /// to have "Select Range" option active. This property is set only if
+  /// the user clicks on the option or if setSelectRange() is programatically
+  /// called
+  bool          ForceSelectRange;
+  /// DisplayTime is true if the time is displayed in the range widget
+  bool          DisplayTime;
 };
 
 
@@ -48,7 +56,52 @@ public:
 ctkDateRangeWidgetPrivate::ctkDateRangeWidgetPrivate(ctkDateRangeWidget& object)
   :q_ptr(&object)
 {
-  this->includeTime = false;
+  this->ForceSelectRange = true;
+  this->DisplayTime = true;
+}
+// -------------------------------------------------------------------------
+void ctkDateRangeWidgetPrivate::autoselectRadioButton()
+{
+  Q_Q(ctkDateRangeWidget);
+  QDate startDate = q->startDateTime().date();
+  QDate endDate = q->endDateTime().date();
+  if (this->ForceSelectRange)
+    {
+    this->SelectRangeRadioButton->setChecked(true);
+    }
+  else if (q->isAnyDate())
+    {
+    this->AnyDateRadioButton->setChecked(true);
+    }
+  else if (q->startDateTime() != QDateTime(q->startDateTime().date()) ||
+           q->endDateTime() != QDateTime(q->endDateTime().date()))
+    {
+    this->SelectRangeRadioButton->setChecked(true);
+    }
+  else if (startDate.addDays(1) == endDate &&
+           startDate == QDate::currentDate())
+    {
+    this->TodayRadioButton->setChecked(true);
+    }
+  else if (startDate.addDays(1) == endDate &&
+           endDate == QDate::currentDate())
+    {
+    this->YesterdayRadioButton->setChecked(true);
+    }
+  else if (startDate.addDays(7) == endDate &&
+           endDate == QDate::currentDate())
+    {
+    this->LastWeekRadioButton->setChecked(true);
+    }
+  else if (startDate.addDays(31) == endDate &&
+           endDate == QDate::currentDate())
+    {
+    this->LastMonthRadioButton->setChecked(true);
+    }
+  else
+    {
+    this->SelectRangeRadioButton->setChecked(true);
+    }
 }
 
 // --------------------------------------------------------------------------
@@ -59,15 +112,22 @@ ctkDateRangeWidget::ctkDateRangeWidget(QWidget* _parent) : Superclass(_parent)
   
   d->setupUi(this);
 
-  d->StartDate->setVisible(false);
-  d->EndDate->setVisible(false);
+  d->DateRangeWidget->setVisible(d->SelectRangeRadioButton->isChecked());
 
-  QObject::connect(d->AnyDate, SIGNAL(clicked()),this, SLOT(onAnyDate()));
-  QObject::connect(d->Today, SIGNAL(clicked()),this, SLOT(onToday()));
-  QObject::connect(d->Yesterday, SIGNAL(clicked()),this, SLOT(onYesterday()));
-  QObject::connect(d->LastWeek, SIGNAL(clicked()),this, SLOT(onLastWeek()));
-  QObject::connect(d->LastMonth, SIGNAL(clicked()),this, SLOT(onLastMonth()));
-  QObject::connect(d->SelectRange, SIGNAL(clicked()),this, SLOT(onSelectRange()));
+  this->setDisplayTime(false);
+  this->setDateTimeRange(QDateTime(), QDateTime());
+  
+  QObject::connect(d->AnyDateRadioButton, SIGNAL(clicked()),this, SLOT(setAnyDate()));
+  QObject::connect(d->TodayRadioButton, SIGNAL(clicked()),this, SLOT(setToday()));
+  QObject::connect(d->YesterdayRadioButton, SIGNAL(clicked()),this, SLOT(setYesterday()));
+  QObject::connect(d->LastWeekRadioButton, SIGNAL(clicked()),this, SLOT(setLastWeek()));
+  QObject::connect(d->LastMonthRadioButton, SIGNAL(clicked()),this, SLOT(setLastMonth()));
+  QObject::connect(d->SelectRangeRadioButton, SIGNAL(clicked()),this, SLOT(setSelectRange()));
+
+  QObject::connect(d->StartDate, SIGNAL(dateTimeChanged(const QDateTime&)),
+                   this, SIGNAL(startDateTimeChanged(const QDateTime&)));
+  QObject::connect(d->EndDate, SIGNAL(dateTimeChanged(const QDateTime&)),
+                   this, SIGNAL(endDateTimeChanged(const QDateTime&)));
 }
 
 // --------------------------------------------------------------------------
@@ -75,7 +135,6 @@ ctkDateRangeWidget::~ctkDateRangeWidget()
 {
 }
 
-
 // --------------------------------------------------------------------------
 QDateTime ctkDateRangeWidget::startDateTime()const
 {
@@ -93,122 +152,119 @@ QDateTime ctkDateRangeWidget::endDateTime()const
 // --------------------------------------------------------------------------
 void ctkDateRangeWidget::setStartDateTime(QDateTime dateTime)
 {
-  Q_D(const ctkDateRangeWidget);
-  return d->StartDate->setDateTime(dateTime);
+  Q_D(ctkDateRangeWidget);
+  d->StartDate->setDateTime(dateTime);
+  d->autoselectRadioButton();
 }
 
 // --------------------------------------------------------------------------
 void ctkDateRangeWidget::setEndDateTime(QDateTime dateTime)
 {
-  Q_D(const ctkDateRangeWidget);
-  return d->EndDate->setDateTime(dateTime);
+  Q_D(ctkDateRangeWidget);
+  d->EndDate->setDateTime(dateTime);
+  d->autoselectRadioButton();
 }
 
 // --------------------------------------------------------------------------
 void ctkDateRangeWidget::setDateTimeRange(QDateTime startDateTime, QDateTime endDateTime)
 {
-  Q_D(const ctkDateRangeWidget);
-  return d->StartDate->setDateTime(startDateTime);
-  return d->EndDate->setDateTime(endDateTime);
+  Q_D(ctkDateRangeWidget);
+  d->StartDate->setDateTime(startDateTime.isValid() ?
+    startDateTime : d->StartDate->minimumDateTime());
+  d->EndDate->setDateTime(endDateTime.isValid() ?
+    endDateTime : d->EndDate->maximumDateTime());
+  d->autoselectRadioButton();
 }
 
 // --------------------------------------------------------------------------
-void ctkDateRangeWidget::onAnyDate()
+void ctkDateRangeWidget::setDateRange(QDate startDate, QDate endDate)
 {
   Q_D(const ctkDateRangeWidget);
-  d->StartDate->setEnabled(false);
-  d->EndDate->setEnabled(false);
-  d->StartDate->setVisible(false);
-  d->EndDate->setVisible(false);
+  this->setDateTimeRange(QDateTime(startDate), QDateTime(endDate));
 }
 
 // --------------------------------------------------------------------------
-void ctkDateRangeWidget::onToday()
+void ctkDateRangeWidget::setAnyDate()
 {
-  Q_D(const ctkDateRangeWidget);
-  QDateTime now = QDateTime::currentDateTime();
-  d->StartDate->setDate(now.date());
-  d->EndDate->setDate(now.date().addDays(1));
-  d->StartDate->setEnabled(false);
-  d->EndDate->setEnabled(false);
-  d->StartDate->setVisible(true);
-  d->EndDate->setVisible(true);
+  Q_D(ctkDateRangeWidget);
+  d->ForceSelectRange = false;
+  this->setDateTimeRange(QDateTime(), QDateTime());
 }
 
 // --------------------------------------------------------------------------
-void ctkDateRangeWidget::onYesterday()
+void ctkDateRangeWidget::setToday()
 {
-  Q_D(const ctkDateRangeWidget);
-  QDateTime now = QDateTime::currentDateTime();
-  d->StartDate->setDate(now.date().addDays(-1));
-  d->EndDate->setDate(now.date());
-  d->StartDate->setEnabled(false);
-  d->EndDate->setEnabled(false);
-  d->StartDate->setVisible(true);
-  d->EndDate->setVisible(true);
+  Q_D(ctkDateRangeWidget);
+  d->ForceSelectRange = false;
+  QDate today = QDate::currentDate();
+  this->setDateRange(today, today.addDays(1));
 }
 
 // --------------------------------------------------------------------------
-void ctkDateRangeWidget::onLastWeek()
+void ctkDateRangeWidget::setYesterday()
 {
-  Q_D(const ctkDateRangeWidget);
-  QDateTime now = QDateTime::currentDateTime();
-  d->StartDate->setDate(now.date().addDays(-7));
-  d->EndDate->setDate(now.date());
-  d->StartDate->setEnabled(false);
-  d->EndDate->setEnabled(false);
-  d->StartDate->setVisible(true);
-  d->EndDate->setVisible(true);
+  Q_D(ctkDateRangeWidget);
+  d->ForceSelectRange = false;
+  QDate today = QDate::currentDate();
+  this->setDateRange(today.addDays(-1), today);
 }
 
 // --------------------------------------------------------------------------
-void ctkDateRangeWidget::onLastMonth()
+void ctkDateRangeWidget::setLastWeek()
 {
-  Q_D(const ctkDateRangeWidget);
-  QDateTime now = QDateTime::currentDateTime();
-  d->StartDate->setDate(now.date().addDays(-31));
-  d->EndDate->setDate(now.date());
-  d->StartDate->setEnabled(false);
-  d->EndDate->setEnabled(false);
-  d->StartDate->setVisible(true);
-  d->EndDate->setVisible(true);
+  Q_D(ctkDateRangeWidget);
+  d->ForceSelectRange = false;
+  QDate today = QDate::currentDate();
+  this->setDateRange(today.addDays(-7), today);
 }
 
 // --------------------------------------------------------------------------
-void ctkDateRangeWidget::onSelectRange()
+void ctkDateRangeWidget::setLastMonth()
 {
-  Q_D(const ctkDateRangeWidget);
-  d->StartDate->setEnabled(true);
-  d->EndDate->setEnabled(true);
-  d->StartDate->setVisible(true);
-  d->EndDate->setVisible(true);
+  Q_D(ctkDateRangeWidget);
+  d->ForceSelectRange = false;
+  QDate today = QDate::currentDate();
+  this->setDateRange(today.addMonths(-1), today);
 }
 
+// --------------------------------------------------------------------------
+void ctkDateRangeWidget::setSelectRange()
+{
+  Q_D(ctkDateRangeWidget);
+  d->SelectRangeRadioButton->setChecked(true);
+  d->ForceSelectRange = true;
+}
 
 // -------------------------------------------------------------------------
-void ctkDateRangeWidget::setIncludeTime(bool includeTime)
+bool ctkDateRangeWidget::isAnyDate()const
+{
+  Q_D(const ctkDateRangeWidget);
+  return this->startDateTime() == d->StartDate->minimumDateTime() &&
+         this->endDateTime() == d->EndDate->maximumDateTime();
+}
+
+// -------------------------------------------------------------------------
+void ctkDateRangeWidget::setDisplayTime(bool displayTime)
 {
   Q_D(ctkDateRangeWidget);
-  d->includeTime = includeTime;
-  logger.error("including time in the date range is not supported now");
-  if ( includeTime )
-  {
-    // TODO: set time format 
-    d->StartDate->setDisplayFormat( QString( "MMM dd, yyyy") );
-    d->EndDate->setDisplayFormat( QString( "MMM dd, yyyy") );
-  } 
+  d->DisplayTime = displayTime;
+  if ( displayTime )
+    {
+    d->StartDate->setDisplayFormat( QString( "MMM dd, yyyy HH:mm:ss") );
+    d->EndDate->setDisplayFormat( QString( "MMM dd, yyyy HH:mm:ss") );
+    } 
   else 
-  {
+    {
     d->StartDate->setDisplayFormat( QString( "MMM dd, yyyy") );
     d->EndDate->setDisplayFormat( QString( "MMM dd, yyyy") );
-  }
+    }
 }
 
 // -------------------------------------------------------------------------
-bool ctkDateRangeWidget::includeTime()const
+bool ctkDateRangeWidget::displayTime()const
 {
   logger.error("including time in the date range is not supported now");
   Q_D(const ctkDateRangeWidget);
-  return d->includeTime;
+  return d->DisplayTime;
 }
 

+ 39 - 31
Libs/Widgets/ctkDateRangeWidget.h

@@ -33,22 +33,23 @@ class ctkDateRangeWidgetPrivate;
 class QDateTime;
 
 ///
-/// ctkDateRangeWidget is a wrapper around a ctkDoubleRangeSlider and 2 QSpinBoxes
-/// \image html http://www.commontk.org/images/1/14/CtkDateRangeWidget.png
-/// \sa ctkSliderSpinBoxWidget, ctkDoubleRangeSlider, QSpinBox
+/// ctkDateRangeWidget allows the user to select a time range between two
+/// dates
 class CTK_WIDGETS_EXPORT ctkDateRangeWidget : public QWidget
 {
   Q_OBJECT
-    // placeholder - not yet used
-  Q_PROPERTY(bool includeTime READ includeTime WRITE setIncludeTime)
+  Q_PROPERTY(QDateTime startDateTime READ startDateTime WRITE setStartDateTime NOTIFY startDateTimeChanged)
+  Q_PROPERTY(QDateTime endDateTime READ endDateTime WRITE setEndDateTime NOTIFY endDateTimeChanged)
+  Q_PROPERTY(bool displayTime READ displayTime WRITE setDisplayTime)
 
 public:
   /// Superclass typedef
   typedef QWidget Superclass;
 
   /// Constructor
-  /// If \li parent is null, ctkDateRangeWidget will be a top-leve widget
+  /// If \li parent is null, ctkDateRangeWidget will be a top-level widget
   /// \note The \li parent can be set later using QWidget::setParent()
+  /// By default, the range is "Any Date"
   explicit ctkDateRangeWidget(QWidget* parent = 0);
   
   /// Destructor
@@ -56,47 +57,54 @@ public:
 
   ///
   /// This property holds whether the date range includes time
-  /// If tracking is disabled (the default), the widget only shows dates
+  /// If includeTime is disabled (the default), the widget only shows dates
   /// If includeTime is enabled the date widgets display time as well as date
-  void setIncludeTime(bool includeTime);
-  bool includeTime()const;
+  void setDisplayTime(bool includeTime);
+  bool displayTime()const;
 
-  ///
-  /// Access the start and end date/times
+  /// Access the start date/times
+  /// The returned date is never NULL/empty, but set to
+  /// QDateTimeEdit::minimumDateTime
   QDateTime startDateTime() const;
+  
+  /// Access the start date/times
+  /// The returned date is never NULL/empty, but set to 
+  /// QDateTimeEdit::maximumDateTime
   QDateTime endDateTime() const;
+  
+  /// Utility function that returns true if the range correspond to any date
+  /// It can be useful if the time must be handled specially in that case.
+  /// Returns true if any of the start or end date is invalid.
+  bool isAnyDate()const;
 
 public slots:
-  ///
-  /// Reset the slider and spinbox to zero (value and position)
+  /// Set the start date.
+  /// If the date is null or invalid, it will be automatically converted into
+  /// a valid date (14 September 1752)
   void setStartDateTime(QDateTime start);
+  /// Set the end date.
+  /// If the date is null or invalid, it will be automatically converted into
+  /// a valid date (31 December, 7999 and a time of 23:59:59 and 999 milliseconds)
   void setEndDateTime(QDateTime end);
   ///
   /// Utility function that set the start and end values at once
   void setDateTimeRange(QDateTime start, QDateTime end);
+  void setDateRange(QDate start, QDate end);
 
   ///
   /// handle clicks on radio buttons
-  void onAnyDate();
-  void onToday();
-  void onYesterday();
-  void onLastWeek();
-  void onLastMonth();
-  void onSelectRange();
+  void setAnyDate();
+  void setToday();
+  void setYesterday();
+  void setLastWeek();
+  void setLastMonth();
+  void setSelectRange();
 
 signals:
-  /// 
-  /// signals
-  void startDateTimeChanged(QDateTime value);
-  void endDateTimeChanged(QDateTime value);
-
-protected slots:
-  ///
-  /// None
-
-protected:
-  ///
-  /// None
+  /// Fired when the start date is changed
+  void startDateTimeChanged(const QDateTime& value);
+  /// Fired when the end date is changed
+  void endDateTimeChanged(const QDateTime& value);
 
 protected:
   QScopedPointer<ctkDateRangeWidgetPrivate> d_ptr;