diff options
author | anbr <vdr07@deltab.de> | 2013-11-03 11:01:23 +0100 |
---|---|---|
committer | anbr <vdr07@deltab.de> | 2013-11-03 11:01:23 +0100 |
commit | 65f5c91d83af805ff3a67fbba5897e17145028a1 (patch) | |
tree | aff6b00a63f7c7276ec56fb1b9783b5bde7a2c40 | |
parent | 18091601df4d4a0413186c4960c427e9601a66d5 (diff) | |
download | vdr-plugin-targavfd-65f5c91d83af805ff3a67fbba5897e17145028a1.tar.gz vdr-plugin-targavfd-65f5c91d83af805ff3a67fbba5897e17145028a1.tar.bz2 |
New render mode - multiple pages
-rw-r--r-- | HISTORY | 2 | ||||
-rw-r--r-- | po/de_DE.po | 10 | ||||
-rw-r--r-- | po/it_IT.po | 5 | ||||
-rw-r--r-- | setup.c | 3 | ||||
-rw-r--r-- | setup.h | 1 | ||||
-rw-r--r-- | targavfd.c | 2 | ||||
-rw-r--r-- | watch.c | 216 | ||||
-rw-r--r-- | watch.h | 18 |
8 files changed, 212 insertions, 45 deletions
@@ -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 <vdr07 AT deltab de> # This file is distributed under the same license as the PACKAGE package. # -# Andreas Brachold <vdr07 AT deltab de> 2009 - 2013. +# Andreas Brachold <vdr07 AT deltab de> 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: <see README>\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 <vdr07 AT deltab de>\n" "Language-Team: Andreas Brachold <vdr07 AT deltab de>\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: <see README>\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 <vdr-italian@tiscali.it>\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" @@ -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, @@ -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 }; @@ -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) { @@ -1,7 +1,7 @@ /* * targavfd plugin for VDR (C++) * - * (C) 2010 Andreas Brachold <vdr07 AT deltab de> + * (C) 2010-2013 Andreas Brachold <vdr07 AT deltab de> * * 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;n<memberof(m_nCardIsRecording);++n) { - m_nCardIsRecording[n] = 0; + m_nCardIsRecording[n] = 0; } chPresentTime = 0; chFollowingTime = 0; @@ -63,7 +63,8 @@ cVFDWatch::cVFDWatch() m_pControl = NULL; replayTitle = NULL; - replayTitleLast = NULL; + replayTitleShort = NULL; + replayTitleShortLast = NULL; replayTime = NULL; currentTime = NULL; @@ -104,9 +105,13 @@ cVFDWatch::~cVFDWatch() delete replayTitle; replayTitle = NULL; } - if(replayTitleLast) { - delete replayTitleLast; - replayTitleLast = NULL; + if(replayTitleShort) { + delete replayTitleShort; + replayTitleShort = NULL; + } + if(replayTitleShortLast) { + delete replayTitleShortLast; + replayTitleShortLast = NULL; } if(replayTime) { delete replayTime; @@ -137,7 +142,7 @@ void cVFDWatch::shutdown(int nExitMode) { } if(this->isopen()) { - 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; @@ -1,7 +1,7 @@ /* * targavfd plugin for VDR (C++) * - * (C) 2010 Andreas Brachold <vdr07 AT deltab de> + * (C) 2010-2013 Andreas Brachold <vdr07 AT deltab de> * * 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: |