Index: kevents.h =================================================================== --- kevents.h (revision 657539) +++ kevents.h (working copy) @@ -33,6 +33,7 @@ class DvbStream; class DVBevents; class ChannelDesc; +class QCheckBox; @@ -41,10 +42,11 @@ public: - EListViewItem( QListView *parent, QString chanName, QString eBegin, QString eDuration, QString eTitle, EventDesc *desc ); + EListViewItem( QListView *parent, QString chanName, QString eBegin, QString eDuration, QString eTitle, EventDesc *desc, QString follow_begin ); virtual int compare( QListViewItem *i, int col, bool ascending ) const; EventDesc *event; + QString followBegin; }; @@ -61,24 +63,31 @@ private slots: void checkNewEvent(); + void checkEpgSearch(QString searchword); void mouseClickedSlot( int btn, QListViewItem *it, const QPoint &p, int c ); void reset(); void setMode( int m, QString name="" ); void setScheduled(); void setCurrentNext(); void setCurrentChannelEpg(); + void epgSearch(); void zap( QListViewItem* it, const QPoint &p, int col ); private: QPtrList *dvb; KListView *listView; - KPushButton *resetBtn, *currentNextBtn, *allBtn, *currentChannelEpg; + KPushButton *resetBtn, *currentNextBtn, *allBtn, *currentChannelEpgBtn, *searchBtn; + QCheckBox *titleCb; QPtrList *channels; QTextBrowser *textBrow; int mode; ChannelDesc *chan; +protected: + + QLineEdit *searchLineEdit; + signals: void addTimer( QString channel, QString name, QDateTime begin, QTime duration ); Index: kevents.cpp =================================================================== --- kevents.cpp (revision 657539) +++ kevents.cpp (working copy) @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -33,11 +34,13 @@ #include "dvbevents.h" #include "dvbstream.h" +#define MAX_FOLLOW 10 -EListViewItem::EListViewItem( QListView *parent, QString chanName, QString eBegin, QString eDuration, QString eTitle, EventDesc *desc ) : KListViewItem( parent, chanName, eBegin, eDuration, eTitle ) +EListViewItem::EListViewItem( QListView *parent, QString chanName, QString eBegin, QString eDuration, QString eTitle, EventDesc *desc, QString follow_begin) : KListViewItem( parent, chanName, eBegin, eDuration, eTitle, follow_begin) { event = desc; + followBegin=follow_begin; } @@ -74,8 +77,15 @@ hbox->addWidget( allBtn ); currentNextBtn = new KPushButton( i18n("Current/Next"), this ); hbox->addWidget( currentNextBtn ); - currentChannelEpg = new KPushButton( i18n("Current Channel"), this ); - hbox->addWidget( currentChannelEpg ); + currentChannelEpgBtn = new KPushButton( i18n("Current Channel"), this ); + hbox->addWidget( currentChannelEpgBtn ); + searchLineEdit = new QLineEdit(this); + hbox->addWidget( searchLineEdit ); + titleCb = new QCheckBox(i18n("only Title"), this ); + titleCb->setChecked(true); + hbox->addWidget( titleCb); + searchBtn = new KPushButton( i18n("Search"), this ); + hbox->addWidget( searchBtn ); QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); hbox->addItem( spacer ); @@ -100,14 +110,17 @@ resetBtn->setGuiItem( KGuiItem(i18n("Refresh"), icon->loadIconSet("reload", KIcon::Small) ) ); allBtn->setGuiItem( KGuiItem(i18n("Scheduled"), icon->loadIconSet("date", KIcon::Small) ) ); currentNextBtn->setGuiItem( KGuiItem(i18n("Current/Next"), icon->loadIconSet("toggle_log", KIcon::Small) ) ); - currentChannelEpg->setGuiItem( KGuiItem(i18n("Current Channel"), icon->loadIconSet("date", KIcon::Small) ) ); - new EListViewItem( (QListView*)listView, "Une chaine", "99/99/99 99:99 9999", "99:99 99", "un titre de programme", 0 ); + currentChannelEpgBtn->setGuiItem( KGuiItem(i18n("Current Channel"), icon->loadIconSet("date", KIcon::Small) ) ); + searchBtn->setGuiItem( KGuiItem(i18n("EPG-Search"), icon->loadIconSet("find", KIcon::Small) ) ); + new EListViewItem( (QListView*)listView, "Une chaine", "99/99/99 99:99 9999", "99:99 99", "un titre de programme", 0,0 ); resize( size ); connect( resetBtn , SIGNAL( clicked() ), this, SLOT( reset() ) ); connect( allBtn , SIGNAL( clicked() ), this, SLOT( setScheduled() ) ); connect( currentNextBtn , SIGNAL( clicked() ), this, SLOT( setCurrentNext() ) ); - connect( currentChannelEpg , SIGNAL( clicked() ), this, SLOT( setCurrentChannelEpg() ) ); + connect( currentChannelEpgBtn, SIGNAL( clicked() ), this, SLOT( setCurrentChannelEpg() ) ); + connect( searchBtn , SIGNAL( clicked() ), this, SLOT( epgSearch() ) ); + connect( listView, SIGNAL( mouseButtonClicked(int,QListViewItem*,const QPoint&,int) ), this, SLOT(mouseClickedSlot(int,QListViewItem*,const QPoint&,int)) ); connect( listView, SIGNAL(doubleClicked(QListViewItem*,const QPoint &,int)), @@ -117,6 +130,113 @@ delete icon; } +void KEvents::checkEpgSearch(QString searchword) +{ + int i, j, k, m, n,l,follow=0; + DVBevents *events=0; + EventSourceList *slist; + EventTsidList *tlist; + EListViewItem *itt=0; + + QString s, channel, begin, duration, title, follow_begin; + bool found; + EventDesc *desc,*desctmp; + QPixmap pix; + for( k=0; k<(int)dvb->count(); k++ ) { + events = dvb->at(k)->dvbEvents; + events->mutex.lock(); + for ( m=0; m<(int)events->srcList.count(); m++ ) { + slist = events->srcList.at(m); + for ( n=0; n<(int)slist->tsidList.count(); n++ ) { + tlist = slist->tsidList.at(n); + for ( j=0; j<(int)tlist->events.count(); j++ ) { + desc = tlist->events.at(j); + + if ( desc->title.isEmpty() ) + continue; + + for ( i=0; i<(int)channels->count(); i++ ) { + if ( desc->source==channels->at(i)->tp.source && desc->sid==channels->at(i)->sid && desc->tsid==channels->at(i)->tp.tsid ) { + channel = channels->at(i)->name; + + found=false; + if(desc->title.upper().find(searchword.upper())!=-1) + found=true; + if(!titleCb->isChecked()) { + if(!found) { + for ( l=0; l<(int)desc->extEvents.count(); l++ ) { + s = *desc->extEvents.at(l); + if(!s.isEmpty()) { + if(s.upper().find(searchword.upper())!=-1) { + found=true; + s=""; + break; + } + } + } + } + if(!found) { + for ( l=0; l<(int)desc->shortEvents.count(); l++ ) { + s = s + desc->shortEvents.at(l)->name; + s += s + desc->shortEvents.at(l)->text; + if(!s.isEmpty()) { + if(s.upper().find(searchword.upper())!=-1) { + found=true; + s=""; + break; + } + } + } + } + } + if(!found) + continue; + + pix = channels->at(i)->pix; + begin = KGlobal::locale()->formatDateTime( desc->startDateTime ); + duration = desc->duration.toString("hh:mm"); + title = desc->title; + + for (int x=0; x<(int)tlist->events.count() && follow < MAX_FOLLOW; x++ ) { + desctmp = tlist->events.at(x); + if ( !desc->title.isEmpty() && !desctmp->title.isEmpty()) { + if (desc->title==desctmp->title && desctmp->startDateTime > desc->startDateTime) { + for (int y=0; y<(int)channels->count(); y++ ) { + if ( desctmp->source==channels->at(y)->tp.source && desctmp->sid==channels->at(y)->sid && desctmp->tsid==channels->at(y)->tp.tsid ) { + follow_begin+=channels->at(y)->name; + follow_begin+=": "; + break; + } + } + follow_begin+=KGlobal::locale()->formatDateTime( desctmp->startDateTime, true ); + follow_begin+="#"; + follow++; + } + } + } + itt = new EListViewItem( (QListView*)listView, channel, begin, duration, title, desc, follow_begin ); + + follow_begin=""; + follow=0; + if ( !pix.isNull() ) + itt->setPixmap( 0, pix ); + } + } + } + } + } + events->mutex.unlock(); + } +} + +void KEvents::epgSearch() +{ + QString text = searchLineEdit->text(); + if (text.stripWhiteSpace().isEmpty()) return; + listView->clear(); + checkEpgSearch(text); +} + void KEvents::setCurrentChannelEpg() { ChannelDesc curchan; @@ -206,6 +326,18 @@ for ( i=0; i<(int)ei->event->extEvents.count(); i++ ) { s = s+ *ei->event->extEvents.at(i); } + if(!ei->followBegin.isEmpty()) { + int pos2=0,pos=0; + s = s+ "
"; + for(int i=0;ifollowBegin.find("#",pos2); + if(pos==-1) + break; + s = s+"
"; + s=s+ei->followBegin.mid(pos2,pos-pos2); + pos2=pos+1; + } + } s = s+""; textBrow->setText( s ); break; @@ -264,17 +396,16 @@ } - void KEvents::checkNewEvent() { - int i, j, k, m, n; + int i, j, k, m, n,follow=0; DVBevents *events=0; EventSourceList *slist; EventTsidList *tlist; EListViewItem *itt=0; - QString s, t, channel, begin, duration, title; + QString s, channel, begin, duration, title, follow_begin; bool ret; - EventDesc *desc; + EventDesc *desc,*desctmp; QPixmap pix; QValueList sids; @@ -288,6 +419,8 @@ sids.clear(); for ( j=0; j<(int)tlist->events.count(); j++ ) { desc = tlist->events.at(j); + if ( desc->title.isEmpty() ) + continue; //if ( mode==1 && desc->tid>0x4f ) if ( sids.contains( desc->sid ) ) continue; @@ -299,6 +432,7 @@ continue; channel = chan->name; pix = chan->pix; + } else { ret = true; @@ -317,9 +451,30 @@ begin = KGlobal::locale()->formatDateTime( desc->startDateTime ); duration = desc->duration.toString("hh:mm"); title = desc->title; - if ( title.isEmpty() ) - continue; - itt = new EListViewItem( (QListView*)listView, channel, begin, duration, title, desc ); + + for (int x=0; x<(int)tlist->events.count() && follow < MAX_FOLLOW; x++ ) { + desctmp = tlist->events.at(x); + if ( !desc->title.isEmpty() && !desctmp->title.isEmpty()) { + if (desc->title==desctmp->title && desctmp->startDateTime > desc->startDateTime) { + for (int y=0; y<(int)channels->count(); y++ ) { + if ( desctmp->source==channels->at(y)->tp.source && desctmp->sid==channels->at(y)->sid && desctmp->tsid==channels->at(y)->tp.tsid ) { + follow_begin+=channels->at(y)->name; + follow_begin+=": "; + break; + } + } + follow_begin+=KGlobal::locale()->formatDateTime( desctmp->startDateTime, true ); + follow_begin+="#"; + follow++; + } + } + } + + itt = new EListViewItem( (QListView*)listView, channel, begin, duration, title, desc, follow_begin ); + + follow_begin=""; + follow=0; + if ( !pix.isNull() ) itt->setPixmap( 0, pix ); }