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"