work on notifications

This commit is contained in:
Martin Rotter 2021-06-18 13:42:31 +02:00
parent 48469bb635
commit 50e1d79c42
29 changed files with 157 additions and 97 deletions

View File

@ -30,7 +30,7 @@
<url type="donation">https://martinrotter.github.io/donate/</url> <url type="donation">https://martinrotter.github.io/donate/</url>
<content_rating type="oars-1.1" /> <content_rating type="oars-1.1" />
<releases> <releases>
<release version="3.9.2" date="2021-06-17"/> <release version="3.9.2" date="2021-06-18"/>
</releases> </releases>
<content_rating type="oars-1.0"> <content_rating type="oars-1.0">
<content_attribute id="violence-cartoon">none</content_attribute> <content_attribute id="violence-cartoon">none</content_attribute>

View File

@ -117,10 +117,10 @@ bool FeedsModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int
if (dragged_item_root != target_item_root) { if (dragged_item_root != target_item_root) {
// Transferring of items between different accounts is not possible. // Transferring of items between different accounts is not possible.
qApp->showGuiMessage(tr("Cannot perform drag & drop operation"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot perform drag & drop operation"),
tr("You can't transfer dragged item into different account, this is not supported."), tr("You can't transfer dragged item into different account, this is not supported."),
QSystemTrayIcon::MessageIcon::Warning, QSystemTrayIcon::MessageIcon::Warning,
qApp->mainFormWidget(),
true); true);
qDebugNN << LOGSEC_FEEDMODEL qDebugNN << LOGSEC_FEEDMODEL
<< "Dragged item cannot be dragged into different account. Cancelling drag-drop action."; << "Dragged item cannot be dragged into different account. Cancelling drag-drop action.";

View File

@ -137,10 +137,10 @@ void MessagesModel::loadMessages(RootItem* item) {
qCriticalNN << LOGSEC_MESSAGEMODEL qCriticalNN << LOGSEC_MESSAGEMODEL
<< "Loading of messages from item '" << "Loading of messages from item '"
<< item->title() << "' failed."; << item->title() << "' failed.";
qApp->showGuiMessage(tr("Loading of messages from item '%1' failed.").arg(item->title()), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Loading of messages from item '%1' failed.").arg(item->title()),
tr("Loading of messages failed, maybe messages could not be downloaded."), tr("Loading of messages failed, maybe messages could not be downloaded."),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
qApp->mainFormWidget(),
true); true);
} }
} }

View File

