mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-05-19 06:32:34 +02:00
* Fixed a fencepost bug in the 'Render Log' dialog in rdlogedit(1) that caused rendered log to include the cart immediately after the end of the selected section when setting the 'Include' dropdown to 'Only Selected Events'. Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
348 lines
10 KiB
C++
348 lines
10 KiB
C++
// render_dialog.cpp
|
|
//
|
|
// Render Log Dialog for Rivendell.
|
|
//
|
|
// (C) Copyright 2017-2023 Fred Gleason <fredg@paravelsystems.com>
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License version 2 as
|
|
// published by the Free Software Foundation.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public
|
|
// License along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
//
|
|
|
|
#include <QFileDialog>
|
|
|
|
#include <qlineedit.h>
|
|
#include <qmessagebox.h>
|
|
#include <qpushbutton.h>
|
|
|
|
#include <rdconf.h>
|
|
#include <rdrenderer.h>
|
|
|
|
#include "render_dialog.h"
|
|
|
|
RenderDialog::RenderDialog(QWidget *parent)
|
|
: RDDialog(parent)
|
|
{
|
|
render_save_path=RDHomeDir();
|
|
render_first_line=0;
|
|
render_last_line=0;
|
|
|
|
setWindowTitle("RDLogEdit - "+tr("Render Log"));
|
|
|
|
//
|
|
// Fix the Window Size
|
|
//
|
|
setMinimumSize(sizeHint());
|
|
setMaximumSize(sizeHint());
|
|
|
|
//
|
|
// Dialogs
|
|
//
|
|
render_settings_dialog=new RDExportSettingsDialog("RDLogEdit",this);
|
|
render_progress_dialog=
|
|
new QProgressDialog(tr("Rendering Log..."),tr("Cancel"),0,0,this);
|
|
render_progress_dialog->setWindowTitle(tr("Render Progress"));
|
|
render_progress_dialog->setMinimumDuration(1000);
|
|
render_progress_dialog->setAutoClose(true);
|
|
render_progress_dialog->reset();
|
|
render_cut_dialog=new RDCutDialog(NULL,NULL,NULL,false,true,true,"RDLogEdit",
|
|
false,this);
|
|
//
|
|
// Settings
|
|
//
|
|
render_settings=new RDSettings();
|
|
render_settings->setChannels(2);
|
|
render_settings->setSampleRate(rda->system()->sampleRate());
|
|
render_settings->setFormat(RDSettings::Pcm16);
|
|
render_settings->setLayer(2);
|
|
render_settings->setBitRate(256000);
|
|
render_settings->setQuality(3);
|
|
render_settings->setNormalizationLevel(0);
|
|
|
|
//
|
|
// Render To Type
|
|
//
|
|
render_to_box=new QComboBox(this);
|
|
render_to_box->insertItem(0,tr("Cart/Cut"));
|
|
render_to_box->insertItem(1,tr("File"));
|
|
connect(render_to_box,SIGNAL(activated(int)),this,SLOT(toChangedData(int)));
|
|
render_to_label=new QLabel(tr("Render To")+":",this);
|
|
render_to_label->setFont(labelFont());
|
|
render_to_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
|
|
|
//
|
|
// Filename
|
|
//
|
|
render_filename_edit=new QLineEdit(this);
|
|
render_filename_edit->setReadOnly(true);
|
|
connect(render_filename_edit,SIGNAL(textChanged(const QString &)),
|
|
this,SLOT(filenameChangedData(const QString &)));
|
|
render_filename_label=new QLabel(tr("Cart/Cut")+":",this);
|
|
render_filename_label->setFont(labelFont());
|
|
render_filename_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
|
render_filename_button=new QPushButton(tr("Select"),this);
|
|
connect(render_filename_button,SIGNAL(clicked()),this,SLOT(selectData()));
|
|
|
|
//
|
|
// Audio Settings
|
|
//
|
|
render_audiosettings_edit=new QLineEdit(this);
|
|
render_audiosettings_edit->setReadOnly(true);
|
|
render_audiosettings_edit->setText(render_settings->description());
|
|
render_audiosettings_label=new QLabel(tr("Audio Parameters")+":",this);
|
|
render_audiosettings_label->setFont(labelFont());
|
|
render_audiosettings_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
|
render_audiosettings_button=new QPushButton(tr("Set"),this);
|
|
connect(render_audiosettings_button,SIGNAL(clicked()),
|
|
this,SLOT(audiosettingsData()));
|
|
|
|
//
|
|
// Start Time
|
|
//
|
|
render_starttime_box=new QComboBox(this);
|
|
render_starttime_box->insertItem(0,tr("[now]"));
|
|
render_starttime_box->insertItem(1,tr("As Specified"));
|
|
connect(render_starttime_box,SIGNAL(activated(int)),
|
|
this,SLOT(starttimeSourceData(int)));
|
|
render_starttime_label=new QLabel(tr("Virtual Start Time")+":",this);
|
|
render_starttime_label->setFont(labelFont());
|
|
render_starttime_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
|
render_starttime_edit=new QTimeEdit(this);
|
|
render_starttime_edit->setDisplayFormat("hh:mm:ss");
|
|
render_starttime_edit->setDisabled(true);
|
|
|
|
//
|
|
// Include Events
|
|
//
|
|
render_events_box=new QComboBox(this);
|
|
render_events_box->insertItem(0,tr("All Events"));
|
|
render_events_box->insertItem(1,tr("Only Selected Events"));
|
|
render_events_label=new QLabel(tr("Include")+":",this);
|
|
render_events_label->setFont(labelFont());
|
|
render_events_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
|
|
|
//
|
|
// Ignore STOP
|
|
//
|
|
render_ignorestop_box=new QComboBox(this);
|
|
render_ignorestop_box->insertItem(0,tr("Stop Rendering"));
|
|
render_ignorestop_box->insertItem(1,tr("Treat as PLAY"));
|
|
render_ignorestop_label=new QLabel(tr("At STOP transition")+":",this);
|
|
render_ignorestop_label->setFont(labelFont());
|
|
render_ignorestop_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
|
|
|
//
|
|
// Render Button
|
|
//
|
|
render_render_button=new QPushButton(tr("Render"),this);
|
|
render_render_button->
|
|
setGeometry(sizeHint().width()-90,sizeHint().height()-60,80,50);
|
|
render_render_button->setFont(buttonFont());
|
|
render_render_button->setDefault(true);
|
|
connect(render_render_button,SIGNAL(clicked()),this,SLOT(renderData()));
|
|
|
|
//
|
|
// Cancel Button
|
|
//
|
|
render_cancel_button=new QPushButton(tr("Cancel"),this);
|
|
render_cancel_button->
|
|
setGeometry(sizeHint().width()-90,sizeHint().height()-60,80,50);
|
|
render_cancel_button->setFont(buttonFont());
|
|
render_cancel_button->setDefault(true);
|
|
connect(render_cancel_button,SIGNAL(clicked()),this,SLOT(cancelData()));
|
|
}
|
|
|
|
|
|
RenderDialog::~RenderDialog()
|
|
{
|
|
delete render_progress_dialog;
|
|
delete render_settings_dialog;
|
|
}
|
|
|
|
|
|
QSize RenderDialog::sizeHint() const
|
|
{
|
|
return QSize(500,230);
|
|
}
|
|
|
|
|
|
int RenderDialog::exec(RDUser *user,RDLogModel *model,
|
|
int first_line,int last_line)
|
|
{
|
|
render_user=user;
|
|
render_model=model;
|
|
render_first_line=first_line;
|
|
render_last_line=last_line;
|
|
render_filename_edit->clear();
|
|
toChangedData(render_to_box->currentIndex());
|
|
|
|
return QDialog::exec();
|
|
}
|
|
|
|
|
|
void RenderDialog::toChangedData(int item)
|
|
{
|
|
if(item) {
|
|
render_filename_label->setText(tr("Filename")+":");
|
|
render_filename_edit->setReadOnly(false);
|
|
}
|
|
else {
|
|
render_filename_label->setText(tr("Cart/Cut")+":");
|
|
render_filename_edit->setReadOnly(true);
|
|
}
|
|
render_filename_edit->clear();
|
|
render_to_cartnum=0;
|
|
render_to_cutnum=-1;
|
|
render_audiosettings_label->setDisabled(item==0);
|
|
render_audiosettings_edit->setDisabled(item==0);
|
|
render_audiosettings_button->setDisabled(item==0);
|
|
render_render_button->setDisabled(true);
|
|
}
|
|
|
|
|
|
void RenderDialog::filenameChangedData(const QString &str)
|
|
{
|
|
render_render_button->setDisabled(str.isEmpty());
|
|
}
|
|
|
|
|
|
void RenderDialog::selectData()
|
|
{
|
|
if(render_to_box->currentIndex()) {
|
|
QString filename=
|
|
QFileDialog::getSaveFileName(this,tr("Render Log"),
|
|
render_save_path,RD_AUDIO_FILE_FILTER);
|
|
if(!filename.isEmpty()) {
|
|
render_filename_edit->setText(filename);
|
|
filenameChangedData(filename);
|
|
render_save_path=RDGetPathPart(filename);
|
|
}
|
|
}
|
|
else {
|
|
QString cutname;
|
|
if(render_cut_dialog->exec(&cutname)) {
|
|
render_to_cartnum=RDCut::cartNumber(cutname);
|
|
render_to_cutnum=RDCut::cutNumber(cutname);
|
|
render_filename_edit->setText(QString::asprintf("%06u:%03d",
|
|
render_to_cartnum,render_to_cutnum));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void RenderDialog::starttimeSourceData(int item)
|
|
{
|
|
render_starttime_edit->setEnabled(item);
|
|
}
|
|
|
|
|
|
void RenderDialog::audiosettingsData()
|
|
{
|
|
if(render_settings_dialog->exec(render_settings)) {
|
|
render_audiosettings_edit->setText(render_settings->description());
|
|
}
|
|
}
|
|
|
|
|
|
void RenderDialog::lineStartedData(int linno,int totallines)
|
|
{
|
|
render_progress_dialog->setMaximum(totallines);
|
|
render_progress_dialog->setValue(linno);
|
|
}
|
|
|
|
|
|
void RenderDialog::renderData()
|
|
{
|
|
QString err_msg;
|
|
bool result;
|
|
|
|
int first_line=0;
|
|
int last_line=render_model->lineCount();
|
|
if(render_events_box->currentIndex()) {
|
|
first_line=render_first_line;
|
|
last_line=render_last_line;
|
|
}
|
|
QTime start_time=QTime::currentTime();
|
|
if(render_starttime_box->currentIndex()) {
|
|
start_time=render_starttime_edit->time();
|
|
}
|
|
RDRenderer *r=new RDRenderer(this);
|
|
connect(r,SIGNAL(lineStarted(int,int)),this,SLOT(lineStartedData(int,int)));
|
|
connect(render_progress_dialog,SIGNAL(canceled()),r,SLOT(abort()));
|
|
if(render_to_box->currentIndex()) {
|
|
result=
|
|
r->renderToFile(render_filename_edit->text(),render_model,render_settings,
|
|
start_time,render_ignorestop_box->currentIndex(),
|
|
&err_msg,first_line,last_line);
|
|
}
|
|
else {
|
|
result=
|
|
r->renderToCart(render_to_cartnum,render_to_cutnum,render_model,
|
|
render_settings,start_time,
|
|
render_ignorestop_box->currentIndex(),
|
|
&err_msg,first_line,last_line);
|
|
}
|
|
if(!result) {
|
|
QMessageBox::warning(this,"RDLogEdit - "+tr("Rendering Error"),
|
|
err_msg);
|
|
delete r;
|
|
render_progress_dialog->reset();
|
|
return;
|
|
}
|
|
delete r;
|
|
|
|
render_progress_dialog->reset();
|
|
done(true);
|
|
}
|
|
|
|
|
|
void RenderDialog::cancelData()
|
|
{
|
|
render_progress_dialog->reset();
|
|
done(false);
|
|
}
|
|
|
|
|
|
void RenderDialog::closeEvent(QCloseEvent *e)
|
|
{
|
|
cancelData();
|
|
}
|
|
|
|
|
|
void RenderDialog::resizeEvent(QResizeEvent *e)
|
|
{
|
|
render_to_label->setGeometry(10,10,75,20);
|
|
render_to_box->setGeometry(90,10,100,20);
|
|
|
|
render_filename_label->setGeometry(10,40,95,20);
|
|
render_filename_edit->setGeometry(110,40,size().width()-190,20);
|
|
render_filename_button->setGeometry(size().width()-70,38,60,25);
|
|
|
|
render_audiosettings_label->setGeometry(10,70,135,20);
|
|
render_audiosettings_edit->setGeometry(150,70,size().width()-230,20);
|
|
render_audiosettings_button->setGeometry(size().width()-70,68,60,25);
|
|
|
|
render_starttime_label->setGeometry(10,95,135,20);
|
|
render_starttime_box->setGeometry(150,95,160,20);
|
|
render_starttime_edit->setGeometry(315,95,80,20);
|
|
|
|
render_events_label->setGeometry(10,117,135,20);
|
|
render_events_box->setGeometry(150,117,160,20);
|
|
|
|
render_ignorestop_label->setGeometry(10,139,135,20);
|
|
render_ignorestop_box->setGeometry(150,139,160,20);
|
|
|
|
render_render_button->
|
|
setGeometry(size().width()-180,size().height()-60,80,50);
|
|
render_cancel_button->setGeometry(size().width()-90,size().height()-60,80,50);
|
|
}
|