TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musictransformwidget.cpp
Go to the documentation of this file.
1 #include "musictransformwidget.h"
2 #include "ui_musictransformwidget.h"
3 #include "musicwidgetheaders.h"
4 #include "musiclrcparser.h"
5 #include "musictoastlabel.h"
6 #include "musicfileutils.h"
7 
8 #include <QProcess>
9 #if TTK_QT_VERSION_CHECK(6,2,0)
10 # include <QSoundEffect>
11 #elif !TTK_QT_VERSION_CHECK(6,0,0)
12 # include <QSound>
13 #endif
14 
15 static constexpr int LINE_WIDTH = 420;
16 
18  : MusicAbstractMoveDialog(parent),
19  m_ui(new Ui::MusicTransformWidget),
20  m_currentType(Module::Music)
21 {
22  m_ui->setupUi(this);
23  setFixedSize(size());
24  setBackgroundLabel(m_ui->background);
25 
26  m_process = new QProcess(this);
27  m_ui->topTitleCloseButton->setIcon(QIcon(":/functions/btn_close_hover"));
28  m_ui->topTitleCloseButton->setStyleSheet(TTK::UI::ToolButtonStyle04);
29  m_ui->topTitleCloseButton->setCursor(QCursor(Qt::PointingHandCursor));
30  m_ui->topTitleCloseButton->setToolTip(tr("Close"));
31  connect(m_ui->topTitleCloseButton, SIGNAL(clicked()), SLOT(close()));
32 
37 
38  m_ui->inputButton->setStyleSheet(TTK::UI::PushButtonStyle04);
39  m_ui->outputButton->setStyleSheet(TTK::UI::PushButtonStyle04);
40 
41  m_ui->transformButton->setStyleSheet(TTK::UI::PushButtonStyle04);
42  m_ui->inputLineEdit->setStyleSheet(TTK::UI::LineEditStyle01);
43  m_ui->outputLineEdit->setStyleSheet(TTK::UI::LineEditStyle01);
44 
45  m_ui->listWidget->setStyleSheet(TTK::UI::ListWidgetStyle01);
46  m_ui->listWidget->verticalScrollBar()->setStyleSheet(TTK::UI::ScrollBarStyle03);
47 
48  m_ui->inputButton->setCursor(QCursor(Qt::PointingHandCursor));
49  m_ui->outputButton->setCursor(QCursor(Qt::PointingHandCursor));
50  m_ui->transformButton->setCursor(QCursor(Qt::PointingHandCursor));
51 
52  m_ui->folderBox->setStyleSheet(TTK::UI::CheckBoxStyle01);
53  m_ui->tabButton->addButtons({tr("Music"), tr("Krc")});
54 
55 #ifdef Q_OS_UNIX
56  m_ui->inputButton->setFocusPolicy(Qt::NoFocus);
57  m_ui->outputButton->setFocusPolicy(Qt::NoFocus);
58  m_ui->transformButton->setFocusPolicy(Qt::NoFocus);
59  m_ui->folderBox->setFocusPolicy(Qt::NoFocus);
60 #endif
61 
62  initialize();
63 
65  connect(m_ui->inputButton, SIGNAL(clicked()), SLOT(initInputPath()));
66  connect(m_ui->outputButton, SIGNAL(clicked()), SLOT(initOutputPath()));
67  connect(m_ui->transformButton, SIGNAL(clicked()), SLOT(startTransform()));
68  connect(m_ui->folderBox, SIGNAL(clicked(bool)), SLOT(folderBoxChecked()));
69  connect(m_ui->tabButton, SIGNAL(clicked(int)), SLOT(buttonClicked(int)));
70 }
71 
73 {
74  m_process->kill();
75  delete m_process;
76  delete m_ui;
77 }
78 
80 {
81  QString path;
82  QStringList supportedFormat;
83  (m_currentType == Module::Music) ? (supportedFormat << "mp3" << "wav" << "wma" << "ogg" << "flac" << "ac3" << "aac") : supportedFormat << "krc";
84 
85  if(!m_ui->folderBox->isChecked())
86  {
87  QString filter = "Audio Files (";
88  for(int i = 0; i < supportedFormat.count(); ++i)
89  {
90  filter += QString("*.%1 ").arg(supportedFormat[i]);
91  }
92  filter = filter.trimmed() + ")";
93 
94  path = TTK::File::getOpenFileName(this, filter);
95  if(path.isEmpty() || m_path.contains(path))
96  {
97  return;
98  }
99 
100  m_ui->listWidget->addItem(TTK::Widget::elidedText(font(), path, Qt::ElideLeft, LINE_WIDTH));
101  m_ui->listWidget->setToolTip(path);
102  m_path << path;
103  }
104  else
105  {
106  path = TTK::File::getExistingDirectory(this);
107  if(!path.isEmpty())
108  {
109  for(const QFileInfo &fin : TTK::File::fileInfoListByPath(path))
110  {
111  if(!m_path.contains(fin.absoluteFilePath()) && supportedFormat.contains(TTK_FILE_SUFFIX(fin)))
112  {
113  m_path << fin.absoluteFilePath();
114  m_ui->listWidget->addItem(TTK::Widget::elidedText(font(), m_path.last(), Qt::ElideLeft, LINE_WIDTH));
115  m_ui->listWidget->setToolTip(m_path.last());
116  }
117  }
118  }
119  }
120 
121  if(!path.isEmpty())
122  {
123  m_ui->inputLineEdit->setText(path);
124  }
125 }
126 
128 {
129  const QString &path = TTK::File::getExistingDirectory(this);
130  if(!path.isEmpty())
131  {
132  m_ui->outputLineEdit->setText(path);
133  }
134 }
135 
137 {
138  if(!processTransform())
139  {
140  return;
141  }
142 
143  m_ui->loadingLabel->show();
144  m_ui->loadingLabel->start();
145  setCheckedControl(false);
146 }
147 
149 {
150 #if TTK_QT_VERSION_CHECK(6,2,0)
151  QSoundEffect *sound = new QSoundEffect(this);
152  sound->setSource(QUrl::fromLocalFile(":/data/sound"));
153  sound->play();
154 #elif !TTK_QT_VERSION_CHECK(6,0,0)
155  QSound::play(":/data/sound");
156 #endif
157 
158  m_path.removeFirst();
159  m_ui->listWidget->clear();
160 
161  if(!m_path.isEmpty())
162  {
163  for(const QString &path : qAsConst(m_path))
164  {
165  m_ui->listWidget->addItem(TTK::Widget::elidedText(font(), path, Qt::ElideLeft, LINE_WIDTH));
166  m_ui->listWidget->setToolTip(path);
167  }
168 
169  if(processTransform())
170  {
171  return;
172  }
173  }
174 
175  setCheckedControl(true);
176  m_ui->loadingLabel->execute(false);
177 }
178 
180 {
181  m_ui->inputLineEdit->clear();
182  m_ui->listWidget->clear();
183  m_path.clear();
184 }
185 
187 {
189  const bool musicMode = Module::Music == m_currentType;
190 
191  m_path.clear();
192  m_ui->listWidget->clear();
193  m_ui->inputLineEdit->clear();
194  m_ui->outputLineEdit->clear();
195 
196  m_ui->label_8->setVisible(!musicMode);
197  m_ui->label_3->setVisible(musicMode);
198  m_ui->label_4->setVisible(musicMode);
199  m_ui->label_5->setVisible(musicMode);
200  m_ui->label_6->setVisible(musicMode);
201  m_ui->formatCombo->setVisible(musicMode);
202  m_ui->hzCombo->setVisible(musicMode);
203  m_ui->kbpsCombo->setVisible(musicMode);
204  m_ui->msCombo->setVisible(musicMode);
205 }
206 
208 {
209  if(!QFile::exists(MAKE_TRANSFORM_PATH_FULL))
210  {
211  MusicToastLabel::popup(tr("Lack of plugin file"));
212  return -1;
213  }
214 
216 }
217 
219 {
220  return m_path.isEmpty() ? QString() : QFileInfo(m_path.first()).completeBaseName();
221 }
222 
224 {
225  m_ui->formatCombo->addItems({"MP3", "WAV", "WMA", "OGG", "FLAC", "AC3", "AAC"});
226  m_ui->kbpsCombo->addItems({"32", "48", "56", "64", "80", "96", "112", "128", "192", "224", "256", "320"});
227  m_ui->hzCombo->addItems({"8000", "12050", "16000", "22050", "24000", "32000", "44100", "48000"});
228  m_ui->msCombo->addItems({"Mono", "Stereo"});
229 
230  m_ui->kbpsCombo->setCurrentIndex(7);
231  m_ui->hzCombo->setCurrentIndex(6);
232 
233  m_ui->label_8->hide();
234  m_ui->loadingLabel->setType(MusicGifLabelWidget::Module::CicleBlue);
235 }
236 
238 {
239  if(m_path.isEmpty())
240  {
241  MusicToastLabel::popup(tr("The input file path is empty"));
242  return false;
243  }
244 
245  const QString &in = m_path.first().trimmed();
246  const QString &out = m_ui->outputLineEdit->text().trimmed();
247 
248  if(in.isEmpty() || out.isEmpty())
249  {
250  MusicToastLabel::popup(tr("The output file path is empty"));
251  return false;
252  }
253 
255  {
256  if(m_ui->formatCombo->currentText() == "OGG")
257  {
258  m_ui->msCombo->setCurrentIndex(1);
259  }
260 
261  TTK_INFO_STREAM(QString("%1 %2 %3 %4").arg(m_ui->formatCombo->currentText(), m_ui->kbpsCombo->currentText(), m_ui->hzCombo->currentText())
262  .arg(m_ui->msCombo->currentIndex() + 1));
263 
264  m_process->start(MAKE_TRANSFORM_PATH_FULL, {"-i", in, "-y",
265  "-ab", m_ui->kbpsCombo->currentText() + "k",
266  "-ar", m_ui->hzCombo->currentText(),
267  "-ac", QString::number(m_ui->msCombo->currentIndex() + 1),
268  QString("%1%2-new.%3").arg(out, transformSongName(), m_ui->formatCombo->currentText().toLower())});
269  }
270  else
271  {
272  MusicLrcFromKrc krc;
273  TTK_INFO_STREAM("Krc to lrc state: " << krc.decode(in, QString("%1%2.%3").arg(out, transformSongName(), LRC_FILE_SUFFIX)));
274  transformFinish();
275  }
276  return true;
277 }
278 
280 {
281  m_ui->inputButton->setEnabled(enabled);
282  m_ui->outputButton->setEnabled(enabled);
283  m_ui->folderBox->setEnabled(enabled);
284  m_ui->transformButton->setEnabled(enabled);
285  m_ui->tabButton->setButtonEnabled(enabled);
286 }
TTK_MODULE_EXPORT QString getExistingDirectory(QWidget *parent)
#define TTKStaticCast(x, y)
Definition: ttkglobal.h:231
static const QString ListWidgetStyle01
ListWidget.
virtual bool decode(const QString &input) overridefinal
#define QtProcessFinishVoidConnect(p, q, f, s)
Process finished void connect.
Definition: ttkqtcompat.h:108
QString transformSongName() const
TTK_MODULE_EXPORT void generateComboBoxStyle(QComboBox *widget, const QString &style={})
static const QString CheckBoxStyle01
CheckBox.
voidpf void uLong size
Definition: ioapi.h:136
TTK_MODULE_EXPORT QString getOpenFileName(QWidget *parent, const QString &filter="Image Files (*.png *.bmp *.jpg)")
void setBackgroundLabel(QLabel *label) noexcept
static void popup(const QString &text)
static const QString ScrollBarStyle03
#define qAsConst
Definition: ttkqtglobal.h:57
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
The class of the krc to lrc.
static const QString PushButtonStyle04
#define MAKE_TRANSFORM_PATH_FULL
Definition: musicobject.h:167
TTK_MODULE_EXPORT QString elidedText(const QFont &font, const QString &text, Qt::TextElideMode mode, int width)
TTK_MODULE_EXPORT QFileInfoList fileInfoListByPath(const QString &dpath, const QStringList &filter={}, bool recursively=true)
#define TTK_SLOT
Definition: ttkqtglobal.h:177
MusicTransformWidget(QWidget *parent=nullptr)
The class of the moving dialog base.
static const QString LineEditStyle01
LineEdit.
Ui::MusicTransformWidget * m_ui
static const QString ToolButtonStyle04
static constexpr int LINE_WIDTH
#define TTK_FILE_SUFFIX(fin)
Definition: ttkqtglobal.h:185
#define LRC_FILE_SUFFIX
Definition: musicobject.h:37
The class of the transform widget.
void setCheckedControl(bool enabled)