@ -119,9 +119,11 @@ void FormMain::showDbCleanupAssistant() {
qApp->feedReader()->feedsModel()->reloadCountsOfWholeModel(); qApp->feedReader()->feedsModel()->reloadCountsOfWholeModel();
} }
else { else {
qApp->showGuiMessage(tr("Cannot cleanup database"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot cleanup database"),
tr("Cannot cleanup database, because another critical action is running."), tr("Cannot cleanup database, because another critical action is running."),
QSystemTrayIcon::Warning, qApp->mainFormWidget(), true); QSystemTrayIcon::Warning,
true);
} }
} }
@ -465,9 +467,10 @@ void FormMain::switchVisibility(bool force_hide) {
if (SystemTrayIcon::isSystemTrayDesired() && SystemTrayIcon::isSystemTrayAreaAvailable()) { if (SystemTrayIcon::isSystemTrayDesired() && SystemTrayIcon::isSystemTrayAreaAvailable()) {
if (QApplication::activeModalWidget() != nullptr) { if (QApplication::activeModalWidget() != nullptr) {
qApp->showGuiMessage(QSL(APP_LONG_NAME), qApp->showGuiMessage(Notification::Event::GeneralEvent,
QSL(APP_LONG_NAME),
tr("Close opened modal dialogs first."), tr("Close opened modal dialogs first."),
QSystemTrayIcon::Warning, qApp->mainFormWidget(), true); QSystemTrayIcon::Warning, true);
} }
else { else {
hide(); hide();

View File

@ -220,9 +220,12 @@ void FormUpdate::startUpdate() {
if (exec_result <= HINSTANCE(32)) { if (exec_result <= HINSTANCE(32)) {
qDebugNN << LOGSEC_GUI << "External updater was not launched due to error."; qDebugNN << LOGSEC_GUI << "External updater was not launched due to error.";
qApp->showGuiMessage(tr("Cannot update application"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot update application"),
tr("Cannot launch external updater. Update application manually."), tr("Cannot launch external updater. Update application manually."),
QSystemTrayIcon::MessageIcon::Warning, this); QSystemTrayIcon::MessageIcon::Warning,
true,
this);
} }
else { else {
qApp->quit(); qApp->quit();

View File

@ -165,10 +165,11 @@ void FeedsView::addFeedIntoSelectedAccount() {
root->addNewFeed(selected, QGuiApplication::clipboard()->text(QClipboard::Mode::Clipboard)); root->addNewFeed(selected, QGuiApplication::clipboard()->text(QClipboard::Mode::Clipboard));
} }
else { else {
qApp->showGuiMessage(tr("Not supported"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Not supported"),
tr("Selected account does not support adding of new feeds."), tr("Selected account does not support adding of new feeds."),
QSystemTrayIcon::MessageIcon::Warning, QSystemTrayIcon::MessageIcon::Warning,
qApp->mainFormWidget(), true); true);
} }
} }
} }
@ -183,10 +184,11 @@ void FeedsView::addCategoryIntoSelectedAccount() {
root->addNewCategory(selectedItem()); root->addNewCategory(selectedItem());
} }
else { else {
qApp->showGuiMessage(tr("Not supported"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Not supported"),
tr("Selected account does not support adding of new categories."), tr("Selected account does not support adding of new categories."),
QSystemTrayIcon::MessageIcon::Warning, QSystemTrayIcon::MessageIcon::Warning,
qApp->mainFormWidget(), true); true);
} }
} }
} }
@ -246,9 +248,11 @@ void FeedsView::editSelectedItem() {
// Lock was not obtained because // Lock was not obtained because
// it is used probably by feed updater or application // it is used probably by feed updater or application
// is quitting. // is quitting.
qApp->showGuiMessage(tr("Cannot edit item"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot edit item"),
tr("Selected item cannot be edited because another critical operation is ongoing."), tr("Selected item cannot be edited because another critical operation is ongoing."),
QSystemTrayIcon::Warning, qApp->mainFormWidget(), true); QSystemTrayIcon::MessageIcon::Warning,
true);
// Thus, cannot delete and quit the method. // Thus, cannot delete and quit the method.
return; return;
@ -258,10 +262,10 @@ void FeedsView::editSelectedItem() {
selectedItem()->editViaGui(); selectedItem()->editViaGui();
} }
else { else {
qApp->showGuiMessage(tr("Cannot edit item"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot edit item"),
tr("Selected item cannot be edited, this is not (yet?) supported."), tr("Selected item cannot be edited, this is not (yet?) supported."),
QSystemTrayIcon::MessageIcon::Warning, QSystemTrayIcon::MessageIcon::Warning,
qApp->mainFormWidget(),
true); true);
} }
@ -274,9 +278,11 @@ void FeedsView::deleteSelectedItem() {
// Lock was not obtained because // Lock was not obtained because
// it is used probably by feed updater or application // it is used probably by feed updater or application
// is quitting. // is quitting.
qApp->showGuiMessage(tr("Cannot delete item"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot delete item"),
tr("Selected item cannot be deleted because another critical operation is ongoing."), tr("Selected item cannot be deleted because another critical operation is ongoing."),
QSystemTrayIcon::Warning, qApp->mainFormWidget(), true); QSystemTrayIcon::MessageIcon::Warning,
true);
// Thus, cannot delete and quit the method. // Thus, cannot delete and quit the method.
return; return;
@ -307,18 +313,18 @@ void FeedsView::deleteSelectedItem() {
// We have deleteable item selected, remove it via GUI. // We have deleteable item selected, remove it via GUI.
if (!selected_item->deleteViaGui()) { if (!selected_item->deleteViaGui()) {
qApp->showGuiMessage(tr("Cannot delete \"%1\"").arg(selected_item->title()), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot delete \"%1\"").arg(selected_item->title()),
tr("This item cannot be deleted because something critically failed. Submit bug report."), tr("This item cannot be deleted because something critically failed. Submit bug report."),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
qApp->mainFormWidget(),
true); true);
} }
} }
else { else {
qApp->showGuiMessage(tr("Cannot delete \"%1\"").arg(selected_item->title()), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot delete \"%1\"").arg(selected_item->title()),
tr("This item cannot be deleted, because it does not support it\nor this functionality is not implemented yet."), tr("This item cannot be deleted, because it does not support it\nor this functionality is not implemented yet."),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
qApp->mainFormWidget(),
true); true);
} }
} }

