2017-09-19 Fred Gleason <fredg@paravelsystems.com>

* Added a 'Render Log' dialog to rdlogedit(1).
This commit is contained in:
Fred Gleason 2017-09-19 07:57:37 -04:00
parent 83cbd0268f
commit 288eddca4c
15 changed files with 559 additions and 18 deletions

View File

@ -16025,3 +16025,5 @@
2017-09-18 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in rdrender that caused the the default start time
to be midnight.
2017-09-19 Fred Gleason <fredg@paravelsystems.com>
* Added a 'Render Log' dialog to rdlogedit(1).

View File

@ -364,6 +364,12 @@ QStringList RDRenderer::warnings() const
}
void RDRenderer::abort()
{
render_abort=true;
}
bool RDRenderer::Render(const QString &outfile,RDLogEvent *log,unsigned chans,
RDSettings *s,const QTime &start_time,bool ignore_stops,
QString *err_msg,int first_line,int last_line,
@ -374,6 +380,7 @@ bool RDRenderer::Render(const QString &outfile,RDLogEvent *log,unsigned chans,
QString temp_output_filename;
render_warnings.clear();
render_abort=false;
//
// Open Output File
@ -445,6 +452,13 @@ bool RDRenderer::Render(const QString &outfile,RDLogEvent *log,unsigned chans,
// Iterate through it
//
for(unsigned i=0;i<lls.size();i++) {
if(render_abort) {
emit lineStarted(lls.size());
*err_msg+="Render aborted.\n";
sf_close(sf_out);
return false;
}
emit lineStarted(i);
if(((first_line==-1)||(first_line<=(int)i))&&
((last_line==-1)||(last_line>(int)i))) {
if(lls.at(i)->transType()==RDLogLine::Stop) {

View File

@ -92,8 +92,12 @@ class RDRenderer : public QObject
const QTime &last_time=QTime());
QStringList warnings() const;
public slots:
void abort();
signals:
void progressMessageSent(const QString &msg);
void lineStarted(int linno);
private:
bool Render(const QString &outfile,RDLogEvent *log,unsigned chans,
@ -116,6 +120,7 @@ class RDRenderer : public QObject
RDSystem *render_system;
RDConfig *render_config;
QStringList render_warnings;
bool render_abort;
};

View File

@ -55,6 +55,7 @@ dist_rdlogedit_SOURCES = add_meta.cpp add_meta.h\
list_logs.cpp list_logs.h\
log_listview.cpp log_listview.h\
rdlogedit.cpp rdlogedit.h globals.h\
render_dialog.cpp render_dialog.h\
voice_tracker.cpp voice_tracker.h
nodist_rdlogedit_SOURCES = moc_add_meta.cpp\
@ -69,6 +70,7 @@ nodist_rdlogedit_SOURCES = moc_add_meta.cpp\
moc_list_reports.cpp\
moc_log_listview.cpp\
moc_rdlogedit.cpp\
moc_render_dialog.cpp\
moc_voice_tracker.cpp
rdlogedit_LDADD = @LIB_RDLIBS@ @LIBVORBIS@

View File

@ -129,6 +129,11 @@ EditLog::EditLog(QString logname,QString *filter,QString *group,
edit_mic16_map=new QPixmap(mic16_xpm);
edit_traffic_map=new QPixmap(traffic_xpm);
//
// Dialogs
//
edit_render_dialog=new RenderDialog(rdstation_conf,rdsystem,log_config,this);
//
// Text Validator
//
@ -453,13 +458,21 @@ EditLog::EditLog(QString logname,QString *filter,QString *group,
connect(edit_save_button,SIGNAL(clicked()),this,SLOT(saveData()));
//
// SaveAs Button
// Save As Button
//
edit_saveas_button=new QPushButton(this);
edit_saveas_button->setFont(button_font);
edit_saveas_button->setText(tr("Save\n&As"));
edit_saveas_button->setText(tr("Save")+"\n"+tr("As"));
connect(edit_saveas_button,SIGNAL(clicked()),this,SLOT(saveasData()));
//
// Render As Button
//
edit_renderas_button=new QPushButton(this);
edit_renderas_button->setFont(button_font);
edit_renderas_button->setText(tr("Render")+"\n"+tr("As"));
connect(edit_renderas_button,SIGNAL(clicked()),this,SLOT(renderasData()));
//
// Reports Button
//
@ -1127,6 +1140,32 @@ ORIGIN_DATETIME=NOW(),LINK_DATETIME=NOW(),SERVICE=\"%s\"",
}
void EditLog::renderasData()
{
int first_line=-1;
int last_line=-1;
QListViewItem *next=edit_log_list->firstChild();
while(next!=NULL) {
if(edit_log_list->isSelected(next)) {
if(next->text(13).toInt()!=END_MARKER_ID) {
if(first_line<0) {
first_line=next->text(14).toInt();
}
last_line=next->text(14).toInt();
}
}
next=next->nextSibling();
}
if(first_line<0) {
edit_render_dialog->exec(rduser,edit_log_event,0,0);
}
else {
edit_render_dialog->exec(rduser,edit_log_event,first_line,last_line+1);
}
}
void EditLog::reportsData()
{
QDate start_date;
@ -1260,10 +1299,11 @@ void EditLog::resizeEvent(QResizeEvent *e)
setGeometry(size().width()-100,size().height()-125,80,50);
edit_save_button->setGeometry(10,size().height()-60,80,50);
edit_saveas_button->setGeometry(100,size().height()-60,80,50);
edit_reports_button->setGeometry(250,size().height()-60,80,50);
edit_renderas_button->setGeometry(190,size().height()-60,80,50);
edit_reports_button->setGeometry(300,size().height()-60,80,50);
#ifndef WIN32
edit_player->playButton()->setGeometry(400,size().height()-60,80,50);
edit_player->stopButton()->setGeometry(490,size().height()-60,80,50);
edit_player->playButton()->setGeometry(410,size().height()-60,80,50);
edit_player->stopButton()->setGeometry(500,size().height()-60,80,50);
#endif // WIN32
edit_ok_button->
setGeometry(size().width()-180,size().height()-60,80,50);

View File

@ -40,8 +40,9 @@
#include <rdgroup_list.h>
#include <rdsimpleplayer.h>
#include <drop_listview.h>
#include <list_reports.h>
#include "drop_listview.h"
#include "list_reports.h"
#include "render_dialog.h"
//
// Widget Settings
@ -84,6 +85,7 @@ class EditLog : public QDialog
void cartDroppedData(int line,RDLogLine *ll);
void saveData();
void saveasData();
void renderasData();
void reportsData();
void okData();
void cancelData();
@ -162,6 +164,7 @@ class EditLog : public QDialog
QPushButton *edit_paste_button;
QPushButton *edit_save_button;
QPushButton *edit_saveas_button;
QPushButton *edit_renderas_button;
QPushButton *edit_reports_button;
RDTransportButton *edit_play_button;
RDTransportButton *edit_stop_button;
@ -183,6 +186,7 @@ class EditLog : public QDialog
QLabel *edit_purgedate_label;
QDateEdit *edit_purgedate_edit;
QPushButton *edit_purgedate_button;
RenderDialog *edit_render_dialog;
};

View File

@ -234,7 +234,7 @@ popisná data</translation>
<message>
<source>Save
&amp;As</source>
<translation>Uložit
<translation type="obsolete">Uložit
&amp;jako</translation>
</message>
<message>
@ -409,6 +409,18 @@ jež jsou pro vybranou službu zakázány!</translation>
<source>Len</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>As</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Render</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditLogLine</name>

View File

@ -234,7 +234,7 @@ einfügen</translation>
<message>
<source>Save
&amp;As</source>
<translation>Speichern
<translation type="obsolete">Speichern
&amp;Als</translation>
</message>
<message>
@ -409,6 +409,18 @@ die für den gewählten Service ungültig sind!</translation>
<source>Len</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>As</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Render</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditLogLine</name>

View File

@ -214,7 +214,7 @@ Meta</translation>
<message>
<source>Save
&amp;As</source>
<translation>Guardar
<translation type="obsolete">Guardar
&amp;como</translation>
</message>
<message>
@ -409,6 +409,18 @@ desactivados para el servicio actual!
<source>Len</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Guardar</translation>
</message>
<message>
<source>As</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Render</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditLogLine</name>

View File

@ -229,11 +229,6 @@ Meta</source>
<source>&amp;Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save
&amp;As</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Reports</source>
<translation type="unfinished"></translation>
@ -400,6 +395,18 @@ for the selected service!</source>
<source>Len</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>As</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Render</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditLogLine</name>

View File

@ -238,7 +238,7 @@ meta</translation>
<message>
<source>Save
&amp;As</source>
<translation>Lagra &amp;som</translation>
<translation type="obsolete">Lagra &amp;som</translation>
</message>
<message>
<source>&amp;Reports</source>
@ -416,6 +416,18 @@ skrudd av for denne tenesta!</translation>
<source>Len</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>As</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Render</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditLogLine</name>

View File

@ -238,7 +238,7 @@ meta</translation>
<message>
<source>Save
&amp;As</source>
<translation>Lagra &amp;som</translation>
<translation type="obsolete">Lagra &amp;som</translation>
</message>
<message>
<source>&amp;Reports</source>
@ -416,6 +416,18 @@ skrudd av for denne tenesta!</translation>
<source>Len</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>As</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Render</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditLogLine</name>

View File

@ -256,7 +256,7 @@ Meta
<message>
<source>Save
&amp;As</source>
<translation>&amp;Salvar
<translation type="obsolete">&amp;Salvar
Como</translation>
</message>
<message>
@ -411,6 +411,18 @@ para o serviço selecionado!</translation>
<source>Len</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>As</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Render</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditLogLine</name>

296
rdlogedit/render_dialog.cpp Normal file
View File

@ -0,0 +1,296 @@
// render_dialog.cpp
//
// Render Log Dialog for Rivendell.
//
// (C) Copyright 2017 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 <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <qfiledialog.h>
#include <qlineedit.h>
#include <qmessagebox.h>
#include <qpushbutton.h>
#include <rd.h>
#include <rdconf.h>
#include <rdexport_settings_dialog.h>
#include <rdrenderer.h>
#include "render_dialog.h"
RenderDialog::RenderDialog(RDStation *station,RDSystem *system,RDConfig *config,
QWidget *parent)
: QDialog(parent)
{
render_station=station;
render_system=system;
render_config=config;
render_save_path=RDHomeDir();
render_first_line=0;
render_last_line=0;
setCaption("RDLogEdit - "+tr("Render Log"));
QFont button_font("helvetica",12,QFont::Bold);
button_font.setPixelSize(12);
//
// Fix the Window Size
//
setMinimumWidth(sizeHint().width());
setMaximumWidth(sizeHint().width());
setMinimumHeight(sizeHint().height());
setMaximumHeight(sizeHint().height());
//
// Dialogs
//
render_progress_dialog=
new QProgressDialog(tr("Rendering Log..."),tr("Cancel"),0,this,"",true);
render_progress_dialog->setCaption("RDLogEdit - "+tr("Render Progress"));
//
// Settings
//
render_settings=new RDSettings();
render_settings->setChannels(2);
render_settings->setSampleRate(render_system->sampleRate());
render_settings->setFormat(RDSettings::Pcm16);
render_settings->setLayer(2);
render_settings->setBitRate(256000);
render_settings->setQuality(3);
render_settings->setNormalizationLevel(0);
//
// Filename
//
render_filename_edit=new QLineEdit(this);
connect(render_filename_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(filenameChangedData(const QString &)));
render_filename_label=new QLabel(tr("Render To File")+":",this);
render_filename_label->setFont(button_font);
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(button_font);
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(tr("[now]"));
render_starttime_box->insertItem(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(button_font);
render_starttime_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
render_starttime_edit=new QTimeEdit(this);
render_starttime_edit->setDisabled(true);
//
// Include Events
//
render_events_box=new QComboBox(this);
render_events_box->insertItem(tr("All Events"));
render_events_box->insertItem(tr("Only Selected Events"));
render_events_label=new QLabel(tr("Include")+":",this);
render_events_label->setFont(button_font);
render_events_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Ignore STOP
//
render_ignorestop_box=new QComboBox(this);
render_ignorestop_box->insertItem(tr("Stop Rendering"));
render_ignorestop_box->insertItem(tr("Treat as PLAY"));
render_ignorestop_label=new QLabel(tr("At STOP transition")+":",this);
render_ignorestop_label->setFont(button_font);
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(button_font);
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(button_font);
render_cancel_button->setDefault(true);
connect(render_cancel_button,SIGNAL(clicked()),this,SLOT(cancelData()));
}
RenderDialog::~RenderDialog()
{
}
QSize RenderDialog::sizeHint() const
{
return QSize(500,200);
}
int RenderDialog::exec(RDUser *user,RDLogEvent *log,
int first_line,int last_line)
{
render_user=user;
render_log=log;
render_first_line=first_line;
render_last_line=last_line;
render_filename_edit->clear();
render_render_button->setDisabled(true);
return QDialog::exec();
}
void RenderDialog::filenameChangedData(const QString &str)
{
render_render_button->setDisabled(str.isEmpty());
}
void RenderDialog::selectData()
{
QString filename=
QFileDialog::getSaveFileName(render_save_path,RD_AUDIO_FILE_FILTER,this,"",
"RDLogEdit - "+tr("Render Log"));
if(!filename.isEmpty()) {
render_filename_edit->setText(filename);
filenameChangedData(filename);
render_save_path=RDGetPathPart(filename);
}
}
void RenderDialog::starttimeSourceData(int item)
{
render_starttime_edit->setEnabled(item);
}
void RenderDialog::audiosettingsData()
{
RDExportSettingsDialog *d=
new RDExportSettingsDialog(render_settings,render_station);
if(d->exec()==0) {
render_audiosettings_edit->setText(render_settings->description());
}
delete d;
}
void RenderDialog::renderData()
{
QString err_msg;
int first_line=0;
int last_line=render_log->size();
if(render_events_box->currentItem()) {
first_line=render_first_line;
last_line=render_last_line;
}
QTime start_time=QTime::currentTime();
if(render_starttime_box->currentItem()) {
start_time=render_starttime_edit->time();
}
RDRenderer *r=
new RDRenderer(render_user,render_station,render_system,render_config,this);
connect(r,SIGNAL(lineStarted(int)),
render_progress_dialog,SLOT(setProgress(int)));
connect(render_progress_dialog,SIGNAL(cancelled()),r,SLOT(abort()));
render_progress_dialog->setTotalSteps(render_log->size());
if(!r->renderToFile(render_filename_edit->text(),render_log,2,render_settings,
start_time,render_ignorestop_box->currentItem(),
&err_msg,first_line,last_line)) {
QMessageBox::warning(this,"RDLogEdit - "+tr("Rendering Error"),
err_msg);
render_progress_dialog->setProgress(render_log->size());
delete r;
return;
}
render_progress_dialog->setProgress(render_log->size());
delete r;
done(true);
}
void RenderDialog::cancelData()
{
done(false);
}
void RenderDialog::closeEvent(QCloseEvent *e)
{
cancelData();
}
void RenderDialog::resizeEvent(QResizeEvent *e)
{
render_filename_label->setGeometry(10,10,95,20);
render_filename_edit->setGeometry(110,10,size().width()-190,20);
render_filename_button->setGeometry(size().width()-70,8,60,25);
render_audiosettings_label->setGeometry(10,40,135,20);
render_audiosettings_edit->setGeometry(150,40,size().width()-230,20);
render_audiosettings_button->setGeometry(size().width()-70,38,60,25);
render_starttime_label->setGeometry(10,62,135,20);
render_starttime_box->setGeometry(150,62,160,20);
render_starttime_edit->setGeometry(315,62,80,20);
render_events_label->setGeometry(10,84,135,20);
render_events_box->setGeometry(150,84,160,20);
render_ignorestop_label->setGeometry(10,106,135,20);
render_ignorestop_box->setGeometry(150,106,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);
}

99
rdlogedit/render_dialog.h Normal file
View File

@ -0,0 +1,99 @@
// render_dialog.h
//
// Log Rendering Dialog for Rivendell.
//
// (C) Copyright 2017 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.
//
#ifndef RENDER_DIALOG_H
#define RENDER_DIALOG_H
#include <qcheckbox.h>
#include <qcombobox.h>
#include <qdatetimeedit.h>
#include <qdialog.h>
#include <qlabel.h>
#include <qlineedit.h>
#include <qprogressdialog.h>
#include <rdbusybar.h>
#include <rdconfig.h>
#include <rdsettings.h>
#include <rdlog_event.h>
#include <rdsystem.h>
#include <rduser.h>
//
// Widget Settings
//
#define IMPORT_BAR_INTERVAL 500
#define IMPORT_TEMP_BASENAME "rdlib"
class RenderDialog : public QDialog
{
Q_OBJECT
public:
RenderDialog(RDStation *station,RDSystem *system,RDConfig *config,
QWidget *parent=0);
~RenderDialog();
QSize sizeHint() const;
public slots:
int exec(RDUser *user,RDLogEvent *log,int first_line,int last_line);
private slots:
void filenameChangedData(const QString &str);
void selectData();
void starttimeSourceData(int item);
void audiosettingsData();
void renderData();
void cancelData();
protected:
void closeEvent(QCloseEvent *e);
void resizeEvent(QResizeEvent *e);
private:
RDStation *render_station;
RDSystem *render_system;
RDConfig *render_config;
RDUser *render_user;
RDLogEvent *render_log;
int render_first_line;
int render_last_line;
RDSettings *render_settings;
QProgressDialog *render_progress_dialog;
QLabel *render_filename_label;
QLineEdit *render_filename_edit;
QLabel *render_starttime_label;
QComboBox *render_starttime_box;
QTimeEdit *render_starttime_edit;
QLabel *render_audiosettings_label;
QLineEdit *render_audiosettings_edit;
QPushButton *render_audiosettings_button;
QLabel *render_events_label;
QComboBox *render_events_box;
QLabel *render_ignorestop_label;
QComboBox *render_ignorestop_box;
QPushButton *render_filename_button;
QPushButton *render_render_button;
QPushButton *render_cancel_button;
QString render_save_path;
};
#endif // RDRENDER_DIALOG_H