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 ×tamp){
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
00060 QDateTime now = QDateTime::currentDateTime();
00061
00062 beginTime = QDateTime::fromString("2009-07-01T00:00:00", Qt::ISODate);
00063
00064 endTime = QDateTime::fromString("2009-07-08T00:00:00", Qt::ISODate);
00065 };
00066 TimeConstraint(const TimeConstraint &){}
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
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
00121 syncThis(TimeConstraint::TypeBeginTime);
00122 syncThis(TimeConstraint::TypeEndTime);
00123
00124
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
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