View File

@ -617,7 +617,8 @@ void MessagesView::openSelectedMessagesWithExternalTool() {
if (!link.isEmpty()) { if (!link.isEmpty()) {
if (!tool.run(link)) { if (!tool.run(link)) {
qApp->showGuiMessage(tr("Cannot run external tool"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot run external tool"),
tr("External tool '%1' could not be started.").arg(tool.executable()), tr("External tool '%1' could not be started.").arg(tool.executable()),
QSystemTrayIcon::MessageIcon::Critical); QSystemTrayIcon::MessageIcon::Critical);
} }

View File

@ -47,10 +47,10 @@ void NewspaperPreviewer::showMoreMessages() {
m_ui->scrollArea->verticalScrollBar()->setValue(current_scroll); m_ui->scrollArea->verticalScrollBar()->setValue(current_scroll);
} }
else { else {
qApp->showGuiMessage(tr("Cannot show more articles"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot show more articles"),
tr("Cannot show more articles because parent feed was removed."), tr("Cannot show more articles because parent feed was removed."),
QSystemTrayIcon::MessageIcon::Warning, QSystemTrayIcon::MessageIcon::Warning,
qApp->mainForm(),
true); true);
} }
} }

View File

@ -51,10 +51,11 @@ void DiscoverFeedsButton::linkTriggered(QAction* action) {
root->addNewFeed(qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsView()->selectedItem(), url); root->addNewFeed(qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsView()->selectedItem(), url);
} }
else { else {
qApp->showGuiMessage(tr("Not supported"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Not supported"),
tr("Given account does not support adding feeds."), tr("Given account does not support adding feeds."),
QSystemTrayIcon::MessageIcon::Warning, QSystemTrayIcon::MessageIcon::Warning,
qApp->mainFormWidget(), true); true);
} }
} }

View File

