From 47c3fea545a1b4607deda1e7d2fa51cbcf89a656 Mon Sep 17 00:00:00 2001 From: louis Date: Thu, 17 Jan 2013 13:16:44 +0100 Subject: Initial push tvguide 0.0.1 --- detailview.c | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 detailview.c (limited to 'detailview.c') diff --git a/detailview.c b/detailview.c new file mode 100644 index 0000000..2c791e4 --- /dev/null +++ b/detailview.c @@ -0,0 +1,186 @@ +#include "detailview.h" + +cDetailView::cDetailView(cEpgGrid *grid) { + this->grid = grid; + this->event = grid->GetEvent(); + imgScrollBar = NULL; + FrameTime = 40; // ms + FadeTime = 500; // ms + borderWidth = 100; //px + headerHeight = max (80 + tvguideConfig.logoHeight + 3 * tvguideConfig.FontDetailHeader->Height(), // border + logo + 3 Lines + 80 + tvguideConfig.epgImageHeight); + description.Set(event->Description(), tvguideConfig.FontDetailView, tvguideConfig.osdWidth-2*borderWidth - 50 - 40); + contentScrollable = setContentDrawportHeight(); + createPixmaps(); +} + +cDetailView::~cDetailView(void){ + delete header; + osdManager.releasePixmap(content); + osdManager.releasePixmap(scrollBar); + osdManager.releasePixmap(footer); + delete imgScrollBar; +} + +bool cDetailView::setContentDrawportHeight() { + int linesContent = description.Lines() + 1; + heightContent = linesContent * tvguideConfig.FontDetailView->Height(); + if (heightContent > (tvguideConfig.osdHeight - 2 * borderWidth - headerHeight)) + return true; + else + return false; +} + +void cDetailView::createPixmaps() { + int scrollBarWidth = 50; + + header = new cStyledPixmap(osdManager.requestPixmap(5, cRect(borderWidth, borderWidth, tvguideConfig.osdWidth - 2*borderWidth, headerHeight), cRect::Null, "detailViewHeader"), "detailViewHeader"); + header->SetAlpha(0); + header->setColor(theme.Color(clrHeader), theme.Color(clrHeaderBlending)); + content = osdManager.requestPixmap(5, cRect(borderWidth, borderWidth + headerHeight, tvguideConfig.osdWidth - 2*borderWidth - scrollBarWidth, tvguideConfig.osdHeight-2*borderWidth-headerHeight), + cRect(0,0, tvguideConfig.osdWidth - 2*borderWidth - scrollBarWidth, max(heightContent, tvguideConfig.osdHeight-2*borderWidth-headerHeight))); + content->SetAlpha(0); + header->setColor(theme.Color(clrHeader), theme.Color(clrHeaderBlending)); + + scrollBar = osdManager.requestPixmap(5, cRect(tvguideConfig.osdWidth-borderWidth-scrollBarWidth, borderWidth + headerHeight, scrollBarWidth, tvguideConfig.osdHeight-2*borderWidth-headerHeight)); + scrollBar->SetAlpha(0); + + footer = osdManager.requestPixmap(5, cRect(borderWidth, borderWidth + headerHeight + content->ViewPort().Height(), tvguideConfig.osdWidth - 2*borderWidth, 3)); + footer->SetAlpha(0); + footer->Fill(clrWhite); +} + +void cDetailView::drawHeader() { + header->drawBackground(); + header->drawBoldBorder(); + + int lineHeight = tvguideConfig.FontDetailHeader->Height(); + int offset = 30; + cImageLoader imgLoader; + if (tvguideConfig.hideChannelLogos) { + header->DrawText(cPoint(20, offset + 10), grid->column->getChannel()->Name(), theme.Color(clrFont), clrTransparent, tvguideConfig.FontDetailHeader); + offset += lineHeight + 10; + } else { + if (imgLoader.LoadLogo(grid->column->getChannel()->Name())) { + cImage logo = imgLoader.GetImage(); + header->DrawImage(cPoint(20, 20), logo); + } + offset += tvguideConfig.logoHeight; + } + + if (!tvguideConfig.hideEpgImages) { + if (imgLoader.LoadEPGImage(event->EventID())) { + cImage epgImage = imgLoader.GetImage(); + int epgImageX = header->Width() - 30 - tvguideConfig.epgImageWidth; + int epgImageY = (header->Height() - 10 - tvguideConfig.epgImageHeight) / 2; + header->DrawRectangle(cRect(epgImageX-2, epgImageY-2, tvguideConfig.epgImageWidth + 4, tvguideConfig.epgImageHeight + 4), theme.Color(clrBorder)); + header->DrawImage(cPoint(epgImageX, epgImageY), epgImage); + } + } + + header->DrawText(cPoint(20, offset), event->Title(), theme.Color(clrFont), clrTransparent, tvguideConfig.FontDetailHeader); + cString datetime = cString::sprintf("%s, %s - %s (%d min)", *event->GetDateString(), *event->GetTimeString(), *event->GetEndTimeString(), event->Duration()/60); + header->DrawText(cPoint(20, offset + lineHeight), *datetime, theme.Color(clrFont), clrTransparent, tvguideConfig.FontDetailView); + header->DrawText(cPoint(20, offset + 2 * lineHeight), event->ShortText(), theme.Color(clrFont), clrTransparent, tvguideConfig.FontDetailView); +} + +void cDetailView::drawContent() { + content->Fill(theme.Color(clrBorder)); + content->DrawRectangle(cRect(2, 0, content->ViewPort().Width() - 2, content->DrawPort().Height()), theme.Color(clrBackground)); + + int textHeight = tvguideConfig.FontDetailView->Height(); + int textLines = description.Lines(); + + for (int i=0; iDrawText(cPoint(20, 20 + i*textHeight), description.GetLine(i), theme.Color(clrFont), clrTransparent, tvguideConfig.FontDetailView); + } +} + +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() - (tvguideConfig.osdHeight-2*borderWidth-headerHeight)); + 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() + tvguideConfig.FontDetailView->Height(); + content->SetDrawPortPoint(cPoint(0, min(newDrawportHeight,0))); + drawScrollbar(); + } +} + +void cDetailView::scrollDown() { + if (contentScrollable) { + int newDrawportHeight = content->DrawPort().Point().Y() - tvguideConfig.FontDetailView->Height(); + int maxDrawportHeight = (content->DrawPort().Height() - (tvguideConfig.osdHeight-2*borderWidth-headerHeight)); + content->SetDrawPortPoint(cPoint(0, max(newDrawportHeight,(-1)*maxDrawportHeight))); + drawScrollbar(); + } +} + +cImage *cDetailView::createScrollbar(int width, int height, tColor clrBgr, tColor clrBlend) { + cImage *image = new cImage(cSize(width, height)); + image->Fill(clrBgr); + if (tvguideConfig.useBlending) { + 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; iSetPixel(cPoint(x,y), clr); + } + } + alpha += alphaStep; + } + } + return image; +} + +void cDetailView::Action(void) { + drawHeader(); + drawContent(); + drawScrollbar(); + uint64_t Start = cTimeMs::Now(); + while (true) { + uint64_t Now = cTimeMs::Now(); + cPixmap::Lock(); + double t = min(double(Now - Start) / FadeTime, 1.0); + int Alpha = t * ALPHA_OPAQUE; + header->SetAlpha(Alpha); + content->SetAlpha(Alpha); + scrollBar->SetAlpha(Alpha); + footer->SetAlpha(Alpha); + osdManager.flush(); + cPixmap::Unlock(); + int Delta = cTimeMs::Now() - Now; + if (Delta < FrameTime) + cCondWait::SleepMs(FrameTime - Delta); + if ((Now - Start) > FadeTime) + break; + } +} \ No newline at end of file -- cgit v1.2.3