mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-tvguide.git
				synced 2023-10-05 13:01:48 +00:00 
			
		
		
		
	Compare commits
	
		
			37 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 6663910058 | ||
|  | 896a4abf75 | ||
|  | 4e062c0a8d | ||
|  | 2f497adf01 | ||
|  | decfb2d39d | ||
|  | 5f4ea6b30d | ||
|  | 435a74d9cf | ||
|  | fc47c35bea | ||
|  | 4d80c6900d | ||
|  | 78d6e980ee | ||
|  | 69356e9c43 | ||
|  | bf3a8a430b | ||
|  | 52c41ff5af | ||
|  | 5870b1ae4c | ||
|  | 69b851c9ed | ||
|  | 8335ab0e41 | ||
|  | 240cbe87e0 | ||
|  | ee68d2eb2f | ||
|  | eb3a4113be | ||
|  | 7ec89bf12b | ||
|  | f653594c4a | ||
|  | 8129d116fb | ||
|  | 874f5cd9d5 | ||
|  | 9044e092f8 | ||
|  | b96f800240 | ||
|  | 5d9ed1439a | ||
|  | 66a0c15aea | ||
|  | 8db88c2556 | ||
|  | 509b64d78f | ||
|  | 15b7074b4e | ||
|  | 3fee6ab13f | ||
|  | ffd3e2c79f | ||
|  | c77f74321f | ||
|  | efe06b8e98 | ||
|  | 6540e21444 | ||
|  | 2e4a43133e | ||
|  | bcf2ce757c | 
							
								
								
									
										55
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -236,3 +236,58 @@ Version 1.2.14 | ||||
| Version 1.2.15 | ||||
|  | ||||
| - Workaround for HWAccelerated OSD | ||||
|  | ||||
| Version 1.2.16 | ||||
|  | ||||
| - Fixed a timer changed message | ||||
| - Extend keys kFastRew, kFastFwd, kPrev, kNext for TimeJump | ||||
|   (if you use the numeric keys for "Jump to specific channel", | ||||
|   you can now use the keys kFastRew, kFastFwd, kPrev, kNext for TimeJump. | ||||
|   Note: if you use the permashift-plugin then the key kFastRew doesnt work for TimeJump) | ||||
| - Fixed a possible deadlook in cEPGView::cEPGView | ||||
| - Refactor Timeline | ||||
| - Refactor CutText in horizontal epgview | ||||
| - Optimize display "REC" sign in epgview | ||||
| - Separate "displayTime" for horizontal and vertical view | ||||
| - RecMenu "Timer Timeline" displays now sorted active timer | ||||
|  | ||||
| Version 1.2.17 | ||||
|  | ||||
| - Final fix for utf8 CutText | ||||
| - Fixed a remote timer problem | ||||
| - Add episode to manual timer | ||||
|  | ||||
| Version 1.3.0 | ||||
|  | ||||
| - last version with <VDR-2.3.1 compatibility | ||||
| - Fixed a possible seqfault in DisplayTimerConflict | ||||
| - Show numTimersToday in timeline | ||||
| - Fixed stopIndex in cRecMenu::JumpBegin | ||||
| - Fixed horizontal alignment in timeline | ||||
| - Fixed messages in DisplayTimerConflict | ||||
|  | ||||
| Version 1.3.1 | ||||
|  | ||||
| - Fixes for <VDR-2.3.1 compatibility | ||||
| - Fixed a segfault while starting tvguide | ||||
|  | ||||
| Version 1.3.2 | ||||
|  | ||||
| - Fixed display groupname in cChannelGroupGrid::DrawHorizontal | ||||
| - Center some channel logos | ||||
| - Add "Timer On/Off" to recmenu | ||||
| - Wrap title in detailview header | ||||
| - Optional deactivation of the timer confirmation messages | ||||
|  | ||||
| Version 1.3.3 | ||||
|  | ||||
| - Bugfix | ||||
|  | ||||
| Version 1.3.4 | ||||
|  | ||||
| - Fix for gcc11 | ||||
|  | ||||
| Version 1.3.5 | ||||
|  | ||||
| - Fix for VDR-2.5.4 | ||||
| - Update iceblue theme | ||||
|   | ||||
| @@ -68,29 +68,28 @@ void cChannelGroupGrid::Draw(void) { | ||||
|  | ||||
| void cChannelGroupGrid::DrawVertical(tColor colorText, tColor colorTextBack) { | ||||
|     int textY = (Height() - fontManager.FontChannelGroups->Height()) / 2; | ||||
|     cString text = CutText(name, Width() - 4, fontManager.FontChannelGroups).c_str(); | ||||
|     cString text = cString::sprintf("%s", CutText(name, Width() - 4, fontManager.FontChannelGroups).c_str()); | ||||
|     int textWidth = fontManager.FontChannelGroups->Width(*text); | ||||
|     int x = (Width() - textWidth) / 2; | ||||
|     pixmap->DrawText(cPoint(x, textY), *text, colorText, colorTextBack, fontManager.FontChannelGroups); | ||||
| } | ||||
|  | ||||
| void cChannelGroupGrid::DrawHorizontal(tColor colorText, tColor colorTextBack) { | ||||
|     std::string nameUpper = name; | ||||
|     std::transform(nameUpper.begin(), nameUpper.end(),nameUpper.begin(), ::toupper); | ||||
|     int numChars = nameUpper.length(); | ||||
|     std::string groupName = name; | ||||
|     int numChars = groupName.length(); | ||||
|     int charHeight = fontManager.FontChannelGroupsHorizontal->Height(); | ||||
|     int textHeight = numChars * charHeight; | ||||
|     int y = 5; | ||||
|     if ((textHeight +5) < Height()) { | ||||
|     if ((textHeight + 5) < Height()) { | ||||
|         y = (Height() - textHeight) / 2; | ||||
|     } | ||||
|     for (int i=0; i < numChars; i++) { | ||||
|         if (((y + 2*charHeight) > Height()) && ((i+1)<numChars)) { | ||||
|     for (int i = 0; i < numChars; i++) { | ||||
|         if (((y + 2 * charHeight) > Height()) && ((i + 1) < numChars)) { | ||||
|             int x = (Width() - fontManager.FontChannelGroupsHorizontal->Width("...")) / 2; | ||||
|             pixmap->DrawText(cPoint(x, y), "...", colorText, colorTextBack, fontManager.FontChannelGroupsHorizontal); | ||||
|             break; | ||||
|         } | ||||
|         cString currentChar = cString::sprintf("%c", nameUpper.at(i)); | ||||
|         cString currentChar = cString::sprintf("%s", utf8_substr(groupName.c_str(), i, 1).c_str()); | ||||
|         int x = (Width() - fontManager.FontChannelGroupsHorizontal->Width(*currentChar)) / 2; | ||||
|         pixmap->DrawText(cPoint(x, y), *currentChar, colorText, colorTextBack, fontManager.FontChannelGroupsHorizontal); | ||||
|         y += fontManager.FontChannelGroupsHorizontal->Height(); | ||||
|   | ||||
							
								
								
									
										12
									
								
								config.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								config.c
									
									
									
									
									
								
							| @@ -10,8 +10,8 @@ cTVGuideConfig::cTVGuideConfig() { | ||||
|     showTimeInGrid = 1; | ||||
|     channelCols = 5; | ||||
|     channelRows = 10; | ||||
|     displayTime = 160; | ||||
|     displayHorizontalTime = 160; | ||||
|     displayTime = 180; | ||||
|     displayHorizontalTime = 180; | ||||
|     displayStatusHeader = 1; | ||||
|     displayChannelGroups = 1; | ||||
|     displayTimeBase = 1; | ||||
| @@ -28,10 +28,14 @@ cTVGuideConfig::cTVGuideConfig() { | ||||
|     footerHeightPercent = 7; | ||||
|     stepMinutes = 30; | ||||
|     bigStepHours = 3; | ||||
|     bigStepHoursHorizontal = 3; | ||||
|     hugeStepHours = 24; | ||||
|     hugeStepHoursHorizontal = 24; | ||||
|     channelJumpMode = eNumJump; | ||||
|     jumpChannels = 0; | ||||
|     blueKeyMode = 2; | ||||
|     addSubtitleToTimer = 1; | ||||
|     timerMessage = 1; | ||||
|     closeOnSwitch = 1; | ||||
|     numkeyMode = 0; | ||||
|     useRemoteTimers = 0; | ||||
| @@ -269,7 +273,9 @@ bool cTVGuideConfig::SetupParse(const char *Name, const char *Value) { | ||||
|     else if (strcmp(Name, "logoWidthRatio") == 0)           logoWidthRatio = atoi(Value); | ||||
|     else if (strcmp(Name, "logoHeightRatio") == 0)          logoHeightRatio = atoi(Value); | ||||
|     else if (strcmp(Name, "bigStepHours") == 0)             bigStepHours = atoi(Value); | ||||
|     else if (strcmp(Name, "bigStepHoursHorizontal") == 0)   bigStepHoursHorizontal = atoi(Value); | ||||
|     else if (strcmp(Name, "hugeStepHours") == 0)            hugeStepHours = atoi(Value); | ||||
|     else if (strcmp(Name, "hugeStepHoursHorizontal") == 0)  hugeStepHoursHorizontal = atoi(Value); | ||||
|     else if (strcmp(Name, "channelJumpMode") == 0)          channelJumpMode = atoi(Value); | ||||
|     else if (strcmp(Name, "blueKeyMode") == 0)              blueKeyMode = atoi(Value); | ||||
|     else if (strcmp(Name, "numkeyMode") == 0)               numkeyMode = atoi(Value); | ||||
| @@ -291,6 +297,8 @@ bool cTVGuideConfig::SetupParse(const char *Name, const char *Value) { | ||||
|     else if (strcmp(Name, "footerHeightPercent") == 0)      footerHeightPercent = atoi(Value); | ||||
|     else if (strcmp(Name, "instRecFolderMode") == 0)        instRecFolderMode = atoi(Value); | ||||
|     else if (strcmp(Name, "instRecFixedFolder") == 0)       instRecFixedFolder = Value; | ||||
|     else if (strcmp(Name, "addSubtitleToTimer") == 0)       addSubtitleToTimer = atoi(Value); | ||||
|     else if (strcmp(Name, "timerMessage") == 0)             timerMessage = atoi(Value); | ||||
|     else if (strcmp(Name, "favWhatsOnNow") == 0)            favWhatsOnNow = atoi(Value); | ||||
|     else if (strcmp(Name, "favWhatsOnNext") == 0)           favWhatsOnNext = atoi(Value); | ||||
|     else if (strcmp(Name, "favUseTime1") == 0)              favUseTime1 = atoi(Value); | ||||
|   | ||||
							
								
								
									
										12
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								config.h
									
									
									
									
									
								
							| @@ -8,7 +8,7 @@ | ||||
| #include "fontmanager.h" | ||||
| #include "imagecache.h" | ||||
|  | ||||
| enum { | ||||
| enum eTimeFormat { | ||||
|     e12Hours, | ||||
|     e24Hours | ||||
| }; | ||||
| @@ -43,6 +43,12 @@ enum eInstRecFolderMode { | ||||
|     eFolderFixed | ||||
| }; | ||||
|  | ||||
| typedef enum { | ||||
|     addSubtitleNever = 0, | ||||
|     addSubtitleSmart, | ||||
|     addSubtitleAlways | ||||
| } addSubtitleToTimerMode; | ||||
|  | ||||
| class cTVGuideConfig { | ||||
|     private: | ||||
|         cString checkSlashAtEnd(std::string path); | ||||
| @@ -76,10 +82,14 @@ class cTVGuideConfig { | ||||
|         int footerHeightPercent; | ||||
|         int stepMinutes; | ||||
|         int bigStepHours; | ||||
|         int bigStepHoursHorizontal; | ||||
|         int hugeStepHours; | ||||
|         int hugeStepHoursHorizontal; | ||||
|         int channelJumpMode; | ||||
|         int jumpChannels; | ||||
|         int blueKeyMode; | ||||
|         int timerMessage; | ||||
|         int addSubtitleToTimer; | ||||
|         int closeOnSwitch; | ||||
|         int numkeyMode; | ||||
|         int useRemoteTimers; | ||||
|   | ||||
							
								
								
									
										37
									
								
								epggrid.c
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								epggrid.c
									
									
									
									
									
								
							| @@ -20,9 +20,9 @@ cEpgGrid::~cEpgGrid(void) { | ||||
| void cEpgGrid::SetViewportHeight() { | ||||
|     int viewportHeightOld = viewportHeight; | ||||
|     if ( column->Start() > StartTime() ) { | ||||
|         viewportHeight = (min((int)EndTime(), column->Stop()) - column->Start()) /60; | ||||
|         viewportHeight = (std::min((int)EndTime(), column->Stop()) - column->Start()) / 60; | ||||
|     } else if ( column->Stop() < EndTime() ) { | ||||
|         viewportHeight = (column->Stop() - StartTime()) /60; | ||||
|         viewportHeight = (column->Stop() - StartTime()) / 60; | ||||
|         if (viewportHeight < 0) viewportHeight = 0; | ||||
|     } else { | ||||
|         viewportHeight = Duration() / 60; | ||||
| @@ -37,11 +37,11 @@ void cEpgGrid::PositionPixmap() { | ||||
|         int x0 = column->getX(); | ||||
|         int y0 = geoManager.statusHeaderHeight + geoManager.channelHeaderHeight + geoManager.channelGroupsHeight; | ||||
|         if ( column->Start() < StartTime() ) { | ||||
|             y0 += (StartTime() - column->Start())/60*geoManager.minutePixel; | ||||
|             y0 += (StartTime() - column->Start()) / 60 * geoManager.minutePixel; | ||||
|         } | ||||
|         if (!pixmap) { | ||||
|             pixmap = osdManager.requestPixmap(-1, cRect(x0, y0, geoManager.colWidth, viewportHeight), | ||||
|                                                 cRect(0, 0, geoManager.colWidth, Duration()/60*geoManager.minutePixel)); | ||||
|                                                 cRect(0, 0, geoManager.colWidth, Duration() / 60 * geoManager.minutePixel)); | ||||
|         } else { | ||||
|             pixmap->SetViewPort(cRect(x0, y0, geoManager.colWidth, viewportHeight)); | ||||
|         } | ||||
| @@ -49,11 +49,11 @@ void cEpgGrid::PositionPixmap() { | ||||
|         int x0 = geoManager.channelHeaderWidth + geoManager.channelGroupsWidth; | ||||
|         int y0 = column->getY(); | ||||
|         if ( column->Start() < StartTime() ) { | ||||
|             x0 += (StartTime() - column->Start())/60*geoManager.minutePixel; | ||||
|             x0 += (StartTime() - column->Start()) / 60 * geoManager.minutePixel; | ||||
|         } | ||||
|         if (!pixmap) { | ||||
|             pixmap = osdManager.requestPixmap(-1, cRect(x0, y0, viewportHeight, geoManager.rowHeight), | ||||
|                                                 cRect(0, 0, Duration()/60*geoManager.minutePixel, geoManager.rowHeight)); | ||||
|                                                 cRect(0, 0, Duration() / 60 * geoManager.minutePixel, geoManager.rowHeight)); | ||||
|         } else { | ||||
|             pixmap->SetViewPort(cRect(x0, y0, viewportHeight, geoManager.rowHeight )); | ||||
|         } | ||||
| @@ -131,12 +131,7 @@ void cEpgGrid::drawText() { | ||||
|             } | ||||
|         } | ||||
|     } else if (config.displayMode == eHorizontal) { | ||||
|         if (Width() / geoManager.minutePixel < 10) { | ||||
|             int titleY = (geoManager.rowHeight - fontManager.FontGridHorizontal->Height()) / 2; | ||||
|             pixmap->DrawText(cPoint(borderWidth - 2, titleY), "...", colorText, colorTextBack, fontManager.FontGridHorizontal); | ||||
|             return; | ||||
|         } | ||||
|         cString strTitle = CutText(event->Title(), viewportHeight, fontManager.FontGridHorizontal).c_str(); | ||||
|         cString strTitle = CutText(event->Title(), viewportHeight - borderWidth, fontManager.FontGridHorizontal).c_str(); | ||||
|         int titleY = 0; | ||||
|         if (config.showTimeInGrid) { // mit Zeitangabe im Grid | ||||
|             pixmap->DrawText(cPoint(borderWidth, borderWidth), *timeString, colorText, colorTextBack, fontManager.FontGridHorizontalSmall); | ||||
| @@ -174,13 +169,17 @@ void cEpgGrid::drawText() { | ||||
|  | ||||
| void cEpgGrid::drawIcon(cString iconText, tColor color) { | ||||
|  | ||||
|     const cFont *font = (config.displayMode == eVertical) | ||||
|                         ?fontManager.FontGrid | ||||
|                         :fontManager.FontGridHorizontalSmall; | ||||
|     int textWidth = font->Width(*iconText)+2*borderWidth; | ||||
|     int textHeight = font->Height()+10; | ||||
|     pixmap->DrawRectangle( cRect(Width() - textWidth - borderWidth, Height() - textHeight - borderWidth, textWidth, textHeight), color); | ||||
|     pixmap->DrawText(cPoint(Width() - textWidth, Height() - textHeight - borderWidth/2), *iconText, theme.Color(clrFont), color, font); | ||||
|     const cFont *font = (config.displayMode == eVertical) ? fontManager.FontGrid : fontManager.FontGridHorizontalSmall; | ||||
|     int textWidth = font->Width(*iconText) + 2 * borderWidth; | ||||
|     int textHeight = font->Height() + 10; | ||||
|     if ((config.displayMode == eHorizontal) && ((Width() - 2 * textWidth) < 0)) | ||||
|         pixmap->DrawEllipse( cRect(Width() - textHeight / 2 - borderWidth, Height() - textHeight - borderWidth, textHeight / 2, textHeight / 2), color); | ||||
|     else if ((config.displayMode == eVertical) && ((Height() - 2 * textHeight) < 0)) | ||||
|         pixmap->DrawEllipse( cRect(Width() - textHeight / 2 - borderWidth, borderWidth, textHeight / 2, textHeight / 2), color); | ||||
|     else { | ||||
|         pixmap->DrawEllipse( cRect(Width() - textWidth - borderWidth, Height() - textHeight - borderWidth, textWidth, textHeight), color); | ||||
|         pixmap->DrawText(cPoint(Width() - textWidth, Height() - textHeight - borderWidth / 2), *iconText, theme.Color(clrFont), clrTransparent, font); | ||||
|     } | ||||
| } | ||||
|  | ||||
| cString cEpgGrid::getTimeString(void) { | ||||
|   | ||||
| @@ -35,7 +35,7 @@ bool cGeometryManager::SetGeometry(int osdWidth, int osdHeight, bool force) { | ||||
|     if (config.displayMode == eVertical) { | ||||
|         colWidth = (osdWidth - timeLineWidth) / config.channelCols; | ||||
|         rowHeight = 0; | ||||
|         minutePixel = (osdHeight - statusHeaderHeight - channelGroupsHeight - channelHeaderHeight - footerHeight) / config.displayTime; | ||||
|         minutePixel = (double)(osdHeight - statusHeaderHeight - channelGroupsHeight - channelHeaderHeight - footerHeight) / (double)config.displayTime; | ||||
|         channelLogoWidth = colWidth; | ||||
|         channelLogoHeight = channelHeaderHeight; | ||||
|         logoWidth = channelLogoWidth / 2 - 15; | ||||
| @@ -49,7 +49,7 @@ bool cGeometryManager::SetGeometry(int osdWidth, int osdHeight, bool force) { | ||||
|     } else if (config.displayMode == eHorizontal) { | ||||
|         colWidth = 0; | ||||
|         rowHeight = (osdHeight - statusHeaderHeight - timeLineHeight - footerHeight) / config.channelRows; | ||||
|         minutePixel = (osdWidth - channelHeaderWidth - channelGroupsWidth) / config.displayHorizontalTime; | ||||
|         minutePixel = (double)(osdWidth - channelHeaderWidth - channelGroupsWidth) / (double)config.displayHorizontalTime; | ||||
|         channelLogoWidth = channelHeaderWidth; | ||||
|         channelLogoHeight = rowHeight; | ||||
|         logoWidth = channelLogoHeight * config.logoWidthRatio / config.logoHeightRatio; | ||||
|   | ||||
| @@ -24,7 +24,7 @@ public: | ||||
|     //Content | ||||
|     int colWidth; | ||||
|     int rowHeight; | ||||
|     int minutePixel; | ||||
|     double minutePixel; | ||||
|     int channelLogoWidth; | ||||
|     int channelLogoHeight; | ||||
|     //Timeline | ||||
|   | ||||
| @@ -7,7 +7,7 @@ cOsdManager::cOsdManager(void) { | ||||
| bool cOsdManager::setOsd() { | ||||
|     osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop()); | ||||
|     if (osd) { | ||||
|         tArea Area = { 0, 0, cOsd::OsdWidth(), cOsd::OsdHeight(),  32 }; | ||||
|         tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1,  32 }; | ||||
|         if (osd->SetAreas(&Area, 1) == oeOk) {   | ||||
|             return true; | ||||
|         } | ||||
|   | ||||
							
								
								
									
										38
									
								
								po/ca_ES.po
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								po/ca_ES.po
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-tvguide 0.0.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2019-11-03 12:37+0100\n" | ||||
| "POT-Creation-Date: 2020-08-04 14:15+0200\n" | ||||
| "PO-Revision-Date: 2013-09-21 17:49+0200\n" | ||||
| "Last-Translator: My friend <Sampep> Thanks David <Gabychan> <gbonich@gmail.com>\n" | ||||
| "Language-Team: \n" | ||||
| @@ -25,7 +25,7 @@ msgid "min" | ||||
| msgstr "min" | ||||
|  | ||||
| msgid "Reruns of " | ||||
| msgstr "" | ||||
| msgstr "Reemissions " | ||||
|  | ||||
| msgid "No reruns found" | ||||
| msgstr "" | ||||
| @@ -57,6 +57,9 @@ msgstr "" | ||||
| msgid "images" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "tvguide: RemoteTimerModifications failed" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "root video folder" | ||||
| msgstr "Directori principal per a vídeo" | ||||
|  | ||||
| @@ -102,12 +105,15 @@ msgstr "" | ||||
| msgid "Instant Record" | ||||
| msgstr "Enregistra a l'instant" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Esborra temporitzador" | ||||
| msgid "Timer On/Off" | ||||
| msgstr "Temporitzador On/Off" | ||||
|  | ||||
| msgid "Edit Timer" | ||||
| msgstr "Edita temporitzador" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Esborra temporitzador" | ||||
|  | ||||
| msgid "Timer Timeline" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -138,6 +144,9 @@ msgstr "Cerca a les gravacions" | ||||
| msgid "Set Folder for" | ||||
| msgstr "Programa carpeta per" | ||||
|  | ||||
| msgid "Timer changed" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Timer created" | ||||
| msgstr "Temporitzador creat" | ||||
|  | ||||
| @@ -754,7 +763,7 @@ msgid "Display time in EPG Grids" | ||||
| msgstr "Mostra el temps a l'EPG" | ||||
|  | ||||
| msgid "Height of Headers (Status Header and EPG View, Perc. of osd height)" | ||||
| msgstr "" | ||||
| msgstr "Alçada capçalera d'estat (% alçada OSD)" | ||||
|  | ||||
| msgid "Height of Footer (Perc. of osd height)" | ||||
| msgstr "" | ||||
| @@ -885,15 +894,30 @@ msgstr "" | ||||
| msgid "Use fixed folder" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Folder for instant Recordings" | ||||
| msgid "smart" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Instant recording:" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Folder for instant Recordings" | ||||
| msgstr "Utilitza carpetes per gravacions a l'instant" | ||||
|  | ||||
| msgid "Folder" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Add episode to manual timers" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Use Remotetimers" | ||||
| msgstr "Utilitza temporitzadors remots" | ||||
|  | ||||
| msgid "Show timer confirmation messages" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Favorites:" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Limit channels in favorites" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -979,7 +1003,7 @@ msgid "EPG Info" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Reruns" | ||||
| msgstr "" | ||||
| msgstr "Reemissions" | ||||
|  | ||||
| msgid "Recording Information" | ||||
| msgstr "" | ||||
|   | ||||
							
								
								
									
										32
									
								
								po/de_DE.po
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								po/de_DE.po
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-tvguide 0.0.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2019-11-03 12:37+0100\n" | ||||
| "POT-Creation-Date: 2020-08-04 14:15+0200\n" | ||||
| "PO-Revision-Date: 2012-08-25 17:49+0200\n" | ||||
| "Last-Translator: Horst\n" | ||||
| "Language-Team: \n" | ||||
| @@ -54,6 +54,9 @@ msgstr "Favoriten" | ||||
| msgid "images" | ||||
| msgstr "Bilder" | ||||
|  | ||||
| msgid "tvguide: RemoteTimerModifications failed" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "root video folder" | ||||
| msgstr "Video Hauptverzeichnis" | ||||
|  | ||||
| @@ -99,12 +102,15 @@ msgstr "erledigte Aufnahmen" | ||||
| msgid "Instant Record" | ||||
| msgstr "Aufnahme" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Timer löschen" | ||||
| msgid "Timer On/Off" | ||||
| msgstr "Timer Ein/Aus" | ||||
|  | ||||
| msgid "Edit Timer" | ||||
| msgstr "Timer bearbeiten" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Timer löschen" | ||||
|  | ||||
| msgid "Timer Timeline" | ||||
| msgstr "Timer Tagesübersicht" | ||||
|  | ||||
| @@ -135,6 +141,9 @@ msgstr "In Aufnahmen suchen" | ||||
| msgid "Set Folder for" | ||||
| msgstr "Verzeichnis festlegen für" | ||||
|  | ||||
| msgid "Timer changed" | ||||
| msgstr "Timer geändert" | ||||
|  | ||||
| msgid "Timer created" | ||||
| msgstr "Timer angelegt" | ||||
|  | ||||
| @@ -882,15 +891,30 @@ msgstr "Verzeichnis aus Liste auswählen" | ||||
| msgid "Use fixed folder" | ||||
| msgstr "Festes Verzeichnis benutzen" | ||||
|  | ||||
| msgid "smart" | ||||
| msgstr "intelligent" | ||||
|  | ||||
| msgid "Instant recording:" | ||||
| msgstr "Sofortaufnahmen:" | ||||
|  | ||||
| msgid "Folder for instant Recordings" | ||||
| msgstr "Verzeichnis für Sofortaufnahmen" | ||||
|  | ||||
| msgid "Folder" | ||||
| msgstr "Verzeichnis" | ||||
|  | ||||
| msgid "Add episode to manual timers" | ||||
| msgstr "Untertitel in manuellen Timern" | ||||
|  | ||||
| msgid "Use Remotetimers" | ||||
| msgstr "RemoteTimers benutzen" | ||||
|  | ||||
| msgid "Show timer confirmation messages" | ||||
| msgstr "Timer Bestätigungsmeldungen anzeigen" | ||||
|  | ||||
| msgid "Favorites:" | ||||
| msgstr "Favoriten:" | ||||
|  | ||||
| msgid "Limit channels in favorites" | ||||
| msgstr "Kanäle in Favoriten beschränken" | ||||
|  | ||||
| @@ -979,7 +1003,7 @@ msgid "Reruns" | ||||
| msgstr "Wiederholungen" | ||||
|  | ||||
| msgid "Recording Information" | ||||
| msgstr "" | ||||
| msgstr "Aufnahme Information" | ||||
|  | ||||
| msgid "Image Galery" | ||||
| msgstr "Bildergalerie" | ||||
|   | ||||
							
								
								
									
										30
									
								
								po/it_IT.po
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								po/it_IT.po
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-tvguide 0.0.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2019-11-03 12:37+0100\n" | ||||
| "POT-Creation-Date: 2020-08-04 14:15+0200\n" | ||||
| "PO-Revision-Date: 2012-08-25 17:49+0200\n" | ||||
| "Last-Translator: fiveten_59\n" | ||||
| "Language-Team: \n" | ||||
| @@ -54,6 +54,9 @@ msgstr "Favoriti" | ||||
| msgid "images" | ||||
| msgstr "Immagini" | ||||
|  | ||||
| msgid "tvguide: RemoteTimerModifications failed" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "root video folder" | ||||
| msgstr "cartella video di root" | ||||
|  | ||||
| @@ -99,12 +102,15 @@ msgstr "registrazione eseguita" | ||||
| msgid "Instant Record" | ||||
| msgstr "Registrazione immediata" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Cancella il Timer" | ||||
| msgid "Timer On/Off" | ||||
| msgstr "Timer On/Off" | ||||
|  | ||||
| msgid "Edit Timer" | ||||
| msgstr "Edita il Timer" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Cancella il Timer" | ||||
|  | ||||
| msgid "Timer Timeline" | ||||
| msgstr "Scadenza del Timer" | ||||
|  | ||||
| @@ -135,6 +141,9 @@ msgstr "Cerca nelle registrazioni" | ||||
| msgid "Set Folder for" | ||||
| msgstr "Crea cartella per" | ||||
|  | ||||
| msgid "Timer changed" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Timer created" | ||||
| msgstr "Timer creato" | ||||
|  | ||||
| @@ -882,15 +891,30 @@ msgstr "Scegli dall'elenco cartelle" | ||||
| msgid "Use fixed folder" | ||||
| msgstr "Usa cartella fissa" | ||||
|  | ||||
| msgid "smart" | ||||
| msgstr "intelligente" | ||||
|  | ||||
| msgid "Instant recording:" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Folder for instant Recordings" | ||||
| msgstr "Cartella per la registrazione immediata" | ||||
|  | ||||
| msgid "Folder" | ||||
| msgstr "Cartella" | ||||
|  | ||||
| msgid "Add episode to manual timers" | ||||
| msgstr "Aggiungi episodi ai timer manuali" | ||||
|  | ||||
| msgid "Use Remotetimers" | ||||
| msgstr "Usa Remotetimers" | ||||
|  | ||||
| msgid "Show timer confirmation messages" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Favorites:" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Limit channels in favorites" | ||||
| msgstr "Limite dei canali nei favoriti" | ||||
|  | ||||
|   | ||||
							
								
								
									
										40
									
								
								po/ru_RU.po
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								po/ru_RU.po
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-tvguide 1.0.0\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2019-11-03 12:37+0100\n" | ||||
| "POT-Creation-Date: 2020-08-04 14:15+0200\n" | ||||
| "PO-Revision-Date: 2013-09-25 17:49+0400\n" | ||||
| "Last-Translator: AmiD, ilya\n" | ||||
| "Language-Team: Russia-Cherepovets(wm.amid@gmail.com)\n" | ||||
| @@ -22,7 +22,7 @@ msgid "min" | ||||
| msgstr "мин" | ||||
|  | ||||
| msgid "Reruns of " | ||||
| msgstr "" | ||||
| msgstr "ПОВТОРЫ ЭТОЙ " | ||||
|  | ||||
| msgid "No reruns found" | ||||
| msgstr "" | ||||
| @@ -54,6 +54,9 @@ msgstr "" | ||||
| msgid "images" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "tvguide: RemoteTimerModifications failed" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "root video folder" | ||||
| msgstr "Главная видео директория" | ||||
|  | ||||
| @@ -99,12 +102,15 @@ msgstr "" | ||||
| msgid "Instant Record" | ||||
| msgstr "Записать" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Удалить таймер" | ||||
| msgid "Timer On/Off" | ||||
| msgstr "таймер Вкл/Выкл" | ||||
|  | ||||
| msgid "Edit Timer" | ||||
| msgstr "Редактировать таймер" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Удалить таймер" | ||||
|  | ||||
| msgid "Timer Timeline" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -135,6 +141,9 @@ msgstr "Искать в записях" | ||||
| msgid "Set Folder for" | ||||
| msgstr "Укажите каталог для" | ||||
|  | ||||
| msgid "Timer changed" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Timer created" | ||||
| msgstr "Таймер создан" | ||||
|  | ||||
| @@ -289,7 +298,7 @@ msgid "No Search Timers Configured" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Configure Search Timer Options" | ||||
| msgstr "" | ||||
| msgstr "Настроить параметры таймера" | ||||
|  | ||||
| msgid "Save Search Timer" | ||||
| msgstr "" | ||||
| @@ -751,7 +760,7 @@ msgid "Display time in EPG Grids" | ||||
| msgstr "Показывать время в сетке EPG" | ||||
|  | ||||
| msgid "Height of Headers (Status Header and EPG View, Perc. of osd height)" | ||||
| msgstr "" | ||||
| msgstr "Высота верхней панели (% от высоты OSD)" | ||||
|  | ||||
| msgid "Height of Footer (Perc. of osd height)" | ||||
| msgstr "" | ||||
| @@ -882,15 +891,30 @@ msgstr "" | ||||
| msgid "Use fixed folder" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Folder for instant Recordings" | ||||
| msgid "smart" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Instant recording:" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Folder for instant Recordings" | ||||
| msgstr "Использовать директории для быстрой записи" | ||||
|  | ||||
| msgid "Folder" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Add episode to manual timers" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Use Remotetimers" | ||||
| msgstr "RemoteTimers benutzen" | ||||
|  | ||||
| msgid "Show timer confirmation messages" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Favorites:" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Limit channels in favorites" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -976,7 +1000,7 @@ msgid "EPG Info" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Reruns" | ||||
| msgstr "" | ||||
| msgstr "ПОВТОРЫ" | ||||
|  | ||||
| msgid "Recording Information" | ||||
| msgstr "" | ||||
|   | ||||
							
								
								
									
										38
									
								
								po/sk_SK.po
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								po/sk_SK.po
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-tvguide 1.1.0\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2019-11-03 12:37+0100\n" | ||||
| "POT-Creation-Date: 2020-08-04 14:15+0200\n" | ||||
| "PO-Revision-Date: 2013-09-15 00:12+0100\n" | ||||
| "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" | ||||
| "Language-Team: \n" | ||||
| @@ -22,7 +22,7 @@ msgid "min" | ||||
| msgstr "min" | ||||
|  | ||||
| msgid "Reruns of " | ||||
| msgstr "" | ||||
| msgstr "Repr<EFBFBD>za tohto " | ||||
|  | ||||
| msgid "No reruns found" | ||||
| msgstr "" | ||||
| @@ -54,6 +54,9 @@ msgstr "" | ||||
| msgid "images" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "tvguide: RemoteTimerModifications failed" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "root video folder" | ||||
| msgstr "Hlavn<76> video adres<65>r" | ||||
|  | ||||
| @@ -99,12 +102,15 @@ msgstr "" | ||||
| msgid "Instant Record" | ||||
| msgstr "Okam<61>ite nahra<72>" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Vymaza<EFBFBD> pl<70>n nahr<68>vania" | ||||
| msgid "Timer On/Off" | ||||
| msgstr "Zap./Vyp. pl<70>n nahr<68>vania" | ||||
|  | ||||
| msgid "Edit Timer" | ||||
| msgstr "Upravi<76> pl<70>n nahr<68>vania" | ||||
|  | ||||
| msgid "Delete Timer" | ||||
| msgstr "Vymaza<7A> pl<70>n nahr<68>vania" | ||||
|  | ||||
| msgid "Timer Timeline" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -135,6 +141,9 @@ msgstr "Vyh | ||||
| msgid "Set Folder for" | ||||
| msgstr "Nastavi<76> adres<65>r pre" | ||||
|  | ||||
| msgid "Timer changed" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Timer created" | ||||
| msgstr "Pl<50>n vytvoren<65>" | ||||
|  | ||||
| @@ -751,7 +760,7 @@ msgid "Display time in EPG Grids" | ||||
| msgstr "Zobrazi<7A> <20>as v EPG mrie<69>ke" | ||||
|  | ||||
| msgid "Height of Headers (Status Header and EPG View, Perc. of osd height)" | ||||
| msgstr "" | ||||
| msgstr "V<EFBFBD><EFBFBD>ka stavovej hlavi<76>ky (% z OSD v<><76>ky)" | ||||
|  | ||||
| msgid "Height of Footer (Perc. of osd height)" | ||||
| msgstr "" | ||||
| @@ -882,15 +891,30 @@ msgstr "" | ||||
| msgid "Use fixed folder" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Folder for instant Recordings" | ||||
| msgid "smart" | ||||
| msgstr "chytr<74>" | ||||
|  | ||||
| msgid "Instant recording:" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Folder for instant Recordings" | ||||
| msgstr "Pou<6F>i<EFBFBD> adres<65>re pre okam<61>it<69> nahr<68>vky" | ||||
|  | ||||
| msgid "Folder" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Add episode to manual timers" | ||||
| msgstr "Prida<64> epiz<69>dy do ru<72>n<EFBFBD>ho <20>asova<76>a" | ||||
|  | ||||
| msgid "Use Remotetimers" | ||||
| msgstr "Pou<6F>i<EFBFBD> vzdialen<65> pl<70>nova<76>" | ||||
|  | ||||
| msgid "Show timer confirmation messages" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Favorites:" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Limit channels in favorites" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -976,7 +1000,7 @@ msgid "EPG Info" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Reruns" | ||||
| msgstr "" | ||||
| msgstr "Repr<EFBFBD>za" | ||||
|  | ||||
| msgid "Recording Information" | ||||
| msgstr "" | ||||
|   | ||||
							
								
								
									
										137
									
								
								recmanager.c
									
									
									
									
									
								
							
							
						
						
									
										137
									
								
								recmanager.c
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| #define __STL_CONFIG_H | ||||
| #define DISABLE_TEMPLATES_COLLIDING_WITH_STL | ||||
|  | ||||
| #include <string> | ||||
| #include <sstream> | ||||
| @@ -96,10 +96,11 @@ cTimer *cRecManager::createTimer(const cEvent *event, std::string path) { | ||||
| cTimer *cRecManager::createLocalTimer(const cEvent *event, std::string path) { | ||||
|     cTimer *timer = new cTimer(event); | ||||
| #if VDRVERSNUM >= 20301 | ||||
|     if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost) | ||||
|         ((cTimer*)timer)->SetRemote(Setup.SVDRPDefaultHost); | ||||
|     LOCK_TIMERS_WRITE; | ||||
|     cTimers* timers = Timers; | ||||
|     timers->SetExplicitModify(); | ||||
|     if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost) | ||||
|         timer->SetRemote(Setup.SVDRPDefaultHost); | ||||
| #else | ||||
|     cTimers* timers = &Timers; | ||||
| #endif | ||||
| @@ -115,12 +116,21 @@ cTimer *cRecManager::createLocalTimer(const cEvent *event, std::string path) { | ||||
|         timer = t; | ||||
|         isyslog("timer %s reactivated", *t->ToDescr()); | ||||
|     } else { | ||||
|         SetTimerPath(timer, event, path); | ||||
|         timers->Add(timer); | ||||
|         timers->SetModified(); | ||||
| #if VDRVERSNUM >= 20301 | ||||
|         if (!HandleRemoteTimerModifications(timer)) { | ||||
|            timers->Del(timer); | ||||
|            esyslog(tr("tvguide: RemoteTimerModifications failed")); | ||||
|         } else { | ||||
|            isyslog("timer %s added (active)", *timer->ToDescr()); | ||||
|         } | ||||
| #else | ||||
|         isyslog("timer %s added (active)", *timer->ToDescr()); | ||||
| #endif | ||||
|     } | ||||
|     SetTimerPath(timer, event, path); | ||||
|     timers->SetModified(); | ||||
|     return timer; | ||||
|     return timers->GetTimer(timer); | ||||
| } | ||||
|  | ||||
| cTimer *cRecManager::createRemoteTimer(const cEvent *event, std::string path) { | ||||
| @@ -165,31 +175,29 @@ void cRecManager::SetTimerPath(cTimer *timer, const cEvent *event, std::string p | ||||
|         return; | ||||
|     } | ||||
|     //Set choosen path | ||||
|     bool addSubtitle = false; | ||||
|     if (!isempty(event->ShortText())) { // add subtitle if present | ||||
|         addSubtitle = (config.addSubtitleToTimer != addSubtitleNever); | ||||
|         if (config.addSubtitleToTimer == addSubtitleSmart) | ||||
|             if (event->Duration() > 80 * 60) | ||||
|                 addSubtitle = false; | ||||
|     } | ||||
|     cString newFileName; | ||||
|     if (path.size() > 0) { | ||||
|         std::replace(path.begin(), path.end(), '/', '~'); | ||||
|         newFileName = cString::sprintf("%s~%s", path.c_str(), timer->File()); | ||||
|         if (addSubtitle) | ||||
|            newFileName = cString::sprintf("%s~%s~%s", path.c_str(), event->Title(), event->ShortText()); | ||||
|         else | ||||
|            newFileName = cString::sprintf("%s~%s", path.c_str(), timer->File()); | ||||
|     } else { | ||||
|         newFileName = event->Title(); | ||||
|         if (addSubtitle) | ||||
|            newFileName = cString::sprintf("%s~%s", event->Title(), event->ShortText()); | ||||
|         else | ||||
|            newFileName = event->Title(); | ||||
|     } | ||||
|     timer->SetFile(*newFileName); | ||||
| } | ||||
|  | ||||
| void cRecManager::DeleteTimer(int timerID) { | ||||
|     const cTimer *t; | ||||
| #if VDRVERSNUM >= 20301 | ||||
|     { | ||||
|     LOCK_TIMERS_READ; | ||||
|     t = Timers->Get(timerID); | ||||
|     } | ||||
| #else | ||||
|     t = Timers.Get(timerID); | ||||
| #endif | ||||
|     if (!t) | ||||
|         return; | ||||
|     DeleteTimer(t); | ||||
| } | ||||
|  | ||||
| void cRecManager::DeleteTimer(const cEvent *event) { | ||||
|     if (!event) | ||||
|         return; | ||||
| @@ -219,6 +227,12 @@ void cRecManager::DeleteTimer(const cTimer *timer) { | ||||
| #if VDRVERSNUM >= 20301 | ||||
|     LOCK_TIMERS_WRITE; | ||||
|     cTimers* timers = Timers; | ||||
|     if (timer && timer->Remote() && !timer->Recording()) { | ||||
|        if (HandleRemoteTimerModifications(NULL, (cTimer*)timer)) { | ||||
|           timers->Del((cTimer*)timer); | ||||
|        } | ||||
|        timers->SetModified(); | ||||
|     } | ||||
|     cTimer* t = timers->GetTimer(timer); | ||||
| #else | ||||
|     cTimers* timers = &Timers; | ||||
| @@ -253,36 +267,67 @@ void cRecManager::DeleteRemoteTimer(const cEvent *event) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cRecManager::SaveTimer(const cTimer *t, cTimer newTimerSettings) { | ||||
| void cRecManager::OnOffTimer(const cEvent *event) { | ||||
|     const cTimer *t; | ||||
| #if VDRVERSNUM >= 20301 | ||||
|     { | ||||
|     LOCK_TIMERS_READ; | ||||
|     t = Timers->GetMatch(event); | ||||
|     } | ||||
| #else | ||||
|     t = Timers.GetMatch(event); | ||||
| #endif | ||||
|     if (!t) | ||||
|         return; | ||||
|     SaveTimer(t); | ||||
| } | ||||
|  | ||||
| void cRecManager::SaveTimer(const cTimer *t, cTimer *newTimerSettings) { | ||||
|     if (!t) | ||||
|         return; | ||||
|  | ||||
| #if VDRVERSNUM >= 20301 | ||||
|     LOCK_TIMERS_WRITE; | ||||
|     cTimer *timer = Timers->GetTimer(t); | ||||
|     cTimers* timers = Timers; | ||||
|     timers->SetExplicitModify(); | ||||
|     if (t && t->Remote()) { | ||||
|        if (!HandleRemoteTimerModifications(newTimerSettings, (cTimer *)t)) { | ||||
|           esyslog(tr("tvguide: RemoteTimerModifications failed")); | ||||
|        } | ||||
|     } | ||||
|     cTimer *timer = timers->GetTimer(t); | ||||
| #else | ||||
|     cTimer *timer = Timers.GetTimer((cTimer*)t); | ||||
|     cTimers* timers = &Timers; | ||||
|     cTimer *timer = timers->GetTimer((cTimer *)t); | ||||
| #endif | ||||
|     if (!timer) { | ||||
|        return; | ||||
|     } | ||||
|  | ||||
|     bool active = newTimerSettings.HasFlags(tfActive); | ||||
|     int prio = newTimerSettings.Priority(); | ||||
|     int lifetime = newTimerSettings.Lifetime(); | ||||
|     time_t day = newTimerSettings.Day(); | ||||
|     int start = newTimerSettings.Start(); | ||||
|     int stop = newTimerSettings.Stop(); | ||||
|     std::string fileName = newTimerSettings.File(); | ||||
|     bool active = true; | ||||
|     if (newTimerSettings) { | ||||
|        int prio = newTimerSettings->Priority(); | ||||
|        int lifetime = newTimerSettings->Lifetime(); | ||||
|        time_t day = newTimerSettings->Day(); | ||||
|        int start = newTimerSettings->Start(); | ||||
|        int stop = newTimerSettings->Stop(); | ||||
|        std::string fileName = newTimerSettings->File(); | ||||
|  | ||||
|     timer->SetDay(day); | ||||
|     timer->SetStart(start); | ||||
|     timer->SetStop(stop); | ||||
|     timer->SetPriority(prio); | ||||
|     timer->SetLifetime(lifetime); | ||||
|     timer->SetFile(fileName.c_str()); | ||||
|        timer->SetDay(day); | ||||
|        timer->SetStart(start); | ||||
|        timer->SetStop(stop); | ||||
|        timer->SetPriority(prio); | ||||
|        timer->SetLifetime(lifetime); | ||||
|        timer->SetFile(fileName.c_str()); | ||||
|  | ||||
|     if (timer->HasFlags(tfActive) && !active) | ||||
|         timer->ClrFlags(tfActive); | ||||
|     else if (!timer->HasFlags(tfActive) && active) | ||||
|         timer->SetFlags(tfActive); | ||||
|        active = newTimerSettings->HasFlags(tfActive); | ||||
|     } else | ||||
|        active = !timer->HasFlags(tfActive); | ||||
|  | ||||
|     if (active) | ||||
|        timer->SetFlags(tfActive); | ||||
|     else | ||||
|        timer->ClrFlags(tfActive); | ||||
|  | ||||
| #if VDRVERSNUM < 20300 | ||||
|     timer->SetEventFromSchedule(); | ||||
| @@ -294,11 +339,7 @@ void cRecManager::SaveTimer(const cTimer *t, cTimer newTimerSettings) { | ||||
|             rt.timer = NULL; | ||||
|         RefreshRemoteTimers(); | ||||
|     } else { | ||||
| #if VDRVERSNUM >= 20301 | ||||
|         Timers->SetModified(); | ||||
| #else | ||||
|         Timers.SetModified(); | ||||
| #endif | ||||
|         timers->SetModified(); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -33,12 +33,12 @@ public: | ||||
|     cTimer *createLocalTimer(const cEvent *event, std::string path); | ||||
|     cTimer *createRemoteTimer(const cEvent *event, std::string path); | ||||
|     void SetTimerPath(cTimer *timer, const cEvent *event, std::string path); | ||||
|     void OnOffTimer(const cEvent *event); | ||||
|     void DeleteTimer(const cTimer *timer); | ||||
|     void DeleteTimer(int timerID); | ||||
|     void DeleteTimer(const cEvent *event); | ||||
|     void DeleteLocalTimer(const cEvent *event); | ||||
|     void DeleteRemoteTimer(const cEvent *event); | ||||
|     void SaveTimer(const cTimer *timer, cTimer newTimerSettings); | ||||
|     void SaveTimer(const cTimer *timer, cTimer *newTimerSettings = NULL); | ||||
|     bool IsRecorded(const cEvent *event); | ||||
|     cTVGuideTimerConflicts *CheckTimerConflict(void); | ||||
|     void CreateSeriesTimer(cTimer *seriesTimer); | ||||
|   | ||||
| @@ -441,7 +441,7 @@ void cRecMenu::JumpBegin(void) { | ||||
|             CreatePixmap(); | ||||
|         Arrange(false); | ||||
|         startIndex = 0; | ||||
|         stopIndex = numItems - 1; | ||||
|         stopIndex = currentItem; | ||||
|         cRecMenuItem *first = menuItems.front(); | ||||
|         first->setActive(); | ||||
|         first->setBackground(); | ||||
| @@ -589,10 +589,14 @@ void cRecMenu::UpdateActiveMenuItem(void) { | ||||
|  | ||||
|  | ||||
| void cRecMenu::DrawScrollBar(void) { | ||||
|     if (!pixmapScrollBar) | ||||
|        return; | ||||
|     pixmapScrollBar->Fill(theme.Color(clrBorder)); | ||||
|     pixmapScrollBar->DrawRectangle(cRect(2,2,pixmapScrollBar->ViewPort().Width()-4, pixmapScrollBar->ViewPort().Height() - 4), theme.Color(clrBackground)); | ||||
|      | ||||
|     int totalNumItems = GetTotalNumMenuItems(); | ||||
|     if (!totalNumItems) | ||||
|        return; | ||||
|     if (imgScrollBar == NULL) { | ||||
|         int scrollBarImgHeight = (pixmapScrollBar->ViewPort().Height() - 8) * numItems / totalNumItems; | ||||
|         imgScrollBar = createScrollbar(pixmapScrollBar->ViewPort().Width()-8, scrollBarImgHeight, theme.Color(clrHighlight), theme.Color(clrHighlightBlending)); | ||||
|   | ||||
| @@ -557,7 +557,7 @@ void cRecMenuItemSelect::Draw(void) { | ||||
| void cRecMenuItemSelect::DrawValue(void) { | ||||
|     pixmapVal->Fill(clrTransparent); | ||||
|     std::string textVal = strings[currentVal]; | ||||
|     int iconSize = min(128, height); | ||||
|     int iconSize = std::min(128, height); | ||||
|     int textX = width - font->Width(textVal.c_str()) - iconSize; | ||||
|     int textY = (height - font->Height()) / 2; | ||||
|     pixmapVal->DrawText(cPoint(textX, textY), textVal.c_str(), colorText, clrTransparent, font); | ||||
| @@ -664,7 +664,7 @@ void cRecMenuItemSelectDirectory::Draw(void) { | ||||
|  | ||||
| void cRecMenuItemSelectDirectory::DrawValue(void) { | ||||
|     pixmapVal->Fill(clrTransparent); | ||||
|     int iconSize = min(128, height); | ||||
|     int iconSize = std::min(128, height); | ||||
|     int textX = std::max(width - font->Width(folders[currentVal].c_str()) - iconSize, 10 + font->Width(*text) + 2 * iconSize); | ||||
|     int textY = (height - font->Height()) / 2; | ||||
|     pixmapVal->DrawText(cPoint(textX, textY), folders[currentVal].c_str(), colorText, clrTransparent, font, width - textX - iconSize, font->Height(), taTop | taRight); | ||||
| @@ -967,7 +967,7 @@ char *cRecMenuItemText::GetSMSKeys(int num) { | ||||
|     if (specialChar) | ||||
|         addition = 1; | ||||
|     Utf8FromArray(startCharUtf8, p, numChars+addition); | ||||
|     int maxChars = min(numChars+1+addition, 8); | ||||
|     int maxChars = std::min(numChars+1+addition, 8); | ||||
|     char *smskey = new char[maxChars]; | ||||
|     Utf8Strn0Cpy(smskey, p, maxChars); | ||||
|     return smskey; | ||||
| @@ -1548,6 +1548,7 @@ cRecMenuItemTimer::cRecMenuItemTimer(const cTimer *timer, | ||||
|     this->overlapStop = overlapStop; | ||||
|     this->active = active; | ||||
|     height = 3 * font->Height(); | ||||
|     pixmapStatus = NULL; | ||||
|     pixmapIcons = NULL; | ||||
| } | ||||
|  | ||||
| @@ -1585,6 +1586,8 @@ void cRecMenuItemTimer::Show(void) { | ||||
| } | ||||
|  | ||||
| void cRecMenuItemTimer::Draw(void) { | ||||
|     if (!timer) | ||||
|        return; | ||||
|     const cChannel *channel = timer->Channel(); | ||||
|     int channelTransponder = 0; | ||||
|     cString channelName = ""; | ||||
| @@ -1598,7 +1601,7 @@ void cRecMenuItemTimer::Draw(void) { | ||||
|     if (!config.hideChannelLogos) { | ||||
|         if (imgLoader.LoadLogo(channel, logoWidth, height)) { | ||||
|             cImage logo = imgLoader.GetImage(); | ||||
|             pixmapIcons->DrawImage(cPoint(logoX, 0), logo); | ||||
|             pixmapIcons->DrawImage(cPoint(logoX, (height - logo.Height()) / 2), logo); | ||||
|             logoX += logoWidth + 5; | ||||
|         } | ||||
|     } | ||||
| @@ -1740,8 +1743,13 @@ cRecMenuItemTimerConflictHeader::~cRecMenuItemTimerConflictHeader(void) { | ||||
| } | ||||
|  | ||||
| void cRecMenuItemTimerConflictHeader::SetPixmaps(void) { | ||||
|     pixmap = osdManager.requestPixmap(4, cRect(x, y, width, height)); | ||||
|     pixmapStatus = osdManager.requestPixmap(5, cRect(x, y, width, height)); | ||||
|     if (!pixmap) { | ||||
|        pixmap = osdManager.requestPixmap(4, cRect(x, y, width, height)); | ||||
|        pixmapStatus = osdManager.requestPixmap(5, cRect(x, y, width, height)); | ||||
|     } else { | ||||
|        pixmap->SetViewPort(cRect(x, y, width, height)); | ||||
|        pixmapStatus->SetViewPort(cRect(x, y, width, height)); | ||||
|     } | ||||
|     pixmapStatus->Fill(clrTransparent); | ||||
| } | ||||
|  | ||||
| @@ -2005,7 +2013,7 @@ void cRecMenuItemChannelChooser::DrawValue(void) { | ||||
|         cImageLoader imgLoader; | ||||
|         if (imgLoader.LoadLogo(channel, logoWidth, height - 10)) { | ||||
|             cImage logo = imgLoader.GetImage(); | ||||
|             pixmapChannel->DrawImage(cPoint(logoX, 5), logo); | ||||
|             pixmapChannel->DrawImage(cPoint(logoX, (height - logo.Height()) / 2), logo); | ||||
|         } | ||||
|     } else { | ||||
|         cString textVal = tr("all Channels"); | ||||
| @@ -2155,7 +2163,7 @@ void cRecMenuItemDayChooser::SetSizes(void) { | ||||
|         if (charWidth > maxWidth) | ||||
|             maxWidth = charWidth; | ||||
|     }     | ||||
|     daysSize = min(maxWidth + 15, height - 4); | ||||
|     daysSize = std::min(maxWidth + 15, height - 4); | ||||
|     daysX = width - 10 - 7 * daysSize; | ||||
|     daysY = (height  - daysSize) / 2; | ||||
| } | ||||
| @@ -2304,13 +2312,14 @@ void cRecMenuItemRecording::Show(void) { | ||||
| } | ||||
|  | ||||
| // --- cRecMenuItemTimelineHeader  ------------------------------------------------------- | ||||
| cRecMenuItemTimelineHeader::cRecMenuItemTimelineHeader(time_t day, std::vector<cTVGuideTimerConflict*> conflictsToday) { | ||||
| cRecMenuItemTimelineHeader::cRecMenuItemTimelineHeader(time_t day, int numTimersToday, std::vector<cTVGuideTimerConflict*> conflictsToday) { | ||||
|     conflicts = conflictsToday; | ||||
|     pixmapTimeline = NULL; | ||||
|     pixmapTimerInfo = NULL; | ||||
|     pixmapTimerConflicts = NULL; | ||||
|     timer = NULL; | ||||
|     this->day = day; | ||||
|     this->numTimersToday = numTimersToday; | ||||
|     selectable = false; | ||||
|     active = false; | ||||
|     height = 5 * font->Height(); | ||||
| @@ -2359,7 +2368,7 @@ void cRecMenuItemTimelineHeader::Draw(void) { | ||||
|     } | ||||
|     DrawTimerConflicts(); | ||||
|     pixmap->Fill(clrTransparent); | ||||
|     cString headerText = tr("Timers for"); | ||||
|     cString headerText = cString::sprintf("%i %s", numTimersToday, tr("Timers for")); | ||||
|     cString dateText = DateString(day); | ||||
|     cString header = cString::sprintf("%s: %s", *headerText, *dateText); | ||||
|     int xText = (width - fontLarge->Width(*header)) / 2; | ||||
| @@ -2384,7 +2393,7 @@ void cRecMenuItemTimelineHeader::DrawCurrentTimer(void) { | ||||
|         if (!config.hideChannelLogos) { | ||||
|             if (imgLoader.LoadLogo(channel, logoWidth, infoHeight)) { | ||||
|                 cImage logo = imgLoader.GetImage(); | ||||
|                 pixmapTimerInfo->DrawImage(cPoint(0, 0), logo); | ||||
|                 pixmapTimerInfo->DrawImage(cPoint(0, (infoHeight - logo.Height()) / 2), logo); | ||||
|                 x += logoWidth + 10; | ||||
|                 logoDrawn = true; | ||||
|             } | ||||
| @@ -2421,7 +2430,7 @@ void cRecMenuItemTimelineHeader::DrawTimeline(void) { | ||||
|     pixmapTimeline->Fill(clrTransparent); | ||||
|     width5Mins = (float)width * 5.0 / 24.0 / 60.0; | ||||
|     int widthHour = 12 * width5Mins; | ||||
|     x0 = (width - 24*widthHour)/2; | ||||
|     x0 = (width - (24 * widthHour)) / 2; | ||||
|     int barHeight = fontSmall->Height(); | ||||
|     int y = height - barHeight; | ||||
|     tColor col1 = theme.Color(clrTimeline1); | ||||
| @@ -2526,7 +2535,8 @@ void cRecMenuItemTimelineTimer::SetPixmaps(void) { | ||||
|              | ||||
|     } | ||||
|     width5Mins = (float)width * 5.0 / 24.0 / 60.0; | ||||
|     x0 = (width - 24*12*width5Mins)/2; | ||||
|     int widthHour = 12 * width5Mins; | ||||
|     x0 = (width - (24 * widthHour)) / 2; | ||||
| } | ||||
|  | ||||
| void cRecMenuItemTimelineTimer::Draw(void) { | ||||
|   | ||||
| @@ -25,6 +25,7 @@ enum eRecMenuState { | ||||
|     rmsSearchRerunsTimerConflictMenu, | ||||
|     rmsSaveTimerConflictMenu, | ||||
|     rmsTimerConflictShowInfo, | ||||
|     rmsOnOffTimer, | ||||
|     rmsDeleteTimer, | ||||
|     rmsDeleteTimerConfirmation, | ||||
|     rmsEditTimer, | ||||
| @@ -573,19 +574,21 @@ private: | ||||
|     cPixmap *pixmapTimeline; | ||||
|     cPixmap *pixmapTimerInfo; | ||||
|     cPixmap *pixmapTimerConflicts; | ||||
|     int width5Mins; | ||||
|     float width5Mins; | ||||
|     int x0; | ||||
|     int numTimersToday; | ||||
|     bool timelineDrawn; | ||||
|     void DrawTimeline(void); | ||||
|     void DrawTimerConflicts(void); | ||||
|     void DrawCurrentTimer(void); | ||||
| public: | ||||
|     cRecMenuItemTimelineHeader(time_t day, std::vector<cTVGuideTimerConflict*> conflictsToday); | ||||
|     cRecMenuItemTimelineHeader(time_t day, int numTimersToday, std::vector<cTVGuideTimerConflict*> conflictsToday); | ||||
|     virtual ~cRecMenuItemTimelineHeader(void); | ||||
|     void SetDay(time_t day) { this->day = day; }; | ||||
|     void SetPixmaps(void); | ||||
|     void SetCurrentTimer(const cTimer *timer) { this->timer = timer; }; | ||||
|     void UnsetCurrentTimer(void) { timer = NULL; }; | ||||
|     void SetNumTimersToday(int numTimersToday) { this->numTimersToday = numTimersToday; }; | ||||
|     void RefreshTimerDisplay(void); | ||||
|     void Hide(void); | ||||
|     void Show(void);  | ||||
| @@ -601,7 +604,7 @@ private: | ||||
|     cPixmap *pixmapTimerConflicts; | ||||
|     cRecMenuItemTimelineHeader *header; | ||||
|     int x0; | ||||
|     int width5Mins; | ||||
|     float width5Mins; | ||||
|     time_t start; | ||||
|     time_t stop; | ||||
|     void DrawBackground(void); | ||||
|   | ||||
							
								
								
									
										99
									
								
								recmenus.c
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								recmenus.c
									
									
									
									
									
								
							| @@ -11,8 +11,9 @@ cRecMenuMain::cRecMenuMain(bool epgSearchAvailable, bool timerActive, bool switc | ||||
|             action = rmsInstantRecordFolder; | ||||
|         AddMenuItem(new cRecMenuItemButton(tr("Instant Record"), action, true, false, false, true)); | ||||
|     } else { | ||||
|         AddMenuItem(new cRecMenuItemButton(tr("Delete Timer"), rmsDeleteTimer, true, false, false, true)); | ||||
|         AddMenuItem(new cRecMenuItemButton(tr("Timer On/Off"), rmsOnOffTimer, true, false, false, true)); | ||||
|         AddMenuItem(new cRecMenuItemButton(tr("Edit Timer"), rmsEditTimer, false, false, false, true)); | ||||
|         AddMenuItem(new cRecMenuItemButton(tr("Delete Timer"), rmsDeleteTimer, false, false, false, true)); | ||||
|     } | ||||
|  | ||||
|     AddMenuItem(new cRecMenuItemButton(tr("Timer Timeline"), rmsTimeline, false, false, false, true)); | ||||
| @@ -103,7 +104,7 @@ std::string cRecMenuAskFolder::GetFolder(void) { | ||||
| } | ||||
|  | ||||
| // --- cRecMenuConfirmTimer  --------------------------------------------------------- | ||||
| cRecMenuConfirmTimer::cRecMenuConfirmTimer(const cEvent *event) { | ||||
| cRecMenuConfirmTimer::cRecMenuConfirmTimer(const cEvent *event, bool timerChanged) { | ||||
|     SetWidthPercent(50); | ||||
| #if VDRVERSNUM >= 20301 | ||||
|     LOCK_CHANNELS_READ; | ||||
| @@ -111,7 +112,6 @@ cRecMenuConfirmTimer::cRecMenuConfirmTimer(const cEvent *event) { | ||||
| #else | ||||
|     const cString channelName = Channels.GetByChannelID(event->ChannelID())->Name(); | ||||
| #endif | ||||
|     cString message; | ||||
|     bool eventHasTimer = false; | ||||
|     if (config.useRemoteTimers && pRemoteTimers) { | ||||
|         RemoteTimers_GetMatch_v1_0 rtMatch; | ||||
| @@ -123,11 +123,9 @@ cRecMenuConfirmTimer::cRecMenuConfirmTimer(const cEvent *event) { | ||||
|     } else { | ||||
|         eventHasTimer = event->HasTimer(); | ||||
|     } | ||||
|     if (eventHasTimer) { | ||||
|         message = tr("Timer created"); | ||||
|     } else { | ||||
|         message = tr("Timer NOT created"); | ||||
|     } | ||||
|     const cString message = (eventHasTimer) ? (timerChanged) ? tr("Timer changed") | ||||
|                                                              : tr("Timer created") | ||||
|                                             : tr("Timer NOT created"); | ||||
|     cString text = cString::sprintf("%s\n%s\n%s %s - %s\n%s",  | ||||
|                                     *message,  | ||||
|                                     *channelName, | ||||
| @@ -197,8 +195,9 @@ cRecMenuAskDeleteTimer::cRecMenuAskDeleteTimer(const cEvent *event) { | ||||
|  | ||||
| // --- cRecMenuTimerConflicts  --------------------------------------------------------- | ||||
| cRecMenuTimerConflicts::cRecMenuTimerConflicts(cTVGuideTimerConflicts *conflicts) { | ||||
|     int numConflicts = conflicts->NumConflicts(); | ||||
|      | ||||
|     SetWidthPercent(50); | ||||
|  | ||||
|     int numConflicts = (conflicts) ? conflicts->NumConflicts() : 0; | ||||
|     cString text; | ||||
|     if (numConflicts == 1) { | ||||
|         text = cString::sprintf("%s %s %s", tr("One"), tr("Timer Conflict"), tr("detected")); | ||||
| @@ -233,19 +232,21 @@ int cRecMenuTimerConflicts::GetTimerConflict(void) { | ||||
| } | ||||
|  | ||||
| // --- cRecMenuTimerConflict  --------------------------------------------------------- | ||||
| cRecMenuTimerConflict::cRecMenuTimerConflict(cTVGuideTimerConflict *conflict) { | ||||
| cRecMenuTimerConflict::cRecMenuTimerConflict(cTVGuideTimerConflict *conflict, eRecMenuState nextAction) { | ||||
|     SetWidthPercent(95); | ||||
|     this->conflict = conflict; | ||||
|     SetHeader(new cRecMenuItemTimerConflictHeader(conflict->timeStart,  | ||||
|                                                   conflict->timeStop,  | ||||
|                                                   conflict->overlapStart,  | ||||
|     totalNumMenuItems = (int)conflict->timerIDs.size(); | ||||
|  | ||||
|     SetHeader(new cRecMenuItemTimerConflictHeader(conflict->timeStart, | ||||
|                                                   conflict->timeStop, | ||||
|                                                   conflict->overlapStart, | ||||
|                                                   conflict->overlapStop)); | ||||
|     SetFooter(new cRecMenuItemButton(tr("Ignore Conflict"), rmsIgnoreTimerConflict, false, true)); | ||||
|     SetFooter(new cRecMenuItemButton(tr("Ignore Conflict"), nextAction, false, true)); | ||||
|     int i=0; | ||||
|     for(std::vector<int>::iterator it = conflict->timerIDs.begin(); it != conflict->timerIDs.end(); it++) { | ||||
| #if VDRVERSNUM >= 20301 | ||||
|         LOCK_TIMERS_READ; | ||||
|         const cTimer *timer = Timers->Get(*it); | ||||
|         const cTimer *timer = Timers->GetById(*it + 1); | ||||
| #else | ||||
|         const cTimer *timer = Timers.Get(*it); | ||||
| #endif | ||||
| @@ -271,7 +272,7 @@ cRecMenuTimerConflict::cRecMenuTimerConflict(cTVGuideTimerConflict *conflict) { | ||||
| } | ||||
|      | ||||
| cRecMenuItem *cRecMenuTimerConflict::GetMenuItem(int number) {  | ||||
|     if ((number >= 0) && (number < (int)conflict->timerIDs.size())) { | ||||
|     if ((number >= 0) && (number < totalNumMenuItems)) { | ||||
| #if VDRVERSNUM >= 20301 | ||||
|         LOCK_TIMERS_READ; | ||||
|         const cTimer *timer = Timers->Get(conflict->timerIDs[number]); | ||||
| @@ -293,8 +294,8 @@ cRecMenuItem *cRecMenuTimerConflict::GetMenuItem(int number) { | ||||
|     return NULL; | ||||
| } | ||||
|  | ||||
| int cRecMenuTimerConflict::GetTotalNumMenuItems(void) {  | ||||
|     return conflict->timerIDs.size();  | ||||
| int cRecMenuTimerConflict::GetTotalNumMenuItems(void) { | ||||
|     return totalNumMenuItems;  | ||||
| } | ||||
|  | ||||
| int cRecMenuTimerConflict::GetTimerConflictIndex(void) { | ||||
| @@ -470,17 +471,17 @@ const cTimer *cRecMenuEditTimer::GetOriginalTimer(void) { | ||||
|     return originalTimer; | ||||
| } | ||||
|  | ||||
| cTimer cRecMenuEditTimer::GetTimer(void) { | ||||
|     cTimer t; | ||||
| cTimer *cRecMenuEditTimer::GetTimer(void) { | ||||
|     cTimer *t = (cTimer *)originalTimer; | ||||
|     if (timerActive) | ||||
|         t.SetFlags(tfActive); | ||||
|         t->SetFlags(tfActive); | ||||
|     else  | ||||
|         t.SetFlags(tfNone); | ||||
|     t.SetDay(day); | ||||
|     t.SetStart(start); | ||||
|     t.SetStop(stop); | ||||
|     t.SetPriority(prio); | ||||
|     t.SetLifetime(lifetime); | ||||
|         t->ClrFlags(tfActive); | ||||
|     t->SetDay(day); | ||||
|     t->SetStart(start); | ||||
|     t->SetStop(stop); | ||||
|     t->SetPriority(prio); | ||||
|     t->SetLifetime(lifetime); | ||||
|     std::string newFolder(folder); | ||||
|     std::string newFile = originalTimer->File(); | ||||
|     size_t found = newFile.find_last_of('~'); | ||||
| @@ -495,7 +496,7 @@ cTimer cRecMenuEditTimer::GetTimer(void) { | ||||
|             newFile = *cString::sprintf("%s~%s", newFolder.c_str(), newFile.c_str()); | ||||
|     } | ||||
|     std::replace(newFile.begin(), newFile.end(), '/', '~'); | ||||
|     t.SetFile(newFile.c_str()); | ||||
|     t->SetFile(newFile.c_str()); | ||||
|     return t; | ||||
| } | ||||
|  | ||||
| @@ -1413,8 +1414,8 @@ cRecMenuTimeline::cRecMenuTimeline(cTVGuideTimerConflicts *timerConflicts) { | ||||
|     SetStartStop(); | ||||
|     conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop); | ||||
|     GetTimersForDay(); | ||||
|     SetWidthPercent(95); | ||||
|     header = new cRecMenuItemTimelineHeader(timeStart, conflictsToday); | ||||
|     SetWidthPercent(90); | ||||
|     header = new cRecMenuItemTimelineHeader(timeStart, numTimersToday, conflictsToday); | ||||
|     SetHeader(header); | ||||
|     cRecMenuItem *footer = new cRecMenuItemButton(tr("Close"), rmsClose, false, true); | ||||
|     SetFooter(footer); | ||||
| @@ -1434,26 +1435,40 @@ void cRecMenuTimeline::GetTimersForDay(void) { | ||||
|     timersToday.clear(); | ||||
| #if VDRVERSNUM >= 20301 | ||||
|     LOCK_TIMERS_READ; | ||||
| //    const cTimers* timers = Timers; | ||||
|     for (const cTimer *t = Timers->First(); t; t = Timers->Next(t)) { | ||||
|     const cTimers* timers = Timers; | ||||
|     cSortedTimers SortedTimers(timers); | ||||
|     int i = 0; | ||||
|     while (i < SortedTimers.Size()) { | ||||
|         const cTimer *t = SortedTimers[i]; | ||||
|         if (((t->StartTime() > timeStart) && (t->StartTime() <= timeStop)) || ((t->StopTime() > timeStart) && (t->StopTime() <= timeStop))) { | ||||
|             if (t->HasFlags(tfActive)) | ||||
|                 timersToday.push_back(t); | ||||
|         } | ||||
|         i++; | ||||
|     } | ||||
| #else | ||||
|     for (const cTimer *t = Timers.First(); t; t = Timers.Next(t)) { | ||||
| #endif | ||||
|         if (((t->StartTime() > timeStart) && (t->StartTime() <= timeStop)) || ((t->StopTime() > timeStart) && (t->StopTime() <= timeStop))) { | ||||
|             timersToday.push_back(t); | ||||
|         } | ||||
|     } | ||||
| #endif | ||||
|     numTimersToday = timersToday.size(); | ||||
| } | ||||
|  | ||||
| void cRecMenuTimeline::SetTimers(void) { | ||||
|     ClearMenu(); | ||||
|     GetTimersForDay(); | ||||
|     conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop); | ||||
|     header->UnsetCurrentTimer(); | ||||
|     header->SetDay(timeStart); | ||||
|     header->RefreshTimerDisplay(); | ||||
|     header->SetNumTimersToday(numTimersToday); | ||||
|     if (numTimersToday == 0) { | ||||
|         AddMenuItem(new cRecMenuItemTimelineTimer(NULL, 0, 0, conflictsToday, header, false)); | ||||
|         header->UnsetCurrentTimer(); | ||||
|         footer->setActive(); | ||||
|     } else { | ||||
|         for (int i=0; i<numTimersToday; i++) { | ||||
|         for (int i = 0; i<numTimersToday; i++) { | ||||
|             cRecMenuItemTimelineTimer *item = new cRecMenuItemTimelineTimer(timersToday[i], timeStart, timeStop, conflictsToday, header, false); | ||||
|             if (i==0) | ||||
|                 item->setActive(); | ||||
| @@ -1472,12 +1487,6 @@ void cRecMenuTimeline::PrevDay(void) { | ||||
|         return; | ||||
|     timeStart -= 3600*24; | ||||
|     timeStop -= 3600*24; | ||||
|     conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop); | ||||
|     SetWidthPercent(95); | ||||
|     header->SetDay(timeStart); | ||||
|     header->UnsetCurrentTimer(); | ||||
|     header->RefreshTimerDisplay(); | ||||
|     GetTimersForDay(); | ||||
|     SetTimers(); | ||||
|     Display(); | ||||
| } | ||||
| @@ -1485,12 +1494,6 @@ void cRecMenuTimeline::PrevDay(void) { | ||||
| void cRecMenuTimeline::NextDay(void) { | ||||
|     timeStart += 3600*24; | ||||
|     timeStop += 3600*24; | ||||
|     conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop); | ||||
|     SetWidthPercent(95); | ||||
|     header->SetDay(timeStart); | ||||
|     header->UnsetCurrentTimer(); | ||||
|     header->RefreshTimerDisplay(); | ||||
|     GetTimersForDay(); | ||||
|     SetTimers(); | ||||
|     Display(); | ||||
| } | ||||
|   | ||||
| @@ -47,7 +47,7 @@ public: | ||||
| // --- cRecMenuConfirmTimer  --------------------------------------------------------- | ||||
| class cRecMenuConfirmTimer: public cRecMenu { | ||||
| public: | ||||
|     cRecMenuConfirmTimer(const cEvent *event); | ||||
|     cRecMenuConfirmTimer(const cEvent *event, bool timerChanged = false); | ||||
|     virtual ~cRecMenuConfirmTimer(void) {}; | ||||
| }; | ||||
|  | ||||
| @@ -77,11 +77,12 @@ public: | ||||
| class cRecMenuTimerConflict: public cRecMenu { | ||||
| private: | ||||
|     cTVGuideTimerConflict *conflict; | ||||
|     int totalNumMenuItems; | ||||
| public: | ||||
|     cRecMenuTimerConflict(cTVGuideTimerConflict *conflict); | ||||
|     cRecMenuTimerConflict(cTVGuideTimerConflict *conflict, eRecMenuState nextAction = rmsClose); | ||||
|     virtual ~cRecMenuTimerConflict(void) {}; | ||||
|     cRecMenuItem *GetMenuItem(int number); | ||||
|     int GetTotalNumMenuItems(void); | ||||
|     virtual ~cRecMenuTimerConflict(void) {}; | ||||
|     int GetTimerConflictIndex(void); | ||||
| }; | ||||
|  | ||||
| @@ -136,7 +137,7 @@ public: | ||||
|     cRecMenuEditTimer(const cTimer *timer, eRecMenuState nextState); | ||||
|     const cTimer *GetOriginalTimer(void); | ||||
|     virtual ~cRecMenuEditTimer(void) {}; | ||||
|     cTimer GetTimer(void); | ||||
|     cTimer *GetTimer(void); | ||||
| }; | ||||
|  | ||||
| /****************************************************************************************** | ||||
|   | ||||
							
								
								
									
										157
									
								
								recmenuview.c
									
									
									
									
									
								
							
							
						
						
									
										157
									
								
								recmenuview.c
									
									
									
									
									
								
							| @@ -93,16 +93,18 @@ void cRecMenuView::DisplaySearchTimerList(void) { | ||||
| } | ||||
|  | ||||
| bool cRecMenuView::DisplayTimerConflict(const cTimer *timer) { | ||||
|     int timerID = 0; | ||||
| #if VDRVERSNUM >= 20301 | ||||
|     LOCK_TIMERS_READ; | ||||
|     for (const cTimer *t = Timers->First(); t; t = Timers->Next(t)) { | ||||
|         if (t == timer) | ||||
|             return DisplayTimerConflict(timer->Id() - 1); | ||||
| #else | ||||
|     int timerID = 0; | ||||
|     for (const cTimer *t = Timers.First(); t; t = Timers.Next(t)) { | ||||
| #endif | ||||
|         if (t == timer) | ||||
|             return DisplayTimerConflict(timerID); | ||||
|         timerID++; | ||||
| #endif | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| @@ -119,7 +121,8 @@ bool cRecMenuView::DisplayTimerConflict(int timerID) { | ||||
|         cTVGuideTimerConflict *conflict = timerConflicts->GetCurrentConflict(); | ||||
|         if (!conflict) | ||||
|             return false; | ||||
|         activeMenu = new cRecMenuTimerConflict(conflict); | ||||
|         delete activeMenu; | ||||
|         activeMenu = new cRecMenuTimerConflict(conflict, rmsIgnoreTimerConflict); | ||||
|         activeMenu->Display(); | ||||
|         return true; | ||||
|     } | ||||
| @@ -161,11 +164,16 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|             if (cRecMenuAskFolder *menu = dynamic_cast<cRecMenuAskFolder*>(activeMenu)) { | ||||
|                 recFolder = menu->GetFolder(); | ||||
|             } | ||||
|             delete activeMenu; | ||||
|             cTimer *timer = recManager->createTimer(event, recFolder); | ||||
|             if (!DisplayTimerConflict(timer)) { | ||||
|                 activeMenu = new cRecMenuConfirmTimer(event); | ||||
|                 activeMenu->Display(); | ||||
|                 if (config.timerMessage) { | ||||
|                     delete activeMenu; | ||||
|                     activeMenu = new cRecMenuConfirmTimer(event); | ||||
|                     activeMenu->Display(); | ||||
|                 } else { | ||||
|                     Close(); | ||||
|                     state = osEnd; | ||||
|                 } | ||||
|             } | ||||
|             break; } | ||||
|         case rmsInstantRecordFolder: | ||||
| @@ -175,24 +183,49 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|             activeMenu = new cRecMenuAskFolder(event, rmsInstantRecord); | ||||
|             activeMenu->Display(); | ||||
|             break; | ||||
|         case rmsOnOffTimer: { | ||||
|             //caller: main menu | ||||
|             //De/Activate timer for active event | ||||
|             recManager->OnOffTimer(event); | ||||
|             if (config.timerMessage) { | ||||
|                 delete activeMenu; | ||||
|                 activeMenu = new cRecMenuConfirmTimer(event, true); | ||||
|                 activeMenu->Display(); | ||||
|             } else { | ||||
|                 Close(); | ||||
|                 state = osEnd; | ||||
|             } | ||||
|             break; } | ||||
|         case rmsDeleteTimer: { | ||||
|             //caller: main menu | ||||
|             //delete timer for active event | ||||
|             delete activeMenu; | ||||
|             if (recManager->IsRecorded(event)) { | ||||
|                 delete activeMenu; | ||||
|                 activeMenu = new cRecMenuAskDeleteTimer(event); | ||||
|                 activeMenu->Display(); | ||||
|             } else { | ||||
|                 recManager->DeleteTimer(event); | ||||
|                 activeMenu = new cRecMenuConfirmDeleteTimer(event); | ||||
|                 if (config.timerMessage) { | ||||
|                     delete activeMenu; | ||||
|                     activeMenu = new cRecMenuConfirmDeleteTimer(event); | ||||
|                     activeMenu->Display(); | ||||
|                 } else { | ||||
|                     Close(); | ||||
|                     state = osEnd; | ||||
|                 } | ||||
|             } | ||||
|             activeMenu->Display(); | ||||
|             break; } | ||||
|         case rmsDeleteTimerConfirmation: { | ||||
|             //delete running timer for active event | ||||
|             recManager->DeleteTimer(event); | ||||
|             delete activeMenu; | ||||
|             activeMenu = new cRecMenuConfirmDeleteTimer(event); | ||||
|             activeMenu->Display(); | ||||
|             if (config.timerMessage) { | ||||
|                 delete activeMenu; | ||||
|                 activeMenu = new cRecMenuConfirmDeleteTimer(event); | ||||
|                 activeMenu->Display(); | ||||
|             } else { | ||||
|                 Close(); | ||||
|                 state = osEnd; | ||||
|             } | ||||
|             break; } | ||||
|         case rmsEditTimer: { | ||||
|             //edit timer for active event | ||||
| @@ -206,7 +239,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|         case rmsSaveTimer: { | ||||
|             //caller: cRecMenuEditTimer | ||||
|             //save timer for active event | ||||
|             cTimer timerModified; | ||||
|             cTimer *timerModified; | ||||
|             const cTimer *originalTimer; | ||||
|             if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) { | ||||
|                 timerModified = menu->GetTimer(); | ||||
| @@ -219,9 +252,14 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|         case rmsIgnoreTimerConflict: | ||||
|         //caller: cRecMenuTimerConflict | ||||
|         //Confirming created Timer | ||||
|             delete activeMenu; | ||||
|             activeMenu = new cRecMenuConfirmTimer(event); | ||||
|             activeMenu->Display(); | ||||
|             if (config.timerMessage) { | ||||
|                 delete activeMenu; | ||||
|                 activeMenu = new cRecMenuConfirmTimer(event); | ||||
|                 activeMenu->Display(); | ||||
|             } else { | ||||
|                 Close(); | ||||
|                 state = osEnd; | ||||
|             } | ||||
|             break; | ||||
|         case rmsTimerConflictShowInfo: { | ||||
|             //caller: cRecMenuTimerConflict | ||||
| @@ -229,12 +267,18 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|             if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) { | ||||
|                 timerIndex = menu->GetTimerConflictIndex(); | ||||
|             } else break; | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); | ||||
|             const cTimers* timers; | ||||
| #if VDRVERSNUM >= 20301 | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex) + 1; | ||||
|             { | ||||
|             LOCK_TIMERS_READ; | ||||
|             const cTimer *t = Timers->Get(timerID); | ||||
|             timers = Timers; | ||||
|             } | ||||
|             const cTimer *t = timers->GetById(timerID); | ||||
| #else | ||||
|             cTimer *t = Timers.Get(timerID); | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); | ||||
|             timers = &Timers; | ||||
|             const cTimer *t = timers->Get(timerID); | ||||
| #endif | ||||
|             if (t) { | ||||
|                 const cEvent *ev = t->Event(); | ||||
| @@ -250,12 +294,30 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|             if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) { | ||||
|                 timerIndex = menu->GetTimerConflictIndex(); | ||||
|             } else break; | ||||
|             const cTimers* timers; | ||||
|             const cEvent *event; | ||||
| #if VDRVERSNUM >= 20301 | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex) + 1; | ||||
|             { | ||||
|             LOCK_TIMERS_READ; | ||||
|             timers = Timers; | ||||
|             } | ||||
|             event = timers->GetById(timerID)->Event(); | ||||
| #else | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); | ||||
|             recManager->DeleteTimer(timerID); | ||||
|             delete activeMenu; | ||||
|             timers = &Timers; | ||||
|             event = timers->Get(timerID)->Event(); | ||||
| #endif | ||||
|             recManager->DeleteTimer(event); | ||||
|             if (!DisplayTimerConflict(timerID)) { | ||||
|                 activeMenu = new cRecMenuConfirmTimer(event); | ||||
|                 activeMenu->Display(); | ||||
|                 if (config.timerMessage) { | ||||
|                     delete activeMenu; | ||||
|                     activeMenu = new cRecMenuConfirmDeleteTimer(event); | ||||
|                     activeMenu->Display(); | ||||
|                 } else { | ||||
|                     Close(); | ||||
|                     state = osEnd; | ||||
|                 } | ||||
|             } | ||||
|             break; } | ||||
|         case rmsEditTimerConflictMenu: { | ||||
| @@ -265,12 +327,18 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|             if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) { | ||||
|                 timerIndex = menu->GetTimerConflictIndex(); | ||||
|             } else break; | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); | ||||
|             const cTimers* timers; | ||||
| #if VDRVERSNUM >= 20301 | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex) + 1; | ||||
|             { | ||||
|             LOCK_TIMERS_READ; | ||||
|             const cTimer *timer = Timers->Get(timerID); | ||||
|             timers = Timers; | ||||
|             } | ||||
|             const cTimer *timer = timers->GetById(timerID); | ||||
| #else | ||||
|             const cTimer *timer = Timers.Get(timerID); | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); | ||||
|             timers = &Timers; | ||||
|             const cTimer *timer = timers->Get(timerID); | ||||
| #endif | ||||
|             if (timer) { | ||||
|                 delete activeMenu; | ||||
| @@ -281,17 +349,22 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|         case rmsSaveTimerConflictMenu: { | ||||
|             //caller: cRecMenuEditTimer | ||||
|             //save timer from current timer conflict | ||||
|             cTimer timerModified; | ||||
|             cTimer *timerModified; | ||||
|             const cTimer *originalTimer; | ||||
|             if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) { | ||||
|                 timerModified = menu->GetTimer(); | ||||
|                 originalTimer = menu->GetOriginalTimer(); | ||||
|             } else break; | ||||
|             recManager->SaveTimer(originalTimer, timerModified); | ||||
|             delete activeMenu; | ||||
|             if (!DisplayTimerConflict(originalTimer)) { | ||||
|                 activeMenu = new cRecMenuConfirmTimer(event); | ||||
|                 activeMenu->Display(); | ||||
|                 if (config.timerMessage) { | ||||
|                     delete activeMenu; | ||||
|                     activeMenu = new cRecMenuConfirmTimer(originalTimer->Event(), true); | ||||
|                     activeMenu->Display(); | ||||
|                 } else { | ||||
|                     Close(); | ||||
|                     state = osEnd; | ||||
|                 } | ||||
|             } | ||||
|             break; } | ||||
| /*************************************************************************************** | ||||
| @@ -639,7 +712,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|             } else break; | ||||
|             timerConflicts->SetCurrentConflict(timerConflict); | ||||
|             delete activeMenu; | ||||
|             activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict()); | ||||
|             activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict(), rmsTimerConflicts); | ||||
|             activeMenu->Display(); | ||||
|             break; } | ||||
|         case rmsSearchRerunsTimerConflictMenu: { | ||||
| @@ -651,12 +724,18 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|             if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) { | ||||
|                 timerConflict = menu->GetTimerConflictIndex(); | ||||
|             } else break; | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict); | ||||
|             const cTimers* timers; | ||||
| #if VDRVERSNUM >= 20301 | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict) + 1; | ||||
|             { | ||||
|             LOCK_TIMERS_READ; | ||||
|             const cTimer *timer = Timers->Get(timerID); | ||||
|             timers = Timers; | ||||
|             } | ||||
|             const cTimer *timer = timers->GetById(timerID); | ||||
| #else | ||||
|             cTimer *timer = Timers.Get(timerID); | ||||
|             int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict); | ||||
|             timers = &Timers; | ||||
|             const cTimer *timer = timers->Get(timerID); | ||||
| #endif | ||||
|             if (timer) { | ||||
|                 const cEvent *event = timer->Event(); | ||||
| @@ -698,12 +777,16 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|                 originalConflictIndex = menu->GetTimerConflictIndex(); | ||||
|             } else break; | ||||
|             int originalTimerID = timerConflicts->GetCurrentConflictTimerID(originalConflictIndex); | ||||
|             const cTimers* timers; | ||||
| #if VDRVERSNUM >= 20301 | ||||
|             { | ||||
|             LOCK_TIMERS_READ; | ||||
|             const cTimer *timerOriginal = Timers->Get(originalTimerID); | ||||
|             timers = Timers; | ||||
|             } | ||||
| #else | ||||
|             cTimer *timerOriginal = Timers.Get(originalTimerID); | ||||
|             timers = &Timers; | ||||
| #endif | ||||
|             const cTimer *timerOriginal = timers->Get(originalTimerID); | ||||
|             if (replace && timerOriginal) { | ||||
|                 recManager->DeleteTimer(timerOriginal->Event()); | ||||
|                 recManager->createTimer(replace); | ||||
| @@ -740,7 +823,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { | ||||
|             } | ||||
|             break;} | ||||
|         case rmsTimelineTimerSave: { | ||||
|             cTimer timerModified; | ||||
|             cTimer *timerModified; | ||||
|             const cTimer *originalTimer; | ||||
|             if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) { | ||||
|                 timerModified = menu->GetTimer(); | ||||
|   | ||||
							
								
								
									
										23
									
								
								setup.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								setup.c
									
									
									
									
									
								
							| @@ -80,7 +80,9 @@ void cTvguideSetup::Store(void) { | ||||
|     SetupStore("displayTime", config.displayTime); | ||||
|     SetupStore("displayHorizontalTime", config.displayHorizontalTime); | ||||
|     SetupStore("bigStepHours", config.bigStepHours); | ||||
|     SetupStore("bigStepHoursHorizontal", config.bigStepHoursHorizontal); | ||||
|     SetupStore("hugeStepHours", config.hugeStepHours); | ||||
|     SetupStore("hugeStepHoursHorizontal", config.hugeStepHoursHorizontal); | ||||
|     SetupStore("channelJumpMode", config.channelJumpMode); | ||||
|     SetupStore("blueKeyMode", config.blueKeyMode); | ||||
|     SetupStore("numkeyMode", config.numkeyMode); | ||||
| @@ -106,6 +108,8 @@ void cTvguideSetup::Store(void) { | ||||
|     SetupStore("footerHeightPercent", config.footerHeightPercent); | ||||
|     SetupStore("instRecFolderMode", config.instRecFolderMode); | ||||
|     SetupStore("instRecFixedFolder", config.instRecFixedFolder.c_str()); | ||||
|     SetupStore("addSubtitleToTimer", config.addSubtitleToTimer); | ||||
|     SetupStore("timerMessage", config.timerMessage); | ||||
|     SetupStore("favWhatsOnNow", config.favWhatsOnNow); | ||||
|     SetupStore("favWhatsOnNext", config.favWhatsOnNext); | ||||
|     SetupStore("favUseTime1", config.favUseTime1); | ||||
| @@ -224,8 +228,13 @@ void cMenuSetupGeneral::Set(void) { | ||||
|     Add(new cMenuEditBoolItem(tr("Close TVGuide after channel switch"), &tmpConfig->closeOnSwitch)); | ||||
|     Add(new cMenuEditStraItem(tr("Functionality of numeric Keys"), &tmpConfig->numkeyMode, 2,  numMode)); | ||||
|     Add(new cMenuEditBoolItem(tr("Hide last Channel Group"), &tmpConfig->hideLastGroup)); | ||||
|     Add(new cMenuEditIntItem(tr("Big Step (Keys 1 / 3) in hours"), &tmpConfig->bigStepHours, 1, 12)); | ||||
|     Add(new cMenuEditIntItem(tr("Huge Step (Keys 4 / 6) in hours"), &tmpConfig->hugeStepHours, 13, 48)); | ||||
|     if (tmpConfig->displayMode == eVertical) { | ||||
|         Add(new cMenuEditIntItem(tr("Big Step (Keys 1 / 3) in hours"), &tmpConfig->bigStepHours, 1, 12)); | ||||
|         Add(new cMenuEditIntItem(tr("Huge Step (Keys 4 / 6) in hours"), &tmpConfig->hugeStepHours, 13, 48)); | ||||
|     } else if (tmpConfig->displayMode == eHorizontal) { | ||||
|         Add(new cMenuEditIntItem(tr("Big Step (Keys 1 / 3) in hours"), &tmpConfig->bigStepHoursHorizontal, 1, 12)); | ||||
|         Add(new cMenuEditIntItem(tr("Huge Step (Keys 4 / 6) in hours"), &tmpConfig->hugeStepHoursHorizontal, 13, 48)); | ||||
|     } | ||||
|     Add(new cMenuEditStraItem(tr("Time Format (12h/24h)"), &tmpConfig->timeFormat, 2,  timeFormatItems)); | ||||
|     Add(new cMenuEditIntItem(tr("EPG Window Text Scrolling Speed"), &tmpConfig->detailedViewScrollStep, 1, 30)); | ||||
|     Add(new cMenuEditBoolItem(tr("Display Reruns in detailed EPG View"), &tmpConfig->displayRerunsDetailEPGView)); | ||||
| @@ -403,6 +412,9 @@ cMenuSetupFavorites::cMenuSetupFavorites(cTVGuideConfig* data)  : cMenuSetupSubM | ||||
|     recFolderMode[1] = tr("Select from folder list"); | ||||
|     recFolderMode[2] = tr("Use fixed folder"); | ||||
|     strn0cpy(fixedFolder, data->instRecFixedFolder.c_str(), sizeof(fixedFolder)); | ||||
|     addSubtitleMode[0] = tr("never"); | ||||
|     addSubtitleMode[1] = tr("smart"); | ||||
|     addSubtitleMode[2] = tr("always"); | ||||
|     switchModeItems[0] = (tr("switch")); | ||||
|     switchModeItems[1] = (tr("announce only")); | ||||
|     switchModeItems[2] = (tr("ask for switch")); | ||||
| @@ -413,13 +425,16 @@ void cMenuSetupFavorites::Set(void) { | ||||
|     int currentItem = Current(); | ||||
|     Clear(); | ||||
|  | ||||
|     Add(new cMenuEditStraItem(tr("Folder for instant Recordings"), &tmpConfig->instRecFolderMode, 3,  recFolderMode)); | ||||
|     Add(new cOsdItem(tr("Instant recording:"), osUnknown, false)); | ||||
|     Add(new cMenuEditStraItem(tr("Folder for instant Recordings"), &tmpConfig->instRecFolderMode, 3, recFolderMode)); | ||||
|     if (tmpConfig->instRecFolderMode == eFolderFixed) { | ||||
|         Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Folder")), fixedFolder, sizeof(fixedFolder), trVDR(FileNameChars))); | ||||
|     } | ||||
|     Add(new cMenuEditStraItem(tr("Add episode to manual timers"), &tmpConfig->addSubtitleToTimer, 3, addSubtitleMode)); | ||||
|     if (pRemoteTimers) | ||||
|         Add(new cMenuEditBoolItem(tr("Use Remotetimers"), &tmpConfig->useRemoteTimers)); | ||||
|  | ||||
|     Add(new cMenuEditBoolItem(tr("Show timer confirmation messages"), &tmpConfig->timerMessage)); | ||||
|     Add(new cOsdItem(tr("Favorites:"), osUnknown, false)); | ||||
|     Add(new cMenuEditBoolItem(tr("Limit channels in favorites"), &tmpConfig->favLimitChannels)); | ||||
|     if (tmpConfig->favLimitChannels) { | ||||
|         Add(new cMenuEditChanItem(tr("Start Channel"), &tmpConfig->favStartChannel)); | ||||
|   | ||||
							
								
								
									
										1
									
								
								setup.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								setup.h
									
									
									
									
									
								
							| @@ -70,6 +70,7 @@ class cMenuSetupFavorites : public cMenuSetupSubMenu { | ||||
|         char description3[256]; | ||||
|         char description4[256]; | ||||
|         const char * recFolderMode[3]; | ||||
|         const char * addSubtitleMode[3]; | ||||
|         const char * switchModeItems[3]; | ||||
|         char fixedFolder[256]; | ||||
|         void Set(void); | ||||
|   | ||||
| @@ -1,14 +1,14 @@ | ||||
| Description = IceBlue | ||||
| clrStyle = 00000000 | ||||
| clrBackground = DDFFFFFF | ||||
| clrBackgroundOSD = FFFFFFFF | ||||
| clrGrid1 = BB555555 | ||||
| clrGrid2 = BB888888 | ||||
| clrBackground = EEFFFFFF | ||||
| clrBackgroundOSD = F0FFFFFF | ||||
| clrGrid1 = FFB2B2C | ||||
| clrGrid2 = 55B2B2C7 | ||||
| clrGridFontBack = 00000000 | ||||
| clrGridActiveFontBack = 00000000 | ||||
| clrGridActiveFontBack = FFFFFFFF | ||||
| clrHighlight = FF000044 | ||||
| clrFont = FF000000 | ||||
| clrFontActive  = FFFFFFFF | ||||
| clrFontActive = FFFFFFFF | ||||
| clrFontButtons = FFFFFFFF | ||||
| clrFontHeader = FF000000 | ||||
| clrHeader = FFFFFFFF | ||||
| @@ -20,14 +20,14 @@ clrTimeline1Blending = 00000000 | ||||
| clrTimeline2 = FF000000 | ||||
| clrTimeline2Blending = 00000000 | ||||
| clrTimeBase = A0FF0000 | ||||
| clrTabInactive = 88B8B8E6 | ||||
| clrButtonRed = FFBB0000 | ||||
| clrTabInactive = 55B2B2C7 | ||||
| clrButtonRed = FFCC00000 | ||||
| clrButtonRedBorder = FF000000 | ||||
| clrButtonGreen = FF00BB00 | ||||
| clrButtonGreenBorder = FF000000 | ||||
| clrButtonYellow = FFBBBB00 | ||||
| clrButtonYellow = FFF5B800 | ||||
| clrButtonYellowBorder = FF000000 | ||||
| clrButtonBlue = FF0000BB | ||||
| clrButtonBlue = FF003DF5 | ||||
| clrButtonBlueBorder = FF000000 | ||||
| clrRecMenuBackground = AA000000 | ||||
| clrRecMenuTimerConflictBackground = FFCCCCCC | ||||
| @@ -36,16 +36,16 @@ clrRecMenuTimerConflictOverlap = AAFF0000 | ||||
| clrRecMenuDayActive = FF00FF00 | ||||
| clrRecMenuDayInactive = FFFF0000 | ||||
| clrRecMenuDayHighlight = 77000000 | ||||
| clrRecMenuTextBack = FF3C3C3C | ||||
| clrRecMenuTextBack = 00000000 | ||||
| clrRecMenuTextActiveBack = FF404749 | ||||
| clrRecMenuKeyboardBack = FF000044 | ||||
| clrRecMenuKeyboardBorder = FF3C3C3C | ||||
| clrRecMenuKeyboardBorder = FF6C6C6C | ||||
| clrRecMenuKeyboardHigh = 55FFFFFF | ||||
| clrButtonRedKeyboard = FFBB0000 | ||||
| clrButtonGreenKeyboard = FF00BB00 | ||||
| clrButtonYellowKeyboard = FFBBBB00 | ||||
| clrRecMenuTimelineTimer = B012273f | ||||
| clrRecMenuTimelineBack = FF828282 | ||||
| clrRecMenuTimelineActive = FF3F3F3F | ||||
| clrRecMenuTimelineBack = 55B2B2C7 | ||||
| clrRecMenuTimelineActive = 773F3F3F | ||||
| clrRecMenuTimelineConflict = 30FF0000 | ||||
| clrRecMenuTimelineConflictOverlap = 90FF0000 | ||||
| clrRecMenuTimelineConflictOverlap = 90FF0000 | ||||
|   | ||||
							
								
								
									
										129
									
								
								timeline.c
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								timeline.c
									
									
									
									
									
								
							| @@ -5,33 +5,28 @@ cTimeLine::cTimeLine(cTimeManager *timeManager) { | ||||
|     this->timeManager = timeManager; | ||||
|     lastClock = ""; | ||||
|     timeBase = NULL; | ||||
|     int x11, x21, y11, y21, x12, x22, y12, y22; | ||||
|     if (config.displayMode == eVertical) { | ||||
|         dateViewer = new cStyledPixmap(osdManager.requestPixmap(1, cRect(0,  | ||||
|                                                                          geoManager.statusHeaderHeight + geoManager.clockHeight,  | ||||
|                                                                          geoManager.dateVieverWidth,  | ||||
|                                                                          geoManager.dateVieverHeight))); | ||||
|         timeline = osdManager.requestPixmap(2, cRect(0,  | ||||
|                                                      geoManager.statusHeaderHeight + geoManager.channelHeaderHeight + geoManager.channelGroupsHeight,  | ||||
|                                                      geoManager.timeLineWidth,  | ||||
|                                                      geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight) | ||||
|                                              , cRect(0, | ||||
|                                                      0,  | ||||
|                                                      geoManager.timeLineWidth,  | ||||
|                                                      1440 * geoManager.minutePixel)); | ||||
|         x11 = 0; | ||||
|         x21 = geoManager.dateVieverWidth; | ||||
|         y11 = geoManager.statusHeaderHeight + geoManager.clockHeight; | ||||
|         y21 = geoManager.dateVieverHeight; | ||||
|         x12 = 0; | ||||
|         x22 = geoManager.timeLineWidth; | ||||
|         y12 = geoManager.statusHeaderHeight + geoManager.channelHeaderHeight + geoManager.channelGroupsHeight; | ||||
|         y22 = geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight; | ||||
|     } else if (config.displayMode == eHorizontal) { | ||||
|         dateViewer = new cStyledPixmap(osdManager.requestPixmap(1, cRect(geoManager.clockWidth,  | ||||
|                                                                          geoManager.statusHeaderHeight,  | ||||
|                                                                          geoManager.dateVieverWidth, | ||||
|                                                                          geoManager.dateVieverHeight))); | ||||
|         timeline = osdManager.requestPixmap(2, cRect(geoManager.channelHeaderWidth + geoManager.channelGroupsWidth,  | ||||
|                                                      geoManager.statusHeaderHeight,  | ||||
|                                                      geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth, | ||||
|                                                      geoManager.timeLineHeight) | ||||
|                                              , cRect(0, | ||||
|                                                      0,  | ||||
|                                                      1440 * geoManager.minutePixel,  | ||||
|                                                      geoManager.timeLineHeight)); | ||||
|         x11 = geoManager.clockWidth; | ||||
|         x21 = geoManager.dateVieverWidth; | ||||
|         y11 = geoManager.statusHeaderHeight; | ||||
|         y21 = geoManager.dateVieverHeight; | ||||
|         x12 = geoManager.channelHeaderWidth + geoManager.channelGroupsWidth; | ||||
|         x22 = geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth; | ||||
|         y12 = geoManager.statusHeaderHeight; | ||||
|         y22 = geoManager.timeLineHeight; | ||||
|     } | ||||
|     dateViewer = new cStyledPixmap(osdManager.requestPixmap(1, cRect(x11, y11, x21, y21))); | ||||
|     timeline = osdManager.requestPixmap(2, cRect(x12, y12, x22, y22)); | ||||
|     clock = new cStyledPixmap(osdManager.requestPixmap(3, cRect(0,  | ||||
|                                                                 geoManager.statusHeaderHeight,  | ||||
|                                                                 geoManager.clockWidth,  | ||||
| @@ -43,10 +38,11 @@ cTimeLine::~cTimeLine(void) { | ||||
|        delete clock; | ||||
|     osdManager.releasePixmap(timeBase); | ||||
|     osdManager.releasePixmap(timeline); | ||||
|     delete dateViewer; | ||||
|     if (dateViewer) | ||||
|         delete dateViewer; | ||||
| } | ||||
|  | ||||
| void cTimeLine::drawDateViewer() { | ||||
| void cTimeLine::DrawDateViewer(void) { | ||||
|     cString weekDay = timeManager->GetWeekday(); | ||||
|     cString date = timeManager->GetDate();    | ||||
|     if (config.style != eStyleGraphical) { | ||||
| @@ -80,8 +76,8 @@ void cTimeLine::drawDateViewer() { | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cTimeLine::drawTimeline() { | ||||
|     timeline->SetTile(true); | ||||
| void cTimeLine::DrawTimeline(void) { | ||||
| //    timeline->SetTile(true); | ||||
|     timeline->Fill(clrTransparent); | ||||
|     tColor colorFont, colorBackground; | ||||
|      | ||||
| @@ -93,8 +89,8 @@ void cTimeLine::drawTimeline() { | ||||
|         img1 = imgCache.GetOsdElement(oeTimeline1); | ||||
|         img2 = imgCache.GetOsdElement(oeTimeline2); | ||||
|     } else { | ||||
|         img1 = createBackgroundImage(imgWidth, imgHeight, theme.Color(clrTimeline1), theme.Color(clrTimeline1Blending)); | ||||
|         img2 = createBackgroundImage(imgWidth, imgHeight, theme.Color(clrTimeline2), theme.Color(clrTimeline2Blending)); | ||||
|         img1 = CreateBackgroundImage(imgWidth, imgHeight, theme.Color(clrTimeline1), theme.Color(clrTimeline1Blending)); | ||||
|         img2 = CreateBackgroundImage(imgWidth, imgHeight, theme.Color(clrTimeline2), theme.Color(clrTimeline2Blending)); | ||||
|     } | ||||
|     const cImage *img = NULL; | ||||
|     if (!img1 || !img2) | ||||
| @@ -102,8 +98,19 @@ void cTimeLine::drawTimeline() { | ||||
|     int textWidth, posX, posY; | ||||
|     char timetext[10]; | ||||
|      | ||||
|     for (int i=0; i<48; i++) { | ||||
|         if (i%2==0) { | ||||
|     int halfHours; | ||||
|     if (config.displayMode == eVertical) | ||||
|         halfHours = config.displayTime / 30 + 1; | ||||
|     else | ||||
|         halfHours = config.displayHorizontalTime / 30 + 1; | ||||
|  | ||||
|     time_t tStart = timeManager->GetStart(); | ||||
|     tm *t = localtime ( &tStart ); | ||||
|  | ||||
|     int x = 2 * t->tm_hour + ((t->tm_min == 0) ? 0 : 1); | ||||
|     for (int j = x; j < (x + halfHours); j++) { | ||||
|         int i = (j >= 48) ? (j - 48) : j; | ||||
|         if (i % 2 == 0) { | ||||
|             img = img1; | ||||
|             colorFont = theme.Color(clrTimeline2); | ||||
|             colorBackground = (config.style == eStyleFlat)?theme.Color(clrTimeline1):clrTransparent; | ||||
| @@ -111,11 +118,11 @@ void cTimeLine::drawTimeline() { | ||||
|                 if (i == 0) | ||||
|                     sprintf(timetext, "12:00 PM"); | ||||
|                 else if (i/2 < 13) | ||||
|                     sprintf(timetext, "%d:00 AM", i/2); | ||||
|                     sprintf(timetext, "%d:00 AM", i / 2); | ||||
|                 else  | ||||
|                     sprintf(timetext, "%d:00 PM", i/2-12); | ||||
|                     sprintf(timetext, "%d:00 PM", i / 2 - 12); | ||||
|             } else { | ||||
|                 sprintf(timetext, "%d:00", i/2); | ||||
|                 sprintf(timetext, "%d:00", i / 2); | ||||
|             } | ||||
|         } else { | ||||
|             img = img2; | ||||
| @@ -125,38 +132,38 @@ void cTimeLine::drawTimeline() { | ||||
|                 if (i == 1) | ||||
|                     sprintf(timetext, "12:30 PM"); | ||||
|                 else if (i/2 < 13) | ||||
|                     sprintf(timetext, "%d:30 AM", i/2); | ||||
|                     sprintf(timetext, "%d:30 AM", i / 2); | ||||
|                 else  | ||||
|                     sprintf(timetext, "%d:30 PM", i/2-12); | ||||
|                     sprintf(timetext, "%d:30 PM", i / 2 - 12); | ||||
|             } else { | ||||
|                 sprintf(timetext, "%d:30", i/2); | ||||
|                 sprintf(timetext, "%d:30", i / 2); | ||||
|             } | ||||
|         } | ||||
|         if (config.displayMode == eVertical) { | ||||
|             posY = i*geoManager.minutePixel*30; | ||||
|             posY = (j - x) * geoManager.minutePixel * 30; | ||||
|             timeline->DrawImage(cPoint(0, posY), *img); | ||||
|             if (config.style != eStyleGraphical) { | ||||
|                 decorateTile(0, posY, imgWidth+2, imgHeight); | ||||
|                 DecorateTile(0, posY, imgWidth + 2, imgHeight); | ||||
|             } | ||||
|             textWidth = fontManager.FontTimeLineTime->Width(timetext); | ||||
|             timeline->DrawText(cPoint((geoManager.timeLineWidth-textWidth)/2, posY + 5), timetext, colorFont, colorBackground, fontManager.FontTimeLineTime); | ||||
|             timeline->DrawText(cPoint((geoManager.timeLineWidth-textWidth) / 2, posY + 5), timetext, colorFont, colorBackground, fontManager.FontTimeLineTime); | ||||
|         } else if (config.displayMode == eHorizontal) { | ||||
|             posX = i*geoManager.minutePixel*30; | ||||
|             posX = (j - x) * geoManager.minutePixel * 30; | ||||
|             timeline->DrawImage(cPoint(posX, 0), *img); | ||||
|             if (config.style != eStyleGraphical) { | ||||
|                 decorateTile(posX, 0, imgWidth, imgHeight+2); | ||||
|                 DecorateTile(posX, 0, imgWidth, imgHeight + 2); | ||||
|             } | ||||
|             timeline->DrawText(cPoint(posX + 15, (dateViewer->Height() - fontManager.FontTimeLineTimeHorizontal->Height())/2), timetext, colorFont, colorBackground, fontManager.FontTimeLineTimeHorizontal); | ||||
|             timeline->DrawText(cPoint(posX + 15, (dateViewer->Height() - fontManager.FontTimeLineTimeHorizontal->Height()) / 2), timetext, colorFont, colorBackground, fontManager.FontTimeLineTimeHorizontal); | ||||
|        } | ||||
|     } | ||||
|     setTimeline(); | ||||
|     DrawTimeIndicator(); | ||||
|     if (config.style != eStyleGraphical) { | ||||
|         delete img1; | ||||
|         delete img2; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cTimeLine::decorateTile(int posX, int posY, int tileWidth, int tileHeight) { | ||||
| void cTimeLine::DecorateTile(int posX, int posY, int tileWidth, int tileHeight) { | ||||
|     timeline->DrawRectangle(cRect(posX,posY,tileWidth,2), clrTransparent);          //top | ||||
|     timeline->DrawRectangle(cRect(posX,posY,2,tileHeight), clrTransparent);         //left | ||||
|     timeline->DrawRectangle(cRect(posX,posY + tileHeight-2,tileWidth,2), clrTransparent);   //bottom | ||||
| @@ -169,11 +176,11 @@ void cTimeLine::decorateTile(int posX, int posY, int tileWidth, int tileHeight) | ||||
|      | ||||
|     if (config.roundedCorners) { | ||||
|         int borderRadius = 12; | ||||
|         drawRoundedCorners(posX, posY, tileWidth, tileHeight, borderRadius); | ||||
|         DrawRoundedCorners(posX, posY, tileWidth, tileHeight, borderRadius); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cTimeLine::drawRoundedCorners(int posX, int posY, int width, int height, int radius) { | ||||
| void cTimeLine::DrawRoundedCorners(int posX, int posY, int width, int height, int radius) { | ||||
|     timeline->DrawEllipse(cRect(posX+2,posY+2,radius,radius), theme.Color(clrBorder), -2); | ||||
|     timeline->DrawEllipse(cRect(posX+1,posY+1,radius,radius), clrTransparent, -2); | ||||
|  | ||||
| @@ -189,14 +196,16 @@ void cTimeLine::drawRoundedCorners(int posX, int posY, int width, int height, in | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cTimeLine::drawCurrentTimeBase(void) { | ||||
| void cTimeLine::DrawTimeIndicator(void) { | ||||
|     if (!config.displayTimeBase) | ||||
|         return; | ||||
|     if (!timeManager->NowVisible()) { | ||||
|        if (timeBase) | ||||
|           timeBase->Fill(clrTransparent); | ||||
|        return; | ||||
|     } | ||||
|     int deltaTime = (time(0) - timeManager->GetStart()) / 60 * geoManager.minutePixel; | ||||
|     osdManager.releasePixmap(timeBase); | ||||
|     int deltaTime = (timeManager->GetNow() - timeManager->GetStart()) / 60 * geoManager.minutePixel; | ||||
|     int x1, x2, y1, y2; | ||||
|     if (config.displayMode == eVertical) { | ||||
|        x1 = 0; | ||||
| @@ -214,7 +223,7 @@ void cTimeLine::drawCurrentTimeBase(void) { | ||||
|     timeBase->DrawRectangle(cRect(0, 0, timeBase->ViewPort().Width(), timeBase->ViewPort().Height()), theme.Color(clrTimeBase)); | ||||
| } | ||||
|  | ||||
| cImage *cTimeLine::createBackgroundImage(int width, int height, tColor clrBgr, tColor clrBlend) { | ||||
| cImage *cTimeLine::CreateBackgroundImage(int width, int height, tColor clrBgr, tColor clrBlend) { | ||||
|     cImage *image = NULL; | ||||
|     if (config.style == eStyleBlendingDefault) { | ||||
|         image = new cImage(cSize(width, height)); | ||||
| @@ -243,22 +252,7 @@ cImage *cTimeLine::createBackgroundImage(int width, int height, tColor clrBgr, t | ||||
|     return image; | ||||
| } | ||||
|  | ||||
| void cTimeLine::setTimeline() { | ||||
|     int offset = timeManager->GetTimelineOffset(); | ||||
|     int xNew, yNew; | ||||
|     if (config.displayMode == eVertical) { | ||||
|         xNew = 0; | ||||
|         yNew = -offset*geoManager.minutePixel; | ||||
|     } else if (config.displayMode == eHorizontal) { | ||||
|         xNew = -offset*geoManager.minutePixel; | ||||
|         yNew = 0; | ||||
|     } | ||||
|     timeline->SetDrawPortPoint(cPoint(xNew, yNew)); | ||||
|     if (config.displayTimeBase) | ||||
|         drawCurrentTimeBase(); | ||||
| } | ||||
|  | ||||
| bool cTimeLine::drawClock() { | ||||
| bool cTimeLine::DrawClock(void) { | ||||
|     cString currentTime = timeManager->GetCurrentTime(); | ||||
|     if (strcmp(currentTime, lastClock)) { | ||||
|        clock->Fill(clrTransparent); | ||||
| @@ -275,6 +269,7 @@ bool cTimeLine::drawClock() { | ||||
|        } | ||||
|        clock->DrawText(cPoint((geoManager.clockWidth - clockTextWidth) / 2, (geoManager.clockHeight - textHeight) / 2), *currentTime, theme.Color(clrFont), colorFontBack, font); | ||||
|        lastClock = currentTime; | ||||
|        DrawTimeIndicator(); | ||||
|        return true; | ||||
|     } | ||||
|     return false; | ||||
|   | ||||
							
								
								
									
										15
									
								
								timeline.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								timeline.h
									
									
									
									
									
								
							| @@ -14,17 +14,16 @@ private: | ||||
|     cStyledPixmap *clock; | ||||
|     cPixmap *timeBase; | ||||
|     cString lastClock; | ||||
|     void decorateTile(int posX, int posY, int tileWidth, int tileHeight); | ||||
|     void drawRoundedCorners(int posX, int posY, int width, int height, int radius); | ||||
|     cImage *createBackgroundImage(int width, int height, tColor clrBgr, tColor clrBlend); | ||||
|     void DecorateTile(int posX, int posY, int tileWidth, int tileHeight); | ||||
|     void DrawRoundedCorners(int posX, int posY, int width, int height, int radius); | ||||
|     cImage *CreateBackgroundImage(int width, int height, tColor clrBgr, tColor clrBlend); | ||||
| public: | ||||
|     cTimeLine(cTimeManager *timeManager); | ||||
|     virtual ~cTimeLine(void); | ||||
|     void setTimeline(void); | ||||
|     void drawDateViewer(void); | ||||
|     void drawTimeline(void); | ||||
|     void drawCurrentTimeBase(void); | ||||
|     bool drawClock(); | ||||
|     void DrawDateViewer(void); | ||||
|     void DrawTimeline(void); | ||||
|     void DrawTimeIndicator(void); | ||||
|     bool DrawClock(void); | ||||
| }; | ||||
|  | ||||
| #endif //__TVGUIDE_TIMELINE_H | ||||
|   | ||||
| @@ -3,6 +3,14 @@ | ||||
| #include "config.h" | ||||
| #include "timemanager.h" | ||||
|  | ||||
| cTimeManager::cTimeManager(void) { | ||||
|     if (config.displayMode == eVertical) { | ||||
|         displaySeconds = (geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight) / geoManager.minutePixel * 60; | ||||
|     } else if (config.displayMode == eHorizontal) { | ||||
|         displaySeconds = (geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth) / geoManager.minutePixel * 60; | ||||
|     } | ||||
| } | ||||
|  | ||||
| cTimeManager::~cTimeManager(void) { | ||||
| } | ||||
|  | ||||
| @@ -18,40 +26,32 @@ void cTimeManager::Now() { | ||||
|     t = time(0); | ||||
|     tStart = t; | ||||
|     tStart = GetRounded(); | ||||
|     if (config.displayMode == eVertical) { | ||||
|         tEnd = tStart + (geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight)/geoManager.minutePixel*60; | ||||
|     } else if (config.displayMode == eHorizontal) { | ||||
|         tEnd = tStart + (geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth)/geoManager.minutePixel*60; | ||||
|     } | ||||
|     tEnd   = tStart + displaySeconds; | ||||
| } | ||||
|  | ||||
| void cTimeManager::AddStep(int step) { | ||||
|     tStart += step*60; | ||||
|     tEnd  += step*60; | ||||
|     tStart += step * 60; | ||||
|     tEnd    = tStart + displaySeconds; | ||||
| } | ||||
|  | ||||
| bool cTimeManager::DelStep(int step) { | ||||
|     if ((tStart - step*60)+30*60 < t) { | ||||
|         return true; | ||||
| void cTimeManager::DelStep(int step) { | ||||
|     if ((tStart - step * 60) + 30 * 60 < t) { | ||||
|         Now(); | ||||
|     } else { | ||||
|         tStart -= step * 60; | ||||
|         tEnd    = tStart + displaySeconds; | ||||
|     } | ||||
|     tStart -= step*60; | ||||
|     tEnd -= step*60; | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void cTimeManager::SetTime(time_t newTime) { | ||||
|     tStart = newTime; | ||||
|     if (config.displayMode == eVertical) { | ||||
|         tEnd = tStart + (geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight)/geoManager.minutePixel*60; | ||||
|     } else if (config.displayMode == eHorizontal) { | ||||
|         tEnd = tStart + (geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth)/geoManager.minutePixel*60; | ||||
|     } | ||||
|     tEnd   = tStart + displaySeconds; | ||||
| } | ||||
|  | ||||
| time_t cTimeManager::getPrevPrimetime(time_t current) { | ||||
|     tm *st = localtime(¤t); | ||||
|     if (st->tm_hour < 21) { | ||||
|         current -= 24 * 60* 60; | ||||
|         current -= 24 * 60 * 60; | ||||
|         st = localtime(¤t); | ||||
|     } | ||||
|     st->tm_hour = 20; | ||||
| @@ -63,7 +63,7 @@ time_t cTimeManager::getPrevPrimetime(time_t current) { | ||||
| time_t cTimeManager::getNextPrimetime(time_t current){ | ||||
|     tm *st = localtime(¤t); | ||||
|     if (st->tm_hour > 19) { | ||||
|         current += 24 * 60* 60; | ||||
|         current += 24 * 60 * 60; | ||||
|         st = localtime(¤t); | ||||
|     } | ||||
|     st->tm_hour = 20; | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| #define __TVGUIDE_TIMEMANAGER_H | ||||
|  | ||||
| #include <vdr/tools.h> | ||||
| #include "config.h" | ||||
|  | ||||
| // --- cTimeManager -------------------------------------------------------------  | ||||
|  | ||||
| @@ -10,14 +11,16 @@ class cTimeManager { | ||||
|         time_t t; | ||||
|         time_t tStart; | ||||
|         time_t tEnd; | ||||
|         int displaySeconds; | ||||
|         eTimeFormat timeFormat; | ||||
|     public: | ||||
|         cTimeManager(){}; | ||||
|         cTimeManager(); | ||||
|         virtual ~cTimeManager(void); | ||||
|         static cString printTime(time_t displayTime); | ||||
|         void Now(); | ||||
|         time_t GetNow() { return t; }; | ||||
|         void AddStep(int step); | ||||
|         bool DelStep(int step); | ||||
|         void DelStep(int step); | ||||
|         void SetTime(time_t newTime); | ||||
|         time_t Get() {return t;}; | ||||
|         time_t GetStart() {return tStart;}; | ||||
| @@ -31,6 +34,7 @@ class cTimeManager { | ||||
|         int GetTimelineOffset(); | ||||
|         time_t GetRounded(); | ||||
|         bool NowVisible(void); | ||||
|         int GetDisplaySeconds(void) { return displaySeconds; }; | ||||
|         void debug(); | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -16,12 +16,11 @@ cTVGuideTimerConflict::cTVGuideTimerConflict(void) { | ||||
| } | ||||
|  | ||||
| cTVGuideTimerConflict::~cTVGuideTimerConflict(void) { | ||||
|  | ||||
| } | ||||
|  | ||||
| bool cTVGuideTimerConflict::timerInvolved(int involvedID) { | ||||
|     int numConflicts = timerIDs.size(); | ||||
|     for (int i=0; i<numConflicts; i++) { | ||||
|     for (int i = 0; i < numConflicts; i++) { | ||||
|         if (timerIDs[i] == involvedID) | ||||
|             return true; | ||||
|     } | ||||
| @@ -44,13 +43,12 @@ cTVGuideTimerConflicts::~cTVGuideTimerConflicts(void) { | ||||
| } | ||||
|  | ||||
| void cTVGuideTimerConflicts::AddConflict(std::string epgSearchConflictLine) { | ||||
| 	/* TIMERCONFLICT FORMAT: | ||||
|     /* TIMERCONFLICT FORMAT: | ||||
|     The result list looks like this for example when we have 2 timer conflicts at one time: | ||||
|     1190232780:152|30|50#152#45:45|10|50#152#45 | ||||
|     '1190232780' is the time of the conflict in seconds since 1970-01-01.  | ||||
|     It's followed by list of timers that have a conflict at this time: | ||||
|     '152|30|50#1    int editTimer(cTimer *timer, bool active, int prio, int start, int stop); | ||||
|     52#45' is the description of the first conflicting timer. Here: | ||||
|     '152|30|50#152#45' is the description of the first conflicting timer. Here: | ||||
|     '152' is VDR's timer id of this timer as returned from VDR's LSTT command | ||||
|     '30' is the percentage of recording that would be done (0...100) | ||||
|     '50#152#45' is the list of concurrent timers at this conflict | ||||
| @@ -86,11 +84,13 @@ void cTVGuideTimerConflicts::CalculateConflicts(void) { | ||||
| #if VDRVERSNUM >= 20301 | ||||
|         LOCK_TIMERS_READ; | ||||
|         const cTimers* timers = Timers; | ||||
|         for (int j=0; j < numTimers; j++) { | ||||
|             const cTimer *timer = timers->GetById(conflicts[i]->timerIDs[j] + 1); | ||||
| #else | ||||
|         const cTimers* timers = &Timers; | ||||
| #endif | ||||
|         for (int j=0; j < numTimers; j++) { | ||||
|             const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]); | ||||
| #endif | ||||
|             if (timer) { | ||||
|                 if (!unionSet) { | ||||
|                     unionSet = new cTimeInterval(timer->StartTime(), timer->StopTime()); | ||||
| @@ -109,7 +109,11 @@ void cTVGuideTimerConflicts::CalculateConflicts(void) { | ||||
|          | ||||
|         cTimeInterval *intersect = NULL; | ||||
|         for (int j=0; j < numTimers; j++) { | ||||
| #if VDRVERSNUM >= 20301 | ||||
|             const cTimer *timer = timers->GetById(conflicts[i]->timerIDs[j] + 1); | ||||
| #else | ||||
|             const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]); | ||||
| #endif | ||||
|             if (timer) { | ||||
|                 if (!intersect) { | ||||
|                     intersect = new cTimeInterval(timer->StartTime(), timer->StopTime()); | ||||
| @@ -152,7 +156,7 @@ int cTVGuideTimerConflicts::GetCurrentConflictTimerID(int timerIndex) { | ||||
| int cTVGuideTimerConflicts::GetCorrespondingConflict(int timerID) { | ||||
|     int conflictIndex = -1; | ||||
|     if (numConflicts > 0) { | ||||
|         for (int i=0; i<numConflicts; i++) { | ||||
|         for (int i = 0; i < numConflicts; i++) { | ||||
|             if (conflicts[i]->timerInvolved(timerID)) { | ||||
|                 conflictIndex = i; | ||||
|                 break; | ||||
| @@ -172,7 +176,7 @@ cTVGuideTimerConflict *cTVGuideTimerConflicts::GetConflict(int conflictIndex) { | ||||
|  | ||||
| std::vector<cTVGuideTimerConflict*> cTVGuideTimerConflicts::GetConflictsBetween(time_t start, time_t stop) { | ||||
|     std::vector<cTVGuideTimerConflict*> conflictsFound; | ||||
|     for (int i=0; i < numConflicts; i++) { | ||||
|     for (int i = 0; i < numConflicts; i++) { | ||||
|         if ((conflicts[i]->timeStart > start) && (conflicts[i]->timeStart < stop)|| | ||||
|             (conflicts[i]->timeStop  > start) && (conflicts[i]->timeStop < stop)) | ||||
|             conflictsFound.push_back(conflicts[i]); | ||||
|   | ||||
							
								
								
									
										69
									
								
								tools.c
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								tools.c
									
									
									
									
									
								
							| @@ -10,7 +10,6 @@ | ||||
| #include <vdr/plugin.h> | ||||
| #include <vdr/skins.h> | ||||
| #include "services/epgsearch.h" | ||||
|  | ||||
| #include "tools.h" | ||||
|  | ||||
| cPlugin *GetScraperPlugin(void) { | ||||
| @@ -23,32 +22,49 @@ cPlugin *GetScraperPlugin(void) { | ||||
| /**************************************************************************************** | ||||
| *            CUTTEXT | ||||
| ****************************************************************************************/ | ||||
| std::string CutText(std::string text, int width, const cFont *font) { | ||||
|     if (width <= font->Size()) | ||||
|         return text.c_str(); | ||||
|     if (font->Width(text.c_str()) < width) | ||||
|         return text.c_str(); | ||||
|     cTextWrapper twText; | ||||
|     twText.Set(text.c_str(), font, width); | ||||
|     std::string cuttedTextNative = twText.GetLine(0); | ||||
|     std::stringstream sstrText; | ||||
|     sstrText << cuttedTextNative << "..."; | ||||
|     std::string cuttedText = sstrText.str(); | ||||
|     int actWidth = font->Width(cuttedText.c_str()); | ||||
|     if (actWidth > width) { | ||||
|         int overlap = actWidth - width; | ||||
|         int charWidth = font->Width("."); | ||||
|         if (charWidth == 0) | ||||
|             charWidth = 1; | ||||
|         int cutChars = overlap / charWidth; | ||||
|         if (cutChars > 0) { | ||||
|             cuttedTextNative = cuttedTextNative.substr(0, cuttedTextNative.length() - cutChars); | ||||
|             std::stringstream sstrText2; | ||||
|             sstrText2 << cuttedTextNative << "..."; | ||||
|             cuttedText = sstrText2.str(); | ||||
|         } | ||||
| std::string utf8_substr(const std::string& str, unsigned int start, long unsigned int leng) { | ||||
|     if (leng==0) { return ""; } | ||||
|     unsigned int c, i, ix, q; | ||||
|     long unsigned int min=std::string::npos, max=std::string::npos; | ||||
|     for (q=0, i=0, ix=str.length(); i < ix; i++, q++) { | ||||
|         if (q==start){ min=i; } | ||||
|         if (q<=start+leng || leng==std::string::npos){ max=i; } | ||||
|  | ||||
|         c = (unsigned char) str[i]; | ||||
|         if      (c>=0   && c<=127) i+=0; | ||||
|         else if ((c & 0xE0) == 0xC0) i+=1; | ||||
|         else if ((c & 0xF0) == 0xE0) i+=2; | ||||
|         else if ((c & 0xF8) == 0xF0) i+=3; | ||||
|         //else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8 | ||||
|         //else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8 | ||||
|         else return "";//invalid utf8 | ||||
|     } | ||||
|     if (q<=start+leng || leng==std::string::npos){ max=i; } | ||||
|     if (min==std::string::npos || max==std::string::npos) { return ""; } | ||||
|     return str.substr(min,max-min); | ||||
| } | ||||
|  | ||||
| std::string CutText(std::string text, int width, const cFont *font) { | ||||
|     int actWidth = font->Width(text.c_str()); | ||||
|     if (actWidth <= width) { | ||||
|         return text.c_str(); | ||||
|     } else { | ||||
|         int i = std::max(width / font->Size(), 1) - 1; | ||||
|         std::string cuttext, oldtext; | ||||
|         cuttext = utf8_substr(text, 0, i); | ||||
|         do { | ||||
|             oldtext = cuttext; | ||||
|             i++; | ||||
|             cuttext = utf8_substr(text, 0, i); | ||||
|             std::stringstream sstrText; | ||||
|             sstrText << cuttext << "..."; | ||||
|             actWidth = font->Width(sstrText.str().c_str()); | ||||
|         } | ||||
|         while (actWidth < width); | ||||
|         std::stringstream sstrText2; | ||||
|         sstrText2 << oldtext << "..."; | ||||
|         return sstrText2.str(); | ||||
|     } | ||||
|     return cuttedText; | ||||
| } | ||||
|  | ||||
| /**************************************************************************************** | ||||
| @@ -113,7 +129,6 @@ void ReadRecordingDirectories(std::vector<std::string> *folders, cList<cNestedIt | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| /**************************************************************************************** | ||||
| *            DrawRoundedCorners | ||||
| ****************************************************************************************/ | ||||
|   | ||||
							
								
								
									
										1
									
								
								tools.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tools.h
									
									
									
									
									
								
							| @@ -9,6 +9,7 @@ | ||||
|  | ||||
| cPlugin *GetScraperPlugin(void); | ||||
|  | ||||
| std::string utf8_substr(const std::string& str, unsigned int start=0, long unsigned int leng=std::string::npos); | ||||
| std::string CutText(std::string text, int width, const cFont *font); | ||||
| std::string StrToLowerCase(std::string str); | ||||
| std::string GetDirectoryFromTimer(std::string file); | ||||
|   | ||||
| @@ -27,7 +27,7 @@ | ||||
| #error "VDR-2.0.0 API version or greater is required!" | ||||
| #endif | ||||
|  | ||||
| static const char *VERSION        = "1.2.15"; | ||||
| static const char *VERSION        = "1.3.5"; | ||||
| static const char *DESCRIPTION    = tr("A fancy 2d EPG Viewer"); | ||||
| static const char *MAINMENUENTRY  = "Tvguide"; | ||||
|  | ||||
|   | ||||
							
								
								
									
										71
									
								
								tvguideosd.c
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								tvguideosd.c
									
									
									
									
									
								
							| @@ -112,9 +112,9 @@ void cTvGuideOsd::drawOsd() { | ||||
|         statusHeader->ScaleVideo(); | ||||
|     } | ||||
|     timeLine = new cTimeLine(timeManager); | ||||
|     timeLine->drawDateViewer(); | ||||
|     timeLine->drawTimeline(); | ||||
|     timeLine->drawClock(); | ||||
|     timeLine->DrawDateViewer(); | ||||
|     timeLine->DrawTimeline(); | ||||
|     timeLine->DrawClock(); | ||||
|     channelGroups = new cChannelGroups(); | ||||
|     channelGroups->ReadChannelGroups(); | ||||
|     footer = new cFooter(channelGroups); | ||||
| @@ -374,12 +374,12 @@ void cTvGuideOsd::ScrollForward() { | ||||
|     timeManager->AddStep(config.stepMinutes); | ||||
|     if (config.useHWAccel) { | ||||
|         drawGridsTimeJump(true); | ||||
|         timeLine->drawDateViewer(); | ||||
|         timeLine->drawClock(); | ||||
|         timeLine->setTimeline(); | ||||
|         timeLine->DrawDateViewer(); | ||||
|         timeLine->DrawClock(); | ||||
|         timeLine->DrawTimeline(); | ||||
|     } else { | ||||
|         timeLine->drawDateViewer(); | ||||
|         timeLine->setTimeline(); | ||||
|         timeLine->DrawDateViewer(); | ||||
|         timeLine->DrawTimeline(); | ||||
|         for (cChannelEpg *column = columns.First(); column; column = columns.Next(column)) { | ||||
|             column->AddNewGridsAtEnd(); | ||||
|             column->ClearOutdatedStart(); | ||||
| @@ -410,17 +410,15 @@ void cTvGuideOsd::timeBack() { | ||||
| } | ||||
|  | ||||
| void cTvGuideOsd::ScrollBack() { | ||||
|     bool tooFarInPast = timeManager->DelStep(config.stepMinutes); | ||||
|     if (tooFarInPast) | ||||
|         return; | ||||
|     timeManager->DelStep(config.stepMinutes); | ||||
|     if (config.useHWAccel) { | ||||
|         drawGridsTimeJump(); | ||||
|         timeLine->drawDateViewer(); | ||||
|         timeLine->drawClock(); | ||||
|         timeLine->setTimeline(); | ||||
|         timeLine->DrawDateViewer(); | ||||
|         timeLine->DrawClock(); | ||||
|         timeLine->DrawTimeline(); | ||||
|     } else { | ||||
|         timeLine->drawDateViewer(); | ||||
|         timeLine->setTimeline(); | ||||
|         timeLine->DrawDateViewer(); | ||||
|         timeLine->DrawTimeline(); | ||||
|         for (cChannelEpg *column = columns.First(); column; column = columns.Next(column)) { | ||||
|             column->AddNewGridsAtStart(); | ||||
|             column->ClearOutdatedEnd(); | ||||
| @@ -640,24 +638,20 @@ void cTvGuideOsd::processNumKey(int numKey) { | ||||
| void cTvGuideOsd::TimeJump(int mode) { | ||||
|     switch (mode) { | ||||
|         case 1: { | ||||
|             bool tooFarInPast = timeManager->DelStep(config.bigStepHours*60); | ||||
|             if (tooFarInPast) | ||||
|                 return; | ||||
|         } | ||||
|             timeManager->DelStep(((config.displayMode == eVertical) ? config.bigStepHours : config.bigStepHoursHorizontal) * 60); | ||||
|             } | ||||
|             break; | ||||
|         case 3: { | ||||
|             timeManager->AddStep(config.bigStepHours*60); | ||||
|         } | ||||
|             timeManager->AddStep(((config.displayMode == eVertical) ? config.bigStepHours : config.bigStepHoursHorizontal) * 60); | ||||
|             } | ||||
|             break; | ||||
|         case 4: { | ||||
|             bool tooFarInPast = timeManager->DelStep(config.hugeStepHours*60); | ||||
|             if (tooFarInPast) | ||||
|                 return; | ||||
|         } | ||||
|             timeManager->DelStep(((config.displayMode == eVertical) ? config.hugeStepHours : config.hugeStepHoursHorizontal) * 60); | ||||
|             } | ||||
|             break; | ||||
|         case 6: { | ||||
|             timeManager->AddStep(config.hugeStepHours*60); | ||||
|         } | ||||
|             timeManager->AddStep(((config.displayMode == eVertical) ? config.hugeStepHours : config.hugeStepHoursHorizontal) * 60); | ||||
|             } | ||||
|             break; | ||||
|         case 7: { | ||||
|             cTimeManager primeChecker; | ||||
| @@ -666,21 +660,21 @@ void cTvGuideOsd::TimeJump(int mode) { | ||||
|             if (primeChecker.tooFarInPast(prevPrime)) | ||||
|                 return; | ||||
|             timeManager->SetTime(prevPrime); | ||||
|         } | ||||
|             } | ||||
|             break; | ||||
|         case 9: { | ||||
|             cTimeManager primeChecker; | ||||
|             time_t nextPrime = primeChecker.getNextPrimetime(timeManager->GetStart()); | ||||
|             timeManager->SetTime(nextPrime); | ||||
|         } | ||||
|             } | ||||
|             break; | ||||
|         default: | ||||
|             return; | ||||
|     } | ||||
|     drawGridsTimeJump(); | ||||
|     timeLine->drawDateViewer(); | ||||
|     timeLine->drawClock(); | ||||
|     timeLine->setTimeline(); | ||||
|     timeLine->DrawDateViewer(); | ||||
|     timeLine->DrawClock(); | ||||
|     timeLine->DrawTimeline(); | ||||
|     osdManager.flush(); | ||||
| } | ||||
|  | ||||
| @@ -783,15 +777,18 @@ eOSState cTvGuideOsd::ProcessKey(eKeys Key) { | ||||
|             case kYellow:   processKeyYellow(); break; | ||||
|             case kBlue:     state = processKeyBlue(&alreadyUnlocked); break; | ||||
|             case kOk:       state = processKeyOk(&alreadyUnlocked); break; | ||||
|             case kBack:     state=osEnd; break;     | ||||
|             case kBack:     state = osEnd; break;     | ||||
|             case k0 ... k9: processNumKey(Key - k0); break; | ||||
|             case kFastRew:  TimeJump(1); break; // Doesnt work, if used from timeshiftmode | ||||
|             case kFastFwd:  TimeJump(3); break; | ||||
|             case kPrev:     TimeJump(4); break; | ||||
|             case kNext:     TimeJump(6); break; | ||||
|             case kNone:     if (channelJumper) CheckTimeout(); break; | ||||
|             default:        break; | ||||
|         } | ||||
|         if (timeLine->drawClock()) { | ||||
|             timeLine->drawCurrentTimeBase(); | ||||
|         if (timeLine->DrawClock()) { | ||||
|             osdManager.flush(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     if (!alreadyUnlocked) { | ||||
|         cPixmap::Unlock(); | ||||
|   | ||||
							
								
								
									
										29
									
								
								view.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								view.c
									
									
									
									
									
								
							| @@ -113,12 +113,18 @@ void cView::DrawHeader(void) { | ||||
|         } | ||||
|     } | ||||
|     //Date and Time, Title, Subtitle | ||||
|     int textWidthMax = headerWidth - xText - border / 2; | ||||
|     wrapper.Set(title.c_str(), fontHeaderLarge, textWidthMax); | ||||
|     int lineHeight = fontHeaderLarge->Height(); | ||||
|     int textLines = wrapper.Lines(); | ||||
|     int yDateTime = border / 2; | ||||
|     int yTitle = (headerHeight - fontHeaderLarge->Height()) / 2; | ||||
|     int yTitle = (headerHeight - textLines * lineHeight) / 2; | ||||
|     int ySubtitle = headerHeight - fontHeader->Height() - border / 3; | ||||
|     int textWidthMax = headerWidth - xText; | ||||
|  | ||||
|     pixmapHeader->DrawText(cPoint(xText, yDateTime), CutText(dateTime, textWidthMax, fontHeader).c_str(), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeader); | ||||
|     pixmapHeader->DrawText(cPoint(xText, yTitle), CutText(title, textWidthMax, fontHeaderLarge).c_str(), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeaderLarge); | ||||
|     for (int i = 0; i < textLines; i++) { | ||||
|         pixmapHeader->DrawText(cPoint(xText, yTitle + i * lineHeight), wrapper.GetLine(i), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeaderLarge); | ||||
|     } | ||||
|     pixmapHeader->DrawText(cPoint(xText, ySubtitle), CutText(subTitle, textWidthMax, fontHeader).c_str(), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeader); | ||||
|     //REC Icon | ||||
|     eTimerMatch timerMatch = tmNone;  | ||||
| @@ -216,7 +222,7 @@ void cView::DrawContent(std::string *text) { | ||||
|     wText.Set(text->c_str(), font, width - 2 * border); | ||||
|     int lineHeight = font->Height(); | ||||
|     int textLines = wText.Lines(); | ||||
|     int textHeight = lineHeight * textLines + 2*border; | ||||
|     int textHeight = lineHeight * textLines + 2 * border; | ||||
|     int yText = border; | ||||
|     CreateContent(textHeight); | ||||
|     for (int i=0; i < textLines; i++) { | ||||
| @@ -246,14 +252,14 @@ void cView::DrawFloatingContent(std::string *infoText, cTvMedia *img, cTvMedia * | ||||
|     int lineHeight = font->Height(); | ||||
|     int textLinesTall = wTextTall.Lines(); | ||||
|     int textLinesFull = wTextFull.Lines(); | ||||
|     int textHeight = lineHeight * (textLinesTall + textLinesFull) + 2*border; | ||||
|     int textHeight = lineHeight * (textLinesTall + textLinesFull) + 2 * border; | ||||
|     int yText = border; | ||||
|     CreateContent(max(textHeight, imgHeight + 2*border)); | ||||
|     for (int i=0; i < textLinesTall; i++) { | ||||
|     CreateContent(std::max(textHeight, imgHeight + 2 * border)); | ||||
|     for (int i = 0; i < textLinesTall; i++) { | ||||
|         pixmapContent->DrawText(cPoint(border, yText), wTextTall.GetLine(i), theme.Color(clrFont), clrTransparent, font); | ||||
|         yText += lineHeight; | ||||
|     } | ||||
|     for (int i=0; i < textLinesFull; i++) { | ||||
|     for (int i = 0; i < textLinesFull; i++) { | ||||
|         pixmapContent->DrawText(cPoint(border, yText), wTextFull.GetLine(i), theme.Color(clrFont), clrTransparent, font); | ||||
|         yText += lineHeight; | ||||
|     } | ||||
| @@ -268,13 +274,13 @@ void cView::DrawFloatingContent(std::string *infoText, cTvMedia *img, cTvMedia * | ||||
|     osdManager.flush(); | ||||
|     if (imgLoader.LoadPoster(img2->path.c_str(), imgWidth2, imgHeight2)) { | ||||
|         if (Running() && pixmapContent) | ||||
|             pixmapContent->DrawImage(cPoint(width - imgWidth2 - border, imgHeight + 2*border), imgLoader.GetImage()); | ||||
|             pixmapContent->DrawImage(cPoint(width - imgWidth2 - border, imgHeight + 2 * border), imgLoader.GetImage()); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cView::CreateFloatingTextWrapper(cTextWrapper *twNarrow, cTextWrapper *twFull, std::string *text, int widthImg, int heightImg) { | ||||
|     int lineHeight = font->Height(); | ||||
|     int linesNarrow = (heightImg + 2*border)/ lineHeight; | ||||
|     int linesNarrow = (heightImg + 2 * border)/ lineHeight; | ||||
|     int linesDrawn = 0; | ||||
|     int y = 0; | ||||
|     int widthNarrow = width - 3 * border - widthImg; | ||||
| @@ -481,7 +487,6 @@ bool cView::KeyUp(void) { | ||||
|     if (!scrollable) | ||||
|         return false; | ||||
|     int aktHeight = pixmapContent->DrawPort().Point().Y(); | ||||
| //    int lineHeight = font->Height(); | ||||
|     if (aktHeight >= 0) { | ||||
|         return false; | ||||
|     } | ||||
| @@ -522,7 +527,7 @@ cEPGView::cEPGView(void) : cView() { | ||||
| } | ||||
|  | ||||
| cEPGView::~cEPGView(void) { | ||||
|     Cancel(-1); | ||||
|     Cancel(2); | ||||
|     while (Active()) | ||||
|         cCondWait::SleepMs(10); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user