vdr-plugin-skindesigner/displaychannel.c

193 lines
5.6 KiB
C

#include "displaychannel.h"
#include "libcore/timers.h"
cSDDisplayChannel::cSDDisplayChannel(cTemplate *channelTemplate, bool WithInfo) {
if (firstDisplay) {
firstDisplay = false;
doOutput = false;
return;
} else if (!channelTemplate) {
esyslog("skindesigner: displayChannel no valid template - aborting");
doOutput = false;
return;
} else {
doOutput = true;
}
groupSep = false;
present = NULL;
currentLast = 0;
channelChange = false;
initial = true;
channelView = new cDisplayChannelView(channelTemplate->GetRootView());
if (!channelView->createOsd()) {
doOutput = false;
return;
}
channelView->DrawBackground();
channelView->DrawSignalBackground();
}
cSDDisplayChannel::~cSDDisplayChannel() {
if (!doOutput)
return;
delete channelView;
}
void cSDDisplayChannel::SetChannel(const cChannel *Channel, int Number) {
if (!doOutput)
return;
channelChange = true;
groupSep = false;
cString ChannelNumber("");
cString ChannelName("");
cString ChannelID("");
if (Channel) {
ChannelName = Channel->Name();
ChannelID = Channel->GetChannelID().ToString();
if (!Channel->GroupSep()) {
ChannelNumber = cString::sprintf("%d%s", Channel->Number(), Number ? "-" : "");
} else {
groupSep = true;
}
} else if (Number) {
ChannelNumber = cString::sprintf("%d-", Number);
} else {
ChannelName = ChannelString(NULL, 0);
}
channelView->ClearChannel();
channelView->ClearEPGInfo();
channelView->ClearStatusIcons();
channelView->ClearChannelGroups();
channelView->ClearScraperContent();
if (!groupSep) {
channelView->DrawChannel(ChannelNumber, ChannelName, ChannelID, (Number > 0)?true:false);
channelView->DrawProgressBarBack();
channelView->DrawSignalBackground();
if (Channel)
channelView->DrawStatusIcons(Channel);
} else {
channelView->ClearSignal();
channelView->ClearSignalBackground();
channelView->ClearProgressBar();
channelView->ClearProgressBarBack();
if (Channel)
channelView->DrawChannelGroups(Channel, ChannelName);
}
}
void cSDDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following) {
if (!doOutput)
return;
present = Present;
channelView->ClearProgressBar();
if (!groupSep) {
channelView->ClearEPGInfo();
}
cGlobalSortedTimers SortedTimers;// local and remote timers
bool recPresent = false;
if (Present) {
if (!groupSep) {
SetProgressBar(Present);
}
eTimerMatch TimerMatch = tmNone;
const cTimer *Timer = Timers.GetMatch(Present, &TimerMatch);
if (Timer && Timer->Recording()) {
recPresent = true;
}
for (int i = 0; i < SortedTimers.Size() && !recPresent; i++)
if (const cTimer *Timer = SortedTimers[i])
if (Timer->Channel()->GetChannelID() == Present->ChannelID())
if (const cEvent *timerEvent = Timer->Event())
if (Present->EventID() == timerEvent->EventID())
recPresent = Timer->Recording();
}
bool recFollowing = false;
if (Following) {
recFollowing = Following->HasTimer();
for (int i = 0; i < SortedTimers.Size() && !recFollowing; i++)
if (const cTimer *Timer = SortedTimers[i])
if (Timer->Channel()->GetChannelID() == Following->ChannelID())
if (const cEvent *timerEvent = Timer->Event())
if (Following->EventID() == timerEvent->EventID())
recFollowing = true;
}
if (Present || Following) {
channelView->DrawEPGInfo(Present, Following, recPresent, recFollowing);
channelView->DrawScraperContent(Present);
}
}
void cSDDisplayChannel::SetProgressBar(const cEvent *present) {
int Current = 0;
int Total = 0;
time_t t = time(NULL);
if (t > present->StartTime())
Current = t - present->StartTime();
Total = present->Duration();
if ((Current > currentLast + 3) || initial || channelChange) {
currentLast = Current;
cString start = present->GetTimeString();
cString stop = present->GetEndTimeString();
channelView->DrawProgressBar(start, stop, Current, Total);
}
}
void cSDDisplayChannel::SetMessage(eMessageType Type, const char *Text) {
if (!doOutput)
return;
channelView->ClearChannel();
channelView->ClearEPGInfo();
channelView->ClearStatusIcons();
channelView->ClearScreenResolution();
channelView->ClearProgressBar();
channelView->ClearProgressBarBack();
channelView->ClearSignal();
channelView->ClearSignalBackground();
channelView->ClearScraperContent();
channelView->DisplayMessage(Type, Text);
groupSep = true;
}
void cSDDisplayChannel::Flush(void) {
if (!doOutput)
return;
if (initial || channelChange) {
channelView->DrawDate();
}
if (present) {
SetProgressBar(present);
} else {
channelView->ClearProgressBar();
}
if (!groupSep) {
channelView->DrawScreenResolution();
channelView->DrawSignal();
} else {
channelView->ClearStatusIcons();
channelView->ClearScreenResolution();
channelView->ClearSignal();
channelView->ClearSignalBackground();
}
if (initial) {
channelView->DoStart();
}
initial = false;
channelChange = false;
channelView->Flush();
}