@ -52,7 +52,7 @@
<item row="2" column="0" colspan="2"> <item row="2" column="0" colspan="2">
<widget class="QLabel" name="m_lblInfo"> <widget class="QLabel" name="m_lblInfo">
<property name="text"> <property name="text">
<string>You must have &quot;tray icon&quot; activated to have notifications working.</string> <string>You must have &quot;tray icon&quot; activated to have balloon notifications working.</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -17,9 +17,11 @@ TrayIconMenu::TrayIconMenu(const QString& title, QWidget* parent) : QMenu(title,
bool TrayIconMenu::event(QEvent* event) { bool TrayIconMenu::event(QEvent* event) {
if (event->type() == QEvent::Type::Show && Application::activeModalWidget() != nullptr) { if (event->type() == QEvent::Type::Show && Application::activeModalWidget() != nullptr) {
QTimer::singleShot(0, this, &TrayIconMenu::hide); QTimer::singleShot(0, this, &TrayIconMenu::hide);
qApp->showGuiMessage(QSL(APP_LONG_NAME), qApp->showGuiMessage(Notification::Event::GeneralEvent,
QSL(APP_LONG_NAME),
tr("Close opened modal dialogs first."), tr("Close opened modal dialogs first."),
QSystemTrayIcon::Warning, qApp->mainFormWidget(), true); QSystemTrayIcon::Warning,
true);
} }
return QMenu::event(event); return QMenu::event(event);

View File

@ -172,9 +172,11 @@ void Application::showPolls() const {
void Application::offerChanges() const { void Application::offerChanges() const {
if (isFirstRunCurrentVersion()) { if (isFirstRunCurrentVersion()) {
qApp->showGuiMessage(QSL(APP_NAME), QObject::tr("Welcome to %1.\n\nPlease, check NEW stuff included in this\n" qApp->showGuiMessage(Notification::Event::GeneralEvent,
"version by clicking this popup notification.").arg(APP_LONG_NAME), QSL(APP_NAME),
QSystemTrayIcon::MessageIcon::NoIcon, nullptr, false, [] { QObject::tr("Welcome to %1.\n\nPlease, check NEW stuff included in this\n"
"version by clicking this popup notification.").arg(APP_LONG_NAME),
QSystemTrayIcon::MessageIcon::NoIcon, {}, {}, [] {
FormAbout(qApp->mainForm()).exec(); FormAbout(qApp->mainForm()).exec();
}); });
} }
@ -432,15 +434,25 @@ void Application::deleteTrayIcon() {
} }
} }
void Application::showGuiMessage(const QString& title, const QString& message, void Application::showGuiMessage(Notification::Event event, const QString& title,
QSystemTrayIcon::MessageIcon message_type, QWidget* parent, const QString& message, QSystemTrayIcon::MessageIcon message_type, bool show_at_least_msgbox,
bool show_at_least_msgbox, std::function<void()> functor) { QWidget* parent, std::function<void()> functor) {
if (SystemTrayIcon::areNotificationsEnabled() &&
SystemTrayIcon::isSystemTrayDesired() && if (SystemTrayIcon::areNotificationsEnabled()) {
SystemTrayIcon::isSystemTrayAreaAvailable()) { auto notification = m_notifications->notificationForEvent(event);
trayIcon()->showMessage(title, message, message_type, TRAY_ICON_BUBBLE_TIMEOUT, std::move(functor));
notification.playSound(this);
if (SystemTrayIcon::isSystemTrayDesired() &&
SystemTrayIcon::isSystemTrayAreaAvailable() &&
notification.balloonEnabled()) {
trayIcon()->showMessage(title, message, message_type, TRAY_ICON_BUBBLE_TIMEOUT, std::move(functor));
return;
}
} }
else if (show_at_least_msgbox) {
if (show_at_least_msgbox) {
// Tray icon or OSD is not available, display simple text box. // Tray icon or OSD is not available, display simple text box.
MessageBox::show(parent == nullptr ? mainFormWidget() : parent, QMessageBox::Icon(message_type), title, message); MessageBox::show(parent == nullptr ? mainFormWidget() : parent, QMessageBox::Icon(message_type), title, message);
} }
@ -534,8 +546,10 @@ void Application::downloadRequested(QWebEngineDownloadItem* download_item) {
void Application::onFeedUpdatesFinished(const FeedDownloadResults& results) { void Application::onFeedUpdatesFinished(const FeedDownloadResults& results) {
if (!results.updatedFeeds().isEmpty()) { if (!results.updatedFeeds().isEmpty()) {
// Now, inform about results via GUI message/notification. // Now, inform about results via GUI message/notification.
qApp->showGuiMessage(tr("New messages downloaded"), results.overview(10), QSystemTrayIcon::MessageIcon::NoIcon, qApp->showGuiMessage(Notification::Event::NewArticlesFetched,
nullptr, false); tr("New articles fetched"),
results.overview(10),
QSystemTrayIcon::MessageIcon::NoIcon);
} }
} }
@ -602,7 +616,10 @@ void Application::parseCmdArgumentsFromOtherInstance(const QString& message) {
return; return;
} }
else if (cmd_parser.isSet(CLI_IS_RUNNING)) { else if (cmd_parser.isSet(CLI_IS_RUNNING)) {
showGuiMessage(APP_NAME, tr("Application is already running."), QSystemTrayIcon::MessageIcon::Information); showGuiMessage(Notification::Event::GeneralEvent,
APP_NAME,
tr("Application is already running."),
QSystemTrayIcon::MessageIcon::Information);
mainForm()->display(); mainForm()->display();
} }
@ -618,10 +635,10 @@ void Application::parseCmdArgumentsFromOtherInstance(const QString& message) {
rt->addNewFeed(nullptr, msg); rt->addNewFeed(nullptr, msg);
} }
else { else {
showGuiMessage(tr("Cannot add feed"), showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot add feed"),
tr("Feed cannot be added because there is no active account which can add feeds."), tr("Feed cannot be added because there is no active account which can add feeds."),
QSystemTrayIcon::MessageIcon::Warning, QSystemTrayIcon::MessageIcon::Warning,
qApp->mainForm(),
true); true);
} }
} }

View File

@ -10,6 +10,7 @@
#include "miscellaneous/feedreader.h" #include "miscellaneous/feedreader.h"
#include "miscellaneous/iofactory.h" #include "miscellaneous/iofactory.h"
#include "miscellaneous/localization.h" #include "miscellaneous/localization.h"
#include "miscellaneous/notification.h"
#include "miscellaneous/settings.h" #include "miscellaneous/settings.h"
#include "miscellaneous/singleapplication.h" #include "miscellaneous/singleapplication.h"
#include "miscellaneous/skinfactory.h" #include "miscellaneous/skinfactory.h"
@ -110,9 +111,9 @@ class RSSGUARD_DLLSPEC Application : public SingleApplication {
// Displays given simple message in tray icon bubble or OSD // Displays given simple message in tray icon bubble or OSD
// or in message box if tray icon is disabled. // or in message box if tray icon is disabled.
void showGuiMessage(const QString& title, const QString& message, QSystemTrayIcon::MessageIcon message_type, void showGuiMessage(Notification::Event event, const QString& title, const QString& message,
QWidget* parent = nullptr, bool show_at_least_msgbox = false, QSystemTrayIcon::MessageIcon message_type, bool show_at_least_msgbox = false,
std::function<void()> functor = nullptr); QWidget* parent = nullptr, std::function<void()> functor = nullptr);
// Returns pointer to "GOD" application singleton. // Returns pointer to "GOD" application singleton.
static Application* instance(); static Application* instance();

View File

@ -70,10 +70,12 @@ QList<ServiceEntryPoint*> FeedReader::feedServices() {
void FeedReader::updateFeeds(const QList<Feed*>& feeds) { void FeedReader::updateFeeds(const QList<Feed*>& feeds) {
if (!qApp->feedUpdateLock()->tryLock()) { if (!qApp->feedUpdateLock()->tryLock()) {
qApp->showGuiMessage(tr("Cannot update all items"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot update all items"),
tr("You cannot download new messages for your items " tr("You cannot download new messages for your items "
"because another critical operation is ongoing."), "because another critical operation is ongoing."),
QSystemTrayIcon::MessageIcon::Warning, qApp->mainFormWidget(), true); QSystemTrayIcon::MessageIcon::Warning,
true);
return; return;
} }
@ -315,8 +317,9 @@ void FeedReader::executeNextAutoUpdate() {
// NOTE: OSD/bubble informing about performing of scheduled update can be shown now. // NOTE: OSD/bubble informing about performing of scheduled update can be shown now.
if (qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::EnableAutoUpdateNotification)).toBool()) { if (qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::EnableAutoUpdateNotification)).toBool()) {
qApp->showGuiMessage(tr("Starting auto-download of some feeds' messages"), qApp->showGuiMessage(Notification::Event::ArticlesFetchingStarted,
tr("I will auto-download new messages for %n feed(s).", nullptr, feeds_for_update.size()), tr("Starting auto-download of some feeds' articles"),
tr("I will auto-download new articles for %n feed(s).", nullptr, feeds_for_update.size()),
QSystemTrayIcon::MessageIcon::Information); QSystemTrayIcon::MessageIcon::Information);
} }
} }

