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(©_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(©_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