diff --git a/libremediaserver-audio.pro b/libremediaserver-audio.pro index db78795..48f0af8 100644 --- a/libremediaserver-audio.pro +++ b/libremediaserver-audio.pro @@ -2,6 +2,7 @@ TEMPLATE = app TARGET = libremediaserver-audio QT += webkitwidgets widgets HEADERS += src/libremediaserver-audio.h \ + src/cuetrackwidget.h \ src/editcuetrackwidget.h \ src/cuetracklistwidget.h \ src/showplayer.h \ @@ -23,8 +24,10 @@ HEADERS += src/libremediaserver-audio.h \ src/audiowidget.h \ src/defines.h \ src/settings.h \ - src/slidergroup.h + src/slidergroup.h \ + src/dialgroup.h SOURCES += src/main.cpp \ + src/cuetrackwidget.cpp \ src/editcuetrackwidget.cpp \ src/cuetracklistwidget.cpp \ src/showplayer.cpp \ @@ -43,8 +46,10 @@ SOURCES += src/main.cpp \ src/audiolayerwidget.cpp \ src/audiowidget.cpp \ src/settings.cpp \ - src/slidergroup.cpp + src/slidergroup.cpp \ + src/dialgroup.cpp FORMS += \ + src/cuetrackwidget.ui \ src/showplayer.ui \ src/libremediaserver-audio-ui.ui CCFLAG += -msse2 -mavx2 @@ -58,3 +63,5 @@ OTHER_FILES += \ docs/changelog.txt \ docs/lms-audio.xlm \ docs/roadmap.txt +RESOURCES += \ + lms-resources.qrc diff --git a/lms-resources.qrc b/lms-resources.qrc new file mode 100644 index 0000000..21a0629 --- /dev/null +++ b/lms-resources.qrc @@ -0,0 +1,15 @@ + + + resources/copy_button.png + resources/cut_button.png + resources/delete_button.png + resources/edit_button.png + resources/load_button.png + resources/new_button.png + resources/paste_button.png + resources/save_button.png + resources/icon.png + resources/panic_button.jpg + resources/go_button.jpeg + + diff --git a/resources/copy_button.png b/resources/copy_button.png new file mode 100644 index 0000000..27fdef5 Binary files /dev/null and b/resources/copy_button.png differ diff --git a/resources/cut_button.png b/resources/cut_button.png new file mode 100644 index 0000000..4977b23 Binary files /dev/null and b/resources/cut_button.png differ diff --git a/resources/delete_button.png b/resources/delete_button.png new file mode 100644 index 0000000..0d44443 Binary files /dev/null and b/resources/delete_button.png differ diff --git a/resources/edit_button.png b/resources/edit_button.png new file mode 100644 index 0000000..37c3a34 Binary files /dev/null and b/resources/edit_button.png differ diff --git a/resources/load_button.png b/resources/load_button.png new file mode 100644 index 0000000..d0d1d3c Binary files /dev/null and b/resources/load_button.png differ diff --git a/resources/new_button.png b/resources/new_button.png new file mode 100644 index 0000000..3ac34f9 Binary files /dev/null and b/resources/new_button.png differ diff --git a/resources/paste_button.png b/resources/paste_button.png new file mode 100644 index 0000000..ef34fac Binary files /dev/null and b/resources/paste_button.png differ diff --git a/resources/save_button.png b/resources/save_button.png new file mode 100644 index 0000000..78d8ae0 Binary files /dev/null and b/resources/save_button.png differ diff --git a/src/cuetracklistwidget.cpp b/src/cuetracklistwidget.cpp index 4397239..22f9062 100644 --- a/src/cuetracklistwidget.cpp +++ b/src/cuetracklistwidget.cpp @@ -1,4 +1,7 @@ #include +#include +#include +#include #include #include #include @@ -7,6 +10,8 @@ #include #include #include +#include +#include #include "cuetracklistwidget.h" CueTrackListWidget::CueTrackListWidget(QWidget *parent) @@ -42,9 +47,10 @@ CueTrack* CueTrackListWidget::getTrackAtIndex(int index) { return nullptr; } -CueTrack* CueTrackListWidget::getSelectedTrack() { +CueTrack* CueTrackListWidget::getSelectedTrack(bool advance) { CueTrack* track = getTrackAtIndex(selectedIndex); - key_down(); + if (advance) + key_down(); return track; } @@ -121,23 +127,25 @@ void CueTrackListWidget::updateSelectedCueTrack(bool highlightRow) { void CueTrackListWidget::cueTrackLoadDefaults(CueTrack * t) { t->active = false; - t->audioLayer = -1; - t->bus1 = 80; - t->bus2 = 80; + t->audioLayer = 0; + t->bus1 = 100; + t->bus2 = 100; t->entryPoint = 0; t->exitPoint = 255; - t->fadeIn = 3; - t->fadeOut = 3; + t->fadeIn = 2; + t->fadeOut = 2; t->waitIn = 0; t->waitOut = 0; t->pan = 0; t->pitch = 1; t->status = Status::PlayingOnce; + lastUserCueNumber += 10; t->userNumber = lastUserCueNumber; - lastUserCueNumber++; t->volume = 80; t->stopAtEnd = true; t->filePath = ""; + t->duration = 0; + t->multi = false; } void CueTrackListWidget::createNewCueTrack() @@ -145,15 +153,20 @@ void CueTrackListWidget::createNewCueTrack() CueTrack *t = new CueTrack; cueTrackLoadDefaults(t); EditCueTrackWidget dialog(t, this); - if (dialog.exec() == QDialog::Accepted) + if (dialog.exec() == QDialog::Accepted) { + t->active = false; addCueTrack(t); - if (m_size == 1) - { - updateSelectedCueTrack(true); - emit changeSelectedIndex(0); + if (m_size == 1) + { + updateSelectedCueTrack(true); + emit changeSelectedIndex(0); + } else + redrawCueTrackList(); + if (lastUserCueNumber < t->userNumber) + lastUserCueNumber = t->userNumber; } else - redrawCueTrackList(); - } + delete (t); +} void CueTrackListWidget::editCueTrack() { @@ -164,6 +177,8 @@ void CueTrackListWidget::editCueTrack() redrawCueTrackList(); emit changeSelectedIndex(selectedIndex); } + if (lastUserCueNumber < current->userNumber) + lastUserCueNumber = current->userNumber; } void CueTrackListWidget::deleteCueTrack() @@ -198,6 +213,8 @@ void CueTrackListWidget::copyCueTrack(CueTrack *src, CueTrack *dst) dst->name = src->name; dst->description = src->description; dst->filePath = src->filePath; + dst->duration = src->duration; + dst->multi = src->multi; } QString *CueTrackListWidget::getFileName(std::string s) @@ -223,7 +240,7 @@ void CueTrackListWidget::redrawCueTrackList() int selected = cueTracks.at(selectedIndex)->userNumber; clearTableWidget(); tableWidget->setColumnCount(7); - QStringList headers = {"Active", "Number","Audio Channel", "Name", "Volume", "Status", "File"}; + QStringList headers = {"Active", "Number","Channel", "Name", "Volume", "Status", "File"}; tableWidget->setHorizontalHeaderLabels(headers); sortCueTrackList(); selectedIndex = 0; @@ -241,13 +258,9 @@ void CueTrackListWidget::redrawCueTrackList() tableWidget->resizeRowsToContents(); tableWidget->scrollToItem(tableWidget->item(selectedIndex, 0)); tableWidget->blockSignals(false); + emit changeSelectedIndex(selectedIndex); } -#include -#include -#include -#include - void CueTrackListWidget::loadCueTrackList(std::string filename) { QFile file(QString::fromStdString(filename)); @@ -258,6 +271,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) } QXmlStreamReader xmlReader(&file); clearCueTrackList(); + lastUserCueNumber = 0; while (!xmlReader.atEnd() && !xmlReader.hasError()) { QXmlStreamReader::TokenType token = xmlReader.readNext(); @@ -309,7 +323,12 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) t->waitOut = xmlReader.text().toInt(); } else if (elementName == "stopAtEnd") { - t->stopAtEnd = xmlReader.text().toString().toLower() == "true"; + QString tmp = xmlReader.text().toString().toLower(); + if (tmp.compare("false")) + t->stopAtEnd = true; + else { + t->stopAtEnd = false; + } } else if (elementName == "name") { t->name = xmlReader.text().toString().toStdString(); @@ -319,6 +338,10 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) } else if (elementName == "userNumber") { t->userNumber = xmlReader.text().toInt(); + if (t->userNumber > lastUserCueNumber) + { + lastUserCueNumber = t->userNumber; + } } else if (elementName == "entryPoint") { t->entryPoint = xmlReader.text().toInt(); @@ -329,9 +352,18 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) else if (elementName == "audioLayer") { t->audioLayer = xmlReader.text().toInt(); } - else if (elementName == "active") { - t->active = xmlReader.text().toString().toLower() == "true"; - } + else if (elementName == "duration") { + t->duration = xmlReader.text().toInt(); + } + else if (elementName == "multi") { + QString tmp = xmlReader.text().toString().toLower(); + if (tmp.compare("false")) + t->multi = true; + else { + t->multi = false; + } + } + t->active = false; } } xmlReader.readNext(); @@ -348,9 +380,6 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) redrawCueTrackList(); } -#include -#include - void CueTrackListWidget::saveCueTrackList(std::string filename) { std::ofstream file(filename); @@ -393,10 +422,11 @@ std::string CueTrackListWidget::cueTrackToXml(const CueTrack& cueTrack) 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"; + xml += " " + std::to_string(cueTrack.duration) + "\n"; + xml += " "; + xml += (cueTrack.multi ? "true" : "false"); + xml += "\n"; + xml += " \n"; return xml; } @@ -444,7 +474,6 @@ void saveCueTrackToXml(const CueTrack& cueTrack, const QString& filename) { 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(); @@ -507,9 +536,9 @@ CueTrack loadCueTrackFromXml(const QString& filename) { cueTrack.exitPoint = xmlReader.readElementText().toInt(); } else if (elementName == "audioLayer") { cueTrack.audioLayer = xmlReader.readElementText().toInt(); - } else if (elementName == "active") { - cueTrack.active = xmlReader.readElementText() == "true"; - } + } else if (elementName == "duration") { + cueTrack.duration = xmlReader.readElementText().toInt(); + } } } if (xmlReader.hasError()) { @@ -528,3 +557,39 @@ void CueTrackListWidget::clearTableWidget() tableWidget->clear(); tableWidget->setRowCount(0); } + +void CueTrackListWidget::cueTrackAtEnd(int layer) +{ + for (int i = 0; i < m_size; i++) + { + CueTrack * cur = cueTracks.at(i); + if (cur->audioLayer == layer) + { + cur->active = false; + } + } + redrawCueTrackList(); +} + +void CueTrackListWidget::copyCueTrack() { + if (selectedIndex >= 0 && selectedIndex < m_size) { + delete copiedCue; + copiedCue = new CueTrack(*cueTracks.at(selectedIndex)); + } +} + +void CueTrackListWidget::cutCueTrack() { + if (selectedIndex >= 0 && selectedIndex < m_size) { + delete copiedCue; + copiedCue = new CueTrack(*cueTracks.at(selectedIndex)); + removeCueTrack(selectedIndex); + } +} + +void CueTrackListWidget::pasteCueTrack() { + if (copiedCue != nullptr) { + CueTrack* newCue = new CueTrack(*copiedCue); + addCueTrack(newCue); + } +} + diff --git a/src/cuetracklistwidget.h b/src/cuetracklistwidget.h index fa7b685..518b4ef 100644 --- a/src/cuetracklistwidget.h +++ b/src/cuetracklistwidget.h @@ -19,7 +19,7 @@ public: explicit CueTrackListWidget(QWidget *parent = nullptr); public slots: - CueTrack* getSelectedTrack(); + CueTrack* getSelectedTrack(bool advance); void createNewCueTrack(); void editCueTrack(); void deleteCueTrack(); @@ -31,6 +31,8 @@ public slots: void clearCueTrackList(); void setLastUserCueNumber(size_t n) { lastUserCueNumber = n; } size_t getLastUserCueNumber() { return lastUserCueNumber; } + void cueTrackAtEnd(int layer); + void redrawCueTrackList(); private: std::vector cueTracks; @@ -39,7 +41,8 @@ private: int m_size = 0; int size() { return m_size; } int selectedIndex = 0; - size_t lastUserCueNumber = 0; + int lastUserCueNumber = 0; + CueTrack* copiedCue = nullptr; private slots: void addCueTrack(CueTrack* cue); @@ -52,12 +55,14 @@ private slots: void cueTrackLoadDefaults(CueTrack * t); void copyCueTrack(CueTrack *src, CueTrack *dst); void sortCueTrackList(); - void redrawCueTrackList(); void clearTableWidget(); std::string cueTrackToXml(const CueTrack& cueTrack); - + void copyCueTrack(); + void pasteCueTrack(); + void cutCueTrack(); signals: void changeSelectedIndex(int index); + void goAction(int channel); }; #endif diff --git a/src/cuetrackwidget.cpp b/src/cuetrackwidget.cpp new file mode 100644 index 0000000..609cf4d --- /dev/null +++ b/src/cuetrackwidget.cpp @@ -0,0 +1,94 @@ +#include + +#include "cuetrackwidget.h" +#include "ui_cuetrackwidget.h" + +CueTrackWidget::CueTrackWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::CueTrackWidget) +{ + ui->setupUi(this); + tlFade.setFrameRange(0, 100); + tlWaitIn.setFrameRange(0, 100); + tlWaitOut.setFrameRange(0, 100); + connect(&tlFade, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue); + connect(&tlWaitIn, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue); + connect(&tlWaitOut, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue); + connect(&tlFade, SIGNAL(finished()), this, SLOT(fadeSlot())); + connect(&tlWaitIn, SIGNAL(finished()), this, SLOT(waitInSlot())); + connect(&tlWaitOut, SIGNAL(finished()), this, SLOT(waitOutSlot())); +} + + +CueTrackWidget::~CueTrackWidget() +{ + delete ui; +} + +void CueTrackWidget::loadCueTrack(CueTrack* track) +{ + ui->cueName->setText(track->name.data()); + ui->cueNumber->display(track->userNumber); + ui->vol->display(track->volume); + ui->pan->display(track->pan); + ui->pitch->display(track->pitch); + ui->bus1->display(track->bus1); + ui->bus2->display(track->bus2); + ui->fade->setValue(track->fadeIn); + ui->waitIn->setValue(track->waitIn); + ui->waitOut->setValue(track->waitOut); + ui->halt->setChecked(track->stopAtEnd); + QFileInfo fileInfo(track->filePath.data()); + fileInfo.fileName().truncate(64); + ui->mediaFileName->setText(fileInfo.fileName()); + ui->status->setText(statusToString(track->status)); + ui->audioLayer->display(track->audioLayer); + ui->multi->setChecked(track->multi); +} + +void CueTrackWidget::go() +{ + tlFade.stop(); + tlWaitIn.stop(); + tlWaitOut.stop(); + ui->cueProgressBar->setValue(0); + if (ui->waitIn->value() > 0) + { + tlWaitIn.setDuration(ui->waitIn->value() * 1000); + tlWaitIn.start(); + ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #FF0000; }"); + } else { + waitInSlot(); + } +} + +void CueTrackWidget::waitInSlot() +{ + emit goAction(ui->audioLayer->intValue()); + tlFade.setDuration(ui->fade->value() * 1000); + tlFade.start(); + ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #00FF00; }"); +} + +void CueTrackWidget::fadeSlot() +{ + if (ui->waitOut->value() > 0) { + tlWaitOut.setDuration(ui->waitOut->value() * 1000); + tlWaitOut.start(); + ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #FF0000; }"); + } else { + waitOutSlot(); + } +} + +void CueTrackWidget::waitOutSlot() +{ + ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #0000FF; }"); + emit cueFinished(ui->audioLayer->intValue()); +} + +void CueTrackWidget::setNextCue() +{ + ui->cueProgressBar->setDisabled(true); + ui->cueProgressBar->hide(); +} diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h new file mode 100644 index 0000000..6e7bd8b --- /dev/null +++ b/src/cuetrackwidget.h @@ -0,0 +1,43 @@ +#ifndef CUETRACKWIDGET_H +#define CUETRACKWIDGET_H + +#include +#include + +#include "defines.h" +#include "dialgroup.h" + +namespace Ui { +class CueTrackWidget; +} + +class CueTrackWidget : public QWidget +{ + Q_OBJECT + +public: + explicit CueTrackWidget(QWidget *parent = nullptr); + ~CueTrackWidget(); + +private: + Ui::CueTrackWidget *ui; + QTimeLine tlFade; + QTimeLine tlWaitIn; + QTimeLine tlWaitOut; + +public slots: + void loadCueTrack(CueTrack* track); + void go(); + void setNextCue(); + +private slots: + void fadeSlot(); + void waitInSlot(); + void waitOutSlot(); + +signals: + void cueFinished(int layer); + void goAction(int layer); +}; + +#endif // CUETRACKWIDGET_H diff --git a/src/cuetrackwidget.ui b/src/cuetrackwidget.ui new file mode 100644 index 0000000..314782b --- /dev/null +++ b/src/cuetrackwidget.ui @@ -0,0 +1,780 @@ + + + CueTrackWidget + + + + 0 + 0 + 502 + 329 + + + + + 0 + 0 + + + + + 0 + 0 + + + + Qt::ClickFocus + + + Cue Track + + + + :/buttons/resources/icon.png:/buttons/resources/icon.png + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + QFrame::StyledPanel + + + Qt::Vertical + + + false + + + 8 + + + + + 0 + 0 + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + 0 + 0 + + + + + 0 + 0 + + + + Cue Progress + + + Cue Progress + + + 24 + + + + + + 1 + 0 + + + + + 48 + 48 + + + + + 14 + 75 + true + + + + Cue Number + + + Cue Number + + + QFrame::StyledPanel + + + QFrame::Plain + + + 1 + + + false + + + 4 + + + QLCDNumber::Flat + + + + + + 2 + 0 + + + + + 0 + 0 + + + + + 13 + 75 + true + + + + Cue Name + + + QFrame::StyledPanel + + + QFrame::Plain + + + Cue Name + + + Qt::PlainText + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + 3 + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + 0 + 0 + + + + + 0 + 24 + + + + + 16777215 + 24 + + + + + 10 + + + + Media FIle Name + + + QFrame::StyledPanel + + + Media file name + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + 3 + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Qt::Horizontal + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + QLayout::SetDefaultConstraint + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Wait in time in seconds + + + QAbstractSpinBox::NoButtons + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Wait out time in secods + + + QAbstractSpinBox::NoButtons + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Fade time in seconds + + + Fade In + + + Fade In Time in seconds + + + true + + + true + + + true + + + QAbstractSpinBox::NoButtons + + + + + + false + + + + + + + + + 99990000.000000000000000 + + + QAbstractSpinBox::AdaptiveDecimalStepType + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Exit Point + + + QAbstractSpinBox::NoButtons + + + + + + + + 0 + 0 + + + + + 13 + + + + Playback Status + + + QFrame::StyledPanel + + + Playback Status + + + Qt::PlainText + + + true + + + Qt::AlignCenter + + + true + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Entry Point + + + QAbstractSpinBox::NoButtons + + + + + + + + 0 + 0 + + + + + 0 + 24 + + + + Audio Channel + + + false + + + 1 + + + QLCDNumber::Flat + + + + + + + + 0 + 0 + + + + + 24 + 0 + + + + + 13 + 75 + true + + + + Qt::NoFocus + + + Do not play next cue if checked + + + If checked, do not play next cue. If checked, Go next cue when this cue has finished. + + + Halt + + + true + + + Halt + + + + :/buttons/resources/delete_button.png:/buttons/resources/delete_button.png + + + + 32 + 32 + + + + true + + + + + + + + + QLayout::SetDefaultConstraint + + + 0 + + + + + 3 + + + + + + + + 0 + 0 + + + + + 10 + + + + Bus 1 + + + Qt::AlignCenter + + + + + + + 3 + + + QLCDNumber::Flat + + + + + + + + 10 + + + + Volume + + + Qt::AlignCenter + + + + + + + + 10 + + + + Bus 2 + + + Qt::AlignCenter + + + + + + + <html><head/><body><p>Volume</p></body></html> + + + 3 + + + + + + + <html><head/><body><p>Bus 2 Volume</p></body></html> + + + 3 + + + + + + + <html><head/><body><p>Bus 1 Volume</p></body></html> + + + 3 + + + + + + + + 0 + 0 + + + + + 10 + + + + Pan + + + Qt::AlignCenter + + + + + + + + 10 + + + + Pitch + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 50 + false + true + + + + <html><head/><body><p>PLay next cue at same time this cue, do not wait to finish the cue.</p></body></html> + + + Qt::RightToLeft + + + + + + + :/buttons/resources/go_button.jpeg:/buttons/resources/go_button.jpeg + + + + 32 + 32 + + + + + + + + + 10 + + + + MultiCue + + + Qt::AlignCenter + + + + + + + + + + + + waitOut + fade + entryPoint + exitPoint + waitIn + + + + + + diff --git a/src/defines.h b/src/defines.h index 59375fc..f6a083c 100644 --- a/src/defines.h +++ b/src/defines.h @@ -65,7 +65,7 @@ constexpr const char* statusToString(Status e) noexcept #include static Status stringToStatus(QString *statusStr) { - if (!statusStr->compare("Stopped")) return Stopped; + if (!statusStr->compare("Stop")) 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; @@ -91,6 +91,7 @@ struct layerData { int bus1Vol; int bus2Vol; float level; + int fade; }; struct CueTrack { @@ -112,7 +113,9 @@ struct CueTrack { int entryPoint; // 0 - 255 int exitPoint; // 0 - 255 int audioLayer; // internal audio layer used when cue is loaded - bool active; + bool active; // the cue is playing + int duration; // media duration in milliseconds + bool multi; // launch next cue at same time, not waiting for this to finish. }; #endif // __cplusplus diff --git a/src/dialgroup.cpp b/src/dialgroup.cpp new file mode 100644 index 0000000..ef29b88 --- /dev/null +++ b/src/dialgroup.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include "dialgroup.h" + +DialGroup::DialGroup(QString name, + int min, + int max, + int decimals, + QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *layout = new QVBoxLayout; + layout->setAlignment(Qt::AlignHCenter); + layout->setContentsMargins(0, 0, 0, 0); + slider.setFocusPolicy(Qt::NoFocus); + slider.setRange(min, max); + slider.setValue(min + max / 2); + slider.setToolTip(name); + slider.setContentsMargins(0, 0, 0, 0); +/* + slider.setMinimumHeight(0); + slider.setSingleStep(1); + slider.setMinimumWidth(50); + slider.setStyleSheet("QDial {" + "border: 1px solid #aa8895;" + "background: #20182d;" + "margin: 0px;}" + "QSlider::groove:vertical {" + "border: 1px solid #999999;" + "width: 25px;}" + "QDial::tickmarks:vertical {" + "background-color: black;" + "background: red;" + "color: white;}" +*/ + valueBox.setFocusPolicy(Qt::NoFocus); + valueBox.setButtonSymbols(QAbstractSpinBox::NoButtons); + valueBox.setMinimumWidth(50); + valueBox.setRange(min, max); + valueBox.setValue(0); + valueBox.setDecimals(decimals); + valueBox.setObjectName(name); + valueBox.setToolTip(name); + valueBox.setAlignment(Qt::AlignHCenter); + valueBox.setContentsMargins(0, 0, 0, 0); + layout->addWidget(&slider); + layout->addWidget(&valueBox); +/* this->setStyleSheet("border: 1px solid #998090;" + "background-color: black;" + "margin: 1px;" + );*/ + layout->setSpacing(0); + layout->setContentsMargins(0, 0, 0, 0); + this->setLayout(layout); + slider.setObjectName(name); +} + +void DialGroup::setValue(float value) +{ + slider.blockSignals(true); + valueBox.blockSignals(true); + slider.setValue(value); + valueBox.setValue(value); + slider.blockSignals(false); + valueBox.blockSignals(false); +} diff --git a/src/dialgroup.h b/src/dialgroup.h new file mode 100644 index 0000000..d795821 --- /dev/null +++ b/src/dialgroup.h @@ -0,0 +1,30 @@ +#ifndef DIALGROUP_H +#define DIALGROUP_H + +#include +#include +#include +#include + +#include "clickabledoublespinbox.h" + +class DialGroup : public QWidget +{ + Q_OBJECT +public: + explicit DialGroup(QString name, + int min, + int max, + int decimals, + QWidget *parent = nullptr); + +public slots: + void setValue(float value); + +private: + QDial slider; + ClickableDoubleSpinBox valueBox; + +}; + +#endif diff --git a/src/editcuetrackwidget.cpp b/src/editcuetrackwidget.cpp index f0f6046..cb38701 100644 --- a/src/editcuetrackwidget.cpp +++ b/src/editcuetrackwidget.cpp @@ -58,6 +58,8 @@ void EditCueTrackWidget::setupUi() { layout->addRow("Entry Point", entryPointSpin); exitPointSpin = new QSpinBox(this); layout->addRow("Exit Point", exitPointSpin); + multiCheck = new QCheckBox(this); + layout->addRow("Multi Cue", multiCheck); statusCombo->addItem(statusToString(Status::Stopped)); statusCombo->addItem(statusToString(Status::Paused)); statusCombo->addItem(statusToString(Status::PlayingOnce)); @@ -92,6 +94,7 @@ void EditCueTrackWidget::loadCueTrack(CueTrack cueTrack) { audioLayerSpin->setValue(cueTrack.audioLayer); QString tmp = statusToString(cueTrack.status); statusCombo->setCurrentIndex(statusCombo->findText(tmp)); + multiCheck->setChecked(cueTrack.multi); } CueTrack EditCueTrackWidget::saveCueTrack() { @@ -114,6 +117,7 @@ CueTrack EditCueTrackWidget::saveCueTrack() { cueTrack.pan = panSpin->value(); cueTrack.pitch = pitchSpin->value(); cueTrack.description.append(descriptionEdit->text().toUtf8().constData()); + cueTrack.multi = multiCheck->isChecked(); return cueTrack; } diff --git a/src/editcuetrackwidget.h b/src/editcuetrackwidget.h index 080561e..8afb0d1 100644 --- a/src/editcuetrackwidget.h +++ b/src/editcuetrackwidget.h @@ -46,6 +46,7 @@ private: QSpinBox *exitPointSpin; QComboBox *statusCombo; QSpinBox *audioLayerSpin; + QCheckBox *multiCheck; QPushButton *browseButton; QPushButton *saveButton; QPushButton *cancelButton; diff --git a/src/libremediaserver-audio-ui.cpp b/src/libremediaserver-audio-ui.cpp index 0227f16..e1f8533 100644 --- a/src/libremediaserver-audio-ui.cpp +++ b/src/libremediaserver-audio-ui.cpp @@ -60,6 +60,6 @@ void libreMediaServerAudioUi::olasetup() void libreMediaServerAudioUi::launchShowPlayerWindow() { - qDebug() << "launch show player"; + //m_showPlayer->showMaximized(); m_showPlayer->show(); } diff --git a/src/libremediaserver-audio-ui.ui b/src/libremediaserver-audio-ui.ui index 2f1feae..7de7324 100644 --- a/src/libremediaserver-audio-ui.ui +++ b/src/libremediaserver-audio-ui.ui @@ -7,8 +7,8 @@ 0 0 - 400 - 400 + 640 + 800 @@ -23,8 +23,8 @@ LibreMediaServer - - ../../../../criptomart/artwork/logo_v2_criptomart.net.png../../../../criptomart/artwork/logo_v2_criptomart.net.png + + :/buttons/resources/icon.png:/buttons/resources/icon.png @@ -32,7 +32,7 @@ 0 0 - 400 + 640 21 @@ -56,6 +56,8 @@ - + + + diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index 1a1b6eb..a440561 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -139,8 +139,6 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value) #ifndef NOGUI if (m_ui) { m_lmsUi->m_aw->filterParamChanged(layer, channel, value); - m_played.clear(); - m_played.append(m_ola->getValue(layer, DMX_FILE)); } #endif } @@ -172,14 +170,16 @@ void libreMediaServerAudio::refreshUi() { } m_lmsUi->m_aw->levelChanged(i, m_mae.getLevel(i)); if (m_mae.getAtEnd(i)) { - if (m_currentStatus[i] == Status::PlayingOnce) { + if (m_currentStatus[i] == Status::PlayingOnce || m_currentStatus[i] == Status::Stopped) { m_currentStatus[i] = Status::Stopped; m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); + m_lmsUi->m_showPlayer->cueTrackAtEnd(i); } if (m_currentStatus[i] == Status::PlayingFolder) { - uint last = m_played.last(); + uint last = 0; + if (!m_played.isEmpty()) + last = m_played.last() + 1; int folder = m_ola->getValue(i, DMX_FOLDER); - last++; if (last < m_mediaLibrary->getMediaFolderCount(folder)) { this->loadMedia(i, folder, last); m_mae.playbackChanged(i, Status::PlayingFolder); @@ -187,6 +187,7 @@ void libreMediaServerAudio::refreshUi() { else { m_currentStatus[i] = Status::Stopped; m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); + m_lmsUi->m_showPlayer->cueTrackAtEnd(i); } } else if (m_currentStatus[i] == Status::PlayingFolderLoop) { @@ -227,7 +228,8 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi) connect(m_lmsUi->m_aw, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); connect(m_lmsUi->m_aw, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderChanged(int, Slider, int))); - connect(m_lmsUi->m_showPlayer, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); + connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChangedFaded(int, Slider, int, int)), this, SLOT(uiSliderChangedFaded(int, Slider, int, int))); + connect(m_lmsUi->m_showPlayer, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString))); m_refreshUi = new QTimer(this); connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi())); @@ -298,4 +300,14 @@ void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile) qWarning() << "ui load media error" << result << "file" << mediaFile << "layer" << layer; } } + +void libreMediaServerAudio::uiSliderChangedFaded(int layer, Slider s, int value, int ms) +{ + switch (s){ + case Slider::Volume: + m_mae.volChanged(layer, value, ms); + m_updateUi[layer][0] = value; + break; + } +} #endif diff --git a/src/libremediaserver-audio.h b/src/libremediaserver-audio.h index 8db0c7e..65b5d11 100644 --- a/src/libremediaserver-audio.h +++ b/src/libremediaserver-audio.h @@ -66,6 +66,7 @@ private: private slots: void refreshUi(); void uiSliderChanged(int layer, Slider s, int value); + void uiSliderChangedFaded(int layer, Slider s, int value, int ms); void uiPlaybackChanged(int layer, Status s); void uiLoadMedia(int layer, QString s); diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index 0e54927..9ab9f63 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -434,8 +434,15 @@ ma_result MiniAudioEngine::printFormatInfo(int layer) // Expects between 0 and 65535 vol value void MiniAudioEngine::volChanged(int layer, int vol) +{ + volChanged(layer, vol, FADE_TIME); +} + +// Expects between 0 and 65535 vol value and fade time in milliseconds +void MiniAudioEngine::volChanged(int layer, int vol, int ms) { m_mae.currentStatus[layer].vol = vol; + m_mae.currentStatus[layer].fade = ms; if (m_mae.mediaLoaded[layer] != MA_TRUE) return; if (m_mae.mediaLoaded[layer] == MA_FALSE && m_mae.currentStatus[layer].updated) @@ -445,9 +452,10 @@ void MiniAudioEngine::volChanged(int layer, int vol) db = 0; } else db = ma_volume_db_to_linear(db); - ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, FADE_TIME); + ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, ms); } + void MiniAudioEngine::panChanged(int layer, float value) { float result; @@ -507,7 +515,7 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0.000001f, 0.000000f, FADE_TIME); if (m_mae.currentStatus[layer].cursor > 0) usleep(FADE_TIME * 1500); // avoid glitch when seeking - ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, FADE_TIME * 2); + ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, m_mae.currentStatus[layer].fade); default: break; } diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h index 5fde13e..0a1bca8 100644 --- a/src/miniaudioengine.h +++ b/src/miniaudioengine.h @@ -64,6 +64,7 @@ public: bool startEngine(uint layersQty, uint* audioDevicesID, uint audioDevicesQty); ma_result loadMedia(int layer, char *media); void volChanged(int layer, int vol); + void volChanged(int layer, int vol, int ms); void panChanged(int layer, float pan); void pitchChanged(int layer, float pitch); ma_result playbackChanged(int layer, Status status); diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 3b877df..f3cbedc 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -12,11 +12,12 @@ ShowPlayer::ShowPlayer(QWidget *parent) : 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; + connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(updateIndex(int))); currentStatus = Status::Iddle; - for(int i = 0; i < MAX_LAYERS; i++) + for(int i = 0; i < MAX_LAYERS; i++) { layersUsed[i] = -1; - connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(changeSelectedIndex(int))); + cueTrackWidgetPlaying[i] = nullptr; + } } ShowPlayer::~ShowPlayer() {} @@ -27,48 +28,52 @@ void ShowPlayer::onAddTrack() { void ShowPlayer::go() { - ui->activeCueNumber->display(lastIndex); - CueTrack* current = ui->cueListWidget->getSelectedTrack(); - if (!current) + CueTrack *goCue = ui->cueListWidget->getSelectedTrack(true); + if (!goCue) return; - if (current->audioLayer < 0) - return; - ui->activeCueLabel->setText(current->name.data()); - for (int i = 0; i < MAX_LAYERS; i++) { - if (layersUsed[i] == -1) { - layersUsed[i] = current->userNumber; - break; - } + current[goCue->audioLayer] = goCue; + playCueTrack(goCue); + if (goCue->multi) + go(); +} + +void ShowPlayer::goAction(int c) +{ + if (!current[c]->filePath.empty()) { + emit uiLoadMedia(current[c]->audioLayer, current[c]->filePath.data()); + ui->cueListWidget->cueTrackAtEnd(c); } - if (!current->filePath.empty()) - emit uiLoadMedia(current->audioLayer, current->filePath.data()); - updateTrackStateInEngine(current); - emit uiPlaybackChanged(current->audioLayer, current->status); - filesLoaded++; + updateTrackStateInEngine(current[c]); + emit uiPlaybackChanged(current[c]->audioLayer, current[c]->status); + switch (current[c]->status) { + case Status::PlayingOnce: + case Status::PlayingLoop: + case Status::PlayingFolder: + case Status::PlayingFolderLoop: + case Status::PlayingFolderRandom: + current[c]->active = true; + layersUsed[current[c]->audioLayer] = current[c]->userNumber; + break; + default: + current[c]->active = false; + } + ui->cueListWidget->redrawCueTrackList(); } void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { - emit uiSliderChanged(track->audioLayer, Slider::Volume, track->volume * 655.35); + emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn * 1000); emit uiSliderChanged(track->audioLayer, Slider::Pan, (track->pan + 1) * 128); emit uiSliderChanged(track->audioLayer, Slider::Pitch, track->pitch * 128); emit uiSliderChanged(track->audioLayer, Slider::Bus1, track->bus1 * 255 * 2.55); emit uiSliderChanged(track->audioLayer, Slider::Bus2, track->bus2 * 255 * 2.55); } -void ShowPlayer::changeSelectedIndex(int i) -{ - CueTrack *t = ui->cueListWidget->getTrackAtIndex(i); - ui->nextCueNumber->display(t->userNumber); - ui->nextCueLabel->setText(t->name.data()); - 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()); + ui->cueListWidget->loadCueTrackList(fileName.toStdString()); } void ShowPlayer::saveCueTrackList() @@ -78,3 +83,64 @@ void ShowPlayer::saveCueTrackList() return; ui->cueListWidget->saveCueTrackList(fileName.toStdString()); } + +void ShowPlayer::cueTrackAtEnd(int layer) +{ + current[layer]->active = false; + ui->cueListWidget->cueTrackAtEnd(layer); + removeCueTrackWidget(layer); +} + +void ShowPlayer::cueFinished(int c) +{ + if (!current[c]) + return; + if (!current[c]->stopAtEnd) + this->go(); + if (current[c]->status == Status::Stopped || current[c]->status == Status::Paused) + cueTrackAtEnd(c); +} + +CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) { + QListWidgetItem* item = new QListWidgetItem(ui->activeCueList); + CueTrackWidget* widget = new CueTrackWidget(); + widget->loadCueTrack(track); + connect(widget, SIGNAL(goAction(int)), this, SLOT(goAction(int))); + connect(widget, SIGNAL(cueFinished(int)), this, SLOT(cueFinished(int))); + cueTrackWidgetPlaying[track->audioLayer] = widget; + item->setSizeHint(widget->sizeHint()); + ui->activeCueList->setItemWidget(item, widget); + return (widget); +} + +void ShowPlayer::playCueTrack(CueTrack* track) { + removeCueTrackWidget(track->audioLayer); + CueTrackWidget *widget = addCueTrackWidget(track); + widget->go(); +} + +void ShowPlayer::removeCueTrackWidget(int audioLayer) { + CueTrackWidget* widgetToRemove = cueTrackWidgetPlaying[audioLayer]; + if (widgetToRemove != NULL && ui->activeCueList->count() > 0) { + for (int i = 0; i < ui->activeCueList->count(); ++i) { + QListWidgetItem* item = ui->activeCueList->item(i); + QWidget* widget = ui->activeCueList->itemWidget(item); + if (widget == widgetToRemove) { + ui->activeCueList->removeItemWidget(item); + delete item; + delete widgetToRemove; + break; + } + } + cueTrackWidgetPlaying[audioLayer] = nullptr; + } +} + +void ShowPlayer::updateIndex(int index) { + if (index < 0) + return; + CueTrack *track = ui->cueListWidget->getSelectedTrack(false); + if (track) { + ui->nextCue->loadCueTrack(track); + } +} diff --git a/src/showplayer.h b/src/showplayer.h index 7abec4c..cda63bc 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -9,6 +9,8 @@ #include "defines.h" #include "cuetracklistwidget.h" +#include "cuetrackwidget.h" +#include "dialgroup.h" #include "settings.h" #include "ui_showplayer.h" @@ -24,25 +26,33 @@ public: explicit ShowPlayer(QWidget *parent = nullptr); ~ShowPlayer(); +public slots: + void cueTrackAtEnd(int layer); + private: Ui::ShowPlayer *ui; Status currentStatus = Status::Iddle; - size_t filesLoaded = 0; int layersUsed[MAX_LAYERS]; - int lastIndex = 0; - - void updateTrackStateInEngine(CueTrack *track); + CueTrack *current[MAX_LAYERS]; + CueTrackWidget *cueTrackWidgetPlaying[MAX_LAYERS]; + CueTrackWidget *addCueTrackWidget(CueTrack *track); private slots: + void updateTrackStateInEngine(CueTrack *track); void onAddTrack(); void go(); - void changeSelectedIndex(int i); void loadCueTrackList(); void saveCueTrackList(); + void cueFinished(int channel); + void removeCueTrackWidget(int index); + void playCueTrack(CueTrack *track); + void goAction(int channel); + void updateIndex(int index); signals: void uiPlaybackChanged(int layer, Status s); void uiSliderChanged(int layer, Slider s, int vol); + void uiSliderChangedFaded(int layer, Slider s, int vol, int ms); void uiLoadMedia(int layer, QString s); }; diff --git a/src/showplayer.ui b/src/showplayer.ui index 9f3cd82..42c4603 100644 --- a/src/showplayer.ui +++ b/src/showplayer.ui @@ -6,8 +6,8 @@ 0 0 - 743 - 671 + 800 + 802 @@ -19,137 +19,50 @@ Show Player + + + :/buttons/resources/icon.png:/buttons/resources/icon.png + + + true + + + false + + + false + - - - - 0 - 0 - - - - - 400 - 400 - - - - QFrame::StyledPanel - - - QFrame::Sunken - + Qt::Vertical - - 8 - - - - QFrame::Box - - - QFrame::Raised - - - Qt::Horizontal - - - 8 - - - - - 0 - 0 - - - - Qt::ClickFocus - - - GO - - - Space - - - - - - QLayout::SetMinimumSize - - - 0 - - - - - - - - Active Cue - - - - - - - true - - - - - - - Next Cue - - - - - - - - - 0 - 0 - - - - Qt::ClickFocus - - - ... - - - P - - - - + 0 - QLayout::SetMinimumSize + QLayout::SetDefaultConstraint - 100 + 0 - 100 + 0 + + Load Cue List + - ... + Load CueList - - ../resources/load_button.png../resources/load_button.png + + :/buttons/resources/load_button.png:/buttons/resources/load_button.png @@ -161,12 +74,15 @@ + + Save Cue List + - ... + Save CueList. - - ../resources/save_button.png../resources/save_button.png + + :/buttons/resources/save_button.png:/buttons/resources/save_button.png @@ -184,12 +100,21 @@ + + + 32 + 32 + + + + Copy Cue + - ... + Copy Cue - - ../resources/copy_button.png../resources/copy_button.png + + :/buttons/resources/copy_button.png:/buttons/resources/copy_button.png @@ -202,17 +127,17 @@ - Load Cue List + Cut Cue Load Cue List - ... + Cut Cue - - ../resources/cut_button.png../resources/cut_button.png + + :/buttons/resources/cut_button.png:/buttons/resources/cut_button.png @@ -224,12 +149,15 @@ + + Paste Cue + - ... + Paste Cue - - ../resources/paste_button.png../resources/paste_button.png + + :/buttons/resources/paste_button.png:/buttons/resources/paste_button.png @@ -244,12 +172,15 @@ Qt::NoFocus + + New Cue + - ... + New Cue - - ../resources/new_button.png../resources/new_button.png + + :/buttons/resources/new_button.png:/buttons/resources/new_button.png @@ -264,12 +195,15 @@ Qt::NoFocus + + Edit Cue + - ... + Edit Cue - - ../resources/edit_button.png../resources/edit_button.png + + :/buttons/resources/edit_button.png:/buttons/resources/edit_button.png @@ -284,12 +218,15 @@ Qt::NoFocus + + Remove Cue + - ... + Delete Cue - - ../resources/remove_button.png../resources/remove_button.png + + :/buttons/resources/delete_button.png:/buttons/resources/delete_button.png @@ -301,25 +238,101 @@ - - - true + + + Qt::Horizontal - - - 0 - 0 - - - - Qt::StrongFocus - - - true - - - Qt::ImhPreferLowercase + + + + 0 + 0 + + + + Qt::ClickFocus + + + + + + + :/buttons/resources/go_button.jpeg:/buttons/resources/go_button.jpeg + + + + 120 + 120 + + + + Space + + + true + + + false + + + + + + + 0 + 0 + + + + Qt::ClickFocus + + + ... + + + + :/buttons/resources/panic_button.jpg:/buttons/resources/panic_button.jpg + + + + 96 + 120 + + + + P + + + + + + Qt::Horizontal + + + <html><head/><body><p>Cue List</p></body></html> + + + + + + 0 + 0 + + + + <html><head/><body><p>Cues active</p></body></html> + + + QFrame::Plain + + + QListView::Adjust + + + QListView::SinglePass + + @@ -332,13 +345,20 @@
src/cuetracklistwidget.h
1 + + CueTrackWidget + QWidget +
src/cuetrackwidget.h
+ 1 +
- cueListWidget NewCue EditCue RemoveCue - + + + diff --git a/src/slidergroup.cpp b/src/slidergroup.cpp index 481d554..8e9a3b6 100644 --- a/src/slidergroup.cpp +++ b/src/slidergroup.cpp @@ -38,16 +38,16 @@ SliderGroup::SliderGroup(QString name, "margin: 0px;}" "QSlider::groove:vertical {" "border: 1px solid #999999;" - "width: 25px;" - "margin: -4px;}" + "width: 25px;}" "QSlider::handle:vertical {" "background: white;" - "border: 1px solid #5c5c5c;" + "border: 2px solid #5c5c5c;" "width: 29px;" - "height: 7px;" - "margin: -2px;" + "height: 10px;" "border-radius: 2px;}" - "Qslider::tickmarks:vertical {background: white;" + "Qslider::tickmarks:vertical {" + "background-color: black;" + "background: red;" "color: white;}" "QSlider::add-page:vertical {background: blue;}" "QSlider::sub-page:vertical {background: #20182d;}");