You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kaffeine/kaffeine/src/input/dvb/scandialog.cpp

1062 lines
25 KiB

/*
* scandialog.cpp
*
* Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <tqlayout.h>
#include <tqdir.h>
#include <tqpushbutton.h>
#include <tqcheckbox.h>
#include <tqcombobox.h>
#include <tqgroupbox.h>
#include <tqlistview.h>
#include <tqpopupmenu.h>
#include <tqcursor.h>
#include <tqwhatsthis.h>
#include <tqapplication.h>
#include <tqaccel.h>
#include <tdelocale.h>
#include <kiconloader.h>
#include <tdemessagebox.h>
#include "scandialog.h"
#include "channeleditor.h"
#include "dvbsi.h"
DListViewItem::DListViewItem( TQListView *parent, ChannelDesc *desc, TQString label1, TQString label2 )
: TQListViewItem( parent, label1, label2 )
{
chan = desc;
}
ScanDialog::ScanDialog( TQPtrList<DvbStream> *d, TQPtrList<ChannelDesc> *ch, TQSize size, TQString src, const TQString &charset )
{
TQString s;
int i, j;
TQStringList list, tmp;
TDEIconLoader *icon = new TDEIconLoader();
tvPix = icon->loadIcon( "kdvbtv", TDEIcon::Small );
tvcPix = icon->loadIcon( "kdvbtvc", TDEIcon::Small );
raPix = icon->loadIcon( "kdvbra", TDEIcon::Small );
racPix = icon->loadIcon( "kdvbrac", TDEIcon::Small );
chandesc = ch;
dvbsi = 0;
dvb = d;
sourcesPath = src;
defaultCharset = charset;
for ( i=0; i<(int)dvb->count(); i++ ) {
tmp = dvb->at(i)->getSources( true );
for ( j=0; j<(int)tmp.count(); j++ ) {
if ( tmp[j].startsWith( "AUTO" ) )
list.append( TQString("AUTO(%1:%2)").arg(dvb->at(i)->getAdapter()).arg(dvb->at(i)->getTuner()) );
else
list.append( tmp[j] );
}
}
searchComb->insertStringList( list );
setCaption( i18n("Channels") );
transponders.setAutoDelete( true );
TQGridLayout *statLayout = new TQGridLayout( statusFrame, 1, 1, 11, 6 );
TQLabel *lab = new TQLabel( i18n("Signal:"), statusFrame );
statLayout->addWidget( lab, 0, 0 );
signal = new KGradProgress( statusFrame );
statLayout->addWidget( signal, 0, 1 );
lab = new TQLabel( i18n("SNR:"), statusFrame );
statLayout->addWidget( lab, 1, 0 );
snr = new KGradProgress( statusFrame );
statLayout->addWidget( snr, 1, 1 );
lab = new TQLabel( i18n("Tuned:"), statusFrame );
statLayout->addWidget( lab, 2, 0 );
lock = new KLed( statusFrame, "lockLed" );
lock->setState( KLed::Off );
lock->setDarkFactor( 500 );
statLayout->addWidget( lock, 2, 1 );
progress = new TQProgressBar( 100, statusFrame );
progress->setIndicatorFollowsStyle( false );
progress->setProgress( 0 );
statLayout->addMultiCellWidget( progress, 3, 3, 0, 1 );
progressLab = new TQLabel( statusFrame );
statLayout->addMultiCellWidget( progressLab, 4, 4, 0, 1 );
channelsList->clear();
foundList->clear();
foundList->setAllColumnsShowFocus( true );
foundList->setSelectionMode( TQListView::Extended );
channelsList->setSorting( 1 ); // sort by source 1st than channel name
channelsList->setAllColumnsShowFocus( true );
channelsList->setSelectionMode( TQListView::Extended );
ChannelDesc *chan;
TQListViewItem *it;
for ( int i=0; i<(int)chandesc->count(); i++ ) {
chan = chandesc->at(i);
it = new TQListViewItem( channelsList, chan->name, chan->tp.source );
if ( !chan->pix.isNull() )
it->setPixmap( 0, chan->pix );
else {
if ( chan->type==1 ) {
if ( chan->fta )
it->setPixmap( 0, tvcPix );
else
it->setPixmap( 0, tvPix );
}
else {
if ( chan->fta )
it->setPixmap( 0, racPix );
else
it->setPixmap( 0, raPix );
}
}
}
startBtn->setPaletteForegroundColor( TQColor(255,0,0) );
connect( searchComb, TQ_SIGNAL(activated(int)), this, TQ_SLOT(setDvb(int)) );
ds = dvb->at(0);
ds->setScanning( true );
if ( searchComb->currentText().startsWith( "AUTO" ) )
offsetGroup->show();
else
offsetGroup->hide();
bool ok=false;
dvbsi = new DVBsi( &ok, ds->getAdapter(), ds->getTuner(), ds, defaultCharset );
connect( ds, TQ_SIGNAL(snrStatus(int)), snr, TQ_SLOT(setProgress(int)) );
connect( ds, TQ_SIGNAL(signalStatus(int)), signal, TQ_SLOT(setProgress(int)) );
connect( ds, TQ_SIGNAL(lockStatus(bool)), this, TQ_SLOT(setLock(bool)) );
connect( dvbsi, TQ_SIGNAL(end(bool)), this, TQ_SLOT(siEnded(bool)) );
connect( &checkTimer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( checkNewChannel() ) );
connect( &progressTimer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( setProgress() ) );
connect( startBtn, TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(scan(bool)) );
connect( addfilteredBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(addFiltered()) );
connect( addselectedBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(addSelected()) );
connect( channelsList, TQ_SIGNAL(contextMenuRequested(TQListViewItem*,const TQPoint&,int)), this, TQ_SLOT(pop(TQListViewItem*,const TQPoint&,int)) );
connect( channelsList, TQ_SIGNAL(doubleClicked(TQListViewItem*,const TQPoint &,int)), this, TQ_SLOT( slotChannelChanged(TQListViewItem*,const TQPoint &,int) ) );
connect( newBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(newChannel()) );
connect( delBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(deleteAll()) );
connect( selectallBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(selectAll()) );
TQAccel *ac = new TQAccel( channelsList );
ac->insertItem( Key_Delete, 100 );
ac->connectItem( 100, this, TQ_SLOT(deleteChannel()) );
resize( size );
delete icon;
}
void ScanDialog::selectAll()
{
foundList->selectAll( true );
}
void ScanDialog::slotChannelChanged( TQListViewItem *_channel, const TQPoint &, int )
{
if ( !_channel )
return;
TQPixmap pix;
TQString s = _channel->text(0);
if ( edit( s, pix ) ) {
_channel->setText( 0, s );
_channel->setPixmap( 0, pix );
}
}
void ScanDialog::setDvb( int index )
{
int i, pos=0;
TQStringList list;
bool ok=false;
for ( i=0; i<(int)dvb->count(); i++ ) {
list = dvb->at(i)->getSources( true );
pos+= list.count();
if ( index<pos ) {
if ( checkTimer.isActive() )
checkTimer.stop();
if ( progressTimer.isActive() )
progressTimer.stop();
disconnect( ds, TQ_SIGNAL(snrStatus(int)), snr, TQ_SLOT(setProgress(int)) );
disconnect( ds, TQ_SIGNAL(signalStatus(int)), signal, TQ_SLOT(setProgress(int)) );
disconnect( ds, TQ_SIGNAL(lockStatus(bool)), this, TQ_SLOT(setLock(bool)) );
disconnect( dvbsi, TQ_SIGNAL(end(bool)), this, TQ_SLOT(siEnded(bool)) );
ds->setScanning( false );
dvbsi->stop();
delete dvbsi;
ds = dvb->at(i);
ds->setScanning( true );
dvbsi = new DVBsi( &ok, ds->getAdapter(), ds->getTuner(), ds, defaultCharset );
connect( ds, TQ_SIGNAL(snrStatus(int)), snr, TQ_SLOT(setProgress(int)) );
connect( ds, TQ_SIGNAL(signalStatus(int)), signal, TQ_SLOT(setProgress(int)) );
connect( ds, TQ_SIGNAL(lockStatus(bool)), this, TQ_SLOT(setLock(bool)) );
connect( dvbsi, TQ_SIGNAL(end(bool)), this, TQ_SLOT(siEnded(bool)) );
break;
}
}
if ( searchComb->currentText().startsWith( "AUTO" ) )
offsetGroup->show();
else
offsetGroup->hide();
}
void ScanDialog::pop( TQListViewItem *it, const TQPoint &pos, int col )
{
TQPoint p=pos;
if ( !it )
return;
int i=col;
TQPixmap pix;
TQString s = it->text(0);
TQPopupMenu *pop = new TQPopupMenu();
pop->insertItem( i18n("Edit..."), 1 );
pop->insertItem( i18n("Delete"), 2 );
i = 0;
i = pop->exec( TQCursor::pos() );
switch ( i ) {
case 0 :
break;
case 1 :
if ( edit( s, pix ) ) {
it->setText( 0, s );
it->setPixmap( 0, pix );
}
break;
case 2 :
deleteChannel( it->text(0) );
break;
}
delete pop;
}
void ScanDialog::deleteChannel()
{
TQListViewItem *it = channelsList->currentItem();
if ( it )
deleteChannel( it->text(0) );
}
void ScanDialog::deleteChannel( TQString name )
{
int j, i;
TQListViewItem *it;
for ( j=0; j<(int)chandesc->count(); j++ ) {
if ( chandesc->at(j)->name==name ) {
for ( i=0; i<(int)chandesc->count(); i++ ) {
if ( chandesc->at(i)->num==chandesc->count() ) {
chandesc->at(i)->num = chandesc->at(j)->num;
break;
}
}
dvbsi->channels.append( new ChannelDesc( *chandesc->at(j) ) );
addFound( dvbsi->channels.getLast(), false );
chandesc->remove(j);
it = channelsList->firstChild();
while ( it!=0 ) {
if ( name==it->text(0) ) {
channelsList->removeItem( it );
break;
}
it = it->nextSibling();
}
break;
}
}
}
void ScanDialog::newChannel()
{
ChannelDesc chan;
TQStringList list;
//int i;
//for ( i=0; i<(int)searchComb->count(); i++ ) list.append( searchComb->text(i) );
if ( ds->getType()==FE_QPSK )
list.append( searchComb->currentText() );
else
list = ds->getSources();
chandesc->append( new ChannelDesc( chan ) );
chan.tp.type = ds->getType();
chan.num = chandesc->count();
ChannelEditor dlg( list, false, &chan, chandesc, this );
int ret = dlg.exec();
chandesc->remove();
if ( ret==ChannelEditor::Accepted ) {
chandesc->append( new ChannelDesc( chan ) );
TQListViewItem *it = new TQListViewItem( channelsList, chan.name );
if ( chan.type==1 ) {
if ( chan.fta )
it->setPixmap( 0, tvcPix );
else
it->setPixmap( 0, tvPix );
}
else {
if ( chan.fta )
it->setPixmap( 0, racPix );
else
it->setPixmap( 0, raPix );
}
}
}
void ScanDialog::deleteAll()
{
int i, ret;
ret = KMessageBox::questionYesNo( this, i18n("Do you really want to delete all channels?") );
if ( ret!=KMessageBox::Yes )
return;
for ( i=0; i<(int)chandesc->count(); i++ ) {
dvbsi->channels.append( new ChannelDesc( *chandesc->at(i) ) );
addFound( dvbsi->channels.getLast(), false );
}
channelsList->clear();
chandesc->clear();
}
bool ScanDialog::edit( TQString &name, TQPixmap &pix )
{
int j;
ChannelDesc *chan=0;
TQStringList list, tmp;
int i;
for ( i=0; i<(int)dvb->count(); i++ ) {
tmp = dvb->at(i)->getSources();
for ( j=0; j<(int)tmp.count(); j++ )
list.append( tmp[j] );
}
for ( j=0; j<(int)chandesc->count(); j++ ) {
chan = chandesc->at(j);
if ( chan->name==name ) {
j = -1;
break;
}
}
if ( j==-1 ) {
ChannelEditor dlg( list, false, chan, chandesc, this );
int ret = dlg.exec();
if ( ret==ChannelEditor::Accepted ) {
name = chan->name;
if ( chan->type==1 ) {
if ( chan->fta )
pix = tvcPix;
else
pix = tvPix;
}
else {
if ( chan->fta )
pix = racPix;
else
pix = raPix;
}
return true;
}
}
return false;
}
void ScanDialog::parseTp( TQString s, fe_type_t type, TQString src )
{
Transponder *trans;
TQString t;
int pos;
s = s.stripWhiteSpace();
trans = new Transponder();
pos = s.find(" ");
if ( s.left(pos)=="T" ) {
trans->type=FE_OFDM;
trans->source = "Terrestrial";
}
else if ( s.left(pos)=="C" ) {
trans->type=FE_QAM;
trans->source = "Cable";
}
else if ( s.left(pos)=="A" ) {
trans->type=FE_ATSC;
trans->source = "ATSC Terrestrial";
}
else if ( s.left(pos)=="S" ) {
trans->type=FE_QPSK;
trans->source = src;
}
if ( trans->type!=type ) {
delete trans;
return;
}
s = s.right( s.length()-pos-1 );
s = s.stripWhiteSpace();
pos = s.find(" ");
trans->freq = s.left(pos).toULong()/1000;
s = s.right( s.length()-pos-1 );
s = s.stripWhiteSpace();
if ( trans->type!=FE_ATSC )
pos = s.find(" ");
if ( trans->type==FE_QPSK ) {
trans->pol = s.left(pos).lower()[0].latin1();
s = s.right( s.length()-pos-1 );
s = s.stripWhiteSpace();
pos = s.find(" ");
}
if ( trans->type!=FE_OFDM && trans->type!=FE_ATSC ) {
trans->sr = s.left(pos).toULong()/1000;
}
else {
if ( s.left(pos)=="8MHz" )
trans->bandwidth = BANDWIDTH_8_MHZ;
else if ( s.left(pos)=="7MHz" )
trans->bandwidth = BANDWIDTH_7_MHZ;
else if ( s.left(pos)=="6MHz" )
trans->bandwidth = BANDWIDTH_6_MHZ;
else
trans->bandwidth = BANDWIDTH_AUTO;
}
if ( trans->type==FE_ATSC ) {
if ( s.left(pos)=="8VSB" )
trans->modulation = VSB_8;
else if ( s.left(pos)=="16VSB" )
trans->modulation = VSB_16;
else if ( s.left(pos)=="QAM16" )
trans->modulation = QAM_16;
else if ( s.left(pos)=="QAM32" )
trans->modulation = QAM_32;
else if ( s.left(pos)=="QAM64" )
trans->modulation = QAM_64;
else if ( s.left(pos)=="QAM128" )
trans->modulation = QAM_128;
else if ( s.left(pos)=="QAM256" )
trans->modulation = QAM_256;
else
trans->modulation = QAM_AUTO;
transponders.append( trans );
return;
}
s = s.right( s.length()-pos-1 );
s = s.stripWhiteSpace();
pos = s.find(" ");
if ( s.left(pos)=="1/2" )
trans->coderateH = FEC_1_2;
else if ( s.left(pos)=="2/3" )
trans->coderateH = FEC_2_3;
else if ( s.left(pos)=="3/4" )
trans->coderateH = FEC_3_4;
else if ( s.left(pos)=="4/5" )
trans->coderateH = FEC_4_5;
else if ( s.left(pos)=="5/6" )
trans->coderateH = FEC_5_6;
else if ( s.left(pos)=="6/7" )
trans->coderateH = FEC_6_7;
else if ( s.left(pos)=="7/8" )
trans->coderateH = FEC_7_8;
else if ( s.left(pos)=="8/9" )
trans->coderateH = FEC_8_9;
else if ( s.left(pos)=="NONE" )
trans->coderateH = FEC_NONE;
else
trans->coderateH = FEC_AUTO;
s = s.right( s.length()-pos-1 );
s = s.stripWhiteSpace();
pos = s.find(" ");
if ( trans->type==FE_OFDM ) {
if ( s.left(pos)=="1/2" )
trans->coderateL = FEC_1_2;
else if ( s.left(pos)=="2/3" )
trans->coderateL = FEC_2_3;
else if ( s.left(pos)=="3/4" )
trans->coderateL = FEC_3_4;
else if ( s.left(pos)=="4/5" )
trans->coderateL = FEC_4_5;
else if ( s.left(pos)=="5/6" )
trans->coderateL = FEC_5_6;
else if ( s.left(pos)=="6/7" )
trans->coderateL = FEC_6_7;
else if ( s.left(pos)=="7/8" )
trans->coderateL = FEC_7_8;
else if ( s.left(pos)=="8/9" )
trans->coderateL = FEC_8_9;
else if ( s.left(pos)=="NONE" )
trans->coderateL = FEC_NONE;
else
trans->coderateL = FEC_AUTO;
if ( trans->coderateH==FEC_NONE )
trans->coderateH = FEC_AUTO;
if ( trans->coderateL==FEC_NONE )
trans->coderateL = FEC_AUTO;
s = s.right( s.length()-pos-1 );
s = s.stripWhiteSpace();
pos = s.find(" ");
}
if ( trans->type!=FE_QPSK ) {
if ( s.left(pos)=="QPSK" )
trans->modulation = QPSK;
else if ( s.left(pos)=="QAM16" )
trans->modulation = QAM_16;
else if ( s.left(pos)=="QAM32" )
trans->modulation = QAM_32;
else if ( s.left(pos)=="QAM64" )
trans->modulation = QAM_64;
else if ( s.left(pos)=="QAM128" )
trans->modulation = QAM_128;
else if ( s.left(pos)=="QAM256" )
trans->modulation = QAM_256;
else
trans->modulation = QAM_AUTO;
}
if ( trans->type==FE_OFDM ) {
s = s.right( s.length()-pos-1 );
s = s.stripWhiteSpace();
pos = s.find(" ");
if ( s.left(pos)=="8k" )
trans->transmission = TRANSMISSION_MODE_8K;
else if ( s.left(pos)=="2k" )
trans->transmission = TRANSMISSION_MODE_2K;
else
trans->transmission = TRANSMISSION_MODE_AUTO;
s = s.right( s.length()-pos-1 );
s = s.stripWhiteSpace();
pos = s.find(" ");
if ( s.left(pos)=="1/32" )
trans->guard = GUARD_INTERVAL_1_32;
else if ( s.left(pos)=="1/16" )
trans->guard = GUARD_INTERVAL_1_16;
else if ( s.left(pos)=="1/8" )
trans->guard = GUARD_INTERVAL_1_8;
else if ( s.left(pos)=="1/4" )
trans->guard = GUARD_INTERVAL_1_4;
else
trans->guard = GUARD_INTERVAL_AUTO;
s = s.right( s.length()-pos-1 );
s = s.stripWhiteSpace();
pos = s.find(" ");
if ( s.left(pos)=="1" )
trans->hierarchy = HIERARCHY_1;
else if ( s.left(pos)=="2" )
trans->hierarchy = HIERARCHY_2;
else if ( s.left(pos)=="4" )
trans->hierarchy = HIERARCHY_4;
else if ( s.left(pos)=="NONE" )
trans->hierarchy = HIERARCHY_NONE;
else
trans->hierarchy = HIERARCHY_AUTO;
}
transponders.append( trans );
}
bool ScanDialog::getTransData()
{
TQString s=sourcesPath;
transponders.clear();
if ( searchComb->currentText().startsWith("AUTO") ) {
int i;
for ( i=177; i<227; i+=7 ) {
if ( offset07->isChecked() ) {
s = TQString("T %1 7MHz AUTO AUTO AUTO AUTO AUTO AUTO").arg( (i*1000000)+500000 );
parseTp( s, ds->getType(), "" );
}
if ( offset125p->isChecked() ) {
s = TQString("T %1 7MHz AUTO AUTO AUTO AUTO AUTO AUTO").arg( (i*1000000)+500000+125000 );
parseTp( s, ds->getType(), "" );
}
}
for ( i=474; i<859; i+=8 ) {
if ( offset167m->isChecked() ) {
s = TQString("T %1 8MHz AUTO AUTO AUTO AUTO AUTO AUTO").arg( (i*1000000)-167000 );
parseTp( s, ds->getType(), "" );
}
if ( offset0->isChecked() ) {
s = TQString("T %1 8MHz AUTO AUTO AUTO AUTO AUTO AUTO").arg( i*1000000 );
parseTp( s, ds->getType(), "" );
}
if ( offset167p->isChecked() ) {
s = TQString("T %1 8MHz AUTO AUTO AUTO AUTO AUTO AUTO").arg( (i*1000000)+167000 );
parseTp( s, ds->getType(), "" );
}
}
return true;
}
switch ( ds->getType() ) {
case FE_QPSK : s += "dvb-s/"; break;
case FE_QAM : s += "dvb-c/"; break;
case FE_OFDM : s += "dvb-t/"; break;
case FE_ATSC : s += "atsc/"; break;
default:
return false;
}
s += searchComb->currentText();
TQFile f( s );
if ( f.open(IO_ReadOnly) ) {
TQTextStream tt( &f );
while ( !tt.eof() ) {
s = tt.readLine();
if ( s.startsWith("#") )
continue;
if ( s.length()==0 )
continue;
parseTp( s, ds->getType(), searchComb->currentText() );
}
f.close();
return true;
}
else
return false;
}
void ScanDialog::checkDuplicateName( ChannelDesc *chan )
{
TQString org, name;
int i, j=1;
bool loop;
org = name = chan->name;
do {
loop = false;
for ( i=0; i<(int)chandesc->count(); i++ ) {
if ( name==chandesc->at(i)->name ) {
name = org+"-"+TQString().setNum(j);
loop = true;
++j;
break;
}
}
} while ( loop );
chan->name = name;
}
bool ScanDialog::checkChannUpdate( ChannelDesc *chan )
{
int i, j;
AudioPid a;
SubPid s;
ChannelDesc *desc;
for ( i=0; i<(int)chandesc->count(); i++ ) {
desc = chandesc->at(i);
if ( chan->tp.source==desc->tp.source && chan->tp.freq==desc->tp.freq && chan->sid==desc->sid ) {
chan->category=desc->category;
chan->num=desc->num;
chan->name=desc->name;
chan->fta=desc->fta;
for ( j=0; j<chan->napid; j++ ) {
if ( desc->apid[0].pid==chan->apid[j].pid ) {
if ( j>0 ) {
a = chan->apid[0];
chan->apid[0]=chan->apid[j];
chan->apid[j]=a;
}
break;
}
}
for ( j=0; j<chan->nsubpid; j++ ) {
if ( desc->subpid[0].pid==chan->subpid[j].pid ) {
if ( j>0 ) {
s = chan->subpid[0];
chan->subpid[0]=chan->subpid[j];
chan->subpid[j]=s;
}
break;
}
}
chandesc->replace(i,new ChannelDesc(*chan));
return false;
}
}
return true;
}
void ScanDialog::addSelected()
{
ChannelDesc *chan;
DListViewItem *dit, *odit;
TQListViewItem *it;
dit = (DListViewItem*)foundList->firstChild();
while( dit ) {
chan = 0;
if ( !dit->isSelected( ) ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
chan = dit->chan;
if ( !chan ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if(checkChannUpdate(chan)){
checkDuplicateName( chan );
if (chan->num == 0) {
chan->num = chandesc->count()+1;
}
chandesc->append( new ChannelDesc( *chan ) );
it = new TQListViewItem( channelsList, chan->name );
if ( chan->type==1 ) {
if ( chan->fta )
it->setPixmap( 0, tvcPix );
else
it->setPixmap( 0, tvPix );
}
else {
if ( chan->fta )
it->setPixmap( 0, racPix );
else
it->setPixmap( 0, raPix );
}
}
odit = dit;
dit = (DListViewItem*)dit->nextSibling();
delete odit;
dvbsi->channels.remove( chan );
}
}
void ScanDialog::working( bool b )
{
offsetGroup->setEnabled( !b );
addfilteredBtn->setEnabled( !b );
addselectedBtn->setEnabled( !b );
//if ( !isTuned ) searchGroup->setEnabled( !b );
newBtn->setEnabled( !b );
delBtn->setEnabled( !b );
}
void ScanDialog::addFiltered()
{
ChannelDesc *chan;
TQListViewItem *it;
DListViewItem *dit, *odit;
int m = dvbsi->channels.count();
int t=0;
working( true );
startBtn->setEnabled( false );
progress->setProgress(0);
tqApp->processEvents();
dit = (DListViewItem*)foundList->firstChild();
while( dit ) {
t++;
progress->setProgress( t*100/m );
chan = dit->chan;
if ( !chan->completed ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( chan->name.isEmpty() ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( chan->type<1 ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( chan->type>2 ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( chan->type==1 && chan->vpid==0 ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( chan->type==1 && chan->napid==0 ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( chan->type==2 && chan->napid==0 ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( chan->type==2 && chan->vpid!=0 ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( ftaCb->isChecked() && chan->fta ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( !tvCb->isChecked() && chan->type==1 ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( !radioCb->isChecked() && chan->type==2 ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if ( providerCb->isChecked() && chan->provider!=providerComb->currentText() ) {
dit = (DListViewItem*)dit->nextSibling();
continue;
}
if(checkChannUpdate(chan)){
checkDuplicateName( chan );
chan->num = chandesc->count()+1;
chandesc->append( new ChannelDesc( *chan ) );
it = new TQListViewItem( channelsList, chan->name );
if ( chan->type==1 ) {
if ( chan->fta )
it->setPixmap( 0, tvcPix );
else
it->setPixmap( 0, tvPix );
}
else {
if ( chan->fta )
it->setPixmap( 0, racPix );
else
it->setPixmap( 0, raPix );
}
}
odit = dit;
dit = (DListViewItem*)dit->nextSibling();
delete odit;
dvbsi->channels.remove( chan );
}
progress->setProgress(0);
startBtn->setEnabled( true );
working( false );
}
void ScanDialog::siEnded( bool b )
{
checkTimer.stop();
progressTimer.stop();
checkNewChannel();
snr->setProgress( 0 );
signal->setProgress( 0 );
setLock( false );
progress->setProgress( 0 );
startBtn->setOn( !b );
working( false );
startBtn->setText( i18n("START scan") );
startBtn->setPaletteForegroundColor( TQColor(255,0,0) );
}
void ScanDialog::scan( bool b )
{
if ( b ) {
if ( checkTimer.isActive() )
checkTimer.stop();
foundList->clear();
nChannels = 0;
ntv = nradio = 0;
if ( ds->isTuned() )
dvbsi->go( transponders, 2 );
else {
if ( !getTransData() )
return;
if ( searchComb->currentText().startsWith("AUTO") )
dvbsi->go( transponders, 0 ); // no NIT
else
dvbsi->go( transponders );
}
checkTimer.start( 100 );
progressTimer.start( 1000 );
working( true );
startBtn->setText( i18n("STOP scan") );
startBtn->setPaletteForegroundColor( TQColor(0,255,0) );
searchComb->setEnabled( false );
}
else {
//setCursor(TQCursor(TQt::WaitCursor));
startBtn->setText( i18n("Stopping...") );
startBtn->setEnabled( false );
tqApp->processEvents();
dvbsi->stop();
checkTimer.stop();
progressTimer.stop();
checkNewChannel();
snr->setProgress( 0 );
signal->setProgress( 0 );
setLock( false );
progress->setProgress( 0 );
working( false );
//setCursor(TQCursor(TQt::ArrowCursor));
startBtn->setText( i18n("START scan") );
startBtn->setEnabled( true );
startBtn->setPaletteForegroundColor( TQColor(255,0,0) );
searchComb->setEnabled( true );
}
}
void ScanDialog::setProgress()
{
if ( !dvbsi->transponders.count() )
return;
progress->setProgress( dvbsi->progressTransponder*100/dvbsi->transponders.count() );
}
void ScanDialog::setLock( bool on )
{
if ( on )
lock->on();
else
lock->off();
}
void ScanDialog::checkNewChannel()
{
ChannelDesc *chan;
int j;
for ( j=nChannels; j<(int)dvbsi->channels.count(); j++ ) {
chan = dvbsi->channels.at(j);
if ( chan->completed==0 )
break;
nChannels++;
if ( chan->name.isEmpty() )
continue;
if ( chan->type<1 )
continue;
if ( chan->type>2 )
continue;
if ( chan->type==1 && chan->vpid==0 )
continue;
if ( chan->type==1 && chan->napid==0 )
continue;
if ( chan->type==2 && chan->napid==0 )
continue;
if ( chan->type==2 && chan->vpid!=0 )
continue;
addFound( chan, true );
}
}
void ScanDialog::addFound( ChannelDesc *chan, bool scan )
{
int i;
DListViewItem *it;
it = new DListViewItem( foundList, chan, TQString( "%1").arg( chan->tp.snr ), chan->name );
if ( chan->type==1 ) {
if ( scan )
ntv++;
if ( chan->fta )
it->setPixmap( 1, tvcPix );
else
it->setPixmap( 1, tvPix );
}
else {
if ( scan )
nradio++;
if ( chan->fta )
it->setPixmap( 1, racPix );
else
it->setPixmap( 1, raPix );
}
if ( scan )
progressLab->setText( TQString( i18n("Found: %1 TV - %2 radio") ).arg(ntv).arg(nradio) );
if ( chan->provider.isEmpty() )
return;
for ( i=0; i<providerComb->count(); i++ ) {
if ( chan->provider==providerComb->text(i) ) {
i = -1;
break;
}
}
if ( i>-1 )
providerComb->insertItem( chan->provider );
}
ScanDialog::~ScanDialog()
{
if ( checkTimer.isActive() )
checkTimer.stop();
if ( progressTimer.isActive() )
progressTimer.stop();
dvbsi->stop();
delete dvbsi;
ds->setScanning( false );
transponders.clear();
}
#include "scandialog.moc"