diff --git a/src/librssguard/database/databasequeries.cpp b/src/librssguard/database/databasequeries.cpp index 4a824f30f..839bdd35c 100644 --- a/src/librssguard/database/databasequeries.cpp +++ b/src/librssguard/database/databasequeries.cpp @@ -1857,6 +1857,38 @@ bool DatabaseQueries::cleanLabelledMessages(const QSqlDatabase& db, bool clean_r } } +void DatabaseQueries::cleanProbedMessages(const QSqlDatabase& db, bool clean_read_only, Search* probe) { + QSqlQuery q(db); + + q.setForwardOnly(true); + + if (clean_read_only) { + q.prepare(QSL("UPDATE Messages SET is_deleted = :deleted " + "WHERE " + " is_deleted = 0 AND " + " is_pdeleted = 0 AND " + " is_read = 1 AND " + " account_id = :account_id AND " + " (title REGEXP :fltr OR contents REGEXP :fltr);")); + } + else { + q.prepare(QSL("UPDATE Messages SET is_deleted = :deleted " + "WHERE " + " is_deleted = 0 AND " + " is_pdeleted = 0 AND " + " account_id = :account_id AND " + " (title REGEXP :fltr OR contents REGEXP :fltr);")); + } + + q.bindValue(QSL(":deleted"), 1); + q.bindValue(QSL(":account_id"), probe->getParentServiceRoot()->accountId()); + q.bindValue(QSL(":fltr"), probe->filter()); + + if (!q.exec()) { + throw ApplicationException(q.lastError().text()); + } +} + bool DatabaseQueries::cleanImportantMessages(const QSqlDatabase& db, bool clean_read_only, int account_id) { QSqlQuery q(db); diff --git a/src/librssguard/database/databasequeries.h b/src/librssguard/database/databasequeries.h index 72725bc9b..3a6559c9b 100644 --- a/src/librssguard/database/databasequeries.h +++ b/src/librssguard/database/databasequeries.h @@ -173,6 +173,7 @@ class DatabaseQueries { bool delete_messages_too, bool delete_labels_too); static bool cleanLabelledMessages(const QSqlDatabase& db, bool clean_read_only, Label* label); + static void cleanProbedMessages(const QSqlDatabase& db, bool clean_read_only, Search* probe); static bool cleanImportantMessages(const QSqlDatabase& db, bool clean_read_only, int account_id); static bool cleanUnreadMessages(const QSqlDatabase& db, int account_id); static bool cleanFeeds(const QSqlDatabase& db, const QStringList& ids, bool clean_read_only, int account_id); diff --git a/src/librssguard/gui/reusable/helpspoiler.cpp b/src/librssguard/gui/reusable/helpspoiler.cpp index 1f40f1f74..d93184a8f 100644 --- a/src/librssguard/gui/reusable/helpspoiler.cpp +++ b/src/librssguard/gui/reusable/helpspoiler.cpp @@ -7,19 +7,19 @@ #include "gui/reusable/plaintoolbutton.h" #include "miscellaneous/application.h" #include "miscellaneous/iconfactory.h" +#include "network-web/webfactory.h" #include #include #include #include -#include +#include #include HelpSpoiler::HelpSpoiler(QWidget* parent) : QWidget(parent), m_btnToggle(new QToolButton(this)), m_content(new QScrollArea(this)), - m_animation(new QParallelAnimationGroup(this)), m_layout(new QGridLayout(this)), m_text(new QTextEdit(this)), + m_animation(new QParallelAnimationGroup(this)), m_layout(new QGridLayout(this)), m_text(new QTextBrowser(this)), m_btnHelp(new PlainToolButton(this)) { - m_btnToggle->setStyleSheet(QSL("QToolButton { border: none; }")); m_btnToggle->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextBesideIcon); m_btnToggle->setArrowType(Qt::ArrowType::RightArrow); @@ -47,7 +47,9 @@ HelpSpoiler::HelpSpoiler(QWidget* parent) m_layout->addWidget(m_btnToggle, 0, 1, 1, 1, Qt::AlignmentFlag::AlignLeft); m_layout->addWidget(m_content, 1, 0, 1, 2); - QObject::connect(m_btnToggle, &QToolButton::clicked, [this](const bool checked) { + connect(m_text, &QTextBrowser::anchorClicked, this, &HelpSpoiler::onAnchorClicked); + + connect(m_btnToggle, &QToolButton::clicked, [this](const bool checked) { const auto collapsed_height = m_btnHelp->height(); auto content_height = m_text->document()->size().height() + 22; @@ -74,7 +76,8 @@ HelpSpoiler::HelpSpoiler(QWidget* parent) m_text->viewport()->setAutoFillBackground(false); m_text->setFrameShape(QFrame::Shape::NoFrame); - m_text->setTextInteractionFlags(Qt::TextInteractionFlag::TextBrowserInteraction); + m_text->setOpenLinks(false); + m_text->setOpenExternalLinks(false); m_text->setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff); m_text->setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff); m_text->setWordWrapMode(QTextOption::WrapMode::WordWrap); @@ -102,3 +105,7 @@ void HelpSpoiler::setHelpText(const QString& text, bool is_warning, bool force_h m_text->document()->setDocumentMargin(0); } + +void HelpSpoiler::onAnchorClicked(const QUrl& url) { + qApp->web()->openUrlInExternalBrowser(url.toString()); +} diff --git a/src/librssguard/gui/reusable/helpspoiler.h b/src/librssguard/gui/reusable/helpspoiler.h index a11e62160..d8085704c 100644 --- a/src/librssguard/gui/reusable/helpspoiler.h +++ b/src/librssguard/gui/reusable/helpspoiler.h @@ -5,7 +5,7 @@ #include -class QTextEdit; +class QTextBrowser; class QGridLayout; class QToolButton; class QParallelAnimationGroup; @@ -21,12 +21,15 @@ class HelpSpoiler : public QWidget { void setHelpText(const QString& title, const QString& text, bool is_warning, bool force_html = false); void setHelpText(const QString& text, bool is_warning, bool force_html = false); + private slots: + void onAnchorClicked(const QUrl& url); + private: QToolButton* m_btnToggle; QScrollArea* m_content; QParallelAnimationGroup* m_animation; QGridLayout* m_layout; - QTextEdit* m_text; + QTextBrowser* m_text; PlainToolButton* m_btnHelp; }; diff --git a/src/librssguard/services/abstract/gui/formaddeditprobe.cpp b/src/librssguard/services/abstract/gui/formaddeditprobe.cpp index bb34644d8..afb0edaed 100755 --- a/src/librssguard/services/abstract/gui/formaddeditprobe.cpp +++ b/src/librssguard/services/abstract/gui/formaddeditprobe.cpp @@ -12,6 +12,14 @@ FormAddEditProbe::FormAddEditProbe(QWidget* parent) : QDialog(parent), m_editabl m_ui.m_txtName->lineEdit()->setPlaceholderText(tr("Name for your query")); m_ui.m_txtFilter->lineEdit()->setPlaceholderText(tr("Regular expression")); + m_ui.m_help->setHelpText( + tr("What is regular expression?"), + tr( + "A regular expression (shortened as regex or regexp) is a sequence of characters that " + R"(specifies a match pattern in text. See more info.)"), + false, + true); + connect(m_ui.m_txtName->lineEdit(), &QLineEdit::textChanged, this, [this](const QString& text) { if (text.isEmpty()) { m_ui.m_txtName->setStatus(LineEditWithStatus::StatusType::Error, tr("Regex query name cannot be empty.")); diff --git a/src/librssguard/services/abstract/gui/formaddeditprobe.ui b/src/librssguard/services/abstract/gui/formaddeditprobe.ui index 5d846e296..22c2a7cf5 100755 --- a/src/librssguard/services/abstract/gui/formaddeditprobe.ui +++ b/src/librssguard/services/abstract/gui/formaddeditprobe.ui @@ -24,7 +24,7 @@ - + Qt::Vertical @@ -37,7 +37,7 @@ - + Qt::Horizontal @@ -47,6 +47,9 @@ + + + @@ -61,6 +64,12 @@
lineeditwithstatus.h
1 + + HelpSpoiler + QWidget +
helpspoiler.h
+ 1 +
m_btnColor diff --git a/src/librssguard/services/abstract/search.cpp b/src/librssguard/services/abstract/search.cpp index 9eba8d8ce..4c645ca5e 100755 --- a/src/librssguard/services/abstract/search.cpp +++ b/src/librssguard/services/abstract/search.cpp @@ -151,18 +151,21 @@ bool Search::cleanMessages(bool clear_only_read) { ServiceRoot* service = getParentServiceRoot(); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); - return false; - /* - if (DatabaseQueries::cleanLabelledMessages(database, clear_only_read, this)) { + try { + DatabaseQueries::cleanProbedMessages(database, clear_only_read, this); service->updateCounts(true); service->itemChanged(service->getSubTree()); service->requestReloadMessageList(true); return true; } - else { + catch (const ApplicationException& ex) { + qCriticalNN << LOGSEC_CORE << "Failed to clean messages of probe:" << QUOTE_W_SPACE_DOT(ex.message()); return false; } - */ +} + +QString Search::additionalTooltip() const { + return tr("Regular expression: %1").arg(QSL("%1").arg(filter())); } bool Search::markAsReadUnread(RootItem::ReadStatus status) { diff --git a/src/librssguard/services/abstract/search.h b/src/librssguard/services/abstract/search.h index d04288603..db9120734 100755 --- a/src/librssguard/services/abstract/search.h +++ b/src/librssguard/services/abstract/search.h @@ -27,6 +27,7 @@ class RSSGUARD_DLLSPEC Search : public RootItem { void setCountOfUnreadMessages(int unreadCount); virtual bool cleanMessages(bool clear_only_read); + virtual QString additionalTooltip() const; virtual bool markAsReadUnread(ReadStatus status); virtual int countOfAllMessages() const; virtual int countOfUnreadMessages() const;