rssguard/src/librssguard/services/abstract/gui/formfeeddetails.cpp

219 lines
7.9 KiB
C++

// For license of this file, see <project-root-folder>/LICENSE.md.
#include "services/abstract/gui/formfeeddetails.h"
#include "database/databasequeries.h"
#include "definitions/definitions.h"
#include "exceptions/applicationexception.h"
#include "gui/guiutilities.h"
#include "miscellaneous/iconfactory.h"
#include "miscellaneous/textfactory.h"
#include "services/abstract/gui/multifeededitcheckbox.h"
#include "services/abstract/rootitem.h"
#include "ui_formfeeddetails.h"
#include <QMenu>
#include <QNetworkReply>
#include <QPair>
#include <QPushButton>
#include <QTextCodec>
FormFeedDetails::FormFeedDetails(ServiceRoot* service_root, QWidget* parent)
: QDialog(parent), m_ui(new Ui::FormFeedDetails()), m_serviceRoot(service_root) {
initialize();
createConnections();
}
FormFeedDetails::~FormFeedDetails() = default;
void FormFeedDetails::activateTab(int index) {
m_ui->m_tabWidget->setCurrentIndex(index);
}
void FormFeedDetails::clearTabs() {
m_ui->m_tabWidget->clear();
}
void FormFeedDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) {
if (index < 0) {
m_ui->m_tabWidget->addTab(custom_tab, title);
}
else {
m_ui->m_tabWidget->insertTab(index, custom_tab, title);
}
}
void FormFeedDetails::apply() {
QList<Feed*> fds = feeds<Feed>();
for (Feed* fd : fds) {
// Setup common data for the feed.
if (isChangeAllowed(m_ui->m_mcbAutoDownloading)) {
fd->setAutoUpdateType(static_cast<Feed::AutoUpdateType>(m_ui->m_cmbAutoUpdateType
->itemData(m_ui->m_cmbAutoUpdateType->currentIndex())
.toInt()));
fd->setAutoUpdateInterval(int(m_ui->m_spinAutoUpdateInterval->value()));
}
if (isChangeAllowed(m_ui->m_mcbOpenArticlesAutomatically)) {
fd->setOpenArticlesDirectly(m_ui->m_cbOpenArticlesAutomatically->isChecked());
}
if (isChangeAllowed(m_ui->m_mcbFeedRtl)) {
fd->setRtlBehavior(m_ui->m_cmbRtlBehavior->currentData().value<RtlBehavior>());
}
m_ui->m_wdgArticleLimiting->saveFeed(fd, m_isBatchEdit);
if (isChangeAllowed(m_ui->m_mcbDisableFeed)) {
fd->setIsSwitchedOff(m_ui->m_cbDisableFeed->isChecked());
}
if (isChangeAllowed(m_ui->m_mcbSuppressFeed)) {
fd->setIsQuiet(m_ui->m_cbSuppressFeed->isChecked());
}
if (!m_creatingNew) {
// We need to make sure that common data are saved.
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
DatabaseQueries::createOverwriteFeed(database, fd, m_serviceRoot->accountId(), fd->parent()->id());
}
}
if (!m_creatingNew) {
m_serviceRoot->itemChanged(feeds<RootItem>());
}
}
QDialogButtonBox* FormFeedDetails::buttonBox() const {
return m_ui->m_buttonBox;
}
bool FormFeedDetails::isChangeAllowed(MultiFeedEditCheckBox* mcb) const {
return !m_isBatchEdit || mcb->isChecked();
}
void FormFeedDetails::onAutoUpdateTypeChanged(int new_index) {
Feed::AutoUpdateType auto_update_type =
static_cast<Feed::AutoUpdateType>(m_ui->m_cmbAutoUpdateType->itemData(new_index).toInt());
switch (auto_update_type) {
case Feed::AutoUpdateType::DontAutoUpdate:
case Feed::AutoUpdateType::DefaultAutoUpdate:
m_ui->m_spinAutoUpdateInterval->setEnabled(false);
break;
default:
m_ui->m_spinAutoUpdateInterval->setEnabled(true);
}
}
void FormFeedDetails::createConnections() {
connect(m_ui->m_buttonBox, &QDialogButtonBox::accepted, this, &FormFeedDetails::acceptIfPossible);
connect(m_ui->m_cmbAutoUpdateType,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&FormFeedDetails::onAutoUpdateTypeChanged);
}
void FormFeedDetails::loadFeedData() {
Feed* fd = feed<Feed>();
if (m_isBatchEdit) {
// We hook batch selectors.
m_ui->m_mcbAutoDownloading->addActionWidget(m_ui->m_wdgAutoUpdate);
m_ui->m_mcbOpenArticlesAutomatically->addActionWidget(m_ui->m_cbOpenArticlesAutomatically);
m_ui->m_mcbDisableFeed->addActionWidget(m_ui->m_cbDisableFeed);
m_ui->m_mcbSuppressFeed->addActionWidget(m_ui->m_cbSuppressFeed);
m_ui->m_mcbFeedRtl->addActionWidget(m_ui->m_cmbRtlBehavior);
}
else {
// We hide batch selectors.
for (auto* cb : findChildren<MultiFeedEditCheckBox*>()) {
cb->hide();
}
}
m_ui->m_wdgArticleLimiting->setForAppWideFeatures(false, m_isBatchEdit);
if (m_creatingNew) {
GuiUtilities::applyDialogProperties(*this,
qApp->icons()->fromTheme(QSL("application-rss+xml")),
tr("Add new feed"));
}
else {
if (!m_isBatchEdit) {
GuiUtilities::applyDialogProperties(*this, fd->fullIcon(), tr("Edit \"%1\"").arg(fd->title()));
}
else {
GuiUtilities::applyDialogProperties(*this,
qApp->icons()->fromTheme(QSL("application-rss+xml")),
tr("Edit %n feeds", nullptr, m_feeds.size()));
}
}
m_ui->m_cmbAutoUpdateType
->setCurrentIndex(m_ui->m_cmbAutoUpdateType->findData(QVariant::fromValue(int(fd->autoUpdateType()))));
m_ui->m_spinAutoUpdateInterval->setValue(fd->autoUpdateInterval());
m_ui->m_cbOpenArticlesAutomatically->setChecked(fd->openArticlesDirectly());
m_ui->m_cmbRtlBehavior->setCurrentIndex(m_ui->m_cmbRtlBehavior->findData(QVariant::fromValue(fd->rtlBehavior())));
m_ui->m_cbDisableFeed->setChecked(fd->isSwitchedOff());
m_ui->m_cbSuppressFeed->setChecked(fd->isQuiet());
Feed::ArticleIgnoreLimit art_limit = Feed::ArticleIgnoreLimit(fd->articleIgnoreLimit());
/*
art_limit.m_addAnyArticlesToDb = fd->addAnyDatetimeArticles();
art_limit.m_avoidOldArticles =
(fd->datetimeToAvoid().isValid() && fd->datetimeToAvoid().toMSecsSinceEpoch() > 0) || fd->hoursToAvoid() > 0;
art_limit.m_dtToAvoid = fd->datetimeToAvoid();
art_limit.m_hoursToAvoid = fd->hoursToAvoid();
art_limit.m_doNotRemoveStarred = false;
art_limit.m_doNotRemoveUnread = false;
art_limit.m_keepCountOfArticles = 4;
art_limit.m_moveToBinDontPurge = false;
*/
m_ui->m_wdgArticleLimiting->load(art_limit, true);
}
void FormFeedDetails::acceptIfPossible() {
try {
apply();
accept();
}
catch (const ApplicationException& ex) {
qApp->showGuiMessage(Notification::Event::GeneralEvent,
{tr("Cannot save feed properties"),
tr("Cannot save changes: %1").arg(ex.message()),
QSystemTrayIcon::MessageIcon::Critical},
{},
{},
this);
}
}
void FormFeedDetails::initialize() {
m_ui->setupUi(this);
// Setup auto-update options.
m_ui->m_spinAutoUpdateInterval->setMode(TimeSpinBox::Mode::MinutesSeconds);
m_ui->m_spinAutoUpdateInterval->setValue(DEFAULT_AUTO_UPDATE_INTERVAL);
m_ui->m_cmbAutoUpdateType->addItem(tr("Fetch articles using global interval"),
QVariant::fromValue(int(Feed::AutoUpdateType::DefaultAutoUpdate)));
m_ui->m_cmbAutoUpdateType->addItem(tr("Fetch articles every"),
QVariant::fromValue(int(Feed::AutoUpdateType::SpecificAutoUpdate)));
m_ui->m_cmbAutoUpdateType->addItem(tr("Disable auto-fetching of articles"),
QVariant::fromValue(int(Feed::AutoUpdateType::DontAutoUpdate)));
m_ui->m_cmbRtlBehavior->addItem(tr("Left-to-right"), QVariant::fromValue(int(RtlBehavior::NoRtl)));
m_ui->m_cmbRtlBehavior->addItem(tr("Right-to-left (everywhere)"), QVariant::fromValue(int(RtlBehavior::Everywhere)));
m_ui->m_cmbRtlBehavior->addItem(tr("Right-to-left (everywhere except feed list)"),
QVariant::fromValue(int(RtlBehavior::EverywhereExceptFeedList)));
m_ui->m_cmbRtlBehavior->addItem(tr("Right-to-left (only in article viewer)"),
QVariant::fromValue(int(RtlBehavior::OnlyViewer)));
}