diff --git a/pri/build_opts.pri b/pri/build_opts.pri
index f332dc57a..bdb683e4a 100644
--- a/pri/build_opts.pri
+++ b/pri/build_opts.pri
@@ -40,6 +40,10 @@ else {
DEFINES *= DEBUG=1
gcc:QMAKE_CXXFLAGS_DEBUG *= -Wall
clang:QMAKE_CXXFLAGS_DEBUG *= -Wall
+ msvc:QMAKE_CXXFLAGS_DEBUG *= /W4 /wd4127
+ msvc:QMAKE_CXXFLAGS_WARN_ON = ""
+ msvc:QMAKE_CXXFLAGS_DEBUG -= /W3
+ msvc:QMAKE_CXXFLAGS -= /W3
}
MOC_DIR = $$OUT_PWD/moc
diff --git a/resources/icons.qrc b/resources/icons.qrc
index 2dd52cfb9..2c39d2853 100644
--- a/resources/icons.qrc
+++ b/resources/icons.qrc
@@ -3,6 +3,7 @@
./graphics/Faenza/actions/64/application-exit.png
./graphics/Faenza/actions/64/back.png
./graphics/Faenza/actions/64/call-start.png
+ ./graphics/Faenza/actions/64/dialog-no.png
./graphics/Faenza/actions/64/dialog-yes.png
./graphics/Faenza/actions/64/document-edit.png
./graphics/Faenza/actions/64/document-export.png
diff --git a/src/librssguard/core/feedsmodel.cpp b/src/librssguard/core/feedsmodel.cpp
index bb5b0c9c3..73a9ec008 100644
--- a/src/librssguard/core/feedsmodel.cpp
+++ b/src/librssguard/core/feedsmodel.cpp
@@ -389,7 +389,7 @@ QModelIndex FeedsModel::indexForItem(const RootItem* item) const {
return QModelIndex();
}
- QStackchain;
+ QStack chain;
while (item->kind() != RootItemKind::Root) {
chain.push(item);
diff --git a/src/librssguard/core/message.cpp b/src/librssguard/core/message.cpp
index 045da982e..fd46a5483 100644
--- a/src/librssguard/core/message.cpp
+++ b/src/librssguard/core/message.cpp
@@ -14,7 +14,12 @@ Enclosure::Enclosure(QString url, QString mime) : m_url(std::move(url)), m_mimeT
QList Enclosures::decodeEnclosuresFromString(const QString& enclosures_data) {
QList enclosures;
- for (const QString& single_enclosure : enclosures_data.split(ENCLOSURES_OUTER_SEPARATOR, QString::SkipEmptyParts)) {
+ for (const QString& single_enclosure : enclosures_data.split(ENCLOSURES_OUTER_SEPARATOR,
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts)) {
+#else
+ QString::SkipEmptyParts)) {
+#endif
Enclosure enclosure;
if (single_enclosure.contains(ECNLOSURES_INNER_SEPARATOR)) {
diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp
index e29e94c0a..7c75b9948 100644
--- a/src/librssguard/core/messagesmodel.cpp
+++ b/src/librssguard/core/messagesmodel.cpp
@@ -17,7 +17,7 @@
#include
MessagesModel::MessagesModel(QObject* parent)
- : QSqlQueryModel(parent), m_cache(new MessagesModelCache(this)), m_messageHighlighter(NoHighlighting),
+ : QSqlQueryModel(parent), m_cache(new MessagesModelCache(this)), m_messageHighlighter(MessageHighlighter::NoHighlighting),
m_customDateFormat(QString()), m_selectedItem(nullptr), m_itemHeight(-1) {
setupFonts();
setupIcons();
@@ -286,21 +286,21 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
case Qt::ForegroundRole:
switch (m_messageHighlighter) {
- case HighlightImportant: {
+ case MessageHighlighter::HighlightImportant: {
QModelIndex idx_important = index(idx.row(), MSG_DB_IMPORTANT_INDEX);
QVariant dta = m_cache->containsData(idx_important.row()) ? m_cache->data(idx_important) : QSqlQueryModel::data(idx_important);
return dta.toInt() == 1 ? qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Highlight] : QVariant();
}
- case HighlightUnread: {
+ case MessageHighlighter::HighlightUnread: {
QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX);
QVariant dta = m_cache->containsData(idx_read.row()) ? m_cache->data(idx_read) : QSqlQueryModel::data(idx_read);
return dta.toInt() == 0 ? qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Highlight] : QVariant();
}
- case NoHighlighting:
+ case MessageHighlighter::NoHighlighting:
default:
return QVariant();
}
diff --git a/src/librssguard/core/messagesmodel.h b/src/librssguard/core/messagesmodel.h
index 973f48b4a..176d19667 100644
--- a/src/librssguard/core/messagesmodel.h
+++ b/src/librssguard/core/messagesmodel.h
@@ -22,7 +22,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer {
// Enum which describes basic filtering schemes
// for messages.
- enum MessageHighlighter {
+ enum class MessageHighlighter {
NoHighlighting = 100,
HighlightUnread = 101,
HighlightImportant = 102
diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp
index 14d45191b..0fa2fa08d 100644
--- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp
+++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp
@@ -23,7 +23,10 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q
GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("view-list-details")));
+ m_ui.m_treeFeeds->setIndentation(FEEDS_VIEW_INDENTATION);
m_ui.m_treeFeeds->setModel(m_feedsModel);
+ m_ui.m_btnCheckAll->setIcon(qApp->icons()->fromTheme(QSL("dialog-yes")));
+ m_ui.m_btnUncheckAll->setIcon(qApp->icons()->fromTheme(QSL("dialog-no")));
m_ui.m_btnAddNew->setIcon(qApp->icons()->fromTheme(QSL("list-add")));
m_ui.m_btnRemoveSelected->setIcon(qApp->icons()->fromTheme(QSL("list-remove")));
m_ui.m_btnBeautify->setIcon(qApp->icons()->fromTheme(QSL("format-justify-fill")));
@@ -47,6 +50,8 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q
loadSelectedAccount();
loadFilterFeedAssignments();
});
+ connect(m_ui.m_btnCheckAll, &QPushButton::clicked, m_feedsModel, &AccountCheckModel::checkAllItems);
+ connect(m_ui.m_btnUncheckAll, &QPushButton::clicked, m_feedsModel, &AccountCheckModel::uncheckAllItems);
initializeTestingMessage();
loadFilter();
diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui b/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui
index 3d9607165..c3b9217f2 100644
--- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui
+++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui
@@ -77,6 +77,9 @@
150
+
+ false
+
true
@@ -88,14 +91,14 @@
-
-
-
+
&Check all
-
-
+
&Uncheck all
@@ -406,8 +409,8 @@
m_btnRemoveSelected
m_cmbAccounts
m_treeFeeds
- pushButton
- pushButton_2
+ m_btnCheckAll
+ m_btnUncheckAll
m_txtTitle
m_txtScript
m_btnTest
diff --git a/src/librssguard/gui/feedstoolbar.cpp b/src/librssguard/gui/feedstoolbar.cpp
index 32eae9272..2eb0806b7 100644
--- a/src/librssguard/gui/feedstoolbar.cpp
+++ b/src/librssguard/gui/feedstoolbar.cpp
@@ -77,10 +77,20 @@ void FeedsToolBar::loadSpecificActions(const QList& actions, bool init
}
QStringList FeedsToolBar::defaultActions() const {
- return QString(GUI::FeedsToolbarActionsDef).split(',', QString::SkipEmptyParts);
+ return QString(GUI::FeedsToolbarActionsDef).split(',',
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
}
QStringList FeedsToolBar::savedActions() const {
return qApp->settings()->value(GROUP(GUI),
- SETTING(GUI::FeedsToolbarActions)).toString().split(',', QString::SkipEmptyParts);
+ SETTING(GUI::FeedsToolbarActions)).toString().split(',',
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
}
diff --git a/src/librssguard/gui/feedsview.cpp b/src/librssguard/gui/feedsview.cpp
index bafffeda8..fb2fbbced 100755
--- a/src/librssguard/gui/feedsview.cpp
+++ b/src/librssguard/gui/feedsview.cpp
@@ -98,9 +98,9 @@ void FeedsView::saveExpandStates(RootItem* item) {
QList items = item->getSubTree(RootItemKind::Category | RootItemKind::ServiceRoot);
// Iterate all categories and save their expand statuses.
- for (const RootItem* item : items) {
- const QString setting_name = item->hashCode();
- QModelIndex source_index = sourceModel()->indexForItem(item);
+ for (const RootItem* it : items) {
+ const QString setting_name = it->hashCode();
+ QModelIndex source_index = sourceModel()->indexForItem(it);
QModelIndex visible_index = model()->mapFromSource(source_index);
settings->setValue(GROUP(CategoriesExpandStates),
diff --git a/src/librssguard/gui/messagestoolbar.cpp b/src/librssguard/gui/messagestoolbar.cpp
index 94df2e0d4..494dc72dd 100644
--- a/src/librssguard/gui/messagestoolbar.cpp
+++ b/src/librssguard/gui/messagestoolbar.cpp
@@ -118,11 +118,11 @@ void MessagesToolBar::initializeSearchBox() {
void MessagesToolBar::initializeHighlighter() {
m_menuMessageHighlighter = new QMenu(tr("Menu for highlighting messages"), this);
m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme(QSL("mail-mark-read")),
- tr("No extra highlighting"))->setData(QVariant::fromValue(MessagesModel::NoHighlighting));
+ tr("No extra highlighting"))->setData(QVariant::fromValue(MessagesModel::MessageHighlighter::NoHighlighting));
m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme(QSL("mail-mark-unread")),
- tr("Highlight unread messages"))->setData(QVariant::fromValue(MessagesModel::HighlightUnread));
+ tr("Highlight unread messages"))->setData(QVariant::fromValue(MessagesModel::MessageHighlighter::HighlightUnread));
m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme(QSL("mail-mark-important")),
- tr("Highlight important messages"))->setData(QVariant::fromValue(MessagesModel::HighlightImportant));
+ tr("Highlight important messages"))->setData(QVariant::fromValue(MessagesModel::MessageHighlighter::HighlightImportant));
m_btnMessageHighlighter = new QToolButton(this);
m_btnMessageHighlighter->setToolTip(tr("Display all messages"));
m_btnMessageHighlighter->setMenu(m_menuMessageHighlighter);
@@ -138,12 +138,20 @@ void MessagesToolBar::initializeHighlighter() {
}
QStringList MessagesToolBar::defaultActions() const {
- return QString(GUI::MessagesToolbarDefaultButtonsDef).split(',',
- QString::SkipEmptyParts);
+ return QString(GUI::MessagesToolbarDefaultButtonsDef).split(QL1C(','),
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SplitBehavior::SkipEmptyParts);
+#endif
}
QStringList MessagesToolBar::savedActions() const {
return qApp->settings()->value(GROUP(GUI),
- SETTING(GUI::MessagesToolbarDefaultButtons)).toString().split(',',
- QString::SkipEmptyParts);
+ SETTING(GUI::MessagesToolbarDefaultButtons)).toString().split(QL1C(','),
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SplitBehavior::SkipEmptyParts);
+#endif
}
diff --git a/src/librssguard/gui/statusbar.cpp b/src/librssguard/gui/statusbar.cpp
index cc82b8f9d..de791b8a0 100644
--- a/src/librssguard/gui/statusbar.cpp
+++ b/src/librssguard/gui/statusbar.cpp
@@ -73,11 +73,22 @@ void StatusBar::saveChangeableActions(const QStringList& actions) {
}
QStringList StatusBar::defaultActions() const {
- return QString(GUI::StatusbarActionsDef).split(',', QString::SkipEmptyParts);
+ return QString(GUI::StatusbarActionsDef).split(',',
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
}
QStringList StatusBar::savedActions() const {
- return qApp->settings()->value(GROUP(GUI), SETTING(GUI::StatusbarActions)).toString().split(',', QString::SkipEmptyParts);
+ return qApp->settings()->value(GROUP(GUI),
+ SETTING(GUI::StatusbarActions)).toString().split(',',
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
}
QList StatusBar::getSpecificActions(const QStringList& actions) {
diff --git a/src/librssguard/gui/tabbar.cpp b/src/librssguard/gui/tabbar.cpp
index 00d909686..9858e1531 100644
--- a/src/librssguard/gui/tabbar.cpp
+++ b/src/librssguard/gui/tabbar.cpp
@@ -72,17 +72,17 @@ void TabBar::wheelEvent(QWheelEvent* event) {
// Make sure rotating works.
if (number_of_tabs > 1) {
- if (event->delta() > 0) {
+ if (event->angleDelta().y() > 0) {
// Scroll to the LEFT tab.
- setCurrentIndex(current_index == 0 ?
- number_of_tabs - 1 :
- current_index - 1);
+ setCurrentIndex(current_index == 0
+ ? number_of_tabs - 1
+ : current_index - 1);
}
- else if (event->delta() < 0) {
+ else if (event->angleDelta().y() < 0) {
// Scroll to the RIGHT tab.
- setCurrentIndex(current_index == number_of_tabs - 1 ?
- 0 :
- current_index + 1);
+ setCurrentIndex(current_index == number_of_tabs - 1
+ ? 0
+ : current_index + 1);
}
}
}
diff --git a/src/librssguard/miscellaneous/application.cpp b/src/librssguard/miscellaneous/application.cpp
index 6981eef04..29cfe240e 100755
--- a/src/librssguard/miscellaneous/application.cpp
+++ b/src/librssguard/miscellaneous/application.cpp
@@ -489,7 +489,7 @@ void Application::onAboutToQuit() {
finish();
qDebug("Killing local peer connection to allow another instance to start.");
- if (QProcess::startDetached(QString("\"") + QDir::toNativeSeparators(applicationFilePath()) + QString("\""))) {
+ if (QProcess::startDetached(QDir::toNativeSeparators(applicationFilePath()), {})) {
qDebug("New application instance was started.");
}
else {
diff --git a/src/librssguard/miscellaneous/databasefactory.cpp b/src/librssguard/miscellaneous/databasefactory.cpp
index 1ec87fca2..3b05df7b6 100644
--- a/src/librssguard/miscellaneous/databasefactory.cpp
+++ b/src/librssguard/miscellaneous/databasefactory.cpp
@@ -218,7 +218,12 @@ QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() {
qPrintable(APP_SQL_PATH));
}
- const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts);
+ const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT,
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
database.transaction();
@@ -327,7 +332,12 @@ QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString& c
qPrintable(APP_SQL_PATH));
}
- const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts);
+ const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT,
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
database.transaction();
@@ -407,7 +417,12 @@ bool DatabaseFactory::sqliteUpdateDatabaseSchema(const QSqlDatabase& database, c
qFatal("Updating of database schema failed. File '%s' cannot be opened.", qPrintable(QDir::toNativeSeparators(update_file_name)));
}
- const QStringList statements = QString(update_file_handle.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts);
+ const QStringList statements = QString(update_file_handle.readAll()).split(APP_DB_COMMENT_SPLIT,
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
for (const QString& statement : statements) {
QSqlQuery query = database.exec(statement);
@@ -447,7 +462,12 @@ bool DatabaseFactory::mysqlUpdateDatabaseSchema(const QSqlDatabase& database,
qFatal("Updating of database schema failed. File '%s' cannot be opened.", qPrintable(QDir::toNativeSeparators(update_file_name)));
}
- QStringList statements = QString(update_file_handle.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts);
+ QStringList statements = QString(update_file_handle.readAll()).split(APP_DB_COMMENT_SPLIT,
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
for (QString statement : statements) {
QSqlQuery query = database.exec(statement.replace(APP_DB_NAME_PLACEHOLDER, db_name));
@@ -676,7 +696,12 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString& connection_
qPrintable(APP_SQL_PATH));
}
- const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts);
+ const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT,
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
database.transaction();
diff --git a/src/librssguard/miscellaneous/iofactory.cpp b/src/librssguard/miscellaneous/iofactory.cpp
index a8587377e..f78ac755b 100755
--- a/src/librssguard/miscellaneous/iofactory.cpp
+++ b/src/librssguard/miscellaneous/iofactory.cpp
@@ -10,6 +10,7 @@
#include
#include
#include
+#include
#include
IOFactory::IOFactory() = default;
@@ -70,6 +71,18 @@ QString IOFactory::filterBadCharsFromFilename(const QString& name) {
return value;
}
+bool IOFactory::startProcessDetached(const QString& program, const QStringList& arguments,
+ const QString& native_arguments, const QString& working_directory) {
+ QProcess process;
+
+ process.setProgram(program);
+ process.setArguments(arguments);
+ process.setNativeArguments(native_arguments);
+ process.setWorkingDirectory(working_directory);
+
+ return process.startDetached(nullptr);
+}
+
QByteArray IOFactory::readFile(const QString& file_path) {
QFile input_file(file_path);
QByteArray input_data;
diff --git a/src/librssguard/miscellaneous/iofactory.h b/src/librssguard/miscellaneous/iofactory.h
index bcd41a76d..a3dd426e5 100644
--- a/src/librssguard/miscellaneous/iofactory.h
+++ b/src/librssguard/miscellaneous/iofactory.h
@@ -27,6 +27,10 @@ class IOFactory {
// Filters out shit characters from filename.
static QString filterBadCharsFromFilename(const QString& name);
+ static bool startProcessDetached(const QString& program,
+ const QStringList& arguments,
+ const QString& native_arguments = {},
+ const QString& working_directory = {});
// Returns contents of a file.
// Throws exception when no such file exists.
diff --git a/src/librssguard/miscellaneous/simplecrypt/simplecrypt.cpp b/src/librssguard/miscellaneous/simplecrypt/simplecrypt.cpp
index cd8050e27..5dd1ea909 100644
--- a/src/librssguard/miscellaneous/simplecrypt/simplecrypt.cpp
+++ b/src/librssguard/miscellaneous/simplecrypt/simplecrypt.cpp
@@ -31,6 +31,7 @@
#include
#include
#include
+#include
#include
#include
@@ -38,16 +39,13 @@ SimpleCrypt::SimpleCrypt() :
m_key(0),
m_compressionMode(CompressionAlways),
m_protectionMode(ProtectionHash),
- m_lastError(ErrorNoError) {
- qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF));
-}
+ m_lastError(ErrorNoError) {}
SimpleCrypt::SimpleCrypt(quint64 key) :
m_key(key),
m_compressionMode(CompressionAlways),
m_protectionMode(ProtectionHash),
m_lastError(ErrorNoError) {
- qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF));
splitKey();
}
@@ -116,7 +114,7 @@ QByteArray SimpleCrypt::encryptToByteArray(QByteArray plaintext) {
}
//prepend a random char to the string
- char randomChar = char(qrand() & 0xFF);
+ char randomChar = char(QRandomGenerator::global()->generate() & 0xFF);
ba = randomChar + integrityProtection + ba;
int pos(0);
@@ -221,6 +219,7 @@ QByteArray SimpleCrypt::decryptToByteArray(QByteArray cypher) {
}
quint16 storedChecksum;
+
{
QDataStream s(&ba, QIODevice::ReadOnly);
diff --git a/src/librssguard/miscellaneous/systemfactory.cpp b/src/librssguard/miscellaneous/systemfactory.cpp
index 635000af7..fc54ecdf1 100644
--- a/src/librssguard/miscellaneous/systemfactory.cpp
+++ b/src/librssguard/miscellaneous/systemfactory.cpp
@@ -59,7 +59,6 @@ SystemFactory::AutoStartStatus SystemFactory::autoStartStatus() const {
return AutoStartStatus::Disabled;
}
#elif defined(Q_OS_LINUX)
-
// Use proper freedesktop.org way to auto-start the application on Linux.
// INFO: http://standards.freedesktop.org/autostart-spec/latest/
const QString desktop_file_location = autostartDesktopFileLocation();
@@ -82,7 +81,6 @@ SystemFactory::AutoStartStatus SystemFactory::autoStartStatus() const {
return AutoStartStatus::Disabled;
}
#else
-
// Disable auto-start functionality on unsupported platforms.
return AutoStartStatus::Unavailable;
#endif
@@ -139,7 +137,6 @@ bool SystemFactory::setAutoStartStatus(AutoStartStatus new_status) {
return false;
}
#elif defined(Q_OS_LINUX)
-
// Note that we expect here that no other program uses
// "rssguard.desktop" desktop file.
const QString destination_file = autostartDesktopFileLocation();
@@ -279,7 +276,8 @@ bool SystemFactory::isVersionEqualOrNewer(const QString& new_version, const QStr
bool SystemFactory::openFolderFile(const QString& file_path) {
#if defined(Q_OS_WIN)
- return QProcess::startDetached(QString("explorer.exe /select, \"") + QDir::toNativeSeparators(file_path) + "\"");
+ return QProcess::startDetached(QSL("explorer.exe"),
+ { "/select,", QDir::toNativeSeparators(file_path)});
#else
const QString folder = QDir::toNativeSeparators(QFileInfo(file_path).absoluteDir().absolutePath());
diff --git a/src/librssguard/network-web/adblock/adblockrule.cpp b/src/librssguard/network-web/adblock/adblockrule.cpp
index 5e9e199e5..a2eeed39a 100644
--- a/src/librssguard/network-web/adblock/adblockrule.cpp
+++ b/src/librssguard/network-web/adblock/adblockrule.cpp
@@ -370,7 +370,12 @@ void AdBlockRule::parseFilter() {
int optionsIndex = parsedLine.indexOf(QL1C('$'));
if (optionsIndex >= 0) {
- const QStringList options = parsedLine.mid(optionsIndex + 1).split(QL1C(','), QString::SkipEmptyParts);
+ const QStringList options = parsedLine.mid(optionsIndex + 1).split(QL1C(','),
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
int handledOptions = 0;
for (const QString& option : options) {
@@ -497,7 +502,12 @@ void AdBlockRule::parseFilter() {
}
void AdBlockRule::parseDomains(const QString& domains, const QChar& separator) {
- QStringList domainsList = domains.split(separator, QString::SkipEmptyParts);
+ QStringList domainsList = domains.split(separator,
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
for (const QString& domain : domainsList) {
if (domain.isEmpty()) {
@@ -618,15 +628,15 @@ QString AdBlockRule::createRegExpFromFilter(const QString& filter) const {
}
QList AdBlockRule::createStringMatchers(const QStringList& filters) const {
- QList matchers;
+ QList mtchrs;
- matchers.reserve(filters.size());
+ mtchrs.reserve(filters.size());
for (const QString& filter : filters) {
- matchers.append(QStringMatcher(filter, m_caseSensitivity));
+ mtchrs.append(QStringMatcher(filter, m_caseSensitivity));
}
- return matchers;
+ return mtchrs;
}
int AdBlockRule::regexMatched(const QString& str, int offset) const {
diff --git a/src/librssguard/network-web/adblock/adblocksearchtree.cpp b/src/librssguard/network-web/adblock/adblocksearchtree.cpp
index 06c5f50fd..232baa796 100644
--- a/src/librssguard/network-web/adblock/adblocksearchtree.cpp
+++ b/src/librssguard/network-web/adblock/adblocksearchtree.cpp
@@ -89,8 +89,7 @@ const AdBlockRule* AdBlockSearchTree::prefixSearch(const QWebEngineUrlRequestInf
return nullptr;
}
- QChar c = choppedUrlString.at(0);
- Node* node = m_root->children.value(c);
+ Node* node = m_root->children.value(choppedUrlString.at(0));
if (node == nullptr) {
return nullptr;
diff --git a/src/librssguard/network-web/adblock/adblocksubscription.cpp b/src/librssguard/network-web/adblock/adblocksubscription.cpp
index 0cdf0feec..6e4c4602e 100644
--- a/src/librssguard/network-web/adblock/adblocksubscription.cpp
+++ b/src/librssguard/network-web/adblock/adblocksubscription.cpp
@@ -62,7 +62,7 @@
#include
#include
-AdBlockSubscription::AdBlockSubscription(QString title, QObject* parent)
+AdBlockSubscription::AdBlockSubscription(QString title, QObject* parent)
: QObject(parent), m_reply(nullptr), m_title(std::move(title)), m_updated(false) {}
QString AdBlockSubscription::title() const {
@@ -290,11 +290,11 @@ void AdBlockCustomList::loadSubscription(const QStringList& disabledRules) {
stream.setCodec("UTF-8");
if (!rules.contains(ddg1 + QL1S("\n"))) {
- stream << ddg1 << endl;
+ stream << ddg1 << Qt::endl;
}
if (!rules.contains(QL1S("\n") + ddg2)) {
- stream << ddg2 << endl;
+ stream << ddg2 << Qt::endl;
}
}
@@ -313,12 +313,12 @@ void AdBlockCustomList::saveSubscription() {
QTextStream textStream(&file);
textStream.setCodec("UTF-8");
- textStream << "Title: " << title() << endl;
- textStream << "Url: " << url().toString() << endl;
- textStream << "[Adblock Plus 1.1.1]" << endl;
+ textStream << "Title: " << title() << Qt::endl;
+ textStream << "Url: " << url().toString() << Qt::endl;
+ textStream << "[Adblock Plus 1.1.1]" << Qt::endl;
for (const AdBlockRule* rule : m_rules) {
- textStream << rule->filter() << endl;
+ textStream << rule->filter() << Qt::endl;
}
file.close();
diff --git a/src/librssguard/network-web/downloader.cpp b/src/librssguard/network-web/downloader.cpp
index c6650e92c..d7ca09056 100644
--- a/src/librssguard/network-web/downloader.cpp
+++ b/src/librssguard/network-web/downloader.cpp
@@ -181,7 +181,13 @@ QList Downloader::decodeMultipartAnswer(QNetworkReply* reply) {
QString content_type = reply->header(QNetworkRequest::KnownHeaders::ContentTypeHeader).toString();
QString boundary = content_type.mid(content_type.indexOf(QL1S("boundary=")) + 9);
QRegularExpression regex(QL1S("--") + boundary + QL1S("(--)?(\\r\\n)?"));
- QStringList list = QString::fromUtf8(data).split(regex, QString::SplitBehavior::SkipEmptyParts);
+ QStringList list = QString::fromUtf8(data).split(regex,
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts);
+#else
+ QString::SkipEmptyParts);
+#endif
+
QList parts;
parts.reserve(list.size());
@@ -197,7 +203,12 @@ QList Downloader::decodeMultipartAnswer(QNetworkReply* reply) {
start_of_body - start_of_headers).replace(QRegularExpression(QSL("[\\n\\r]+")),
QSL("\n"));
- for (const QString& header_line : headers.split(QL1C('\n'), QString::SplitBehavior::SkipEmptyParts)) {
+ for (const QString& header_line : headers.split(QL1C('\n'),
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ Qt::SplitBehaviorFlags::SkipEmptyParts)) {
+#else
+ QString::SkipEmptyParts)) {
+#endif
int index_colon = header_line.indexOf(QL1C(':'));
if (index_colon > 0) {
diff --git a/src/librssguard/network-web/downloadmanager.cpp b/src/librssguard/network-web/downloadmanager.cpp
index b18dabf59..d5ffe04d0 100644
--- a/src/librssguard/network-web/downloadmanager.cpp
+++ b/src/librssguard/network-web/downloadmanager.cpp
@@ -55,7 +55,13 @@ void DownloadItem::init() {
m_reply->setParent(this);
connect(m_reply, &QNetworkReply::readyRead, this, &DownloadItem::downloadReadyRead);
+
+#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
+ connect(m_reply, &QNetworkReply::errorOccurred, this, &DownloadItem::error);
+#else
connect(m_reply, static_cast(&QNetworkReply::error), this, &DownloadItem::error);
+#endif
+
connect(m_reply, &QNetworkReply::downloadProgress, this, &DownloadItem::downloadProgress);
connect(m_reply, &QNetworkReply::metaDataChanged, this, &DownloadItem::metaDataChanged);
connect(m_reply, &QNetworkReply::finished, this, &DownloadItem::finished);
diff --git a/src/librssguard/network-web/webfactory.cpp b/src/librssguard/network-web/webfactory.cpp
index 766c79a13..5dd612b58 100644
--- a/src/librssguard/network-web/webfactory.cpp
+++ b/src/librssguard/network-web/webfactory.cpp
@@ -33,8 +33,7 @@ bool WebFactory::sendMessageViaEmail(const Message& message) {
const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString();
const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString();
- return QProcess::startDetached(QString("\"") + browser + QSL("\" ") + arguments.arg(message.m_title,
- stripTags(message.m_contents)));
+ return IOFactory::startProcessDetached(browser, {}, arguments.arg(message.m_title, stripTags(message.m_contents)));
}
else {
// Send it via mailto protocol.
@@ -49,10 +48,11 @@ bool WebFactory::openUrlInExternalBrowser(const QString& url) const {
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool()) {
const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString();
const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString();
- const QString call_line = "\"" + browser + "\" \"" + arguments.arg(url) + "\"";
+ auto nice_args = arguments.arg(url);
- qDebug("Running command '%s'.", qPrintable(call_line));
- const bool result = QProcess::startDetached(call_line);
+ qDebug("Arguments for external browser: '%s'.", qPrintable(nice_args));
+
+ const bool result = IOFactory::startProcessDetached(browser, {}, nice_args);
if (!result) {
qDebug("External web browser call failed.");
@@ -75,7 +75,6 @@ QString WebFactory::escapeHtml(const QString& html) {
}
QString output = html;
-
QMapIterator i(m_escapes);
while (i.hasNext()) {
@@ -92,7 +91,6 @@ QString WebFactory::deEscapeHtml(const QString& text) {
}
QString output = text;
-
QMapIterator i(m_deEscapes);
while (i.hasNext()) {
@@ -174,6 +172,7 @@ void WebFactory::createMenu(QMenu* menu) {
menu->clear();
QList actions;
+
actions << createEngineSettingsAction(tr("Auto-load images"), QWebEngineSettings::AutoLoadImages);
actions << createEngineSettingsAction(tr("JS enabled"), QWebEngineSettings::JavascriptEnabled);
actions << createEngineSettingsAction(tr("JS can open popup windows"), QWebEngineSettings::JavascriptCanOpenWindows);
@@ -204,6 +203,7 @@ void WebFactory::webEngineSettingChanged(bool enabled) {
const QAction* const act = qobject_cast(sender());
QWebEngineSettings::WebAttribute attribute = static_cast(act->data().toInt());
+
qApp->settings()->setValue(WebEngineAttributes::ID, QString::number(static_cast(attribute)), enabled);
QWebEngineProfile::defaultProfile()->settings()->setAttribute(attribute, act->isChecked());
}
diff --git a/src/librssguard/services/abstract/accountcheckmodel.cpp b/src/librssguard/services/abstract/accountcheckmodel.cpp
index 928368976..b686a44c2 100644
--- a/src/librssguard/services/abstract/accountcheckmodel.cpp
+++ b/src/librssguard/services/abstract/accountcheckmodel.cpp
@@ -33,6 +33,7 @@ void AccountCheckModel::setRootItem(RootItem* root_item, bool delete_previous_ro
m_rootItem->deleteLater();
}
+ m_checkStates.clear();
m_rootItem = root_item;
if (with_layout_change) {
@@ -172,7 +173,7 @@ QVariant AccountCheckModel::data(const QModelIndex& index, int role) const {
else if (role == Qt::DecorationRole) {
auto ic = item->icon();
- return ic.isNull() ? QVariant() : ic;
+ return item->data(0, Qt::ItemDataRole::DecorationRole);
}
else if (role == Qt::EditRole) {
return QVariant::fromValue(item);
@@ -206,6 +207,7 @@ bool AccountCheckModel::setData(const QModelIndex& index, const QVariant& value,
// Change data for the actual item.
m_checkStates[item] = static_cast(value.toInt());
emit dataChanged(index, index);
+ emit checkStateChanged(item, m_checkStates[item]);
if (m_recursiveChange) {
return true;
diff --git a/src/librssguard/services/abstract/accountcheckmodel.h b/src/librssguard/services/abstract/accountcheckmodel.h
index c0444461e..f11e027bd 100644
--- a/src/librssguard/services/abstract/accountcheckmodel.h
+++ b/src/librssguard/services/abstract/accountcheckmodel.h
@@ -43,6 +43,9 @@ class AccountCheckModel : public QAbstractItemModel {
void checkAllItems();
void uncheckAllItems();
+ signals:
+ void checkStateChanged(RootItem* item, Qt::CheckState);
+
protected:
RootItem* m_rootItem;
diff --git a/src/librssguard/services/inoreader/network/inoreadernetworkfactory.cpp b/src/librssguard/services/inoreader/network/inoreadernetworkfactory.cpp
index c16d88e5c..b98af5297 100644
--- a/src/librssguard/services/inoreader/network/inoreadernetworkfactory.cpp
+++ b/src/librssguard/services/inoreader/network/inoreadernetworkfactory.cpp
@@ -394,9 +394,9 @@ RootItem* InoreaderNetworkFactory::decodeFeedCategoriesData(const QString& categ
QString title = subscription["title"].toString();
QString url = subscription["htmlUrl"].toString();
QString parent_label;
- QJsonArray categories = subscription["categories"].toArray();
+ QJsonArray assigned_categories = subscription["categories"].toArray();
- for (const QJsonValue& cat : categories) {
+ for (const QJsonValue& cat : assigned_categories) {
QString potential_id = cat.toObject()["id"].toString();
if (potential_id.contains(QSL("/label/"))) {
diff --git a/src/librssguard/services/owncloud/owncloudfeed.cpp b/src/librssguard/services/owncloud/owncloudfeed.cpp
index 3805a8b7c..7a9ba9ffe 100644
--- a/src/librssguard/services/owncloud/owncloudfeed.cpp
+++ b/src/librssguard/services/owncloud/owncloudfeed.cpp
@@ -22,6 +22,7 @@ bool OwnCloudFeed::canBeEdited() const {
bool OwnCloudFeed::editViaGui() {
QPointer form_pointer = new FormOwnCloudFeedDetails(serviceRoot(), qApp->mainFormWidget());
+
form_pointer.data()->addEditFeed(this, nullptr);
delete form_pointer.data();
return false;
@@ -79,6 +80,4 @@ QList OwnCloudFeed::obtainNewMessages(bool* error_during_obtaining) {
*error_during_obtaining = false;
return messages.messages();
}
-
- return QList();
}