diff --git a/libremediaserver-audio.pro b/libremediaserver-audio.pro index 41955a6..db78795 100644 --- a/libremediaserver-audio.pro +++ b/libremediaserver-audio.pro @@ -26,6 +26,7 @@ HEADERS += src/libremediaserver-audio.h \ src/slidergroup.h SOURCES += src/main.cpp \ src/editcuetrackwidget.cpp \ + src/cuetracklistwidget.cpp \ src/showplayer.cpp \ src/clickabledoublespinbox.cpp \ src/clickablelabel.cpp \ @@ -57,6 +58,3 @@ OTHER_FILES += \ docs/changelog.txt \ docs/lms-audio.xlm \ docs/roadmap.txt - -SOURCES += \ - src/cuetracklistwidget.cpp diff --git a/src/cuetracklistwidget.cpp b/src/cuetracklistwidget.cpp new file mode 100644 index 0000000..4397239 --- /dev/null +++ b/src/cuetracklistwidget.cpp @@ -0,0 +1,530 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "cuetracklistwidget.h" + +CueTrackListWidget::CueTrackListWidget(QWidget *parent) +{ + layout = new QVBoxLayout(this); + tableWidget = new QTableWidget(); + tableWidget->setSortingEnabled(false); + layout->addWidget(tableWidget); + setLayout(layout); + QShortcut *shortcut_up = new QShortcut(QKeySequence("Up"), parent); + QObject::connect(shortcut_up, SIGNAL(activated()), this, SLOT(key_up())); + QShortcut *shortcut_down = new QShortcut(QKeySequence("Down"), parent); + QObject::connect(shortcut_down, SIGNAL(activated()), this, SLOT(key_down())); +} + +void CueTrackListWidget::addCueTrack(CueTrack* cue) { + cueTracks.push_back(cue); + displayCueTrackInTable(cue, -1); + m_size++; +} + +void CueTrackListWidget::removeCueTrack(int index) { + if (index >= m_size) return; + cueTracks.erase(cueTracks.begin() + index); + tableWidget->removeRow(index); + m_size--; +} + +CueTrack* CueTrackListWidget::getTrackAtIndex(int index) { + if (index < m_size) { + return cueTracks.at(index); + } + return nullptr; +} + +CueTrack* CueTrackListWidget::getSelectedTrack() { + CueTrack* track = getTrackAtIndex(selectedIndex); + key_down(); + return track; +} + +void CueTrackListWidget::key_up() { + + if (m_size > 0 && selectedIndex > 0) { + updateSelectedCueTrack(false); + selectedIndex--; + updateSelectedCueTrack(true); + tableWidget->scrollToItem(tableWidget->item(selectedIndex, 0)); + } + emit changeSelectedIndex(selectedIndex); +} + +void CueTrackListWidget::key_down() { + if (selectedIndex < m_size - 1 && m_size > 0) { + updateSelectedCueTrack(false); + selectedIndex++; + updateSelectedCueTrack(true); + tableWidget->scrollToItem(tableWidget->item(selectedIndex, 0)); + } + emit changeSelectedIndex(selectedIndex); +} + +void CueTrackListWidget::displayCueTrackInTable(CueTrack *cueTrack, int index) { + if (tableWidget->columnCount() == 0) { + tableWidget->setColumnCount(7); + QStringList headers = {"Active", "Number","Audio Channel", "Name", "Volume", "Status", "File"}; + tableWidget->setHorizontalHeaderLabels(headers); + } + if (index == -1) + index = tableWidget->rowCount(); + tableWidget->insertRow(index); + + tableWidget->setItem(index, 0, new QTableWidgetItem(cueTrack->active ? "Yes" : "No")); + tableWidget->setItem(index, 1, new QTableWidgetItem(QStringLiteral("%1").arg(cueTrack->userNumber, 3, 10, QLatin1Char('0')))); + tableWidget->setItem(index, 2, new QTableWidgetItem(QString::number(cueTrack->audioLayer))); + tableWidget->setItem(index, 3, new QTableWidgetItem(cueTrack->name.data())); + tableWidget->setItem(index, 4, new QTableWidgetItem(QString::number(cueTrack->volume))); + QString statusStr; + statusStr = statusToString(cueTrack->status); + tableWidget->setItem(index, 5, new QTableWidgetItem(statusStr)); + tableWidget->setItem(index, 6, new QTableWidgetItem(*getFileName(cueTrack->filePath))); +} +//ToDo: make shortcuts in showplayer instead +void CueTrackListWidget::keyPressEvent(QKeyEvent* event) { + if (event->key() == Qt::Key_Delete) { + deleteCueTrack(); + } + if (event->key() == Qt::Key_Insert) { + createNewCueTrack(); + } + if (event->key() == Qt::Key_Return) { + editCueTrack(); + } +} + +void CueTrackListWidget::updateSelectedCueTrack(bool highlightRow) { + if (selectedIndex >= 0 && selectedIndex < tableWidget->rowCount()) { + QBrush backgroundBrush(highlightRow ? QColor(248, 248, 200) : Qt::white); + for (int column = 0; column < tableWidget->columnCount(); ++column) { + QTableWidgetItem *item = tableWidget->item(selectedIndex, column); + if (!item) { + item = new QTableWidgetItem(); + tableWidget->setItem(selectedIndex, column, item); + } + item->setBackground(backgroundBrush); + } + tableWidget->resizeColumnsToContents(); + tableWidget->resizeRowsToContents(); + } +} + +void CueTrackListWidget::cueTrackLoadDefaults(CueTrack * t) +{ + t->active = false; + t->audioLayer = -1; + t->bus1 = 80; + t->bus2 = 80; + t->entryPoint = 0; + t->exitPoint = 255; + t->fadeIn = 3; + t->fadeOut = 3; + t->waitIn = 0; + t->waitOut = 0; + t->pan = 0; + t->pitch = 1; + t->status = Status::PlayingOnce; + t->userNumber = lastUserCueNumber; + lastUserCueNumber++; + t->volume = 80; + t->stopAtEnd = true; + t->filePath = ""; +} + +void CueTrackListWidget::createNewCueTrack() +{ + CueTrack *t = new CueTrack; + cueTrackLoadDefaults(t); + EditCueTrackWidget dialog(t, this); + if (dialog.exec() == QDialog::Accepted) + addCueTrack(t); + if (m_size == 1) + { + updateSelectedCueTrack(true); + emit changeSelectedIndex(0); + } else + redrawCueTrackList(); + } + +void CueTrackListWidget::editCueTrack() +{ + CueTrack *current = getTrackAtIndex(selectedIndex); + EditCueTrackWidget dialog(current, this); + if (dialog.exec() == QDialog::Accepted) { + copyCueTrack(dialog.cueTrack, current); + redrawCueTrackList(); + emit changeSelectedIndex(selectedIndex); + } +} + +void CueTrackListWidget::deleteCueTrack() +{ + removeCueTrack(selectedIndex); + if (selectedIndex >= m_size) + { + selectedIndex = m_size - 1; + emit changeSelectedIndex(selectedIndex); + } + redrawCueTrackList(); +} + +void CueTrackListWidget::copyCueTrack(CueTrack *src, CueTrack *dst) +{ + dst->active = src->active; + dst->audioLayer = src->audioLayer; + dst->bus1 = src->bus1; + dst->bus2 = src->bus2; + dst->entryPoint = src->entryPoint; + dst->exitPoint = src->exitPoint; + dst->fadeIn = src->fadeIn; + dst->fadeOut = src->fadeOut; + dst->waitIn = src->waitIn; + dst->waitOut = src->waitOut; + dst->pan = src->pan; + dst->pitch = src->pitch; + dst->status = src->status; + dst->userNumber = src->userNumber; + dst->volume = src->volume; + dst->stopAtEnd = src->stopAtEnd; + dst->name = src->name; + dst->description = src->description; + dst->filePath = src->filePath; +} + +QString *CueTrackListWidget::getFileName(std::string s) +{ + size_t bar = s.rfind("/"); + std::string tmp = s.substr(bar + 1, strlen(s.data())); + QString *ret = new QString(tmp.data()); + ret->truncate(64); + return ret; +} + +void CueTrackListWidget::sortCueTrackList() +{ + std::sort(cueTracks.begin(), cueTracks.end(), [](CueTrack *a, CueTrack *b) { + return a->userNumber < b->userNumber; + }); +} + +void CueTrackListWidget::redrawCueTrackList() +{ + if (!m_size) + return; + int selected = cueTracks.at(selectedIndex)->userNumber; + clearTableWidget(); + tableWidget->setColumnCount(7); + QStringList headers = {"Active", "Number","Audio Channel", "Name", "Volume", "Status", "File"}; + tableWidget->setHorizontalHeaderLabels(headers); + sortCueTrackList(); + selectedIndex = 0; + for (int i = 0; i < m_size; i++) + { + displayCueTrackInTable(cueTracks.at(i), i); + } + selectedIndex = 0; + while (cueTracks.at(selectedIndex)->userNumber != selected) + { + selectedIndex++; + } + updateSelectedCueTrack(true); + tableWidget->resizeColumnsToContents(); + tableWidget->resizeRowsToContents(); + tableWidget->scrollToItem(tableWidget->item(selectedIndex, 0)); + tableWidget->blockSignals(false); +} + +#include +#include +#include +#include + +void CueTrackListWidget::loadCueTrackList(std::string filename) +{ + QFile file(QString::fromStdString(filename)); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + std::cerr << "No se pudo abrir el archivo para lectura" << std::endl; + return; + } + QXmlStreamReader xmlReader(&file); + clearCueTrackList(); + while (!xmlReader.atEnd() && !xmlReader.hasError()) + { + QXmlStreamReader::TokenType token = xmlReader.readNext(); + if (token == QXmlStreamReader::StartElement) + { + if (xmlReader.name() == "CueTrack") + { + CueTrack *t = new CueTrack; + while (!(xmlReader.tokenType() == QXmlStreamReader::EndElement && xmlReader.name() == "CueTrack")) + { + if (xmlReader.tokenType() == QXmlStreamReader::StartElement) + { + QString elementName = xmlReader.name().toString(); + xmlReader.readNext(); + if (xmlReader.tokenType() == QXmlStreamReader::Characters) + { + if (elementName == "filePath") { + t->filePath = xmlReader.text().toString().toStdString(); + } + else if (elementName == "volume") { + t->volume = xmlReader.text().toInt(); + } + else if (elementName == "pan") { + t->pan = xmlReader.text().toInt(); + } + else if (elementName == "pitch") { + t->pitch = xmlReader.text().toInt(); + } + else if (elementName == "bus1") { + t->bus1 = xmlReader.text().toInt(); + } + else if (elementName == "bus2") { + t->bus2 = xmlReader.text().toInt(); + } + else if (elementName == "status") { + QString tmp = xmlReader.text().toString(); + t->status = stringToStatus(&tmp); + } + else if (elementName == "fadeOut") { + t->fadeOut = xmlReader.text().toInt(); + } + else if (elementName == "fadeIn") { + t->fadeIn = xmlReader.text().toInt(); + } + else if (elementName == "waitIn") { + t->waitIn = xmlReader.text().toInt(); + } + else if (elementName == "waitOut") { + t->waitOut = xmlReader.text().toInt(); + } + else if (elementName == "stopAtEnd") { + t->stopAtEnd = xmlReader.text().toString().toLower() == "true"; + } + else if (elementName == "name") { + t->name = xmlReader.text().toString().toStdString(); + } + else if (elementName == "description") { + t->description = xmlReader.text().toString().toStdString(); + } + else if (elementName == "userNumber") { + t->userNumber = xmlReader.text().toInt(); + } + else if (elementName == "entryPoint") { + t->entryPoint = xmlReader.text().toInt(); + } + else if (elementName == "exitPoint") { + t->exitPoint = xmlReader.text().toInt(); + } + else if (elementName == "audioLayer") { + t->audioLayer = xmlReader.text().toInt(); + } + else if (elementName == "active") { + t->active = xmlReader.text().toString().toLower() == "true"; + } + } + } + xmlReader.readNext(); + } + addCueTrack(t); + } + } + } + if (xmlReader.hasError()) + { + std::cerr << "Error al leer el archivo XML: " << xmlReader.errorString().toStdString() << std::endl; + } + file.close(); + redrawCueTrackList(); +} + +#include +#include + +void CueTrackListWidget::saveCueTrackList(std::string filename) +{ + std::ofstream file(filename); + if (!file.is_open()) + { + return; + } + file << "\n"; + file << "\n"; + for (int i = 0; i < m_size; i++) + { + file << cueTrackToXml(*cueTracks.at(i)) << std::endl; + } + file << "\n"; + file.close(); +} + +std::string CueTrackListWidget::cueTrackToXml(const CueTrack& cueTrack) +{ + std::string xml = " \n"; + xml += " " + cueTrack.filePath + "\n"; + xml += " " + std::to_string(cueTrack.volume) + "\n"; + xml += " " + std::to_string(cueTrack.pan) + "\n"; + xml += " " + std::to_string(cueTrack.pitch) + "\n"; + xml += " " + std::to_string(cueTrack.bus1) + "\n"; + xml += " " + std::to_string(cueTrack.bus2) + "\n"; + xml += " "; + xml += statusToString(cueTrack.status); + xml += "\n"; + xml += " " + std::to_string(cueTrack.fadeOut) + "\n"; + xml += " " + std::to_string(cueTrack.fadeIn) + "\n"; + xml += " " + std::to_string(cueTrack.waitIn) + "\n"; + xml += " " + std::to_string(cueTrack.waitOut) + "\n"; + xml += " "; + xml += (cueTrack.stopAtEnd ? "true" : "false"); + xml += "\n"; + xml += " " + cueTrack.name + "\n"; + xml += " " + cueTrack.description + "\n"; + xml += " " + std::to_string(cueTrack.userNumber) + "\n"; + xml += " " + std::to_string(cueTrack.entryPoint) + "\n"; + xml += " " + std::to_string(cueTrack.exitPoint) + "\n"; + xml += " " + std::to_string(cueTrack.audioLayer) + "\n"; + xml += " "; + xml += (cueTrack.active ? "true" : "false"); + xml += "\n"; + xml += " \n"; + return xml; +} + +void CueTrackListWidget::clearCueTrackList() +{ + for (int i = 0; i < m_size; i++) + { + delete cueTracks.at(i); + } + cueTracks.clear(); + m_size = 0; + selectedIndex = 0; +} + +#include +#include + +void saveCueTrackToXml(const CueTrack& cueTrack, const QString& filename) { + QFile file(filename); + if (!file.open(QIODevice::WriteOnly)) { + qInfo() << "Can not open file " << filename << "\n"; + return; + } + + QXmlStreamWriter xmlWriter(&file); + xmlWriter.setAutoFormatting(true); + xmlWriter.writeStartDocument(); + xmlWriter.writeStartElement("CueTrack"); + + xmlWriter.writeTextElement("filePath", QString::fromStdString(cueTrack.filePath)); + xmlWriter.writeTextElement("volume", QString::number(cueTrack.volume)); + xmlWriter.writeTextElement("pan", QString::number(cueTrack.pan)); + xmlWriter.writeTextElement("pitch", QString::number(cueTrack.pitch)); + xmlWriter.writeTextElement("bus1", QString::number(cueTrack.bus1)); + xmlWriter.writeTextElement("bus2", QString::number(cueTrack.bus2)); + xmlWriter.writeTextElement("status", statusToString(cueTrack.status)); + xmlWriter.writeTextElement("fadeOut", QString::number(cueTrack.fadeOut)); + xmlWriter.writeTextElement("fadeIn", QString::number(cueTrack.fadeIn)); + xmlWriter.writeTextElement("waitIn", QString::number(cueTrack.waitIn)); + xmlWriter.writeTextElement("waitOut", QString::number(cueTrack.waitOut)); + xmlWriter.writeTextElement("stopAtEnd", cueTrack.stopAtEnd ? "true" : "false"); + xmlWriter.writeTextElement("name", QString::fromStdString(cueTrack.name)); + xmlWriter.writeTextElement("description", QString::fromStdString(cueTrack.description)); + xmlWriter.writeTextElement("userNumber", QString::number(cueTrack.userNumber)); + xmlWriter.writeTextElement("entryPoint", QString::number(cueTrack.entryPoint)); + xmlWriter.writeTextElement("exitPoint", QString::number(cueTrack.exitPoint)); + xmlWriter.writeTextElement("audioLayer", QString::number(cueTrack.audioLayer)); + xmlWriter.writeTextElement("active", cueTrack.active ? "true" : "false"); + + xmlWriter.writeEndElement(); + xmlWriter.writeEndDocument(); + + file.close(); +} + +#include +#include +#include +#include + +CueTrack loadCueTrackFromXml(const QString& filename) { + QFile file(filename); + if (!file.open(QIODevice::ReadOnly)) { + throw std::runtime_error("No se pudo abrir el archivo"); + } + + QXmlStreamReader xmlReader(&file); + CueTrack cueTrack; + + while (!xmlReader.atEnd() && !xmlReader.hasError()) { + QXmlStreamReader::TokenType token = xmlReader.readNext(); + if (token == QXmlStreamReader::StartElement) { + const QString elementName = xmlReader.name().toString(); + if (elementName == "filePath") { + cueTrack.filePath = xmlReader.readElementText().toStdString(); + } else if (elementName == "volume") { + cueTrack.volume = xmlReader.readElementText().toInt(); + } else if (elementName == "pan") { + cueTrack.pan = xmlReader.readElementText().toInt(); + } else if (elementName == "pitch") { + cueTrack.pitch = xmlReader.readElementText().toInt(); + } else if (elementName == "bus1") { + cueTrack.bus1 = xmlReader.readElementText().toInt(); + } else if (elementName == "bus2") { + cueTrack.bus2 = xmlReader.readElementText().toInt(); + } else if (elementName == "status") { + QString tmp = xmlReader.readElementText(); + cueTrack.status = stringToStatus(&tmp); + } else if (elementName == "fadeOut") { + cueTrack.fadeOut = xmlReader.readElementText().toInt(); + } else if (elementName == "fadeIn") { + cueTrack.fadeIn = xmlReader.readElementText().toInt(); + } else if (elementName == "waitIn") { + cueTrack.waitIn = xmlReader.readElementText().toInt(); + } else if (elementName == "waitOut") { + cueTrack.waitOut = xmlReader.readElementText().toInt(); + } else if (elementName == "stopAtEnd") { + cueTrack.stopAtEnd = xmlReader.readElementText() == "true"; + } else if (elementName == "name") { + cueTrack.name = xmlReader.readElementText().toStdString(); + } else if (elementName == "description") { + cueTrack.description = xmlReader.readElementText().toStdString(); + } else if (elementName == "userNumber") { + cueTrack.userNumber = xmlReader.readElementText().toInt(); + } else if (elementName == "entryPoint") { + cueTrack.entryPoint = xmlReader.readElementText().toInt(); + } else if (elementName == "exitPoint") { + cueTrack.exitPoint = xmlReader.readElementText().toInt(); + } else if (elementName == "audioLayer") { + cueTrack.audioLayer = xmlReader.readElementText().toInt(); + } else if (elementName == "active") { + cueTrack.active = xmlReader.readElementText() == "true"; + } + } + } + if (xmlReader.hasError()) { + throw std::runtime_error("Error al parsear el archivo XML"); + } + file.close(); + return cueTrack; +} + +void CueTrackListWidget::clearTableWidget() +{ + for (int i = 0; i < m_size; i++) + { + tableWidget->removeRow(i); + } + tableWidget->clear(); + tableWidget->setRowCount(0); +} diff --git a/src/cuetracklistwidget.h b/src/cuetracklistwidget.h index bca56f5..fa7b685 100644 --- a/src/cuetracklistwidget.h +++ b/src/cuetracklistwidget.h @@ -17,6 +17,8 @@ class CueTrackListWidget : public QWidget { public: explicit CueTrackListWidget(QWidget *parent = nullptr); + +public slots: CueTrack* getSelectedTrack(); void createNewCueTrack(); void editCueTrack(); @@ -24,6 +26,11 @@ public: int getSelectedIndex() { return selectedIndex; }; CueTrack* getTrackAtIndex(int index); QString *getFileName(std::string s); + void loadCueTrackList(std::string filename); + void saveCueTrackList(std::string filename); + void clearCueTrackList(); + void setLastUserCueNumber(size_t n) { lastUserCueNumber = n; } + size_t getLastUserCueNumber() { return lastUserCueNumber; } private: std::vector cueTracks; @@ -44,6 +51,11 @@ private slots: void updateSelectedCueTrack(bool highlightRow); void cueTrackLoadDefaults(CueTrack * t); void copyCueTrack(CueTrack *src, CueTrack *dst); + void sortCueTrackList(); + void redrawCueTrackList(); + void clearTableWidget(); + std::string cueTrackToXml(const CueTrack& cueTrack); + signals: void changeSelectedIndex(int index); diff --git a/src/defines.h b/src/defines.h index 1209bcb..59375fc 100644 --- a/src/defines.h +++ b/src/defines.h @@ -57,7 +57,7 @@ constexpr const char* statusToString(Status e) noexcept case Status::Iddle: return "Iddle"; case Status::PlayingFolder: return "Play Folder"; case Status::PlayingFolderLoop: return "Play Folder Loop"; - case Status::PlayingFolderRandom: return "Playing Folder Random"; + case Status::PlayingFolderRandom: return "Play Folder Random"; default: return "--++--"; } } @@ -65,15 +65,15 @@ constexpr const char* statusToString(Status e) noexcept #include static Status stringToStatus(QString *statusStr) { - if (statusStr->compare("Stopped")) return Stopped; - else if (statusStr->compare("Paused")) return Paused; - else if (statusStr->compare("PlayingOnce")) return PlayingOnce; - else if (statusStr->compare("PlayingLoop")) return PlayingLoop; - else if (statusStr->compare("Iddle")) return Iddle; - else if (statusStr->compare("PlayingFolder")) return PlayingFolder; - else if (statusStr->compare("PlayingFolderLoop")) return PlayingFolderLoop; - else if (statusStr->compare("PlayingFolderRandom")) return PlayingFolderRandom; - else return Stopped; // Valor por defecto o manejar como error + if (!statusStr->compare("Stopped")) return Stopped; + else if (!statusStr->compare("Paused") ) return Paused; + else if (!statusStr->compare("Play 1")) return PlayingOnce; + else if (!statusStr->compare("Play Loop")) return PlayingLoop; + else if (!statusStr->compare("Iddle")) return Iddle; + else if (!statusStr->compare("Play Folder")) return PlayingFolder; + else if (!statusStr->compare("Play Folder Loop")) return PlayingFolderLoop; + else if (!statusStr->compare("Play Folder Random")) return PlayingFolderRandom; + else return Iddle; } struct layerData { diff --git a/src/editcuetrackwidget.cpp b/src/editcuetrackwidget.cpp index 54547fb..f0f6046 100644 --- a/src/editcuetrackwidget.cpp +++ b/src/editcuetrackwidget.cpp @@ -13,62 +13,61 @@ EditCueTrackWidget::EditCueTrackWidget(CueTrack *cueTrack, QWidget *parent) } void EditCueTrackWidget::setupUi() { + QFormLayout *layout = new QFormLayout(this); + userNumberSpin = new QSpinBox(this); + userNumberSpin->setRange(0, 9999); + layout->addRow("User Number", userNumberSpin); nameEdit = new QLineEdit(this); + layout->addRow("Name", nameEdit); audioLayerSpin = new QSpinBox(this); audioLayerSpin->setRange(0, MAX_LAYERS - 1); + layout->addRow("Audio Layer", audioLayerSpin); filePathEdit = new QLineEdit(this); - statusCombo = new QComboBox(this); - volumeSpin = new QDoubleSpinBox(this); - volumeSpin->setRange(0, 100.01f); - panSpin = new QDoubleSpinBox(this); - pitchSpin = new QDoubleSpinBox(this); - bus1Spin = new QDoubleSpinBox(this); - bus1Spin->setRange(0, 100.01f); - bus2Spin = new QDoubleSpinBox(this); - bus2Spin->setRange(0, 100.01f); - fadeInSpin = new QSpinBox(this); - fadeOutSpin = new QSpinBox(this); - waitInSpin = new QSpinBox(this); - waitOutSpin = new QSpinBox(this); - stopAtEndCheck = new QCheckBox(this); - descriptionEdit = new QLineEdit(this); - entryPointSpin = new QSpinBox(this); - exitPointSpin = new QSpinBox(this); - statusCombo->addItem("Stopped"); - statusCombo->addItem("Paused"); - statusCombo->addItem("PlayingOnce"); - statusCombo->addItem("PlayingLoop"); - statusCombo->addItem("Iddle"); - statusCombo->addItem("PlayingFolder"); - statusCombo->addItem("PlayingFolderLoop"); - statusCombo->addItem("PlayingFolderRandom"); - statusCombo->addItem("PlayingFolderRandomLoop"); - + layout->addRow("File Path", filePathEdit); browseButton = new QPushButton("Browse...", this); + layout->addRow(browseButton); + statusCombo = new QComboBox(this); + layout->addRow("Status", statusCombo); + volumeSpin = new QDoubleSpinBox(this); + volumeSpin->setRange(0, 100.00f); + layout->addRow("Volume", volumeSpin); + panSpin = new QDoubleSpinBox(this); + layout->addRow("Pan", panSpin); + pitchSpin = new QDoubleSpinBox(this); + layout->addRow("Pitch", pitchSpin); + bus1Spin = new QDoubleSpinBox(this); + bus1Spin->setRange(0, 100.00f); + layout->addRow("Bus 1", bus1Spin); + bus2Spin = new QDoubleSpinBox(this); + bus2Spin->setRange(0, 100.00f); + layout->addRow("Bus 2", bus2Spin); + fadeInSpin = new QSpinBox(this); + layout->addRow("Fade In", fadeInSpin); + fadeOutSpin = new QSpinBox(this); + layout->addRow("Fade Out", fadeOutSpin); + waitInSpin = new QSpinBox(this); + layout->addRow("Wait In", waitInSpin); + waitOutSpin = new QSpinBox(this); + layout->addRow("Wait Out", waitOutSpin); + stopAtEndCheck = new QCheckBox(this); + layout->addRow("Stop At End", stopAtEndCheck); + descriptionEdit = new QLineEdit(this); + layout->addRow("Description", descriptionEdit); + entryPointSpin = new QSpinBox(this); + layout->addRow("Entry Point", entryPointSpin); + exitPointSpin = new QSpinBox(this); + layout->addRow("Exit Point", exitPointSpin); + statusCombo->addItem(statusToString(Status::Stopped)); + statusCombo->addItem(statusToString(Status::Paused)); + statusCombo->addItem(statusToString(Status::PlayingOnce)); + statusCombo->addItem(statusToString(Status::PlayingLoop)); + statusCombo->addItem(statusToString(Status::Iddle)); + statusCombo->addItem(statusToString(Status::PlayingFolder)); + statusCombo->addItem(statusToString(Status::PlayingFolderLoop)); + statusCombo->addItem(statusToString(Status::PlayingFolderRandom)); saveButton = new QPushButton("Save", this); cancelButton = new QPushButton("Cancel", this); - - QFormLayout *layout = new QFormLayout(this); - layout->addRow("User Number", userNumberSpin); - layout->addRow("Name", nameEdit); - layout->addRow("Audio Layer", audioLayerSpin); - layout->addRow("File Path", filePathEdit); - layout->addRow(browseButton); - layout->addRow("Status", statusCombo); - layout->addRow("Fade In", fadeInSpin); - layout->addRow("Fade Out", fadeOutSpin); - layout->addRow("Wait In", waitInSpin); - layout->addRow("Wait Out", waitOutSpin); - layout->addRow("Stop At End", stopAtEndCheck); - layout->addRow("Volume", volumeSpin); - layout->addRow("Bus 1", bus1Spin); - layout->addRow("Bus 2", bus2Spin); - layout->addRow("Pan", panSpin); - layout->addRow("Pitch", pitchSpin); - layout->addRow("Entry Point", entryPointSpin); - layout->addRow("Exit Point", exitPointSpin); - layout->addRow("Description", descriptionEdit); layout->addRow(saveButton); layout->addRow(cancelButton); } @@ -90,8 +89,9 @@ void EditCueTrackWidget::loadCueTrack(CueTrack cueTrack) { userNumberSpin->setValue(cueTrack.userNumber); entryPointSpin->setValue(cueTrack.entryPoint); exitPointSpin->setValue(cueTrack.exitPoint); - statusCombo->setCurrentIndex(statusCombo->findText(statusToString(cueTrack.status))); audioLayerSpin->setValue(cueTrack.audioLayer); + QString tmp = statusToString(cueTrack.status); + statusCombo->setCurrentIndex(statusCombo->findText(tmp)); } CueTrack EditCueTrackWidget::saveCueTrack() { @@ -136,4 +136,3 @@ void EditCueTrackWidget::onBrowseButtonClicked() { Settings::getInstance()->setPathMedia(dir.absoluteFilePath(filePath)); } } - diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 52c7946..3b877df 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -6,7 +6,11 @@ ShowPlayer::ShowPlayer(QWidget *parent) : , ui(new Ui::ShowPlayer) { ui->setupUi(this); - connect(ui->addCueButton, SIGNAL(clicked()), this, SLOT(onAddTrack())); + connect(ui->NewCue, SIGNAL(clicked()), this, SLOT(onAddTrack())); + connect(ui->EditCue, SIGNAL(clicked()), ui->cueListWidget, SLOT(editCueTrack())); + connect(ui->RemoveCue, SIGNAL(clicked()), ui->cueListWidget, SLOT(deleteCueTrack())); + connect(ui->SaveCueList, SIGNAL(clicked()), this, SLOT(saveCueTrackList())); + connect(ui->LoadCueList, SIGNAL(clicked()), this, SLOT(loadCueTrackList())); connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go())); filesLoaded = 0; currentStatus = Status::Iddle; @@ -54,7 +58,23 @@ void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { void ShowPlayer::changeSelectedIndex(int i) { CueTrack *t = ui->cueListWidget->getTrackAtIndex(i); - ui->nextCueNumber->display(i); + ui->nextCueNumber->display(t->userNumber); ui->nextCueLabel->setText(t->name.data()); - lastIndex = i; + lastIndex = t->userNumber; +} + +void ShowPlayer::loadCueTrackList() +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("XML Files (*.xml)")); + if (fileName.isEmpty()) + return; + ui->cueListWidget->loadCueTrackList(fileName.toStdString()); +} + +void ShowPlayer::saveCueTrackList() +{ + QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("XML Files (*.xml)")); + if (fileName.isEmpty()) + return; + ui->cueListWidget->saveCueTrackList(fileName.toStdString()); } diff --git a/src/showplayer.h b/src/showplayer.h index 6037159..7abec4c 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -37,6 +37,8 @@ private slots: void onAddTrack(); void go(); void changeSelectedIndex(int i); + void loadCueTrackList(); + void saveCueTrackList(); signals: void uiPlaybackChanged(int layer, Status s); diff --git a/src/showplayer.ui b/src/showplayer.ui index 26f0c94..9f3cd82 100644 --- a/src/showplayer.ui +++ b/src/showplayer.ui @@ -6,8 +6,8 @@ 0 0 - 538 - 554 + 743 + 671 @@ -23,18 +23,42 @@ - + 0 0 + + + 400 + 400 + + + + QFrame::StyledPanel + + + QFrame::Sunken + Qt::Vertical + + 8 + + + QFrame::Box + + + QFrame::Raised + Qt::Horizontal + + 8 + @@ -42,6 +66,9 @@ 0 + + Qt::ClickFocus + GO @@ -51,6 +78,12 @@ + + QLayout::SetMinimumSize + + + 0 + @@ -97,28 +130,173 @@ + + 0 + QLayout::SetMinimumSize + + 100 + + + 100 + - + ... + + + ../resources/load_button.png../resources/load_button.png + + + + 32 + 32 + + - + ... + + + ../resources/save_button.png../resources/save_button.png + + + + 32 + 32 + + + + true + + + false + - + ... + + + ../resources/copy_button.png../resources/copy_button.png + + + + 32 + 32 + + + + + + + + Load Cue List + + + Load Cue List + + + ... + + + + ../resources/cut_button.png../resources/cut_button.png + + + + 32 + 32 + + + + + + + + ... + + + + ../resources/paste_button.png../resources/paste_button.png + + + + 32 + 32 + + + + + + + + Qt::NoFocus + + + ... + + + + ../resources/new_button.png../resources/new_button.png + + + + 32 + 32 + + + + + + + + Qt::NoFocus + + + ... + + + + ../resources/edit_button.png../resources/edit_button.png + + + + 32 + 32 + + + + + + + + Qt::NoFocus + + + ... + + + + ../resources/remove_button.png../resources/remove_button.png + + + + 32 + 32 + + @@ -155,6 +333,12 @@ 1 + + cueListWidget + NewCue + EditCue + RemoveCue +