summaryrefslogtreecommitdiff
path: root/channelcolumn.c
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2013-01-17 13:16:44 +0100
committerlouis <louis.braun@gmx.de>2013-01-17 13:16:44 +0100
commit47c3fea545a1b4607deda1e7d2fa51cbcf89a656 (patch)
tree4109469360bfb71ce467c240a33d0738ad44c18e /channelcolumn.c
downloadvdr-plugin-tvguide-47c3fea545a1b4607deda1e7d2fa51cbcf89a656.tar.gz
vdr-plugin-tvguide-47c3fea545a1b4607deda1e7d2fa51cbcf89a656.tar.bz2
Initial push tvguide 0.0.1
Diffstat (limited to 'channelcolumn.c')
-rw-r--r--channelcolumn.c274
1 files changed, 274 insertions, 0 deletions
diff --git a/channelcolumn.c b/channelcolumn.c
new file mode 100644
index 0000000..de5962b
--- /dev/null
+++ b/channelcolumn.c
@@ -0,0 +1,274 @@
+#include "channelcolumn.h"
+
+cChannelColumn::cChannelColumn(int num, cChannel *channel, cMyTime *myTime) {
+ this->channel = channel;
+ this->num = num;
+ this->myTime = myTime;
+ hasTimer = channel->HasTimer();
+}
+
+cChannelColumn::~cChannelColumn(void) {
+ grids.Clear();
+}
+
+void cChannelColumn::clearGrids() {
+ grids.Clear();
+}
+
+void cChannelColumn::createHeader() {
+ color = theme.Color(clrHeader);
+ colorBlending = theme.Color(clrHeaderBlending);
+ caller = cString::sprintf("channelcolumn %s", channel->Name());
+ pixmap = osdManager.requestPixmap(2, cRect(tvguideConfig.timeColWidth + num*tvguideConfig.colWidth, 0, tvguideConfig.colWidth, tvguideConfig.headerHeight),
+ cRect::Null, *caller);
+ if (!pixmap) {
+ return;
+ }
+ drawBackground();
+ cTextWrapper tw;
+ cString headerText = cString::sprintf("%d - %s", channel->Number(), channel->Name());
+ tw.Set(*headerText, tvguideConfig.FontHeader, tvguideConfig.colWidth - 8);
+ int lines = tw.Lines();
+ int lineHeight = tvguideConfig.FontHeader->Height();
+ int yStart = (tvguideConfig.headerHeight - lines*lineHeight)/2 + 8;
+
+ if (!tvguideConfig.hideChannelLogos) {
+ cImageLoader imgLoader;
+ if (imgLoader.LoadLogo(channel->Name())) {
+ cImage logo = imgLoader.GetImage();
+ int logoX = (tvguideConfig.colWidth - tvguideConfig.logoWidth)/2;
+ pixmap->DrawImage(cPoint(logoX, 5), logo);
+ }
+ yStart = tvguideConfig.logoHeight + 8;
+ }
+ for (int i=0; i<lines; i++) {
+ int textWidth = tvguideConfig.FontHeader->Width(tw.GetLine(i));
+ int xText = (tvguideConfig.colWidth - textWidth) / 2;
+ if (xText < 0)
+ xText = 0;
+ pixmap->DrawText(cPoint(xText, yStart + i*lineHeight), tw.GetLine(i), theme.Color(clrFontHeader), clrTransparent, tvguideConfig.FontHeader);
+ }
+ drawBorder();
+}
+
+void cChannelColumn::drawHeader() {
+ pixmap->SetViewPort(cRect(tvguideConfig.timeColWidth + num*tvguideConfig.colWidth, 0, tvguideConfig.colWidth, tvguideConfig.headerHeight));
+}
+
+bool cChannelColumn::readGrids() {
+ schedules = cSchedules::Schedules(schedulesLock);
+ const cSchedule *Schedule = NULL;
+ Schedule = schedules->GetSchedule(channel);
+ if (!Schedule) {
+ return false;
+ }
+ bool eventFound = false;
+ const cEvent *event = Schedule->GetEventAround(myTime->GetStart());
+ if (event != NULL) {
+ eventFound = true;
+ } else {
+ for (int i=1; i<6; i++) {
+ event = Schedule->GetEventAround(myTime->GetStart()+i*5*60);
+ if (event) {
+ eventFound = true;
+ break;
+ }
+ }
+ }
+ if (eventFound) {
+ bool col = true;
+ for (; event; event = Schedule->Events()->Next(event)) {
+ cEpgGrid *grid = new cEpgGrid(this, event);
+ grid->setText();
+ grid->SetColor(col);
+ col = !col;
+ grids.Add(grid);
+ if (event->EndTime() > myTime->GetStop()) {
+ break;
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+
+}
+
+void cChannelColumn::drawGrids() {
+ for (cEpgGrid *grid = grids.First(); grid; grid = grids.Next(grid)) {
+ grid->SetViewportHeight();
+ grid->PositionPixmap();
+ grid->Draw();
+ }
+}
+
+int cChannelColumn::getX() {
+ return tvguideConfig.timeColWidth + num*tvguideConfig.colWidth;
+}
+
+cEpgGrid * cChannelColumn::getActive() {
+ cMyTime t;
+ t.Now();
+ for (cEpgGrid *grid = grids.First(); grid; grid = grids.Next(grid)) {
+ if (grid->isActiveInitial(t.Get()))
+ return grid;
+ }
+ return grids.First();
+}
+
+cEpgGrid * cChannelColumn::getNext(cEpgGrid *activeGrid) {
+ if (activeGrid == NULL)
+ return NULL;
+ cEpgGrid *next = grids.Next(activeGrid);
+ if (next)
+ return next;
+ return NULL;
+}
+
+cEpgGrid * cChannelColumn::getPrev(cEpgGrid *activeGrid) {
+ if (activeGrid == NULL)
+ return NULL;
+ cEpgGrid *prev = grids.Prev(activeGrid);
+ if (prev)
+ return prev;
+ return NULL;
+}
+
+cEpgGrid * cChannelColumn::getNeighbor(cEpgGrid *activeGrid) {
+ if (!activeGrid)
+ return NULL;
+ cEpgGrid *neighbor = NULL;
+ int overlap = 0;
+ int overlapNew = 0;
+ cEpgGrid *grid = NULL;
+ grid = grids.First();
+ if (grid) {
+ for (; grid; grid = grids.Next(grid)) {
+ if ( (grid->StartTime() == activeGrid->StartTime()) ) {
+ neighbor = grid;
+ break;
+ }
+ overlapNew = activeGrid->calcOverlap(grid);
+ if (overlapNew > overlap) {
+ neighbor = grid;
+ overlap = overlapNew;
+ }
+ }
+ }
+ if (!neighbor)
+ neighbor = grids.First();
+ return neighbor;
+}
+
+void cChannelColumn::AddNewGridsAtStart() {
+ cEpgGrid *firstGrid = NULL;
+ firstGrid = grids.First();
+ if (firstGrid == NULL) {
+ //no epg, completely new.
+ schedules = cSchedules::Schedules(schedulesLock);
+ const cSchedule *Schedule = NULL;
+ Schedule = schedules->GetSchedule(channel);
+ if (!Schedule)
+ return;
+ const cEvent *event = Schedule->GetEventAround(myTime->GetStart());
+ if (!event)
+ return;
+ cEpgGrid *grid = new cEpgGrid(this, event);
+ grid->setText();
+ grid->SetColor(true);
+ grids.Ins(grid, grids.First());
+ return;
+ } else {
+ //if first event is long enough, nothing to do.
+ if (firstGrid->StartTime() <= myTime->GetStart()) {
+ return;
+ }
+ //if not, i have to add new ones to the list
+ schedules = cSchedules::Schedules(schedulesLock);
+ const cSchedule *Schedule = NULL;
+ Schedule = schedules->GetSchedule(channel);
+ if (!Schedule)
+ return;
+ bool col = !(firstGrid->IsColor1());
+ for (const cEvent *event = Schedule->GetEventAround(firstGrid->StartTime()-60); event; event = Schedule->Events()->Prev(event)) {
+ if (!event)
+ return;
+ cEpgGrid *grid = new cEpgGrid(this, event);
+ grid->setText();
+ grid->SetColor(col);
+ col = !col;
+ grids.Ins(grid, firstGrid);
+ firstGrid = grid;
+ if (event->StartTime() <= myTime->GetStart()) {
+ break;
+ }
+ }
+ }
+}
+
+void cChannelColumn::AddNewGridsAtEnd() {
+ cEpgGrid *lastGrid = NULL;
+ lastGrid = grids.Last();
+ if (lastGrid == NULL)
+ return;
+ //if last event is long enough, nothing to do.
+ if (lastGrid->EndTime() > myTime->GetStop()) {
+ return;
+ }
+ //if not, i have to add new ones to the list
+ schedules = cSchedules::Schedules(schedulesLock);
+ const cSchedule *Schedule = NULL;
+ Schedule = schedules->GetSchedule(channel);
+ if (!Schedule)
+ return;
+ bool col = !(lastGrid->IsColor1());
+ for (const cEvent *event = Schedule->GetEventAround(lastGrid->EndTime()+60); event; event = Schedule->Events()->Next(event)) {
+ if (!event)
+ return;
+ cEpgGrid *grid = new cEpgGrid(this, event);
+ grid->setText();
+ grid->SetColor(col);
+ col = !col;
+ grids.Add(grid);
+ if (event->EndTime() > myTime->GetStop()) {
+ break;
+ }
+ }
+}
+
+void cChannelColumn::ClearOutdatedStart() {
+ bool goOn = true;
+ cEpgGrid *firstGrid = NULL;
+ while (goOn) {
+ firstGrid = grids.First();
+ if ((firstGrid != NULL)&&(firstGrid->EndTime() < myTime->GetStart())) {
+ grids.Del(firstGrid);
+ firstGrid = NULL;
+ } else {
+ goOn = false;
+ }
+ }
+}
+
+void cChannelColumn::ClearOutdatedEnd() {
+ bool goOn = true;
+ cEpgGrid *lastGrid = NULL;
+ while (goOn) {
+ lastGrid = grids.Last();
+ if ((lastGrid != NULL)&&(lastGrid->StartTime() > myTime->GetStop())) {
+ grids.Del(lastGrid);
+ lastGrid = NULL;
+ } else {
+ goOn = false;
+ }
+ }
+}
+
+void cChannelColumn::dumpGrids() {
+ esyslog("------Channel %s ---------", channel->Name());
+
+ for (cEpgGrid *grid = grids.First(); grid; grid = grids.Next(grid)) {
+ grid->debug();
+ }
+
+}