1 #include "statusbarlabel.h"
2 
3 #include <QDebug>
4 #include <QRegularExpression>
5 #include <QMenu>
6 #include <QAction>
7 #include <QClipboard>
8 #include <QApplication>
9 #include <QDesktopServices>
10 
StatusBarLabel(QWidget * parent)11 StatusBarLabel::StatusBarLabel(QWidget *parent) : QLabel(parent) {
12   on_playerStopped();
13   setContextMenuPolicy(Qt::CustomContextMenu);
14   connect(this, &QLabel::customContextMenuRequested, this, &StatusBarLabel::on_contextMenu);
15 }
16 
on_playerStopped()17 void StatusBarLabel::on_playerStopped() {
18   _state = tr("Stopped");
19   _stream_buffer = 0;
20   setText(_state);
21 }
22 
on_playerStarted(const Track & track)23 void StatusBarLabel::on_playerStarted(const Track &track) {
24   _state = tr("Playing");
25   auto t = _state + trackInfo(track);
26   _stream_buffer = 0;
27   setText(t);
28 }
29 
on_playerPaused(const Track & track)30 void StatusBarLabel::on_playerPaused(const Track &track) {
31   _state = tr("Paused");
32   auto t = _state + trackInfo(track);
33   setText(t);
34 }
35 
on_streamBufferFill(const Track & track,quint32 bytes)36 void StatusBarLabel::on_streamBufferFill(const Track &track, quint32 bytes) {
37   _stream_buffer = bytes;
38   if (_state != tr("Stopped")) {
39     setText(_state + trackInfo(track));
40   }
41 }
42 
on_progress(const Track & track,int current_seconds)43 void StatusBarLabel::on_progress(const Track &track, int current_seconds) {
44   Q_UNUSED(current_seconds)
45   setText(_state + trackInfo(track));
46 }
47 
mouseDoubleClickEvent(QMouseEvent * event)48 void StatusBarLabel::mouseDoubleClickEvent(QMouseEvent *event) {
49   Q_UNUSED(event)
50   emit doubleclicked();
51   QLabel::mouseDoubleClickEvent(event);
52 }
53 
on_contextMenu(const QPoint & pos)54 void StatusBarLabel::on_contextMenu(const QPoint &pos) {
55   QMenu menu;
56   QAction copy_name(tr("Copy"));
57   connect(&copy_name, &QAction::triggered, [=]() {
58      qApp->clipboard()->setText(trackTitle());
59   });
60   QAction show_log(tr("Show playback log"));
61   connect(&show_log, &QAction::triggered, this, &StatusBarLabel::showPlaybackLog);
62   QAction jump_to(tr("Jump to playing track"));
63   connect(&jump_to, &QAction::triggered, this, &StatusBarLabel::doubleclicked);
64   QAction search(tr("Search on web"));
65   connect(&search, &QAction::triggered, [=]() {
66     auto term = QString("https://duckduckgo.com/?q=%1").arg(QString(QUrl::toPercentEncoding(trackTitle())));
67     QDesktopServices::openUrl(QUrl(term));
68   });
69 
70   menu.addAction(&jump_to);
71   menu.addSeparator();
72   menu.addAction(&copy_name);
73   menu.addAction(&search);
74   menu.addAction(&show_log);
75   menu.exec(mapToGlobal(pos));
76 }
77 
trackInfo(const Track & t) const78 QString StatusBarLabel::trackInfo(const Track &t) const {
79   auto c = ": " + t.shortText() + " | " + t.formattedAudioInfo();
80   if (_stream_buffer > 0) {
81     c += QString(" | %1 %2").arg(tr("stream buffer")).arg(humanized_bytes(_stream_buffer));
82   }
83   return c;
84 }
85 
humanized_bytes(quint32 bytes) const86 QString StatusBarLabel::humanized_bytes(quint32 bytes) const {
87     QStringList list;
88     list << tr("KB") << tr("MB") << tr("GB") << tr("TB");
89 
90     QStringListIterator i(list);
91     QString unit(tr("bytes"));
92 
93     while(bytes >= 1024 && i.hasNext()) {
94       unit = i.next();
95       bytes /= 1024;
96     }
97     return QString().setNum(bytes, 10) + " " + unit;
98 }
99 
trackTitle() const100 QString StatusBarLabel::trackTitle() const {
101   return text().split("|").first().replace(_state + ": ", "");
102 }
103