From e892171736157127d1ca8fd6b5c6193eb5b55c53 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 28 May 2006 10:48:50 +0200 Subject: [PATCH] Fixed deleting channels in case the current channel's number changes --- CONTRIBUTORS | 2 ++ HISTORY | 2 ++ channels.c | 13 ++++++++++++- channels.h | 6 +++++- menu.c | 32 +++++++++++++++++++++++++++++++- 5 files changed, 52 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index c7f51a3c..c593cc46 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -446,6 +446,8 @@ Mirko D for suggesting to allow defining key macros for all non-modeless keys for reporting a bug in entering '0' in a cMenuEditIntItem for reporting that moving channels sometimes stopped the current replay session + for reporting a problem with deleting channels in case the current channel's + number changes Michael Rakowski for translating OSD texts to the Polish language diff --git a/HISTORY b/HISTORY index e0c9b4ae..da5dd4f9 100644 --- a/HISTORY +++ b/HISTORY @@ -4743,3 +4743,5 @@ Video Disk Recorder Revision History - Improved the repeat function for LIRC remote controls (thanks to Joerg Riechardt). - Fixed moving channels, which sometimes stopped the current replay session (reported by Mirko Dölle). +- Fixed deleting channels in case the current channel's number changes (reported + by Mirko Dölle). diff --git a/channels.c b/channels.c index 343802ee..4f1d3951 100644 --- a/channels.c +++ b/channels.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.c 1.51 2006/04/17 12:18:57 kls Exp $ + * $Id: channels.c 1.52 2006/05/28 10:14:18 kls Exp $ */ #include "channels.h" @@ -925,6 +925,17 @@ int cChannels::GetNextNormal(int Idx) return channel ? Idx : -1; } +#if APIVERSNUM != 10400 +#warning ******* API version changed - activate new code +int cChannels::GetPrevNormal(int Idx) +{ + cChannel *channel = Get(--Idx); + while (channel && channel->GroupSep()) + channel = Get(--Idx); + return channel ? Idx : -1; +} +#endif + void cChannels::ReNumber( void ) { channelsHashSid.Clear(); diff --git a/channels.h b/channels.h index c7da4f35..abccceae 100644 --- a/channels.h +++ b/channels.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.h 1.40 2006/02/28 13:52:49 kls Exp $ + * $Id: channels.h 1.41 2006/05/28 10:13:21 kls Exp $ */ #ifndef __CHANNELS_H @@ -233,6 +233,10 @@ public: int GetNextGroup(int Idx); // Get next channel group int GetPrevGroup(int Idx); // Get previous channel group int GetNextNormal(int Idx); // Get next normal channel (not group) +#if APIVERSNUM != 10400 +#warning ******* API version changed - activate new code + int GetPrevNormal(int Idx); // Get previous normal channel (not group) +#endif void ReNumber(void); // Recalculate 'number' based on channel type cChannel *GetByNumber(int Number, int SkipGap = 0); cChannel *GetByServiceID(int Source, int Transponder, unsigned short ServiceID); diff --git a/menu.c b/menu.c index 3f32adae..759cfe0d 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.437 2006/05/28 09:17:25 kls Exp $ + * $Id: menu.c 1.438 2006/05/28 10:47:40 kls Exp $ */ #include "menu.h" @@ -499,6 +499,8 @@ eOSState cMenuChannels::New(void) eOSState cMenuChannels::Delete(void) { if (!HasSubMenu() && Count() > 0) { + int CurrentChannelNr = cDevice::CurrentChannel(); + cChannel *CurrentChannel = Channels.GetByNumber(CurrentChannelNr); int Index = Current(); cChannel *channel = GetChannel(Current()); int DeletedChannel = channel->Number(); @@ -508,10 +510,38 @@ eOSState cMenuChannels::Delete(void) return osContinue; } if (Interface->Confirm(tr("Delete channel?"))) { + if (CurrentChannel && channel == CurrentChannel) { + int n = Channels.GetNextNormal(CurrentChannel->Index()); +#if APIVERSNUM == 10400 + if (n < 0) { + int Idx = CurrentChannel->Index(); + cChannel *channel = Channels.Get(--Idx); + while (channel && channel->GroupSep()) + channel = Channels.Get(--Idx); + if (channel) + n = Idx; + } +#else +#warning ******* API version changed - remove old stuff + if (n < 0) + n = Channels.GetPrevNormal(CurrentChannel->Index()); +#endif + CurrentChannel = Channels.Get(n); + CurrentChannelNr = 0; // triggers channel switch below + } Channels.Del(channel); cOsdMenu::Del(Index); Propagate(); isyslog("channel %d deleted", DeletedChannel); + if (CurrentChannel && CurrentChannel->Number() != CurrentChannelNr) { + if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring()) + Channels.SwitchTo(CurrentChannel->Number()); +#if APIVERSNUM != 10400 +#warning ******* API version changed - activate new code + else + cDevice::SetCurrentChannel(CurrentChannel); +#endif + } } } return osContinue;