View File

@ -27,7 +27,9 @@ void Notification::setSoundPath(const QString& sound_path) {
} }
void Notification::playSound(Application* app) const { void Notification::playSound(Application* app) const {
QSound::play(QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath))); if (!m_soundPath.isEmpty()) {
QSound::play(QDir::toNativeSeparators(app->replaceDataUserDataFolderPlaceholder(m_soundPath)));
}
} }
QList<Notification::Event> Notification::allEvents() { QList<Notification::Event> Notification::allEvents() {

View File

@ -14,11 +14,14 @@ class Notification {
// not trigger any notifications. // not trigger any notifications.
NoEvent = 0, NoEvent = 0,
// Used for many events which happen throught application lifecycle.
GeneralEvent = 1,
// New (unread) messages were downloaded for some feed. // New (unread) messages were downloaded for some feed.
NewArticlesFetched = 1, NewArticlesFetched = 2,
// RSS Guard started downloading messages for some feed. // RSS Guard started downloading messages for some feed.
ArticlesFetchingStarted = 2, ArticlesFetchingStarted = 3,
// Login tokens were successfuly refreshed. // Login tokens were successfuly refreshed.
// NOTE: This is primarily used in accounts which use // NOTE: This is primarily used in accounts which use

View File

@ -226,9 +226,10 @@ void SystemFactory::checkForUpdatesOnStartup() {
if (!updates.first.isEmpty() && updates.second == QNetworkReply::NetworkError::NoError && if (!updates.first.isEmpty() && updates.second == QNetworkReply::NetworkError::NoError &&
SystemFactory::isVersionNewer(updates.first.at(0).m_availableVersion, APP_VERSION)) { SystemFactory::isVersionNewer(updates.first.at(0).m_availableVersion, APP_VERSION)) {
qApp->showGuiMessage(QObject::tr("New version available"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
QObject::tr("New version available"),
QObject::tr("Click the bubble for more information."), QObject::tr("Click the bubble for more information."),
QSystemTrayIcon::Information, qApp->mainForm(), false, QSystemTrayIcon::Information, {}, {},
[] { [] {
FormUpdate(qApp->mainForm()).exec(); FormUpdate(qApp->mainForm()).exec();
}); });

View File

@ -118,11 +118,12 @@ void AdBlockManager::load(bool initial_load) {
<< "Failed to write unified filters to file or re-start server, error:" << "Failed to write unified filters to file or re-start server, error:"
<< QUOTE_W_SPACE_DOT(ex.message()); << QUOTE_W_SPACE_DOT(ex.message());
qApp->showGuiMessage(tr("AdBlock needs to be configured"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("AdBlock needs to be configured"),
tr("AdBlock component is not configured properly."), tr("AdBlock component is not configured properly."),
QSystemTrayIcon::MessageIcon::Warning, QSystemTrayIcon::MessageIcon::Warning,
nullptr,
true, true,
{},
[=]() { [=]() {
showDialog(); showDialog();
}); });

View File

@ -194,8 +194,11 @@ void DownloadItem::stop() {
void DownloadItem::openFile() { void DownloadItem::openFile() {
if (!QDesktopServices::openUrl(QUrl::fromLocalFile(m_output.fileName()))) { if (!QDesktopServices::openUrl(QUrl::fromLocalFile(m_output.fileName()))) {
qApp->showGuiMessage(tr("Cannot open file"), tr("Cannot open output file. Open it manually."), qApp->showGuiMessage(Notification::Event::GeneralEvent,
QSystemTrayIcon::Warning, qApp->mainFormWidget(), true); tr("Cannot open file"),
tr("Cannot open output file. Open it manually."),
QSystemTrayIcon::MessageIcon::Warning,
true);
} }
} }
@ -410,12 +413,13 @@ void DownloadItem::finished() {
emit downloadFinished(); emit downloadFinished();
if (downloadedSuccessfully()) { if (downloadedSuccessfully()) {
qApp->showGuiMessage(tr("Download finished"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Download finished"),
tr("File '%1' is downloaded.\nClick here to open parent directory.").arg(QDir::toNativeSeparators( tr("File '%1' is downloaded.\nClick here to open parent directory.").arg(QDir::toNativeSeparators(
m_output.fileName())), m_output.fileName())),
QSystemTrayIcon::MessageIcon::Information, QSystemTrayIcon::MessageIcon::Information,
nullptr, {},
false, {},
[this] { [this] {
openFolder(); openFolder();
}); });

View File

@ -81,10 +81,11 @@ OAuth2Service::~OAuth2Service() {
QString OAuth2Service::bearer() { QString OAuth2Service::bearer() {
if (!isFullyLoggedIn()) { if (!isFullyLoggedIn()) {
qApp->showGuiMessage(tr("You have to login first"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("You have to login first"),
tr("Click here to login."), tr("Click here to login."),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
nullptr, false, {}, {},
[this]() { [this]() {
login(); login();
}); });
@ -188,7 +189,8 @@ void OAuth2Service::refreshAccessToken(const QString& refresh_token) {
real_refresh_token, real_refresh_token,
QSL("refresh_token")); QSL("refresh_token"));
qApp->showGuiMessage(tr("Logging in via OAuth 2.0..."), qApp->showGuiMessage(Notification::Event::LoginDataRefreshed,
tr("Logging in via OAuth 2.0..."),
tr("Refreshing login tokens for '%1'...").arg(m_tokenUrl.toString()), tr("Refreshing login tokens for '%1'...").arg(m_tokenUrl.toString()),
QSystemTrayIcon::MessageIcon::Information); QSystemTrayIcon::MessageIcon::Information);

View File

@ -94,11 +94,12 @@ void FormFeedDetails::acceptIfPossible() {
accept(); accept();
} }
catch (const ApplicationException& ex) { catch (const ApplicationException& ex) {
qApp->showGuiMessage(tr("Error"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Error"),
tr("Cannot save changes: %1").arg(ex.message()), tr("Cannot save changes: %1").arg(ex.message()),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
this, true,
true); this);
} }
} }

View File

@ -67,10 +67,10 @@ void LabelsNode::createLabel() {
} }
} }
else { else {
qApp->showGuiMessage(tr("This account does not allow you to create labels."), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("This account does not allow you to create labels."),
tr("Not allowed"), tr("Not allowed"),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
qApp->mainFormWidget(),
true); true);
} }
} }

View File

@ -419,10 +419,11 @@ QVariantHash GmailNetworkFactory::getProfile(const QNetworkProxy& custom_proxy)
void GmailNetworkFactory::onTokensError(const QString& error, const QString& error_description) { void GmailNetworkFactory::onTokensError(const QString& error, const QString& error_description) {
Q_UNUSED(error) Q_UNUSED(error)
qApp->showGuiMessage(tr("Gmail: authentication error"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Gmail: authentication error"),
tr("Click this to login again. Error is: '%1'").arg(error_description), tr("Click this to login again. Error is: '%1'").arg(error_description),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
nullptr, false, {}, {},
[this]() { [this]() {
m_oauth2->setAccessToken(QString()); m_oauth2->setAccessToken(QString());
m_oauth2->setRefreshToken(QString()); m_oauth2->setRefreshToken(QString());
@ -431,10 +432,11 @@ void GmailNetworkFactory::onTokensError(const QString& error, const QString& err
} }
void GmailNetworkFactory::onAuthFailed() { void GmailNetworkFactory::onAuthFailed() {
qApp->showGuiMessage(tr("Gmail: authorization denied"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Gmail: authorization denied"),
tr("Click this to login again."), tr("Click this to login again."),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
nullptr, false, {}, {},
[this]() { [this]() {
m_oauth2->login(); m_oauth2->login();
}); });

View File

@ -324,10 +324,11 @@ QNetworkReply::NetworkError InoreaderNetworkFactory::markMessagesStarred(RootIte
void InoreaderNetworkFactory::onTokensError(const QString& error, const QString& error_description) { void InoreaderNetworkFactory::onTokensError(const QString& error, const QString& error_description) {
Q_UNUSED(error) Q_UNUSED(error)
qApp->showGuiMessage(tr("Inoreader: authentication error"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Inoreader: authentication error"),
tr("Click this to login again. Error is: '%1'").arg(error_description), tr("Click this to login again. Error is: '%1'").arg(error_description),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
nullptr, false, {}, {},
[this]() { [this]() {
m_oauth2->setAccessToken(QString()); m_oauth2->setAccessToken(QString());
m_oauth2->setRefreshToken(QString()); m_oauth2->setRefreshToken(QString());
@ -336,10 +337,11 @@ void InoreaderNetworkFactory::onTokensError(const QString& error, const QString&
} }
void InoreaderNetworkFactory::onAuthFailed() { void InoreaderNetworkFactory::onAuthFailed() {
qApp->showGuiMessage(tr("Inoreader: authorization denied"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Inoreader: authorization denied"),
tr("Click this to login again."), tr("Click this to login again."),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
nullptr, false, {}, {},
[this]() { [this]() {
m_oauth2->login(); m_oauth2->login();
}); });

View File

@ -39,10 +39,10 @@ bool StandardCategory::performDragDropChange(RootItem* target_item) {
qCriticalNN << LOGSEC_DB qCriticalNN << LOGSEC_DB
<< "Cannot overwrite category:" << "Cannot overwrite category:"
<< QUOTE_W_SPACE_DOT(ex.message()); << QUOTE_W_SPACE_DOT(ex.message());
qApp->showGuiMessage(tr("Error"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Error"),
tr("Cannot save data for category, detailed information was logged via debug log."), tr("Cannot save data for category, detailed information was logged via debug log."),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
nullptr,
true); true);
return false; return false;
} }

View File

@ -211,10 +211,10 @@ void StandardFeed::fetchMetadataForItself() {
qCriticalNN << LOGSEC_DB qCriticalNN << LOGSEC_DB
<< "Cannot overwrite feed:" << "Cannot overwrite feed:"
<< QUOTE_W_SPACE_DOT(ex.message()); << QUOTE_W_SPACE_DOT(ex.message());
qApp->showGuiMessage(tr("Error"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Error"),
tr("Cannot save data for feed: %1").arg(ex.message()), tr("Cannot save data for feed: %1").arg(ex.message()),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
nullptr,
true); true);
} }
} }
@ -476,10 +476,10 @@ bool StandardFeed::performDragDropChange(RootItem* target_item) {
qCriticalNN << LOGSEC_DB qCriticalNN << LOGSEC_DB
<< "Cannot overwrite feed:" << "Cannot overwrite feed:"
<< QUOTE_W_SPACE_DOT(ex.message()); << QUOTE_W_SPACE_DOT(ex.message());
qApp->showGuiMessage(tr("Error"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Error"),
tr("Cannot move feed, detailed information was logged via debug log."), tr("Cannot move feed, detailed information was logged via debug log."),
QSystemTrayIcon::MessageIcon::Critical, QSystemTrayIcon::MessageIcon::Critical,
nullptr,
true); true);
return false; return false;
} }

View File

@ -121,9 +121,11 @@ void StandardServiceRoot::addNewFeed(RootItem* selected_item, const QString& url
// Lock was not obtained because // Lock was not obtained because
// it is used probably by feed updater or application // it is used probably by feed updater or application
// is quitting. // is quitting.
qApp->showGuiMessage(tr("Cannot add item"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot add item"),
tr("Cannot add feed because another critical operation is ongoing."), tr("Cannot add feed because another critical operation is ongoing."),
QSystemTrayIcon::MessageIcon::Warning, qApp->mainFormWidget(), true); QSystemTrayIcon::MessageIcon::Warning,
true);
return; return;
} }
@ -396,9 +398,11 @@ void StandardServiceRoot::addNewCategory(RootItem* selected_item) {
// Lock was not obtained because // Lock was not obtained because
// it is used probably by feed updater or application // it is used probably by feed updater or application
// is quitting. // is quitting.
qApp->showGuiMessage(tr("Cannot add category"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot add category"),
tr("Cannot add category because another critical operation is ongoing."), tr("Cannot add category because another critical operation is ongoing."),
QSystemTrayIcon::Warning, qApp->mainFormWidget(), true); QSystemTrayIcon::Warning,
true);
// Thus, cannot delete and quit the method. // Thus, cannot delete and quit the method.
return; return;

View File

@ -44,7 +44,8 @@ void FormTtRssFeedDetails::apply() {
if (response.code() == STF_INSERTED) { if (response.code() == STF_INSERTED) {
// Feed was added online. // Feed was added online.
qApp->showGuiMessage(tr("Feed added"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Feed added"),
tr("Feed was added, obtaining new tree of feeds now."), tr("Feed was added, obtaining new tree of feeds now."),
QSystemTrayIcon::MessageIcon::Information); QSystemTrayIcon::MessageIcon::Information);
QTimer::singleShot(300, root, &TtRssServiceRoot::syncIn); QTimer::singleShot(300, root, &TtRssServiceRoot::syncIn);

View File

@ -84,10 +84,10 @@ void TtRssServiceRoot::addNewFeed(RootItem* selected_item, const QString& url) {
// Lock was not obtained because // Lock was not obtained because
// it is used probably by feed updater or application // it is used probably by feed updater or application
// is quitting. // is quitting.
qApp->showGuiMessage(tr("Cannot add item"), qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot add item"),
tr("Cannot add feed because another critical operation is ongoing."), tr("Cannot add feed because another critical operation is ongoing."),
QSystemTrayIcon::MessageIcon::Warning, QSystemTrayIcon::MessageIcon::Warning,
qApp->mainFormWidget(),
true); true);
return; return;