#define __STL_CONFIG_H #include #include "../services/scraper2vdr.h" #include "displayreplayview.h" #include "../libcore/helpers.h" cDisplayReplayView::cDisplayReplayView(cTemplateView *tmplView) : cView(tmplView) { lastDate = ""; numMarksLast = 0; lastMarks = NULL; markActive = -1; DeleteOsdOnExit(); SetFadeTime(tmplView->GetNumericParameter(ptFadeTime)); } cDisplayReplayView::~cDisplayReplayView() { if (lastMarks) { delete[] lastMarks; } CancelSave(); FadeOut(); } bool cDisplayReplayView::createOsd(void) { cRect osdSize = tmplView->GetOsdSize(); bool ok = CreateOsd(cOsd::OsdLeft() + osdSize.X(), cOsd::OsdTop() + osdSize.Y(), osdSize.Width(), osdSize.Height()); return ok; } void cDisplayReplayView::DrawBackground(bool modeOnly) { map < string, string > stringTokens; map < string, int > intTokens; if (modeOnly) DrawViewElement(veBackgroundModeOnly, &stringTokens, &intTokens); else DrawViewElement(veBackground, &stringTokens, &intTokens); } void cDisplayReplayView::DrawDate(bool modeOnly) { if (modeOnly) return; if (!ViewElementImplemented(veDateTime)) { return; } cString curDate = DayDateTime(); if (strcmp(curDate, lastDate)) { map < string, string > stringTokens; map < string, int > intTokens; time_t t = time(0); // get time now struct tm * now = localtime(&t); intTokens.insert(pair("year", now->tm_year + 1900)); intTokens.insert(pair("day", now->tm_mday)); char monthname[20]; char monthshort[10]; strftime(monthshort, sizeof(monthshort), "%b", now); strftime(monthname, sizeof(monthname), "%B", now); stringTokens.insert(pair("monthname", monthname)); stringTokens.insert(pair("monthnameshort", monthshort)); stringTokens.insert(pair("month", *cString::sprintf("%02d", now->tm_mon + 1))); stringTokens.insert(pair("dayleadingzero", *cString::sprintf("%02d", now->tm_mday))); stringTokens.insert(pair("dayname", *WeekDayNameFull(now->tm_wday))); stringTokens.insert(pair("daynameshort", *WeekDayName(now->tm_wday))); stringTokens.insert(pair("time", *TimeString(t))); ClearViewElement(veDateTime); DrawViewElement(veDateTime, &stringTokens, &intTokens); lastDate = curDate; } } void cDisplayReplayView::DrawTitle(const cRecording *recording) { map < string, string > stringTokens; map < string, int > intTokens; const char *recName = NULL; const cRecordingInfo *recInfo = recording->Info(); if (recInfo) { recName = recInfo->Title(); } if (!recName) recName = recording->Name(); string recShortText = recInfo->ShortText() ? recInfo->ShortText() : ""; string recDate = *ShortDateString(recording->Start()); string recTime = *TimeString(recording->Start()); stringTokens.insert(pair("rectitle", recName ? recName : "")); stringTokens.insert(pair("recsubtitle", recShortText)); stringTokens.insert(pair("recdate", recDate)); stringTokens.insert(pair("rectime", recTime)); DrawViewElement(veRecTitle, &stringTokens, &intTokens); } void cDisplayReplayView::DrawRecordingInformation(const cRecording *recording) { map < string, string > stringTokens; map < string, int > intTokens; int screenWidth = 0; int screenHeight = 0; double aspect = 0; cDevice::PrimaryDevice()->GetVideoSize(screenWidth, screenHeight, aspect); bool isHD = false; string resName = GetScreenResolutionString(screenWidth, screenHeight, &isHD); bool isWideScreen = false; string aspectName = GetScreenAspectString(aspect, &isWideScreen); intTokens.insert(pair("screenwidth", screenWidth)); intTokens.insert(pair("screenheight", screenHeight)); intTokens.insert(pair("isHD", isHD)); intTokens.insert(pair("isWideScreen", isWideScreen)); stringTokens.insert(pair("resolution", resName)); stringTokens.insert(pair("aspect", aspectName)); ClearViewElement(veRecInfo); DrawViewElement(veRecInfo, &stringTokens, &intTokens); } void cDisplayReplayView::DrawScraperContent(const cRecording *recording) { if (!recording) return; if (!ViewElementImplemented(veScraperContent)) { return; } static cPlugin *pScraper = GetScraperPlugin(); if (!pScraper) { return; } ScraperGetPosterBannerV2 call; call.event = NULL; call.recording = recording; if (pScraper->Service("GetPosterBannerV2", &call)) { int mediaWidth = 0; int mediaHeight = 0; string mediaPath = ""; bool isBanner = false; int posterWidth = 0; int posterHeight = 0; string posterPath = ""; bool hasPoster = false; int bannerWidth = 0; int bannerHeight = 0; string bannerPath = ""; bool hasBanner = false; if ((call.type == tSeries) && call.banner.path.size() > 0) { mediaWidth = call.banner.width; mediaHeight = call.banner.height; mediaPath = call.banner.path; isBanner = true; bannerWidth = mediaWidth; bannerHeight = mediaHeight; bannerPath = mediaPath; hasBanner = true; ScraperGetPoster callPoster; callPoster.event = NULL; callPoster.recording = recording; if (pScraper->Service("GetPoster", &callPoster)) { posterWidth = callPoster.poster.width; posterHeight = callPoster.poster.height; posterPath = callPoster.poster.path; hasPoster = true; } } else if (call.type == tMovie && call.poster.path.size() > 0 && call.poster.height > 0) { mediaWidth = call.poster.width; mediaHeight = call.poster.height; mediaPath = call.poster.path; posterWidth = call.poster.width; posterHeight = call.poster.height; posterPath = call.poster.path; hasPoster = true; } else return; map < string, int > intTokens; map < string, string > stringTokens; intTokens.insert(pair("mediawidth", mediaWidth)); intTokens.insert(pair("mediaheight", mediaHeight)); intTokens.insert(pair("isbanner", isBanner)); stringTokens.insert(pair("mediapath", mediaPath)); intTokens.insert(pair("posterwidth", posterWidth)); intTokens.insert(pair("posterheight", posterHeight)); stringTokens.insert(pair("posterpath", posterPath)); intTokens.insert(pair("hasposter", hasPoster)); intTokens.insert(pair("bannerwidth", bannerWidth)); intTokens.insert(pair("bannerheight", bannerHeight)); stringTokens.insert(pair("bannerpath", bannerPath)); intTokens.insert(pair("hasbanner", hasBanner)); ClearViewElement(veScraperContent); DrawViewElement(veScraperContent, &stringTokens, &intTokens); } } void cDisplayReplayView::DrawCurrent(const char *current) { map < string, string > stringTokens; map < string, int > intTokens; stringTokens.insert(pair("reccurrent", current)); ClearViewElement(veRecCurrent); DrawViewElement(veRecCurrent, &stringTokens, &intTokens); } void cDisplayReplayView::DrawTotal(const char *total) { map < string, string > stringTokens; map < string, int > intTokens; stringTokens.insert(pair("rectotal", total)); ClearViewElement(veRecTotal); DrawViewElement(veRecTotal, &stringTokens, &intTokens); } void cDisplayReplayView::DrawProgressBar(int current, int total) { map < string, string > stringTokens; map < string, int > intTokens; intTokens.insert(pair("current", current)); intTokens.insert(pair("total", total)); stringTokens.insert(pair("dummy", "")); ClearViewElement(veRecProgressBar); DrawViewElement(veRecProgressBar, &stringTokens, &intTokens); } void cDisplayReplayView::DrawMarks(const cMarks *marks, int current, int total) { if (!marks) return; if (!MarksChanged(marks, current)) return; map < string, string > stringTokens; map < string, int > intTokens; map < string, vector< map< string, string > > > loopTokens; vector< map< string, string > > markTokens; stringstream tot; tot << total; bool isStartMark = true; for (const cMark *m = marks->First(); m; m = marks->Next(m)) { map< string, string > markVals; stringstream pos; pos << m->Position(); markVals.insert(pair< string, string >("marks[position]", pos.str())); markVals.insert(pair< string, string >("marks[total]", tot.str())); markVals.insert(pair< string, string >("marks[startmark]", isStartMark ? "1" : "0")); markVals.insert(pair< string, string >("marks[active]", (m->Position() == current) ? "1" : "0")); const cMark *m2 = marks->Next(m); if (m2) { stringstream posNext; posNext << m2->Position(); markVals.insert(pair< string, string >("marks[endposition]", posNext.str())); } else { markVals.insert(pair< string, string >("marks[endposition]", tot.str())); } isStartMark = !isStartMark; markTokens.push_back(markVals); } loopTokens.insert(pair< string, vector< map< string, string > > >("marks", markTokens)); ClearViewElement(veCuttingMarks); DrawViewElement(veCuttingMarks, &stringTokens, &intTokens, &loopTokens); } void cDisplayReplayView::DrawControlIcons(bool play, bool forward, int speed, bool modeOnly) { map < string, string > stringTokens; map < string, int > intTokens; bool isPlay = false; bool isPause = false; bool isFF = false; bool isFF1x = false; bool isFF2x = false; bool isFF3x = false; bool isRew = false; bool isRew1x = false; bool isRew2x = false; bool isRew3x = false; if (speed == -1) { if (play) { isPlay = true; } else { isPause = true; } } else if (forward) { if (!play) { isPause = true; } if (speed == 1) { isFF1x = true; } else if (speed == 2) { isFF2x = true; } else if (speed == 3) { isFF3x = true; } else { isFF = true; } } else { if (!play) { isPause = true; } if (speed == 1) { isRew1x = true; } else if (speed == 2) { isRew2x = true; } else if (speed == 3) { isRew3x = true; } else { isRew = true; } } intTokens.insert(pair("play", isPlay)); intTokens.insert(pair("pause", isPause)); intTokens.insert(pair("forward", isFF)); intTokens.insert(pair("forward1x", isFF1x)); intTokens.insert(pair("forward2x", isFF2x)); intTokens.insert(pair("forward3x", isFF3x)); intTokens.insert(pair("rewind", isRew)); intTokens.insert(pair("rewind1x", isRew1x)); intTokens.insert(pair("rewind2x", isRew2x)); intTokens.insert(pair("rewind3x", isRew3x)); if (modeOnly) { ClearViewElement(veControlIconsModeOnly); DrawViewElement(veControlIconsModeOnly, &stringTokens, &intTokens); } else { ClearViewElement(veControlIcons); DrawViewElement(veControlIcons, &stringTokens, &intTokens); } } void cDisplayReplayView::DrawJump(const char *jump) { if (!jump) { ClearViewElement(veRecJump); return; } map < string, string > stringTokens; map < string, int > intTokens; stringTokens.insert(pair("jump", jump)); ClearViewElement(veRecJump); DrawViewElement(veRecJump, &stringTokens, &intTokens); } void cDisplayReplayView::DrawMessage(eMessageType type, const char *text) { if (!text) { ClearViewElement(veMessage); } map < string, string > stringTokens; map < string, int > intTokens; stringTokens.insert(pair("text", text)); intTokens.insert(pair("status", (type == mtStatus) ? true : false)); intTokens.insert(pair("info", (type == mtInfo) ? true : false)); intTokens.insert(pair("warning", (type == mtWarning) ? true : false)); intTokens.insert(pair("error", (type == mtError) ? true : false)); ClearViewElement(veMessage); DrawViewElement(veMessage, &stringTokens, &intTokens); } /**************************************************************************************** * Private Functions *****************************************************************************************/ bool cDisplayReplayView::MarksChanged(const cMarks *marks, int current) { if (!marks) return false; bool redraw = false; //if mark was active, we redraw always if (markActive >= 0) { markActive = -1; redraw = true; } //check if current position in recording hits mark exactly for (const cMark *m = marks->First(); m; m = marks->Next(m)) { if (m->Position() == current) { markActive = current; redraw = true; break; } } if (redraw) return true; //if number of marks has changed, redraw int numMarks = marks->Count(); if (numMarks != numMarksLast) { RememberMarks(marks); return true; } if (!lastMarks) return false; //if position has changed, redraw int i=0; for (const cMark *m = marks->First(); m; m = marks->Next(m)) { if (m->Position() != lastMarks[i]) { RememberMarks(marks); return true; } i++; } return false; } void cDisplayReplayView::RememberMarks(const cMarks *marks) { if (!marks) return; numMarksLast = marks->Count(); if (numMarksLast < 1) return; if (lastMarks) { delete[] lastMarks; } lastMarks = new int[numMarksLast]; int i=0; for (const cMark *m = marks->First(); m; m = marks->Next(m)) { lastMarks[i] = m->Position(); i++; } } void cDisplayReplayView::Action(void) { SetInitFinished(); FadeIn(); DoFlush(); cView::Action(); }