/*
- Copyright 2007 Chris Tallon
+ Copyright 2007-2008 Chris Tallon
This file is part of VOMP.
sl.setSize(500, 58);
sl.setNoLoop();
osd.add(&sl);
+
+ // Summary Box
+ summary.setBackgroundColour(osdBack);
+ summary.setPosition(0, video->getScreenHeight() - 300);
+ summary.setSize(video->getScreenWidth(), 150);
+ summary.setVisible(false);
+ add(&summary);
+
+ textSummary.setBackgroundColour(osdBack);
+ textSummary.setPosition(30, 10);
+ textSummary.setSize(video->getScreenWidth() - 60, 130);
+ textSummary.setParaMode(true);
+ summary.add(&textSummary);
+
+ summaryBlackLine.setBackgroundColour(Colour::BLACK);
+ summaryBlackLine.setPosition(0, summary.getHeight() - 4);
+ summaryBlackLine.setSize(summary.getWidth(), 4);
+ summary.add(&summaryBlackLine);
+
+ // FIXME painful
+ Region r1 = summary.getRegionR();
+ Region r2 = osd.getRegionR();
+ osdSummaryRegion = r1 + r2;
}
VVideoLiveTV::~VVideoLiveTV()
delete player;
video->setDefaultAspect();
+ delData();
+}
+
+void VVideoLiveTV::delData()
+{
+ if (eventList)
+ {
+ int eventListSize = eventList->size();
+ for(int i = 0; i < eventListSize; i++)
+ {
+ delete (*eventList)[i];
+ }
+ eventList->clear();
+ delete eventList;
+
+ }
+ sl.clear();
}
int VVideoLiveTV::handleCommand(int command)
{
if (osd.getVisible())
{
- removeOSD();
+ clearScreen();
return 2;
}
// else drop through to stop
}
case Remote::STOP:
- case Remote::MENU:
{
stop();
vchannelList->highlightChannel((*chanList)[currentChannelIndex]);
{
// New remote only
// epg data up
- doUp();
+ doUpDown(false);
return 2;
}
case Remote::DOWN:
{
// New remote only
// epg data down
- doDown();
+ doUpDown(true);
return 2;
}
case Remote::LEFT:
{
// New remote only
// epg data ch down
- doLeft();
+ doLeftRight(false);
return 2;
}
case Remote::RIGHT:
{
// New remote only
// epg data ch up
- doRight();
+ doLeftRight(true);
return 2;
}
case Remote::DF_UP:
case Remote::CHANNELUP:
{
- doChanUp();
+ doChanUpDown(UP);
return 2;
}
case Remote::DF_DOWN:
case Remote::CHANNELDOWN:
{
- doChanDown();
+ doChanUpDown(DOWN);
return 2;
}
case Remote::PREVCHANNEL:
return 2;
}
case Remote::RED:
+ case Remote::MENU:
{
+ doSummary();
return 2;
}
case Remote::FULL:
boxstack->update(this);
setClock();
- displayOSD();
+ displayOSD(true);
player->go(currentChannelIndex);
}
playing = false;
}
-void VVideoLiveTV::doNowNext()
+void VVideoLiveTV::doLeftRight(bool right)
{
- delData();
- keying = 0;
-
- Channel* currentChannel = (*chanList)[osdChannelIndex];
-
- char formatChanNum[20];
- SNPRINTF(formatChanNum, 19, "%0*lu", numberWidth, currentChannel->number);
- osdChanNum.setText(formatChanNum);
- osdChanName.setText(currentChannel->name);
-
- eventList = VDR::getInstance()->getChannelSchedule(currentChannel->number);
-
- if (!eventList)
+ if (osd.getVisible())
{
- sl.addOption(tr("No channel data available"), 0, 1);
+ if (right) osdChannelIndex = upChannel(osdChannelIndex);
+ else osdChannelIndex = downChannel(osdChannelIndex);
}
else
{
- sort(eventList->begin(), eventList->end(), EventSorter());
-
- char tempString[300];
- char tempString2[300];
- struct tm* btime;
- Event* event;
- int eventListSize = eventList->size();
- for(int i = 0; i < eventListSize; i++)
- {
- event = (*eventList)[i];
-
- //btime = localtime((time_t*)&event->time);
- time_t etime = event->time;
- btime = localtime(&etime);
-#ifndef _MSC_VER
- strftime(tempString2, 299, "%0H:%0M ", btime);
-#else
- strftime(tempString2, 299, "%H:%M ", btime);
-#endif
- SNPRINTF(tempString, 299, "%s %s", tempString2, event->title);
- sl.addOption(tempString, (ULONG)event, (i==0));
- }
+ osdChannelIndex = currentChannelIndex;
}
+ displayOSD(true);
}
-void VVideoLiveTV::delData()
+void VVideoLiveTV::doUpDown(bool down)
{
- if (eventList)
+ if (osd.getVisible())
{
- int eventListSize = eventList->size();
- for(int i = 0; i < eventListSize; i++)
- {
- delete (*eventList)[i];
- }
- eventList->clear();
- delete eventList;
-
+ if (down) sl.down();
+ else sl.up();
+ sl.draw();
+
+ displayOSD(false);
}
- sl.clear();
+ else
+ {
+ displayOSD(true);
+ }
+}
+
+void VVideoLiveTV::doChanUpDown(int which)
+{
+ channelChange(OFFSET, which);
+ osdChannelIndex = currentChannelIndex;
+ displayOSD(true);
}
void VVideoLiveTV::doOK()
channelChange(NUMBER, newChannel);
osdChannelIndex = currentChannelIndex;
- displayOSD();
+ displayOSD(true);
}
else if (osdChannelIndex == currentChannelIndex)
{
- removeOSD();
+ clearScreen();
}
else
{
channelChange(INDEX, osdChannelIndex);
- displayOSD();
+ displayOSD(true);
}
}
else
{
osdChannelIndex = currentChannelIndex;
- displayOSD();
+ displayOSD(true);
}
}
-void VVideoLiveTV::doLeft()
-{
- if (osd.getVisible())
- osdChannelIndex = downChannel(osdChannelIndex);
- else
- osdChannelIndex = currentChannelIndex;
-
- displayOSD();
-}
-
-void VVideoLiveTV::doRight()
+void VVideoLiveTV::doSummary()
{
- if (osd.getVisible())
- osdChannelIndex = upChannel(osdChannelIndex);
- else
- osdChannelIndex = currentChannelIndex;
-
- displayOSD();
-}
-
-void VVideoLiveTV::doUp()
-{
- if (osd.getVisible())
- {
- sl.up();
- sl.draw();
- boxstack->update(this, osd.getRegion());
- Timers::getInstance()->setTimerD(this, 1, 8); // arrows pressed, go to 8s timer
- }
- else
+ if (summary.getVisible())
{
- displayOSD();
+ summary.setVisible(false);
+ draw();
+ boxstack->update(this, summary.getRegion());
+ Timers::getInstance()->setTimerD(this, 1, 8); // Restart a timer to get rid of osd
+ return;
}
-}
-void VVideoLiveTV::doDown()
-{
+ summary.setVisible(true);
+
if (osd.getVisible())
{
- sl.down();
- sl.draw();
- boxstack->update(this, osd.getRegion());
- Timers::getInstance()->setTimerD(this, 1, 8); // arrows pressed, go to 8s timer
+ Timers::getInstance()->cancelTimer(this, 1);
+ displayOSD(false);
}
else
{
- displayOSD();
+ displayOSD(true);
}
}
-void VVideoLiveTV::doChanUp()
-{
- channelChange(OFFSET, UP);
- osdChannelIndex = currentChannelIndex;
-
- displayOSD();
-}
-
-void VVideoLiveTV::doChanDown()
-{
- channelChange(OFFSET, DOWN);
- osdChannelIndex = currentChannelIndex;
-
- displayOSD();
-}
-
void VVideoLiveTV::doKey(int command)
{
if (!osd.getVisible()) // First key. prep the data
{
- doNowNext();
+ setNowNextData();
+ keying = 0;
}
int i;
channelChange(NUMBER, newChannel);
osdChannelIndex = currentChannelIndex;
- displayOSD();
+ Timers::getInstance()->cancelTimer(this, 1); // cancel the timer to react to keying input,
+ displayOSD(true); // this will put one back if required
}
else
{
- // Special, modified displayOSD
+ osdChanNum.setText(keyingString);
+
if (!osd.getVisible())
{
osd.setVisible(true);
- osdChanNum.setText(keyingString);
draw();
}
else
{
- osdChanNum.setText(keyingString);
osdChanNum.draw();
}
boxstack->update(this, osd.getRegion());
delete[] keyingString;
}
-void VVideoLiveTV::displayOSD()
+void VVideoLiveTV::doEPG()
+{
+ if (osd.getVisible()) clearScreen();
+
+ video->setMode(Video::QUARTER);
+ video->setPosition(170, 5); //TODO need to deal with 4:3 switching
+
+ VEpg* vepg = new VEpg(this, currentChannelIndex, VDR::VIDEO);
+ vepg->draw();
+ boxstack->add(vepg);
+ boxstack->update(vepg);
+}
+
+void VVideoLiveTV::setNowNextData()
+{
+ delData();
+
+ Channel* currentChannel = (*chanList)[osdChannelIndex];
+
+ char formatChanNum[20];
+ SNPRINTF(formatChanNum, 19, "%0*lu", numberWidth, currentChannel->number);
+ osdChanNum.setText(formatChanNum);
+ osdChanName.setText(currentChannel->name);
+
+ eventList = VDR::getInstance()->getChannelSchedule(currentChannel->number);
+
+ if (!eventList)
+ {
+ sl.addOption(tr("No channel data available"), 0, 1);
+ }
+ else
+ {
+ sort(eventList->begin(), eventList->end(), EventSorter());
+
+ char tempString[300];
+ char tempString2[300];
+ struct tm* btime;
+ Event* event;
+ int eventListSize = eventList->size();
+ for(int i = 0; i < eventListSize; i++)
+ {
+ event = (*eventList)[i];
+
+ //btime = localtime((time_t*)&event->time);
+ time_t etime = event->time;
+ btime = localtime(&etime);
+#ifndef _MSC_VER
+ strftime(tempString2, 299, "%0H:%0M ", btime);
+#else
+ strftime(tempString2, 299, "%H:%M ", btime);
+#endif
+ SNPRINTF(tempString, 299, "%s %s", tempString2, event->title);
+
+ sl.addOption(tempString, (ULONG)event, (i==0));
+ }
+ }
+}
+
+void VVideoLiveTV::setSummaryData()
+{
+ // If osd is not being displayed, sl will be filled with now, current channel
+ // If the display was already on, sl will have programme to show summary for, not necessarily current channel and now
+ Event* selectedEvent = (Event*)sl.getCurrentOptionData();
+
+ if (!selectedEvent)
+ {
+ Log::getInstance()->log("VVideoLiveTV", Log::DEBUG, "No summary");
+ textSummary.setText(tr("No summary available"));
+ }
+ else
+ {
+ Log::getInstance()->log("VVideoLiveTV", Log::DEBUG, "Summary: %s", selectedEvent->description);
+ textSummary.setText(selectedEvent->description);
+ }
+}
+
+void VVideoLiveTV::displayOSD(bool newNowNextData)
{
osd.setVisible(true);
- doNowNext();
- draw();
- boxstack->update(this, osd.getRegion());
- Timers::getInstance()->setTimerD(this, 1, 4);
+ if (newNowNextData)
+ {
+ setNowNextData();
+ keying = 0;
+ }
+ osd.draw();
+
+ if (summary.getVisible())
+ {
+ setSummaryData();
+ summary.draw();
+ boxstack->update(this, &osdSummaryRegion);
+ }
+ else
+ {
+ boxstack->update(this, osd.getRegion());
+ Timers::getInstance()->setTimerD(this, 1, 4);
+ }
}
-void VVideoLiveTV::removeOSD()
+void VVideoLiveTV::clearScreen()
{
- Timers::getInstance()->cancelTimer(this, 1);
+ if (!summary.getVisible()) Timers::getInstance()->cancelTimer(this, 1);
+
osd.setVisible(false);
- draw();
- boxstack->update(this, osd.getRegion());
+
+ if (summary.getVisible())
+ {
+ summary.setVisible(false);
+ draw();
+ boxstack->update(this, &osdSummaryRegion);
+ }
+ else
+ {
+ draw();
+ boxstack->update(this, osd.getRegion());
+ }
}
void VVideoLiveTV::setClock()
Timers::getInstance()->setTimerT(this, 2, dt);
}
-void VVideoLiveTV::doEPG()
-{
- if (osd.getVisible()) removeOSD();
-
- video->setMode(Video::QUARTER);
- video->setPosition(170, 5); //TODO need to deal with 4:3 switching
-
- VEpg* vepg = new VEpg(this, currentChannelIndex, VDR::VIDEO);
- vepg->draw();
- boxstack->add(vepg);
- boxstack->update(vepg);
-}
-
void VVideoLiveTV::timercall(int ref)
{
if (ref == 1)
{
channelChange(NUMBER, m->parameter);
osdChannelIndex = currentChannelIndex;
- if (m->tag == 1) displayOSD();
+ if (m->tag == 1) displayOSD(true);
}
else if (m->message == Message::EPG_CLOSE)
{