summaryrefslogtreecommitdiff
path: root/detailview.c
diff options
context:
space:
mode:
Diffstat (limited to 'detailview.c')
-rw-r--r--detailview.c712
1 files changed, 108 insertions, 604 deletions
diff --git a/detailview.c b/detailview.c
index 3a93b9d..ca351ab 100644
--- a/detailview.c
+++ b/detailview.c
@@ -1,650 +1,154 @@
-#include <sstream>
-#include <vdr/plugin.h>
-#include "imageloader.h"
-#include "imagecache.h"
-#include "services/epgsearch.h"
-#include "services/remotetimers.h"
-#include "config.h"
-#include "tools.h"
#include "detailview.h"
cDetailView::cDetailView(const cEvent *event, cFooter *footer) {
this->event = event;
this->footer = footer;
- imgScrollBar = NULL;
- border = tvguideConfig.epgViewBorder; //px, border in view window
- scrollBarWidth = 40;
- headerWidth = geoManager.headerContentWidth;
- headerHeight = geoManager.epgViewHeaderHeight;
- pixmapPoster = NULL;
- width = geoManager.osdWidth;
- contentWidth = width - scrollBarWidth;
- contentX = 0;
- contentHeight = geoManager.osdHeight - headerHeight - geoManager.footerHeight;
- widthPoster = 30 * contentWidth / 100;
}
cDetailView::~cDetailView(void){
Cancel(-1);
while (Active())
cCondWait::SleepMs(10);
- osdManager.releasePixmap(back);
- delete header;
- header = NULL;
- osdManager.releasePixmap(headerLogo);
- headerLogo = NULL;
- osdManager.releasePixmap(content);
- content = NULL;
- if (pixmapPoster)
- osdManager.releasePixmap(pixmapPoster);
- pixmapPoster = NULL;
- osdManager.releasePixmap(scrollBar);
- scrollBar = NULL;
- delete imgScrollBar;
footer->LeaveDetailedViewMode(Channels.GetByChannelID(event->ChannelID()));
+ if (view)
+ delete view;
}
-void cDetailView::setContent() {
- hasAdditionalMedia = false;
- static cPlugin *pTVScraper = cPluginManager::GetPlugin("tvscraper");
- if (pTVScraper) {
- mediaInfo.event = event;
- mediaInfo.isRecording = false;
- if (pTVScraper->Service("TVScraperGetFullInformation", &mediaInfo)) {
- hasAdditionalMedia = true;
- }
- }
- if (hasAdditionalMedia) {
- if (mediaInfo.posters.size() >= 1) {
- contentWidth -= widthPoster;
- contentX += widthPoster;
- }
- }
- description.Set(event->Description(), fontManager.FontDetailView, contentWidth - scrollBarWidth - 2*border);
- if (tvguideConfig.displayRerunsDetailEPGView) {
- loadReruns();
- }
- numEPGPics = 0;
- contentScrollable = setContentDrawportHeight();
- createPixmaps();
-}
-
-bool cDetailView::setContentDrawportHeight() {
- int lineHeight = fontManager.FontDetailView->Height();
- //Height of banner (only for series)
- int heightBanner = 0;
- if (hasAdditionalMedia && (mediaInfo.type == typeSeries)) {
- heightBanner = mediaInfo.banner.height + 2*lineHeight;
- }
- //Height of EPG Text
- int heightEPG = (description.Lines()+1) * lineHeight;
- //Height of rerun information
- int heightReruns = 0;
- if (tvguideConfig.displayRerunsDetailEPGView) {
- heightReruns = (reruns.Lines()+1) * lineHeight;
- }
- //Height of actor pictures
- int heightActors = 0;
- if (hasAdditionalMedia) {
- heightActors = heightActorPics();
- }
- //Height of fanart
- int heightFanart = 0;
- if (hasAdditionalMedia) {
- heightFanart = heightFanartImg() + lineHeight;
- }
- //Height of EPG Pictures
- int heightEpgPics = 0;
- if (!tvguideConfig.hideEpgImages) {
- heightEpgPics = heightEPGPics();
- }
-
- yBanner = border;
- yEPGText = yBanner + heightBanner;
- yAddInf = yEPGText + heightEPG;
- yActors = yAddInf + heightReruns;
- yFanart = yActors + heightActors;
- yEPGPics = yFanart + heightFanart;
-
- int totalHeight = heightBanner + heightEPG + heightReruns + heightActors + heightFanart + heightEpgPics + lineHeight;
- //check if pixmap content has to be scrollable
- if (totalHeight > contentHeight) {
- heightContent = totalHeight;
- return true;
- } else {
- heightContent = contentHeight;
- return false;
- }
- return false;
-}
-
-void cDetailView::createPixmaps() {
- back = osdManager.requestPixmap(3, cRect(0, 0, width, headerHeight + contentHeight), cRect::Null);
- back->Fill(clrBlack);
- header = new cStyledPixmap(osdManager.requestPixmap(5, cRect(0, 0, headerWidth, headerHeight), cRect::Null));
- headerLogo = osdManager.requestPixmap(6, cRect(0, 0, width, headerHeight), cRect::Null);
- headerLogo->Fill(clrTransparent);
- header->setColor(theme.Color(clrHeader), theme.Color(clrHeaderBlending));
- content = osdManager.requestPixmap(5, cRect(contentX, headerHeight, contentWidth, contentHeight),
- cRect(0,0, contentWidth, max(heightContent, contentHeight)));
- if (hasAdditionalMedia) {
- pixmapPoster = osdManager.requestPixmap(4, cRect(0, 0 + headerHeight, widthPoster, contentHeight));
- pixmapPoster->Fill(theme.Color(clrBorder));
- pixmapPoster->DrawRectangle(cRect(2, 0, widthPoster - 2, content->DrawPort().Height()), theme.Color(clrBackground));
- }
- scrollBar = osdManager.requestPixmap(5, cRect(geoManager.osdWidth - scrollBarWidth, headerHeight, scrollBarWidth, contentHeight));
-}
-
-void cDetailView::drawHeader() {
- header->Fill(clrTransparent);
- if (tvguideConfig.style == eStyleGraphical) {
- if (tvguideConfig.scaleVideo) {
- header->drawBackgroundGraphical(bgStatusHeaderWindowed);
- } else {
- header->drawBackgroundGraphical(bgStatusHeaderFull);
+void cDetailView::InitiateView(void) {
+ static cPlugin *pScraper2Vdr = cPluginManager::GetPlugin("scraper2vdr");
+ ScraperGetEventType call;
+ if (!event)
+ return;
+ call.event = event;
+ if (!pScraper2Vdr) {
+ view = new cEPGView();
+ } else if (pScraper2Vdr->Service("GetEventType", &call)) {
+ if (call.type == tMovie) {
+ view = new cMovieView(call.movieId);
+ } else if (call.type == tSeries) {
+ view = new cSeriesView(call.seriesId, call.episodeId);
}
} else {
- header->drawBackground();
- header->drawBoldBorder();
- }
- if (tvguideConfig.scaleVideo) {
- back->DrawRectangle(cRect(headerWidth, 0, geoManager.tvFrameWidth, headerHeight), clrTransparent);
- }
- tColor colorTextBack = (tvguideConfig.style == eStyleFlat)?theme.Color(clrHeader):clrTransparent;
- int logoHeight = 2 * header->Height() / 3;
- int logoWidth = logoHeight * tvguideConfig.logoWidthRatio / tvguideConfig.logoHeightRatio;
- int lineHeight = fontManager.FontDetailHeader->Height();
- cImageLoader imgLoader;
- bool logoDrawn = false;
- if (!tvguideConfig.hideChannelLogos) {
- const cChannel *channel = Channels.GetByChannelID(event->ChannelID());
- if (imgLoader.LoadLogo(channel, logoWidth, logoHeight)) {
- cImage logo = imgLoader.GetImage();
- headerLogo->DrawImage(cPoint(10, (header->Height() - logoHeight)/2), logo);
- logoDrawn = true;
- }
- }
-
- bool epgImageDrawn = false;
- int epgImageWidth = 0;
- if (!tvguideConfig.hideEpgImages) {
- int epgImageHeight = 3 * headerHeight / 4;
- if (tvguideConfig.epgImageHeight > 0)
- epgImageWidth = epgImageHeight * tvguideConfig.epgImageWidth / tvguideConfig.epgImageHeight;
- if (imgLoader.LoadEPGImage(event->EventID(), epgImageWidth, epgImageHeight)) {
- cImage epgImage = imgLoader.GetImage();
- int epgImageX = headerWidth - border - epgImageWidth;
- int epgImageY = (headerHeight - epgImageHeight) / 2;
- header->DrawRectangle(cRect(epgImageX-2, epgImageY-2, epgImageWidth + 4, epgImageHeight + 4), theme.Color(clrBorder));
- header->DrawImage(cPoint(epgImageX, epgImageY), epgImage);
- epgImageDrawn = true;
- }
- }
- int textX = logoDrawn?(border + logoWidth + 5):border;
- int textY = (headerHeight - 7*lineHeight/2)/2;
- int maxTextWidth = headerWidth - 2 * border;
- if (logoDrawn)
- maxTextWidth -= logoWidth;
- if (epgImageDrawn)
- maxTextWidth -= epgImageWidth;
- std::string title = CutText((event->Title())?event->Title():"", maxTextWidth, fontManager.FontDetailHeader);
- header->DrawText(cPoint(textX, textY), title.c_str(), theme.Color(clrFont), colorTextBack, fontManager.FontDetailHeader);
- std::string datetime = *cString::sprintf("%s, %s - %s (%d min)", *event->GetDateString(), *event->GetTimeString(), *event->GetEndTimeString(), event->Duration()/60);
- datetime = CutText(datetime, maxTextWidth, fontManager.FontDetailView);
- textY += 5*lineHeight/4;
- header->DrawText(cPoint(textX, textY), datetime.c_str(), theme.Color(clrFont), colorTextBack, fontManager.FontDetailView);
- std::string shortText = CutText((event->ShortText())?event->ShortText():"", maxTextWidth, fontManager.FontDetailView);
- textY += 5*lineHeight/4;
- header->DrawText(cPoint(textX, textY), shortText.c_str(), theme.Color(clrFont), colorTextBack, fontManager.FontDetailView);
-
- eTimerMatch timerMatch=tmNone;
- cTimer *ti;
- if (tvguideConfig.useRemoteTimers && pRemoteTimers) {
- RemoteTimers_GetMatch_v1_0 rtMatch;
- rtMatch.event = event;
- pRemoteTimers->Service("RemoteTimers::GetMatch-v1.0", &rtMatch);
- timerMatch = (eTimerMatch)rtMatch.timerMatch;
- ti = rtMatch.timer;
+ view = new cEPGView();
+ }
+ view->SetTitle(event->Title());
+ view->SetSubTitle(event->ShortText());
+ view->SetInfoText(event->Description());
+ cString dateTime;
+ time_t vps = event->Vps();
+ if (vps) {
+ dateTime = cString::sprintf("%s %s - %s (%d %s) VPS: %s", *event->GetDateString(), *event->GetTimeString(), *event->GetEndTimeString(), event->Duration()/60, tr("min"), *TimeString(vps));
} else {
- ti=Timers.GetMatch(event, &timerMatch);
+ dateTime = cString::sprintf("%s %s - %s (%d %s)", *event->GetDateString(), *event->GetTimeString(), *event->GetEndTimeString(), event->Duration()/60, tr("min"));
}
- if (timerMatch == tmFull) {
- drawRecIcon();
- }
-}
-
-void cDetailView::drawRecIcon(void) {
- cString recIconText(" REC ");
- int widthIcon = fontManager.FontDetailHeader->Width(*recIconText);
- int height = fontManager.FontDetailHeader->Height()+10;
- int posX = headerWidth - widthIcon - 20;
- int posY = 20;
- header->DrawRectangle( cRect(posX, posY, widthIcon, height), theme.Color(clrButtonRed));
- header->DrawText(cPoint(posX, posY+5), *recIconText, theme.Color(clrFont), theme.Color(clrButtonRed), fontManager.FontDetailHeader);
+ view->SetDateTime(*dateTime);
+ view->SetChannel(Channels.GetByChannelID(event->ChannelID(), true));
+ view->SetEventID(event->EventID());
+ view->SetEvent(event);
}
-void cDetailView::drawContent() {
- content->Fill(theme.Color(clrBorder));
- content->DrawRectangle(cRect(2, 0, content->ViewPort().Width() - 2, content->DrawPort().Height()), theme.Color(clrBackground));
- tColor colorTextBack = (tvguideConfig.style == eStyleFlat)?theme.Color(clrBackground):clrTransparent;
+std::string cDetailView::LoadReruns(void) {
+ if (!event)
+ return "";
- int textHeight = fontManager.FontDetailView->Height();
- int textLines = description.Lines();
- for (int i=0; i<textLines; i++) {
- content->DrawText(cPoint(border, yEPGText + i*textHeight), description.GetLine(i), theme.Color(clrFont), colorTextBack, fontManager.FontDetailView);
- }
- if (tvguideConfig.displayRerunsDetailEPGView) {
- textLines = reruns.Lines();
- for (int j=0; j<textLines; j++) {
- content->DrawText(cPoint(border, yAddInf + j*textHeight), reruns.GetLine(j), theme.Color(clrFont), colorTextBack, fontManager.FontDetailView);
- }
- }
-}
-
-void cDetailView::Action(void) {
- if (hasAdditionalMedia && Running()) {
- drawPoster();
- if (Running())
- osdManager.flush();
- }
- //draw banner only for series
- if (hasAdditionalMedia && (mediaInfo.type == typeSeries) && Running()) {
- drawBanner(yBanner);
- if (Running())
- osdManager.flush();
- }
- //draw actors
- if (hasAdditionalMedia && Running()) {
- drawActors(yActors);
- if (Running())
- osdManager.flush();
- }
- //draw fanart
- if (hasAdditionalMedia && Running()) {
- drawFanart(yFanart);
- if (Running())
- osdManager.flush();
- }
- if (!tvguideConfig.hideEpgImages && Running()) {
- drawEPGPictures(yEPGPics);
- if (Running())
- osdManager.flush();
- }
-}
-
-void cDetailView::drawScrollbar() {
- scrollBar->Fill(theme.Color(clrBorder));
- double scrollBarOffset = 0.0;
- if (contentScrollable) {
- heightScrollbar = ( (double)scrollBar->ViewPort().Height() ) / (double)heightContent * ( (double)scrollBar->ViewPort().Height() );
- scrollBarOffset = (-1.0)*(double)content->DrawPort().Point().Y() / (double)(content->DrawPort().Height() - (contentHeight));
- scrollBarOffset *= ( (double)scrollBar->ViewPort().Height()-7.0 - heightScrollbar);
- scrollBarOffset++;
- } else {
- heightScrollbar = scrollBar->ViewPort().Height();
- }
- scrollBar->DrawRectangle(cRect(3,0,scrollBar->ViewPort().Width()-6, scrollBar->ViewPort().Height()), theme.Color(clrBackground));
- if (imgScrollBar == NULL) {
- imgScrollBar = createScrollbar(scrollBar->ViewPort().Width()-10, heightScrollbar, theme.Color(clrHighlight), theme.Color(clrHighlightBlending));
- }
- scrollBar->DrawImage(cPoint(5, 2 + scrollBarOffset), *imgScrollBar);
-}
-
-void cDetailView::scrollUp() {
- if (contentScrollable) {
- int newDrawportHeight = content->DrawPort().Point().Y() + fontManager.FontDetailView->Height();
- content->SetDrawPortPoint(cPoint(0, min(newDrawportHeight,0)));
- drawScrollbar();
- }
-}
-
-void cDetailView::scrollDown() {
- if (contentScrollable) {
- int newDrawportHeight = content->DrawPort().Point().Y() - fontManager.FontDetailView->Height();
- int maxDrawportHeight = (content->DrawPort().Height() - contentHeight);
- content->SetDrawPortPoint(cPoint(0, max(newDrawportHeight,(-1)*maxDrawportHeight)));
- drawScrollbar();
- }
-}
-
-void cDetailView::pageUp() {
- if (contentScrollable) {
- int aktHeight = (-1)*content->DrawPort().Point().Y();
- int totalHeight = content->DrawPort().Height();
- int screenHeight = content->ViewPort().Height();
- int newHeight = max(aktHeight - screenHeight, 0);
- content->SetDrawPortPoint(cPoint(0, (-1)*newHeight));
- drawScrollbar();
- }
-}
-
-void cDetailView::pageDown() {
- if (contentScrollable) {
- int aktHeight = (-1)*content->DrawPort().Point().Y();
- int totalHeight = content->DrawPort().Height();
- int screenHeight = content->ViewPort().Height();
- int newHeight = min(aktHeight + screenHeight, totalHeight - screenHeight);
- content->SetDrawPortPoint(cPoint(0, (-1)*newHeight));
- drawScrollbar();
- }
-}
-
-cImage *cDetailView::createScrollbar(int width, int height, tColor clrBgr, tColor clrBlend) {
- cImage *image = new cImage(cSize(width, height));
- image->Fill(clrBgr);
- if (tvguideConfig.style != eStyleFlat) {
- int numSteps = 64;
- int alphaStep = 0x03;
- if (height < 30)
- return image;
- else if (height < 100) {
- numSteps = 32;
- alphaStep = 0x06;
- }
- int stepY = 0.5*height / numSteps;
- if (stepY == 0)
- stepY = 1;
- int alpha = 0x40;
- tColor clr;
- for (int i = 0; i<numSteps; i++) {
- clr = AlphaBlend(clrBgr, clrBlend, alpha);
- for (int y = i*stepY; y < (i+1)*stepY; y++) {
- for (int x=0; x<width; x++) {
- image->SetPixel(cPoint(x,y), clr);
- }
- }
- alpha += alphaStep;
- }
- }
- return image;
-}
-
-void cDetailView::loadReruns(void) {
cPlugin *epgSearchPlugin = cPluginManager::GetPlugin("epgsearch");
- if (epgSearchPlugin && !isempty(event->Title())) {
- std::stringstream sstrReruns;
- Epgsearch_searchresults_v1_0 data;
- std::string strQuery = event->Title();
- if (tvguideConfig.useSubtitleRerun > 0) {
- if (tvguideConfig.useSubtitleRerun == 2 || !isempty(event->ShortText()))
- strQuery += "~";
- if (!isempty(event->ShortText()))
- strQuery += event->ShortText();
- data.useSubTitle = true;
- } else {
- data.useSubTitle = false;
- }
- data.query = (char *)strQuery.c_str();
- data.mode = 0;
- data.channelNr = 0;
- data.useTitle = true;
- data.useDescription = false;
-
- if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) {
- cList<Epgsearch_searchresults_v1_0::cServiceSearchResult>* list = data.pResultList;
- if (list && (list->Count() > 1)) {
- sstrReruns << tr("RERUNS OF THIS SHOW") << ':' << std::endl;
- int i = 0;
- for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = list->First(); r && i < tvguideConfig.numReruns; r = list->Next(r)) {
- if ((event->ChannelID() == r->event->ChannelID()) && (event->StartTime() == r->event->StartTime()))
- continue;
- i++;
- sstrReruns << "- "
- << *DayDateTime(r->event->StartTime());
- cChannel *channel = Channels.GetByChannelID(r->event->ChannelID(), true, true);
- if (channel)
- sstrReruns << " " << channel->ShortName(true);
- sstrReruns << ": " << r->event->Title();
- if (!isempty(r->event->ShortText()))
- sstrReruns << "~" << r->event->ShortText();
- sstrReruns << std::endl;
- }
- delete list;
- }
- }
- reruns.Set(sstrReruns.str().c_str(), fontManager.FontDetailView, contentWidth - scrollBarWidth - 2*border);
- } else
- reruns.Set("", fontManager.FontDetailView, contentWidth - scrollBarWidth);
-}
+ if (!epgSearchPlugin)
+ return "";
-int cDetailView::heightEPGPics(void) {
- int border = 5;
- int numPicsAvailable = 0;
- for (int i=1; i <= tvguideConfig.numAdditionalEPGPictures; i++) {
- cString epgimage = cString::sprintf("%s%d_%d.jpg", *tvguideConfig.epgImagePath, event->EventID(), i);
- FILE *fp = fopen(*epgimage, "r");
- if (fp) {
- numPicsAvailable = i;
- fclose(fp);
- } else {
- break;
- }
- }
- numEPGPics = numPicsAvailable;
- int picsPerLine = contentWidth / (tvguideConfig.epgImageWidthLarge + border);
- int picLines = numPicsAvailable / picsPerLine;
- if (numPicsAvailable%picsPerLine != 0)
- picLines++;
- return picLines * (tvguideConfig.epgImageHeightLarge + border) + 2*border;
-}
+ if (isempty(event->Title()))
+ return "";
+
+ std::stringstream sstrReruns;
+ sstrReruns << tr("Reruns of ") << "\"" << event->Title() << "\":" << std::endl << std::endl;
-int cDetailView::heightActorPics(void) {
- int numActors = mediaInfo.actors.size();
- if (numActors < 1)
- return 0;
- if (mediaInfo.type == typeMovie) {
- actorThumbWidth = mediaInfo.actors[0].thumb.width/2;
- actorThumbHeight = mediaInfo.actors[0].thumb.height/2;
- } else if (mediaInfo.type == typeSeries) {
- actorThumbWidth = mediaInfo.actors[0].thumb.width/2;
- actorThumbHeight = mediaInfo.actors[0].thumb.height/2;
- }
- int picsPerLine = contentWidth / (actorThumbWidth + 2*border);
- int picLines = numActors / picsPerLine;
- if (numActors%picsPerLine != 0)
- picLines++;
- int actorsHeight = picLines * (actorThumbHeight + 2*fontManager.FontDetailViewSmall->Height()) + fontManager.FontDetailView->Height() + fontManager.FontDetailHeader->Height();
- return actorsHeight;
-}
+ Epgsearch_searchresults_v1_0 data;
+ std::string strQuery = event->Title();
-int cDetailView::heightFanartImg(void) {
- int retVal = 0;
- if (mediaInfo.fanart.size() >= 1) {
- int fanartWidthOrig = mediaInfo.fanart[0].width;
- int fanartHeightOrig = mediaInfo.fanart[0].height;
- int fanartWidth = fanartWidthOrig;
- int fanartHeight = fanartHeightOrig;
- retVal = fanartHeight;
- if (fanartWidthOrig > (contentWidth - 2*border)) {
- fanartWidth = contentWidth - 2*border;
- fanartHeight = fanartHeightOrig * ((double)fanartWidth / (double)fanartWidthOrig);
- retVal = fanartHeight;
+ if (tvguideConfig.displayRerunsDetailEPGView > 0) {
+ if (tvguideConfig.useSubtitleRerun == 2 && !isempty(event->ShortText())) {
+ strQuery += "~";
+ strQuery += event->ShortText();
}
- }
- return retVal;
-}
-
-void cDetailView::drawEPGPictures(int height) {
- int border = 5;
- int picsPerLine = contentWidth / (tvguideConfig.epgImageWidthLarge + border);
- int currentX = border;
- int currentY = height + border;
- int currentPicsPerLine = 1;
- cImageLoader imgLoader;
- for (int i=1; i <= numEPGPics; i++) {
- cString epgimage = cString::sprintf("%d_%d", event->EventID(), i);
- if (imgLoader.LoadAdditionalEPGImage(epgimage)) {
- content->DrawImage(cPoint(currentX, currentY), imgLoader.GetImage());
- int radius = 10;
- content->DrawEllipse(cRect(currentX,currentY,radius,radius), theme.Color(clrBackground), -2);
- content->DrawEllipse(cRect(currentX + tvguideConfig.epgImageWidthLarge - radius,currentY,radius,radius), theme.Color(clrBackground), -1);
- content->DrawEllipse(cRect(currentX,currentY + tvguideConfig.epgImageHeightLarge - radius,radius,radius), theme.Color(clrBackground), -3);
- content->DrawEllipse(cRect(currentX + tvguideConfig.epgImageWidthLarge - radius,currentY + tvguideConfig.epgImageHeightLarge - radius,radius,radius), theme.Color(clrBackground), -4);
- if (currentPicsPerLine < picsPerLine) {
- currentX += tvguideConfig.epgImageWidthLarge + border;
- currentPicsPerLine++;
- } else {
- currentX = border;
- currentY += tvguideConfig.epgImageHeightLarge + border;
- currentPicsPerLine = 1;
+ data.useSubTitle = true;
+ } else {
+ data.useSubTitle = false;
+ }
+ data.query = (char *)strQuery.c_str();
+ data.mode = 0;
+ data.channelNr = 0;
+ data.useTitle = true;
+ data.useDescription = false;
+
+ bool foundRerun = false;
+ if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) {
+ cList<Epgsearch_searchresults_v1_0::cServiceSearchResult>* list = data.pResultList;
+ if (list && (list->Count() > 1)) {
+ foundRerun = true;
+ int i = 0;
+ for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = list->First(); r && i < tvguideConfig.numReruns; r = list->Next(r)) {
+ if ((event->ChannelID() == r->event->ChannelID()) && (event->StartTime() == r->event->StartTime()))
+ continue;
+ i++;
+ sstrReruns << *DayDateTime(r->event->StartTime());
+ cChannel *channel = Channels.GetByChannelID(r->event->ChannelID(), true, true);
+ if (channel) {
+ sstrReruns << ", " << trVDR("Channel") << " " << channel->Number() << ":";
+ sstrReruns << " " << channel->ShortName(true);
+ }
+ sstrReruns << "\n" << r->event->Title();
+ if (!isempty(r->event->ShortText()))
+ sstrReruns << "~" << r->event->ShortText();
+ sstrReruns << std::endl << std::endl;
}
- } else {
- break;
- }
- }
-}
-
-void cDetailView::drawPoster(void) {
- int border = 10;
- if (mediaInfo.posters.size() < 1)
- return;
- int posterWidthOrig = mediaInfo.posters[0].width;
- int posterHeightOrig = mediaInfo.posters[0].height;
- if ((posterWidthOrig < 10) || (posterHeightOrig < 10))
- return;
- int posterWidth = posterWidthOrig;
- int posterHeight = posterHeightOrig;
- if ((posterWidthOrig > widthPoster) && (posterHeightOrig < contentHeight)) {
- posterWidth = widthPoster - 2*border;
- posterHeight = posterHeightOrig * ((double)posterWidth / (double)posterWidthOrig);
- } else if ((posterWidthOrig < widthPoster) && (posterHeightOrig > contentHeight)) {
- posterHeight = contentHeight - 2*border;
- posterWidth = posterWidthOrig * ((double)posterHeight / (double)posterHeightOrig);
- } else if ((posterWidthOrig > widthPoster) && (posterHeightOrig > contentHeight)) {
- double ratioPoster = posterHeightOrig / posterWidthOrig;
- double ratioWindow = contentHeight / widthPoster;
- if (ratioPoster >= ratioWindow) {
- posterWidth = widthPoster - 2*border;
- posterHeight = posterHeightOrig * ((double)posterWidth / (double)posterWidthOrig);
- } else {
- posterHeight = contentHeight - 2*border;
- posterWidth = posterWidthOrig * ((double)posterHeight / (double)posterHeightOrig);
+ delete list;
}
}
- if (!Running())
- return;
- cImageLoader imgLoader;
- if (imgLoader.LoadPoster(mediaInfo.posters[0].path.c_str(), posterWidth, posterHeight)) {
- int posterX = (widthPoster - posterWidth) / 2;
- int posterY = (contentHeight - posterHeight) / 2;
- if (Running() && pixmapPoster)
- pixmapPoster->DrawImage(cPoint(posterX, posterY), imgLoader.GetImage());
- }
-}
-void cDetailView::drawBanner(int height) {
- int bannerWidthOrig = mediaInfo.banner.width;
- int bannerHeightOrig = mediaInfo.banner.height;
- int bannerWidth = bannerWidthOrig;
- int bannerHeight = bannerHeightOrig;
-
- if (bannerWidthOrig > contentWidth - 2*border) {
- bannerWidth = contentWidth - 2*border;
- bannerHeight = bannerHeightOrig * ((double)bannerWidth / (double)bannerWidthOrig);
- }
- if (!Running())
- return;
- cImageLoader imgLoader;
- if (imgLoader.LoadPoster(mediaInfo.banner.path.c_str(), bannerWidth, bannerHeight)) {
- int bannerX = (contentWidth - bannerWidth) / 2;
- if (Running() && content)
- content->DrawImage(cPoint(bannerX, height), imgLoader.GetImage());
+ if (!foundRerun) {
+ sstrReruns << std::endl << tr("No reruns found");
}
+ return sstrReruns.str();
}
-void cDetailView::drawActors(int height) {
- int numActors = mediaInfo.actors.size();
- if (numActors < 1)
- return;
- tColor colorTextBack = (tvguideConfig.style == eStyleFlat)?theme.Color(clrBackground):clrTransparent;
-
- cString header = cString::sprintf("%s:", tr("Actors"));
- content->DrawText(cPoint(border, height), *header, theme.Color(clrFont), colorTextBack, fontManager.FontDetailHeader);
- int picsPerLine = contentWidth / (actorThumbWidth + 2*border);
- int picLines = numActors / picsPerLine;
- if (numActors%picsPerLine != 0)
- picLines++;
- int x = 0;
- int y = height + fontManager.FontDetailHeader->Height();
- if (!Running())
- return;
- cImageLoader imgLoader;
- int actor = 0;
- for (int row = 0; row < picLines; row++) {
- for (int col = 0; col < picsPerLine; col++) {
- if (!Running())
- return;
- if (actor == numActors)
- break;
- std::string path = mediaInfo.actors[actor].thumb.path;
- if (imgLoader.LoadPoster(path.c_str(), actorThumbWidth, actorThumbHeight)) {
- if (Running() && content)
- content->DrawImage(cPoint(x + border, y), imgLoader.GetImage());
- }
- std::string name = mediaInfo.actors[actor].name;
- std::stringstream sstrRole;
- sstrRole << "\"" << mediaInfo.actors[actor].role << "\"";
- std::string role = sstrRole.str();
- if (fontManager.FontDetailViewSmall->Width(name.c_str()) > actorThumbWidth + 2*border)
- name = CutText(name, actorThumbWidth + 2*border, fontManager.FontDetailViewSmall);
- if (fontManager.FontDetailViewSmall->Width(role.c_str()) > actorThumbWidth + 2*border)
- role = CutText(role, actorThumbWidth + 2*border, fontManager.FontDetailViewSmall);
- int xName = x + ((actorThumbWidth+2*border) - fontManager.FontDetailViewSmall->Width(name.c_str()))/2;
- int xRole = x + ((actorThumbWidth+2*border) - fontManager.FontDetailViewSmall->Width(role.c_str()))/2;
- if (Running() && content) {
- content->DrawText(cPoint(xName, y + actorThumbHeight), name.c_str(), theme.Color(clrFont), colorTextBack, fontManager.FontDetailViewSmall);
- content->DrawText(cPoint(xRole, y + actorThumbHeight + fontManager.FontDetailViewSmall->Height()), role.c_str(), theme.Color(clrFont), colorTextBack, fontManager.FontDetailViewSmall);
- x += actorThumbWidth + 2*border;
- }
- actor++;
- }
- x = 0;
- y += actorThumbHeight + 2 * fontManager.FontDetailViewSmall->Height();
- }
-}
-
-void cDetailView::drawFanart(int height) {
- if (mediaInfo.fanart.size() < 1)
- return;
- int fanartWidthOrig = mediaInfo.fanart[0].width;
- int fanartHeightOrig = mediaInfo.fanart[0].height;
- int fanartWidth = fanartWidthOrig;
- int fanartHeight = fanartHeightOrig;
-
- if (fanartWidthOrig > contentWidth - 2*border) {
- fanartWidth = contentWidth - 2*border;
- fanartHeight = fanartHeightOrig * ((double)fanartWidth / (double)fanartWidthOrig);
- }
- if (!Running())
+void cDetailView::Action(void) {
+ InitiateView();
+ if (!view)
return;
- cImageLoader imgLoader;
- if (imgLoader.LoadPoster(mediaInfo.fanart[0].path.c_str(), fanartWidth, fanartHeight)) {
- int fanartX = (contentWidth - fanartWidth) / 2;
- if (Running() && content)
- content->DrawImage(cPoint(fanartX, height), imgLoader.GetImage());
- }
+ view->SetFonts();
+ view->SetGeometry();
+ view->LoadMedia();
+ view->Start();
+ if (event)
+ view->SetAdditionalInfoText(LoadReruns());
}
-
eOSState cDetailView::ProcessKey(eKeys Key) {
eOSState state = osContinue;
+ if (Running())
+ return state;
switch (Key & ~k_Repeat) {
- case kUp:
- scrollUp();
- osdManager.flush();
- break;
- case kDown:
- scrollDown();
- osdManager.flush();
- break;
+ case kUp: {
+ bool scrolled = view->KeyUp();
+ if (scrolled) {
+ view->DrawScrollbar();
+ osdManager.flush();
+ }
+ break; }
+ case kDown: {
+ bool scrolled = view->KeyDown();
+ if (scrolled) {
+ view->DrawScrollbar();
+ osdManager.flush();
+ }
+ break; }
case kLeft:
- pageUp();
- osdManager.flush();
+ view->KeyLeft();
+ view->Start();
break;
case kRight:
- pageDown();
- osdManager.flush();
+ view->KeyRight();
+ view->Start();
break;
case kOk:
case kBack: