--- menu.c.orig 2009-04-11 14:47:08.000000000 +0200 +++ menu.c 2009-04-17 13:53:05.000000000 +0200 @@ -853,6 +853,7 @@ eOSState cMenuEditTimer::ProcessKey(eKey class cMenuTimerItem : public cOsdItem { private: cTimer *timer; + void DoSet(void); public: cMenuTimerItem(cTimer *Timer); virtual int Compare(const cListObject &ListObject) const; @@ -863,7 +864,7 @@ public: cMenuTimerItem::cMenuTimerItem(cTimer *Timer) { timer = Timer; - Set(); + DoSet(); } int cMenuTimerItem::Compare(const cListObject &ListObject) const @@ -873,6 +874,18 @@ int cMenuTimerItem::Compare(const cListO void cMenuTimerItem::Set(void) { + // check for deleted timer + for (cTimer *t = Timers.First(); ; t = Timers.Next(t)) { + if (t == timer) + break; // timer still there + if (t == NULL) + return; // no matching timer found + } + DoSet(); +} + +void cMenuTimerItem::DoSet(void) +{ cString day, name(""); if (timer->WeekDays()) day = timer->PrintDay(0, timer->WeekDays(), false); @@ -906,8 +919,7 @@ void cMenuTimerItem::Set(void) class cMenuTimers : public cOsdMenu { private: int helpKeys; - eOSState Edit(void); - eOSState New(void); + eOSState Edit(bool New = false); eOSState Delete(void); eOSState OnOff(void); eOSState Info(void); @@ -980,19 +992,30 @@ eOSState cMenuTimers::OnOff(void) return osContinue; } -eOSState cMenuTimers::Edit(void) +eOSState cMenuTimers::Edit(bool New) { - if (HasSubMenu() || Count() == 0) + if (HasSubMenu() || (Count() == 0 && !New)) return osContinue; - isyslog("editing timer %s", *CurrentTimer()->ToDescr()); - return AddSubMenu(new cMenuEditTimer(CurrentTimer())); -} + if (!New) + isyslog("editing timer %s", *CurrentTimer()->ToDescr()); -eOSState cMenuTimers::New(void) -{ - if (HasSubMenu()) - return osContinue; - return AddSubMenu(new cMenuEditTimer(new cTimer, 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 ? (new cTimer) : CurrentTimer(); + 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) @@ -1038,7 +1061,7 @@ eOSState cMenuTimers::ProcessKey(eKeys K 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(); @@ -1051,6 +1074,11 @@ eOSState cMenuTimers::ProcessKey(eKeys K Add(new cMenuTimerItem(Timers.Get(TimerNumber)), true); Display(); } + if (!HasSubMenu() && Timers.Count()