PonyPlayer
wave.hpp
浏览该文件的文档.
1#pragma once
2
3#include <QtCore>
4#include "lyrics.h"
5#include "hurricane.hpp"
6#include <QFileInfo>
7#include <QQmlContext>
8#include <QtQuick/QQuickItem>
9#include <QQmlApplicationEngine>
10
11class WaveView : public QQuickItem {
12Q_OBJECT
13 Q_PROPERTY(float radiusRatio READ getRadiusRatio WRITE setRadiusRatio NOTIFY notifyRadiusRatio)
14 Q_PROPERTY(QString player READ getPlayer WRITE setPlayer)
15 Q_PROPERTY(QString lyricsDataName READ getLyricsDataName WRITE setLyricsDataName)
16 QML_ELEMENT
17private:
18 float m_radiusRatio{};
19 QString m_player, m_lyricsDataName;
20 Hurricane *hurricane = nullptr;
21 LyricsReader *lyricsReader = nullptr;
22 LyricsData *lyricsData = nullptr;
23
24public:
25 explicit WaveView(QQuickItem *parent = nullptr) {
26 lyricsReader = new LyricsReader;
27
28 connect(this, &QQuickItem::windowChanged, [this](QQuickWindow *window) {
29 if (!window) { return; }
30 auto *context = qmlContext(this);
31 while ((!hurricane || !lyricsData) && context) {
32 if (!hurricane) hurricane = reinterpret_cast<Hurricane *>(context->objectForName(m_player));
33 if (!lyricsData) lyricsData = reinterpret_cast<LyricsData *>(context->objectForName(m_lyricsDataName));
34 context = context->parentContext();
35 }
36 if (!hurricane) {
37 throw std::runtime_error("Cannot not get Hurricane by id:" + m_player.toStdString());
38 }
39 if (!lyricsData) {
40 throw std::runtime_error("Cannot not get LyricsData by id:" + m_lyricsDataName.toStdString());
41 }
42 //connect(hurricane, &Hurricane::signalOpenFile, lyricsReader, &LyricsReader::readLyric);
45 connect(this, &WaveView::signalPushLyricSentenceCompleted, lyricsData,
47 connect(this, &WaveView::signalClearLyricSentence, lyricsData,
49
50 });
51 };
52
53 Q_INVOKABLE [[nodiscard]] float getRadiusRatio() const { return m_radiusRatio; };
54
55 [[nodiscard]] const QString &getPlayer() const {
56 return m_player;
57 }
58
59 void setPlayer(const QString &player) {
60 m_player = player;
61 qDebug() << "Set" << player;
62 }
63
64 [[nodiscard]] const QString &getLyricsDataName() const {
65 return m_lyricsDataName;
66 }
67
68 void setLyricsDataName(const QString &lyricsDataName) {
69 m_lyricsDataName = lyricsDataName;
70 qDebug() << "Set" << lyricsDataName;
71 }
72
73public slots:
74 Q_INVOKABLE void setRadiusRatio(float radiusRatio) {
75 m_radiusRatio = radiusRatio; emit notifyRadiusRatio();
76 };
77
78 Q_INVOKABLE void readLyricsResponse(std::shared_ptr<lrc::Lyrics> lyrics) {
79 for (auto it = lyrics->IteratorBegin(); it != lyrics->IteratorEnd(); it++) {
81 new LyricSentence(static_cast<double>(it->start_time) / 1000,
82 static_cast<double>(it->end_time) / 1000,
83 QString(it->lyric.data())));
84
85 }
87 }
88
89 Q_INVOKABLE bool readLyrics(const QString &filePath) {
90 lyricsReader->readLyric(filePath);
91 return true;
92 }
93
94 Q_INVOKABLE bool tryLoadLyrics(const QString &filePath) {
96 QUrl url(filePath);
97 QString lrcPath =
98 QFileInfo(url.toLocalFile()).dir().path() + "/" + QFileInfo(url.toLocalFile()).completeBaseName() +
99 ".lrc";
100 if (QFile(lrcPath).exists()) readLyrics(lrcPath);
101 return true;
102 }
103
104signals:
105
107
109
111
113
114};
播放器 QuickItem 组件,提供暴露给 QML 的接口。
Definition: hurricane.hpp:28
Definition: lyrics.h:9
Definition: lyrics.h:52
void pushLyricSentence(LyricSentence *sentence)
Definition: lyrics.h:97
void pushLyricSentenceCompleted()
Definition: lyrics.h:102
void clearLyricSentence()
Definition: lyrics.h:95
Definition: lyrics.h:107
void readLyric(const QString &url)
Definition: lyrics.cpp:8
void lyricReadCompleted(std::shared_ptr< lrc::Lyrics > response)
Definition: wave.hpp:11
void setLyricsDataName(const QString &lyricsDataName)
Definition: wave.hpp:68
void notifyRadiusRatio()
const QString & getLyricsDataName() const
Definition: wave.hpp:64
Q_INVOKABLE bool tryLoadLyrics(const QString &filePath)
Definition: wave.hpp:94
float radiusRatio
Definition: wave.hpp:13
Q_INVOKABLE void readLyricsResponse(std::shared_ptr< lrc::Lyrics > lyrics)
Definition: wave.hpp:78
WaveView(QQuickItem *parent=nullptr)
Definition: wave.hpp:25
Q_INVOKABLE bool readLyrics(const QString &filePath)
Definition: wave.hpp:89
void signalPushLyricSentenceCompleted()
void setPlayer(const QString &player)
Definition: wave.hpp:59
const QString & getPlayer() const
Definition: wave.hpp:55
void signalClearLyricSentence()
Q_INVOKABLE float getRadiusRatio() const
Definition: wave.hpp:53
void signalPushLyricSentence(LyricSentence *lyricSentence)
QString player
Definition: wave.hpp:14
Q_INVOKABLE void setRadiusRatio(float radiusRatio)
Definition: wave.hpp:74
QString lyricsDataName
Definition: wave.hpp:15