Rivendellaudio/rdadmin/edit_report.cpp
Fred Gleason ac59b52ad0 2019-12-10 Fred Gleason <fredg@paravelsystems.com>
* Fixed a regression in rdadmin(1) that caused controls to be
	hidden in the 'Edit Report' dialog.
2019-12-10 11:27:19 -05:00

618 lines
20 KiB
C++

// edit_report.cpp
//
// Edit a Rivendell Report
//
// (C) Copyright 2002-2019 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 <rd.h>
#include <rdapplication.h>
#include <rddb.h>
#include <rdescape_string.h>
#include <rdtextvalidator.h>
#include "autofill_carts.h"
#include "edit_report.h"
#include "edit_svc_perms.h"
#include "globals.h"
#include "test_import.h"
EditReport::EditReport(QString rptname,QWidget *parent)
: RDDialog(parent)
{
QString sql;
RDSqlQuery *q;
bool ok=false;
//
// Fix the Window Size
//
setMinimumSize(sizeHint());
setMaximumSize(sizeHint());
edit_report=new RDReport(rptname,rda->station(),rda->config());
setWindowTitle("RDAdmin - "+tr("Edit Report")+" "+rptname);
//
// Text Validator
//
RDTextValidator *validator=new RDTextValidator(this);
//
// Report Description
//
edit_description_edit=new QLineEdit(this);
edit_description_edit->setGeometry(200,10,sizeHint().width()-210,19);
edit_description_edit->setMaxLength(64);
QLabel *label=
new QLabel(edit_description_edit,tr("&Report Description:"),this);
label->setGeometry(10,10,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Export Filter Type
//
edit_filter_box=new QComboBox(this);
edit_filter_box->setGeometry(200,31,sizeHint().width()-210,19);
for(int i=0;i<(int)RDReport::LastFilter;i++) {
edit_filter_box->
insertItem(RDReport::filterText((RDReport::ExportFilter)i));
}
label=new QLabel(edit_description_edit,tr("Export &Filter:"),this);
label->setGeometry(10,31,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Station ID
//
edit_stationid_edit=new QLineEdit(this);
edit_stationid_edit->setGeometry(200,52,180,19);
edit_stationid_edit->setMaxLength(16);
edit_stationid_edit->setValidator(validator);
label=new QLabel(edit_stationid_edit,tr("Station ID:"),this);
label->setGeometry(10,52,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Cart Number Parameters
//
label=new QLabel(tr("Cart Number Parameters:"),this);
label->setGeometry(10,73,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
edit_cartzeros_box=new QCheckBox(this);
edit_cartzeros_box->setGeometry(200,75,15,15);
connect(edit_cartzeros_box,SIGNAL(toggled(bool)),
this,SLOT(leadingZerosToggled(bool)));
label=new QLabel(edit_cartzeros_box,tr("Use Leading Zeros"),this);
label->setGeometry(217,73,120,19);
label->setFont(subLabelFont());
label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
edit_cartdigits_spin=new QSpinBox(this);
edit_cartdigits_spin->setGeometry(380,73,40,19);
edit_cartdigits_spin->setRange(1,6);
edit_cartdigits_label=new QLabel(edit_cartdigits_spin,tr("Digits:"),this);
edit_cartdigits_label->setGeometry(330,73,45,19);
edit_cartdigits_label->setFont(subLabelFont());
edit_cartdigits_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Station Type
//
edit_stationtype_box=new QComboBox(this);
edit_stationtype_box->setGeometry(200,94,70,19);
for(int i=0;i<RDReport::TypeLast;i++) {
edit_stationtype_box->
insertItem(RDReport::stationTypeText((RDReport::StationType)i));
}
label=new QLabel(edit_stationtype_box,tr("Station Type:"),this);
label->setGeometry(10,94,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Lines Per Page
//
edit_linesperpage_spin=new QSpinBox(this);
edit_linesperpage_spin->setGeometry(360,94,50,19);
edit_linesperpage_spin->setRange(10,200);
label=new QLabel(edit_linesperpage_spin,tr("Lines per Page:"),this);
label->setGeometry(255,94,100,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
edit_linesperpage_spin->hide();
label->hide();
//
// Service Name
//
edit_servicename_edit=new QLineEdit(this);
edit_servicename_edit->setGeometry(200,115,sizeHint().width()-210,19);
edit_servicename_edit->setMaxLength(64);
label=new QLabel(edit_servicename_edit,tr("Ser&vice Name:"),this);
label->setGeometry(10,115,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Station Format
//
edit_stationformat_edit=new QLineEdit(this);
edit_stationformat_edit->setGeometry(200,136,sizeHint().width()-210,19);
edit_stationformat_edit->setMaxLength(64);
label=new QLabel(edit_stationformat_edit,tr("Station &Format:"),this);
label->setGeometry(10,136,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Linux Export Path
//
edit_path_edit=new QLineEdit(this);
edit_path_edit->setGeometry(200,157,sizeHint().width()-210,19);
edit_path_edit->setMaxLength(255);
edit_path_edit->setValidator(validator);
label=new QLabel(edit_path_edit,tr("Export Path:"),this);
label->setGeometry(10,157,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Linux Post Export Command
//
edit_postexport_cmd_edit=new QLineEdit(this);
edit_postexport_cmd_edit->setGeometry(200,178,sizeHint().width()-210,19);
edit_postexport_cmd_edit->setValidator(validator);
label=new QLabel(edit_path_edit,tr("Post Export Cmd:"),this);
label->setGeometry(10,178,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Type Selectors
//
label=new QLabel(tr("Export Event Types:"),this);
label->setGeometry(10,200,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
edit_traffic_box=new QCheckBox(this);
edit_traffic_box->setGeometry(200,202,15,15);
edit_traffic_label=new QLabel(tr("Traffic"),this);
edit_traffic_label->setGeometry(217,201,80,19);
edit_traffic_label->setFont(subLabelFont());
edit_traffic_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
edit_music_box=new QCheckBox(this);
edit_music_box->setGeometry(300,203,15,15);
edit_music_label=new QLabel(tr("Music"),this);
edit_music_label->setGeometry(317,201,80,19);
edit_music_label->setFont(subLabelFont());
edit_music_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
edit_generic_box=new QCheckBox(this);
edit_generic_box->setGeometry(400,203,15,15);
label=new QLabel(tr("All"),this);
label->setGeometry(417,201,80,19);
label->setFont(subLabelFont());
label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
connect(edit_generic_box,SIGNAL(toggled(bool)),
this,SLOT(genericEventsToggledData(bool)));
//
// Force Event Source Selectors
//
label=new QLabel(tr("Export Events From:"),this);
label->setGeometry(10,222,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
edit_forcetraffic_box=new QCheckBox(this);
edit_forcetraffic_box->setGeometry(200,224,15,15);
label=new QLabel(tr("Traffic Log"),this);
label->setGeometry(217,222,80,19);
label->setFont(subLabelFont());
label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
edit_forcemusic_box=new QCheckBox(this);
edit_forcemusic_box->setGeometry(300,224,15,15);
label=new QLabel(tr("Music Log"),this);
label->setGeometry(317,222,80,19);
label->setFont(subLabelFont());
label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
//
// Include Only On Air Events
//
edit_onairflag_box=new QComboBox(this);
edit_onairflag_box->setGeometry(200,243,60,19);
edit_onairflag_box->insertItem(tr("No"));
edit_onairflag_box->insertItem(tr("Yes"));
label=new QLabel(edit_onairflag_box,tr("Include Only OnAir Events:"),this);
label->setGeometry(10,243,185,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Daypart Filter
//
edit_daypart_check=new QCheckBox(this);
edit_daypart_check->setGeometry(60,273,15,15);
edit_daypart_label=
new QLabel(edit_daypart_check,tr("Filter by Daypart"),this);
edit_daypart_label->setGeometry(edit_daypart_check->geometry().x()+20,273,155,19);
edit_daypart_label->setFont(labelFont());
edit_daypart_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
edit_starttime_edit=new Q3TimeEdit(this);
edit_starttime_edit->setGeometry(150,294,80,20);
edit_starttime_label=new QLabel(edit_starttime_edit,tr("Start Time:"),this);
edit_starttime_label->setGeometry(65,294,80,20);
edit_starttime_label->setFont(labelFont());
edit_starttime_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
edit_endtime_edit=new Q3TimeEdit(this);
edit_endtime_edit->setGeometry(335,294,80,20);
edit_endtime_label=new QLabel(edit_endtime_edit,tr("End Time:"),this);
edit_endtime_label->setGeometry(250,294,80,20);
edit_endtime_label->setFont(labelFont());
edit_endtime_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(edit_daypart_check,SIGNAL(toggled(bool)),
edit_starttime_label,SLOT(setEnabled(bool)));
connect(edit_daypart_check,SIGNAL(toggled(bool)),
edit_starttime_edit,SLOT(setEnabled(bool)));
connect(edit_daypart_check,SIGNAL(toggled(bool)),
edit_endtime_label,SLOT(setEnabled(bool)));
connect(edit_daypart_check,SIGNAL(toggled(bool)),
edit_endtime_edit,SLOT(setEnabled(bool)));
//
// Service Selector
//
edit_service_sel=new RDListSelector(this);
edit_service_sel->setGeometry(75,333,380,80);
edit_service_sel->sourceSetLabel(tr("Available Services"));
edit_service_sel->destSetLabel(tr("Source Services"));
//
// Station Selector
//
edit_station_sel=new RDListSelector(this);
edit_station_sel->setGeometry(75,437,380,80);
/*
setGeometry((sizeHint().width()-edit_station_sel->sizeHint().width())/2,
437,edit_station_sel->sizeHint().width(),
edit_station_sel->sizeHint().height());
*/
edit_station_sel->sourceSetLabel(tr("Available Hosts"));
edit_station_sel->destSetLabel(tr("Source Hosts"));
//
// Group Selector
//
edit_group_sel=new RDListSelector(this);
edit_group_sel->setGeometry(75,553,380,80);
/*
setGeometry((sizeHint().width()-edit_group_sel->sizeHint().width())/2,
553,edit_group_sel->sizeHint().width(),
edit_group_sel->sizeHint().height());
*/
edit_group_sel->sourceSetLabel(tr("Available Groups"));
edit_group_sel->destSetLabel(tr("Allowed Groups"));
edit_group_box=new QCheckBox(this);
edit_group_box->setGeometry(60,531,15,15);
label=new QLabel(edit_group_box,tr("Filter by Groups"),this);
label->setGeometry(edit_group_box->geometry().x()+20,532,155,19);
label->setFont(labelFont());
label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
connect(edit_group_box,SIGNAL(toggled(bool)),
edit_group_sel,SLOT(setEnabled(bool)));
//
// Ok Button
//
QPushButton *button=new QPushButton(this);
button->setGeometry(sizeHint().width()-180,sizeHint().height()-60,80,50);
button->setDefault(true);
button->setFont(buttonFont());
button->setText(tr("&OK"));
connect(button,SIGNAL(clicked()),this,SLOT(okData()));
//
// Cancel Button
//
button=new QPushButton(this);
button->setGeometry(sizeHint().width()-90,sizeHint().height()-60,80,50);
button->setFont(buttonFont());
button->setText(tr("&Cancel"));
connect(button,SIGNAL(clicked()),this,SLOT(cancelData()));
//
// Populate Fields
//
edit_description_edit->setText(edit_report->description());
edit_filter_box->setCurrentItem((int)edit_report->filter());
edit_stationid_edit->setText(edit_report->stationId());
edit_cartzeros_box->setChecked(edit_report->useLeadingZeros());
leadingZerosToggled(edit_cartzeros_box->isChecked());
edit_cartdigits_spin->setValue(edit_report->cartDigits());
edit_stationtype_box->setCurrentItem((int)edit_report->stationType());
edit_servicename_edit->setText(edit_report->serviceName());
edit_stationformat_edit->setText(edit_report->stationFormat());
edit_linesperpage_spin->setValue(edit_report->linesPerPage());
edit_path_edit->setText(edit_report->exportPath(RDReport::Linux));
edit_postexport_cmd_edit->
setText(edit_report->postExportCommand(RDReport::Linux));
edit_traffic_box->
setChecked(edit_report->exportTypeEnabled(RDReport::Traffic));
edit_music_box->
setChecked(edit_report->exportTypeEnabled(RDReport::Music));
edit_generic_box->
setChecked(edit_report->exportTypeEnabled(RDReport::Generic));
edit_forcetraffic_box->
setChecked(edit_report->exportTypeForced(RDReport::Traffic));
edit_forcemusic_box->
setChecked(edit_report->exportTypeForced(RDReport::Music));
genericEventsToggledData(edit_generic_box->isChecked());
if(edit_report->filterOnairFlag()) {
edit_onairflag_box->setCurrentItem(1);
}
else {
edit_onairflag_box->setCurrentItem(0);
}
edit_starttime_edit->setTime(edit_report->startTime(&ok));
edit_starttime_label->setDisabled(ok);
edit_starttime_edit->setDisabled(ok);
edit_endtime_edit->setTime(edit_report->endTime(&ok));
edit_endtime_label->setDisabled(ok);
edit_endtime_edit->setDisabled(ok);
edit_daypart_check->setChecked(!ok);
sql=QString("select SERVICE_NAME from REPORT_SERVICES where ")+
"REPORT_NAME=\""+RDEscapeString(edit_report->name())+"\"";
q=new RDSqlQuery(sql);
while(q->next()) {
edit_service_sel->destInsertItem(q->value(0).toString());
}
delete q;
sql=QString().sprintf("select NAME from SERVICES");
q=new RDSqlQuery(sql);
while(q->next()) {
if(edit_service_sel->destFindItem(q->value(0).toString())==0) {
edit_service_sel->sourceInsertItem(q->value(0).toString());
}
}
delete q;
sql=QString("select STATION_NAME from REPORT_STATIONS where ")+
"REPORT_NAME=\""+RDEscapeString(edit_report->name())+"\"";
q=new RDSqlQuery(sql);
while(q->next()) {
edit_station_sel->destInsertItem(q->value(0).toString());
}
delete q;
sql=QString().sprintf("select NAME from STATIONS");
q=new RDSqlQuery(sql);
while(q->next()) {
if(edit_station_sel->destFindItem(q->value(0).toString())==0) {
edit_station_sel->sourceInsertItem(q->value(0).toString());
}
}
delete q;
edit_group_box->setChecked(edit_report->filterGroups());
edit_group_sel->setEnabled(edit_report->filterGroups());
sql=QString("select GROUP_NAME from REPORT_GROUPS where ")+
"REPORT_NAME=\""+RDEscapeString(edit_report->name())+"\"";
q=new RDSqlQuery(sql);
while(q->next()) {
edit_group_sel->destInsertItem(q->value(0).toString());
}
delete q;
sql=QString().sprintf("select NAME from GROUPS");
q=new RDSqlQuery(sql);
while(q->next()) {
if(edit_group_sel->destFindItem(q->value(0).toString())==0) {
edit_group_sel->sourceInsertItem(q->value(0).toString());
}
}
delete q;
}
EditReport::~EditReport()
{
}
QSize EditReport::sizeHint() const
{
return QSize(530,709);
}
QSizePolicy EditReport::sizePolicy() const
{
return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
}
void EditReport::leadingZerosToggled(bool state)
{
edit_cartdigits_label->setEnabled(state);
edit_cartdigits_spin->setEnabled(state);
}
void EditReport::genericEventsToggledData(bool state)
{
edit_traffic_label->setDisabled(state);
edit_traffic_box->setDisabled(state);
edit_music_label->setDisabled(state);
edit_music_box->setDisabled(state);
}
void EditReport::okData()
{
QString sql;
RDSqlQuery *q;
edit_report->setDescription(edit_description_edit->text());
edit_report->
setFilter((RDReport::ExportFilter)edit_filter_box->currentItem());
edit_report->setStationId(edit_stationid_edit->text());
edit_report->setCartDigits(edit_cartdigits_spin->value());
edit_report->setUseLeadingZeros(edit_cartzeros_box->isChecked());
edit_report->setLinesPerPage(edit_linesperpage_spin->value());
edit_report->
setStationType((RDReport::StationType)edit_stationtype_box->currentItem());
edit_report->setServiceName(edit_servicename_edit->text());
edit_report->setStationFormat(edit_stationformat_edit->text());
edit_report->setExportPath(RDReport::Linux,edit_path_edit->text());
edit_report->
setPostExportCommand(RDReport::Linux,edit_postexport_cmd_edit->text());
edit_report->
setExportTypeEnabled(RDReport::Traffic,edit_traffic_box->isChecked());
edit_report->
setExportTypeEnabled(RDReport::Music,edit_music_box->isChecked());
edit_report->
setExportTypeForced(RDReport::Traffic,edit_forcetraffic_box->isChecked());
edit_report->
setExportTypeForced(RDReport::Music,edit_forcemusic_box->isChecked());
edit_report->
setExportTypeEnabled(RDReport::Generic,edit_generic_box->isChecked());
edit_report->setFilterOnairFlag(edit_onairflag_box->currentItem()==1);
edit_report->setFilterGroups(edit_group_box->isChecked());
if(edit_daypart_check->isChecked()) {
edit_report->setStartTime(edit_starttime_edit->time());
edit_report->setEndTime(edit_endtime_edit->time());
}
else {
edit_report->setStartTime();
edit_report->setEndTime();
}
//
// Add New Services
//
for(unsigned i=0;i<edit_service_sel->destCount();i++) {
sql=QString("select SERVICE_NAME from REPORT_SERVICES where ")+
"REPORT_NAME=\""+RDEscapeString(edit_report->name())+"\" && "+
"SERVICE_NAME=\""+RDEscapeString(edit_service_sel->destText(i))+"\"";
q=new RDSqlQuery(sql);
if(q->size()==0) {
delete q;
sql=QString("insert into REPORT_SERVICES (REPORT_NAME,SERVICE_NAME) ")+
"values (\""+RDEscapeString(edit_report->name())+"\","+
"\""+RDEscapeString(edit_service_sel->destText(i))+"\")";
q=new RDSqlQuery(sql);
}
delete q;
}
//
// Delete Old Services
//
sql=QString("delete from REPORT_SERVICES where ")+
"REPORT_NAME=\""+RDEscapeString(edit_report->name())+"\"";
for(unsigned i=0;i<edit_service_sel->destCount();i++) {
sql+=QString(" && SERVICE_NAME<>\"")+
RDEscapeString(edit_service_sel->destText(i))+"\"";
}
q=new RDSqlQuery(sql);
delete q;
//
// Add New Stations
//
for(unsigned i=0;i<edit_station_sel->destCount();i++) {
sql=QString("select STATION_NAME from REPORT_STATIONS where ")+
"REPORT_NAME=\""+RDEscapeString(edit_report->name())+"\" && "+
"STATION_NAME=\""+RDEscapeString(edit_station_sel->destText(i))+"\"";
q=new RDSqlQuery(sql);
if(q->size()==0) {
delete q;
sql=QString("insert into REPORT_STATIONS (REPORT_NAME,STATION_NAME) ")+
"values (\""+RDEscapeString(edit_report->name())+"\","+
"\""+RDEscapeString(edit_station_sel->destText(i))+"\")";
q=new RDSqlQuery(sql);
}
delete q;
}
//
// Delete Old Stations
//
sql=QString("delete from REPORT_STATIONS where ")+
"REPORT_NAME=\""+RDEscapeString(edit_report->name())+"\"";
for(unsigned i=0;i<edit_station_sel->destCount();i++) {
sql+=QString(" && STATION_NAME<>\"")+
RDEscapeString(edit_station_sel->destText(i))+"\"";
}
q=new RDSqlQuery(sql);
delete q;
//
// Add New Groups
//
for(unsigned i=0;i<edit_group_sel->destCount();i++) {
sql=QString("select GROUP_NAME from REPORT_GROUPS where ")+
"REPORT_NAME=\""+RDEscapeString(edit_report->name())+"\" && "+
"GROUP_NAME=\""+RDEscapeString(edit_group_sel->destText(i))+"\"";
q=new RDSqlQuery(sql);
if(q->size()==0) {
delete q;
sql=QString("insert into REPORT_GROUPS (REPORT_NAME,GROUP_NAME) ")+
"values (\""+RDEscapeString(edit_report->name())+"\","+
"\""+RDEscapeString(edit_group_sel->destText(i))+"\")";
q=new RDSqlQuery(sql);
}
delete q;
}
//
// Delete Old Groups
//
sql=QString("delete from REPORT_GROUPS where ")+
"REPORT_NAME=\""+RDEscapeString(edit_report->name())+"\"";
for(unsigned i=0;i<edit_group_sel->destCount();i++) {
sql+=QString(" && GROUP_NAME<>\"")+
RDEscapeString(edit_group_sel->destText(i))+"\"";
}
q=new RDSqlQuery(sql);
delete q;
done(0);
}
void EditReport::cancelData()
{
done(-1);
}