Skip to content

Commit

Permalink
Dialog 'torrent exists' replaced with tray message
Browse files Browse the repository at this point in the history
  • Loading branch information
aitrenkin committed Jul 4, 2021
1 parent 5d03917 commit 952a010
Show file tree
Hide file tree
Showing 4 changed files with 162 additions and 4 deletions.
2 changes: 2 additions & 0 deletions src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ add_library(qbt_gui STATIC
tristatewidget.h
uithememanager.h
utils.h
notificationutils.h
watchedfolderoptionsdialog.h
watchedfoldersmodel.h

Expand Down Expand Up @@ -158,6 +159,7 @@ add_library(qbt_gui STATIC
tristatewidget.cpp
uithememanager.cpp
utils.cpp
notificationutils.cpp
watchedfolderoptionsdialog.cpp
watchedfoldersmodel.cpp

Expand Down
29 changes: 25 additions & 4 deletions src/gui/addnewtorrentdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ bool AddNewTorrentDialog::loadTorrentFile(const QString &torrentPath)

return loadTorrentImpl();
}

#include "notificationutils.h"
bool AddNewTorrentDialog::loadTorrentImpl()
{
m_hasMetadata = true;
Expand All @@ -280,18 +280,39 @@ bool AddNewTorrentDialog::loadTorrentImpl()
{
if (torrent->isPrivate() || m_torrentInfo.isPrivate())
{
RaisedMessageBox::warning(this, tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent.").arg(torrent->name()), QMessageBox::Ok);
if (Utils::Gui::isNotificationsEnabled())
{
Utils::Gui::showNotificationBaloon(tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent.").arg(torrent->name()));
}
else
{
RaisedMessageBox::warning(this, tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent.").arg(torrent->name()), QMessageBox::Ok);
}
}
else
{
torrent->addTrackers(m_torrentInfo.trackers());
torrent->addUrlSeeds(m_torrentInfo.urlSeeds());
RaisedMessageBox::information(this, tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers have been merged.").arg(torrent->name()), QMessageBox::Ok);
if (Utils::Gui::isNotificationsEnabled())
{
Utils::Gui::showNotificationBaloon(tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers have been merged.").arg(torrent->name()));
}
else
{
RaisedMessageBox::information(this, tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers have been merged.").arg(torrent->name()), QMessageBox::Ok);
}
}
}
else
{
RaisedMessageBox::information(this, tr("Torrent is already present"), tr("Torrent is already queued for processing."), QMessageBox::Ok);
if (Utils::Gui::isNotificationsEnabled())
{
Utils::Gui::showNotificationBaloon(tr("Torrent is already present"), tr("Torrent is already queued for processing."));
}
else
{
RaisedMessageBox::information(this, tr("Torrent is already present"), tr("Torrent is already queued for processing."), QMessageBox::Ok);
}
}
return false;
}
Expand Down
95 changes: 95 additions & 0 deletions src/gui/notificationutils.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2017 Mike Tzou
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* In addition, as a special exception, the copyright holders give permission to
* link this program with the OpenSSL project's "OpenSSL" library (or with
* modified versions of it that use the same license as the "OpenSSL" library),
* and distribute the linked executables. You must obey the GNU General Public
* License in all respects for all of the code used other than "OpenSSL". If you
* modify file(s), you may extend this exception to your version of the file(s),
* but you are not obligated to do so. If you do not wish to do so, delete this
* exception statement from your version.
*/

#include "notificationutils.h"
#include "base/settingsstorage.h"
#if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) && defined(QT_DBUS_LIB)
#include <QDBusConnection>
#include "qtnotify/notifications.h"
#endif
namespace Utils
{
namespace Gui
{
#define SETTINGS_KEY(name) "GUI/" name
// Notifications properties keys
#define NOTIFICATIONS_SETTINGS_KEY(name) QStringLiteral(SETTINGS_KEY("Notifications/") name)
const QString KEY_NOTIFICATIONS_ENABLED = NOTIFICATIONS_SETTINGS_KEY("Enabled");
const QString KEY_NOTIFICATIONS_TORRENTADDED = NOTIFICATIONS_SETTINGS_KEY("TorrentAdded");
#if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) && defined(QT_DBUS_LIB)
const QString KEY_NOTIFICATION_TIMEOUT = NOTIFICATIONS_SETTINGS_KEY("Timeout");
#endif
//
inline SettingsStorage *settings()
{
return SettingsStorage::instance();
}
bool isNotificationsEnabled()
{
return settings()->loadValue(KEY_NOTIFICATIONS_ENABLED, true);
}
int getNotificationTimeout()
{
return settings()->loadValue(KEY_NOTIFICATION_TIMEOUT, -1);
}
}
}
bool Utils::Gui::showNotificationBaloon(const QString& title, const QString& msg)
{
if (!isNotificationsEnabled())
return false;

#if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) && defined(QT_DBUS_LIB)
OrgFreedesktopNotificationsInterface notifications(QLatin1String("org.freedesktop.Notifications")
, QLatin1String("/org/freedesktop/Notifications")
, QDBusConnection::sessionBus());

// Testing for 'notifications.isValid()' isn't helpful here.
// If the notification daemon is configured to run 'as needed'
// the above check can be false if the daemon wasn't started
// by another application. In this case DBus will be able to
// start the notification daemon and complete our request. Such
// a daemon is xfce4-notifyd, DBus autostarts it and after
// some inactivity shuts it down. Other DEs, like GNOME, choose
// to start their daemons at the session startup and have it sit
// idling for the whole session.
const QVariantMap hints {{QLatin1String("desktop-entry"), QLatin1String("org.qbittorrent.qBittorrent")}};
QDBusPendingReply<uint> reply = notifications.Notify(QLatin1String("qBittorrent"), 0
, QLatin1String("qbittorrent"), title, msg, {}, hints, getNotificationTimeout());

reply.waitForFinished();
if (reply.isError())
return false;
#elif defined(Q_OS_MACOS)
MacUtils::displayNotification(title, msg);
#else
if (m_systrayIcon && QSystemTrayIcon::supportsMessages())
m_systrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON);
#endif
return true;
}
40 changes: 40 additions & 0 deletions src/gui/notificationutils.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2017 Mike Tzou
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* In addition, as a special exception, the copyright holders give permission to
* link this program with the OpenSSL project's "OpenSSL" library (or with
* modified versions of it that use the same license as the "OpenSSL" library),
* and distribute the linked executables. You must obey the GNU General Public
* License in all respects for all of the code used other than "OpenSSL". If you
* modify file(s), you may extend this exception to your version of the file(s),
* but you are not obligated to do so. If you do not wish to do so, delete this
* exception statement from your version.
*/

#pragma once

#include <QString>

namespace Utils
{
namespace Gui
{
bool isNotificationsEnabled();
bool showNotificationBaloon(const QString &title, const QString &msg);
}
}

0 comments on commit 952a010

Please sign in to comment.