TTKMusicPlayer  4.1.3.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicfileinformationwidget.cpp
Go to the documentation of this file.
2 #include "ui_musicfileinformationwidget.h"
3 #include "musicwycoverrequest.h"
4 #include "musicnumberutils.h"
5 #include "musicsongmeta.h"
6 #include "musictoastlabel.h"
7 #include "musicfileutils.h"
8 #include "musicmessagebox.h"
9 #include "musiccoremplayer.h"
10 #include "musicsong.h"
11 
13  : MusicAbstractMoveDialog(parent),
14  m_ui(new Ui::MusicFileInformationWidget),
15  m_deleteImage(false),
16  m_player(nullptr)
17 {
18  m_ui->setupUi(this);
19  setFixedSize(size());
20  setBackgroundLabel(m_ui->background);
21 
22  m_ui->topTitleCloseButton->setIcon(QIcon(":/functions/btn_close_hover"));
23  m_ui->topTitleCloseButton->setStyleSheet(TTK::UI::ToolButtonStyle04);
24  m_ui->topTitleCloseButton->setCursor(QCursor(Qt::PointingHandCursor));
25  m_ui->topTitleCloseButton->setToolTip(tr("Close"));
26  connect(m_ui->topTitleCloseButton, SIGNAL(clicked()), SLOT(close()));
27 
28  setStyleSheet(TTK::UI::LineEditStyle01);
29  setEditLineEnabled(false);
30 
31  const QPixmap pix(":/image/lb_default_art");
32  m_ui->pixmapLabel->setPixmap(pix.scaled(m_ui->pixmapLabel->size()));
33  m_ui->mainViewWidget->setStyleSheet(TTK::UI::TabWidgetStyle01);
34  m_ui->descriptionPlainEdit->setReadOnly(true);
35  m_ui->descriptionPlainEdit->verticalScrollBar()->setStyleSheet(TTK::UI::ScrollBarStyle03);
36 
37  m_ui->editButton->setStyleSheet(TTK::UI::PushButtonStyle04);
38  m_ui->deletePixButton->setStyleSheet(TTK::UI::PushButtonStyle04);
39  m_ui->savePixButton->setStyleSheet(TTK::UI::PushButtonStyle04);
40  m_ui->saveButton->setStyleSheet(TTK::UI::PushButtonStyle04);
41  m_ui->viewButton->setStyleSheet(TTK::UI::PushButtonStyle04);
42  m_ui->openPixButton->setStyleSheet(TTK::UI::PushButtonStyle04);
43  m_ui->dynamicPixButton->setStyleSheet(TTK::UI::PushButtonStyle04);
44 
45 #ifdef Q_OS_UNIX
46  m_ui->editButton->setFocusPolicy(Qt::NoFocus);
47  m_ui->deletePixButton->setFocusPolicy(Qt::NoFocus);
48  m_ui->savePixButton->setFocusPolicy(Qt::NoFocus);
49  m_ui->saveButton->setFocusPolicy(Qt::NoFocus);
50  m_ui->viewButton->setFocusPolicy(Qt::NoFocus);
51  m_ui->openPixButton->setFocusPolicy(Qt::NoFocus);
52  m_ui->dynamicPixButton->setFocusPolicy(Qt::NoFocus);
53 #endif
54 
55  connect(m_ui->editButton, SIGNAL(clicked()), SLOT(editTag()));
56  connect(m_ui->deletePixButton, SIGNAL(clicked()), SLOT(deleteAlbumImage()));
57  connect(m_ui->savePixButton, SIGNAL(clicked()), SLOT(saveAlbumImage()));
58  connect(m_ui->saveButton, SIGNAL(clicked()), SLOT(saveTag()));
59  connect(m_ui->viewButton, SIGNAL(clicked()), SLOT(openFileDir()));
60  connect(m_ui->openPixButton, SIGNAL(clicked()), SLOT(openImageFileDir()));
61  connect(m_ui->dynamicPixButton, SIGNAL(clicked()), SLOT(openDynamicImage()));
62 }
63 
65 {
66  delete m_ui;
67  delete m_player;
68 }
69 
71 {
73  {
74  MusicToastLabel::popup(tr("The file has been moved or does not exist"));
75  }
76 }
77 
78 static void rendererPixmap(Ui::MusicFileInformationWidget *ui, const QPixmap &pixmap)
79 {
80  if(pixmap.isNull())
81  {
82  ui->pixmapWidthLabel->setText(TTK_DEFAULT_STR);
83  ui->pixmapHeightLabel->setText(TTK_DEFAULT_STR);
84  }
85  else
86  {
87  ui->pixmapWidthLabel->setText(QString("%1px").arg(pixmap.width()));
88  ui->pixmapHeightLabel->setText(QString("%1px").arg(pixmap.height()));
89  ui->pixmapLabel->setPixmap(pixmap.scaled(ui->pixmapLabel->size()));
90  }
91 }
92 
94 {
96  if(m_imagePath.isEmpty())
97  {
98  return;
99  }
100 
101  QPixmap pix;
102  pix.load(m_imagePath);
103  rendererPixmap(m_ui, pix);
104 }
105 
107 {
108  m_deleteImage = true;
109  rendererPixmap(m_ui, QPixmap(":/image/lb_default_art"));
110 }
111 
113 {
114  QPixmap pix;
115  MusicSongMeta meta;
116  if(meta.read(m_path))
117  {
118  pix = meta.cover();
119  }
120 
121  if(!pix.isNull())
122  {
123  const QString &path = TTK::File::getSaveFileName(this);
124  if(!path.isEmpty())
125  {
126  pix.save(path);
127  }
128  }
129 }
130 
132 {
133  if(m_ui->dynamicPixButton->text() == tr("Dynamic"))
134  {
135  m_ui->dynamicPixButton->setText(tr("Static"));
136 
138  connect(d, SIGNAL(downLoadDataChanged(QString)), SLOT(downLoadFinished(QString)));
139  d->startToRequest(QFileInfo(m_path).baseName());
140  }
141  else
142  {
143  m_ui->dynamicPixButton->setText(tr("Dynamic"));
144 
145  if(m_player && m_player->isPlaying())
146  {
147  m_player->stop();
148  delete m_player;
149  m_player = nullptr;
150  }
151 
152  MusicSongMeta meta;
153  meta.read(m_path);
154  rendererPixmap(m_ui, meta.cover());
155  }
156 }
157 
159 {
160  if(bytes.isEmpty())
161  {
162  MusicToastLabel::popup(tr("No dynamic cover data"));
163  m_ui->dynamicPixButton->setText(tr("Dynamic"));
164  return;
165  }
166 
167  if(!m_player)
168  {
169  m_player = new MusicCoreMPlayer(this);
170  }
171 
172  m_player->setMedia(MusicCoreMPlayer::Module::Movie, bytes, (int)m_ui->pixmapLabel->winId());
173  m_player->play();
174 }
175 
177 {
178  setEditLineEnabled(!m_ui->fileAlbumEdit->isEnabled());
179 }
180 
182 {
183  MusicMessageBox message;
184  message.setText(tr("Are you sure to save?"));
185  if(!message.exec())
186  {
187  return;
188  }
189 
190  MusicSongMeta meta;
191  if(!meta.read(m_path))
192  {
193  return;
194  }
195 
196  QString value = m_ui->fileAlbumEdit->text().trimmed();
197  if(value != TTK_DEFAULT_STR)
198  {
199  meta.setAlbum(value);
200  }
201 
202  value = m_ui->fileArtistEdit->text().trimmed();
203  if(value != TTK_DEFAULT_STR)
204  {
205  meta.setArtist(value);
206  }
207 
208  value = m_ui->fileGenreEdit->text().trimmed();
209  if(value != TTK_DEFAULT_STR)
210  {
211  meta.setGenre(value);
212  }
213 
214  value = m_ui->fileTitleEdit->text().trimmed();
215  if(value != TTK_DEFAULT_STR)
216  {
217  meta.setTitle(value);
218  }
219 
220  value = m_ui->fileYearEdit->text().trimmed();
221  if(value != TTK_DEFAULT_STR)
222  {
223  meta.setYear(value);
224  }
225 
226  if(m_deleteImage)
227  {
228  meta.setCover(QPixmap());
229  }
230  else if(!m_imagePath.isEmpty())
231  {
232  meta.setCover(QPixmap(m_imagePath));
233  }
234 
235  meta.save();
236  MusicToastLabel::popup(tr("Save successfully"));
237 }
238 
240 {
241  if(name.contains(CACHE_DIR_FULL)) //cache song should not allow open url
242  {
243  m_ui->viewButton->setEnabled(false);
244  }
245 
246  MusicSongMeta meta;
247  const bool state = meta.read(m_path = name);
248  const QFileInfo fin(meta.fileRelatedPath());
249 
250  QString check;
251  m_ui->filePathEdit->setText((check = fin.filePath()).isEmpty() ? TTK_DEFAULT_STR : check);
252  m_ui->fileFormatEdit->setText((check = TTK_FILE_SUFFIX(fin)).isEmpty() ? TTK_DEFAULT_STR : check);
253  m_ui->fileSizeEdit->setText((check = TTK::Number::sizeByteToLabel(fin.size())).isEmpty() ? TTK_DEFAULT_STR : check);
254 
255  m_ui->fileAlbumEdit->setText(state ? ((check = meta.album()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
256  m_ui->fileArtistEdit->setText(state ? ((check = meta.artist()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
257  m_ui->fileGenreEdit->setText(state ? ((check = meta.genre()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
258  m_ui->fileTitleEdit->setText(state ? ((check = meta.title()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
259  m_ui->fileYearEdit->setText(state ? ((check = meta.year()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
260  m_ui->fileTimeEdit->setText(state ? ((check = meta.duration()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
261 
262  const int rating = meta.rating().toInt();
263  if(rating == 0) m_ui->ratingLabel->setValue(0);
264  else if(rating < 64) m_ui->ratingLabel->setValue(1);
265  else if(rating < 128) m_ui->ratingLabel->setValue(2);
266  else if(rating < 196) m_ui->ratingLabel->setValue(3);
267  else if(rating < 255) m_ui->ratingLabel->setValue(4);
268  else m_ui->ratingLabel->setValue(5);
269 
270  m_ui->bitrateEdit->setText(state ? ((check = (meta.bitrate())).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
271  m_ui->channelEdit->setText(state ? ((check = meta.channel()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
272  m_ui->sampleRateEdit->setText(state ? ((check = meta.sampleRate()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
273  m_ui->trackNumEdit->setText(state ? ((check = meta.trackNum()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
274 
275  QColor color;
276  QString bitrate;
277  TTK::Number::bitrateToQuality(TTK::Number::bitrateToLevel(m_ui->bitrateEdit->text()), bitrate, color);
278  m_ui->qualityEdit->setText(bitrate);
279 
280  m_ui->descriptionPlainEdit->setPlainText(meta.description());
281 
282  rendererPixmap(m_ui, meta.cover());
283 }
284 
286 {
287  m_ui->fileAlbumEdit->setEnabled(enabled);
288  m_ui->fileArtistEdit->setEnabled(enabled);
289  m_ui->fileGenreEdit->setEnabled(enabled);
290  m_ui->fileTitleEdit->setEnabled(enabled);
291  m_ui->fileYearEdit->setEnabled(enabled);
292 
293  m_ui->openPixButton->setEnabled(enabled);
294  m_ui->deletePixButton->setEnabled(enabled);
295  m_ui->saveButton->setEnabled(enabled);
296 }
void setBackgroundLabel(QLabel *label)
MusicFileInformationWidget(QWidget *parent=nullptr)
bool read(const QString &url)
QString genre() noexcept
bool isPlaying() const
QString sampleRate() noexcept
QString title() noexcept
#define CACHE_DIR_FULL
Definition: musicobject.h:132
void setMedia(Module type, const QString &url, int winId=-1)
void setGenre(const QString &genre) noexcept
void setText(const QString &text) const
QString artist() noexcept
#define TTK_DEFAULT_STR
Definition: ttkglobal.h:203
TTK_MODULE_EXPORT QString trackRelatedPath(const QString &path)
Definition: musicsong.cpp:100
static void rendererPixmap(Ui::MusicFileInformationWidget *ui, const QPixmap &pixmap)
voidpf void uLong size
Definition: ioapi.h:136
The class of the wangyi dynamic cover data download request.
TTK_MODULE_EXPORT QString getOpenFileName(QWidget *parent, const QString &filter="Image Files (*.png *.bmp *.jpg)")
The class of the messagebox widget.
void initialize(const QString &name)
TTK_MODULE_EXPORT QString sizeByteToLabel(qint64 size)
QString bitrate() noexcept
static void popup(const QString &text)
void setYear(const QString &year) noexcept
TTK_MODULE_EXPORT QString getSaveFileName(QWidget *parent, const QString &filter="Image Files (*.png *.bmp *.jpg)")
static const QString ScrollBarStyle03
void setTitle(const QString &title) noexcept
Ui::MusicFileInformationWidget * m_ui
const char * name
Definition: http_parser.c:458
QString album() noexcept
TTK_MODULE_EXPORT TTK::QueryQuality bitrateToLevel(int bitrate)
The class of the file information widget.
virtual void startToRequest(const QString &url) overridefinal
QString description() noexcept
static const QString PushButtonStyle04
TTK_MODULE_EXPORT bool openUrl(const QString &path, bool local=true)
The class of the moving dialog base.
The class of the mplayer core.
QPixmap cover() noexcept
QString duration() noexcept
static const QString LineEditStyle01
LineEdit.
QString trackNum() noexcept
static const QString TabWidgetStyle01
TabWidget.
static const QString ToolButtonStyle04
void downLoadFinished(const QString &bytes)
#define TTK_FILE_SUFFIX(fin)
Definition: ttkqtglobal.h:189
The class of the music song meta.
Definition: musicsongmeta.h:30
QString channel() noexcept
void setAlbum(const QString &album) noexcept
QString fileRelatedPath() noexcept
QString year() noexcept
void setArtist(const QString &artist) noexcept
QString rating() noexcept
void setCover(const QPixmap &cover) noexcept
state
Definition: http_parser.c:279
TTK_MODULE_EXPORT void bitrateToQuality(TTK::QueryQuality level, QString &bitrate, QColor &color)