From b3b50abd736da0199297cab5d080055ed55c05bd Mon Sep 17 00:00:00 2001 From: louis Date: Sun, 26 May 2013 17:44:04 +0200 Subject: [PATCH] Displaying reruns in detailed EPG View --- config.c | 6 ++ config.h | 3 + detailview.c | 69 +++++++++++++++++- detailview.h | 2 + po/de_DE.po | 23 +++++- services/epgsearch.h | 167 +++++++++++++++++++++++++++++++++++++++++++ setup.c | 22 ++++++ setup.h | 2 + 8 files changed, 291 insertions(+), 3 deletions(-) create mode 100644 services/epgsearch.h diff --git a/config.c b/config.c index c868b06..b44c2c0 100644 --- a/config.c +++ b/config.c @@ -89,6 +89,9 @@ cTvguideConfig::cTvguideConfig() { themeIndex = 4; useBlending = 2; roundedCorners = 0; + displayRerunsDetailEPGView = 1; + numReruns = 5; + useSubtitleRerun = 1; } cTvguideConfig::~cTvguideConfig() { @@ -247,6 +250,9 @@ bool cTvguideConfig::SetupParse(const char *Name, const char *Value) { else if (strcmp(Name, "FontGridHorizontalSmallDelta") == 0) FontGridHorizontalSmallDelta = atoi(Value); else if (strcmp(Name, "FontTimeLineDateHorizontalDelta") == 0) FontTimeLineDateHorizontalDelta = atoi(Value); else if (strcmp(Name, "FontTimeLineTimeHorizontalDelta") == 0) FontTimeLineTimeHorizontalDelta = atoi(Value); + else if (strcmp(Name, "displayRerunsDetailEPGView") == 0) displayRerunsDetailEPGView = atoi(Value); + else if (strcmp(Name, "numReruns") == 0) numReruns = atoi(Value); + else if (strcmp(Name, "useSubtitleRerun") == 0) useSubtitleRerun = atoi(Value); else return false; return true; } diff --git a/config.h b/config.h index b953931..beaa696 100644 --- a/config.h +++ b/config.h @@ -89,6 +89,9 @@ class cTvguideConfig { int themeIndex; int useBlending; int roundedCorners; + int displayRerunsDetailEPGView; + int numReruns; + int useSubtitleRerun; void setDynamicValues(int width, int height); bool SetupParse(const char *Name, const char *Value); void loadTheme(); diff --git a/detailview.c b/detailview.c index 2a42642..494e163 100644 --- a/detailview.c +++ b/detailview.c @@ -1,3 +1,5 @@ +#include "services/epgsearch.h" +#include #include "detailview.h" cDetailView::cDetailView(cGrid *grid) { @@ -10,6 +12,9 @@ cDetailView::cDetailView(cGrid *grid) { headerHeight = max (40 + 3 * tvguideConfig.FontDetailHeader->Height(), // border + 3 Lines 40 + tvguideConfig.epgImageHeight); description.Set(event->Description(), tvguideConfig.FontDetailView, tvguideConfig.osdWidth-2*borderWidth - 50 - 40); + if (tvguideConfig.displayRerunsDetailEPGView) { + LoadReruns(); + } contentScrollable = setContentDrawportHeight(); createPixmaps(); } @@ -26,6 +31,9 @@ cDetailView::~cDetailView(void){ bool cDetailView::setContentDrawportHeight() { int linesContent = description.Lines() + 1; + if (tvguideConfig.displayRerunsDetailEPGView) { + linesContent += reruns.Lines() + 1; + } heightContent = linesContent * tvguideConfig.FontDetailView->Height(); if (heightContent > (tvguideConfig.osdHeight - 2 * borderWidth - headerHeight)) return true; @@ -97,10 +105,19 @@ void cDetailView::drawContent() { 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); } + i++; + if (tvguideConfig.displayRerunsDetailEPGView) { + textLines = reruns.Lines(); + for (int j=0; jDrawText(cPoint(20, 20 + i*textHeight), reruns.GetLine(j), theme.Color(clrFont), clrTransparent, tvguideConfig.FontDetailView); + i++; + } + } + } void cDetailView::drawScrollbar() { @@ -168,6 +185,54 @@ cImage *cDetailView::createScrollbar(int width, int height, tColor clrBgr, tColo 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* 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(), tvguideConfig.FontDetailView, tvguideConfig.osdWidth-2*borderWidth - 50 - 40); + } else + reruns.Set("", tvguideConfig.FontDetailView, tvguideConfig.osdWidth-2*borderWidth - 50 - 40); +} + void cDetailView::Action(void) { drawHeader(); drawContent(); diff --git a/detailview.h b/detailview.h index dc0a107..f0cdcc9 100644 --- a/detailview.h +++ b/detailview.h @@ -19,6 +19,7 @@ private: int FrameTime; int FadeTime; cTextWrapper description; + cTextWrapper reruns; int borderWidth; int headerHeight; bool setContentDrawportHeight(); @@ -26,6 +27,7 @@ private: int heightScrollbar; bool contentScrollable; virtual void Action(void); + void LoadReruns(void); void drawHeader(); void drawContent(); void drawScrollbar(); diff --git a/po/de_DE.po b/po/de_DE.po index 2707246..6e848ef 100755 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: vdr-tvguide 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-24 14:53+0200\n" +"POT-Creation-Date: 2013-05-26 17:37+0200\n" "PO-Revision-Date: 2012-08-25 17:49+0200\n" "Last-Translator: Horst\n" "Language-Team: \n" @@ -12,6 +12,9 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +msgid "RERUNS OF THIS SHOW" +msgstr "Wiederholungen dieser Sendung" + msgid "No EPG Information available" msgstr "Keine EPG Daten verfügbar" @@ -36,6 +39,15 @@ msgstr "Anzeigeoptionen" msgid "Fonts and Fontsizes" msgstr "Schriften und Schriftgrößen" +msgid "never" +msgstr "nie" + +msgid "if exists" +msgstr "falls vorhanden" + +msgid "always" +msgstr "immer" + msgid "Theme" msgstr "Theme" @@ -60,6 +72,15 @@ msgstr "Sehr großer Sprung (Tasten 4 / 6) in Stunden" msgid "Time Format (12h/24h)" msgstr "Zeitformat (12h/24h)" +msgid "Display Reruns in detailed EPG View" +msgstr "Wiederholungen in der detailierten EPG Ansicht anzeigen" + +msgid "Number of reruns to display" +msgstr "Anzahl der dargestellten Wiederholungen" + +msgid "Use Subtitle for reruns" +msgstr "Untertitel für Wiederholungssuche nutzen" + msgid "Display Mode" msgstr "Anzeigemodus" diff --git a/services/epgsearch.h b/services/epgsearch.h new file mode 100644 index 0000000..de29299 --- /dev/null +++ b/services/epgsearch.h @@ -0,0 +1,167 @@ +/* +Copyright (C) 2004-2007 Christian Wieninger + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + +The author can be reached at cwieninger@gmx.de + +The project's page is at http://winni.vdr-developer.org/epgsearch +*/ + +#ifndef EPGSEARCHSERVICES_INC +#define EPGSEARCHSERVICES_INC + +// Added by Andreas Mair (mail _AT_ andreas _DOT_ vdr-developer _DOT_ org) +#define EPGSEARCH_SEARCHRESULTS_SERVICE_STRING_ID "Epgsearch-searchresults-v1.0" +#define EPGSEARCH_LASTCONFLICTINFO_SERVICE_STRING_ID "Epgsearch-lastconflictinfo-v1.0" + +#include +#include +#include +#include +#include + +// Data structure for service "Epgsearch-search-v1.0" +struct Epgsearch_search_v1_0 +{ +// in + char* query; // search term + int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression) + int channelNr; // channel number to search in (0=any) + bool useTitle; // search in title + bool useSubTitle; // search in subtitle + bool useDescription; // search in description +// out + cOsdMenu* pResultMenu; // pointer to the menu of results +}; + +// Data structure for service "Epgsearch-exttimeredit-v1.0" +struct Epgsearch_exttimeredit_v1_0 +{ +// in + cTimer* timer; // pointer to the timer to edit + bool bNew; // flag that indicates, if this is a new timer or an existing one + const cEvent* event; // pointer to the event corresponding to this timer (may be NULL) +// out + cOsdMenu* pTimerMenu; // pointer to the menu of results +}; + +// Data structure for service "Epgsearch-updatesearchtimers-v1.0" +struct Epgsearch_updatesearchtimers_v1_0 +{ +// in + bool showMessage; // inform via osd when finished? +}; + +// Data structure for service "Epgsearch-osdmessage-v1.0" +struct Epgsearch_osdmessage_v1_0 +{ +// in + char* message; // the message to display + eMessageType type; +}; + +// Data structure for service "EpgsearchMenu-v1.0" +struct EpgSearchMenu_v1_0 +{ +// in +// out + cOsdMenu* Menu; // pointer to the menu +}; + +// Data structure for service "Epgsearch-lastconflictinfo-v1.0" +struct Epgsearch_lastconflictinfo_v1_0 +{ +// in +// out + time_t nextConflict; // next conflict date, 0 if none + int relevantConflicts; // number of relevant conflicts + int totalConflicts; // total number of conflicts +}; + +// Data structure for service "Epgsearch-searchresults-v1.0" +struct Epgsearch_searchresults_v1_0 +{ +// in + char* query; // search term + int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression) + int channelNr; // channel number to search in (0=any) + bool useTitle; // search in title + bool useSubTitle; // search in subtitle + bool useDescription; // search in description +// out + + class cServiceSearchResult : public cListObject + { + public: + const cEvent* event; + cServiceSearchResult(const cEvent* Event) : event(Event) {} + }; + + cList* pResultList; // pointer to the results +}; + +// Data structure for service "Epgsearch-switchtimer-v1.0" +struct Epgsearch_switchtimer_v1_0 +{ +// in + const cEvent* event; + int mode; // mode (0=query existance, 1=add/modify, 2=delete) +// in/out + int switchMinsBefore; + int announceOnly; +// out + bool success; // result +}; + +// Data structures for service "Epgsearch-services-v1.0" +class cServiceHandler +{ + public: + virtual std::list SearchTimerList() = 0; + // returns a list of search timer entries in the same format as used in epgsearch.conf + virtual int AddSearchTimer(const std::string&) = 0; + // adds a new search timer and returns its ID (-1 on error) + virtual bool ModSearchTimer(const std::string&) = 0; + // edits an existing search timer and returns success + virtual bool DelSearchTimer(int) = 0; + // deletes search timer with given ID and returns success + virtual std::list QuerySearchTimer(int) = 0; + // returns the search result of the searchtimer with given ID in the same format as used in SVDRP command 'QRYS' (->MANUAL) + virtual std::list QuerySearch(std::string) = 0; + // returns the search result of the searchtimer with given settings in the same format as used in SVDRP command 'QRYS' (->MANUAL) + virtual std::list ExtEPGInfoList() = 0; + // returns a list of extended EPG categories in the same format as used in epgsearchcats.conf + virtual std::list ChanGrpList() = 0; + // returns a list of channel groups maintained by epgsearch + virtual std::list BlackList() = 0; + // returns a list of blacklists in the same format as used in epgsearchblacklists.conf + virtual std::set DirectoryList() = 0; + // List of all recording directories used in recordings, timers, search timers or in epgsearchdirs.conf + virtual ~cServiceHandler() {} + // Read a setup value + virtual std::string ReadSetupValue(const std::string& entry) = 0; + // Write a setup value + virtual bool WriteSetupValue(const std::string& entry, const std::string& value) = 0; +}; + +struct Epgsearch_services_v1_0 +{ +// in/out + std::auto_ptr handler; +}; + +#endif diff --git a/setup.c b/setup.c index f78a7f6..ebb94dd 100644 --- a/setup.c +++ b/setup.c @@ -93,6 +93,9 @@ void cTvguideSetup::Store(void) { SetupStore("FontGridHorizontalSmallDelta", tvguideConfig.FontGridHorizontalSmallDelta); SetupStore("FontTimeLineDateHorizontalDelta", tvguideConfig.FontTimeLineDateHorizontalDelta); SetupStore("FontTimeLineTimeHorizontalDelta", tvguideConfig.FontTimeLineTimeHorizontalDelta); + SetupStore("displayRerunsDetailEPGView", tvguideConfig.displayRerunsDetailEPGView); + SetupStore("numReruns", tvguideConfig.numReruns); + SetupStore("useSubtitleRerun", tvguideConfig.useSubtitleRerun); } cMenuSetupSubMenu::cMenuSetupSubMenu(const char* Title, cTvguideConfig* data) : cOsdMenu(Title, 30) { @@ -128,10 +131,14 @@ cMenuSetupGeneral::cMenuSetupGeneral(cTvguideConfig* data) : cMenuSetupSubMenu( blendingMethods[0] = "none"; blendingMethods[1] = "classic"; blendingMethods[2] = "nOpacity style"; + useSubtitleRerunTexts[0] = tr("never"); + useSubtitleRerunTexts[1] = tr("if exists"); + useSubtitleRerunTexts[2] = tr("always"); Set(); } void cMenuSetupGeneral::Set(void) { + const char *indent = " "; int currentItem = Current(); Clear(); if (themes.NumThemes()) @@ -145,10 +152,25 @@ void cMenuSetupGeneral::Set(void) { Add(new cMenuEditIntItem(tr("Huge Step (Keys 4 / 6) in hours"), &tmpTvguideConfig->hugeStepHours, 13, 48)); Add(new cMenuEditStraItem(tr("Time Format (12h/24h)"), &tmpTvguideConfig->timeFormat, 2, timeFormatItems)); + Add(new cMenuEditBoolItem(tr("Display Reruns in detailed EPG View"), &tmpTvguideConfig->displayRerunsDetailEPGView)); + if (tmpTvguideConfig->displayRerunsDetailEPGView) { + Add(new cMenuEditIntItem(cString::sprintf("%s%s", indent, tr("Number of reruns to display")), &tmpTvguideConfig->numReruns, 1, 10)); + Add(new cMenuEditStraItem(cString::sprintf("%s%s", indent, tr("Use Subtitle for reruns")), &tmpTvguideConfig->useSubtitleRerun, 3, useSubtitleRerunTexts)); + } SetCurrent(Get(currentItem)); Display(); } +eOSState cMenuSetupGeneral::ProcessKey(eKeys Key) { + eOSState state = cOsdMenu::ProcessKey(Key); + if (Key == kOk) { + state = osBack; + } else if (Key != kNone) { + Set(); + } + return state; +} + //------------------------------------------------------------------------------------------------------------------ cMenuSetupScreenLayout::cMenuSetupScreenLayout(cTvguideConfig* data) : cMenuSetupSubMenu(tr("Screen Presentation"), data) { diff --git a/setup.h b/setup.h index 9342207..5b3e2ea 100644 --- a/setup.h +++ b/setup.h @@ -26,9 +26,11 @@ class cMenuSetupSubMenu : public cOsdMenu { class cMenuSetupGeneral : public cMenuSetupSubMenu { protected: + virtual eOSState ProcessKey(eKeys Key); cThemes themes; const char * blendingMethods[3]; const char * timeFormatItems[2]; + const char *useSubtitleRerunTexts[3]; void Set(void); public: cMenuSetupGeneral(cTvguideConfig *data);