Files
noggit-red/src/noggit/ui/windows/SoundPlayer/SoundEntryPlayer.cpp
T1ti e24c1c3bd0 - add a quick settings popup when creating zones
- improve locales support
- refactor dbc exceptions handling
2024-08-06 04:36:38 +02:00

222 lines
8.6 KiB
C++

#include "SoundEntryPlayer.h"
#include <noggit/DBC.h>
#include <noggit/Log.h>
#include <noggit/Misc.h>
#include <ClientFile.hpp>
#include <noggit/application/NoggitApplication.hpp>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QFormLayout>
#include <QtWidgets/qpushbutton.h>
#include <QtWidgets/qgroupbox.h>
#include <QtWidgets/qcheckbox.h>
#include <QtWidgets/qlineedit.h>
#include <QtWidgets/QTableView>
#include <QStandardItemModel>
#include <QTableWidgetItem>
#include <QSound>
#include <qtemporaryfile>
#include <QMediaPlayer>
#include <QListWidget>
#include <QToolButton>
#include <iostream>
#include <sstream>
#include <string>
namespace Noggit
{
namespace Ui
{
SoundEntryPlayer::SoundEntryPlayer(QWidget* parent)
: QWidget(parent)
{
setWindowTitle("Sound entry player");
setWindowFlags(Qt::Tool);
auto layout = new QVBoxLayout(this);
// auto sound_id_lbl = new QLabel(this);
// sound_id_lbl->setText("Sound Entry : " + sound_entry_id);
// layout->addWidget(sound_id_lbl);
auto dir_layout = new QHBoxLayout(this);
layout->addLayout(dir_layout);
dir_layout->addWidget(new QLabel("Directory:"));
_directory_lbl = new QLabel(this);
dir_layout->addWidget(_directory_lbl);
auto controls_layout = new QHBoxLayout(this);
layout->addLayout(controls_layout);
_media_player = new QMediaPlayer(this);
auto btn_play = new QToolButton(this);
controls_layout->addWidget(btn_play);
connect(btn_play, &QToolButton::clicked, _media_player, &QMediaPlayer::play);
btn_play->setIcon(Noggit::Ui::FontAwesomeIcon(FontAwesome::play));
auto btn_pause = new QToolButton(this);
controls_layout->addWidget(btn_pause);
connect(btn_pause, &QToolButton::clicked, _media_player, &QMediaPlayer::pause);
btn_pause->setIcon(Noggit::Ui::FontAwesomeIcon(FontAwesome::pause));
auto btn_stop = new QToolButton(this);
controls_layout->addWidget(btn_stop);
connect(btn_stop, &QToolButton::clicked, _media_player, &QMediaPlayer::stop);
btn_stop->setIcon(Noggit::Ui::FontAwesomeIcon(FontAwesome::stop));
_position_slider = new QSlider(Qt::Horizontal, this);
_position_slider->setTickInterval(100);
_position_slider->setSingleStep(100);
controls_layout->addWidget(_position_slider);
_volume_slider = new QSlider(Qt::Horizontal, this);
_volume_slider->setRange(0, 100);
_volume_slider->setValue(80);
_media_player->setVolume(80);
// controls_layout->addWidget(new QLabel("Volume:"));
auto btn_volume = new QToolButton(this);
controls_layout->addWidget(btn_volume);
// connect(btn_volume, &QToolButton::clicked, _media_player, &QMediaPlayer::stop);
btn_volume->setIcon(Noggit::Ui::FontAwesomeIcon(FontAwesome::volumeup));
controls_layout->addWidget(btn_volume);
controls_layout->addWidget(_volume_slider);
_files_listview = new QListWidget();
_files_listview->setSelectionMode(QListWidget::SingleSelection);
layout->addWidget(_files_listview);
connect(_files_listview, &QListWidget::itemClicked, this, [=](QListWidgetItem* item) {
play_selected_sound();
});
// connect volume
connect(_volume_slider, &QSlider::valueChanged, [&](int v) {
_media_player->setVolume(v);
});
// media doesn't start playnig imemdiatly when called, need to use this signal
connect(_media_player, &QMediaPlayer::durationChanged, this, [&](qint64 dur) {
_position_slider->setMaximum(dur);
});
// connect(_media_player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
connect(_media_player, &QMediaPlayer::positionChanged, [&](qint64 v) {
auto testmax = _position_slider->maximum();
QSignalBlocker const blocker(_position_slider);
_position_slider->setSliderPosition(v);
});
// position bar
connect(_position_slider, &QSlider::valueChanged, [&](int v) {
// _media_player->currentMedia().canonicalResource().dataSize();
_media_player->setPosition(v);
});
// _media_player->setPosition();
}
void SoundEntryPlayer::LoadSoundsFromSoundEntry(int sound_entry_id)
{
if (sound_entry_id == 0)
{
this->close();
this->destroy();
return;
}
// get files list
try
{
DBCFile::Record sound_entry_record = gSoundEntriesDB.getByID(sound_entry_id);
_directory_lbl->setText(sound_entry_record.getString(SoundEntriesDB::FilePath));
_volume_slider->setValue(sound_entry_record.getFloat(SoundEntriesDB::Volume) * 100);
_media_player->setVolume(sound_entry_record.getFloat(SoundEntriesDB::Volume) * 100);
for (int fileid = 0; fileid < 10; fileid++)
{
std::string filename = sound_entry_record.getString(SoundEntriesDB::Filenames + fileid);
if (!filename.empty())
{
// std::stringstream ss_filepah;
// ss_filepath << directory << "\\" << filename;
// music_files.push_back(ss_filepah.str());
// music_files.push_back(filename);
_files_listview->addItem(filename.c_str());
}
}
_files_listview->setCurrentRow(0);
play_selected_sound();
}
catch (SoundEntriesDB::NotFound)
{
}
}
void SoundEntryPlayer::PlaySingleSoundFile(std::string filepath, std::string dir_path)
{
_directory_lbl->setText(dir_path.c_str());
_files_listview->clear();
_files_listview->addItem(filepath.c_str());
_files_listview->setCurrentRow(0);
play_selected_sound();
}
void SoundEntryPlayer::play_selected_sound()
{
std::stringstream filename;
auto item = _files_listview->selectedItems().back();
filename << _directory_lbl->text().toStdString() << "\\" << item->text().toStdString();
if (!Noggit::Application::NoggitApplication::instance()->clientData()->exists(filename.str()))
{
LogError << "The requested sound file \"" << filename.str() << "\" does not exist! Oo" << std::endl;
QMessageBox not_found_messagebox;
not_found_messagebox.setIcon(QMessageBox::Warning);
not_found_messagebox.setWindowIcon(QIcon(":/icon"));
not_found_messagebox.setWindowTitle("File not found");
std::stringstream ss;
ss << "The requested sound file \"" << filename.str() << "\" was not found in the client." << std::endl;
not_found_messagebox.setText(ss.str().c_str());
not_found_messagebox.exec();
return;
}
BlizzardArchive::ClientFile file(filename.str(), Noggit::Application::NoggitApplication::instance()->clientData());
auto temp_file = new QTemporaryFile(this); // must parent for the object to be destroyed properly(and file deleted)
temp_file->open();
temp_file->write(file.getBuffer(), file.getSize());
temp_file->close();
// default tempname is like User\AppData\Local\Temp\Noggit.qrRfsy ...We need to add back the file extension or it won't be read by the player!
// must rename after closing or it doesn't write correctly
temp_file->rename(temp_file->fileName() + item->text());
// file.save(); // saves file to project folder
// auto save_path = file.getPath().string();
auto testlol = temp_file->fileName().toStdString();
_media_player->setMedia(QUrl::fromLocalFile(temp_file->fileName())); // QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3")
_media_player->play();
}
void SoundEntryPlayer::closeEvent(QCloseEvent* event)
{
// makes the music stop when closing
_media_player->stop();
event->accept();
}
}
}