File indexing completed on 2024-05-05 05:13:02

0001 /*
0002     This file is part of Akregator.
0003 
0004     SPDX-FileCopyrightText: 2004 Stanislav Karchebny <Stanislav.Karchebny@kdemail.net>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0007 */
0008 
0009 #include "feedpropertiesdialog.h"
0010 #include "akregatorconfig.h"
0011 
0012 #include <KLocalizedString>
0013 #include <QComboBox>
0014 
0015 #include <QCheckBox>
0016 #include <QDialogButtonBox>
0017 #include <QPushButton>
0018 #include <QVBoxLayout>
0019 
0020 using namespace Akregator;
0021 FeedPropertiesWidget::FeedPropertiesWidget(QWidget *parent, const QString &name)
0022     : QWidget(parent)
0023 {
0024     setObjectName(name);
0025     setupUi(this);
0026     connect(cb_updateInterval, &QCheckBox::toggled, updateSpinBox, &QSpinBox::setEnabled);
0027     connect(cb_updateInterval, &QCheckBox::toggled, updateComboBox, &QComboBox::setEnabled);
0028     connect(cb_updateInterval, &QCheckBox::toggled, updateLabel, &QLabel::setEnabled);
0029     connect(cb_updateInterval, &QCheckBox::toggled, this, &FeedPropertiesWidget::slotUpdateCheckBoxToggled);
0030     connect(updateComboBox, &QComboBox::activated, this, &FeedPropertiesWidget::slotUpdateComboBoxActivated);
0031     connect(updateSpinBox, &QSpinBox::valueChanged, this, &FeedPropertiesWidget::slotUpdateComboBoxLabels);
0032     connect(rb_limitArticleAge, &QRadioButton::toggled, sb_maxArticleAge, &KPluralHandlingSpinBox::setEnabled);
0033     connect(rb_limitArticleNumber, &QRadioButton::toggled, sb_maxArticleNumber, &KPluralHandlingSpinBox::setEnabled);
0034 }
0035 
0036 FeedPropertiesWidget::~FeedPropertiesWidget() = default;
0037 
0038 void FeedPropertiesWidget::slotUpdateComboBoxActivated(int index)
0039 {
0040     updateSpinBox->setEnabled(index != Never);
0041 }
0042 
0043 void FeedPropertiesWidget::slotUpdateComboBoxLabels(int value)
0044 {
0045     updateComboBox->setItemText(FeedPropertiesWidget::Minutes, i18np("Minute", "Minutes", value));
0046     updateComboBox->setItemText(FeedPropertiesWidget::Hours, i18np("Hour", "Hours", value));
0047     updateComboBox->setItemText(FeedPropertiesWidget::Days, i18np("Day", "Days", value));
0048 }
0049 
0050 void FeedPropertiesWidget::slotUpdateCheckBoxToggled(bool enabled)
0051 {
0052     updateSpinBox->setEnabled(enabled && updateComboBox->currentIndex() != Never);
0053 }
0054 
0055 FeedPropertiesDialog::FeedPropertiesDialog(QWidget *parent, const QString &name)
0056     : QDialog(parent)
0057     , m_feed(nullptr)
0058 {
0059     setObjectName(name);
0060     setWindowTitle(i18nc("@title:window", "Feed Properties"));
0061     auto mainLayout = new QVBoxLayout(this);
0062 
0063     widget = new FeedPropertiesWidget(this);
0064     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
0065     mOkButton = buttonBox->button(QDialogButtonBox::Ok);
0066     mOkButton->setDefault(true);
0067     mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0068     connect(buttonBox, &QDialogButtonBox::accepted, this, &FeedPropertiesDialog::accept);
0069     connect(buttonBox, &QDialogButtonBox::rejected, this, &FeedPropertiesDialog::reject);
0070     buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
0071     setModal(true);
0072 
0073     mainLayout->addWidget(widget);
0074     mainLayout->addWidget(buttonBox);
0075     widget->feedNameEdit->setFocus();
0076 
0077     widget->updateComboBox->insertItem(FeedPropertiesWidget::Minutes, i18np("Minute", "Minutes", 0));
0078     widget->updateComboBox->insertItem(FeedPropertiesWidget::Hours, i18np("Hour", "Hours", 0));
0079     widget->updateComboBox->insertItem(FeedPropertiesWidget::Days, i18np("Day", "Days", 0));
0080     widget->updateComboBox->insertItem(FeedPropertiesWidget::Never, i18nc("never fetch new articles", "Never"));
0081     widget->sb_maxArticleAge->setSuffix(ki18np(" day", " days"));
0082     widget->sb_maxArticleNumber->setSuffix(ki18np(" article", " articles"));
0083 
0084     connect(widget->feedNameEdit, &QLineEdit::textChanged, this, &FeedPropertiesDialog::slotSetWindowTitle);
0085 }
0086 
0087 FeedPropertiesDialog::~FeedPropertiesDialog() = default;
0088 
0089 void FeedPropertiesDialog::accept()
0090 {
0091     m_feed->setNotificationMode(false);
0092     m_feed->setTitle(feedName());
0093     m_feed->setXmlUrl(url());
0094     m_feed->setCustomFetchIntervalEnabled(autoFetch());
0095     if (autoFetch()) {
0096         m_feed->setFetchInterval(fetchInterval());
0097     }
0098     m_feed->setArchiveMode(archiveMode());
0099     m_feed->setMaxArticleAge(maxArticleAge());
0100     m_feed->setMaxArticleNumber(maxArticleNumber());
0101     m_feed->setMarkImmediatelyAsRead(markImmediatelyAsRead());
0102     m_feed->setUseNotification(useNotification());
0103     m_feed->setLoadLinkedWebsite(loadLinkedWebsite());
0104     m_feed->setNotificationMode(true);
0105     m_feed->setComment(comment());
0106 
0107     QDialog::accept();
0108 }
0109 
0110 void FeedPropertiesDialog::slotSetWindowTitle(const QString &title)
0111 {
0112     setWindowTitle(title.isEmpty() ? i18nc("@title:window", "Feed Properties") : i18nc("@title:window", "Properties of %1", title));
0113     mOkButton->setEnabled(!title.trimmed().isEmpty());
0114 }
0115 
0116 void FeedPropertiesDialog::setFeed(Feed *feed)
0117 {
0118     m_feed = feed;
0119     if (!feed) {
0120         return;
0121     }
0122 
0123     setFeedName(feed->title());
0124     setUrl(feed->xmlUrl());
0125     setAutoFetch(feed->useCustomFetchInterval());
0126     if (feed->useCustomFetchInterval()) {
0127         setFetchInterval(feed->fetchInterval());
0128     } else {
0129         setFetchInterval(Settings::autoFetchInterval());
0130     }
0131     setArchiveMode(feed->archiveMode());
0132     setMaxArticleAge(feed->maxArticleAge());
0133     setMaxArticleNumber(feed->maxArticleNumber());
0134     setMarkImmediatelyAsRead(feed->markImmediatelyAsRead());
0135     setUseNotification(feed->useNotification());
0136     setLoadLinkedWebsite(feed->loadLinkedWebsite());
0137     setComment(feed->comment());
0138     slotSetWindowTitle(feedName());
0139 }
0140 
0141 QString FeedPropertiesDialog::comment() const
0142 {
0143     return widget->commentEdit->text();
0144 }
0145 
0146 void FeedPropertiesDialog::setComment(const QString &comment)
0147 {
0148     widget->commentEdit->setText(comment);
0149 }
0150 
0151 QString FeedPropertiesDialog::feedName() const
0152 {
0153     return widget->feedNameEdit->text();
0154 }
0155 
0156 QString FeedPropertiesDialog::url() const
0157 {
0158     return widget->urlEdit->text();
0159 }
0160 
0161 bool FeedPropertiesDialog::autoFetch() const
0162 {
0163     return widget->cb_updateInterval->isChecked();
0164 }
0165 
0166 int FeedPropertiesDialog::fetchInterval() const
0167 {
0168     switch (widget->updateComboBox->currentIndex()) {
0169     case FeedPropertiesWidget::Minutes:
0170         return widget->updateSpinBox->value();
0171     case FeedPropertiesWidget::Hours:
0172         return widget->updateSpinBox->value() * 60;
0173     case FeedPropertiesWidget::Days:
0174         return widget->updateSpinBox->value() * 60 * 24;
0175     case FeedPropertiesWidget::Never:
0176     default:
0177         return -1; // never
0178     }
0179 }
0180 
0181 Feed::ArchiveMode FeedPropertiesDialog::archiveMode() const
0182 {
0183     // i could check the button group's int, but order could change...
0184     if (widget->rb_globalDefault->isChecked()) {
0185         return Feed::globalDefault;
0186     }
0187 
0188     if (widget->rb_keepAllArticles->isChecked()) {
0189         return Feed::keepAllArticles;
0190     }
0191 
0192     if (widget->rb_limitArticleAge->isChecked()) {
0193         return Feed::limitArticleAge;
0194     }
0195 
0196     if (widget->rb_limitArticleNumber->isChecked()) {
0197         return Feed::limitArticleNumber;
0198     }
0199 
0200     if (widget->rb_disableArchiving->isChecked()) {
0201         return Feed::disableArchiving;
0202     }
0203 
0204     // in a perfect world, this is never reached
0205 
0206     return Feed::globalDefault;
0207 }
0208 
0209 int FeedPropertiesDialog::maxArticleAge() const
0210 {
0211     return widget->sb_maxArticleAge->value();
0212 }
0213 
0214 int FeedPropertiesDialog::maxArticleNumber() const
0215 {
0216     return widget->sb_maxArticleNumber->value();
0217 }
0218 
0219 void FeedPropertiesDialog::setArchiveMode(Feed::ArchiveMode mode)
0220 {
0221     switch (mode) {
0222     case Feed::globalDefault:
0223         widget->rb_globalDefault->setChecked(true);
0224         break;
0225     case Feed::keepAllArticles:
0226         widget->rb_keepAllArticles->setChecked(true);
0227         break;
0228     case Feed::disableArchiving:
0229         widget->rb_disableArchiving->setChecked(true);
0230         break;
0231     case Feed::limitArticleAge:
0232         widget->rb_limitArticleAge->setChecked(true);
0233         break;
0234     case Feed::limitArticleNumber:
0235         widget->rb_limitArticleNumber->setChecked(true);
0236     }
0237 }
0238 
0239 void FeedPropertiesDialog::setFeedName(const QString &title)
0240 {
0241     widget->feedNameEdit->setText(title);
0242 }
0243 
0244 void FeedPropertiesDialog::setUrl(const QString &url)
0245 {
0246     widget->urlEdit->setText(url);
0247 }
0248 
0249 void FeedPropertiesDialog::setAutoFetch(bool customFetchEnabled)
0250 {
0251     widget->cb_updateInterval->setChecked(customFetchEnabled);
0252     widget->updateComboBox->setEnabled(customFetchEnabled);
0253 
0254     if (widget->updateSpinBox->value() > -1) {
0255         widget->updateSpinBox->setEnabled(customFetchEnabled);
0256     } else {
0257         widget->updateSpinBox->setEnabled(false);
0258     }
0259 }
0260 
0261 void FeedPropertiesDialog::setFetchInterval(int interval)
0262 {
0263     if (interval == -1) { // never update
0264         widget->updateSpinBox->setValue(0);
0265         widget->updateSpinBox->setDisabled(true);
0266         widget->updateComboBox->setCurrentIndex(FeedPropertiesWidget::Never);
0267         return;
0268     }
0269 
0270     if (interval == 0) {
0271         widget->updateSpinBox->setValue(0);
0272         widget->updateSpinBox->setEnabled(widget->cb_updateInterval->isChecked());
0273         widget->updateComboBox->setCurrentIndex(FeedPropertiesWidget::Minutes);
0274         return;
0275     }
0276 
0277     if (interval % (60 * 24) == 0) {
0278         widget->updateSpinBox->setValue(interval / (60 * 24));
0279         widget->updateSpinBox->setEnabled(widget->cb_updateInterval->isChecked());
0280         widget->updateComboBox->setCurrentIndex(FeedPropertiesWidget::Days);
0281         return;
0282     }
0283 
0284     if (interval % 60 == 0) {
0285         widget->updateSpinBox->setValue(interval / 60);
0286         widget->updateSpinBox->setEnabled(widget->cb_updateInterval->isChecked());
0287         widget->updateComboBox->setCurrentIndex(FeedPropertiesWidget::Hours);
0288         return;
0289     }
0290 
0291     widget->updateSpinBox->setValue(interval);
0292     widget->updateSpinBox->setEnabled(widget->cb_updateInterval->isChecked());
0293     widget->updateComboBox->setCurrentIndex(FeedPropertiesWidget::Minutes);
0294 }
0295 
0296 void FeedPropertiesDialog::setMaxArticleAge(int age)
0297 {
0298     widget->sb_maxArticleAge->setValue(age);
0299 }
0300 
0301 void FeedPropertiesDialog::setMaxArticleNumber(int number)
0302 {
0303     widget->sb_maxArticleNumber->setValue(number);
0304 }
0305 
0306 void FeedPropertiesDialog::setMarkImmediatelyAsRead(bool enabled)
0307 {
0308     widget->checkBox_markRead->setChecked(enabled);
0309 }
0310 
0311 bool FeedPropertiesDialog::markImmediatelyAsRead() const
0312 {
0313     return widget->checkBox_markRead->isChecked();
0314 }
0315 
0316 void FeedPropertiesDialog::setUseNotification(bool enabled)
0317 {
0318     widget->checkBox_useNotification->setChecked(enabled);
0319 }
0320 
0321 bool FeedPropertiesDialog::useNotification() const
0322 {
0323     return widget->checkBox_useNotification->isChecked();
0324 }
0325 
0326 bool FeedPropertiesDialog::loadLinkedWebsite() const
0327 {
0328     return widget->checkBox_loadWebsite->isChecked();
0329 }
0330 
0331 void FeedPropertiesDialog::setLoadLinkedWebsite(bool enabled)
0332 {
0333     widget->checkBox_loadWebsite->setChecked(enabled);
0334 }
0335 
0336 void FeedPropertiesDialog::selectFeedName()
0337 {
0338     widget->feedNameEdit->selectAll();
0339 }
0340 
0341 #include "moc_feedpropertiesdialog.cpp"