File indexing completed on 2024-05-12 05:07:54
0001 /* 0002 SPDX-FileCopyrightText: 2002-2018 Thomas Baumgart <tbaumgart@kde.org> 0003 SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com> 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "daterangedlg.h" 0008 0009 // ---------------------------------------------------------------------------- 0010 // QT Includes 0011 0012 // ---------------------------------------------------------------------------- 0013 // KDE Includes 0014 0015 // ---------------------------------------------------------------------------- 0016 // Project Includes 0017 0018 #include "mymoneyenums.h" 0019 #include "mymoneytransactionfilter.h" 0020 #include "widgethintframe.h" 0021 0022 #include "ui_daterangedlg.h" 0023 0024 using namespace eMyMoney; 0025 0026 class DateRangeDlgPrivate 0027 { 0028 Q_DISABLE_COPY(DateRangeDlgPrivate) 0029 Q_DECLARE_PUBLIC(DateRangeDlg) 0030 0031 public: 0032 explicit DateRangeDlgPrivate(DateRangeDlg* qq) 0033 : q_ptr(qq) 0034 , ui(new Ui::DateRangeDlg) 0035 , m_frameCollection(new WidgetHintFrameCollection(qq)) 0036 { 0037 } 0038 0039 ~DateRangeDlgPrivate() 0040 { 0041 delete ui; 0042 } 0043 0044 void setupDatePage() 0045 { 0046 Q_Q(DateRangeDlg); 0047 for (auto i = (int)TransactionFilter::Date::All; i < (int)TransactionFilter::Date::LastDateItem; ++i) { 0048 MyMoneyTransactionFilter::translateDateRange(static_cast<TransactionFilter::Date>(i), m_startDates[i], m_endDates[i]); 0049 } 0050 0051 q->connect(ui->m_dateRange, static_cast<void (KMyMoneyPeriodCombo::*)(int)>(&KMyMoneyPeriodCombo::currentIndexChanged), q, &DateRangeDlg::slotDateRangeSelectedByUser); 0052 0053 q->setDateRange(TransactionFilter::Date::All); 0054 0055 m_frameCollection->addFrame(new WidgetHintFrame(ui->m_fromDate)); 0056 m_frameCollection->addFrame(new WidgetHintFrame(ui->m_toDate)); 0057 } 0058 0059 void updateFrameStates() 0060 { 0061 WidgetHintFrame::hide(ui->m_fromDate); 0062 WidgetHintFrame::hide(ui->m_toDate); 0063 if (!ui->m_fromDate->isValid()) { 0064 WidgetHintFrame::show(ui->m_fromDate, i18nc("@info:tooltip", "The date is invalid.")); 0065 } 0066 if (!ui->m_toDate->isValid()) { 0067 WidgetHintFrame::show(ui->m_toDate, i18nc("@info:tooltip", "The date is invalid.")); 0068 } 0069 if (ui->m_fromDate->date().isValid() && ui->m_toDate->date().isValid() && (ui->m_fromDate->date() > ui->m_toDate->date())) { 0070 WidgetHintFrame::show(ui->m_fromDate, 0071 i18nc("@info:tooltip Date range error", 0072 "The date provided as start lies past the one provided for the end of the search. This will result in an empty set.")); 0073 } 0074 } 0075 0076 void changingDatesAdjustsRangeSelector(bool adjust) 0077 { 0078 Q_Q(DateRangeDlg); 0079 if (adjust) { 0080 q->connect(ui->m_fromDate, &KMyMoneyDateEdit::dateChanged, q, &DateRangeDlg::slotDateChanged, Qt::UniqueConnection); 0081 q->connect(ui->m_toDate, &KMyMoneyDateEdit::dateChanged, q, &DateRangeDlg::slotDateChanged, Qt::UniqueConnection); 0082 } else { 0083 q->disconnect(ui->m_fromDate, &KMyMoneyDateEdit::dateChanged, q, &DateRangeDlg::slotDateChanged); 0084 q->disconnect(ui->m_toDate, &KMyMoneyDateEdit::dateChanged, q, &DateRangeDlg::slotDateChanged); 0085 } 0086 } 0087 0088 DateRangeDlg* q_ptr; 0089 Ui::DateRangeDlg *ui; 0090 WidgetHintFrameCollection* m_frameCollection; 0091 QDate m_startDates[(int)eMyMoney::TransactionFilter::Date::LastDateItem]; 0092 QDate m_endDates[(int)eMyMoney::TransactionFilter::Date::LastDateItem]; 0093 }; 0094 0095 DateRangeDlg::DateRangeDlg(QWidget *parent) : 0096 QWidget(parent), 0097 d_ptr(new DateRangeDlgPrivate(this)) 0098 { 0099 Q_D(DateRangeDlg); 0100 d->ui->setupUi(this); 0101 d->ui->m_fromDate->setAllowEmptyDate(true); 0102 d->ui->m_toDate->setAllowEmptyDate(true); 0103 d->setupDatePage(); 0104 0105 connect(d->ui->m_fromDate, &KMyMoneyDateEdit::dateValidityChanged, [&]() { 0106 Q_D(DateRangeDlg); 0107 d->updateFrameStates(); 0108 }); 0109 connect(d->ui->m_toDate, &KMyMoneyDateEdit::dateValidityChanged, [&]() { 0110 Q_D(DateRangeDlg); 0111 d->updateFrameStates(); 0112 }); 0113 } 0114 0115 DateRangeDlg::~DateRangeDlg() 0116 { 0117 Q_D(DateRangeDlg); 0118 delete d; 0119 } 0120 0121 void DateRangeDlg::slotReset() 0122 { 0123 Q_D(DateRangeDlg); 0124 d->ui->m_dateRange->setCurrentItem(TransactionFilter::Date::All); 0125 setDateRange(TransactionFilter::Date::All); 0126 } 0127 0128 void DateRangeDlg::slotDateRangeSelectedByUser() 0129 { 0130 Q_D(DateRangeDlg); 0131 setDateRange(d->ui->m_dateRange->currentItem()); 0132 } 0133 0134 void DateRangeDlg::setDateRange(const QDate& from, const QDate& to) 0135 { 0136 Q_D(DateRangeDlg); 0137 d->ui->m_fromDate->setDate(from); 0138 d->ui->m_toDate->setDate(to); 0139 d->ui->m_dateRange->setCurrentItem(TransactionFilter::Date::UserDefined); 0140 d->updateFrameStates(); 0141 Q_EMIT rangeChanged(); 0142 } 0143 0144 void DateRangeDlg::setDateRange(TransactionFilter::Date idx) 0145 { 0146 Q_D(DateRangeDlg); 0147 d->ui->m_dateRange->setCurrentItem(idx); 0148 0149 d->changingDatesAdjustsRangeSelector(false); 0150 switch (idx) { 0151 case TransactionFilter::Date::All: 0152 d->ui->m_fromDate->setDate(QDate()); 0153 d->ui->m_toDate->setDate(QDate()); 0154 break; 0155 case TransactionFilter::Date::UserDefined: 0156 break; 0157 default: 0158 d->ui->m_fromDate->setDate(d->m_startDates[(int)idx]); 0159 d->ui->m_toDate->setDate(d->m_endDates[(int)idx]); 0160 break; 0161 } 0162 d->changingDatesAdjustsRangeSelector(true); 0163 0164 Q_EMIT rangeChanged(); 0165 } 0166 0167 TransactionFilter::Date DateRangeDlg::dateRange() const 0168 { 0169 Q_D(const DateRangeDlg); 0170 return d->ui->m_dateRange->currentItem(); 0171 } 0172 0173 void DateRangeDlg::slotDateChanged() 0174 { 0175 Q_D(DateRangeDlg); 0176 QSignalBlocker blocker(d->ui->m_dateRange); 0177 d->ui->m_dateRange->setCurrentItem(TransactionFilter::Date::UserDefined); 0178 } 0179 0180 QDate DateRangeDlg::fromDate() const 0181 { 0182 Q_D(const DateRangeDlg); 0183 return d->ui->m_fromDate->date(); 0184 } 0185 0186 QDate DateRangeDlg::toDate() const 0187 { 0188 Q_D(const DateRangeDlg); 0189 return d->ui->m_toDate->date(); 0190 }