@@ -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; }
@@ -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;
@@ -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