From 65f5c91d83af805ff3a67fbba5897e17145028a1 Mon Sep 17 00:00:00 2001 From: anbr Date: Sun, 3 Nov 2013 11:01:23 +0100 Subject: New render mode - multiple pages --- HISTORY | 2 + po/de_DE.po | 10 +-- po/it_IT.po | 5 +- setup.c | 3 +- setup.h | 1 + targavfd.c | 2 +- watch.c | 216 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- watch.h | 18 +++-- 8 files changed, 212 insertions(+), 45 deletions(-) diff --git a/HISTORY b/HISTORY index 840f386..fa8874d 100644 --- a/HISTORY +++ b/HISTORY @@ -1,6 +1,8 @@ VDR Plugin 'targavfd' Revision History ------------------------------------- +2013-xx-xx: Version 0.3.0 +- New render mode - multiple pages - New option, show replay progress as bargraph (Request #666) - Fix display wrong time for HD recording if they greater than one hour (Bug #1568) diff --git a/po/de_DE.po b/po/de_DE.po index 9d3a19e..af120ae 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -2,12 +2,12 @@ # Copyright (C) Andreas Brachold # This file is distributed under the same license as the PACKAGE package. # -# Andreas Brachold 2009 - 2013. +# Andreas Brachold 2010 - 2013. msgid "" msgstr "" -"Project-Id-Version: vdr-targavfd-plugin 0.2.2\n" +"Project-Id-Version: vdr-targavfd-plugin 0.3.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-10-31 18:08+0100\n" +"POT-Creation-Date: 2013-11-02 18:11+0100\n" "PO-Revision-Date: 2010-07-02 21:25+0200\n" "Last-Translator: Andreas Brachold \n" "Language-Team: Andreas Brachold \n" @@ -40,6 +40,9 @@ msgstr "Zwei Zeilen" msgid "Only topic" msgstr "Nur Titel" +msgid "Multiple pages" +msgstr "Mehrere Seiten" + msgid "Render mode" msgstr "Anzeigemodus" @@ -108,4 +111,3 @@ msgstr "Kein aktiver Timer" msgid "Unknown title" msgstr "Unbekannter Titel" - diff --git a/po/it_IT.po b/po/it_IT.po index 117e640..2510495 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: vdr-targavfd-plugin 0.0.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-10-31 18:43+0100\n" +"POT-Creation-Date: 2013-11-02 18:11+0100\n" "PO-Revision-Date: 2010-11-01 22:55+0100\n" "Last-Translator: Diego Pierotto \n" "Language-Team: \n" @@ -43,6 +43,9 @@ msgstr "Linee doppie" msgid "Only topic" msgstr "Solo titolo" +msgid "Multiple pages" +msgstr "" + msgid "Render mode" msgstr "Modalità visualizzazione" diff --git a/setup.c b/setup.c index 8c3d6f8..f4cf248 100644 --- a/setup.c +++ b/setup.c @@ -244,10 +244,11 @@ cVFDMenuSetup::cVFDMenuSetup(cVFDWatch* pDev) &m_tmpSetup.m_nBrightness, memberof(szBrightness), szBrightness)); - static const char * szRenderMode[3]; + static const char * szRenderMode[eRenderMode_LASTITEM]; szRenderMode[eRenderMode_SingleLine] = tr("Single line"); szRenderMode[eRenderMode_DualLine] = tr("Dual lines"); szRenderMode[eRenderMode_SingleTopic] = tr("Only topic"); + szRenderMode[eRenderMode_MultiPage] = tr("Multiple pages"); Add(new cMenuEditStraItem(tr("Render mode"), &m_tmpSetup.m_nRenderMode, diff --git a/setup.h b/setup.h index 35009c1..7b82a6a 100644 --- a/setup.h +++ b/setup.h @@ -38,6 +38,7 @@ enum eRenderMode { eRenderMode_SingleLine /**< Render screen at single line */ ,eRenderMode_DualLine /**< Render screen at dual line */ ,eRenderMode_SingleTopic /**< Render screen at single line, only names */ + ,eRenderMode_MultiPage /**< Render screen at multiple pages */ ,eRenderMode_LASTITEM }; diff --git a/targavfd.c b/targavfd.c index 4766059..9ad3031 100644 --- a/targavfd.c +++ b/targavfd.c @@ -21,7 +21,7 @@ #include "status.h" #include "setup.h" -static const char *VERSION = "0.2.1"; +static const char *VERSION = "0.3.0"; cPluginTargaVFD::cPluginTargaVFD(void) { diff --git a/watch.c b/watch.c index c00157e..cb148e8 100644 --- a/watch.c +++ b/watch.c @@ -1,7 +1,7 @@ /* * targavfd plugin for VDR (C++) * - * (C) 2010 Andreas Brachold + * (C) 2010-2013 Andreas Brachold * * This targavfd plugin is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published @@ -45,7 +45,7 @@ cVFDWatch::cVFDWatch() unsigned int n; for(n=0;nisopen()) { - cTimer* t = Timers.GetNextActiveTimer(); + cTimer* t = Timers.GetNextActiveTimer(); switch(nExitMode) { case eOnExitMode_NEXTTIMER: @@ -208,7 +213,8 @@ void cVFDWatch::Action(void) unsigned int n; unsigned int nCnt = 0; - + unsigned int nPage = 0; + unsigned int nMaxPages = 0; cTimeMs runTime; struct tm tm_r; bool bLastSuspend = false; @@ -249,9 +255,11 @@ void cVFDWatch::Action(void) } if(!bSuspend) { - // every second the clock need updates. - if((0 == (nCnt % 2))) { - bReDraw = CurrentTime(ts); + // every 300ms the clock need updates. + if((0 == (nCnt % 3))) { + bReDraw = ( theSetup.m_nRenderMode == eRenderMode_MultiPage ) + ? CurrentTimeHMS(ts) + : CurrentTimeHM(ts); if(m_eWatchMode != eLiveTV) { bReDraw |= ReplayTime(); } else { @@ -260,7 +268,23 @@ void cVFDWatch::Action(void) } } - bFlush = RenderScreen(bReDraw); + switch(theSetup.m_nRenderMode) { + case eRenderMode_SingleLine: + case eRenderMode_DualLine: + case eRenderMode_SingleTopic: + bFlush = RenderScreenSinglePage(bReDraw); + break; + case eRenderMode_MultiPage: + // every 15s the Pages should rotated. + if(nMaxPages && (0 == (nCnt % 150))) { + nPage ++; + nPage %= nMaxPages; + m_bUpdateScreen = true; + } + bFlush = RenderScreenPages(bReDraw, nPage, nMaxPages); + break; + } + if(m_eWatchMode != eLiveTV) { switch(ReplayMode()) { case eReplayNone: @@ -353,7 +377,7 @@ void cVFDWatch::Action(void) dsyslog("targaVFD: watch thread closed (pid=%d)", getpid()); } -bool cVFDWatch::RenderScreen(bool bReDraw) { +bool cVFDWatch::RenderScreenSinglePage(bool bReDraw) { cString* scRender; cString* scHeader = NULL; bool bForce = m_bUpdateScreen; @@ -384,7 +408,7 @@ bool cVFDWatch::RenderScreen(bool bReDraw) { bForce = true; } scHeader = replayTime; - scRender = replayTitle; + scRender = replayTitleShort; bAllowCurrentTime = true; } @@ -448,7 +472,107 @@ bool cVFDWatch::RenderScreen(bool bReDraw) { return false; } -bool cVFDWatch::CurrentTime(time_t ts) { +bool cVFDWatch::RenderScreenPages(bool bReDraw, unsigned int& nPage, unsigned int& nMaxPages) { + + bool bForce = m_bUpdateScreen; + + if(osdMessage) { + nMaxPages = 1; + return RenderText(bForce, bReDraw, osdMessage); + } else if(osdItem) { + nMaxPages = 2; + switch(nPage % nMaxPages) { + case 0: return RenderText(bForce, bReDraw, osdItem); + case 1: return RenderText(bForce, bReDraw, osdTitle); + } + } else if(m_eWatchMode == eLiveTV) { + nMaxPages = 4; + if(Program()) { + // New program + nPage = 3; + bForce = true; + } + // Skip none present items + if(nPage == 0 && !chPresentTitle) nPage++; + if(nPage == 1 && !chPresentShortTitle) nPage++; + + switch(nPage % nMaxPages) { + case 0: return RenderText(bForce, bReDraw, chPresentTitle); + case 1: return RenderText(bForce, bReDraw, chPresentShortTitle); + case 2: return RenderText(bForce, bReDraw, currentTime); + case 3: return RenderText(bForce, bReDraw, chName); + } + + } else { + nMaxPages = 4; + if(Replay()) { + // New replay + nPage = 0; + bForce = true; + } + // Skip none present items + if(nPage == 0 && !replayTitle) nPage++; + if(nPage == 1 && !replayTitleShort) nPage++; + + switch(nPage % nMaxPages) { + case 0: return RenderText(bForce, bReDraw, replayTitle); + case 1: return RenderText(bForce, bReDraw, replayTitleShort); + case 2: return RenderText(bForce, bReDraw, replayTime); + case 3: + if(!RenderSpectrumAnalyzer()) + nPage++; //no span service present + return true; + } + } + return false; +} + +bool cVFDWatch::RenderText(bool bForce, bool bReDraw, cString* scText) { + + if(bForce) { + m_nScrollOffset = 0; + m_bScrollBackward = false; + m_bScrollNeeded = true; + } + if(bForce || bReDraw || m_nScrollOffset > 0 || m_bScrollBackward) { + this->clear(); + if(scText) { + int iRet = -1; + int nTop = (theSetup.m_cHeight - pFont->Height())/2; + iRet = this->DrawText(0 - m_nScrollOffset,nTop<0?0:nTop, *scText); + if(m_bScrollNeeded) { + switch(iRet) { + case 0: + if(m_nScrollOffset <= 0) { + m_nScrollOffset = 0; + m_bScrollBackward = false; + m_bScrollNeeded = false; + break; //Fit to screen + } + m_bScrollBackward = true; + case 2: + case 1: + if(m_bScrollBackward) m_nScrollOffset -= 2; + else m_nScrollOffset += 2; + if(m_nScrollOffset >= 0) { + break; + } + case -1: + m_nScrollOffset = 0; + m_bScrollBackward = false; + m_bScrollNeeded = false; + break; + } + } + } + + m_bUpdateScreen = false; + return true; + } + return false; +} + +bool cVFDWatch::CurrentTimeHM(time_t ts) { if((ts / 60) != (tsCurrentLast / 60)) { @@ -456,23 +580,46 @@ bool cVFDWatch::CurrentTime(time_t ts) { delete currentTime; tsCurrentLast = ts; - currentTime = new cString(TimeString(ts)); + char buf[25]; + struct tm tm_r; + strftime(buf, sizeof(buf), "%R", localtime_r(&ts, &tm_r)); + currentTime = new cString(buf); + + return currentTime != NULL; + } + return false; +} + +bool cVFDWatch::CurrentTimeHMS(time_t ts) { + + if(ts != tsCurrentLast) { + + if(currentTime) + delete currentTime; + + tsCurrentLast = ts; + char buf[25]; + struct tm tm_r; + strftime(buf, sizeof(buf), "%T", localtime_r(&ts, &tm_r)); + currentTime = new cString(buf); + return currentTime != NULL; } return false; } + bool cVFDWatch::Replay() { - if(!replayTitleLast - || !replayTitle - || strcmp(*replayTitleLast,*replayTitle)) { - if(replayTitleLast) { - delete replayTitleLast; - replayTitleLast = NULL; + if(!replayTitleShortLast + || !replayTitleShort + || strcmp(*replayTitleShortLast,*replayTitleShort)) { + if(replayTitleShortLast) { + delete replayTitleShortLast; + replayTitleShortLast = NULL; } - if(replayTitle) { - replayTitleLast = new cString(*replayTitle); + if(replayTitleShort) { + replayTitleShortLast = new cString(*replayTitleShort); } return true; } @@ -504,6 +651,10 @@ void cVFDWatch::Replaying(const cControl * Control, const char * szName, const c delete replayTitle; replayTitle = NULL; } + if(replayTitleShort) { + delete replayTitleShort; + replayTitleShort = NULL; + } if (szName && !isempty(szName)) { char* Title = NULL; @@ -560,6 +711,7 @@ void cVFDWatch::Replaying(const cControl * Control, const char * szName, const c } case '~': { Title = (Name + i + 1); + Name[i] = '\0'; i = 0; } default: @@ -574,14 +726,16 @@ void cVFDWatch::Replaying(const cControl * Control, const char * szName, const c Title = (Name + 10); } if (Title) { - replayTitle = new cString(skipspace(Title)); + if(Name && strcmp(Title, Name)) + replayTitle = new cString(skipspace(Name)); + replayTitleShort = new cString(skipspace(Title)); } else { - replayTitle = new cString(skipspace(Name)); + replayTitleShort = new cString(skipspace(Name)); } free(Name); } - if (!replayTitle) { - replayTitle = new cString(tr("Unknown title")); + if (!replayTitleShort) { + replayTitleShort = new cString(tr("Unknown title")); } } else @@ -596,7 +750,7 @@ eReplayState cVFDWatch::ReplayMode() const { bool Play = false, Forward = false; int Speed = -1; - if (m_pControl + if (m_pControl && ((cControl *)m_pControl)->GetReplayMode(Play,Forward,Speed)) { // 'Play' tells whether we are playing or pausing, 'Forward' tells whether @@ -644,7 +798,7 @@ const char * cVFDWatch::FormatReplayTime(int current, int total, double dFrameRa int tm = ts / 60; ts %= 60; - if (total > 1) { + if (total > 1 && theSetup.m_nRenderMode != eRenderMode_MultiPage) { if(g) { #if VDRVERSNUM >= 10703 snprintf(s, sizeof(s), "%s (%s)", (const char*)IndexToHMSF(current,false,dFrameRate), (const char*)IndexToHMSF(total,false,dFrameRate)); @@ -684,7 +838,7 @@ bool cVFDWatch::ReplayTime() { if(replayTime) delete replayTime; replayTime = new cString(sz); - return replayTime != NULL; + return replayTime != NULL; } } return false; diff --git a/watch.h b/watch.h index 018c191..8458e50 100644 --- a/watch.h +++ b/watch.h @@ -1,7 +1,7 @@ /* * targavfd plugin for VDR (C++) * - * (C) 2010 Andreas Brachold + * (C) 2010-2013 Andreas Brachold * * This targavfd plugin is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published @@ -82,12 +82,13 @@ private: int m_nReplayCurrent; int m_nReplayTotal; - cString* osdTitle; - cString* osdItem; - cString* osdMessage; + cString* osdTitle; + cString* osdItem; + cString* osdMessage; cString* replayTitle; - cString* replayTitleLast; + cString* replayTitleShort; + cString* replayTitleShortLast; cString* replayTime; time_t tsCurrentLast; @@ -96,11 +97,14 @@ protected: virtual void Action(void); bool Program(); bool Replay(); - bool RenderScreen(bool bReDraw); + bool RenderScreenSinglePage(bool bReDraw); + bool RenderScreenPages(bool bReDraw, unsigned int &nPage, unsigned int &nMaxPages); + bool RenderText(bool bForce, bool bReDraw, cString* scRender); bool RenderSpectrumAnalyzer(); eReplayState ReplayMode() const; bool ReplayPosition(int ¤t, int &total, double& dFrameRate) const; - bool CurrentTime(time_t ts); + bool CurrentTimeHM(time_t ts); + bool CurrentTimeHMS(time_t ts); bool ReplayTime(); const char * FormatReplayTime(int current, int total, double dFrameRate) const; public: -- cgit v1.2.3