Skip to content

Commit

Permalink
Notifications on track change, fixes #99
Browse files Browse the repository at this point in the history
  • Loading branch information
kraxarn committed Oct 28, 2021
1 parent 913f40e commit 60c0b42
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 7 deletions.
5 changes: 5 additions & 0 deletions lib/include/lib/settings/general.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@ namespace lib
* ID of last selected device
*/
std::string last_device;

/**
* Show a notification on track change
*/
bool notify_track_change = false;
};
}
}
2 changes: 2 additions & 0 deletions lib/src/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ void settings::from_json(const nlohmann::json &json)
setValue(g, "last_version", general.last_version);
setValue(g, "last_volume", general.last_volume);
setValue(g, "media_controller", general.media_controller);
setValue(g, "notify_track_change", general.notify_track_change);
setValue(g, "playlist_order", general.playlist_order);
setValue(g, "pulse_volume", general.pulse_volume);
setValue(g, "refresh_interval", general.refresh_interval);
Expand Down Expand Up @@ -150,6 +151,7 @@ auto settings::to_json() const -> nlohmann::json
{"last_version", general.last_version},
{"last_volume", general.last_volume},
{"media_controller", general.media_controller},
{"notify_track_change", general.notify_track_change},
{"playlist_order", general.playlist_order},
{"pulse_volume", general.pulse_volume},
{"refresh_interval", general.refresh_interval},
Expand Down
29 changes: 23 additions & 6 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,10 @@ void MainWindow::refresh()

void MainWindow::refreshed(const lib::spt::playback &playback)
{
const auto trackChange = playback.is_playing
&& current.playback.is_playing
&& playback.item.id != current.playback.item.id;

current.playback = playback;

if (!current.playback.item.is_valid())
Expand Down Expand Up @@ -291,15 +295,28 @@ void MainWindow::refreshed(const lib::spt::playback &playback)
}
#endif

if (trayIcon != nullptr && settings.general.tray_album_art)
if (trayIcon != nullptr
&& (settings.general.tray_album_art || settings.general.notify_track_change))
{
HttpUtils::getAlbum(current.playback.item.image, *httpClient,
cache, [this](const QPixmap &image)
HttpUtils::getAlbum(current.playback.item.image, *httpClient, cache,
[this, &currPlaying, trackChange](const QPixmap &image)
{
if (this->trayIcon != nullptr)
if (trayIcon == nullptr)
{
return;
}

if (settings.general.tray_album_art)
{
trayIcon->setPixmap(image);
}

if (settings.general.notify_track_change && trackChange)
{
const auto message = QString::fromStdString(currPlaying.details());
QIcon icon(image);
trayIcon->message(message, icon);
}
});
}
}
Expand Down Expand Up @@ -419,7 +436,7 @@ auto MainWindow::currentTracks() -> std::vector<std::string>
std::vector<std::string> tracks;
tracks.reserve(tracksCount);

for (int i = 0 ; i < tracksCount ; i++)
for (int i = 0; i < tracksCount; i++)
{
auto track = tracksList->topLevelItem(i)->data(0, static_cast<int>(DataRole::Track))
.value<lib::spt::track>();
Expand Down Expand Up @@ -457,7 +474,7 @@ void MainWindow::toggleTrackNumbers(bool enabled)
{
const auto *tracksList = mainContent->getTracksList();

for (int i = 0 ; i < tracksList->topLevelItemCount() ; i++)
for (int i = 0; i < tracksList->topLevelItemCount(); i++)
{
auto *item = tracksList->topLevelItem(i);
item->setText(0, enabled
Expand Down
10 changes: 10 additions & 0 deletions src/settingspage/interfacepage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,12 @@ auto InterfacePage::trayIcon() -> QWidget *
itfTrayAlbum->setChecked(settings.general.tray_album_art);
content->addWidget(itfTrayAlbum);

// Notify on track change
itfNotifyTrack = new QCheckBox("Show notification on track change", this);
itfNotifyTrack->setToolTip("Show desktop notification when a new track starts playing");
itfNotifyTrack->setChecked(settings.general.notify_track_change);
content->addWidget(itfNotifyTrack);

return WidgetUtils::layoutToWidget(content, this);
}

Expand Down Expand Up @@ -252,6 +258,10 @@ auto InterfacePage::save() -> bool
{
settings.general.tray_album_art = itfTrayAlbum->isChecked();
}
if (itfNotifyTrack != nullptr)
{
settings.general.notify_track_change = itfNotifyTrack->isChecked();
}

// Qt specific
auto &qtSettings = settings.qt();
Expand Down
1 change: 1 addition & 0 deletions src/settingspage/interfacepage.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ Q_OBJECT
QCheckBox *itfTrayAlbum = nullptr;
QCheckBox *itfTrayIcon = nullptr;
QCheckBox *itfTrayInvert = nullptr;
QCheckBox *itfNotifyTrack = nullptr;

auto general() -> QWidget *;
auto appearance() -> QWidget *;
Expand Down
12 changes: 11 additions & 1 deletion src/view/trayicon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,22 @@ void TrayIcon::message(const QString &message)
showMessage("spotify-qt", message);
}

void TrayIcon::message(const QString &message, const QIcon &icon)
{
if (message.isNull() || message.isEmpty())
{
return;
}

showMessage("spotify-qt", message, icon, messageIconTimeout);
}

auto TrayIcon::playback() -> lib::spt::playback
{
auto *mainWindow = dynamic_cast<MainWindow *>(this->parent());
if (mainWindow == nullptr)
{
return lib::spt::playback();
return {};
}
return mainWindow->currentPlayback();
}
Expand Down
8 changes: 8 additions & 0 deletions src/view/trayicon.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,18 @@ Q_OBJECT
~TrayIcon() override;

void message(const QString &message);
void message(const QString &message, const QIcon &icon);

void setPixmap(const QPixmap &pixmap);
void setDefaultPixmap();

private:
/**
* How long in milliseconds to show notifications with icons,
* for example when notifying about track changes
*/
static constexpr int messageIconTimeout = 6000;

auto playback() -> lib::spt::playback;

QMenu *contextMenu;
Expand Down

0 comments on commit 60c0b42

Please sign in to comment.