mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-05-18 22:22:36 +02:00
* Fixed a SQL escaping bug in 'lib/export_resultsrecon.cpp'. * Fixed a SQL escaping bug in 'lib/rdlibrarymodel.cpp'. * Fixed a SQL escaping bug in 'rdlibrary/rdlibrary.cpp'. Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
966 lines
23 KiB
C++
966 lines
23 KiB
C++
// rdlibrary.cpp
|
|
//
|
|
// The Library Utility for Rivendell.
|
|
//
|
|
// (C) Copyright 2002-2021 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 <sys/wait.h>
|
|
|
|
#include <QApplication>
|
|
#include <QMessageBox>
|
|
#include <QShortcut>
|
|
#include <QTranslator>
|
|
|
|
#include <curl/curl.h>
|
|
|
|
#include <rdadd_cart.h>
|
|
#include <rdcart_search_text.h>
|
|
#include <rdconf.h>
|
|
#include <rdescape_string.h>
|
|
#include <rdprofile.h>
|
|
|
|
#include "cdripper.h"
|
|
#include "disk_ripper.h"
|
|
#include "edit_cart.h"
|
|
#include "globals.h"
|
|
#include "list_reports.h"
|
|
#include "rdlibrary.h"
|
|
#include "validate_cut.h"
|
|
|
|
//
|
|
// Global Resources
|
|
//
|
|
RDAudioPort *rdaudioport_conf;
|
|
DiskGauge *disk_gauge;
|
|
RDCut *cut_clipboard=NULL;
|
|
bool audio_changed;
|
|
|
|
//
|
|
// Prototypes
|
|
//
|
|
void SigHandler(int signo);
|
|
|
|
MainWidget::MainWidget(RDConfig *c,QWidget *parent)
|
|
: MainWindow("rdlibrary",c)
|
|
{
|
|
QString err_msg;
|
|
|
|
lib_resize=false;
|
|
profile_ripping=false;
|
|
lib_edit_pending=false;
|
|
lib_user_changed=false;
|
|
|
|
//
|
|
// Fix the Window Size
|
|
//
|
|
setMinimumSize(sizeHint());
|
|
|
|
//
|
|
// Initialize LibCurl
|
|
//
|
|
curl_global_init(CURL_GLOBAL_ALL);
|
|
|
|
//
|
|
// Progress Dialog
|
|
//
|
|
lib_progress_dialog=
|
|
new QProgressDialog(tr("Please Wait..."),tr("Cancel"),0,10,this);
|
|
lib_progress_dialog->setWindowTitle(" ");
|
|
lib_progress_dialog->setValue(10);
|
|
QLabel *label=new QLabel(tr("Please Wait..."),lib_progress_dialog);
|
|
label->setAlignment(Qt::AlignCenter);
|
|
label->setFont(progressFont());
|
|
lib_progress_dialog->setLabel(label);
|
|
lib_progress_dialog->setCancelButton(NULL);
|
|
lib_progress_dialog->setMinimumDuration(2000);
|
|
|
|
//
|
|
// Open the Database
|
|
//
|
|
rda=new RDApplication("RDLibrary","rdlibrary",RDLIBRARY_USAGE,this);
|
|
if(!rda->open(&err_msg)) {
|
|
QMessageBox::critical(this,"RDLibrary - "+tr("Error"),err_msg);
|
|
exit(1);
|
|
}
|
|
setWindowIcon(rda->iconEngine()->applicationIcon(RDIconEngine::RdLibrary,22));
|
|
|
|
//
|
|
// Read Command Options
|
|
//
|
|
for(unsigned i=0;i<rda->cmdSwitch()->keys();i++) {
|
|
if(rda->cmdSwitch()->key(i)=="--profile-ripping") {
|
|
profile_ripping=true;
|
|
rda->cmdSwitch()->setProcessed(i,true);
|
|
}
|
|
if(!rda->cmdSwitch()->processed(i)) {
|
|
QMessageBox::critical(this,"RDLibrary - "+tr("Error"),
|
|
tr("Unknown command option")+": "+
|
|
rda->cmdSwitch()->key(i));
|
|
exit(2);
|
|
}
|
|
}
|
|
|
|
SetCaption("");
|
|
lib_import_path=RDGetHomeDir();
|
|
|
|
//
|
|
// Allocate Global Resources
|
|
//
|
|
rdaudioport_conf=new RDAudioPort(rda->config()->stationName(),
|
|
rda->libraryConf()->inputCard());
|
|
connect(rda,SIGNAL(userChanged()),this,SLOT(userData()));
|
|
connect(rda->ripc(),SIGNAL(notificationReceived(RDNotification *)),
|
|
this,SLOT(notificationReceivedData(RDNotification *)));
|
|
rda->ripc()->
|
|
connectHost("localhost",RIPCD_TCP_PORT,rda->config()->password());
|
|
cut_clipboard=NULL;
|
|
lib_user_timer=new QTimer(this);
|
|
lib_user_timer->setSingleShot(true);
|
|
connect(lib_user_timer,SIGNAL(timeout()),this,SLOT(userData()));
|
|
|
|
//
|
|
// CAE Connection
|
|
//
|
|
connect(rda->cae(),SIGNAL(isConnected(bool)),
|
|
this,SLOT(caeConnectedData(bool)));
|
|
rda->cae()->connectHost();
|
|
|
|
//
|
|
// Filter
|
|
//
|
|
lib_cart_filter=new RDCartFilter(true,false,this);
|
|
connect(rda,SIGNAL(userChanged()),lib_cart_filter,SLOT(changeUser()));
|
|
connect(lib_cart_filter,SIGNAL(selectedGroupChanged(const QString &)),
|
|
this,SLOT(selectedGroupChangedData(const QString &)));
|
|
|
|
//
|
|
// Cart List
|
|
//
|
|
lib_cart_view=new LibraryView(this);
|
|
lib_cart_view->setGeometry(100,0,430,sizeHint().height());
|
|
lib_cart_view->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
lib_cart_view->setWordWrap(false);
|
|
lib_cart_model=new RDLibraryModel(this);
|
|
lib_cart_model->setFont(font());
|
|
lib_cart_model->setPalette(palette());
|
|
lib_cart_filter->setModel(lib_cart_model);
|
|
lib_cart_view->setModel(lib_cart_model);
|
|
lib_cart_view->setSortingEnabled(true);
|
|
lib_cart_view->sortByColumn(0,Qt::AscendingOrder);
|
|
connect(lib_cart_view,SIGNAL(doubleClicked(const QModelIndex &)),
|
|
this,SLOT(cartDoubleClickedData(const QModelIndex &)));
|
|
connect(lib_cart_filter,SIGNAL(dragEnabledChanged(bool)),
|
|
this,SLOT(dragsChangedData(bool)));
|
|
connect(lib_cart_model,SIGNAL(modelReset()),this,SLOT(modelResetData()));
|
|
connect(lib_cart_view->selectionModel(),
|
|
SIGNAL(selectionChanged(const QItemSelection &,const QItemSelection &)),
|
|
this,
|
|
SLOT(selectionChangedData(const QItemSelection &,
|
|
const QItemSelection &)));
|
|
|
|
//
|
|
// Add Button
|
|
//
|
|
lib_add_button=new QPushButton(this);
|
|
lib_add_button->setFont(buttonFont());
|
|
lib_add_button->setText(tr("Add"));
|
|
connect(lib_add_button,SIGNAL(clicked()),this,SLOT(addData()));
|
|
|
|
//
|
|
// Edit Button
|
|
//
|
|
lib_edit_button=new QPushButton(this);
|
|
lib_edit_button->setFont(buttonFont());
|
|
lib_edit_button->setText(tr("Edit"));
|
|
lib_edit_button->setEnabled(false);
|
|
connect(lib_edit_button,SIGNAL(clicked()),this,SLOT(editData()));
|
|
|
|
//
|
|
// Delete Button
|
|
//
|
|
lib_delete_button=new QPushButton(this);
|
|
lib_delete_button->setFont(buttonFont());
|
|
lib_delete_button->setText(tr("Delete"));
|
|
lib_delete_button->setEnabled(false);
|
|
connect(lib_delete_button,SIGNAL(clicked()),this,SLOT(deleteData()));
|
|
|
|
//
|
|
// Run Macro Button
|
|
//
|
|
lib_macro_button=new QPushButton(this);
|
|
lib_macro_button->setFont(buttonFont());
|
|
lib_macro_button->setText(tr("Run\nMacro"));
|
|
lib_macro_button->setEnabled(false);
|
|
lib_macro_button->setVisible(false);
|
|
connect(lib_macro_button,SIGNAL(clicked()),this,SLOT(macroData()));
|
|
|
|
//
|
|
// Disk Gauge
|
|
//
|
|
disk_gauge=new DiskGauge(rda->system()->sampleRate(),
|
|
rda->libraryConf()->defaultChannels(),this);
|
|
|
|
//
|
|
// Rip Button
|
|
//
|
|
lib_rip_button=new QPushButton(this);
|
|
lib_rip_button->setFont(buttonFont());
|
|
lib_rip_button->setText(tr("Rip\nCD"));
|
|
connect(lib_rip_button,SIGNAL(clicked()),this,SLOT(ripData()));
|
|
|
|
//
|
|
// Reports Button
|
|
//
|
|
lib_reports_button=new QPushButton(this);
|
|
lib_reports_button->setFont(buttonFont());
|
|
lib_reports_button->setText(tr("Reports"));
|
|
connect(lib_reports_button,SIGNAL(clicked()),this,SLOT(reportsData()));
|
|
|
|
//
|
|
// Close Button
|
|
//
|
|
lib_close_button=new QPushButton(this);
|
|
lib_close_button->setFont(buttonFont());
|
|
lib_close_button->setText(tr("Close"));
|
|
connect(lib_close_button,SIGNAL(clicked()),this,SLOT(quitMainWidget()));
|
|
|
|
|
|
//
|
|
// Load Output Assignment
|
|
//
|
|
lib_output_card=rda->libraryConf()->outputCard();
|
|
lib_output_port=rda->libraryConf()->outputPort();
|
|
|
|
|
|
//
|
|
// Cart Player
|
|
//
|
|
lib_player=
|
|
new RDSimplePlayer(rda->cae(),rda->ripc(),lib_output_card,lib_output_port,
|
|
0,0,this);
|
|
lib_player->playButton()->setEnabled(false);
|
|
lib_player->stopButton()->setEnabled(false);
|
|
lib_player->stopButton()->setOnColor(Qt::red);
|
|
lib_player->playButton()->setFocusPolicy(Qt::NoFocus);
|
|
lib_player->stopButton()->setFocusPolicy(Qt::NoFocus);
|
|
|
|
QShortcut *lib_player_shortcut=new QShortcut(Qt::Key_Space,this);
|
|
connect(lib_player_shortcut,SIGNAL(activated()),
|
|
this,SLOT(playerShortcutData()));
|
|
|
|
//
|
|
// Setup Signal Handling
|
|
//
|
|
::signal(SIGCHLD,SigHandler);
|
|
|
|
lib_resize=true;
|
|
|
|
//
|
|
// Create RDMacroEvent for running macros
|
|
//
|
|
lib_macro_events=new RDMacroEvent(rda->station()->address(),rda->ripc(),this);
|
|
|
|
dragsChangedData(lib_cart_filter->dragEnabled());
|
|
lib_cart_model->
|
|
setFilterSql(lib_cart_filter->filterSql(),lib_cart_model->cartLimit());
|
|
|
|
LoadGeometry();
|
|
}
|
|
|
|
|
|
QSize MainWidget::sizeHint() const
|
|
{
|
|
return QSize(1010,600);
|
|
}
|
|
|
|
|
|
QSizePolicy MainWidget::sizePolicy() const
|
|
{
|
|
return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
|
|
}
|
|
|
|
|
|
void MainWidget::selectedGroupChangedData(const QString &grpname)
|
|
{
|
|
lib_default_group=grpname;
|
|
}
|
|
|
|
|
|
void MainWidget::caeConnectedData(bool state)
|
|
{
|
|
if(state) {
|
|
QList<int> cards;
|
|
cards.push_back(rda->libraryConf()->inputCard());
|
|
cards.push_back(rda->libraryConf()->outputCard());
|
|
rda->cae()->enableMetering(&cards);
|
|
}
|
|
}
|
|
|
|
|
|
void MainWidget::userData()
|
|
{
|
|
if(lib_edit_pending) {
|
|
lib_user_changed=true;
|
|
return;
|
|
}
|
|
|
|
SetCaption(rda->ripc()->user());
|
|
}
|
|
|
|
|
|
void MainWidget::playerShortcutData()
|
|
{
|
|
if(lib_player->isPlaying()) {
|
|
lib_player->stop();
|
|
}
|
|
else if(lib_player->playButton()->isEnabled()) {
|
|
lib_player->play();
|
|
}
|
|
else if(lib_macro_button->isEnabled()) {
|
|
macroData();
|
|
}
|
|
}
|
|
|
|
void MainWidget::addData()
|
|
{
|
|
QString sql;
|
|
RDSqlQuery *q;
|
|
int cart_num;
|
|
RDCart::Type cart_type=RDCart::All;
|
|
QString cart_title;
|
|
QList<unsigned> cartnums;
|
|
|
|
lib_player->stop();
|
|
LockUser();
|
|
|
|
RDAddCart *add_cart=new RDAddCart(&lib_default_group,&cart_type,&cart_title,
|
|
rda->user()->name(),"RDLibrary",
|
|
rda->system(),this);
|
|
if((cart_num=add_cart->exec())<0) {
|
|
delete add_cart;
|
|
UnlockUser();
|
|
return;
|
|
}
|
|
delete add_cart;
|
|
|
|
sql=QString("insert into `CART` set ")+
|
|
QString::asprintf("`NUMBER`=%u,`TYPE`=%d,",cart_num,cart_type)+
|
|
"`GROUP_NAME`='"+RDEscapeString(lib_default_group)+"',"+
|
|
"`TITLE`='"+RDEscapeString(cart_title)+"'";
|
|
q=new RDSqlQuery(sql);
|
|
delete q;
|
|
|
|
cartnums.push_back(cart_num);
|
|
EditCart *cart=
|
|
new EditCart(cartnums,&lib_import_path,true,profile_ripping,this);
|
|
if(cart->exec()) {
|
|
QModelIndex row=lib_cart_model->addCart(cart_num);
|
|
SelectRow(row);
|
|
SendNotification(RDNotification::AddAction,cart_num);
|
|
}
|
|
else {
|
|
RDCart *rdcart=new RDCart(cart_num);
|
|
rdcart->remove(rda->station(),rda->user(),rda->config());
|
|
delete rdcart;
|
|
}
|
|
delete cart;
|
|
|
|
UnlockUser();
|
|
}
|
|
|
|
|
|
|
|
void MainWidget::editData()
|
|
{
|
|
QModelIndexList carts;
|
|
|
|
if(!CurrentSelection(&carts)) {
|
|
return;
|
|
}
|
|
|
|
lib_player->stop();
|
|
LockUser();
|
|
|
|
QList<unsigned> cartnums;
|
|
for(int i=0;i<carts.size();i++) {
|
|
cartnums.push_back(lib_cart_model->cartNumber(carts.at(i)));
|
|
}
|
|
EditCart *d=
|
|
new EditCart(cartnums,&lib_import_path,false,profile_ripping,this);
|
|
if(d->exec()) {
|
|
for(int i=0;i<carts.size();i++) {
|
|
lib_cart_model->refreshRow(carts.at(i));
|
|
SendNotification(RDNotification::ModifyAction,
|
|
lib_cart_model->cartNumber(carts.at(i)));
|
|
}
|
|
}
|
|
delete d;
|
|
|
|
UnlockUser();
|
|
}
|
|
|
|
|
|
void MainWidget::macroData()
|
|
{
|
|
QModelIndexList carts;
|
|
|
|
if((!CurrentSelection(&carts))||(carts.size()!=1)) {
|
|
return;
|
|
}
|
|
RDCart *rdcart=new RDCart(lib_cart_model->cartNumber(carts.first()));
|
|
lib_macro_events->clear();
|
|
lib_macro_events->load(rdcart->macros());
|
|
lib_macro_events->exec();
|
|
delete rdcart;
|
|
}
|
|
|
|
|
|
void MainWidget::deleteData()
|
|
{
|
|
QString sql;
|
|
RDSqlQuery *q=NULL;
|
|
|
|
lib_player->stop();
|
|
LockUser();
|
|
|
|
QModelIndexList carts;
|
|
|
|
if(!CurrentSelection(&carts)) {
|
|
UnlockUser();
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Get confirmation
|
|
//
|
|
QString str=tr("Are you sure you want to delete cart(s)");
|
|
if(QMessageBox::question(this,tr("Delete Cart(s)"),str,QMessageBox::Yes,
|
|
QMessageBox::No)!=QMessageBox::Yes) {
|
|
UnlockUser();
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Check for RDCatch events
|
|
//
|
|
for(int i=0;i<carts.size();i++) {
|
|
unsigned cartnum=lib_cart_model->cartNumber(carts.at(i));
|
|
sql=QString("select ")+
|
|
"`CUT_NAME` "+ // 00
|
|
"from `RECORDINGS` where "+
|
|
QString::asprintf("(`CUT_NAME` like '%06u_%%')||",cartnum)+
|
|
QString::asprintf("(`MACRO_CART`=%u)",cartnum);
|
|
q=new RDSqlQuery(sql);
|
|
if(q->first()) {
|
|
QString str=tr("Cart")+
|
|
QString::asprintf(" %06u ",cartnum)+
|
|
tr("is used in one or more RDCatch events!")+"\n"+
|
|
tr("Do you still want to delete it?");
|
|
if(QMessageBox::warning(this,"RDLibrary - "+tr("RDCatch Event Exists"),
|
|
str,QMessageBox::Yes,QMessageBox::No)!=
|
|
QMessageBox::Yes) {
|
|
delete q;
|
|
UnlockUser();
|
|
return;
|
|
}
|
|
}
|
|
delete q;
|
|
}
|
|
|
|
//
|
|
// Check clipboard
|
|
//
|
|
if(cut_clipboard!=NULL) {
|
|
for(int i=0;i<carts.size();i++) {
|
|
unsigned cartnum=lib_cart_model->cartNumber(carts.at(i));
|
|
if(cartnum==cut_clipboard->cartNumber()) {
|
|
QString str=tr("Deleting cart")+QString::asprintf(" %06u ",cartnum)+
|
|
tr("will also empty the clipboard.")+"\n"+
|
|
tr("Do you still want to proceed?");
|
|
if(QMessageBox::question(this,"RDLibrary - "+tr("Empty Clipboard"),
|
|
str,QMessageBox::Yes,QMessageBox::No)!=
|
|
QMessageBox::Yes) {
|
|
UnlockUser();
|
|
return;
|
|
}
|
|
}
|
|
delete cut_clipboard;
|
|
cut_clipboard=NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Check for voicetracks
|
|
//
|
|
for(int i=0;i<carts.size();i++) {
|
|
unsigned cartnum=lib_cart_model->cartNumber(carts.at(i));
|
|
if(!lib_cart_model->cartOwnedBy(carts.at(i)).isEmpty()) {
|
|
QString str=tr("Cart")+QString::asprintf(" %06u ",cartnum)+
|
|
tr("is a voicetrack belonging to log")+" \""+
|
|
lib_cart_model->cartOwnedBy(carts.at(i))+"\".\n"+tr("It cannot be deleted here!");
|
|
QMessageBox::information(this,"RDLibrary - "+tr("Voicetrack Found"),str);
|
|
UnlockUser();
|
|
return;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Find row to be selected after deletion
|
|
//
|
|
unsigned newcartnum=0;
|
|
QModelIndex row=lib_cart_model->index(carts.last().row(),0).
|
|
sibling(carts.last().row()+1,0);
|
|
if((!row.isValid())||(row.row()>=lib_cart_model->rowCount())) {
|
|
row=lib_cart_model->index(carts.last().row(),0).
|
|
sibling(carts.first().row()-1,0);
|
|
}
|
|
if(row.isValid()) {
|
|
newcartnum=lib_cart_model->cartNumber(row);
|
|
}
|
|
|
|
//
|
|
// Delete Carts
|
|
//
|
|
for(int i=carts.size()-1;i>=0;i--) {
|
|
RDCart *rdcart=new RDCart(lib_cart_model->cartNumber(carts.at(i)));
|
|
if(!rdcart->remove(rda->station(),rda->user(),rda->config())) {
|
|
QMessageBox::warning(this,tr("RDLibrary"),tr("Unable to delete audio!"));
|
|
return;
|
|
}
|
|
lib_cart_model->removeCart(rdcart->number());
|
|
SendNotification(RDNotification::DeleteAction,rdcart->number());
|
|
delete rdcart;
|
|
}
|
|
|
|
if(newcartnum>0) {
|
|
QModelIndex index=lib_cart_model->cartRow(newcartnum);
|
|
if(index.isValid()) {
|
|
SelectRow(index);
|
|
}
|
|
}
|
|
UnlockUser();
|
|
}
|
|
|
|
|
|
void MainWidget::ripData()
|
|
{
|
|
lib_player->stop();
|
|
LockUser();
|
|
QString group=lib_cart_filter->selectedGroup();
|
|
QString schedcode=lib_cart_filter->selectedSchedCode();
|
|
DiskRipper *dialog=new DiskRipper(&lib_filter_text,&group,&schedcode,
|
|
profile_ripping,this);
|
|
if(dialog->exec()==0) {
|
|
lib_cart_filter->setSelectedGroup(group);
|
|
lib_cart_filter->setFilterText(lib_filter_text);
|
|
}
|
|
delete dialog;
|
|
if(!UnlockUser()) {
|
|
// RefreshList();
|
|
}
|
|
}
|
|
|
|
|
|
void MainWidget::reportsData()
|
|
{
|
|
lib_player->stop();
|
|
LockUser();
|
|
ListReports *lr=
|
|
new ListReports(lib_cart_filter->filterText(),
|
|
lib_cart_filter->selectedGroup(),
|
|
lib_cart_filter->filterSql(),this);
|
|
|
|
lr->exec();
|
|
delete lr;
|
|
UnlockUser();
|
|
}
|
|
|
|
|
|
void MainWidget::cartDoubleClickedData(const QModelIndex &)
|
|
{
|
|
editData();
|
|
}
|
|
|
|
|
|
void MainWidget::selectionChangedData(const QItemSelection &,
|
|
const QItemSelection &)
|
|
{
|
|
QModelIndexList carts;
|
|
QModelIndexList cuts;
|
|
|
|
if(!CurrentSelection(&carts,&cuts)) {
|
|
lib_edit_button->setEnabled(false);
|
|
lib_delete_button->setEnabled(false);
|
|
lib_player->playButton()->setEnabled(false);
|
|
lib_player->stopButton()->setEnabled(false);
|
|
return;
|
|
}
|
|
/*
|
|
printf("CARTS\n");
|
|
for(int i=0;i<carts.size();i++) {
|
|
printf(" %d: %06u\n",i,lib_cart_model->cartNumber(carts.at(i)));
|
|
}
|
|
printf("CUTS\n");
|
|
for(int i=0;i<cuts.size();i++) {
|
|
printf(" %d: %s\n",i,lib_cart_model->cutName(cuts.at(i)).toUtf8().constData());
|
|
}
|
|
printf("\n");
|
|
return;
|
|
*/
|
|
if(carts.size()>0) {
|
|
lib_edit_button->setEnabled(true);
|
|
lib_delete_button->setEnabled(rda->user()->deleteCarts());
|
|
lib_player->playButton()->setEnabled(carts.size()==1);
|
|
lib_player->stopButton()->setEnabled(carts.size()==1);
|
|
lib_player->setCart(lib_cart_model->cartNumber(carts.first()));
|
|
SetPlayer(lib_cart_model->cartType(carts.first()));
|
|
}
|
|
else {
|
|
lib_edit_button->setEnabled(false);
|
|
lib_delete_button->setEnabled(false);
|
|
lib_player->playButton()->setEnabled(cuts.size()==1);
|
|
lib_player->stopButton()->setEnabled(cuts.size()==1);
|
|
if(cuts.size()>=1) {
|
|
lib_player->setCart(lib_cart_model->cartNumber(cuts.first()));
|
|
lib_player->setCut(lib_cart_model->cutName(cuts.first()));
|
|
}
|
|
SetPlayer(lib_cart_model->cartType(cuts.first()));
|
|
}
|
|
lib_macro_button->setEnabled(carts.size()==1);
|
|
}
|
|
|
|
|
|
void MainWidget::modelResetData()
|
|
{
|
|
for(int i=0;i<lib_cart_model->columnCount();i++) {
|
|
lib_cart_view->resizeColumnToContents(i);
|
|
}
|
|
}
|
|
|
|
|
|
void MainWidget::audioChangedData(int state)
|
|
{
|
|
// filterChangedData("");
|
|
}
|
|
|
|
|
|
void MainWidget::macroChangedData(int state)
|
|
{
|
|
// filterChangedData("");
|
|
}
|
|
|
|
|
|
void MainWidget::dragsChangedData(bool state)
|
|
{
|
|
if(state) {
|
|
QModelIndexList rows=lib_cart_view->selectionModel()->selectedRows();
|
|
if(rows.size()>1) {
|
|
SelectRow(rows.first());
|
|
}
|
|
lib_cart_view->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
}
|
|
else {
|
|
lib_cart_view->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
|
}
|
|
lib_cart_view->setDragEnabled(state);
|
|
}
|
|
|
|
|
|
void MainWidget::notificationReceivedData(RDNotification *notify)
|
|
{
|
|
QString sql;
|
|
RDSqlQuery *q=NULL;
|
|
QStringList and_fields;
|
|
|
|
if(notify->type()==RDNotification::CartType) {
|
|
unsigned cartnum=notify->id().toUInt();
|
|
switch(notify->action()) {
|
|
case RDNotification::AddAction:
|
|
and_fields.push_back(QString::asprintf("`CART`.`NUMBER`=%u",cartnum));
|
|
sql=QString("select ")+
|
|
"`CART`.`NUMBER` "+ // 00
|
|
"from `CART` "+
|
|
"left join `GROUPS` on `CART`.`GROUP_NAME`=`GROUPS`.`NAME` "+
|
|
"left join `CUTS` on `CART`.`NUMBER`=`CUTS`.`CART_NUMBER` "+
|
|
lib_cart_filter->filterSql(and_fields);
|
|
q=new RDSqlQuery(sql);
|
|
if(q->first()) {
|
|
lib_cart_model->addCart(cartnum);
|
|
}
|
|
delete q;
|
|
break;
|
|
|
|
case RDNotification::ModifyAction:
|
|
lib_cart_model->refreshCart(cartnum);
|
|
break;
|
|
|
|
case RDNotification::DeleteAction:
|
|
if(lib_edit_pending) {
|
|
lib_deleted_carts.push_back(cartnum);
|
|
}
|
|
else {
|
|
lib_cart_model->removeCart(cartnum);
|
|
}
|
|
break;
|
|
|
|
case RDNotification::NoAction:
|
|
case RDNotification::LastAction:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void MainWidget::quitMainWidget()
|
|
{
|
|
SaveGeometry();
|
|
exit(0);
|
|
}
|
|
|
|
|
|
void MainWidget::closeEvent(QCloseEvent *e)
|
|
{
|
|
quitMainWidget();
|
|
}
|
|
|
|
|
|
void MainWidget::resizeEvent(QResizeEvent *e)
|
|
{
|
|
if(lib_resize) {
|
|
lib_cart_filter->
|
|
setGeometry(0,0,size().width(),lib_cart_filter->sizeHint().height());
|
|
lib_cart_view->
|
|
setGeometry(10,90,e->size().width()-20,e->size().height()-155);
|
|
lib_add_button->setGeometry(10,e->size().height()-60,80,50);
|
|
lib_edit_button->setGeometry(100,e->size().height()-60,80,50);
|
|
lib_delete_button->setGeometry(190,e->size().height()-60,80,50);
|
|
lib_macro_button->setGeometry(290,e->size().height()-60,80,50);
|
|
lib_player->playButton()->setGeometry(290,e->size().height()-60,80,50);
|
|
lib_player->stopButton()->setGeometry(380,e->size().height()-60,80,50);
|
|
disk_gauge->setGeometry(475,e->size().height()-55,
|
|
e->size().width()-765,
|
|
disk_gauge->sizeHint().height());
|
|
lib_rip_button->
|
|
setGeometry(e->size().width()-280,e->size().height()-60,80,50);
|
|
lib_reports_button->
|
|
setGeometry(e->size().width()-190,e->size().height()-60,80,50);
|
|
lib_close_button->setGeometry(e->size().width()-90,e->size().height()-60,
|
|
80,50);
|
|
}
|
|
}
|
|
|
|
|
|
void SigHandler(int signo)
|
|
{
|
|
pid_t pLocalPid;
|
|
|
|
switch(signo) {
|
|
case SIGCHLD:
|
|
pLocalPid=waitpid(-1,NULL,WNOHANG);
|
|
while(pLocalPid>0) {
|
|
pLocalPid=waitpid(-1,NULL,WNOHANG);
|
|
}
|
|
ripper_running=false;
|
|
import_active=false;
|
|
signal(SIGCHLD,SigHandler);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void MainWidget::SetCaption(QString user)
|
|
{
|
|
QString str1;
|
|
QString str2;
|
|
|
|
str1=QString("RDLibrary")+" v"+VERSION+" - "+tr("Host")+":";
|
|
str2=tr("User")+":";
|
|
setWindowTitle(str1+" "+rda->config()->stationName()+", "+str2+" "+user);
|
|
}
|
|
|
|
|
|
int MainWidget::CurrentSelection(QModelIndexList *carts,
|
|
QModelIndexList *cuts) const
|
|
{
|
|
QModelIndexList rows=lib_cart_view->selectionModel()->selectedRows();
|
|
|
|
carts->clear();
|
|
if(cuts!=NULL) {
|
|
cuts->clear();
|
|
}
|
|
for(int i=0;i<rows.size();i++) {
|
|
if(lib_cart_model->isCart(rows.at(i))) {
|
|
carts->push_back(rows.at(i));
|
|
}
|
|
else {
|
|
if(cuts!=NULL) {
|
|
cuts->push_back(rows.at(i));
|
|
}
|
|
}
|
|
}
|
|
if(cuts!=NULL) {
|
|
return (carts->size()>0)||(cuts->size()>0);
|
|
}
|
|
return carts->size()>0;
|
|
}
|
|
|
|
|
|
void MainWidget::SelectRow(const QModelIndex &index)
|
|
{
|
|
if(index.isValid()) {
|
|
lib_cart_view->selectionModel()->
|
|
select(index,QItemSelectionModel::ClearAndSelect|QItemSelectionModel::Rows);
|
|
lib_cart_view->scrollTo(index);
|
|
}
|
|
}
|
|
|
|
|
|
void MainWidget::SelectRow(unsigned cartnum)
|
|
{
|
|
SelectRow(lib_cart_model->cartRow(cartnum));
|
|
}
|
|
|
|
|
|
QString MainWidget::GeometryFile() {
|
|
bool home_found = false;
|
|
QString home = RDGetHomeDir(&home_found);
|
|
if (home_found) {
|
|
return home + "/" + RDLIBRARY_GEOMETRY_FILE;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
void MainWidget::LoadGeometry()
|
|
{
|
|
loadSettings(true);
|
|
lib_cart_filter->setDragEnabled(dragEnabled());
|
|
lib_cart_filter->setShowNoteBubbles(showNoteBubbles());
|
|
}
|
|
|
|
|
|
void MainWidget::SaveGeometry()
|
|
{
|
|
setDragEnabled(lib_cart_filter->dragEnabled());
|
|
setShowNoteBubbles(lib_cart_filter->showNoteBubbles());
|
|
saveSettings();
|
|
}
|
|
|
|
|
|
void MainWidget::LockUser()
|
|
{
|
|
lib_edit_pending=true;
|
|
}
|
|
|
|
|
|
bool MainWidget::UnlockUser()
|
|
{
|
|
//
|
|
// Process Deleted Carts
|
|
//
|
|
for(int i=0;i<lib_deleted_carts.size();i++) {
|
|
lib_cart_model->removeCart(lib_deleted_carts.at(i));
|
|
}
|
|
lib_deleted_carts.clear();
|
|
|
|
//
|
|
// Process User Change
|
|
//
|
|
bool ret=lib_user_changed;
|
|
lib_edit_pending=false;
|
|
if(lib_user_changed) {
|
|
lib_user_timer->start(0);
|
|
lib_user_changed=false;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
void MainWidget::SendNotification(RDNotification::Action action,
|
|
unsigned cartnum)
|
|
{
|
|
RDNotification *notify=
|
|
new RDNotification(RDNotification::CartType,action,QVariant(cartnum));
|
|
rda->ripc()->sendNotification(*notify);
|
|
delete notify;
|
|
}
|
|
|
|
|
|
void MainWidget::SetPlayer(RDCart::Type type)
|
|
{
|
|
switch(type) {
|
|
case RDCart::Audio:
|
|
lib_player->playButton()->show();
|
|
lib_player->stopButton()->show();
|
|
lib_macro_button->hide();
|
|
break;
|
|
|
|
case RDCart::Macro:
|
|
lib_player->playButton()->hide();
|
|
lib_player->stopButton()->hide();
|
|
lib_macro_button->show();
|
|
break;
|
|
|
|
case RDCart::All:
|
|
lib_player->playButton()->hide();
|
|
lib_player->stopButton()->hide();
|
|
lib_macro_button->hide();
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
int main(int argc,char *argv[])
|
|
{
|
|
QApplication::setStyle(RD_GUI_STYLE);
|
|
QApplication a(argc,argv);
|
|
|
|
//
|
|
// Load Translations
|
|
//
|
|
QString loc=RDApplication::locale();
|
|
if(!loc.isEmpty()) {
|
|
QTranslator qt(0);
|
|
qt.load(QString("/usr/share/qt4/translations/qt_")+loc,".");
|
|
a.installTranslator(&qt);
|
|
|
|
QTranslator rd(0);
|
|
rd.load(QString(PREFIX)+QString("/share/rivendell/librd_")+loc,".");
|
|
a.installTranslator(&rd);
|
|
|
|
QTranslator rdhpi(0);
|
|
rdhpi.load(QString(PREFIX)+QString("/share/rivendell/librdhpi_")+loc,".");
|
|
a.installTranslator(&rdhpi);
|
|
|
|
QTranslator tr(0);
|
|
tr.load(QString(PREFIX)+QString("/share/rivendell/rdlibrary_")+loc,".");
|
|
a.installTranslator(&tr);
|
|
}
|
|
|
|
//
|
|
// Start Event Loop
|
|
//
|
|
RDConfig *config=new RDConfig();
|
|
config->load();
|
|
MainWidget *w=new MainWidget(config);
|
|
w->show();
|
|
return a.exec();
|
|
}
|