Typica is a free program for professional coffee roasters. https://typica.us
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

daterangeselector.cpp 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /*603:*/
  2. #line 66 "./daterangeselector.w"
  3. #include <QCalendarWidget>
  4. #include <QPushButton>
  5. #include <QBoxLayout>
  6. #include <QLabel>
  7. #include <QToolButton>
  8. #include <QApplication>
  9. #include <QDesktopWidget>
  10. #include "daterangeselector.h"
  11. /*604:*/
  12. #line 86 "./daterangeselector.w"
  13. class CustomDateRangePopup:public QWidget
  14. {
  15. Q_OBJECT
  16. public:
  17. CustomDateRangePopup(QWidget*parent= NULL);
  18. public slots:
  19. void applyRange();
  20. signals:
  21. void hidingPopup();
  22. protected:
  23. virtual void hideEvent(QHideEvent*event);
  24. private slots:
  25. void validateRange();
  26. private:
  27. QCalendarWidget*startDateSelector;
  28. QCalendarWidget*endDateSelector;
  29. QPushButton*applyButton;
  30. };
  31. /*:604*/
  32. #line 77 "./daterangeselector.w"
  33. /*605:*/
  34. #line 110 "./daterangeselector.w"
  35. CustomDateRangePopup::CustomDateRangePopup(QWidget*parent):
  36. QWidget(parent,Qt::Popup),startDateSelector(new QCalendarWidget),
  37. endDateSelector(new QCalendarWidget),applyButton(new QPushButton(tr("Apply")))
  38. {
  39. setAttribute(Qt::WA_WindowPropagation);
  40. QVBoxLayout*outerLayout= new QVBoxLayout;
  41. QHBoxLayout*calendarsLayout= new QHBoxLayout;
  42. QVBoxLayout*startDateLayout= new QVBoxLayout;
  43. QVBoxLayout*endDateLayout= new QVBoxLayout;
  44. QHBoxLayout*buttonLayout= new QHBoxLayout;
  45. QLabel*startDateLabel= new QLabel(tr("From"));
  46. QLabel*endDateLabel= new QLabel(tr("To"));
  47. startDateSelector->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);
  48. endDateSelector->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);
  49. DateRangeSelector*selector= qobject_cast<DateRangeSelector*> (parent);
  50. if(parent){
  51. QStringList range= selector->currentRange().toStringList();
  52. startDateSelector->setSelectedDate(QDate::fromString(range.first(),Qt::ISODate));
  53. endDateSelector->setSelectedDate(QDate::fromString(range.last(),Qt::ISODate));
  54. }
  55. connect(startDateSelector,SIGNAL(selectionChanged()),this,SLOT(validateRange()));
  56. connect(endDateSelector,SIGNAL(selectionChanged()),this,SLOT(validateRange()));
  57. startDateLayout->addWidget(startDateLabel);
  58. startDateLayout->addWidget(startDateSelector);
  59. endDateLayout->addWidget(endDateLabel);
  60. endDateLayout->addWidget(endDateSelector);
  61. connect(applyButton,SIGNAL(clicked()),this,SLOT(applyRange()));
  62. buttonLayout->addStretch();
  63. buttonLayout->addWidget(applyButton);
  64. calendarsLayout->addLayout(startDateLayout);
  65. calendarsLayout->addLayout(endDateLayout);
  66. outerLayout->addLayout(calendarsLayout);
  67. outerLayout->addLayout(buttonLayout);
  68. setLayout(outerLayout);
  69. }
  70. /*:605*//*606:*/
  71. #line 158 "./daterangeselector.w"
  72. void CustomDateRangePopup::hideEvent(QHideEvent*)
  73. {
  74. emit hidingPopup();
  75. }
  76. /*:606*//*607:*/
  77. #line 167 "./daterangeselector.w"
  78. void CustomDateRangePopup::applyRange()
  79. {
  80. DateRangeSelector*selector= qobject_cast<DateRangeSelector*> (parentWidget());
  81. if(selector)
  82. {
  83. selector->setCustomRange(QVariant(QStringList()<<
  84. startDateSelector->selectedDate().toString(Qt::ISODate)<<
  85. endDateSelector->selectedDate().toString(Qt::ISODate)));
  86. }
  87. hide();
  88. }
  89. /*:607*//*608:*/
  90. #line 184 "./daterangeselector.w"
  91. void CustomDateRangePopup::validateRange()
  92. {
  93. if(startDateSelector->selectedDate()> endDateSelector->selectedDate())
  94. {
  95. applyButton->setEnabled(false);
  96. }
  97. else
  98. {
  99. applyButton->setEnabled(true);
  100. }
  101. }
  102. /*:608*/
  103. #line 78 "./daterangeselector.w"
  104. /*609:*/
  105. #line 202 "./daterangeselector.w"
  106. DateRangeSelector::DateRangeSelector(QWidget*parent):
  107. QWidget(parent),quickSelector(new QComboBox(this)),
  108. customRangeSelector(NULL),lastIndex(0)
  109. {
  110. connect(quickSelector,SIGNAL(currentIndexChanged(int)),this,SLOT(updateRange(int)));
  111. QDate currentDate= QDate::currentDate();
  112. QHBoxLayout*layout= new QHBoxLayout;
  113. /*610:*/
  114. #line 231 "./daterangeselector.w"
  115. quickSelector->addItem("Yesterday",QVariant(QStringList()<<
  116. currentDate.addDays(-1).toString(Qt::ISODate)));
  117. quickSelector->addItem("Today",QVariant(QStringList()<<
  118. currentDate.toString(Qt::ISODate)));
  119. quickSelector->insertSeparator(quickSelector->count());
  120. quickSelector->addItem("This Week",QVariant(QStringList()<<
  121. (currentDate.dayOfWeek()%7?
  122. currentDate.addDays(-currentDate.dayOfWeek()).toString(Qt::ISODate):
  123. currentDate.toString(Qt::ISODate))<<
  124. currentDate.addDays(6-(currentDate.dayOfWeek()%7)).toString(Qt::ISODate)));
  125. quickSelector->addItem("This Week to Date",currentDate.dayOfWeek()%7?
  126. QVariant(QStringList()<<
  127. currentDate.addDays(-currentDate.dayOfWeek()).toString(Qt::ISODate)<<
  128. currentDate.toString(Qt::ISODate)):
  129. QVariant(QStringList()<<currentDate.toString(Qt::ISODate)));
  130. quickSelector->addItem("Last Week",QVariant(QStringList()<<
  131. currentDate.addDays(-(currentDate.dayOfWeek()%7)-7).toString(Qt::ISODate)<<
  132. currentDate.addDays(-(currentDate.dayOfWeek()%7)-1).toString(Qt::ISODate)));
  133. quickSelector->addItem("Last 7 Days",QVariant(QStringList()<<
  134. currentDate.addDays(-6).toString(Qt::ISODate)<<
  135. currentDate.toString(Qt::ISODate)));
  136. quickSelector->insertSeparator(quickSelector->count());
  137. quickSelector->addItem("This Month",QVariant(QStringList()<<
  138. QDate(currentDate.year(),currentDate.month(),1).toString(Qt::ISODate)<<
  139. QDate(currentDate.year(),currentDate.month(),
  140. currentDate.daysInMonth()).toString(Qt::ISODate)));
  141. quickSelector->addItem("This Month to Date",(currentDate.day()==1?
  142. (QVariant(QStringList()<<currentDate.toString(Qt::ISODate))):
  143. (QVariant(QStringList()<<
  144. QDate(currentDate.year(),currentDate.month(),1).toString(Qt::ISODate)<<
  145. currentDate.toString(Qt::ISODate)))));
  146. quickSelector->addItem("Last Four Weeks",QVariant(QStringList()<<
  147. currentDate.addDays(-27).toString(Qt::ISODate)<<
  148. currentDate.toString(Qt::ISODate)));
  149. quickSelector->addItem("Last 30 Days",QVariant(QStringList()<<
  150. currentDate.addDays(-29).toString(Qt::ISODate)<<
  151. currentDate.toString(Qt::ISODate)));
  152. quickSelector->insertSeparator(quickSelector->count());
  153. quickSelector->addItem("This Quarter",QVariant(QStringList()<<
  154. QDate(currentDate.year(),currentDate.month()-((currentDate.month()-1)%3),1).toString(Qt::ISODate)<<
  155. (currentDate.month()> 9?
  156. QDate(currentDate.year(),12,31).toString(Qt::ISODate):
  157. QDate(currentDate.year(),currentDate.month()-((currentDate.month()-1)%3)+3,1).addDays(-1).toString(Qt::ISODate))));
  158. quickSelector->addItem("This Quarter to Date",
  159. (currentDate.day()==1&&(currentDate.month()-1)%3==0)?
  160. QVariant(QStringList()<<currentDate.toString(Qt::ISODate)):
  161. QVariant(QStringList()<<
  162. QDate(currentDate.year(),currentDate.month()-((currentDate.month()-1)%3),1).toString(Qt::ISODate)<<
  163. currentDate.toString(Qt::ISODate)));
  164. quickSelector->addItem("Last Quarter",currentDate.month()<4?
  165. QVariant(QStringList()<<
  166. QDate(currentDate.year()-1,10,1).toString(Qt::ISODate)<<
  167. QDate(currentDate.year()-1,12,31).toString(Qt::ISODate)):
  168. QVariant(QStringList()<<
  169. QDate(currentDate.year(),currentDate.month()-((currentDate.month()-1)%3)-3,1).toString(Qt::ISODate)<<
  170. QDate(currentDate.year(),currentDate.month()-((currentDate.month()-1)%3),1).addDays(-1).toString(Qt::ISODate)));
  171. quickSelector->addItem("Last 90 Days",QVariant(QStringList()<<
  172. currentDate.addDays(-89).toString(Qt::ISODate)<<
  173. currentDate.toString(Qt::ISODate)));
  174. quickSelector->insertSeparator(quickSelector->count());
  175. quickSelector->addItem("This Year",QVariant(QStringList()<<
  176. QDate(currentDate.year(),1,1).toString(Qt::ISODate)<<
  177. QDate(currentDate.year(),12,31).toString(Qt::ISODate)));
  178. quickSelector->addItem("This Year to Date",(currentDate.dayOfYear()==1)?
  179. QVariant(QStringList()<<currentDate.toString(Qt::ISODate)):
  180. QVariant(QStringList()<<QDate(currentDate.year(),1,1).toString(Qt::ISODate)<<
  181. currentDate.toString(Qt::ISODate)));
  182. quickSelector->addItem("Last Year",QVariant(QStringList()<<
  183. QDate(currentDate.year()-1,1,1).toString(Qt::ISODate)<<
  184. QDate(currentDate.year()-1,12,31).toString(Qt::ISODate)));
  185. quickSelector->addItem("Last 365 Days",QVariant(QStringList()<<
  186. currentDate.addDays(-364).toString(Qt::ISODate)<<
  187. currentDate.toString(Qt::ISODate)));
  188. quickSelector->insertSeparator(quickSelector->count());
  189. quickSelector->addItem("Lifetime");
  190. quickSelector->addItem("Custom");
  191. /*:610*/
  192. #line 212 "./daterangeselector.w"
  193. QToolButton*customButton= new QToolButton;
  194. customButton->setIcon(QIcon::fromTheme("office-calendar",
  195. QIcon(":/resources/icons/tango/scalable/apps/office-calendar.svg")));
  196. layout->addWidget(quickSelector);
  197. layout->addWidget(customButton);
  198. setLayout(layout);
  199. connect(customButton,SIGNAL(clicked()),this,SLOT(toggleCustom()));
  200. }
  201. /*:609*//*611:*/
  202. #line 314 "./daterangeselector.w"
  203. void DateRangeSelector::updateRange(int index)
  204. {
  205. if(index!=lastIndex&&index==quickSelector->count()-1)
  206. {
  207. toggleCustom();
  208. }
  209. else
  210. {
  211. lastIndex= index;
  212. emit rangeUpdated(quickSelector->itemData(quickSelector->currentIndex()));
  213. }
  214. }
  215. /*:611*//*612:*/
  216. #line 331 "./daterangeselector.w"
  217. void DateRangeSelector::popupHidden()
  218. {
  219. customRangeSelector->deleteLater();
  220. customRangeSelector= NULL;
  221. quickSelector->setCurrentIndex(lastIndex);
  222. }
  223. /*:612*//*613:*/
  224. #line 342 "./daterangeselector.w"
  225. void DateRangeSelector::setCustomRange(QVariant range)
  226. {
  227. quickSelector->setItemData(quickSelector->count()-1,range);
  228. emit rangeUpdated(range);
  229. lastIndex= quickSelector->count()-1;
  230. quickSelector->setCurrentIndex(lastIndex);
  231. }
  232. /*:613*//*614:*/
  233. #line 357 "./daterangeselector.w"
  234. void DateRangeSelector::toggleCustom()
  235. {
  236. if(!customRangeSelector){
  237. customRangeSelector= new CustomDateRangePopup(this);
  238. QPoint pos= rect().bottomLeft();
  239. QPoint pos2= rect().topLeft();
  240. pos= mapToGlobal(pos);
  241. pos2= mapToGlobal(pos2);
  242. QSize size= customRangeSelector->sizeHint();
  243. QRect screen= QApplication::desktop()->availableGeometry(pos);
  244. if(pos.x()+size.width()> screen.right()){
  245. pos.setX(screen.right()-size.width());
  246. }
  247. pos.setX(qMax(pos.x(),screen.left()));
  248. if(pos.y()+size.height()> screen.bottom()){
  249. pos.setY(pos2.y()-size.height());
  250. }else if(pos.y()<screen.top()){
  251. pos.setY(screen.top());
  252. }
  253. if(pos.y()<screen.top()){
  254. pos.setY(screen.top());
  255. }
  256. if(pos.y()+size.height()> screen.bottom()){
  257. pos.setY(screen.bottom()-size.height());
  258. }
  259. customRangeSelector->move(pos);
  260. customRangeSelector->show();
  261. connect(customRangeSelector,SIGNAL(hidingPopup()),
  262. this,SLOT(popupHidden()));
  263. }
  264. else
  265. {
  266. customRangeSelector->close();
  267. customRangeSelector->deleteLater();
  268. customRangeSelector= NULL;
  269. }
  270. }
  271. /*:614*//*615:*/
  272. #line 399 "./daterangeselector.w"
  273. QVariant DateRangeSelector::currentRange()
  274. {
  275. return quickSelector->itemData(lastIndex);
  276. }
  277. /*:615*//*616:*/
  278. #line 407 "./daterangeselector.w"
  279. void DateRangeSelector::setCurrentIndex(int index)
  280. {
  281. quickSelector->setCurrentIndex(index);
  282. }
  283. /*:616*//*617:*/
  284. #line 422 "./daterangeselector.w"
  285. void DateRangeSelector::setLifetimeRange(QString startDate,QString endDate)
  286. {
  287. quickSelector->setItemData(quickSelector->count()-2,
  288. QVariant(QStringList()<<startDate<<endDate));
  289. }
  290. /*:617*//*618:*/
  291. #line 432 "./daterangeselector.w"
  292. void DateRangeSelector::removeIndex(int index)
  293. {
  294. quickSelector->removeItem(index);
  295. }
  296. /*:618*/
  297. #line 79 "./daterangeselector.w"
  298. #include "moc_daterangeselector.cpp"
  299. /*:603*/