File indexing completed on 2024-06-23 05:18:37

0001 /*
0002    SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "sendlaterdialog.h"
0008 #include "sendlaterinfo.h"
0009 #include "sendlatertimedatewidget_p.h"
0010 #include "ui_sendlaterwidget.h"
0011 
0012 #include <KLocalizedString>
0013 #include <KSeparator>
0014 #include <QIcon>
0015 
0016 #include <QCheckBox>
0017 #include <QDialogButtonBox>
0018 #include <QPushButton>
0019 #include <QVBoxLayout>
0020 
0021 using namespace MessageComposer;
0022 
0023 SendLaterDialog::SendLaterDialog(SendLaterInfo *info, QWidget *parent)
0024     : QDialog(parent)
0025     , mSendLaterWidget(new Ui::SendLaterWidget)
0026     , mInfo(info)
0027 {
0028     setWindowTitle(i18nc("@title:window", "Send Later"));
0029     setWindowIcon(QIcon::fromTheme(QStringLiteral("kmail")));
0030 
0031     auto mainLayout = new QVBoxLayout(this);
0032 
0033     auto sendLaterWidget = new QWidget(this);
0034     mSendLaterWidget->setupUi(sendLaterWidget);
0035 
0036     auto w = new QWidget(this);
0037     auto lay = new QVBoxLayout(w);
0038     lay->setContentsMargins({});
0039 
0040     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
0041     mOkButton = buttonBox->button(QDialogButtonBox::Ok);
0042     mOkButton->setObjectName(QLatin1StringView("okbutton"));
0043     mOkButton->setDefault(true);
0044     mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0045     connect(buttonBox, &QDialogButtonBox::rejected, this, &SendLaterDialog::reject);
0046 
0047     if (!info) {
0048         mOkButton->setText(i18n("Send Later"));
0049         mDelay = new QCheckBox(i18n("Delay"));
0050         mDelay->setChecked(false);
0051         slotDelay(false);
0052         connect(mDelay, &QCheckBox::clicked, this, &SendLaterDialog::slotDelay);
0053         lay->addWidget(mDelay);
0054     }
0055 
0056     connect(mOkButton, &QPushButton::clicked, this, &SendLaterDialog::slotOkClicked);
0057 
0058     lay->addWidget(sendLaterWidget);
0059 
0060     QDateTime t = QDateTime::currentDateTime();
0061     t = t.addSecs(60 * 60);
0062 
0063     mSendLaterWidget->mDateTime->setDateTime(t);
0064     connect(mSendLaterWidget->mRecurrence, &QCheckBox::clicked, this, &SendLaterDialog::slotRecurrenceClicked);
0065     const QStringList unitsList = {i18n("Days"), i18n("Weeks"), i18n("Months"), i18n("Years")};
0066     mSendLaterWidget->mRecurrenceComboBox->addItems(unitsList);
0067     connect(mSendLaterWidget->mDateTime, &SendLaterTimeDateWidget::dateChanged, this, &SendLaterDialog::slotDateChanged);
0068 
0069     lay->addWidget(new KSeparator);
0070 
0071     mainLayout->addWidget(w);
0072     mainLayout->addWidget(buttonBox);
0073     slotRecurrenceClicked(false);
0074     if (info) {
0075         load(info);
0076     }
0077     resize(180, 120);
0078 }
0079 
0080 SendLaterDialog::~SendLaterDialog()
0081 {
0082     delete mSendLaterWidget;
0083 }
0084 
0085 void SendLaterDialog::slotDateChanged(const QString &date)
0086 {
0087     mOkButton->setEnabled(!date.isEmpty());
0088 }
0089 
0090 void SendLaterDialog::slotRecurrenceClicked(bool clicked)
0091 {
0092     mSendLaterWidget->mRecurrenceValue->setEnabled(clicked);
0093     mSendLaterWidget->mRecurrenceComboBox->setEnabled(clicked);
0094 }
0095 
0096 void SendLaterDialog::load(SendLaterInfo *info)
0097 {
0098     mSendLaterWidget->mDateTime->setDateTime(info->dateTime());
0099     const bool recurrence = info->isRecurrence();
0100     mSendLaterWidget->mRecurrence->setChecked(recurrence);
0101     slotRecurrenceClicked(recurrence);
0102     mSendLaterWidget->mRecurrenceValue->setValue(info->recurrenceEachValue());
0103     mSendLaterWidget->mRecurrenceComboBox->setCurrentIndex(static_cast<int>(info->recurrenceUnit()));
0104 }
0105 
0106 SendLaterInfo *SendLaterDialog::info()
0107 {
0108     if (!mInfo) {
0109         mInfo = new SendLaterInfo();
0110     }
0111     mInfo->setRecurrence(mSendLaterWidget->mRecurrence->isChecked());
0112     mInfo->setRecurrenceEachValue(mSendLaterWidget->mRecurrenceValue->value());
0113     mInfo->setRecurrenceUnit(static_cast<SendLaterInfo::RecurrenceUnit>(mSendLaterWidget->mRecurrenceComboBox->currentIndex()));
0114     if (mSendDateTime.isValid()) {
0115         mInfo->setDateTime(mSendDateTime);
0116     } else {
0117         mInfo->setDateTime(mSendLaterWidget->mDateTime->dateTime());
0118     }
0119     return mInfo;
0120 }
0121 
0122 SendLaterDialog::SendLaterAction SendLaterDialog::action() const
0123 {
0124     return mAction;
0125 }
0126 
0127 void SendLaterDialog::slotOkClicked()
0128 {
0129     if (!mDelay || mDelay->isChecked()) {
0130         mSendDateTime = mSendLaterWidget->mDateTime->dateTime();
0131         mAction = SendDeliveryAtTime;
0132     } else {
0133         mAction = PutInOutbox;
0134     }
0135     accept();
0136 }
0137 
0138 void SendLaterDialog::slotDelay(bool delayEnabled)
0139 {
0140     mSendLaterWidget->mLabel->setEnabled(delayEnabled);
0141     mSendLaterWidget->mDateTime->setEnabled(delayEnabled);
0142     mSendLaterWidget->mRecurrence->setEnabled(delayEnabled);
0143     mSendLaterWidget->mRecurrenceValue->setEnabled(delayEnabled && mSendLaterWidget->mRecurrence->isChecked());
0144     mSendLaterWidget->mRecurrenceComboBox->setEnabled(delayEnabled && mSendLaterWidget->mRecurrence->isChecked());
0145 }
0146 
0147 #include "moc_sendlaterdialog.cpp"