TTKMusicPlayer  4.2.0.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_container(nullptr),
17  m_player(nullptr)
18 {
19  m_ui->setupUi(this);
20  setFixedSize(size());
21  setBackgroundLabel(m_ui->background);
22 
23  m_ui->topTitleCloseButton->setIcon(QIcon(":/functions/btn_close_hover"));
24  m_ui->topTitleCloseButton->setStyleSheet(TTK::UI::ToolButtonStyle04);
25  m_ui->topTitleCloseButton->setCursor(QCursor(Qt::PointingHandCursor));
26  m_ui->topTitleCloseButton->setToolTip(tr("Close"));
27  connect(m_ui->topTitleCloseButton, SIGNAL(clicked()), SLOT(close()));
28 
29  setStyleSheet(TTK::UI::LineEditStyle01);
30  setEditLineEnabled(false);
31 
32  const QPixmap pix(":/image/lb_default_art");
33  m_ui->pixmapLabel->setPixmap(pix.scaled(m_ui->pixmapLabel->size()));
34  m_ui->mainViewWidget->setStyleSheet(TTK::UI::TabWidgetStyle01);
35  m_ui->descriptionPlainEdit->setReadOnly(true);
36  m_ui->descriptionPlainEdit->verticalScrollBar()->setStyleSheet(TTK::UI::ScrollBarStyle03);
37 
38  m_ui->editButton->setStyleSheet(TTK::UI::PushButtonStyle04);
39  m_ui->deletePixButton->setStyleSheet(TTK::UI::PushButtonStyle04);
40  m_ui->savePixButton->setStyleSheet(TTK::UI::PushButtonStyle04);
41  m_ui->saveButton->setStyleSheet(TTK::UI::PushButtonStyle04);
42  m_ui->viewButton->setStyleSheet(TTK::UI::PushButtonStyle04);
43  m_ui->openPixButton->setStyleSheet(TTK::UI::PushButtonStyle04);
44  m_ui->dynamicPixButton->setStyleSheet(TTK::UI::PushButtonStyle04);
45 
46 #ifdef Q_OS_UNIX
47  m_ui->editButton->setFocusPolicy(Qt::NoFocus);
48  m_ui->deletePixButton->setFocusPolicy(Qt::NoFocus);
49  m_ui->savePixButton->setFocusPolicy(Qt::NoFocus);
50  m_ui->saveButton->setFocusPolicy(Qt::NoFocus);
51  m_ui->viewButton->setFocusPolicy(Qt::NoFocus);
52  m_ui->openPixButton->setFocusPolicy(Qt::NoFocus);
53  m_ui->dynamicPixButton->setFocusPolicy(Qt::NoFocus);
54 #endif
55 
56  connect(m_ui->editButton, SIGNAL(clicked()), SLOT(editTag()));
57  connect(m_ui->deletePixButton, SIGNAL(clicked()), SLOT(deleteAlbumImage()));
58  connect(m_ui->savePixButton, SIGNAL(clicked()), SLOT(saveAlbumImage()));
59  connect(m_ui->saveButton, SIGNAL(clicked()), SLOT(saveTag()));
60  connect(m_ui->viewButton, SIGNAL(clicked()), SLOT(openFileDir()));
61  connect(m_ui->openPixButton, SIGNAL(clicked()), SLOT(openImageFileDir()));
62  connect(m_ui->dynamicPixButton, SIGNAL(clicked()), SLOT(openDynamicImage()));
63  connect(m_ui->mainViewWidget, SIGNAL(currentChanged(int)), SLOT(currentTabChanged(int)));
64 }
65 
67 {
68  delete m_ui;
69  delete m_container;
70  delete m_player;
71 }
72 
73 static void rendererPixmap(Ui::MusicFileInformationWidget *ui, const QPixmap &pixmap)
74 {
75  if(pixmap.isNull())
76  {
77  ui->pixmapWidthLabel->setText(TTK_DEFAULT_STR);
78  ui->pixmapHeightLabel->setText(TTK_DEFAULT_STR);
79  }
80  else
81  {
82  ui->pixmapWidthLabel->setText(QString("%1px").arg(pixmap.width()));
83  ui->pixmapHeightLabel->setText(QString("%1px").arg(pixmap.height()));
84  ui->pixmapLabel->setPixmap(pixmap.scaled(ui->pixmapLabel->size()));
85  }
86 }
87 
89 {
90  if(name.contains(CACHE_DIR_FULL)) //cache song should not allow open url
91  {
92  m_ui->viewButton->setEnabled(false);
93  }
94 
95  MusicSongMeta meta;
96  const bool state = meta.read(m_path = name);
97  const QFileInfo fin(meta.fileRelatedPath());
98 
99  QString check;
100  m_ui->filePathEdit->setText((check = fin.filePath()).isEmpty() ? TTK_DEFAULT_STR : check);
101  m_ui->fileFormatEdit->setText((check = TTK_FILE_SUFFIX(fin)).isEmpty() ? TTK_DEFAULT_STR : check);
102  m_ui->fileSizeEdit->setText((check = TTK::Number::sizeByteToLabel(fin.size())).isEmpty() ? TTK_DEFAULT_STR : check);
103 
104  m_ui->fileAlbumEdit->setText(state ? ((check = meta.album()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
105  m_ui->fileArtistEdit->setText(state ? ((check = meta.artist()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
106  m_ui->fileGenreEdit->setText(state ? ((check = meta.genre()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
107  m_ui->fileTitleEdit->setText(state ? ((check = meta.title()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
108  m_ui->fileYearEdit->setText(state ? ((check = meta.year()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
109  m_ui->fileTimeEdit->setText(state ? ((check = meta.duration()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
110 
111  const int rating = meta.rating().toInt();
112  if(rating == 0) m_ui->ratingLabel->setValue(0);
113  else if(rating < 64) m_ui->ratingLabel->setValue(1);
114  else if(rating < 128) m_ui->ratingLabel->setValue(2);
115  else if(rating < 196) m_ui->ratingLabel->setValue(3);
116  else if(rating < 255) m_ui->ratingLabel->setValue(4);
117  else m_ui->ratingLabel->setValue(5);
118 
119  m_ui->bitrateEdit->setText(state ? ((check = (meta.bitrate())).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
120  m_ui->channelEdit->setText(state ? ((check = meta.channel()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
121  m_ui->sampleRateEdit->setText(state ? ((check = meta.sampleRate()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
122  m_ui->trackNumEdit->setText(state ? ((check = meta.trackNum()).isEmpty() ? TTK_DEFAULT_STR : check) : TTK_DEFAULT_STR);
123 
124  QColor color;
125  QString bitrate;
126  TTK::Number::bitrateToQuality(TTK::Number::bitrateToLevel(m_ui->bitrateEdit->text()), bitrate, color);
127  m_ui->qualityEdit->setText(bitrate);
128 
129  m_ui->descriptionPlainEdit->setPlainText(meta.description());
130 
131  rendererPixmap(m_ui, meta.cover());
132 }
133 
135 {
137  {
138  MusicToastLabel::popup(tr("The file has been moved or does not exist"));
139  }
140 }
141 
143 {
145  if(m_imagePath.isEmpty())
146  {
147  return;
148  }
149 
150  QPixmap pix;
151  pix.load(m_imagePath);
152  rendererPixmap(m_ui, pix);
153 }
154 
156 {
157  m_deleteImage = true;
158  rendererPixmap(m_ui, QPixmap(":/image/lb_default_art"));
159 }
160 
162 {
163  QPixmap pix;
164  MusicSongMeta meta;
165  if(meta.read(m_path))
166  {
167  pix = meta.cover();
168  }
169 
170  if(!pix.isNull())
171  {
172  const QString &path = TTK::File::getSaveFileName(this);
173  if(!path.isEmpty())
174  {
175  pix.save(path);
176  }
177  }
178 }
179 
181 {
182  if(m_ui->dynamicPixButton->text() == tr("Dynamic"))
183  {
184  m_ui->dynamicPixButton->setText(tr("Static"));
185 
187  connect(d, SIGNAL(downLoadDataChanged(QString)), SLOT(downLoadFinished(QString)));
188  d->startToRequest(QFileInfo(m_path).baseName());
189  }
190  else
191  {
192  m_ui->dynamicPixButton->setText(tr("Dynamic"));
193 
194  if(m_player && m_player->isPlaying())
195  {
196  m_player->stop();
197  delete m_player;
198  m_player = nullptr;
199  }
200 
201  delete m_container;
202  m_container = nullptr;
203 
204  MusicSongMeta meta;
205  meta.read(m_path);
206  rendererPixmap(m_ui, meta.cover());
207  }
208 }
209 
211 {
212  if(index != 1 && m_container && m_player) //image tab
213  {
215  }
216 }
217 
219 {
220  if(bytes.isEmpty())
221  {
222  MusicToastLabel::popup(tr("No dynamic cover data"));
223  m_ui->dynamicPixButton->setText(tr("Dynamic"));
224  return;
225  }
226 
227  if(!m_player)
228  {
229  m_player = new MusicCoreMPlayer(this);
230  }
231 
232  if(!m_container)
233  {
234  const QPoint &glbPos = m_ui->pixmapLabel->mapToGlobal({0, 0});
235 
236  m_container = new QWidget;
237  m_container->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::Window);
238  m_container->setGeometry(QRect(glbPos, m_ui->pixmapLabel->size()));
239  m_container->show();
240  }
241 
243  m_player->play();
244 }
245 
247 {
248  setEditLineEnabled(!m_ui->fileAlbumEdit->isEnabled());
249 }
250 
252 {
253  MusicMessageBox message;
254  message.setText(tr("Are you sure to save?"));
255  if(!message.exec())
256  {
257  return;
258  }
259 
260  MusicSongMeta meta;
261  if(!meta.read(m_path))
262  {
263  return;
264  }
265 
266  QString value = m_ui->fileAlbumEdit->text().trimmed();
267  if(value != TTK_DEFAULT_STR)
268  {
269  meta.setAlbum(value);
270  }
271 
272  value = m_ui->fileArtistEdit->text().trimmed();
273  if(value != TTK_DEFAULT_STR)
274  {
275  meta.setArtist(value);
276  }
277 
278  value = m_ui->fileGenreEdit->text().trimmed();
279  if(value != TTK_DEFAULT_STR)
280  {
281  meta.setGenre(value);
282  }
283 
284  value = m_ui->fileTitleEdit->text().trimmed();
285  if(value != TTK_DEFAULT_STR)
286  {
287  meta.setTitle(value);
288  }
289 
290  value = m_ui->fileYearEdit->text().trimmed();
291  if(value != TTK_DEFAULT_STR)
292  {
293  meta.setYear(value);
294  }
295 
296  if(m_deleteImage)
297  {
298  meta.setCover(QPixmap());
299  }
300  else if(!m_imagePath.isEmpty())
301  {
302  meta.setCover(QPixmap(m_imagePath));
303  }
304 
305  meta.save();
306  MusicToastLabel::popup(tr("Save successfully"));
307 }
308 
310 {
312 
313  if(m_container)
314  {
315  const QPoint &glbPos = m_ui->pixmapLabel->mapToGlobal({0, 0});
316  m_container->setGeometry(QRect(glbPos, m_ui->pixmapLabel->size()));
317  }
318 }
319 
321 {
322  m_ui->fileAlbumEdit->setEnabled(enabled);
323  m_ui->fileArtistEdit->setEnabled(enabled);
324  m_ui->fileGenreEdit->setEnabled(enabled);
325  m_ui->fileTitleEdit->setEnabled(enabled);
326  m_ui->fileYearEdit->setEnabled(enabled);
327 
328  m_ui->openPixButton->setEnabled(enabled);
329  m_ui->deletePixButton->setEnabled(enabled);
330  m_ui->saveButton->setEnabled(enabled);
331 }
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:144
void setMedia(Module type, const QString &url, int winId=-1)
void setGenre(const QString &genre) noexcept
void setText(const QString &text) const
virtual void mouseMoveEvent(QMouseEvent *event) override
QString artist() noexcept
#define TTK_DEFAULT_STR
Definition: ttkglobal.h:276
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)
void setBackgroundLabel(QLabel *label) noexcept
virtual void mouseMoveEvent(QMouseEvent *event) override
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
void setCover(const QPixmap &cover)
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:185
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
state
Definition: http_parser.c:279
TTK_MODULE_EXPORT void bitrateToQuality(TTK::QueryQuality level, QString &bitrate, QColor &color)