diff -u vdr-1.3.33-org-nackt/channels.h w/channels.h --- vdr-1.3.33-org-nackt/channels.h 2005-09-17 11:59:14.000000000 +0200 +++ w/channels.h 2005-09-25 19:19:32.000000000 +0200 @@ -172,6 +172,10 @@ int Tid(void) const { return tid; } int Sid(void) const { return sid; } int Rid(void) const { return rid; } + bool IsTV(void) const { return (vpid > 0) && (Apid(0)>0); } + bool IsRadio(void) const { return (vpid == 0) && (Apid(0)>0); } + bool IsData(void) const { return (Dpid(0) > 0); } + bool IsCrypted(void) const { return (Ca() > 4); } int Number(void) const { return number; } void SetNumber(int Number) { number = Number; } bool GroupSep(void) const { return groupSep; } diff -u vdr-1.3.33-org-nackt/menu.c w/menu.c --- vdr-1.3.33-org-nackt/menu.c 2005-09-25 15:37:21.000000000 +0200 +++ w/menu.c 2005-09-25 19:19:32.000000000 +0200 @@ -370,7 +370,13 @@ if (sortMode == csmProvider) asprintf(&buffer, "%d\t%s - %s", channel->Number(), channel->Provider(), channel->Name()); else - asprintf(&buffer, "%d\t%s", channel->Number(), channel->Name()); + asprintf(&buffer, "%4d %s%s%s%s %s", channel->Number(), + channel->Vpid()>0 ? "t":" ", + (channel->Vpid()==0) && (channel->Apid(0) > 0) ? "r":" ", + (channel->Dpid(0) > 0) ? "d":" ", + channel->Ca(0)>4 ? "x":" ", + channel->Name() + ); } else asprintf(&buffer, "---\t%s ----------------------------------------------------------------", channel->Name()); @@ -384,6 +390,8 @@ void Setup(void); cChannel *GetChannel(int Index); void Propagate(void); + bool IsFiltered(void); + int onlyTV, onlyRadio, onlyUncrypt; protected: eOSState Switch(void); eOSState Edit(void); @@ -399,6 +407,7 @@ cMenuChannels::cMenuChannels(void) :cOsdMenu(tr("Channels"), CHNUMWIDTH) { + onlyTV = onlyRadio = onlyUncrypt = 0; Setup(); Channels.IncBeingEdited(); } @@ -414,19 +423,38 @@ if (!currentChannel) currentChannel = Channels.GetByNumber(cDevice::CurrentChannel()); cMenuChannelItem *currentItem = NULL; + cMenuChannelItem *lastUsedItem = NULL; + cMenuChannelItem *firstUsedItem = NULL; Clear(); + for (cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel)) { - if (!channel->GroupSep() || cMenuChannelItem::SortMode() == cMenuChannelItem::csmNumber && *channel->Name()) { - cMenuChannelItem *item = new cMenuChannelItem(channel); - Add(item); - if (channel == currentChannel) - currentItem = item; - } + if ((!channel->GroupSep() || cMenuChannelItem::SortMode() == cMenuChannelItem::csmNumber) + && *channel->Name() //Channel must have a name + && (channel->GroupSep() || //Do not filter Groupseperators + ( !(onlyTV && !channel->IsTV() ) + && !(onlyRadio && !channel->IsRadio() ) + && !(onlyUncrypt && channel->IsCrypted() ) + ))) { + cMenuChannelItem *item = new cMenuChannelItem(channel); + Add(item); + if (channel == currentChannel) + currentItem = item; + if (!channel->GroupSep()) { + lastUsedItem = item; + if( !firstUsedItem ) + firstUsedItem = item; + } + } else { + if (channel == currentChannel) + currentItem = lastUsedItem; // current channel is now invisible, so we use the nearest channel } + } if (cMenuChannelItem::SortMode() != cMenuChannelItem::csmNumber) Sort(); + if (!currentItem) // happens, if after filtering the first line is a groupsep + currentItem = firstUsedItem; SetCurrent(currentItem); - SetHelp(tr("Edit"), tr("New"), tr("Delete"), cMenuChannelItem::SortMode() == cMenuChannelItem::csmNumber ? tr("Mark") : NULL); + SetHelp(tr("Edit"), tr("New"), tr("Delete"), !IsFiltered() && cMenuChannelItem::SortMode() == cMenuChannelItem::csmNumber ? tr("Mark") : NULL); Display(); } @@ -445,6 +473,11 @@ Channels.SetModified(true); } +bool cMenuChannels::IsFiltered(void) +{ + return onlyTV || onlyRadio || onlyUncrypt; +} + eOSState cMenuChannels::Switch(void) { if (HasSubMenu()) @@ -532,11 +565,36 @@ case k0: cMenuChannelItem::IncSortMode(); Setup(); break; + case k1: // show all channels (default) + onlyTV = onlyRadio = onlyUncrypt = 0; + Setup(); + Skins.Message(mtStatus, "All channels"); + break; + case k2: // show only TV-channels with sound + onlyTV = !0; + onlyRadio = 0; + Setup(); + Skins.Message(mtStatus, "Show only tv channels"); + break; + case k3: // show only radio/broadcast + onlyTV = 0; + onlyRadio = !0; + Setup(); + Skins.Message(mtStatus, "Show only radio channels"); + break; + case k4: // switch Crypt + onlyUncrypt = !onlyUncrypt; + Setup(); + if( onlyUncrypt ) + Skins.Message(mtStatus, "Show only uncrypted channels"); + else + Skins.Message(mtStatus, "Show uncrypted and crypted channels"); + break; case kOk: return Switch(); case kRed: return Edit(); case kGreen: return New(); case kYellow: return Delete(); - case kBlue: if (!HasSubMenu() && cMenuChannelItem::SortMode() == cMenuChannelItem::csmNumber) + case kBlue: if (!HasSubMenu() && !IsFiltered() && cMenuChannelItem::SortMode() == cMenuChannelItem::csmNumber) Mark(); break; default: break; diff -u vdr-1.3.33-org-nackt/README.channelfilterpatch w/README.channelfilterpatch --- vdr-1.3.33-org-nackt/README.channelfilterpatch 2005-09-25 19:46:45.000000000 +0200 +++ w/README.channelfilterpatch 2005-09-25 19:45:12.000000000 +0200 @@ -0,0 +1,78 @@ +english text see below + +Dieser Patch filtert in der Kanalliste (Punkt 2 im Hauptmenü) +bei Bedarf unerwünschte Einträge, was die Übersichtlichkeit erhöhen kann. +Ausserdem werden in der Liste Kanalattribute angezeigt: + "t" = TV + "r" = Radio + "d" = Daten + "x" = verschlüsselt + +Drückt man in der Liste die Taste "2", so werden nur noch Fernsehsender +angezeigt (also keine Radiosender, keine veraltete Einträge, keine reine +Datenkanäle und keine Standbildersender) + +Drückt man die Taste "3" so werden analog nur Radiosender angezeigt. + +Drückt man die "4", so werden alle verschlüsselten Kanäle (caid>4) +ausgeblendet. +Drückt man die "4" nochmal, so werden die verschlüsselten Kanäle +wieder eingeblendet. Das funktioniert auch im Zusammenhang mit den +anderen Filtern: Drückt man z.B. die "2" und die "4", so werden nur +unverschlüsselte TV-Kanäle aufgelistet. + +Das Filtern funktioniert auch zusammen mit dem vdr-eigenen +Sortieren (Taste "0"). + +Die Taste "1" oder das Beenden und Wiederaufrufen der Kanalliste +stellt jederzeit den originalen Zustand wieder her. + +Der Patch ist auf vdr 1.3.31 und vdr 1.3.33 getestet, geht aber wohl auch +mit älteren Version. Es fehlt allerdings noch die Übersetzungen; die +liefere ich nach, wenn etwaige Fehler beseitigt sind. + +Installation wie üblich per + patch -p1 < vdr-1.3.xx-channelfilter-0.1.diff +im vdr-Quellcodeverzeichnis. Danach per "make" neu compilieren. +Eine Header-Datei wurde geändert, daher müssen die Plugins auch +neu übersetzt werden: "make plugins". + +Homepage www.u32.de/vdr.html#patches +Fehlerberichte an vdrpatch@u32.de + +----------- english --------------------- + +This patch filters the channel list on demand. +A additional column of channel attributes is also added: + "t" = TV + "r" = radio + "d" = data + "x" = encrypted + +Pressing the key "2" in the channel list hides all non TV channels. + +Pressing the key "3" hides all non radio channels. + +Pressing the key "4" hides all encrypted channesls (caid>4) +Pressing the "4" again shows the encrypted channels again. +This works also in conjunction with the other filters. +e.g. pressing "2" and then "4", results in a list containing only +unencrypted tv channels. + +The filtering works also together with vdr's own sorting (key "0") + +Pressing "1" or closing and reopening the channel list +resets any filtering. + +I tested the patch against vdr 1.3.31 and vdr 1.3.33. It should +also works with older 1.3.x-Versions. There are no translations yet. I'll +add them after final bugfixing. + +Install it as usual in the source directory of vdr + patch -p1 < vdr-1.3.xx-channelfilter-0.1.diff + make + make plugins +(a header file was changed, so plugin needs to be rebuild too) + +Homepage www.u32.de/vdr.html#patches +Reports Bugs to vdrpatch@u32.de