• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

globaltimeconstraint.h

Go to the documentation of this file.
00001 #ifndef TIMECONSTRAINT_H
00002 #define TIMECONSTRAINT_H
00003 
00004 #include <QDebug>
00005 #include <QObject>
00006 #include <QDateTime>
00007 class TimeConstraintToolBar;
00008 
00009 #include <QMutex>
00010 #include <QMutexLocker>
00011 
00015 class TimeConstraint: public QObject{
00016     Q_OBJECT
00017 public:
00018     enum ConstraintType {
00019         TypeBeginTime = Qt::UserRole + 600,
00020         TypeEndTime
00021     };
00022 
00023     static TimeConstraint* instance(){
00024         static TimeConstraint timeConstraint;
00025         return &timeConstraint;
00026     }
00027 
00028     QDateTime getTimeConstraint(const TimeConstraint::ConstraintType &type) const {
00029         switch (type){
00030         case TimeConstraint::TypeBeginTime: return beginTime;
00031         case TimeConstraint::TypeEndTime: return endTime;
00032         }
00033         Q_ASSERT_X(false, "TimeConstraint::getTimeConstraint()", "type undefined");
00034         return QDateTime();
00035     }
00036 
00037 public slots:
00038     void setTimeConstraint(const TimeConstraint::ConstraintType &type, const QDateTime &timestamp){
00039         switch (type){
00040         case TimeConstraint::TypeBeginTime:{
00041                 if (beginTime != timestamp){
00042                     beginTime = timestamp;
00043                     emit signalOnTimeConstraintChange(TimeConstraint::TypeBeginTime, beginTime);
00044                 }
00045                 break;
00046             }
00047         case TimeConstraint::TypeEndTime:{
00048                 if (endTime != timestamp){
00049                     endTime = timestamp;
00050                     emit signalOnTimeConstraintChange(TimeConstraint::TypeEndTime, endTime);
00051                 }
00052                 break;
00053             }
00054         }
00055     }
00056 
00057 protected:
00058     TimeConstraint(){
00059         // initialize values
00060         QDateTime now = QDateTime::currentDateTime();
00061         //beginTime = now.addDays(-1);
00062         beginTime = QDateTime::fromString("2009-07-01T00:00:00", Qt::ISODate);
00063         //endTime = now;
00064         endTime = QDateTime::fromString("2009-07-08T00:00:00", Qt::ISODate);
00065     };
00066     TimeConstraint(const TimeConstraint &){} //makes copying impossible
00067 
00068 signals:
00069     void signalOnTimeConstraintChange(const TimeConstraint::ConstraintType &, const QDateTime &data);
00070 
00071 private:
00072     QDateTime beginTime;
00073     QDateTime endTime;
00074 };
00075 
00076 #include <QToolBar>
00077 #include <QDateTimeEdit>
00078 #include <QLabel>
00079 #include <QAction>
00080 
00095 class TimeConstraintToolBar : public QToolBar{
00096     Q_OBJECT
00097 public:
00098     TimeConstraintToolBar(QWidget *parent = 0) : QToolBar("Global time-constraint on data", parent){
00099         setObjectName("TimeConstraintToolBar");
00100         setWindowTitle("Global time constraint");
00101         setToolTip(tr("This constraint is applied to all the data fetched from the database.\n"
00102                       "Note that for large intervals, fetching might take a considerable amount of time."));
00103 
00104         // setup layout
00105         moveLeft = new QAction("<<", this);
00106         addAction(moveLeft);
00107         addWidget(new QLabel("From: ", this));
00108         beginTimeEditor = new QDateTimeEdit(this);
00109         beginTimeEditor->setDisplayFormat("yyyy-MM-dd hh:mm");
00110         beginTimeEditor->setCalendarPopup(true);
00111         addWidget(beginTimeEditor);
00112         addWidget(new QLabel("To: ", this));
00113         endTimeEditor = new QDateTimeEdit(this);
00114         endTimeEditor->setDisplayFormat("yyyy-MM-dd hh:mm");
00115         endTimeEditor->setCalendarPopup(true);
00116         addWidget(endTimeEditor);
00117         moveRight = new QAction(">>",this);
00118         addAction(moveRight);
00119 
00120         // setup values
00121         syncThis(TimeConstraint::TypeBeginTime);
00122         syncThis(TimeConstraint::TypeEndTime);
00123 
00124         // setup sync connections
00125         connect(TimeConstraint::instance(), SIGNAL(signalOnTimeConstraintChange(TimeConstraint::ConstraintType, QDateTime)),
00126                 this, SLOT(onTimeConstraintChange(TimeConstraint::ConstraintType, QDateTime)));
00127         connect(beginTimeEditor, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(onBeginTimeEdit(QDateTime)));
00128         connect(endTimeEditor, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(onEndTimeEdit(QDateTime)));
00129         connect(moveLeft, SIGNAL(triggered()), this, SLOT(onMoveLeftActionTrigger()));
00130         connect(moveRight, SIGNAL(triggered()), this, SLOT(onMoveRightActionTrigger()));
00131     }
00132 
00133 private:
00134     void syncThis(const TimeConstraint::ConstraintType &type){
00135         switch(type){
00136         case TimeConstraint::TypeBeginTime:
00137             beginTimeEditor->setDateTime(TimeConstraint::instance()->getTimeConstraint(TimeConstraint::TypeBeginTime)); break;
00138         case TimeConstraint::TypeEndTime:
00139             endTimeEditor->setDateTime(TimeConstraint::instance()->getTimeConstraint(TimeConstraint::TypeEndTime)); break;
00140         }
00141     }
00142 
00143     void writeToTimeConstraint(const TimeConstraint::ConstraintType &type, const QDateTime &data){
00144         switch(type){
00145         case TimeConstraint::TypeBeginTime:
00146             TimeConstraint::instance()->setTimeConstraint(TimeConstraint::TypeBeginTime, data); break;
00147         case TimeConstraint::TypeEndTime:
00148             TimeConstraint::instance()->setTimeConstraint(TimeConstraint::TypeEndTime, data); break;
00149         }
00150         sanityCheck();
00151     }
00152 
00153     uint interval() const {
00154         int interval = beginTimeEditor->dateTime().secsTo(endTimeEditor->dateTime());
00155         Q_ASSERT(interval >= 0);
00156         return interval;
00157     }
00158 
00159 private slots:
00160     void onBeginTimeEdit(const QDateTime &data){
00161         writeToTimeConstraint(TimeConstraint::TypeBeginTime, data);
00162         sanityCheck();
00163     }
00164 
00165     void onEndTimeEdit(const QDateTime &data){
00166         writeToTimeConstraint(TimeConstraint::TypeEndTime, data);
00167         sanityCheck();
00168     }
00169 
00170     void onTimeConstraintChange(const TimeConstraint::ConstraintType &type, const QDateTime &){
00171         syncThis(type);
00172         sanityCheck();
00173     }
00174 
00175     void onMoveLeftActionTrigger(){
00176         uint old_interval = interval();
00177         beginTimeEditor->setDateTime(beginTimeEditor->dateTime().addSecs(-old_interval));
00178         endTimeEditor->setDateTime(endTimeEditor->dateTime().addSecs(-old_interval));
00179     }
00180 
00181     void onMoveRightActionTrigger(){
00182         uint old_interval = interval();
00183         beginTimeEditor->setDateTime(beginTimeEditor->dateTime().addSecs(old_interval));
00184         endTimeEditor->setDateTime(endTimeEditor->dateTime().addSecs(old_interval));
00185     }
00186 
00187     void sanityCheck(){
00188         // sanity check
00189         Q_ASSERT(endTimeEditor->dateTime() == TimeConstraint::instance()->getTimeConstraint(TimeConstraint::TypeEndTime));
00190         Q_ASSERT(beginTimeEditor->dateTime() == TimeConstraint::instance()->getTimeConstraint(TimeConstraint::TypeBeginTime));
00191     }
00192 
00193 private:
00194     QDateTimeEdit *beginTimeEditor;
00195     QDateTimeEdit *endTimeEditor;
00196     QAction *moveLeft;
00197     QAction *moveRight;
00198 };
00199 
00200 
00201 #endif // TIMECONSTRAINT_H

Generated on Tue Aug 24 2010 15:58:55 for Smartlet by  doxygen 1.7.1