diff --git a/ChangeLog b/ChangeLog index a9a8bb8d..355da6fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14967,3 +14967,13 @@ * Updated the package version to 2.11.0. 2016-03-20 Fred Gleason * Added a switcher driver for the Broadcast Tools ADMS 44.22. +2016-03-23 Fred Gleason + * Added a 'CART.USE_WEIGHTING' field to the database. + * Added a 'CUTS.PLAY_ORDER' field to the database. + * Incremented the database version to 254. + * Added a 'Schedule Cuts By' control to the Edit Cart dialog in + 'rdlibrary/edit_cart.cpp' and 'rdlibrary/edit_cart.h'. + * Added 'RDCart::useWeighting()' and 'RDCart::setUseWeighting()' + methods in 'lib/rdcart.cpp' and 'lib/rdcart.h'. + * Added 'RDCut::playOrder()' and 'RDCut::setPlayOrder()' methods + in 'lib/rdcut.cpp' and 'lib/rdcut.h'. diff --git a/docs/tables/cart.txt b/docs/tables/cart.txt index 093c6ad5..a0e2cf1d 100644 --- a/docs/tables/cart.txt +++ b/docs/tables/cart.txt @@ -40,6 +40,7 @@ START_DATETIME datetime END_DATETIME datetime ENFORCE_LENGTH enum('N','Y') Timeshift? PRESERVE_PITCH enum('N','Y') Preserve Pitch? +USE_WEIGHTING enum('N','Y') ASYNCRONOUS enum('N','Y') OWNER char(64) From LOGS.NAME or STATIONS.NAME MACROS text RML Macros diff --git a/docs/tables/cuts.txt b/docs/tables/cuts.txt index 8beaa9b0..8689e298 100644 --- a/docs/tables/cuts.txt +++ b/docs/tables/cuts.txt @@ -29,6 +29,7 @@ FRI enum('N','Y') SAT enum('N','Y') ORIGIN_NAME char(64) Workstation ID where recorded WEIGHT int(10) unsigned Relative airplay frequency, 1 = normal +PLAY_ORDER int(11) Play order when weighting disabled LAST_PLAY_DATETIME datetime UPLOAD_DATETIME datetime Copy-split upload timestamp PLAY_COUNTER int(10) unsigned diff --git a/lib/dbversion.h b/lib/dbversion.h index e5e6a64e..c1ab62ce 100644 --- a/lib/dbversion.h +++ b/lib/dbversion.h @@ -26,7 +26,7 @@ /* * Current Database Version */ -#define RD_VERSION_DATABASE 245 +#define RD_VERSION_DATABASE 254 #endif // DBVERSION_H diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index 7cb1fa08..e224912c 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -112,23 +112,30 @@ bool RDCart::selectCut(QString *cut,const QTime &time) const toString("yyyy-MM-dd hh:mm:ss"); QString time_str=QDateTime(current_date,time).toString("hh:mm:ss"); - // if(type()==RDCart::Audio) { switch(type()) { case RDCart::Audio: - sql=QString().sprintf("select CUT_NAME,WEIGHT,LOCAL_COUNTER\ - from CUTS where (((START_DATETIME<=\"%s\")&&\ - (END_DATETIME>=\"%s\"))||\ - (START_DATETIME is null))&&\ - (((START_DAYPART<=\"%s\")&&(END_DAYPART>=\"%s\")||\ - START_DAYPART is null))&&\ - (%s=\"Y\")&&(CART_NUMBER=%u)&&(EVERGREEN=\"N\")&&\ - (LENGTH>0) order by LOCAL_COUNTER", - (const char *)datetime_str, - (const char *)datetime_str, - (const char *)time_str, - (const char *)time_str, - (const char *)RDGetShortDayNameEN(current_date.dayOfWeek()).upper(), - cart_number); + sql=QString("select ")+ + "CUT_NAME,"+ + "PLAY_ORDER,"+ + "WEIGHT,"+ + "LOCAL_COUNTER,"+ + "LAST_PLAY_DATETIME "+ + "from CUTS where ("+ + "((START_DATETIME<=\""+datetime_str+"\")&&"+ + "(END_DATETIME>=\""+datetime_str+"\"))||"+ + "(START_DATETIME is null))&&"+ + "(((START_DAYPART<=\""+time_str+"\")&&"+ + "(END_DAYPART>=\""+time_str+"\")||"+ + "START_DAYPART is null))&&"+ + "("+RDGetShortDayNameEN(current_date.dayOfWeek()).upper()+"=\"Y\")&&"+ + QString().sprintf("(CART_NUMBER=%u)&&(EVERGREEN=\"N\")&&",cart_number)+ + "(LENGTH>0)"; + if(useWeighting()) { + sql+=" order by LOCAL_COUNTER"; + } + else { + sql+=" order by LAST_PLAY_DATETIME desc"; + } q=new RDSqlQuery(sql); cutname=GetNextCut(q); delete q; @@ -142,11 +149,22 @@ bool RDCart::selectCut(QString *cut,const QTime &time) const #ifndef WIN32 // syslog(LOG_USER|LOG_WARNING,"RDCart::selectCut(): no valid cuts, trying evergreen, SQL=%s",(const char *)sql); #endif // WIN32 - sql=QString().sprintf("select CUT_NAME,WEIGHT,LOCAL_COUNTER\ - from CUTS where (CART_NUMBER=%u)&&\ - (EVERGREEN=\"Y\")&&(LENGTH>0) \ - order by LOCAL_COUNTER", - cart_number); + sql=QString("select ")+ + "CUT_NAME,"+ + "PLAY_ORDER,"+ + "WEIGHT,"+ + "LOCAL_COUNTER "+ + "LAST_PLAY_DATETIME "+ + "from CUTS where "+ + QString().sprintf("(CART_NUMBER=%u)&&",cart_number)+ + "(EVERGREEN=\"Y\")&&"+ + "(LENGTH>0)"; + if(useWeighting()) { + sql+=" order by LOCAL_COUNTER"; + } + else { + sql+=" order by LAST_PLAY_DATETIME desc"; + } q=new RDSqlQuery(sql); cutname=GetNextCut(q); delete q; @@ -718,6 +736,20 @@ void RDCart::setEnforceLength(bool state) } +bool RDCart::useWeighting() const +{ + return RDBool(RDGetSqlValue("CART","NUMBER",cart_number, + "USE_WEIGHTING").toString()); +} + + +void RDCart::setUseWeighting(bool state) +{ + SetRow("USE_WEIGHTING",RDYesNo(state)); + metadata_changed=true; +} + + bool RDCart::preservePitch() const { return RDBool(RDGetSqlValue("CART","NUMBER",cart_number, @@ -1214,16 +1246,15 @@ int RDCart::addCut(unsigned format,unsigned bitrate,unsigned chans, if(desc.isEmpty()) { desc=QString().sprintf("Cut %03d",next); } - sql=QString().sprintf("insert into CUTS set CUT_NAME=\"%s\",\ - CART_NUMBER=%d,ISCI=\"%s\",DESCRIPTION=\"%s\",\ - LENGTH=0,CODING_FORMAT=%d,BIT_RATE=%d,CHANNELS=%d", - (const char *)next_name, - cart_number, - (const char *)RDEscapeString(isci), - (const char *)RDEscapeString(desc), - format, - bitrate, - chans); + sql=QString("insert into CUTS set CUT_NAME=\"")+next_name+"\","+ + QString().sprintf("CART_NUMBER=%d,",cart_number)+ + "ISCI=\""+RDEscapeString(isci)+"\","+ + "DESCRIPTION=\""+RDEscapeString(desc)+"\","+ + "LENGTH=0,"+ + QString().sprintf("CODING_FORMAT=%d,",format)+ + QString().sprintf("BIT_RATE=%d,",bitrate)+ + QString().sprintf("CHANNELS=%d,",chans)+ + QString().sprintf("PLAY_ORDER=%d",next); q=new RDSqlQuery(sql); delete q; @@ -1495,13 +1526,36 @@ QString RDCart::GetNextCut(RDSqlQuery *q) const QString cutname; double ratio; double play_ratio=100000000.0; - std::vector eligibles; + int play=RD_MAX_CUT_NUMBER+1; + int last_play; - - while(q->next()) { - if((ratio=q->value(2).toDouble()/q->value(1).toDouble())value(0).toString(); + if(useWeighting()) { + while(q->next()) { + if((ratio=q->value(3).toDouble()/q->value(2).toDouble())value(0).toString(); + } + } + } + else { + if(q->first()) { + last_play=q->value(1).toInt(); + while(q->next()) { + if((q->value(1).toInt()>last_play)&&(q->value(1).toInt()value(1).toInt(); + cutname=q->value(0).toString(); + } + } + if(!cutname.isEmpty()) { + return cutname; + } + } + q->seek(-1); + while(q->next()) { + if(q->value(1).toInt()value(1).toInt(); + cutname=q->value(0).toString(); + } } } return cutname; diff --git a/lib/rdcart.h b/lib/rdcart.h index dcdcc9ff..af34fc84 100644 --- a/lib/rdcart.h +++ b/lib/rdcart.h @@ -119,6 +119,8 @@ class RDCart void setEndDateTime(); bool enforceLength() const; void setEnforceLength(bool state); + bool useWeighting() const; + void setUseWeighting(bool state); bool preservePitch() const; void setPreservePitch(bool state) const; bool asyncronous() const; diff --git a/lib/rdcut.cpp b/lib/rdcut.cpp index f00a86cc..4d8d9c70 100644 --- a/lib/rdcut.cpp +++ b/lib/rdcut.cpp @@ -397,6 +397,19 @@ void RDCut::setWeight(int value) const } +int RDCut::playOrder() const +{ + return RDGetSqlValue("CUTS","CUT_NAME",cut_name,"PLAY_ORDER",cut_db). + toInt(); +} + + +void RDCut::setPlayOrder(int order) const +{ + SetRow("PLAY_ORDER",order); +} + + QDateTime RDCut::lastPlayDatetime(bool *valid) const { return diff --git a/lib/rdcut.h b/lib/rdcut.h index 54ce3e1b..80703c14 100644 --- a/lib/rdcut.h +++ b/lib/rdcut.h @@ -78,6 +78,8 @@ class RDCut void setOriginName(const QString &name) const; unsigned weight() const; void setWeight(int value) const; + int playOrder() const; + void setPlayOrder(int order) const; QDateTime lastPlayDatetime(bool *valid) const; void setLastPlayDatetime(const QDateTime &datetime,bool valid) const; QDateTime uploadDatetime(bool *valid) const; diff --git a/rdadmin/createdb.cpp b/rdadmin/createdb.cpp index 46bbf6b5..2d5e6db9 100644 --- a/rdadmin/createdb.cpp +++ b/rdadmin/createdb.cpp @@ -720,6 +720,7 @@ bool CreateDb(QString name,QString pwd) END_DATETIME DATETIME,\ ENFORCE_LENGTH ENUM('N','Y') DEFAULT 'N',\ PRESERVE_PITCH ENUM('N','Y') DEFAULT 'N',\ + USE_WEIGHTING enum('N','Y') default 'Y',\ ASYNCRONOUS enum('N','Y') default 'N',\ OWNER char(64),\ MACROS text,\ @@ -777,6 +778,7 @@ bool CreateDb(QString name,QString pwd) END_DAYPART TIME,\ ORIGIN_NAME CHAR(64),\ WEIGHT INT UNSIGNED DEFAULT 1,\ + PLAY_ORDER int,\ LAST_PLAY_DATETIME DATETIME,\ UPLOAD_DATETIME datetime,\ PLAY_COUNTER INT UNSIGNED DEFAULT 0,\ @@ -8109,6 +8111,32 @@ int UpdateDb(int ver) delete q; } + /* + * Versions 246 - 253 are reserved + */ + + if(ver<254) { + sql=QString("alter table CART add column ")+ + "USE_WEIGHTING enum('N','Y') default 'Y' after ENFORCE_LENGTH"; + q=new QSqlQuery(sql); + delete q; + + sql=QString("alter table CUTS add column PLAY_ORDER int after WEIGHT"); + q=new QSqlQuery(sql); + delete q; + + sql=QString("select CUT_NAME from CUTS order by CUT_NAME"); + q=new QSqlQuery(sql); + while(q->next()) { + sql=QString("update CUTS set ")+ + "PLAY_ORDER="+q->value(0).toString().right(3)+" "+ + "where CUT_NAME=\""+q->value(0).toString()+"\""; + q1=new QSqlQuery(sql); + delete q1; + } + delete q; + } + // **** End of version updates **** diff --git a/rdlibrary/audio_cart.cpp b/rdlibrary/audio_cart.cpp index 383c6156..802549d4 100644 --- a/rdlibrary/audio_cart.cpp +++ b/rdlibrary/audio_cart.cpp @@ -277,6 +277,31 @@ QSizePolicy AudioCart::sizePolicy() const } +void AudioCart::changeCutScheduling(int sched) +{ + QString sql; + RDSqlQuery *q; + + RDListViewItem *item=(RDListViewItem *)rdcart_cut_list->firstChild(); + while(item!=NULL) { + sql=QString("select PLAY_ORDER,WEIGHT from CUTS where ")+ + "CUT_NAME=\""+item->text(11)+"\""; + q=new RDSqlQuery(sql); + if(q->first()) { + item->setText(0,QString().sprintf("%d",q->value(sched).toInt())); + } + item=(RDListViewItem *)item->nextSibling(); + } + if(sched) { + rdcart_cut_list->setColumnText(0,tr("WT")); + } + else { + rdcart_cut_list->setColumnText(0,tr("ORD")); + } + rdcart_use_weighting=sched!=0; +} + + void AudioCart::addCutData() { QString next_name=RDCut::cutName(rdcart_cart->number(), @@ -526,7 +551,7 @@ void AudioCart::recordCutData() return; } QString cutname=item->text(11); - RecordCut *cut=new RecordCut(rdcart_cart,cutname,this,"cut"); + RecordCut *cut=new RecordCut(rdcart_cart,cutname,rdcart_use_weighting,this); cut->exec(); delete cut; if(cut_clipboard==NULL) { @@ -704,16 +729,16 @@ void AudioCart::RefreshList() q=new RDSqlQuery(sql); while(q->next()) { l=new RDListViewItem(rdcart_cut_list); - l->setText(0,q->value(0).toString()); - l->setText(1,q->value(1).toString()); - l->setText(2,RDGetTimeLength(q->value(2).toUInt())); + // l->setText(0,q->value(0).toString()); + l->setText(1,q->value(2).toString()); + l->setText(2,RDGetTimeLength(q->value(3).toUInt())); if (q->value(0) == 0){// zero weight l->setBackgroundColor(RD_CART_ERROR_COLOR); if(pass==0) { err=true; } } else { - switch(ValidateCut(q,9,RDCart::NeverValid,current_datetime)) { + switch(ValidateCut(q,10,RDCart::NeverValid,current_datetime)) { case RDCart::NeverValid: l->setBackgroundColor(RD_CART_ERROR_COLOR); if(pass==0) { @@ -722,8 +747,8 @@ void AudioCart::RefreshList() break; case RDCart::ConditionallyValid: - if((!q->value(10).isNull())&& - (q->value(10).toDateTime()value(11).isNull())&& + (q->value(11).toDateTime()setBackgroundColor(RD_CART_ERROR_COLOR); } else { @@ -752,40 +777,40 @@ void AudioCart::RefreshList() break; } } - if(q->value(4).toUInt()>0) { - l->setText(3,q->value(3).toDateTime().toString("M/d/yy")); + if(q->value(5).toUInt()>0) { + l->setText(3,q->value(4).toDateTime().toString("M/d/yy")); } else { l->setText(3,tr("Never")); } - l->setText(4,q->value(4).toString()); - if(!q->value(5).toDateTime().isNull()) { - l->setText(5,q->value(6).toString()+" - "+ - q->value(5).toDateTime().toString("M/d/yy hh:mm:ss")); + l->setText(4,q->value(5).toString()); + if(!q->value(6).toDateTime().isNull()) { + l->setText(5,q->value(7).toString()+" - "+ + q->value(6).toDateTime().toString("M/d/yy hh:mm:ss")); } - l->setText(6,q->value(7).toString()); - if(!q->value(11).toDateTime().isNull()) { - l->setText(7,q->value(11).toDateTime().toString("M/d/yyyy hh:mm:ss")); + l->setText(6,q->value(8).toString()); + if(!q->value(12).toDateTime().isNull()) { + l->setText(7,q->value(12).toDateTime().toString("M/d/yyyy hh:mm:ss")); } else { l->setText(7,tr("None")); } - if(!q->value(12).toDateTime().isNull()) { - l->setText(8,q->value(12).toDateTime().toString("M/d/yyyy hh:mm:ss")); + if(!q->value(13).toDateTime().isNull()) { + l->setText(8,q->value(13).toDateTime().toString("M/d/yyyy hh:mm:ss")); } else { l->setText(8,tr("None")); } - if(!q->value(14).isNull()) { - l->setText(9,q->value(13).toTime().toString("hh:mm:ss")); - l->setText(10,q->value(14).toTime().toString("hh:mm:ss")); + if(!q->value(15).isNull()) { + l->setText(9,q->value(15).toTime().toString("hh:mm:ss")); + l->setText(10,q->value(15).toTime().toString("hh:mm:ss")); } else { l->setText(9,tr("None")); l->setText(10,tr("None")); } - l->setText(11,q->value(8).toString()); - total_length+=q->value(2).toUInt(); + l->setText(11,q->value(9).toString()); + total_length+=q->value(3).toUInt(); pass++; } if(q->size()>0) { @@ -815,20 +840,20 @@ void AudioCart::RefreshLine(RDListViewItem *item) "(CUT_NAME=\""+RDEscapeString(cut_name)+"\")"; RDSqlQuery *q=new RDSqlQuery(sql); if(q->first()) { - item->setText(0,q->value(0).toString()); + item->setText(0,q->value(rdcart_use_weighting).toString()); item->setText(1,q->value(1).toString()); item->setText(2,RDGetTimeLength(q->value(2).toUInt())); if (q->value(0) == 0){ //zero weight item->setBackgroundColor(RD_CART_ERROR_COLOR); } else { - switch(ValidateCut(q,9,RDCart::NeverValid,current_datetime)) { + switch(ValidateCut(q,10,RDCart::NeverValid,current_datetime)) { case RDCart::NeverValid: item->setBackgroundColor(RD_CART_ERROR_COLOR); break; case RDCart::ConditionallyValid: - if((!q->value(11).isNull())&& - (q->value(11).toDateTime()value(12).isNull())&& + (q->value(12).toDateTime()setBackgroundColor(RD_CART_ERROR_COLOR); } else { @@ -849,40 +874,40 @@ void AudioCart::RefreshLine(RDListViewItem *item) break; } } - if(q->value(4).toUInt()>0) { - item->setText(3,q->value(3).toDateTime().toString("M/d/yy")); + if(q->value(5).toUInt()>0) { + item->setText(3,q->value(4).toDateTime().toString("M/d/yy")); } else { item->setText(3,tr("Never")); } - item->setText(4,q->value(4).toString()); - if(!q->value(5).toDateTime().isNull()) { - item->setText(5,q->value(6).toString()+" - "+ - q->value(5).toDateTime().toString("M/d/yy hh:mm:ss")); + item->setText(4,q->value(5).toString()); + if(!q->value(6).toDateTime().isNull()) { + item->setText(5,q->value(7).toString()+" - "+ + q->value(6).toDateTime().toString("M/d/yy hh:mm:ss")); } - item->setText(6,q->value(7).toString()); - if(!q->value(11).toDateTime().isNull()) { - item->setText(7,q->value(11).toDateTime().toString("M/d/yyyy hh:mm:ss")); + item->setText(6,q->value(8).toString()); + if(!q->value(12).toDateTime().isNull()) { + item->setText(7,q->value(12).toDateTime().toString("M/d/yyyy hh:mm:ss")); } else { item->setText(7,tr("None")); } - if(!q->value(12).toDateTime().isNull()) { - item->setText(8,q->value(12).toDateTime().toString("M/d/yyyy hh:mm:ss")); + if(!q->value(13).toDateTime().isNull()) { + item->setText(8,q->value(13).toDateTime().toString("M/d/yyyy hh:mm:ss")); } else { item->setText(8,tr("None")); } - if(!q->value(14).isNull()) { - item->setText(9,q->value(13).toTime().toString("hh:mm:ss")); - item->setText(10,q->value(14).toTime().toString("hh:mm:ss")); + if(!q->value(15).isNull()) { + item->setText(9,q->value(14).toTime().toString("hh:mm:ss")); + item->setText(10,q->value(15).toTime().toString("hh:mm:ss")); } else { item->setText(9,tr("None")); item->setText(10,tr("None")); } - item->setText(11,q->value(8).toString()); - total_length+=q->value(2).toUInt(); + item->setText(11,q->value(9).toString()); + total_length+=q->value(3).toUInt(); } if(q->size()>0) { rdcart_average_length=total_length/q->size(); diff --git a/rdlibrary/audio_cart.h b/rdlibrary/audio_cart.h index d4891e6d..38d710b8 100644 --- a/rdlibrary/audio_cart.h +++ b/rdlibrary/audio_cart.h @@ -57,6 +57,9 @@ class AudioCart : public QWidget QSize sizeHint() const; QSizePolicy sizePolicy() const; + public slots: + void changeCutScheduling(int sched); + private slots: void addCutData(); void deleteCutData(); @@ -95,6 +98,7 @@ class AudioCart : public QWidget bool rdcart_modification_allowed; bool rdcart_import_metadata; bool rdcart_profile_rip; + bool rdcart_use_weighting; }; diff --git a/rdlibrary/edit_cart.cpp b/rdlibrary/edit_cart.cpp index 3bbe80d0..6b27f494 100644 --- a/rdlibrary/edit_cart.cpp +++ b/rdlibrary/edit_cart.cpp @@ -20,6 +20,8 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // +#include + #include #include #include @@ -525,6 +527,22 @@ EditCart::EditCart(unsigned number,QString *path,bool new_cart,bool profile_rip, rdcart_use_event_length_label->setAlignment(AlignLeft|ShowPrefix); rdcart_use_event_length_label->hide(); + // + // Cut Scheduling Policy + // + rdcart_cut_sched_box=new QComboBox(this); + rdcart_cut_sched_box->setGeometry(135,348,150,21); + rdcart_cut_sched_box->insertItem(tr("By Specified Order")); + rdcart_cut_sched_box->insertItem(tr("By Weight")); + rdcart_cut_sched_edit=new QLineEdit(this); + rdcart_cut_sched_edit->setGeometry(135,348,150,21); + rdcart_cut_sched_edit->hide(); + QLabel *rdcart_cut_sched_label= + new QLabel(rdcart_cut_sched_box,tr("Schedule Cuts")+":",this); + rdcart_cut_sched_label->setGeometry(10,348,120,19); + rdcart_cut_sched_label->setFont(button_font); + rdcart_cut_sched_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); + // // Notes Button // @@ -559,6 +577,8 @@ EditCart::EditCart(unsigned number,QString *path,bool new_cart,bool profile_rip, rdcart_audio_cart->sizeHint().height()); connect(rdcart_audio_cart,SIGNAL(cartDataChanged()), this,SLOT(cartDataChangedData())); + connect(rdcart_cut_sched_box,SIGNAL(activated(int)), + rdcart_audio_cart,SLOT(changeCutScheduling(int))); rdcart_macro_cart=NULL; break; @@ -629,6 +649,7 @@ EditCart::EditCart(unsigned number,QString *path,bool new_cart,bool profile_rip, switch(rdcart_cart->type()) { case RDCart::Audio: rdcart_type_edit->setText(tr("AUDIO")); + rdcart_audio_cart->changeCutScheduling(rdcart_cart->useWeighting()); break; case RDCart::Macro: @@ -693,6 +714,8 @@ EditCart::EditCart(unsigned number,QString *path,bool new_cart,bool profile_rip, rdcart_syncronous_box->setChecked(rdcart_cart->asyncronous()); rdcart_use_event_length_box-> setChecked(rdcart_cart->useEventLength()); + rdcart_cut_sched_box->setCurrentItem(rdcart_cart->useWeighting()); + rdcart_cut_sched_edit->setText(rdcart_cut_sched_box->currentText()); } else {//multi edit if(rdcart_group_box->count() == 0) { @@ -751,6 +774,14 @@ EditCart::EditCart(unsigned number,QString *path,bool new_cart,bool profile_rip, setRange(rdcart_cart->beatsPerMinute(),rdcart_cart->beatsPerMinute()); rdcart_controls.forced_length_edit->hide(); rdcart_forced_length_ledit->show(); + if(rdcart_cart->type()==RDCart::Audio) { + rdcart_cut_sched_box->hide(); + rdcart_cut_sched_edit->show(); + } + } + if(rdcart_cart->type()==RDCart::Macro) { + rdcart_cut_sched_box->hide(); + rdcart_cut_sched_label->hide(); } } @@ -840,6 +871,35 @@ void EditCart::okData() } } } + if(rdcart_cut_sched_box->currentItem()==0) { + std::vector play_orders; + std::vector order_duplicates; + sql=QString("select PLAY_ORDER from CUTS where ")+ + QString().sprintf("CART_NUMBER=%u",rdcart_cart->number()); + q=new RDSqlQuery(sql); + while(q->next()) { + play_orders.push_back(q->value(0).toInt()); + } + delete q; + for(unsigned i=0;i0) { + QString msg= + tr("The following cut order values are assigned more than once")+ + ":\n"; + for(unsigned i=0;isetGroupName(rdcart_group_box->currentText()); rdcart_cart->calculateAverageLength(&rdcart_length_deviation); rdcart_cart->setLengthDeviation(rdcart_length_deviation); @@ -885,6 +945,9 @@ void EditCart::okData() rdcart_cart->setAsyncronous(rdcart_syncronous_box->isChecked()); rdcart_cart->setUseEventLength(rdcart_use_event_length_box->isChecked()); } + else { + rdcart_cart->setUseWeighting(rdcart_cut_sched_box->currentItem()); + } } else { // Multi Edit it=new QListViewItemIterator(lib_cart_list_edit); diff --git a/rdlibrary/edit_cart.h b/rdlibrary/edit_cart.h index ff979039..26aa3e48 100644 --- a/rdlibrary/edit_cart.h +++ b/rdlibrary/edit_cart.h @@ -54,7 +54,7 @@ class EditCart : public QDialog ~EditCart(); QSize sizeHint() const; QSizePolicy sizePolicy() const; - + private slots: void notesData(); void scriptData(); @@ -79,6 +79,8 @@ class EditCart : public QDialog QComboBox *rdcart_group_box; QLineEdit *rdcart_group_edit; AudioControls rdcart_controls; + QComboBox *rdcart_cut_sched_box; + QLineEdit *rdcart_cut_sched_edit; QCheckBox *rdcart_syncronous_box; QCheckBox *rdcart_use_event_length_box; QLabel *rdcart_syncronous_label; diff --git a/rdlibrary/rdlibrary_cs.ts b/rdlibrary/rdlibrary_cs.ts index 6a19bf68..28f6e260 100644 --- a/rdlibrary/rdlibrary_cs.ts +++ b/rdlibrary/rdlibrary_cs.ts @@ -220,6 +220,10 @@ Do you still want to delete? You must select a single cut! + + ORD + + CdRipper @@ -866,6 +870,26 @@ poznámky Use Event Length for Now && Next Updates + + By Specified Order + + + + By Weight + + + + Schedule Cuts + + + + The following cut order values are assigned more than once + + + + Duplicate Cut Order + + EditMacro @@ -1545,5 +1569,9 @@ Přesto uložit? AES ALARM + + Order + + diff --git a/rdlibrary/rdlibrary_de.ts b/rdlibrary/rdlibrary_de.ts index 73d60f27..8be8a406 100644 --- a/rdlibrary/rdlibrary_de.ts +++ b/rdlibrary/rdlibrary_de.ts @@ -220,6 +220,10 @@ Do you still want to delete? You must select a single cut! + + ORD + + CdRipper @@ -854,6 +858,26 @@ Notes Use Event Length for Now && Next Updates + + By Specified Order + + + + By Weight + + + + Schedule Cuts + + + + The following cut order values are assigned more than once + + + + Duplicate Cut Order + + EditMacro @@ -1522,5 +1546,9 @@ Trotzdem speichern? AES ALARM + + Order + + diff --git a/rdlibrary/rdlibrary_es.ts b/rdlibrary/rdlibrary_es.ts index 815dc319..4396c065 100644 --- a/rdlibrary/rdlibrary_es.ts +++ b/rdlibrary/rdlibrary_es.ts @@ -220,6 +220,10 @@ Do you still want to delete? You must select a single cut! + + ORD + + CdRipper @@ -855,6 +859,26 @@ Notas Use Event Length for Now && Next Updates + + By Specified Order + + + + By Weight + + + + Schedule Cuts + + + + The following cut order values are assigned more than once + + + + Duplicate Cut Order + + EditMacro @@ -1527,5 +1551,9 @@ Do you still want to save? AES ALARM + + Order + + diff --git a/rdlibrary/rdlibrary_fr.ts b/rdlibrary/rdlibrary_fr.ts index 3734ce89..08ab3f5c 100644 --- a/rdlibrary/rdlibrary_fr.ts +++ b/rdlibrary/rdlibrary_fr.ts @@ -198,6 +198,10 @@ Do you still want to delete? You must select a single cut! + + ORD + + CdRipper @@ -728,6 +732,26 @@ Notes Use Event Length for Now && Next Updates + + By Specified Order + + + + By Weight + + + + Schedule Cuts + + + + The following cut order values are assigned more than once + + + + Duplicate Cut Order + + EditMacro @@ -1364,5 +1388,9 @@ Do you still want to save? AES ALARM + + Order + + diff --git a/rdlibrary/rdlibrary_nb.ts b/rdlibrary/rdlibrary_nb.ts index 958ddfa9..c3d592ae 100644 --- a/rdlibrary/rdlibrary_nb.ts +++ b/rdlibrary/rdlibrary_nb.ts @@ -215,6 +215,10 @@ Do you still want to delete? You must select a single cut! + + ORD + + CdRipper @@ -850,6 +854,26 @@ Notes Use Event Length for Now && Next Updates + + By Specified Order + + + + By Weight + + + + Schedule Cuts + + + + The following cut order values are assigned more than once + + + + Duplicate Cut Order + + EditMacro @@ -1518,5 +1542,9 @@ Vil du lagra likevel? AES ALARM + + Order + + diff --git a/rdlibrary/rdlibrary_nn.ts b/rdlibrary/rdlibrary_nn.ts index 958ddfa9..c3d592ae 100644 --- a/rdlibrary/rdlibrary_nn.ts +++ b/rdlibrary/rdlibrary_nn.ts @@ -215,6 +215,10 @@ Do you still want to delete? You must select a single cut! + + ORD + + CdRipper @@ -850,6 +854,26 @@ Notes Use Event Length for Now && Next Updates + + By Specified Order + + + + By Weight + + + + Schedule Cuts + + + + The following cut order values are assigned more than once + + + + Duplicate Cut Order + + EditMacro @@ -1518,5 +1542,9 @@ Vil du lagra likevel? AES ALARM + + Order + + diff --git a/rdlibrary/rdlibrary_pt_BR.ts b/rdlibrary/rdlibrary_pt_BR.ts index ed9a8391..3d6ad76f 100644 --- a/rdlibrary/rdlibrary_pt_BR.ts +++ b/rdlibrary/rdlibrary_pt_BR.ts @@ -216,6 +216,10 @@ Do you still want to delete? You must select a single cut! + + ORD + + CdRipper @@ -852,6 +856,26 @@ limite do sistema! Você ainda quer salvar? Use Event Length for Now && Next Updates + + By Specified Order + + + + By Weight + + + + Schedule Cuts + + + + The following cut order values are assigned more than once + + + + Duplicate Cut Order + + EditMacro @@ -1520,5 +1544,9 @@ Você ainda quer salvar? AES ALARM + + Order + + diff --git a/rdlibrary/record_cut.cpp b/rdlibrary/record_cut.cpp index a3e867a1..614869eb 100644 --- a/rdlibrary/record_cut.cpp +++ b/rdlibrary/record_cut.cpp @@ -37,13 +37,15 @@ #include #include -RecordCut::RecordCut(RDCart *cart,QString cut,QWidget *parent,const char *name) +RecordCut::RecordCut(RDCart *cart,QString cut,bool use_weight, + QWidget *parent,const char *name) : QDialog(parent,name,true) { bool valid; bool is_track=cart->owner().isEmpty(); bool allow_modification=lib_user->modifyCarts()&&is_track; bool allow_editing=lib_user->editAudio()&&is_track; + rec_use_weighting=use_weight; // // Fix the Window Size @@ -507,7 +509,14 @@ RecordCut::RecordCut(RDCart *cart,QString cut,QWidget *parent,const char *name) } cut_isci_edit->setText(rec_cut->isci()); cut_isrc_edit->setText(rec_cut->isrc(RDCut::FormattedIsrc)); - cut_weight_box->setValue(rec_cut->weight()); + if(use_weight) { + cut_weight_label->setText(tr("Weight")); + cut_weight_box->setValue(rec_cut->weight()); + } + else { + cut_weight_label->setText(tr("Order")); + cut_weight_box->setValue(rec_cut->playOrder()); + } if(rec_cut->playCounter()>0) { cut_playdate_edit-> setText(rec_cut->lastPlayDatetime(&valid).toString("M/d/yyyy hh:mm:ss")); @@ -1001,7 +1010,12 @@ void RecordCut::closeData() rec_cut->setOutcue(cut_outcue_edit->text()); rec_cut->setIsrc(isrc); rec_cut->setIsci(cut_isci_edit->text()); - rec_cut->setWeight(cut_weight_box->value()); + if(rec_use_weighting) { + rec_cut->setWeight(cut_weight_box->value()); + } + else { + rec_cut->setPlayOrder(cut_weight_box->value()); + } rec_cut->setLength(rec_length); RDCart *cart=new RDCart(rec_cut->cartNumber()); cart->resetRotation(); diff --git a/rdlibrary/record_cut.h b/rdlibrary/record_cut.h index 3091a6ff..98e039e0 100644 --- a/rdlibrary/record_cut.h +++ b/rdlibrary/record_cut.h @@ -50,7 +50,8 @@ class RecordCut : public QDialog { Q_OBJECT public: - RecordCut(RDCart *cart,QString cut,QWidget *parent=0,const char *name=0); + RecordCut(RDCart *cart,QString cut,bool use_weight,QWidget *parent=0, + const char *name=0); ~RecordCut(); QSize sizeHint() const; QSizePolicy sizePolicy() const; @@ -141,6 +142,7 @@ class RecordCut : public QDialog bool is_closing; QCheckBox *rec_evergreen_box; QLabel *rec_evergreen_label; + bool rec_use_weighting; }; diff --git a/rdlibrary/validate_cut.cpp b/rdlibrary/validate_cut.cpp index bfcc8672..58cf294b 100644 --- a/rdlibrary/validate_cut.cpp +++ b/rdlibrary/validate_cut.cpp @@ -27,10 +27,31 @@ QString ValidateCutFields() { QString sql; - sql=QString("select WEIGHT,DESCRIPTION,LENGTH,LAST_PLAY_DATETIME,")+ - "PLAY_COUNTER,ORIGIN_DATETIME,ORIGIN_NAME,OUTCUE,CUT_NAME,LENGTH,"+ - "EVERGREEN,START_DATETIME,END_DATETIME,START_DAYPART,END_DAYPART,"+ - "MON,TUE,WED,THU,FRI,SAT,SUN from CUTS"; + sql=QString("select ")+ + "PLAY_ORDER,"+ // 00 + "WEIGHT,"+ // 01 + "DESCRIPTION,"+ // 02 + "LENGTH,"+ // 03 + "LAST_PLAY_DATETIME,"+ // 04 + "PLAY_COUNTER,"+ // 03 + "ORIGIN_DATETIME,"+ // 04 + "ORIGIN_NAME,"+ // 05 + "OUTCUE,"+ // 06 + "CUT_NAME,"+ // 07 + "LENGTH,"+ // 08 + "EVERGREEN,"+ // 09 + "START_DATETIME,"+ // 10 + "END_DATETIME,"+ // 11 + "START_DAYPART,"+ // 12 + "END_DAYPART,"+ // 13 + "MON,"+ // 14 + "TUE,"+ // 15 + "WED,"+ // 16 + "THU,"+ // 17 + "FRI,"+ // 18 + "SAT,"+ // 19 + "SUN "+ // 20 + "from CUTS"; return sql; }