--- a/menu.c.orig 2017-06-04 19:18:37.423036244 +0200 +++ b/menu.c 2017-06-09 21:33:53.775782116 +0200 @@ -1155,6 +1155,7 @@ class cMenuTimerItem : public cOsdItem { private: const cTimer *timer; + void DoSet(void); public: cMenuTimerItem(const cTimer *Timer); virtual int Compare(const cListObject &ListObject) const; @@ -1166,7 +1167,7 @@ cMenuTimerItem::cMenuTimerItem(const cTimer *Timer) { timer = Timer; - Set(); + DoSet(); } int cMenuTimerItem::Compare(const cListObject &ListObject) const @@ -1176,6 +1177,20 @@ void cMenuTimerItem::Set(void) { + // check for deleted timer + LOCK_TIMERS_READ; + if (!Timers->Contains(timer)) + { + if (const cTimer *t = Timers->GetById(timer->Id(), timer->Remote())) + timer = t; + else + return; // no matching timer found + } + DoSet(); +} + +void cMenuTimerItem::DoSet(void) +{ cString day, name(""); if (timer->WeekDays()) day = timer->PrintDay(0, timer->WeekDays(), false); @@ -1223,8 +1238,7 @@ cStateKey timersStateKey; int helpKeys; void Set(void); - eOSState Edit(void); - eOSState New(void); + eOSState Edit(bool New = false); eOSState Delete(void); eOSState OnOff(void); eOSState Info(void); @@ -1316,21 +1330,34 @@ return osContinue; } -eOSState cMenuTimers::Edit(void) +eOSState cMenuTimers::Edit(bool New) { - if (HasSubMenu() || Count() == 0) + if (HasSubMenu() || Count() == 0 && !New) return osContinue; - return AddSubMenu(new cMenuEditTimer(GetTimer())); -} - -eOSState cMenuTimers::New(void) -{ - if (HasSubMenu()) - return osContinue; - cTimer *Timer = new cTimer; + cTimer *Timer; + if (New) + { + Timer = new cTimer; if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost) Timer->SetRemote(Setup.SVDRPDefaultHost); - return AddSubMenu(new cMenuEditTimer(Timer, true)); + } + // Data structure for service "Epgsearch-exttimeredit-v1.0" + struct Epgsearch_exttimeredit_v1_0 + { + // in + cTimer* timer; // pointer to the timer to edit + bool bNew; // flag that indicates, if this is a new timer or an existing one + const cEvent* event; // pointer to the event corresponding to this timer (may be NULL) + // out + cOsdMenu* pTimerMenu; // pointer to the menu of results + } exttimeredit; + exttimeredit.timer = New ? Timer : GetTimer(); + exttimeredit.bNew = New; + exttimeredit.event = exttimeredit.timer->Event(); + if (cPluginManager::CallFirstService("Epgsearch-exttimeredit-v1.0", &exttimeredit)) + return AddSubMenu(exttimeredit.pTimerMenu); + + return AddSubMenu(new cMenuEditTimer(exttimeredit.timer, New)); } eOSState cMenuTimers::Delete(void) @@ -1386,7 +1413,7 @@ switch (Key) { case kOk: return Edit(); case kRed: state = OnOff(); break; // must go through SetHelpKeys()! - case kGreen: return New(); + case kGreen: return Edit(true); case kYellow: state = Delete(); break; case kInfo: case kBlue: return Info(); @@ -1400,6 +1427,14 @@ Add(new cMenuTimerItem(Timer), true); Display(); } + if (!HasSubMenu()) { + LOCK_TIMERS_READ; + if (Timers->Count()