save work

This commit is contained in:
Martin Rotter 2024-01-12 13:11:40 +01:00
parent fb62f66445
commit 57f38ed3ed
10 changed files with 137 additions and 218 deletions

@ -7,6 +7,7 @@
<file>sql/db_update_mysql_4_5.sql</file>
<file>sql/db_update_mysql_5_6.sql</file>
<file>sql/db_update_mysql_6_7.sql</file>
<file>sql/db_update_mysql_7_8.sql</file>
<file>sql/db_init_sqlite.sql</file>
<file>sql/db_update_sqlite_1_2.sql</file>
@ -15,5 +16,6 @@
<file>sql/db_update_sqlite_4_5.sql</file>
<file>sql/db_update_sqlite_5_6.sql</file>
<file>sql/db_update_sqlite_6_7.sql</file>
<file>sql/db_update_sqlite_7_8.sql</file>
</qresource>
</RCC>

@ -44,8 +44,15 @@ CREATE TABLE Feeds (
is_off INTEGER NOT NULL DEFAULT 0 CHECK (is_off >= 0 AND is_off <= 1),
is_quiet INTEGER NOT NULL DEFAULT 0 CHECK (is_quiet >= 0 AND is_quiet <= 1),
is_rtl INTEGER NOT NULL DEFAULT 0 CHECK (is_rtl >= 0 AND is_rtl <= 1),
add_any_datetime_articles INTEGER NOT NULL DEFAULT 0 CHECK (add_any_datetime_articles >= 0 AND add_any_datetime_articles <= 1),
datetime_to_avoid BIGINT NOT NULL DEFAULT 0 CHECK (datetime_to_avoid >= 0),
keep_article_count INTEGER NOT NULL DEFAULT 0 CHECK (keep_article_count >= 0),
keep_unread_articles INTEGER NOT NULL DEFAULT 1 CHECK (keep_unread_articles >= 0 AND keep_unread_articles <= 1),
keep_starred_articles INTEGER NOT NULL DEFAULT 1 CHECK (keep_starred_articles >= 0 AND keep_starred_articles <= 1),
recycle_articles INTEGER NOT NULL DEFAULT 0 CHECK (recycle_articles >= 0 AND recycle_articles <= 1),
open_articles INTEGER NOT NULL DEFAULT 0 CHECK (open_articles >= 0 AND open_articles <= 1),
account_id INTEGER NOT NULL,
custom_id TEXT NOT NULL CHECK (custom_id != ''), /* Custom ID cannot be empty, it must contain either service-specific ID, or Feeds/id. */

@ -0,0 +1,7 @@
USE ##;
-- !
SET FOREIGN_KEY_CHECKS = 0;
-- !
!! db_update_sqlite_7_8.sql
-- !
SET FOREIGN_KEY_CHECKS = 1;

@ -0,0 +1,39 @@
ALTER TABLE Feeds RENAME TO backup_Feeds;
-- !
CREATE TABLE Feeds (
id $$,
ordr INTEGER NOT NULL CHECK (ordr >= 0),
title TEXT NOT NULL CHECK (title != ''),
description TEXT,
date_created BIGINT,
icon ^^,
category INTEGER NOT NULL CHECK (category >= -1), /* Physical category ID, also root feeds contain -1 here. */
source TEXT,
update_type INTEGER NOT NULL CHECK (update_type >= 0),
update_interval INTEGER NOT NULL DEFAULT 900 CHECK (update_interval >= 1),
is_off INTEGER NOT NULL DEFAULT 0 CHECK (is_off >= 0 AND is_off <= 1),
is_quiet INTEGER NOT NULL DEFAULT 0 CHECK (is_quiet >= 0 AND is_quiet <= 1),
is_rtl INTEGER NOT NULL DEFAULT 0 CHECK (is_rtl >= 0 AND is_rtl <= 1),
add_any_datetime_articles INTEGER NOT NULL DEFAULT 0 CHECK (add_any_datetime_articles >= 0 AND add_any_datetime_articles <= 1),
datetime_to_avoid BIGINT NOT NULL DEFAULT 0 CHECK (datetime_to_avoid >= 0),
keep_article_count INTEGER NOT NULL DEFAULT 0 CHECK (keep_article_count >= 0),
keep_unread_articles INTEGER NOT NULL DEFAULT 1 CHECK (keep_unread_articles >= 0 AND keep_unread_articles <= 1),
keep_starred_articles INTEGER NOT NULL DEFAULT 1 CHECK (keep_starred_articles >= 0 AND keep_starred_articles <= 1),
recycle_articles INTEGER NOT NULL DEFAULT 0 CHECK (recycle_articles >= 0 AND recycle_articles <= 1),
open_articles INTEGER NOT NULL DEFAULT 0 CHECK (open_articles >= 0 AND open_articles <= 1),
account_id INTEGER NOT NULL,
custom_id TEXT NOT NULL CHECK (custom_id != ''), /* Custom ID cannot be empty, it must contain either service-specific ID, or Feeds/id. */
/* Custom column for (serialized) custom account-specific data. */
custom_data TEXT,
FOREIGN KEY (account_id) REFERENCES Accounts (id) ON DELETE CASCADE
);
-- !
INSERT INTO Feeds (id, ordr, title, description, date_created, icon, category, source, update_type, update_interval, is_off, is_quiet, is_rtl, add_any_datetime_articles, datetime_to_avoid, open_articles, account_id, custom_id, custom_data)
SELECT id, ordr, title, description, date_created, icon, category, source, update_type, update_interval, is_off, is_quiet, is_rtl, add_any_datetime_articles, datetime_to_avoid, open_articles, account_id, custom_id, custom_data
FROM backup_Feeds;
-- !
DROP TABLE backup_Feeds;

@ -226,7 +226,7 @@
#define APP_DB_SQLITE_FILE "database.db"
// Keep this in sync with schema versions declared in SQL initialization code.
#define APP_DB_SCHEMA_VERSION "7"
#define APP_DB_SCHEMA_VERSION "8"
#define APP_DB_UPDATE_FILE_PATTERN "db_update_%1_%2_%3.sql"
#define APP_DB_COMMENT_SPLIT "-- !\n"
#define APP_DB_INCLUDE_PLACEHOLDER "!!"
@ -311,10 +311,14 @@
#define FDS_DB_IS_RTL_INDEX 12
#define FDS_DB_ADD_ANY_DATETIME_ARTICLES_INDEX 13
#define FDS_DB_DATETIME_TO_AVOID_INDEX 14
#define FDS_DB_OPEN_ARTICLES_INDEX 15
#define FDS_DB_ACCOUNT_ID_INDEX 16
#define FDS_DB_CUSTOM_ID_INDEX 17
#define FDS_DB_CUSTOM_DATA_INDEX 18
#define FDS_DB_KEEP_ARTICLES_COUNT 15
#define FDS_DB_KEEP_UNREAD_ARTICLES 16
#define FDS_DB_KEEP_STARRED_ARTICLES 17
#define RECYCLE_ARTICLE_DONT_PURGE 18
#define FDS_DB_OPEN_ARTICLES_INDEX 19
#define FDS_DB_ACCOUNT_ID_INDEX 20
#define FDS_DB_CUSTOM_ID_INDEX 21
#define FDS_DB_CUSTOM_DATA_INDEX 22
// Indexes of columns for feed models.
#define FDS_MODEL_TITLE_INDEX 0

@ -26,6 +26,10 @@ ArticleAmountControl::ArticleAmountControl(QWidget* parent) : QWidget(parent) {
m_ui.m_dtDateTimeToAvoid
->setDisplayFormat(qApp->localization()->loadedLocale().dateTimeFormat(QLocale::FormatType::ShortFormat));
connect(m_ui.m_cbAddAnyDateArticles, &QCheckBox::toggled, this, [this](bool checked) {
m_ui.m_gbAvoidOldArticles->setEnabled(!checked);
});
// Ignoring articles.
connect(m_ui.m_cbAddAnyDateArticles, &QCheckBox::toggled, this, &ArticleAmountControl::changed);
connect(m_ui.m_gbAvoidOldArticles, &QGroupBox::toggled, this, &ArticleAmountControl::changed);
@ -58,15 +62,13 @@ void ArticleAmountControl::setForAppWideFeatures(bool app_wide, bool batch_edit)
if (batch_edit) {
// We hook batch selectors.
/*
m_ui.m_mcbAutoDownloading->addActionWidget(m_ui.m_wdgAutoUpdate);
m_ui.m_mcbAddAnyDateArticles->addActionWidget(m_ui.m_cbAddAnyDateArticles);
m_ui.m_mcbOpenArticlesAutomatically->addActionWidget(m_ui.m_cbOpenArticlesAutomatically);
m_ui.m_mcbAvoidOldArticles->addActionWidget(m_ui.m_gbAvoidOldArticles);
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_cbFeedRTL);
*/
m_ui.m_mcbAvoidOldArticles->addActionWidget(m_ui.m_wdgAvoidOldArticles);
m_ui.m_mcbArticleCount->addActionWidget(m_ui.m_spinArticleCount);
m_ui.m_mcbMoveToBinNoPurge->addActionWidget(m_ui.m_cbMoveToBinNoPurge);
m_ui.m_mcbNoRemoveImportant->addActionWidget(m_ui.m_cbNoRemoveImportant);
m_ui.m_mcbNoRemoveUnread->addActionWidget(m_ui.m_cbNoRemoveUnread);
}
else {
// We hide batch selectors.
@ -119,6 +121,33 @@ ArticleAmountControl::Setup ArticleAmountControl::save() const {
return setup;
}
bool isChangeAllowed(MultiFeedEditCheckBox* mcb) {
return mcb->isChecked();
}
void ArticleAmountControl::saveFeed(Feed* fd) const {
if (isChangeAllowed(m_ui.m_mcbAddAnyDateArticles)) {
fd->setAddAnyDatetimeArticles(m_ui.m_cbAddAnyDateArticles->isChecked());
}
if (isChangeAllowed(m_ui.m_mcbAvoidOldArticles)) {
if (m_ui.m_gbAvoidOldArticles->isChecked()) {
if (m_ui.m_rbAvoidAbsolute->isChecked()) {
fd->setDatetimeToAvoid(m_ui.m_dtDateTimeToAvoid->dateTime());
fd->setHoursToAvoid(0);
}
else {
fd->setDatetimeToAvoid({});
fd->setHoursToAvoid(m_ui.m_spinHoursAvoid->value());
}
}
else {
fd->setDatetimeToAvoid({});
fd->setHoursToAvoid(0);
}
}
}
void ArticleAmountControl::updateArticleCountSuffix(int count) {
m_ui.m_spinArticleCount->setSuffix(QSL(" ") + tr("newest article(s)", nullptr, count));
}

@ -7,9 +7,13 @@
#include "ui_articleamountcontrol.h"
class Feed;
class ArticleAmountControl : public QWidget {
Q_OBJECT
friend class FormFeedDetails;
public:
struct Setup {
// Ignoring articles.
@ -32,6 +36,8 @@ class ArticleAmountControl : public QWidget {
void load(const Setup& setup);
Setup save() const;
void saveFeed(Feed* fd) const;
private slots:
void updateArticleCountSuffix(int count);

@ -29,7 +29,7 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="m_tabIgnore">
<attribute name="title">
@ -39,7 +39,7 @@
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="MultiFeedEditCheckBox" name="m_mcbAvoidOldArticles_2"/>
<widget class="MultiFeedEditCheckBox" name="m_mcbAddAnyDateArticles"/>
</item>
<item>
<widget class="QCheckBox" name="m_cbAddAnyDateArticles">
@ -176,7 +176,7 @@
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="MultiFeedEditCheckBox" name="m_mcbAvoidOldArticles_3"/>
<widget class="MultiFeedEditCheckBox" name="m_mcbArticleCount"/>
</item>
<item>
<widget class="QLabel" name="label">
@ -210,7 +210,7 @@
<item row="1" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="MultiFeedEditCheckBox" name="m_mcbAvoidOldArticles_4"/>
<widget class="MultiFeedEditCheckBox" name="m_mcbNoRemoveImportant"/>
</item>
<item>
<widget class="QCheckBox" name="m_cbNoRemoveImportant">
@ -224,7 +224,7 @@
<item row="2" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="MultiFeedEditCheckBox" name="m_mcbAvoidOldArticles_5"/>
<widget class="MultiFeedEditCheckBox" name="m_mcbNoRemoveUnread"/>
</item>
<item>
<widget class="QCheckBox" name="m_cbNoRemoveUnread">
@ -238,7 +238,7 @@
<item row="3" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="MultiFeedEditCheckBox" name="m_mcbAvoidOldArticles_6"/>
<widget class="MultiFeedEditCheckBox" name="m_mcbMoveToBinNoPurge"/>
</item>
<item>
<widget class="QCheckBox" name="m_cbMoveToBinNoPurge">

@ -55,26 +55,7 @@ void FormFeedDetails::apply() {
fd->setIsRtl(m_ui.m_cbFeedRTL->isChecked());
}
if (isChangeAllowed(m_ui.m_mcbAddAnyDateArticles)) {
fd->setAddAnyDatetimeArticles(m_ui.m_cbAddAnyDateArticles->isChecked());
}
if (isChangeAllowed(m_ui.m_mcbAvoidOldArticles)) {
if (m_ui.m_gbAvoidOldArticles->isChecked()) {
if (m_ui.m_rbAvoidAbsolute->isChecked()) {
fd->setDatetimeToAvoid(m_ui.m_dtDateTimeToAvoid->dateTime());
fd->setHoursToAvoid(0);
}
else {
fd->setDatetimeToAvoid({});
fd->setHoursToAvoid(m_ui.m_spinHoursAvoid->value());
}
}
else {
fd->setDatetimeToAvoid({});
fd->setHoursToAvoid(0);
}
}
m_ui.m_wdgArticleLimiting->saveFeed(fd);
if (isChangeAllowed(m_ui.m_mcbDisableFeed)) {
fd->setIsSwitchedOff(m_ui.m_cbDisableFeed->isChecked());
@ -122,10 +103,6 @@ void FormFeedDetails::createConnections() {
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&FormFeedDetails::onAutoUpdateTypeChanged);
connect(m_ui.m_cbAddAnyDateArticles, &QCheckBox::toggled, this, [this](bool checked) {
m_ui.m_gbAvoidOldArticles->setEnabled(!checked);
});
}
void FormFeedDetails::loadFeedData() {
@ -134,9 +111,7 @@ void FormFeedDetails::loadFeedData() {
if (m_isBatchEdit) {
// We hook batch selectors.
m_ui.m_mcbAutoDownloading->addActionWidget(m_ui.m_wdgAutoUpdate);
m_ui.m_mcbAddAnyDateArticles->addActionWidget(m_ui.m_cbAddAnyDateArticles);
m_ui.m_mcbOpenArticlesAutomatically->addActionWidget(m_ui.m_cbOpenArticlesAutomatically);
m_ui.m_mcbAvoidOldArticles->addActionWidget(m_ui.m_gbAvoidOldArticles);
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_cbFeedRTL);
@ -148,6 +123,8 @@ void FormFeedDetails::loadFeedData() {
}
}
m_ui.m_wdgArticleLimiting->setForAppWideFeatures(false, m_isBatchEdit);
if (m_creatingNew) {
GuiUtilities::applyDialogProperties(*this,
qApp->icons()->fromTheme(QSL("application-rss+xml")),
@ -169,21 +146,23 @@ void FormFeedDetails::loadFeedData() {
m_ui.m_spinAutoUpdateInterval->setValue(fd->autoUpdateInterval());
m_ui.m_cbOpenArticlesAutomatically->setChecked(fd->openArticlesDirectly());
m_ui.m_cbFeedRTL->setChecked(fd->isRtl());
m_ui.m_cbAddAnyDateArticles->setChecked(fd->addAnyDatetimeArticles());
m_ui.m_gbAvoidOldArticles->setChecked((fd->datetimeToAvoid().isValid() &&
fd->datetimeToAvoid().toMSecsSinceEpoch() > 0) ||
fd->hoursToAvoid() > 0);
m_ui.m_dtDateTimeToAvoid->setDateTime(fd->datetimeToAvoid());
m_ui.m_spinHoursAvoid->setValue(fd->hoursToAvoid());
m_ui.m_cbDisableFeed->setChecked(fd->isSwitchedOff());
m_ui.m_cbSuppressFeed->setChecked(fd->isQuiet());
if (fd->datetimeToAvoid().isValid() && fd->datetimeToAvoid().toMSecsSinceEpoch() > 0) {
m_ui.m_rbAvoidAbsolute->setChecked(true);
}
else {
m_ui.m_rbAvoidRelative->setChecked(true);
}
ArticleAmountControl::Setup art_limit;
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);
}
void FormFeedDetails::acceptIfPossible() {
@ -205,12 +184,6 @@ void FormFeedDetails::acceptIfPossible() {
void FormFeedDetails::initialize() {
m_ui.setupUi(this);
m_ui.m_dtDateTimeToAvoid->setEnabled(false);
m_ui.m_spinHoursAvoid->setEnabled(false);
m_ui.m_spinHoursAvoid->setMode(TimeSpinBox::Mode::DaysHours);
m_ui.m_dtDateTimeToAvoid
->setDisplayFormat(qApp->localization()->loadedLocale().dateTimeFormat(QLocale::FormatType::ShortFormat));
// Setup auto-update options.
m_ui.m_spinAutoUpdateInterval->setMode(TimeSpinBox::Mode::MinutesSeconds);
m_ui.m_spinAutoUpdateInterval->setValue(DEFAULT_AUTO_UPDATE_INTERVAL);

@ -88,126 +88,7 @@
</layout>
</item>
<item row="2" column="0" colspan="2">
<widget class="Line" name="line">
<property name="minimumSize">
<size>
<width>150</width>
<height>0</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="MultiFeedEditCheckBox" name="m_mcbAddAnyDateArticles"/>
</item>
<item>
<widget class="QCheckBox" name="m_cbAddAnyDateArticles">
<property name="text">
<string>Add articles with any date into the database</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="MultiFeedEditCheckBox" name="m_mcbAvoidOldArticles"/>
</item>
<item>
<widget class="QGroupBox" name="m_gbAvoidOldArticles">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title">
<string>Avoid adding articles before this date/time into the database</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QDateTimeEdit" name="m_dtDateTimeToAvoid">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumDate">
<date>
<year>1971</year>
<month>1</month>
<day>1</day>
</date>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="m_rbAvoidAbsolute">
<property name="text">
<string>Absolute date/time</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="TimeSpinBox" name="m_spinHoursAvoid">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<double>10000.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="m_rbAvoidRelative">
<property name="text">
<string>Relative time</string>
</property>
</widget>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
<widget class="ArticleAmountControl" name="m_wdgArticleLimiting" native="true"/>
</item>
</layout>
</widget>
@ -288,12 +169,15 @@
<extends>QCheckBox</extends>
<header>multifeededitcheckbox.h</header>
</customwidget>
<customwidget>
<class>ArticleAmountControl</class>
<extends>QWidget</extends>
<header>articleamountcontrol.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>m_cbOpenArticlesAutomatically</tabstop>
<tabstop>m_cbAddAnyDateArticles</tabstop>
<tabstop>m_gbAvoidOldArticles</tabstop>
<tabstop>m_dtDateTimeToAvoid</tabstop>
<tabstop>m_cbSuppressFeed</tabstop>
<tabstop>m_cbDisableFeed</tabstop>
<tabstop>m_cbFeedRTL</tabstop>
@ -316,37 +200,5 @@
</hint>
</hints>
</connection>
<connection>
<sender>m_rbAvoidAbsolute</sender>
<signal>toggled(bool)</signal>
<receiver>m_dtDateTimeToAvoid</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>112</x>
<y>487</y>
</hint>
<hint type="destinationlabel">
<x>233</x>
<y>487</y>
</hint>
</hints>
</connection>
<connection>
<sender>m_rbAvoidRelative</sender>
<signal>toggled(bool)</signal>
<receiver>m_spinHoursAvoid</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>112</x>
<y>515</y>
</hint>
<hint type="destinationlabel">
<x>233</x>
<y>515</y>
</hint>
</hints>
</connection>
</connections>
</ui>