summaryrefslogtreecommitdiff
path: root/client/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/menu.c')
-rw-r--r--client/menu.c802
1 files changed, 0 insertions, 802 deletions
diff --git a/client/menu.c b/client/menu.c
deleted file mode 100644
index 679ee73..0000000
--- a/client/menu.c
+++ /dev/null
@@ -1,802 +0,0 @@
-/*
- * $Id: menu.c,v 1.5 2008/04/07 14:27:28 schmirl Exp $
- */
-
-#include <vdr/menuitems.h>
-#include <vdr/interface.h>
-
-#include "client/menu.h"
-#include "client/socket.h"
-#include "i18n.h"
-
-#define CHNUMWIDTH (numdigits(Channels.MaxNumber()) + 1)
-
-// --- cMenuText -------------------------------------------------------------
-
-class cMenuText : public cOsdMenu {
-public:
- cMenuText(const char *Title, const char *Text, eDvbFont Font = fontOsd);
- virtual eOSState ProcessKey(eKeys Key);
- };
-
-// --- cStreamdevMenu --------------------------------------------------------
-
-cStreamdevMenu::cStreamdevMenu(void):
- cOsdMenu(tr("Streaming Control")) {
- SetHasHotkeys();
- Add(new cOsdItem(hk(tr("Remote Schedule")), (eOSState)subSchedule));
- Add(new cOsdItem(hk(tr("Remote Timers")), (eOSState)subTimers));
- Add(new cOsdItem(hk(tr("Remote Recordings")), (eOSState)subRecordings));
- Add(new cOsdItem(hk(tr("Suspend Server")), (eOSState)subSuspend));
- Add(new cOsdItem(hk(tr("Synchronize EPG")), (eOSState)subSyncEPG));
-}
-
-cStreamdevMenu::~cStreamdevMenu() {
-}
-
-eOSState cStreamdevMenu::ProcessKey(eKeys Key) {
- eOSState state = cOsdMenu::ProcessKey(Key);
- switch (state) {
- case subSchedule: return AddSubMenu(new cStreamdevMenuSchedule);
- case subTimers: return AddSubMenu(new cStreamdevMenuTimers);
- case subRecordings: return AddSubMenu(new cStreamdevMenuRecordings);
- case subSuspend: SuspendServer(); return osEnd;
- case subSyncEPG: ClientSocket.SynchronizeEPG(); return osEnd;
- default: return state;
- }
-}
-
-void cStreamdevMenu::SuspendServer(void) {
- if (ClientSocket.SuspendServer())
- INFO(tr("Server is suspended"));
- else
- ERROR(tr("Couldn't suspend Server!"));
-}
-
-// --- cStreamdevMenuEditTimer -----------------------------------------------
-
-class cStreamdevMenuEditTimer : public cOsdMenu {
-private:
- int m_Channel;
- bool m_AddIfConfirmed;
- cRemoteTimer *m_Timer;
- cRemoteTimer m_Data;
- cMenuEditDateItem *m_FirstDay;
-
-protected:
- void SetFirstDayItem(void);
-
-public:
- cStreamdevMenuEditTimer(cRemoteTimer *Timer, bool New = false);
- virtual ~cStreamdevMenuEditTimer();
-
- virtual eOSState ProcessKey(eKeys Key);
-};
-
-cStreamdevMenuEditTimer::cStreamdevMenuEditTimer(cRemoteTimer *Timer, bool New):
- cOsdMenu(tr("Edit remote timer"), 12) {
- m_FirstDay = NULL;
- m_Timer = Timer;
- m_AddIfConfirmed = New;
-
- if (m_Timer) {
- m_Data = *m_Timer;
- if (New)
- m_Data.m_Active = 1;
- m_Channel = m_Data.Channel()->Number();
- Add(new cMenuEditBitItem( tr("Active"), &m_Data.m_Active, tfActive));
- Add(new cMenuEditChanItem(tr("Channel"), &m_Channel));
- Add(new cMenuEditDayItem( tr("Day"), &m_Data.m_Day));
- Add(new cMenuEditTimeItem(tr("Start"), &m_Data.m_Start));
- Add(new cMenuEditTimeItem(tr("Stop"), &m_Data.m_Stop));
- Add(new cMenuEditBitItem( tr("VPS"), &m_Data.m_Active, tfVps));
- Add(new cMenuEditIntItem( tr("Priority"), &m_Data.m_Priority, 0,
- MAXPRIORITY));
- Add(new cMenuEditIntItem( tr("Lifetime"), &m_Data.m_Lifetime, 0,
- MAXLIFETIME));
- Add(new cMenuEditStrItem( tr("File"), m_Data.m_File,
- sizeof(m_Data.m_File), tr(FileNameChars)));
- SetFirstDayItem();
- }
-}
-
-cStreamdevMenuEditTimer::~cStreamdevMenuEditTimer() {
- if (m_Timer && m_AddIfConfirmed) {
- Dprintf("SOMETHING GETS DELETED\n");
- delete m_Timer; // apparently it wasn't confirmed
- }
-}
-
-void cStreamdevMenuEditTimer::SetFirstDayItem(void) {
- if (!m_FirstDay && !m_Data.IsSingleEvent()) {
- Add(m_FirstDay = new cMenuEditDateItem(tr("First day"),&m_Data.m_FirstDay));
- Display();
- } else if (m_FirstDay && m_Data.IsSingleEvent()) {
- Del(m_FirstDay->Index());
- m_FirstDay = NULL;
- m_Data.m_FirstDay = 0;
- Display();
- }
-}
-
-eOSState cStreamdevMenuEditTimer::ProcessKey(eKeys Key) {
- eOSState state = cOsdMenu::ProcessKey(Key);
-
- if (state == osUnknown) {
- switch (Key) {
- case kOk:
- {
- cChannel *ch = Channels.GetByNumber(m_Channel);
- if (ch)
- m_Data.m_Channel = ch;
- else {
- ERROR(tr("*** Invalid Channel ***"));
- break;
- }
- if (!*m_Data.m_File)
- strcpy(m_Data.m_File, m_Data.Channel()->Name());
- if (m_Timer) {
- bool success = true;
- if (m_Data != *m_Timer) {
- // Timer has changed
- if ((success = ClientSocket.SaveTimer(m_Timer, m_Data))) {
- *m_Timer = m_Data;
- if (m_Timer->m_Active)
- m_Timer->m_Active = 1;
- // allows external programs to mark active timers with
- // values > 1 and recognize if the user has modified them
- }
- }
- if (success) {
- if (m_AddIfConfirmed)
- RemoteTimers.Add(m_Timer);
- isyslog("timer %d %s (%s)", m_Timer->Index() + 1,
- m_AddIfConfirmed ? "added" : "modified",
- m_Timer->m_Active ? "active" : "inactive");
- m_AddIfConfirmed = false;
- }
- }
- }
- return osBack;
-
- case kRed:
- case kGreen:
- case kYellow:
- case kBlue: return osContinue;
- default: break;
- }
- }
- if (Key != kNone)
- SetFirstDayItem();
- return state;
-}
-
-// --- cMenuWhatsOnItem ------------------------------------------------------
-
-class cMenuWhatsOnItem : public cOsdItem {
-public:
- const cEvent *event;
- const cChannel *channel;
- cMenuWhatsOnItem(const cEvent *Event, cChannel *Channel); //, bool Now = false);
-};
-
-// --- cMenuEvent ------------------------------------------------------------
-
-class cMenuEvent : public cOsdMenu {
-private:
- const cEvent *event;
-public:
- cMenuEvent(const cEvent *Event, bool CanSwitch = false);
- virtual void Display(void);
- virtual eOSState ProcessKey(eKeys Key);
-};
-
-// --- cStreamdevMenuWhatsOn -------------------------------------------------
-
-int cStreamdevMenuWhatsOn::m_CurrentChannel = 0;
-const cEvent *cStreamdevMenuWhatsOn::m_ScheduleEventInfo = NULL;
-
-cStreamdevMenuWhatsOn::cStreamdevMenuWhatsOn(const cSchedules *Schedules,
- bool Now, int CurrentChannel):
- cOsdMenu(Now ? tr("What's on now?") : tr("What's on next?"), CHNUMWIDTH,
- 7, 6) {
- for (cChannel *Channel = Channels.First(); Channel;
- Channel = Channels.Next(Channel)) {
- if (!Channel->GroupSep()) {
- const cSchedule *Schedule
- = Schedules->GetSchedule(Channel->GetChannelID());
- if (Schedule) {
- const cEvent *Event = Now ? Schedule->GetPresentEvent()
- : Schedule->GetFollowingEvent();
- if (Event)
- Add(new cMenuWhatsOnItem(Event, Channel),
- Channel->Number() == CurrentChannel);
- }
- }
- }
- m_CurrentChannel = CurrentChannel;
- SetHelp(Count() ? tr("Record") : NULL, Now ? tr("Next") : tr("Now"),
- tr("Schedule"), tr("Switch"));
-}
-
-const cEvent *cStreamdevMenuWhatsOn::ScheduleEventInfo(void) {
- const cEvent *ei = m_ScheduleEventInfo;
- m_ScheduleEventInfo = NULL;
- return ei;
-}
-
-eOSState cStreamdevMenuWhatsOn::Switch(void) {
- cMenuWhatsOnItem *item = (cMenuWhatsOnItem*)Get(Current());
- if (item) {
- cChannel *channel
- = Channels.GetByChannelID(item->event->ChannelID(), true);
- if (channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true))
- return osEnd;
- }
- ERROR(tr("Can't switch channel!"));
- return osContinue;
-}
-
-eOSState cStreamdevMenuWhatsOn::Record(void) {
- cMenuWhatsOnItem *item = (cMenuWhatsOnItem*)Get(Current());
- if (item) {
- cRemoteTimer *timer
- = new cRemoteTimer(item->event);
- return AddSubMenu(new cStreamdevMenuEditTimer(timer));
- // Load remote timers and see if timer exists before editing
- }
- return osContinue;
-}
-
-eOSState cStreamdevMenuWhatsOn::ProcessKey(eKeys Key) {
- eOSState state = cOsdMenu::ProcessKey(Key);
- if (state == osUnknown) {
- switch (Key) {
- case kRecord:
- case kRed:
- return Record();
-
- case kYellow:
- state = osBack;
- case kGreen:
- {
- cMenuWhatsOnItem *mi = (cMenuWhatsOnItem*)Get(Current());
- if (mi) {
- m_ScheduleEventInfo = mi->event;
- m_CurrentChannel = mi->channel->Number();
- }
- }
- break;
-
- case kBlue:
- return Switch();
-
- case kOk:
- if (Count())
- return AddSubMenu(new cMenuEvent(
- ((cMenuWhatsOnItem*)Get(Current()))->event, true));
- break;
-
- default:
- break;
- }
- }
- return state;
-}
-
-// --- cMenuScheduleItem -----------------------------------------------------
-
-class cMenuScheduleItem : public cOsdItem {
-public:
- const cEvent *event;
- cMenuScheduleItem(const cEvent *Event);
-};
-
-// --- cStreamdevMenuSchedule ------------------------------------------------
-
-cStreamdevMenuSchedule::cStreamdevMenuSchedule(void):
- cOsdMenu("", 7, 6, 4)
-{
- m_Now = false;
- m_Next = false;
- m_OtherChannel = -1;
- m_Schedules = NULL;
-
- cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
- if (channel) {
- m_Schedules = cSchedules::Schedules(m_Lock);
- PrepareSchedule(channel);
- SetHelp(Count() ? tr("Record") : NULL, tr("Now"), tr("Next"));
- }
-}
-
-cStreamdevMenuSchedule::~cStreamdevMenuSchedule() {
-}
-
-void cStreamdevMenuSchedule::PrepareSchedule(cChannel *Channel) {
- Clear();
- char *buffer = NULL;
- asprintf(&buffer, tr("Schedule - %s"), Channel->Name());
- SetTitle(buffer);
- free(buffer);
- if (m_Schedules) {
- const cSchedule *Schedule = m_Schedules->GetSchedule(Channel->GetChannelID());
- if (Schedule) {
- const cEvent *PresentEvent = Schedule->GetPresentEvent(Channel->Number() == cDevice::CurrentChannel());
- time_t now = time(NULL) - Setup.EPGLinger * 60;
- for (const cEvent *Event = Schedule->Events()->First(); Event; Event = Schedule->Events()->Next(Event)) {
- if (Event->EndTime() > now || Event == PresentEvent)
- Add(new cMenuScheduleItem(Event), Event == PresentEvent);
- }
- }
- }
-}
-
-eOSState cStreamdevMenuSchedule::Switch(void) {
- if (m_OtherChannel) {
- if (Channels.SwitchTo(m_OtherChannel))
- return osEnd;
- }
- ERROR(tr("Can't switch channel!"));
- return osContinue;
-}
-
-eOSState cStreamdevMenuSchedule::Record(void) {
- cMenuScheduleItem *item = (cMenuScheduleItem*)Get(Current());
- if (item) {
- cRemoteTimer *timer
- = new cRemoteTimer(item->event);
- return AddSubMenu(new cStreamdevMenuEditTimer(timer));
- // Load remote timers and see if timer exists before editing
- }
- return osContinue;
-}
-
-eOSState cStreamdevMenuSchedule::ProcessKey(eKeys Key) {
- eOSState state = cOsdMenu::ProcessKey(Key);
- if (state == osUnknown) {
- switch (Key) {
- case kRecord:
- case kRed:
- return Record();
-
- case kGreen:
- if (m_Schedules) {
- if (!m_Now && !m_Next) {
- int channelnr = 0;
- if (Count()) {
- cChannel *channel
- = Channels.GetByChannelID(
- ((cMenuScheduleItem*)Get(Current()))->event->ChannelID(), true);
- if (channel)
- channelnr = channel->Number();
- }
- m_Now = true;
- return AddSubMenu(new cStreamdevMenuWhatsOn(m_Schedules, true,
- channelnr));
- }
- m_Now = !m_Now;
- m_Next = !m_Next;
- return AddSubMenu(new cStreamdevMenuWhatsOn(m_Schedules, m_Now,
- cStreamdevMenuWhatsOn::CurrentChannel()));
- }
-
- case kYellow:
- if (m_Schedules)
- return AddSubMenu(new cStreamdevMenuWhatsOn(m_Schedules, false,
- cStreamdevMenuWhatsOn::CurrentChannel()));
- break;
-
- case kBlue:
- if (Count())
- return Switch();
- break;
-
- case kOk:
- if (Count())
- return AddSubMenu(new cMenuEvent(
- ((cMenuScheduleItem*)Get(Current()))->event, m_OtherChannel));
- break;
-
- default:
- break;
- }
- } else if (!HasSubMenu()) {
- m_Now = false;
- m_Next = false;
- const cEvent *ei
- = cStreamdevMenuWhatsOn::ScheduleEventInfo();
- if (ei) {
- cChannel *channel
- = Channels.GetByChannelID(ei->ChannelID(), true);
- if (channel) {
- PrepareSchedule(channel);
- if (channel->Number() != cDevice::CurrentChannel()) {
- m_OtherChannel = channel->Number();
- SetHelp(Count() ? tr("Record") : NULL, tr("Now"), tr("Next"),
- tr("Switch"));
- }
- Display();
- }
- }
- }
- return state;
-}
-
-// --- cStreamdevMenuRecordingItem -------------------------------------------
-
-class cStreamdevMenuRecordingItem: public cOsdItem {
-private:
- int m_Total;
- int m_New;
- char *m_FileName;
- char *m_Name;
-
-public:
- cStreamdevMenuRecordingItem(cRemoteRecording *Recording, int Level);
- virtual ~cStreamdevMenuRecordingItem();
-
- void IncrementCounter(bool New);
- const char *Name(void) const { return m_Name; }
- const char *FileName(void) const { return m_FileName; }
- bool IsDirectory(void) const { return m_Name != NULL; }
-};
-
-cStreamdevMenuRecordingItem::cStreamdevMenuRecordingItem(
- cRemoteRecording *Recording, int Level) {
- m_FileName = strdup(Recording->Name());
- m_Name = NULL;
- m_Total = m_New = 0;
- SetText(Recording->Title('\t', true, Level));
- if (*Text() == '\t')
- m_Name = strdup(Text() + 2);
-}
-
-cStreamdevMenuRecordingItem::~cStreamdevMenuRecordingItem() {
-}
-
-void cStreamdevMenuRecordingItem::IncrementCounter(bool New) {
- ++m_Total;
- if (New) ++m_New;
- char *buffer = NULL;
- asprintf(&buffer, "%d\t%d\t%s", m_Total, m_New, m_Name);
- SetText(buffer, false);
-}
-
-// --- cStreamdevMenuRecordings ----------------------------------------------
-
-cRemoteRecordings cStreamdevMenuRecordings::Recordings;
-int cStreamdevMenuRecordings::HelpKeys = -1;
-
-cStreamdevMenuRecordings::cStreamdevMenuRecordings(const char *Base, int Level,
- bool OpenSubMenus):
- cOsdMenu(Base ? Base : tr("Remote Recordings"), 6, 6) {
- m_Base = Base ? strdup(Base) : NULL;
- m_Level = Setup.RecordingDirs ? Level : -1;
-
- Display(); // this keeps the higher level menus from showing up briefly when
- // pressing 'Back' during replay
-
- if (!Base) {
- STATUS(tr("Fetching recordings..."));
- FLUSH();
- }
-
- if (Base || Recordings.Load()) {
- cStreamdevMenuRecordingItem *LastItem = NULL;
- char *LastItemText = NULL;
- for (cRemoteRecording *r = Recordings.First(); r; r = Recordings.Next(r)) {
- if (!Base || (strstr(r->Name(), Base) == r->Name()
- && r->Name()[strlen(Base)] == '~')) {
- cStreamdevMenuRecordingItem *Item = new cStreamdevMenuRecordingItem(r,
- m_Level);
- if (*Item->Text() && (!LastItem || strcmp(Item->Text(), LastItemText)
- != 0)) {
- Add(Item);
- LastItem = Item;
- free(LastItemText);
- LastItemText = strdup(LastItem->Text());
- } else
- delete Item;
-
- if (LastItem) {
- if (LastItem->IsDirectory())
- LastItem->IncrementCounter(r->IsNew());
- }
- }
- }
- free(LastItemText);
- if (Current() < 0)
- SetCurrent(First());
- else if (OpenSubMenus && Open(true))
- return;
- }
-
- STATUS(NULL);
- FLUSH();
-
- SetHelpKeys();
-}
-
-cStreamdevMenuRecordings::~cStreamdevMenuRecordings() {
- if (m_Base != NULL) free(m_Base);
- HelpKeys = -1;
-}
-
-void cStreamdevMenuRecordings::SetHelpKeys(void) {
- cStreamdevMenuRecordingItem *ri =(cStreamdevMenuRecordingItem*)Get(Current());
- int NewHelpKeys = HelpKeys;
- if (ri) {
- if (ri->IsDirectory())
- NewHelpKeys = 1;
- else {
- NewHelpKeys = 2;
- cRemoteRecording *recording = GetRecording(ri);
- if (recording && recording->Summary())
- NewHelpKeys = 3;
- }
- }
- if (NewHelpKeys != HelpKeys) {
- switch (NewHelpKeys) {
- case 0: SetHelp(NULL); break;
- case 1: SetHelp(tr("Open")); break;
- case 2:
- case 3: SetHelp(NULL, NULL, tr("Delete"), NewHelpKeys == 3 ? tr("Summary") : NULL);
- //SetHelp(tr("Play"), tr("Rewind"), tr("Delete"), NewHelpKeys == 3 ? tr("Summary") : NULL); XXX
- }
- HelpKeys = NewHelpKeys;
- }
-}
-
-cRemoteRecording *cStreamdevMenuRecordings::GetRecording(
- cStreamdevMenuRecordingItem *Item) {
- Dprintf("looking for %s\n", Item->FileName());
- cRemoteRecording *recording = Recordings.GetByName(Item->FileName());
- if (!recording)
- ERROR(tr("Error while accessing recording!"));
- return recording;
-}
-
-bool cStreamdevMenuRecordings::Open(bool OpenSubMenus) {
- cStreamdevMenuRecordingItem *ri
- = (cStreamdevMenuRecordingItem*)Get(Current());
-
- if (ri && ri->IsDirectory()) {
- const char *t = ri->Name();
- char *buffer = NULL;
- if (m_Base) {
- asprintf(&buffer, "%s~%s", m_Base, t);
- t = buffer;
- }
- AddSubMenu(new cStreamdevMenuRecordings(t, m_Level + 1, OpenSubMenus));
- if (buffer != NULL) free(buffer);
- return true;
- }
- return false;
-}
-
-eOSState cStreamdevMenuRecordings::Select(void) {
- cStreamdevMenuRecordingItem *ri
- = (cStreamdevMenuRecordingItem*)Get(Current());
-
- if (ri) {
- if (ri->IsDirectory())
- Open();
- /*else {
- cControl::Launch(new cStreamdevPlayerControl(ri->FileName()));
- return osEnd;
- } XXX */
- }
- return osContinue;
-}
-
-eOSState cStreamdevMenuRecordings::Delete(void) {
- if (HasSubMenu() || Count() == 0)
- return osContinue;
- cStreamdevMenuRecordingItem *ri
- = (cStreamdevMenuRecordingItem*)Get(Current());
- if (ri && !ri->IsDirectory()) {
- if (Interface->Confirm(tr("Delete recording?"))) {
- cRemoteRecording *recording = GetRecording(ri);
- if (recording) {
- if (ClientSocket.DeleteRecording(recording)) {
- cOsdMenu::Del(Current());
- Recordings.Del(recording);
- Display();
- if (!Count())
- return osBack;
- }
- }
- }
- }
- return osContinue;
-}
-
-eOSState cStreamdevMenuRecordings::Summary(void) {
- if (HasSubMenu() || Count() == 0)
- return osContinue;
- cStreamdevMenuRecordingItem *ri=(cStreamdevMenuRecordingItem *)Get(Current());
- if (ri && !ri->IsDirectory()) {
- cRemoteRecording *recording = GetRecording(ri);
- if (recording && recording->Summary() && *recording->Summary())
- return AddSubMenu(new cMenuText(tr("Summary"), recording->Summary()));
- }
- return osContinue;
-}
-
-eOSState cStreamdevMenuRecordings::ProcessKey(eKeys Key) {
- bool HadSubMenu = HasSubMenu();
- eOSState state = cOsdMenu::ProcessKey(Key);
-
- if (state == osUnknown) {
- switch (Key) {
- case kOk:
- case kRed: return Select();
- case kYellow: return Delete();
- case kBlue: return Summary();
- default: break;
- }
- }
-
- if (Key == kYellow && HadSubMenu && !HasSubMenu()) {
- cOsdMenu::Del(Current());
- if (!Count())
- return osBack;
- Display();
- }
-
- if (!HasSubMenu() && Key != kNone)
- SetHelpKeys();
- return state;
-}
-
-// --- cStreamdevMenuTimerItem -----------------------------------------------
-
-class cStreamdevMenuTimerItem: public cOsdItem {
-private:
- cRemoteTimer *m_Timer;
-
-public:
- cStreamdevMenuTimerItem(cRemoteTimer *Timer);
- virtual ~cStreamdevMenuTimerItem();
-
- virtual void Set(void);
-
- cRemoteTimer *Timer(void) const { return m_Timer; }
-};
-
-cStreamdevMenuTimerItem::cStreamdevMenuTimerItem(cRemoteTimer *Timer) {
- m_Timer = Timer;
- Set();
-}
-
-cStreamdevMenuTimerItem::~cStreamdevMenuTimerItem() {
-}
-
-void cStreamdevMenuTimerItem::Set(void) {
- char *buffer = NULL;
- asprintf(&buffer, "%c\t%d\t%s\t%02d:%02d\t%02d:%02d\t%s",
- !m_Timer->Active() ? ' ' :
- m_Timer->FirstDay() ? '!' :
- /*m_Timer->Recording() ? '#' :*/ '>',
- m_Timer->Channel()->Number(),
- m_Timer->PrintDay(m_Timer->Day()),
- m_Timer->Start() / 100,
- m_Timer->Start() % 100,
- m_Timer->Stop() / 100,
- m_Timer->Stop() % 100,
- m_Timer->File());
- SetText(buffer, false);
-}
-
-// --- cStreamdevMenuTimers --------------------------------------------------
-
-cStreamdevMenuTimers::cStreamdevMenuTimers(void):
- cOsdMenu(tr("Remote Timers"), 2, CHNUMWIDTH, 10, 6, 6) {
- Refresh();
- SetHelp(tr("Edit"), tr("New"), tr("Delete"), tr("On/Off"));
-}
-
-cStreamdevMenuTimers::~cStreamdevMenuTimers() {
-}
-
-eOSState cStreamdevMenuTimers::ProcessKey(eKeys Key) {
- int timerNum = HasSubMenu() ? Count() : -1;
- eOSState state = cOsdMenu::ProcessKey(Key);
-
- if (state == osUnknown) {
- switch (Key) {
- case kOk: return Summary();
- case kRed: return Edit();
- case kGreen: return New();
- case kYellow: return Delete();
- case kBlue: OnOff(); break;
- default: break;
- }
- }
-
- if (timerNum >= 0 && !HasSubMenu()) {
- Refresh();
- Display();
- }
- return state;
-}
-
-eOSState cStreamdevMenuTimers::Edit(void) {
- if (HasSubMenu() || Count() == 0)
- return osContinue;
- isyslog("Streamdev: Editing remote timer %d", CurrentTimer()->Index() + 1);
- return AddSubMenu(new cStreamdevMenuEditTimer(CurrentTimer()));
-}
-
-eOSState cStreamdevMenuTimers::New(void) {
- if (HasSubMenu())
- return osContinue;
- return AddSubMenu(new cStreamdevMenuEditTimer(new cRemoteTimer, true));
-}
-
-eOSState cStreamdevMenuTimers::Delete(void) {
- cRemoteTimer *ti = CurrentTimer();
- if (ti) {
- if (Interface->Confirm(tr("Delete timer?"))) {
- int idx = ti->Index();
- if (ClientSocket.DeleteTimer(ti)) {
- RemoteTimers.Del(ti);
- cOsdMenu::Del(Current());
- isyslog("Streamdev: Remote timer %d deleted", idx + 1);
- }
- Refresh();
- Display();
- }
- }
- return osContinue;
-}
-
-eOSState cStreamdevMenuTimers::OnOff(void) {
- cRemoteTimer *timer = CurrentTimer();
- if (timer) {
- cRemoteTimer data = *timer;
- data.OnOff();
- if (data.FirstDay())
- isyslog("Streamdev: Remote timer %d first day set to %s",
- data.Index() + 1, data.PrintFirstDay());
- else
- isyslog("Streamdev: Remote timer %d %sactivated", data.Index() + 1,
- data.Active() ? "" : "de");
-
- if (ClientSocket.SaveTimer(timer, data)) {
- *timer = data;
- RefreshCurrent();
- DisplayCurrent(true);
- } else {
- Refresh();
- Display();
- }
- }
- return osContinue;
-}
-
-eOSState cStreamdevMenuTimers::Summary(void) {
- if (HasSubMenu() || Count() == 0)
- return osContinue;
-
- cRemoteTimer *ti = CurrentTimer();
- if (ti && ti->Summary() != "")
- return AddSubMenu(new cMenuText(tr("Summary"), ti->Summary().c_str()));
-
- return osContinue;
-}
-
-cRemoteTimer *cStreamdevMenuTimers::CurrentTimer(void) {
- cStreamdevMenuTimerItem *item = (cStreamdevMenuTimerItem*)Get(Current());
- return item ? item->Timer() : NULL;
-}
-
-void cStreamdevMenuTimers::Refresh(void) {
- Clear();
- if (RemoteTimers.Load()) {
- for (cRemoteTimer *t = RemoteTimers.First(); t; t = RemoteTimers.Next(t)) {
- Add(new cStreamdevMenuTimerItem(t));
- }
- }
-}