summaryrefslogtreecommitdiff
path: root/tvguidengosd.c
diff options
context:
space:
mode:
Diffstat (limited to 'tvguidengosd.c')
-rw-r--r--tvguidengosd.c475
1 files changed, 475 insertions, 0 deletions
diff --git a/tvguidengosd.c b/tvguidengosd.c
new file mode 100644
index 0000000..c49f816
--- /dev/null
+++ b/tvguidengosd.c
@@ -0,0 +1,475 @@
+#include "tvguidengosd.h"
+
+cTVGuideOSD::cTVGuideOSD(void) {
+ timeManager = NULL;
+ epgGrid = NULL;
+ channelJumper = NULL;
+ detailView = NULL;
+ recMenuView = NULL;
+}
+
+cTVGuideOSD::~cTVGuideOSD(void) {
+ if (recMenuView && recMenuView->Active()) {
+ recMenuView->Close();
+ }
+ if (timeManager)
+ delete timeManager;
+ if (epgGrid)
+ delete epgGrid;
+ if (channelJumper)
+ delete channelJumper;
+ if (detailView)
+ delete detailView;
+ if (recMenuView)
+ delete recMenuView;
+}
+
+void cTVGuideOSD::Show(void) {
+ bool skinDesignerAvailable = InitSkindesignerInterface("tvguideng");
+ if (!skinDesignerAvailable) {
+ return;
+ esyslog("tvguideng: skindesigner not available");
+ }
+
+ cOsdView *rootView = GetOsdView(viRootView);
+ if (!rootView) {
+ esyslog("tvguideng: used skindesigner skin does not support tvguideng");
+ return;
+ }
+ SwitchTimers.Load(AddDirectory(cPlugin::ConfigDirectory("epgsearch"), "epgsearchswitchtimers.conf"));
+ recMenuView = new cRecMenuView();
+ pRemoteTimers = cPluginManager::CallFirstService("RemoteTimers::RefreshTimers-v1.0", NULL);
+ if (pRemoteTimers) {
+ isyslog("tvguideng: remotetimers-plugin is available");
+ }
+ if (config.useRemoteTimers && pRemoteTimers) {
+ cString errorMsg;
+ if (!pRemoteTimers->Service("RemoteTimers::RefreshTimers-v1.0", &errorMsg)) {
+ esyslog("tvguideng: %s", *errorMsg);
+ }
+ }
+
+ timeManager = new cTimeManager();
+ timeManager->Now();
+
+ epgGrid = new cEpgGrid(rootView, timeManager);
+
+ cChannel *startChannel = Channels.GetByNumber(cDevice::CurrentChannel());
+
+ epgGrid->Init(startChannel);
+ epgGrid->DrawHeader();
+ epgGrid->DrawTime();
+ epgGrid->DrawFooter();
+ epgGrid->DrawChannelHeaders();
+ epgGrid->DrawTimeline();
+ epgGrid->DrawChannelgroups();
+ epgGrid->DrawGrid();
+ epgGrid->Flush();
+}
+
+eOSState cTVGuideOSD::ProcessKey(eKeys Key) {
+ if (!epgGrid) {
+ return osEnd;
+ }
+
+ eOSState state = osContinue;
+
+ if (recMenuView->Active() && !detailView) {
+ state = recMenuView->ProcessKey(Key);
+ if (state == osEnd) {
+ epgGrid->SetTimers();
+ epgGrid->Activate();
+ epgGrid->DrawGrid();
+ epgGrid->Flush();
+ } else if (state == osUser1) {
+ DetailView(recMenuView->GetEvent());
+ }
+ state = osContinue;
+ if (epgGrid->DrawTime())
+ epgGrid->Flush();
+ } else if (detailView) {
+ //Detail View Key Handling
+ switch (Key & ~k_Repeat) {
+ case kBack:
+ CloseDetailedView();
+ break;
+ case kUp:
+ detailView->Up();
+ detailView->Flush();
+ break;
+ case kDown:
+ detailView->Down();
+ detailView->Flush();
+ break;
+ case kLeft:
+ detailView->Left();
+ detailView->Flush();
+ break;
+ case kRight:
+ detailView->Right();
+ detailView->Flush();
+ break;
+ case kOk:
+ CloseDetailedView();
+ break;
+ case kBlue:
+ state = ChannelSwitch();
+ break;
+ default:
+ break;
+ }
+ if (detailView && state != osEnd && detailView->DrawTime()) {
+ detailView->Flush();
+ }
+ } else {
+
+ //EPG Grid is active
+ switch (Key & ~k_Repeat) {
+ case kBack:
+ state=osEnd;
+ break;
+ case kUp:
+ KeyUp();
+ break;
+ case kDown:
+ KeyDown();
+ break;
+ case kLeft:
+ KeyLeft();
+ break;
+ case kRight:
+ KeyRight();
+ break;
+ case kOk:
+ state = KeyOk(epgGrid->GetCurrentEvent());
+ break;
+ case k0 ... k9:
+ NumericKey(Key - k0);
+ break;
+ case kRed:
+ KeyRed();
+ break;
+ case kGreen:
+ KeyGreen();
+ break;
+ case kYellow:
+ KeyYellow();
+ break;
+ case kBlue:
+ state = KeyBlue(epgGrid->GetCurrentEvent());
+ break;
+ case kNone:
+ if (channelJumper) CheckTimeout();
+ break;
+ default:
+ break;
+ }
+ if (state != osEnd && epgGrid->DrawTime())
+ epgGrid->Flush();
+ }
+ return state;
+}
+
+void cTVGuideOSD::KeyLeft(void) {
+ if (config.displayMode == eHorizontal) {
+ TimeBack();
+ } else if (config.displayMode == eVertical) {
+ ChannelsBack();
+ }
+}
+
+void cTVGuideOSD::KeyRight(void) {
+ if (config.displayMode == eHorizontal) {
+ TimeForward();
+ } else if (config.displayMode == eVertical) {
+ ChannelsForward();
+ }
+}
+
+void cTVGuideOSD::KeyUp(void) {
+ if (config.displayMode == eHorizontal) {
+ ChannelsBack();
+ } else if (config.displayMode == eVertical) {
+ TimeBack();
+ }
+}
+
+void cTVGuideOSD::KeyDown(void) {
+ if (config.displayMode == eHorizontal) {
+ ChannelsForward();
+ } else if (config.displayMode == eVertical) {
+ TimeForward();
+ }
+}
+
+void cTVGuideOSD::TimeForward(void) {
+ bool scrolled = epgGrid->TimeForward();
+ if (!scrolled) {
+ epgGrid->UpdateActive();
+ } else {
+ epgGrid->DrawGrid();
+ }
+ epgGrid->DrawHeader();
+ epgGrid->Flush();
+}
+
+void cTVGuideOSD::TimeBack(void) {
+ bool scrolled = epgGrid->TimeBack();
+ if (!scrolled) {
+ epgGrid->UpdateActive();
+ } else {
+ epgGrid->DrawGrid();
+ }
+ epgGrid->DrawHeader();
+ epgGrid->Flush();
+}
+
+void cTVGuideOSD::ChannelsForward(void) {
+ bool scrolled = epgGrid->ChannelForward();
+ if (!scrolled) {
+ epgGrid->UpdateActive();
+ } else {
+ epgGrid->DrawChannelHeaders();
+ epgGrid->DrawChannelgroups();
+ epgGrid->DrawGrid();
+ }
+ if (config.channelJumpMode == eGroupJump)
+ epgGrid->DrawFooter();
+ epgGrid->DrawHeader();
+ epgGrid->Flush();
+}
+
+void cTVGuideOSD::ChannelsBack(void) {
+ bool scrolled = epgGrid->ChannelBack();
+ if (!scrolled) {
+ epgGrid->UpdateActive();
+ } else {
+ epgGrid->DrawChannelHeaders();
+ epgGrid->DrawChannelgroups();
+ epgGrid->DrawGrid();
+ }
+ if (config.channelJumpMode == eGroupJump)
+ epgGrid->DrawFooter();
+ epgGrid->DrawHeader();
+ epgGrid->Flush();
+}
+
+void cTVGuideOSD::NumericKey(int key) {
+ if (config.numKeyMode == eTimeJump) {
+ NumericKeyTimeJump(key);
+ } else if (config.numKeyMode == eChannelJump) {
+ NumericKeyChannelJump(key);
+ }
+}
+
+void cTVGuideOSD::NumericKeyTimeJump(int key) {
+ switch (key) {
+ case 1: {
+ bool tooFarInPast = timeManager->DelMinutes(config.bigStepHours*60);
+ if (tooFarInPast)
+ return;
+ }
+ break;
+ case 3: {
+ timeManager->AddMinutes(config.bigStepHours*60);
+ }
+ break;
+ case 4: {
+ bool tooFarInPast = timeManager->DelMinutes(config.hugeStepHours*60);
+ if (tooFarInPast)
+ return;
+ }
+ break;
+ case 6: {
+ timeManager->AddMinutes(config.hugeStepHours*60);
+ }
+ break;
+ case 7: {
+ cTimeManager primeChecker;
+ primeChecker.Now();
+ time_t prevPrime = primeChecker.GetPrevPrimetime(timeManager->GetStart());
+ if (primeChecker.TooFarInPast(prevPrime))
+ return;
+ timeManager->SetTime(prevPrime);
+ }
+ break;
+ case 9: {
+ cTimeManager primeChecker;
+ time_t nextPrime = primeChecker.GetNextPrimetime(timeManager->GetStart());
+ timeManager->SetTime(nextPrime);
+ }
+ break;
+ default:
+ return;
+ }
+ epgGrid->RebuildEpgGrid();
+ epgGrid->DrawGrid();
+ epgGrid->DrawHeader();
+ epgGrid->DrawTimeline();
+ epgGrid->Flush();
+}
+
+void cTVGuideOSD::NumericKeyChannelJump(int key) {
+ if (!channelJumper) {
+ channelJumper = epgGrid->GetChannelJumper();
+ }
+ channelJumper->Set(key);
+ channelJumper->Draw();
+ epgGrid->Flush();
+}
+
+void cTVGuideOSD::CheckTimeout(void) {
+ if (!channelJumper)
+ return;
+ if (!channelJumper->TimeOut())
+ return;
+ int newChannelNum = channelJumper->GetChannel();
+ delete channelJumper;
+ channelJumper = NULL;
+ const cChannel *newChannel = Channels.GetByNumber(newChannelNum);
+ if (!newChannel) {
+ return;
+ }
+ epgGrid->Clear();
+ epgGrid->Init(newChannel);
+ epgGrid->DrawHeader();
+ epgGrid->DrawTime();
+ epgGrid->DrawFooter();
+ epgGrid->DrawChannelHeaders();
+ epgGrid->DrawTimeline();
+ epgGrid->DrawChannelgroups();
+ epgGrid->DrawGrid();
+ epgGrid->Flush();
+}
+
+void cTVGuideOSD::KeyGreen(void) {
+ const cChannel *prevStart = NULL;
+ if (config.channelJumpMode == eNumJump) {
+ prevStart = epgGrid->GetPrevChannelNumJump();
+ } else if (config.channelJumpMode == eGroupJump) {
+ if (epgGrid->IsFirstGroup()) {
+ return;
+ }
+ prevStart = epgGrid->GetPrevChannelGroupJump();
+ }
+ epgGrid->Clear();
+ epgGrid->Init(prevStart);
+ epgGrid->DrawHeader();
+ epgGrid->DrawTime();
+ epgGrid->DrawFooter();
+ epgGrid->DrawChannelHeaders();
+ epgGrid->DrawChannelgroups();
+ if (config.channelJumpMode == eGroupJump)
+ epgGrid->DrawFooter();
+ epgGrid->DrawTimeline();
+ epgGrid->DrawGrid();
+ epgGrid->Flush();
+}
+
+void cTVGuideOSD::KeyYellow(void) {
+ const cChannel *nextStart = NULL;
+ if (config.channelJumpMode == eNumJump) {
+ nextStart = epgGrid->GetNextChannelNumJump();
+ } else if (config.channelJumpMode == eGroupJump) {
+ if (epgGrid->IsLastGroup()) {
+ return;
+ }
+ if (config.hideLastChannelGroup && epgGrid->IsSecondLastGroup()) {
+ return;
+ }
+ nextStart = epgGrid->GetNextChannelGroupJump();
+ }
+ epgGrid->Clear();
+ epgGrid->Init(nextStart);
+ epgGrid->DrawHeader();
+ epgGrid->DrawTime();
+ epgGrid->DrawFooter();
+ epgGrid->DrawChannelHeaders();
+ epgGrid->DrawChannelgroups();
+ if (config.channelJumpMode == eGroupJump)
+ epgGrid->DrawFooter();
+ epgGrid->DrawTimeline();
+ epgGrid->DrawGrid();
+ epgGrid->Flush();
+}
+
+eOSState cTVGuideOSD::KeyBlue(const cEvent *e) {
+ if (config.blueKeyMode == eBlueKeySwitch) {
+ return ChannelSwitch();
+ } else if (config.blueKeyMode == eBlueKeyEPG) {
+ DetailView(e);
+ } else if (config.blueKeyMode == eBlueKeyFavorites) {
+ Favorites();
+ }
+ return osContinue;
+}
+
+eOSState cTVGuideOSD::KeyOk(const cEvent *e) {
+ if (config.blueKeyMode == eBlueKeySwitch) {
+ DetailView(e);
+ } else if (config.blueKeyMode == eBlueKeyEPG) {
+ return ChannelSwitch();
+ } else if (config.blueKeyMode == eBlueKeyFavorites) {
+ DetailView(e);
+ }
+ return osContinue;
+}
+
+eOSState cTVGuideOSD::ChannelSwitch(void) {
+ const cChannel *currentChannel = epgGrid->GetCurrentChannel();
+ if (!currentChannel) {
+ return osContinue;
+ }
+ cDevice::PrimaryDevice()->SwitchChannel(currentChannel, true);
+ if (config.closeOnSwitch) {
+ return osEnd;
+ }
+ return osContinue;
+}
+
+void cTVGuideOSD::DetailView(const cEvent *e) {
+ if (!e)
+ return;
+ epgGrid->Deactivate(true);
+ if (recMenuView->Active())
+ recMenuView->Hide();
+ cOsdView *dV = GetOsdView(viRootView, viDetailView);
+ detailView = new cDetailView(dV, e);
+ detailView->Draw();
+ detailView->DrawTime();
+ detailView->Flush();
+}
+
+void cTVGuideOSD::CloseDetailedView(void) {
+ delete detailView;
+ detailView = NULL;
+ epgGrid->Activate();
+ epgGrid->Flush();
+ if (recMenuView->Active()) {
+ recMenuView->Activate();
+ recMenuView->Flush();
+ }
+}
+
+void cTVGuideOSD::KeyRed(void) {
+ const cEvent *e = epgGrid->GetCurrentEvent();
+ if (!e)
+ return;
+ epgGrid->Deactivate(false);
+ cOsdView *recView = GetOsdView(viRootView, viRecMenu);
+ cOsdView *recViewBuffer = GetOsdView(viRootView, viRecMenu);
+ cOsdView *recViewBuffer2 = GetOsdView(viRootView, viRecMenu);
+ recMenuView->Init(recView, recViewBuffer, recViewBuffer2);
+ recMenuView->DisplayRecMenu(e);
+ recMenuView->Flush();
+}
+
+void cTVGuideOSD::Favorites(void) {
+ epgGrid->Deactivate(false);
+ cOsdView *recView = GetOsdView(viRootView, viRecMenu);
+ cOsdView *recViewBuffer = GetOsdView(viRootView, viRecMenu);
+ cOsdView *recViewBuffer2 = GetOsdView(viRootView, viRecMenu);
+ recMenuView->Init(recView, recViewBuffer, recViewBuffer2);
+ recMenuView->DisplayFavorites();
+ recMenuView->Flush();
+}