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 }