Compare commits

...

95 Commits

Author SHA1 Message Date
kamel5 79a95914f0 Version 1.2.18 2022-02-09 13:55:34 +01:00
kamel5 2f64512710 Cosmetic changes 2021-12-22 13:26:56 +01:00
kamel5 d11d09ca6e Merge branch 'pbiering/skindesigner-extend-detection-recording-isHD-isUHD' 2021-12-22 12:22:31 +01:00
Peter Bieringer 9690f6d8a0 remove debug lines 2021-12-20 19:13:00 +01:00
Peter Bieringer 5e5e5c4fbc extend detection of isHD and isUHD in case of stored EPG info (event) is missing any information regarding video (e.g. if EPG is missing on a channel) 2021-12-20 18:42:58 +01:00
kamel5 5b61c36484 Fix compiler error 2021-06-07 11:37:40 +02:00
kamel5 7d269ffd85 Version 1.2.17 2021-05-31 16:05:10 +02:00
kamel5 c6c89529a6 Update Skin estuary4vdr 2021-05-31 15:56:29 +02:00
kamel5 da79cb71b4 Update Skin estuary4vdr to display errors in recording info 2021-05-30 14:15:04 +02:00
kamel5 8aeb848044 Add token errors for recordings (VDR >= 2.5.4) 2021-05-30 14:15:00 +02:00
kamel5 b55994a8a6 Fix display of the background in the display channel
If you enter the display channel in Zapcockpit mode with the right or
left button and exit with OK, the background of the display channel was
not displayed.
2021-05-30 11:42:02 +02:00
kamel5 b47f544ad5 Fix incorrect display of posters and banners in the recording menu
When using the narrow recording menu, the posters and banners were
displayed incorrectly
2021-05-29 15:51:27 +02:00
kamel5 4a89d28f03 Fix display of events in channel display
When switching to a channel without EPG, the display of the current and
following program was not updated.
2021-05-27 11:53:17 +02:00
kamel5 7c47c8e225 Version 1.2.16 2021-05-21 12:10:40 +02:00
kamel5 ebd99e119c Fix update timer in the main menu
The timers in the open main menu were not updated when a timer recording
was started or stopped
2021-05-21 11:46:20 +02:00
kamel5 3c7e014dcc Fix a device is currently recording
The token indicating whether a device is currently recording was not
updated correctly
2021-05-21 11:46:16 +02:00
kamel5 b977e3582a Fix display of recording sign in display channel
The display of the instant timer has been corrected in the display
channel so that all events contained in the timer that have a tmFull
or tmPartial flag are marked with the recording symbol.
2021-05-21 11:46:11 +02:00
kamel5 9b63e8327f Fix Fehler: Aufruf des überladenen »min(int&, int&)« ist nicht eindeutig 2021-05-15 14:57:16 +02:00
kamel5 a7fc762b3d Update timerliste in main menu
The display of the instant timers has been corrected in the main menu so
that they are displayed as in the timer list.
2021-05-10 15:48:52 +02:00
kamel5 596c86c780 Merge branch 'pbiering/vdrstatus-displaymenu' 2021-05-06 10:55:25 +02:00
kamel5 d6f5e6808b Delete asterisk 2021-05-06 10:54:12 +02:00
Peter Bieringer 0259d38d2f fix/update changelog 2021-05-05 19:56:26 +02:00
Peter Bieringer 0b2666f62d remove comment 2021-05-05 18:51:01 +02:00
Peter Bieringer d4b1765aaf fix vdrstatus in displaymenu 2021-05-05 18:03:13 +02:00
Peter Bieringer 3aae0169b4 expose vdrstatus to displaymenu 2021-05-05 17:39:40 +02:00
kamel5 0159d536d0 Merge branch 'pbiering/vdrHasTimers' 2021-05-05 11:33:10 +02:00
kamel5 ccba1c23fd Revert "update version"
This reverts commit fce870a315.
2021-05-05 11:32:00 +02:00
kamel5 6583c93a6f Revert "update version token"
This reverts commit 64658a1f56.
2021-05-05 11:31:37 +02:00
Peter Bieringer 2d7a9ab3a3 Merge branch 'vdrHasTimers' of gitlab.com:pbiering/skindesigner into vdrHasTimers 2021-05-04 19:22:45 +02:00
Peter Bieringer 4daec64480 add {vdrHasTimers} to vdrstatus - can be used in skins for e.g. REC/SCHED/FREE (in combination with {vdrIsRecording}) 2021-05-04 19:20:29 +02:00
Peter Bieringer 64658a1f56 update version token 2021-05-04 19:19:30 +02:00
Peter Bieringer fce870a315 update version 2021-05-04 19:19:30 +02:00
kamel5 09925e6113 Fix Incorrect detection of a recording that is currently running
To set timeShiftActive correctly, it is not sufficient to compare the
name of the recording and the timer in cGlobalTimers::IsRecording()
if no short text is available. Therefore, the start time of both is now
also compared.
2021-05-04 14:38:52 +02:00
kamel5 4b2861e030 Merge branch 'pbiering/recIsInUse-vdrIsRecording' 2021-05-04 13:58:03 +02:00
Peter Bieringer 39c1062353 add {vdrHasTimers} to vdrstatus - can be used in skins for e.g. REC/SCHED/FREE (in combination with {vdrIsRecording}) 2021-05-04 07:33:08 +02:00
Peter Bieringer 589749731f update version token 2021-05-03 10:59:08 +02:00
Peter Bieringer 1c9fd38cc7 update version 2021-05-03 10:58:55 +02:00
Peter Bieringer 0ca96e8b3a add additional vdrstatus exposing "vdrIsRecordingsHandlersActive" and "vdrIsRecording" - can be used in skins for e.g. IDLE/BUSY REC/FREE 2021-05-03 10:53:55 +02:00
Peter Bieringer 700798ba21 add additional recording flag "isInUse" - can be used in skins for e.g. records in cutting/copy(queue) 2021-05-03 07:01:04 +02:00
kamel5 0aeb15d03a Merge branch 'pbiering/code-optimization' into develop 2021-04-25 11:14:40 +02:00
kamel5 22b24eb455 Update skin estuary4vdr displaychannel.xml
Fix incorrect display of weather info in Displaychannel.
2021-04-08 17:02:44 +02:00
kamel5 f5a29826cb Update skin estuary4vdr displaymenudefault.xml
Fix incorrect display of list entrys separated by tab in Displaymenu.
2021-04-08 17:02:34 +02:00
kamel5 50879fa931 Fix segfault with mpv plugin (thx to @lnj at vdr-portal.de)
This fix prevents a segfault when using the mpv plugin because there are
no cutmarks.
2021-03-28 12:26:24 +02:00
kamel5 894b5865cd Merge branch 'pbiering/fix-rsvg' 2021-03-23 15:57:20 +01:00
Peter Bieringer fda2a4ec74 fix issue introduced with 85df1e7f980f0f7092523e5ac9ed4ff6db51d82e: (process:24445): librsvg-CRITICAL **: 16:03:34.427: rsvg_handle_read_stream_sync: assertion 'is_input_stream(stream)' failed 2021-03-20 16:37:56 +01:00
Peter Bieringer 4821574437 remove of duplicate code by introducing macros by https://gitlab.com/Mike838 from https://gitlab.com/kamel5/skindesigner/-/issues/1#note_508426185 2021-03-20 16:06:45 +01:00
kamel5 dc617b52fa Version 1.2.15 2021-03-15 14:15:07 +01:00
kamel5 cef6ca78a2 Fix cutting marks wasn't updated 2021-03-15 14:10:18 +01:00
kamel5 85df1e7f98 Eliminate warnings 2021-03-11 13:21:45 +01:00
kamel5 3334263a96 Merge branch 'pbiering/skindesigner-fix-tuner-device-mapping' 2021-03-11 12:52:48 +01:00
Peter Bieringer 4d3fa0bc71 fix tuner device mapping in case tuners are not starting as first device (e.g. NetCeiver mcli) 2021-03-11 12:52:08 +01:00
Peter Bieringer cbce894c0c Merge remote-tracking branch 'upstream/master' 2021-03-11 08:16:55 +01:00
kamel5 9a0eac1c4f Update italian tanslation in metrixhd (thx to @fiveten_59 at vdr-portal.de) 2021-03-07 19:27:18 +01:00
kamel5 5f7337b50c Update italian tanslation in estuary4vdr (thx to @fiveten_59 at vdr-portal.de) 2021-03-07 14:45:49 +01:00
kamel5 e3becb6c61 Version 1.2.14 2021-03-04 17:47:41 +01:00
kamel5 fdc8195174 Add active recordings to timeshift mode
If the current program is paused (timeshift mode), a recording
is created with an "@" at the beginning. A skin can display
this mode differently than the normal playback of a recording.
This change also enables a different display mode for currently
active timer recordings.
2021-03-04 17:47:32 +01:00
kamel5 e7ea88c253 Revert "Disabled timeshift display for non timeshift recordings"
This reverts commit 1fc5379e2e.
2021-03-04 17:33:59 +01:00
kamel5 80cb1ec0ef Update estuary4vdr
Correct position of time
2021-03-04 17:33:41 +01:00
Peter Bieringer 105fe893a2 Merge remote-tracking branch 'upstream/master' 2021-03-01 07:25:50 +01:00
kamel5 402044d4c4 Version 1.2.13 2021-02-15 14:00:40 +01:00
kamel5 99d2bc6a86 Eliminate SetRecordingLength 2021-02-15 14:00:40 +01:00
kamel5 15aa722410 Move SetTimeShiftValues 2021-02-15 14:00:40 +01:00
kamel5 afa9cb77a3 Add element timeShiftTimes to displayreplay
In displayreplay the tokens recstart, playbacktime and timeshiftrest
added to display start time, actual playback time and the rest of
the actual recording in timeshiftmode.
2021-02-15 14:00:35 +01:00
kamel5 1fc5379e2e Disabled timeshift display for non timeshift recordings 2021-02-15 12:22:33 +01:00
kamel5 7a70ed13a7 Add tokens eventstart and eventstop to eDRRecTitleST
Tokens eventstart and eventstop can be used in displayreplay timshiftmode to
display the start and end time of the coresponding event
2021-02-15 12:22:33 +01:00
kamel5 808fba2367 Add datetime to displaychannel in skin estuary4vdr 2021-02-15 10:50:35 +01:00
kamel5 64599db339 In timeshift mode, the title of the actual playback position is displayed
If the timeshift mode is activated during playback, the title of the
program that was active when the time shift started is displayed by
pressing OK.
The behavior has now been changed so that the title of the program is
displayed in the actual playback position when you press OK.
2021-02-11 17:39:18 +01:00
kamel5 628a28201b Revision cViewReplay::SetTimeShiftValues()
When the timeshift recording reaches the end time of the start event,
the progress bar and the end time no longer shows any useful
information.
From this version the current live event is used to calculate the
progress bar and the end time.
2021-02-11 17:34:23 +01:00
kamel5 538d59ca4e An error with the remaining time in the channel display has been fixed
The remaining time in the channel display wasn't updated.
A new token "currentremaining" was introduced in the Progressbar section
of displaychannel.xml.
2021-02-11 17:34:23 +01:00
kamel5 78d424d256 Token eLeMenuDefaultIT::devstatus added 2021-02-09 15:57:13 +01:00
kamel5 cba8fe1eb4 Missing token eCeMenuSchedulesIT::durationminutes added 2021-02-09 15:57:13 +01:00
kamel5 b9093a6dca Update Skin estuary4vdr 2021-02-09 15:57:10 +01:00
kamel5 c3f7a2cfdf Fixed a bug in timeshift mode that prevented the progress bar from updating in pause mode 2021-02-08 15:31:59 +01:00
kamel5 6972a59e1b A bug with timeshift in connection with global timers has been fixed
With commit 8a04a17 an error was introduced which did not take the global
timers into account in the timeshift replay.
thanks to @machtnix at vdr-portal.de for finding the bug
2021-02-08 11:05:51 +01:00
kamel5 f8b6b2cf1b This reverts bd86dd4de "disabled timeshift display for instant recordings" 2021-02-06 17:58:19 +01:00
kamel5 0eaed1eb91 Version 1.2.12 2021-02-06 13:55:19 +01:00
kamel5 a48427cffc Merge branch 'pbiering/skindesigner-fix-eDmDetailedHeaderRec-crash' 2021-02-06 13:42:17 +01:00
Peter Bieringer 764f657620 Merge branch 'fix-Wstringop-overflow' 2021-02-06 12:55:42 +01:00
Peter Bieringer dd30dacb5b fix crash caused by cVeDmDetailheaderRec::Parse introduced in 1.2.10 2021-02-06 12:52:19 +01:00
Peter Bieringer 4bebeda1b0 fix 3x Wstringop-overflow compiler warnings 2021-02-06 09:36:17 +01:00
Peter Bieringer 7d63e95471 add TODO token 2021-02-06 08:12:45 +01:00
kamel5 78483aa3d8 Merge branch 'pbiering/skindesigner-add-Recording-isInUse' 2021-02-05 12:51:32 +01:00
Peter Bieringer 9def7d2b0d rename to isRecording, filter IsInUse proper, add also to replay recinfo 2021-02-05 08:44:00 +01:00
Peter Bieringer ca354a29e6 added token for recordings: isInUse 2021-02-05 08:06:22 +01:00
kamel5 452a4384c2 Version 1.2.11 2021-02-03 13:58:09 +01:00
kamel5 1c393e23a5 Fixed an error in displayreplay if no recording information are available 2021-02-03 13:53:25 +01:00
kamel5 6aeaf41467 Merge branch 'pbiering/skindesigner-fix-busy-svdrpresult' 2021-02-03 11:58:00 +01:00
Peter Bieringer b044321b1f also be initialized in case of backup skin is active 2021-02-03 07:13:41 +01:00
Peter Bieringer 68d4d6acae SVDRP: do not reload in case plugin is not fully initialized (results in VDR crash)
SVDRP: respond with proper error message in case of OSD is active or parsing error
2021-02-03 07:10:24 +01:00
Peter Bieringer 5e269ecaaa mark deprecated functions 2021-02-02 22:12:35 +01:00
Peter Bieringer ea963c73eb Merge remote-tracking branch 'upstream/master' 2021-01-28 21:05:12 +01:00
Peter Bieringer 83c85870fb align tuner number (starting internally with 0) with VDR numbering (starting with 1) 2021-01-28 13:27:09 +01:00
Peter Bieringer 6751c4cd4e Merge branch 'master' of gitlab.com:kamel5/skindesigner 2021-01-27 20:41:27 +01:00
Peter Bieringer 646fcad7d5 - retrieve ChannelName from 'info' and fallback via ChannelID from active channel list (reverse mechanism)
- remove exposing ChannelID (senseless as default 'info' is not containing it)
2021-01-24 12:11:23 +01:00
Peter Bieringer 91d06d15a2 update version, extend history 2021-01-24 09:46:47 +01:00
53 changed files with 2332 additions and 1324 deletions

63
HISTORY
View File

@ -462,9 +462,70 @@ Version 1.2.9
- [pbiering] added tokens for framesPerSecond and isHD
- [pbiering] improve HD detection code, catch also stream content 9
Version 1.2.10
Version 1.2.10 (buggy)
- [pbiering] added tokens for recordings: isUHD, isRadio
- [pbiering] added token for channels: isUHD
- [pbiering] expose to displaymenurecordings: recchannelname, recchannelid
- [pbiering] retrieve ChannelName from 'info' and fallback via ChannelID from active channel list
- [kamel5] Update skin estuary4vdr
Version 1.2.11 (buggy)
- [pbiering] align displayed tuner number (0,1,2 -> 1,2,3)
- [pbiering] SVDRP: do not reload in case plugin is not fully initialized (results in VDR crash)
- [pbiering] SVDRP: respond with proper error message in case of OSD is active or parsing error
- [kamel5] Fixed an error in displayreplay if no recording information are available
Version 1.2.12
- [pbiering] added token for recordings: isRecording
- [pbiering] fix crash caused by cVeDmDetailheaderRec::Parse introduced in 1.2.10
Version 1.2.13
- [kamel5] A bug with timeshift in connection with global timers has been fixed
- [kamel5] Fixed a bug in timeshift mode that prevented the progress bar from updating in pause mode
- [kamel5] Update Skin estuary4vdr
- Token eCeMenuSchedulesIT::durationminutes added
- Token eLeMenuDefaultIT::devstatus added
- [kamel5] An error with the remaining time in the channel display has been fixed
- [kamel5] Revision cViewReplay::SetTimeShiftValues
- [kamel5] In timeshift mode, the title of the actual playback position is displayed
- [kamel5] Add token recstart to displayreplay
- [kamel5] Add tokens eventstart and eventstop to eDRRecTitleST
- [kamel5] Disabled timeshift display for non timeshift recordings
- [kamel5] Add element timeShiftTimes with tokens recstart, playbacktime and timeshiftrest to displayreplay
Version 1.2.14
- [kamel5] Revert "Disabled timeshift display for non timeshift recordings"
- [kamel5] Add a different display mode to timeshift for currently active timer recordings
Version 1.2.15
- [kamel5] Update Update italian tanslation in metrixhd and estuary4vdr
- [pbiering] fix tuner device mapping in case tuners are not starting as first device
- [kamel5] Fix cutting marks wasn't updated
Version 1.2.16
- [pbiering] add additional recording flag {isInUse} - can be used in skins for e.g. records in cutting/copy(queue)
- [pbiering] add additional <vdrstatus> exposing {vdrIsRecordingsHandlersActive} and {vdrIsRecording} - can be used in skins for e.g. IDLE/BUSY REC/FREE
- [kamel5] Fix Incorrect detection of a recording that is currently running
- [kamel5] Fix segfault with mpv plugin (thx to @lnj at vdr-portal.de)
- [kamel5] Update skin estuary4vdr
- [pbiering] add {vdrHasTimers} to <vdrstatus> - can be used in skins for e.g. REC/SCHED/FREE (in combination with {vdrIsRecording})
- [pbiering] add <vdrstatus> also to displaymenu.xml to be able to display in header
- [kamel5] Fix display of recording sign in display channel
- [kamel5] Fix a device is currently recording
- [kamel5] Fix update timer in the main menu
Version 1.2.17
- [kamel5] Fix display of events in channel display
- [kamel5] Fix incorrect display of posters and banners in the recording menu
- [kamel5] Fix display of the background in the display channel
- [kamel5] Add token errors for recordings (VDR >= 2.5.4)
- [kamel5] Update Skin estuary4vdr to display errors in recording info
- [kamel5] Update Skin estuary4vdr
Version 1.2.18
- [pbiering] extend detection of isHD and isUHD in case of stored EPG info (event) is missing any information regarding video (e.g. if EPG is missing on a channel)
- [kamel5] Fix compiler error

View File

@ -726,15 +726,15 @@ bool cNumericExpr::IsNumericExpression(const char *e) {
}
bool cNumericExpr::PercentValue(const char *e) {
if (!e)
return e;
const char *hit = strchr(e, '%');
if (!hit)
return false;
char buffer[20] = "";
if (strlen(e) > 20)
return false;
strncpy(buffer, e, strlen(e)-1);
buffer[strlen(e)-1] = '\0';
int val = atoi(buffer);
int val;
int r = sscanf(e, "%d%%", &val); // use sscanf to retrieve %-value to avoid -Wstringop-overflow
if (r != 1)
return false; // sscanf parsing problem
bool ok = false;
if (horizontal && container->Width() > 0) {
value = container->Width() * val / 100;
@ -747,22 +747,22 @@ bool cNumericExpr::PercentValue(const char *e) {
}
char *cNumericExpr::ReplacePercentValue(char *e) {
if (!e)
return e;
const char *hit = strchr(e, '%');
if (!hit)
return e;
char buffer[20] = "";
if (strlen(e) > 20)
return e;
strncpy(buffer, e, strlen(e)-1);
buffer[strlen(e)-1] = '\0';
int val = atoi(buffer);
int val;
int r = sscanf(e, "%d%%", &val); // use sscanf to retrieve %-value to avoid -Wstringop-overflow
if (r != 1)
return e; // sscanf parsing problem
double percentVal = (double)val/100.0f;
char replacement[50] = "";
if (horizontal) {
sprintf(replacement, "%.5f*{areawidth}", percentVal);
snprintf(replacement, sizeof(replacement), "%.5f*{areawidth}", percentVal);
} else {
sprintf(replacement, "%.5f*{areaheight}", percentVal);
snprintf(replacement, sizeof(replacement), "%.5f*{areaheight}", percentVal);
}
int len = strlen(replacement) + 1;
@ -774,16 +774,19 @@ char *cNumericExpr::ReplacePercentValue(char *e) {
}
char *cNumericExpr::ReplaceToken(char *e, const char* token, int val) {
if (!e)
return e;
char *tokenStart = strstr(e, token);
if (!tokenStart) {
return e;
}
char buffer[20] = "";
sprintf(buffer, "%d", val);
snprintf(buffer, sizeof(buffer), "%d", val);
size_t newSize = strlen(e) - strlen(token) + strlen(buffer) + 1;
char *replaced = (char*)malloc(newSize);
memset(replaced, 0, newSize);
size_t beginning = strlen(e) - strlen(tokenStart);
if (beginning >= newSize) beginning = newSize - 1; // will never happen but avoid -Wstringop-overflow
if (beginning > 0)
strncpy(replaced, e, beginning);
strcat(replaced, buffer);

View File

@ -62,6 +62,7 @@ enum class eVeDisplayMenu {
header,
datetime,
time,
vdrstatus,
sortmode,
colorbuttons,
message,
@ -79,6 +80,7 @@ enum class eVeDisplayMenuMain {
systemmemory,
temperatures,
vdrstatistics,
vdrstatus,
lastrecordings,
customtokens,
count
@ -129,6 +131,7 @@ enum class eVeDisplayReplay {
recinfo,
currenttime,
totaltime,
timeshifttimes,
endtime,
progressbar,
cutmarks,
@ -433,6 +436,7 @@ enum class eDCProgressBarIT {
remaining,
permashift,
livebuffer,
currentremaining,
count
};
@ -733,6 +737,13 @@ enum class eDMVdrstatisticsIT {
count = 0
};
enum class eDMVdrstatusIT {
vdrIsRecordingsHandlersActive,
vdrIsRecording,
vdrHasTimers,
count
};
enum class eDMTemperaturesST {
count = 0
};
@ -813,6 +824,7 @@ enum class eLeMenuDefaultIT {
remoteosd,
filebrowser,
epgsearch,
devstatus,
count
};
@ -1172,6 +1184,9 @@ enum class eLeMenuRecordingsIT {
isHD,
isUHD,
isRadio,
isRecording,
isInUse,
errors,
count
};
@ -1221,6 +1236,9 @@ enum class eCeMenuRecordingsIT {
isHD,
isUHD,
isRadio,
isRecording,
isInUse,
errors,
count
};
@ -1335,6 +1353,9 @@ enum class eDmDetailedHeaderRecIT {
isHD,
isUHD,
isRadio,
isRecording,
isInUse,
errors,
count
};
@ -1446,6 +1467,9 @@ enum class eDmDetailedRecIT {
isHD,
isUHD,
isRadio,
isRecording,
isInUse,
errors,
count
};
@ -1485,6 +1509,13 @@ enum class eDRRecTitleST {
recsubtitle,
recdate,
rectime,
eventstart,
eventstop,
count
};
enum class eDRRecTitleIT {
timeshift = 0,
count
};
@ -1499,6 +1530,8 @@ enum class eDRRecInfoIT {
screenheight,
isHD,
isUHD,
isRecording,
isInUse,
isWideScreen,
count
};
@ -1508,6 +1541,11 @@ enum class eDRCurrentTimeST {
count
};
enum class eDRCurrentTimeIT {
timeshift = 0,
count
};
enum class eDRTotalTimeST {
rectotal = 0,
timeshifttotal,
@ -1519,11 +1557,28 @@ enum class eDRTotalTimeIT {
count
};
enum class eDRTimeshiftTimesST {
recstart = 0,
playbacktime,
timeshiftrest,
count
};
enum class eDRTimeshiftTimesIT {
timeshift = 0,
count
};
enum class eDREndTimeST {
recend = 0,
count
};
enum class eDREndTimeIT {
timeshift = 0,
count
};
enum class eDRProgressbarIT {
current = 0,
total,

View File

@ -1332,7 +1332,7 @@ int cFuncLoop::FuncWidth(void) {
eOverflowType overflow = (eOverflowType)GetValue((int)eLoopAttribs::overflow);
if (overflow == eOverflowType::cut) {
int maxItems = GetValue((int)eLoopAttribs::maxitems);
numLoops = min(numLoops, maxItems);
numLoops = std::min(numLoops, maxItems);
}
if (numLoops > 0)
return numLoops * columnWidth;
@ -1357,7 +1357,7 @@ int cFuncLoop::FuncHeight(void) {
eOverflowType overflow = (eOverflowType)GetValue((int)eLoopAttribs::overflow);
if (overflow == eOverflowType::cut) {
int maxItems = GetValue((int)eLoopAttribs::maxitems);
numLoops = min(numLoops, maxItems);
numLoops = std::min(numLoops, maxItems);
} else if (overflow == eOverflowType::wrap) {
int loopWidth = Width();
if (loopWidth <= 0)

File diff suppressed because it is too large Load Diff

View File

@ -607,6 +607,9 @@ void cViewDetailRec::SetTokenContainer(void) {
tokenContainer->DefineIntToken("{isHD}", (int)eDmDetailedRecIT::isHD);
tokenContainer->DefineIntToken("{isUHD}", (int)eDmDetailedRecIT::isUHD);
tokenContainer->DefineIntToken("{isRadio}", (int)eDmDetailedRecIT::isRadio);
tokenContainer->DefineIntToken("{isRecording}", (int)eDmDetailedRecIT::isRecording);
tokenContainer->DefineIntToken("{isInUse}", (int)eDmDetailedRecIT::isInUse);
tokenContainer->DefineIntToken("{errors}", (int)eDmDetailedRecIT::errors);
tokenContainer->DefineIntToken("{ismovie}", (int)eScraperIT::ismovie);
tokenContainer->DefineIntToken("{moviebudget}", (int)eScraperIT::moviebudget);
tokenContainer->DefineIntToken("{movierevenue}", (int)eScraperIT::movierevenue);
@ -671,6 +674,12 @@ bool cViewDetailRec::Parse(bool forced) {
tokenContainer->AddStringToken((int)eDmDetailedRecST::shorttext, info->ShortText());
tokenContainer->AddStringToken((int)eDmDetailedRecST::description, info->Description());
tokenContainer->AddIntToken((int)eDmDetailedRecIT::framesPerSecond, info->FramesPerSecond());
int errors = -1;
// ENABLE_ERRORS is only used in VDR-2.5.4 if the coresponding patch is installed, so it can be ignored in other versions
#if (defined (APIVERSNUM) && (APIVERSNUM >= 20505)) || defined (ENABLE_ERRORS)
errors = info->Errors();
#endif
tokenContainer->AddIntToken((int)eDmDetailedRecIT::errors, errors);
const cEvent *event = info->GetEvent();
if (event) {
cString recDate = event->GetDateString();
@ -696,9 +705,11 @@ bool cViewDetailRec::Parse(bool forced) {
tokenContainer->AddIntToken((int)eDmDetailedRecIT::durationevent, duration);
tokenContainer->AddIntToken((int)eDmDetailedRecIT::durationeventhours, duration / 60);
tokenContainer->AddStringToken((int)eDmDetailedRecST::durationeventminutes, *cString::sprintf("%.2d", duration%60));
tokenContainer->AddIntToken((int)eDmDetailedRecIT::isHD, RecordingIsHD(event)); // detect HD from 'info'
tokenContainer->AddIntToken((int)eDmDetailedRecIT::isUHD, RecordingIsUHD(event)); // detect UHD from 'info'
tokenContainer->AddIntToken((int)eDmDetailedRecIT::isHD, RecordingIsHD(event, tChannelID::InvalidID)); // detect HD from 'info', no fallback to channelID
tokenContainer->AddIntToken((int)eDmDetailedRecIT::isUHD, RecordingIsUHD(event, tChannelID::InvalidID)); // detect UHD from 'info', no fallback to channelID
tokenContainer->AddIntToken((int)eDmDetailedRecIT::isRadio, RecordingIsRadio(event, info->FramesPerSecond())); // detect Radio from 'info' and FPS
tokenContainer->AddIntToken((int)eDmDetailedRecIT::isRecording, recording->IsInUse() & ruTimer);
tokenContainer->AddIntToken((int)eDmDetailedRecIT::isInUse, recording->IsInUse());
}
}
SetRecInfos();

View File

@ -261,9 +261,6 @@ void cViewChannel::SetEvents(const cEvent *present, const cEvent *following) {
if (veProgressBar)
veProgressBar->Set(present);
if (!present && !following)
return;
if (veEpgInfo)
veEpgInfo->Set(present, following);
@ -426,6 +423,7 @@ void cViewChannel::ClearExtended(void) {
Clear((int)eVeDisplayChannel::channellistdetail);
SetDirty((int)eVeDisplayChannel::channellistback);
initExtended = true;
init = true;
ShowBasic();
}
//exit from channellist info to channel list
@ -439,6 +437,7 @@ void cViewChannel::ClearExtended(void) {
Clear((int)eVeDisplayChannel::grouplistback);
SetDirty((int)eVeDisplayChannel::grouplistback);
initExtended = true;
init = true;
ShowBasic();
}
//exit from group channel list to group list
@ -463,6 +462,7 @@ void cViewChannel::ClearExtended(void) {
SetDirty((int)eVeDisplayChannel::grouplistback);
SetDirty((int)eVeDisplayChannel::groupchannellistdetail);
initExtended = true;
init = true;
ShowBasic();
}
//exit from channel info to channel or group list

View File

@ -108,6 +108,7 @@ void cViewMenu::SetViewElements(void) {
viewElementNames.insert(pair<string, int>("header", (int)eVeDisplayMenu::header));
viewElementNames.insert(pair<string, int>("datetime", (int)eVeDisplayMenu::datetime));
viewElementNames.insert(pair<string, int>("time", (int)eVeDisplayMenu::time));
viewElementNames.insert(pair<string, int>("vdrstatus", (int)eVeDisplayMenu::vdrstatus));
viewElementNames.insert(pair<string, int>("colorbuttons", (int)eVeDisplayMenu::colorbuttons));
viewElementNames.insert(pair<string, int>("message", (int)eVeDisplayMenu::message));
viewElementNames.insert(pair<string, int>("scrollbar", (int)eVeDisplayMenu::scrollbar));
@ -629,6 +630,7 @@ cSubView::cSubView(const char *name) {
header = NULL;
datetime = NULL;
time = NULL;
vdrstatus = NULL;
message = NULL;
sortmode = NULL;
colorbuttons = NULL;
@ -693,6 +695,10 @@ void cSubView::SetViewElement(eVeDisplayMenu ve, cViewElement *viewElement) {
if (!time)
time = dynamic_cast<cVeTime*>(viewElement);
break;
case eVeDisplayMenu::vdrstatus:
if (!vdrstatus)
vdrstatus = dynamic_cast<cVeDmVdrstatus*>(viewElement);
break;
case eVeDisplayMenu::message:
if (!message)
message = dynamic_cast<cVeMessage*>(viewElement);
@ -735,6 +741,10 @@ void cSubView::SetViewElementHorizontal(eVeDisplayMenu ve, cViewElement *viewEle
if (!time)
time = dynamic_cast<cVeTime*>(viewElement);
break;
case eVeDisplayMenu::vdrstatus:
if (!vdrstatus)
vdrstatus = dynamic_cast<cVeDmVdrstatus*>(viewElement);
break;
case eVeDisplayMenu::message:
if (!message)
message = dynamic_cast<cVeMessage*>(viewElement);
@ -866,6 +876,7 @@ void cSubView::Clear(void) {
if (background) background->Hide();
if (datetime) datetime->Hide();
if (time) time->Hide();
if (vdrstatus) vdrstatus->Hide();
if (header) header->Hide();
if (colorbuttons) colorbuttons->Hide();
if (scrollbar) scrollbar->Hide();
@ -902,6 +913,11 @@ void cSubView::DrawDynamicVEs(void) {
time->Render();
}
}
if (vdrstatus) {
vdrstatus->Show();
if (vdrstatus->Parse())
vdrstatus->Render();
}
}
void cSubView::DrawList(void) {
@ -949,6 +965,11 @@ void cSubView::SetViewElementObjects(void) {
else if (viewElements[(int)eVeDisplayMenu::time])
time = dynamic_cast<cVeTime*>(viewElements[(int)eVeDisplayMenu::time]);
if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::vdrstatus])
vdrstatus = dynamic_cast<cVeDmVdrstatus*>(viewElementsHorizontal[(int)eVeDisplayMenu::vdrstatus]);
else if (viewElements[(int)eVeDisplayMenu::vdrstatus])
vdrstatus = dynamic_cast<cVeDmVdrstatus*>(viewElements[(int)eVeDisplayMenu::vdrstatus]);
if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenu::message])
message = dynamic_cast<cVeMessage*>(viewElementsHorizontal[(int)eVeDisplayMenu::message]);
else if (viewElements[(int)eVeDisplayMenu::message])
@ -986,6 +1007,7 @@ void cSubView::SetViewElements(void) {
viewElementNames.insert(pair<string, int>("background", (int)eVeDisplayMenu::background));
viewElementNames.insert(pair<string, int>("header", (int)eVeDisplayMenu::header));
viewElementNames.insert(pair<string, int>("datetime", (int)eVeDisplayMenu::datetime));
viewElementNames.insert(pair<string, int>("vdrstatus", (int)eVeDisplayMenu::vdrstatus));
viewElementNames.insert(pair<string, int>("time", (int)eVeDisplayMenu::time));
viewElementNames.insert(pair<string, int>("colorbuttons", (int)eVeDisplayMenu::colorbuttons));
viewElementNames.insert(pair<string, int>("message", (int)eVeDisplayMenu::message));
@ -1059,6 +1081,7 @@ cViewMenuMain::cViewMenuMain(const char *name) : cSubView(name) {
load = NULL;
memory = NULL;
vdrstats = NULL;
vdrstatus = NULL;
temperatures = NULL;
currentSchedule = NULL;
lastRecordings = NULL;
@ -1084,6 +1107,7 @@ void cViewMenuMain::SetViewElements(void) {
viewElementNames.insert(pair<string, int>("systemload", (int)eVeDisplayMenuMain::systemload));
viewElementNames.insert(pair<string, int>("systemmemory", (int)eVeDisplayMenuMain::systemmemory));
viewElementNames.insert(pair<string, int>("vdrstatistics", (int)eVeDisplayMenuMain::vdrstatistics));
viewElementNames.insert(pair<string, int>("vdrstatus", (int)eVeDisplayMenuMain::vdrstatus));
viewElementNames.insert(pair<string, int>("temperatures", (int)eVeDisplayMenuMain::temperatures));
viewElementNames.insert(pair<string, int>("lastrecordings", (int)eVeDisplayMenuMain::lastrecordings));
viewElementNames.insert(pair<string, int>("customtokens", (int)eVeDisplayMenuMain::customtokens));
@ -1133,6 +1157,11 @@ void cViewMenuMain::SetViewElementObjects(void) {
else if (viewElements[(int)eVeDisplayMenuMain::vdrstatistics])
vdrstats = dynamic_cast<cVeDmVdrstatistics*>(viewElements[(int)eVeDisplayMenuMain::vdrstatistics]);
if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::vdrstatus])
vdrstatus = dynamic_cast<cVeDmVdrstatus*>(viewElementsHorizontal[(int)eVeDisplayMenuMain::vdrstatus]);
else if (viewElements[(int)eVeDisplayMenuMain::vdrstatus])
vdrstatus = dynamic_cast<cVeDmVdrstatus*>(viewElements[(int)eVeDisplayMenuMain::vdrstatus]);
if (orientation == eOrientation::horizontal && viewElementsHorizontal[(int)eVeDisplayMenuMain::temperatures])
temperatures = dynamic_cast<cVeDmTemperatures*>(viewElementsHorizontal[(int)eVeDisplayMenuMain::temperatures]);
else if (viewElements[(int)eVeDisplayMenuMain::temperatures])
@ -1154,6 +1183,7 @@ void cViewMenuMain::SetViewElementObjects(void) {
if (load) load->SetDetached();
if (memory) memory->SetDetached();
if (vdrstats) vdrstats->SetDetached();
if (vdrstatus) vdrstatus->SetDetached();
if (temperatures) temperatures->SetDetached();
if (timers) timers->SetDetached();
if (currentSchedule) currentSchedule->SetDetached();
@ -1190,6 +1220,10 @@ void cViewMenuMain::Clear(void) {
vdrstats->Reset();
vdrstats->Hide();
}
if (vdrstatus) {
vdrstatus->Hide();
}
if (temperatures) {
temperatures->Reset();
@ -1235,11 +1269,6 @@ void cViewMenuMain::DrawStaticVEs(void) {
if (discusage->Parse())
discusage->Render();
}
if (timers) {
timers->Show();
if (timers->Parse())
timers->Render();
}
if (currentSchedule) {
currentSchedule->Show();
if (currentSchedule->Parse())
@ -1263,6 +1292,11 @@ void cViewMenuMain::DrawDynamicVEs(void) {
lastDrawDynamic = now;
}
if (timers) {
timers->Show();
if (timers->Parse())
timers->Render();
}
if (devices) {
devices->Show();
if (devices->Parse())
@ -1283,6 +1317,11 @@ void cViewMenuMain::DrawDynamicVEs(void) {
if (vdrstats->Parse())
vdrstats->Render();
}
if (vdrstatus) {
vdrstatus->Show();
if (vdrstatus->Parse())
vdrstatus->Render();
}
if (temperatures) {
temperatures->Show();
if (temperatures->Parse())
@ -1608,6 +1647,11 @@ void cViewMenuDetail::DrawDynamicVEs(void) {
if (time->Parse())
time->Render();
}
if (vdrstatus) {
vdrstatus->Show();
if (vdrstatus->Parse())
vdrstatus->Render();
}
}
void cViewMenuDetail::DrawDetailedView(void) {

View File

@ -120,6 +120,7 @@ protected:
cVeDmHeader *header;
cVeDateTime *datetime;
cVeTime *time;
cVeDmVdrstatus *vdrstatus;
cVeMessage *message;
cVeDmSortmode *sortmode;
cVeDmColorbuttons *colorbuttons;
@ -188,6 +189,7 @@ private:
cVeDmSystemload *load;
cVeDmSystemmemory *memory;
cVeDmVdrstatistics *vdrstats;
cVeDmVdrstatus *vdrstatus;
cVeDmTemperatures *temperatures;
cVeDmCurrentschedule *currentSchedule;
cVeDmLastrecordings *lastRecordings;
@ -322,4 +324,4 @@ public:
void SetTransparency(int transparency, bool forceDetached = false);
};
#endif //__VIEWDISPLAYMENU_H
#endif //__VIEWDISPLAYMENU_H

View File

@ -6,6 +6,7 @@
cViewReplay::cViewReplay(void) {
veCustomTokens = NULL;
veTimeshiftTimes = NULL;
veEndTime = NULL;
veMessage = NULL;
veScraperContent = NULL;
@ -45,6 +46,7 @@ void cViewReplay::SetViewElements(void) {
viewElementNames.insert(pair<string, int>("rectitle", (int)eVeDisplayReplay::rectitle));
viewElementNames.insert(pair<string, int>("recinfo", (int)eVeDisplayReplay::recinfo));
viewElementNames.insert(pair<string, int>("currenttime", (int)eVeDisplayReplay::currenttime));
viewElementNames.insert(pair<string, int>("timeshifttimes", (int)eVeDisplayReplay::timeshifttimes));
viewElementNames.insert(pair<string, int>("endtime", (int)eVeDisplayReplay::endtime));
viewElementNames.insert(pair<string, int>("totaltime", (int)eVeDisplayReplay::totaltime));
viewElementNames.insert(pair<string, int>("progressbar", (int)eVeDisplayReplay::progressbar));
@ -92,6 +94,10 @@ void cViewReplay::SetViewElementObjects(void) {
{
veTotalTime = dynamic_cast<cVeDrTotalTime*>(viewElements[i]);
}
else if (dynamic_cast<cVeDrTimeshiftTimes*>(viewElements[i]))
{
veTimeshiftTimes = dynamic_cast<cVeDrTimeshiftTimes*>(viewElements[i]);
}
else if (dynamic_cast<cVeDrEndTime*>(viewElements[i]))
{
veEndTime = dynamic_cast<cVeDrEndTime*>(viewElements[i]);
@ -142,35 +148,99 @@ void cViewReplay::PreCache(void) {
void cViewReplay::ClearVariables(void) {
cView::ClearVariables();
recording = NULL;
lastEvent = NULL;
modeOnly = false;
lastFlush = 0;
lastFlushModeOnly = 0;
message = false;
reclength = -1;
timeShiftActive = false;
timeShiftActive = NoRec;
timeShiftFramesTotal = -1;
timeShiftLength = -1;
timeShiftDuration = "";
timeshiftrest = "";
if (veCustomTokens)
veCustomTokens->Reset();
if (veTimeshiftTimes)
veTimeshiftTimes->Set(cString(""), cString(""), cString(""));
if (veEndTime)
veEndTime->Set(cString(""));
if (veCutMarks)
veCutMarks->Reset();
timersLoaded = false;
globalTimers.ClearTimers();
}
void cViewReplay::SetTimeShift(int framesTotal, int timeShiftLength) {
timeShiftActive = true;
timeShiftFramesTotal = framesTotal;
this->timeShiftLength = timeShiftLength;
void cViewReplay::GetGlobalTimers(void) {
if (!timersLoaded) {
timersLoaded = true;
globalTimers.LoadTimers();
}
}
void cViewReplay::SetTimeShiftValues(int current, int total) {
timeShiftActive = NoRec;
if (!recording)
return;
#if APIVERSNUM >= 20101
int usage = recording->IsInUse();
if (usage & ruTimer)
timeShiftActive = NormalRec;
else {
GetGlobalTimers();
if (globalTimers.IsRecording(recording))
timeShiftActive = NormalRec;
}
#endif
if (!timeShiftActive)
return;
const char *recName = recording->Name();
if (recName && *recName == '@')
timeShiftActive = TimeshiftRec;
const cRecordingInfo *recInfo = recording->Info();
if (!recInfo)
return;
const cSchedule *Schedule = NULL;
if (timeShiftActive == TimeshiftRec) {
{
LOCK_SCHEDULES_READ;
Schedule = Schedules->GetSchedule(recInfo->ChannelID());
}
if (!Schedule)
return;
}
// Get event at actual recording position
const cEvent *event = (timeShiftActive == TimeshiftRec) ? Schedule->GetEventAround(time(0))
: recInfo->GetEvent();
if (!event)
return;
// End of live program
time_t liveEventStop = event->EndTime();
// Begin of timeshift recording
time_t recordingStart = time(0) - recording->LengthInSeconds();
// actual timeshiftlength in sec
timeShiftLength = liveEventStop - recordingStart;
// timeshiftlength until end of live program
timeShiftFramesTotal = total * ((double)timeShiftLength / (double)recording->LengthInSeconds());
// Get event at actual replay position (add 30sec for a better match)
int timeShiftSecondsAfter = (int)(recording->LengthInSeconds() * (1.0 - (double)current / (double)total)) + 30;
if (timeShiftActive == TimeshiftRec) {
const cEvent *eventReplay = Schedule->GetEventAround(time(0) - timeShiftSecondsAfter);
// Display title at replay position
if (veRecTitle && eventReplay != lastEvent) {
veRecTitle->Set(recording, eventReplay, timeShiftActive);
veRecTitle->Parse();
lastEvent = eventReplay;
}
}
int mins = (timeShiftLength / 60) % 60;
int hours = (timeShiftLength / 3600) % 24;
timeShiftDuration = cString::sprintf("%d:%02d", hours, mins);
mins = (timeShiftSecondsAfter / 60) % 60;
hours = (timeShiftSecondsAfter / 3600) % 24;
timeshiftrest = cString::sprintf("%d:%02d", hours, mins);
}
void cViewReplay::SetRecording(const cRecording *recording) {
this->recording = recording;
if (veRecTitle) {
veRecTitle->Set(recording);
}
@ -182,86 +252,70 @@ void cViewReplay::SetRecording(const cRecording *recording) {
}
}
void cViewReplay::GetTimers(void) {
if (!timersLoaded) {
timersLoaded = true;
globalTimers.LoadTimers();
}
}
void cViewReplay::SetTimeShiftValues(const cRecording *recording) {
//check for instant recording
const char *recName = recording->Name();
if (recName && *recName == '@')
return;
bool isTimeShift = false;
#if APIVERSNUM >= 20101
int usage = recording->IsInUse();
if (usage & ruTimer)
isTimeShift = true;
else {
if (globalTimers.IsRecording(recording))
isTimeShift = true;
}
#endif
if (!isTimeShift)
return;
const cRecordingInfo *recInfo = recording->Info();
if (!recInfo)
return;
const cEvent *event = recInfo->GetEvent();
if (!event)
return;
double fps = recording->FramesPerSecond();
time_t liveEventStop = event->EndTime();
time_t recordingStart = time(0) - recording->LengthInSeconds();
int framesTotal = (liveEventStop - recordingStart)*fps;
int recLength = liveEventStop - recordingStart;
SetTimeShift(framesTotal, recLength);
}
void cViewReplay::SetTitle(const char *title) {
if (veRecTitle) {
veRecTitle->Set(title);
}
if (veRecInfo) {
veRecInfo->Set(NULL);
}
if (veScraperContent) {
veScraperContent->Set(NULL);
}
}
void cViewReplay::SetCurrent(const char *current) {
if (veCurrentTime)
veCurrentTime->Set(current);
veCurrentTime->Set(current, timeShiftActive);
Render((int)eVeDisplayReplay::currenttime);
}
void cViewReplay::SetTotal(const char *total) {
if (veTotalTime)
veTotalTime->Set(total, timeShiftActive, *timeShiftDuration);
veTotalTime->Set(total, *timeShiftDuration, timeShiftActive);
Render((int)eVeDisplayReplay::totaltime);
}
void cViewReplay::SetTimeshiftTimes(int current, int total) {
if (!veTimeshiftTimes || !recording)
return;
time_t recordingStart = 0;
time_t playbackTime = 0;
if (timeShiftActive) {
recordingStart = time(0) - recording->LengthInSeconds();
playbackTime = time(0) - (int)(recording->LengthInSeconds() * (1.0 - (double)current / (double)total));
} else
recordingStart = recording->Start();
veTimeshiftTimes->Set(TimeString(recordingStart), TimeString(playbackTime), timeshiftrest, timeShiftActive);
Render((int)eVeDisplayReplay::timeshifttimes);
}
void cViewReplay::SetEndTime(int current, int total) {
if (!veEndTime)
if (!veEndTime || !recording)
return;
int totalLength = total;
int recordingLength = reclength;
int recordingLength = recording->LengthInSeconds();
if (timeShiftActive && timeShiftFramesTotal > 0) {
totalLength = timeShiftFramesTotal;
recordingLength = timeShiftLength;
}
double rest = (double)(totalLength - current) / (double)totalLength;
time_t end = time(0) + rest*recordingLength;
veEndTime->Set(TimeString(end));
time_t end = time(0) + rest * recordingLength;
veEndTime->Set(TimeString(end), timeShiftActive);
Render((int)eVeDisplayReplay::endtime);
}
void cViewReplay::SetProgressbar(int current, int total) {
SetTimeShiftValues(current, total);
if (veProgressbar)
veProgressbar->Set(current, total, timeShiftActive, timeShiftFramesTotal);
Render((int)eVeDisplayReplay::progressbar);
}
void cViewReplay::SetMarks(const cMarks *marks, int current, int total) {
if (veCutMarks)
veCutMarks->Set(marks, current, total, timeShiftActive, timeShiftFramesTotal);
if (!veCutMarks)
return;
veCutMarks->Set(marks, current, total, timeShiftActive, timeShiftFramesTotal);
Render((int)eVeDisplayReplay::cutmarks);
}

View File

@ -12,6 +12,7 @@ private:
cVeDrScraperContent *veScraperContent;
cVeDrCurrentTime *veCurrentTime;
cVeDrTotalTime *veTotalTime;
cVeDrTimeshiftTimes *veTimeshiftTimes;
cVeDrEndTime *veEndTime;
cVeDrProgressBar *veProgressbar;
cVeDrCutMarks *veCutMarks;
@ -21,17 +22,21 @@ private:
cVeDrJump *veJump;
cVeDrOnPause *veOnPause;
cVeDrOnPause *veOnPauseModeOnly;
const cRecording *recording;
const cEvent *lastEvent;
bool modeOnly;
time_t lastFlush;
time_t lastFlushModeOnly;
bool message;
int reclength;
bool timeShiftActive;
eRecType_t timeShiftActive;
int timeShiftFramesTotal;
int timeShiftLength;
cString timeshiftrest;
cString timeShiftDuration;
bool timersLoaded;
cGlobalTimers globalTimers;
void GetGlobalTimers(void);
void SetViewElements(void);
void ClearVariables(void);
void SetViewElementObjects(void);
@ -41,14 +46,12 @@ public:
virtual ~cViewReplay(void);
void PreCache(void);
void SetModeOnly(bool modeOnly) { this->modeOnly = modeOnly; };
void SetRecordingLength(int length) { reclength = length; };
void SetTimeShift(int framesTotal, int timeShiftLength);
void SetRecording(const cRecording *recording);
void SetTimeShiftValues(int current, int total);
void SetTitle(const char *title);
void GetTimers(void);
void SetTimeShiftValues(const cRecording *recording);
void SetCurrent(const char *current);
void SetTotal(const char *total);
void SetTimeshiftTimes(int current, int total);
void SetEndTime(int current, int total);
void SetProgressbar(int current, int total);
void SetMarks(const cMarks *marks, int current, int total);

View File

@ -147,6 +147,8 @@ cViewElement *cViewElement::CreateViewElement(const char *name, const char *view
e = new cVeDmTemperatures();
else if (!strcmp(name, "vdrstatistics"))
e = new cVeDmVdrstatistics();
else if (!strcmp(name, "vdrstatus"))
e = new cVeDmVdrstatus();
else if (!strcmp(name, "lastrecordings"))
e = new cVeDmLastrecordings();
else if (!strcmp(name, "detailheaderepg"))
@ -169,6 +171,8 @@ cViewElement *cViewElement::CreateViewElement(const char *name, const char *view
e = new cVeDrCurrentTime();
else if (!strcmp(name, "totaltime"))
e = new cVeDrTotalTime();
else if (!strcmp(name, "timeshifttimes"))
e = new cVeDrTimeshiftTimes();
else if (!strcmp(name, "endtime"))
e = new cVeDrEndTime();
else if (!strcmp(name, "progressbar") && !strcmp(viewname, "displayreplay"))
@ -583,77 +587,118 @@ void cViewElement::StopAnimation(void) {
/******************************************************************
* helper function (did not find any other common place)
******************************************************************/
bool RecordingIsHD(const cEvent* event) {
bool RecordingIsHD(const cEvent* event, const tChannelID channelID) {
// detect HD from 'info'
bool isHD = false;
cComponents *Components = (cComponents *)event->Components();
if (Components) {
// detect HD (see also ETSI EN 300 468)
// Stream: 1 = MPEG2-Video, 2 = MPEG2 Audio, 3 = Untertitel, 4 = AC3-Audio, 5 = H.264-Video, 6 = HEAAC-Audio, 7 = DTS/DTS HD audio, 8 = SRM/CPCM data, 9 = HEVC Video, AC4 Audio
// Stream == Video(1|5): 01 = 05 = 4:3, 02 = 03 = 06 = 07 = 16:9, 04 = 08 = >16:9, 09 = 0D = HD 4:3, 0A = 0B = 0E = 0F = HD 16:9, 0C = 10 = HD >16:9
int type = -1;
tComponent *Component;
int type = -1;
if (event) {
cComponents *Components = (cComponents *)event->Components();
if (Components) {
// detect HD (see also ETSI EN 300 468)
// Stream: 1 = MPEG2-Video, 2 = MPEG2 Audio, 3 = Untertitel, 4 = AC3-Audio, 5 = H.264-Video, 6 = HEAAC-Audio, 7 = DTS/DTS HD audio, 8 = SRM/CPCM data, 9 = HEVC Video, AC4 Audio
// Stream == Video(1|5): 01 = 05 = 4:3, 02 = 03 = 06 = 07 = 16:9, 04 = 08 = >16:9, 09 = 0D = HD 4:3, 0A = 0B = 0E = 0F = HD 16:9, 0C = 10 = HD >16:9
// #1: HVEC (stream content: 9)
Component = Components->GetComponent(0, 9, 0); // recording info: "X 9 <type>"
if (Component) {
isHD = true; // HVEC is always HD, type 4|5|6|7 would be even UHD (see below dedicated detection function)
} else {
// #2: H.264 (stream content: 5)
Component = Components->GetComponent(0, 5, 0); // recording info: "X 5 <type>"
if (Component) {
type = Component->type;
} else {
// #3: MPEG2 (stream content: 1)
Component = Components->GetComponent(0, 1, 0); // recording info: "X 1 <type>"
if (Component) {
type = Component->type;
};
};
};
tComponent *Component;
// #1: HVEC (stream content: 9)
Component = Components->GetComponent(0, 9, 0); // recording info: "X 9 <type>"
if (Component) {
isHD = true; // HVEC is always HD, type 4|5|6|7 would be even UHD (see below dedicated detection function)
} else {
// #2: H.264 (stream content: 5)
Component = Components->GetComponent(0, 5, 0); // recording info: "X 5 <type>"
if (Component) {
type = Component->type;
} else {
// #3: MPEG2 (stream content: 1)
Component = Components->GetComponent(0, 1, 0); // recording info: "X 1 <type>"
if (Component) {
type = Component->type;
};
};
};
switch (type) {
case 0x09:
case 0x0A:
case 0x0B:
case 0x0C:
case 0x0D:
case 0x0E:
case 0x0F:
case 0x10:
isHD = true;
};
switch (type) {
case 0x09:
case 0x0A:
case 0x0B:
case 0x0C:
case 0x0D:
case 0x0E:
case 0x0F:
case 0x10:
isHD = true;
};
};
};
if ((isHD == false) && (type == -1) && (!(channelID == tChannelID::InvalidID))) {
// fallback to retrieve via channel (in case of EPG issues)
#if defined (APIVERSNUM) && (APIVERSNUM >= 20301)
LOCK_CHANNELS_READ;
const cChannel *channel = Channels->GetByChannelID(channelID);
#else
const cChannel *channel = Channels.GetByChannelID(channelID);
#endif
if (channel) {
switch (channel->Vtype()) {
case 0x1b: // H.264
case 0x24: // H.265
isHD = true;
break;
};
};
};
return isHD;
};
bool RecordingIsUHD(const cEvent* event) {
bool RecordingIsUHD(const cEvent* event, const tChannelID channelID) {
// detect UHD from 'info'
bool isUHD = false;
cComponents *Components = (cComponents *)event->Components();
if (Components) {
// detect UHD (see also ETSI EN 300 468)
// Stream: 9 = HEVC Video, AC4 Audio
// Stream == Video(9): 00|01|02|03 = HD, 04|05|06|07 = UHD
int type = -1;
tComponent *Component;
int type = -1;
if (event) {
cComponents *Components = (cComponents *)event->Components();
if (Components) {
// detect UHD (see also ETSI EN 300 468)
// Stream: 9 = HEVC Video, AC4 Audio
// Stream == Video(9): 00|01|02|03 = HD, 04|05|06|07 = UHD
// HVEC (stream content: 9)
Component = Components->GetComponent(0, 9, 0); // recording info: "X 9 <type>"
if (Component) {
type = Component->type;
};
tComponent *Component;
// HVEC (stream content: 9)
Component = Components->GetComponent(0, 9, 0); // recording info: "X 9 <type>"
if (Component) {
type = Component->type;
};
switch (type) {
case 0x04:
case 0x05:
case 0x06:
case 0x07:
isUHD = true;
};
switch (type) {
case 0x04:
case 0x05:
case 0x06:
case 0x07:
isUHD = true;
};
};
};
if ((isUHD == false) && (type == -1) && (!(channelID == tChannelID::InvalidID))) {
// fallback to retrieve via channel (in case of EPG issues)
#if defined (APIVERSNUM) && (APIVERSNUM >= 20301)
LOCK_CHANNELS_READ;
const cChannel *channel = Channels->GetByChannelID(channelID);
#else
const cChannel *channel = Channels.GetByChannelID(channelID);
#endif
if (channel) {
switch (channel->Vtype()) {
case 0x24: // H.265
isUHD = true;
break;
};
};
};
return isUHD;
};
@ -665,50 +710,50 @@ bool RecordingIsRadio(const cEvent* event, const double FramesPerSecond) {
cComponents *Components = (cComponents *)event->Components();
if (Components) {
// Stream: 1 = MPEG2-Video, 2 = MPEG2 Audio, 3 = Untertitel, 4 = AC3-Audio, 5 = H.264-Video, 6 = HEAAC-Audio, 7 = DTS/DTS HD audio, 8 = SRM/CPCM data, 9 = HEVC Video, AC4 Audio
// Stream: 1 = MPEG2-Video, 2 = MPEG2 Audio, 3 = Untertitel, 4 = AC3-Audio, 5 = H.264-Video, 6 = HEAAC-Audio, 7 = DTS/DTS HD audio, 8 = SRM/CPCM data, 9 = HEVC Video, AC4 Audio
tComponent *Component;
tComponent *Component;
Component = Components->GetComponent(0, 2, 0); // recording info: "X 2 <type>"
if (Component) {
hasAudio = true;
};
Component = Components->GetComponent(0, 2, 0); // recording info: "X 2 <type>"
if (Component) {
hasAudio = true;
};
Component = Components->GetComponent(0, 4, 0); // recording info: "X 4 <type>"
if (Component) {
hasAudio = true;
};
Component = Components->GetComponent(0, 4, 0); // recording info: "X 4 <type>"
if (Component) {
hasAudio = true;
};
Component = Components->GetComponent(0, 6, 0); // recording info: "X 6 <type>"
if (Component) {
hasAudio = true;
};
Component = Components->GetComponent(0, 6, 0); // recording info: "X 6 <type>"
if (Component) {
hasAudio = true;
};
Component = Components->GetComponent(0, 7, 0); // recording info: "X 7 <type>"
if (Component) {
hasAudio = true;
};
Component = Components->GetComponent(0, 7, 0); // recording info: "X 7 <type>"
if (Component) {
hasAudio = true;
};
Component = Components->GetComponent(0, 1, 0); // recording info: "X 1 <type>"
if (Component) {
hasVideo = true;
};
Component = Components->GetComponent(0, 1, 0); // recording info: "X 1 <type>"
if (Component) {
hasVideo = true;
};
Component = Components->GetComponent(0, 5, 0); // recording info: "X 5 <type>"
if (Component) {
hasVideo = true;
};
Component = Components->GetComponent(0, 5, 0); // recording info: "X 5 <type>"
if (Component) {
hasVideo = true;
};
Component = Components->GetComponent(0, 9, 0); // recording info: "X 9 <type>"
if (Component) {
hasVideo = true;
};
Component = Components->GetComponent(0, 9, 0); // recording info: "X 9 <type>"
if (Component) {
hasVideo = true;
};
};
if ((hasAudio == true) && (hasVideo == false)) {
if (FramesPerSecond < 24) { // workaround for issue of missing "X 1" on some SD channels (e.g. RTL)
isRadio = true;
};
if (FramesPerSecond < 24) { // workaround for issue of missing "X 1" on some SD channels (e.g. RTL)
isRadio = true;
};
};
return isRadio;

View File

@ -113,8 +113,8 @@ public:
/******************************************************************
* helper function (did not find any other common place)
******************************************************************/
bool RecordingIsHD(const cEvent* event);
bool RecordingIsUHD(const cEvent* event);
bool RecordingIsHD(const cEvent* event, const tChannelID channelID);
bool RecordingIsUHD(const cEvent* event, const tChannelID channelID);
bool RecordingIsRadio(const cEvent* event, const double FramesPerSecond);
#endif //__VIEWELEMENT_H

View File

@ -160,12 +160,12 @@ bool cVeMessage::Parse(bool forced) {
* cVeDevices
******************************************************************/
cVeDevices::cVeDevices(void) {
lastRefresh = 0;
initial = true;
devicesIndex = -1;
lastSignalStrength = NULL;
lastSignalQuality = NULL;
recDevices = NULL;
lastRecDevices = NULL;
}
cVeDevices::~cVeDevices(void) {
@ -176,6 +176,8 @@ cVeDevices::~cVeDevices(void) {
lastSignalQuality = NULL;
delete[] recDevices;
recDevices = NULL;
delete[] lastRecDevices;
lastRecDevices = NULL;
mutexDevices.Unlock();
}
@ -193,11 +195,13 @@ void cVeDevices::Init(void) {
lastSignalStrength = new int[numDevices];
lastSignalQuality = new int[numDevices];
recDevices = new bool[numDevices];
lastRecDevices = new bool[numDevices];
mutexDevices.Lock();
for (int i=0; i<numDevices; i++) {
lastSignalStrength[i] = 0;
lastSignalQuality[i] = 0;
recDevices[i] = false;
lastRecDevices[i] = false;
}
mutexDevices.Unlock();
}
@ -205,7 +209,6 @@ void cVeDevices::Init(void) {
void cVeDevices::Close(void) {
devices.clear();
initial = true;
lastRefresh = 0;
numDevices = 0;
mutexDevices.Lock();
delete[] lastSignalStrength;
@ -214,6 +217,8 @@ void cVeDevices::Close(void) {
lastSignalQuality = NULL;
delete[] recDevices;
recDevices = NULL;
delete[] lastRecDevices;
lastRecDevices = NULL;
mutexDevices.Unlock();
cViewElement::Close();
}
@ -243,17 +248,17 @@ void cVeDevices::SetTokenContainer(void) {
bool cVeDevices::Parse(bool forced) {
if (!cViewElement::Parse(forced))
return false;
bool changed = false;
if (initial) {
Init();
initial = false;
changed = true;
} else {
//in light modus content is static
if (light)
return false;
//check if drawing is necessary
if (cTimeMs::Now() - lastRefresh < 500)
return false;
bool changed = false;
for (int i = 0; i < numDevices; i++) {
const cDevice *device = cDevice::GetDevice(devices[i]);
if (!device || !device->NumProvidedSystems()) {
@ -272,22 +277,15 @@ bool cVeDevices::Parse(bool forced) {
if ((signalStrength != lastSigStr) || (signalQuality != lastSigQual)) {
changed = true;
break;
}
}
if (!changed) {
return false;
}
}
}
//check device which currently displays live tv
int deviceLiveTV = -1;
cDevice *primaryDevice = cDevice::PrimaryDevice();
if (primaryDevice) {
if (!primaryDevice->Replaying() || primaryDevice->Transferring())
deviceLiveTV = cDevice::ActualDevice()->DeviceNumber();
else
deviceLiveTV = primaryDevice->DeviceNumber();
// reset recording devices
for (int i = 0; i < numDevices; i++) {
recDevices[i] = false;
}
// check currently recording devices
// BLOCK for LOCK_TIMERS_READ scope !!
{
@ -305,12 +303,40 @@ bool cVeDevices::Parse(bool forced) {
const cDevice *recDevice = RecordControl->Device();
if (recDevice) {
mutexDevices.Lock();
if (recDevices)
recDevices[recDevice->DeviceNumber()] = true;
if (recDevices) {
int d = recDevice->DeviceNumber();
for (int i = 0; i < numDevices; i++) {
if (devices[i] == d) {
recDevices[i] = true;
break;
}
}
}
mutexDevices.Unlock();
}
}
}
} // LOCK_TIMERS_READ
for (int i = 0; i < numDevices; i++) {
if (recDevices[i] != lastRecDevices[i]) {
lastRecDevices[i] = recDevices[i];
changed = true;
}
}
if (!changed) {
return false;
}
//check device which currently displays live tv
int deviceLiveTV = -1;
cDevice *primaryDevice = cDevice::PrimaryDevice();
if (primaryDevice) {
if (!primaryDevice->Replaying() || primaryDevice->Transferring())
deviceLiveTV = cDevice::ActualDevice()->DeviceNumber();
else
deviceLiveTV = primaryDevice->DeviceNumber();
}
//create loop container
@ -326,7 +352,7 @@ bool cVeDevices::Parse(bool forced) {
if (!device || !device->NumProvidedSystems()) {
continue;
}
tokenContainer->AddLoopToken(devicesIndex, i, (int)eDevicesLT::num, *cString::sprintf("%d", i));
tokenContainer->AddLoopToken(devicesIndex, i, (int)eDevicesLT::num, *cString::sprintf("%d", i + 1));
tokenContainer->AddLoopToken(devicesIndex, i, (int)eDevicesLT::type, *(device->DeviceType()));
cCamSlot *camSlot = device->CamSlot();
@ -347,14 +373,8 @@ bool cVeDevices::Parse(bool forced) {
}
tokenContainer->AddLoopToken(devicesIndex, i, (int)eDevicesLT::signalstrength, *cString::sprintf("%d", signalStrength));
tokenContainer->AddLoopToken(devicesIndex, i, (int)eDevicesLT::signalquality, *cString::sprintf("%d", signalQuality));
tokenContainer->AddLoopToken(devicesIndex, i, (int)eDevicesLT::livetv, i == deviceLiveTV ? "1" : "0");
bool isRecording = false;
mutexDevices.Lock();
if (recDevices && recDevices[i])
isRecording = true;
mutexDevices.Unlock();
tokenContainer->AddLoopToken(devicesIndex, i, (int)eDevicesLT::recording, isRecording ? "1" : "0");
tokenContainer->AddLoopToken(devicesIndex, i, (int)eDevicesLT::livetv, devices[i] == deviceLiveTV ? "1" : "0");
tokenContainer->AddLoopToken(devicesIndex, i, (int)eDevicesLT::recording, (recDevices && recDevices[i]) ? "1" : "0");
const cChannel *channel = device->GetCurrentlyTunedTransponder();
const cSource *source = (channel) ? Sources.Get(channel->Source()) : NULL;
@ -380,7 +400,6 @@ bool cVeDevices::Parse(bool forced) {
}
SetDirty();
lastRefresh = cTimeMs::Now();
return true;
}
/******************************************************************
@ -538,4 +557,4 @@ bool cVeVolume::Parse(bool forced) {
changed = false;
SetDirty();
return true;
}
}

View File

@ -51,7 +51,6 @@ public:
class cVeDevices : public cViewElement {
private:
bool light;
time_t lastRefresh;
vector<int> devices;
bool initial;
int devicesIndex;
@ -60,6 +59,7 @@ private:
int* lastSignalStrength;
int* lastSignalQuality;
bool* recDevices;
bool* lastRecDevices;
void Init(void);
public:
cVeDevices(void);
@ -107,4 +107,4 @@ public:
void Set(int current, int total, bool mute);
bool Parse(bool forced = false);
};
#endif //__VIEWELEMENTSCOMMON_H
#endif //__VIEWELEMENTSCOMMON_H

View File

@ -112,6 +112,8 @@ const char *cVeDcChannelGroup::GetChannelSep(const cChannel *c, bool prev) {
******************************************************************/
cVeDcEpgInfo::cVeDcEpgInfo(void) {
globalTimers = NULL;
current = NULL;
next = NULL;
}
cVeDcEpgInfo::~cVeDcEpgInfo(void) {
@ -141,50 +143,74 @@ void cVeDcEpgInfo::SetTokenContainer(void) {
InheritTokenContainer();
}
void cVeDcEpgInfo::Set(const cEvent *p, const cEvent *f) {
bool cVeDcEpgInfo::Parse(bool force) {
if (!cViewElement::Parse(force))
return false;
tokenContainer->Clear();
if (p) {
tokenContainer->AddStringToken((int)eDCEpgInfoST::currenttitle, p->Title());
tokenContainer->AddStringToken((int)eDCEpgInfoST::currentsubtitle, p->ShortText());
tokenContainer->AddStringToken((int)eDCEpgInfoST::currentstart, *p->GetTimeString());
tokenContainer->AddStringToken((int)eDCEpgInfoST::currentstop, *p->GetEndTimeString());
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentduration, p->Duration() / 60);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentdurationhours, p->Duration() / 3600);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentdurationminutes, (p->Duration() / 60) % 60);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentelapsed, (int)round((time(NULL) - p->StartTime())/60));
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentremaining, (int)round((p->EndTime() - time(NULL))/60));
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentrecording, EventHasTimer(p));
tokenContainer->AddIntToken((int)eDCEpgInfoIT::hasVPS, (bool)p->Vps());
if (current) {
tokenContainer->AddStringToken((int)eDCEpgInfoST::currenttitle, current->Title());
tokenContainer->AddStringToken((int)eDCEpgInfoST::currentsubtitle, current->ShortText());
tokenContainer->AddStringToken((int)eDCEpgInfoST::currentstart, *current->GetTimeString());
tokenContainer->AddStringToken((int)eDCEpgInfoST::currentstop, *current->GetEndTimeString());
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentduration, current->Duration() / 60);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentdurationhours, current->Duration() / 3600);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentdurationminutes, (current->Duration() / 60) % 60);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentelapsed, (int)round((time(NULL) - current->StartTime())/60));
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentremaining, (int)round((current->EndTime() - time(NULL))/60));
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentrecording, EventHasTimer(current));
tokenContainer->AddIntToken((int)eDCEpgInfoIT::hasVPS, (bool)current->Vps());
}
if (f) {
tokenContainer->AddStringToken((int)eDCEpgInfoST::nexttitle, f->Title());
tokenContainer->AddStringToken((int)eDCEpgInfoST::nextsubtitle, f->ShortText());
tokenContainer->AddStringToken((int)eDCEpgInfoST::nextstart, *f->GetTimeString());
tokenContainer->AddStringToken((int)eDCEpgInfoST::nextstop, *f->GetEndTimeString());
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextduration, f->Duration() / 60);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextdurationhours, f->Duration() / 3600);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextdurationminutes, (f->Duration() / 60) % 60);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextrecording, EventHasTimer(f));
tokenContainer->AddIntToken((int)eDCEpgInfoIT::hasVPS, (bool)f->Vps());
if (next) {
tokenContainer->AddStringToken((int)eDCEpgInfoST::nexttitle, next->Title());
tokenContainer->AddStringToken((int)eDCEpgInfoST::nextsubtitle, next->ShortText());
tokenContainer->AddStringToken((int)eDCEpgInfoST::nextstart, *next->GetTimeString());
tokenContainer->AddStringToken((int)eDCEpgInfoST::nextstop, *next->GetEndTimeString());
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextduration, next->Duration() / 60);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextdurationhours, next->Duration() / 3600);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextdurationminutes, (next->Duration() / 60) % 60);
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextrecording, EventHasTimer(next));
tokenContainer->AddIntToken((int)eDCEpgInfoIT::hasVPS, (bool)next->Vps());
}
SetDirty();
return true;
}
void cVeDcEpgInfo::Close(void) {
current = NULL;
next = NULL;
tokenContainer->Clear();
cViewElement::Close();
}
bool cVeDcEpgInfo::EventHasTimer(const cEvent *e) {
if (!e) return false;
bool hasTimer = e->HasTimer();
eTimerMatch TimerMatch = tmNone;
const cTimers *timers;
#if defined (APIVERSNUM) && (APIVERSNUM >= 20301)
{
LOCK_TIMERS_READ;
timers = Timers;
}
#else
timers = &Timers;
#endif
const cTimer *Timer = timers->GetMatch(e, &TimerMatch);
if (Timer && Timer->HasFlags(tfActive)) {
if (TimerMatch == tmFull)
return true;
if (TimerMatch == tmPartial) {
const char *fileName = Timer->File();
if (fileName && *fileName == '@')
return true;
}
}
bool hasTimer = false;
for (int i = 0; i < globalTimers->Size() && !hasTimer; i++)
if (const cTimer *Timer = globalTimers->At(i))
if (Timer->Channel() && (Timer->Channel()->GetChannelID() == e->ChannelID()))
if (const cEvent *timerEvent = Timer->Event())
if (e->EventID() == timerEvent->EventID())
hasTimer = true;
return hasTimer;
}
@ -204,6 +230,7 @@ void cVeDcProgressBar::Close(void) {
currentLast = -1;
startTime = -1;
duration = -1;
tokenContainer->Clear();
cViewElement::Close();
}
@ -216,16 +243,19 @@ void cVeDcProgressBar::SetTokenContainer(void) {
tokenContainer->DefineIntToken("{remaining}", (int)eDCProgressBarIT::remaining);
tokenContainer->DefineIntToken("{permashift}", (int)eDCProgressBarIT::permashift);
tokenContainer->DefineIntToken("{livebuffer}", (int)eDCProgressBarIT::livebuffer);
tokenContainer->DefineIntToken("{currentremaining}", (int)eDCProgressBarIT::currentremaining);
InheritTokenContainer();
}
void cVeDcProgressBar::Set(const cEvent *p) {
if (!p) {
startTime = -1;
endTime = -1;
duration = -1;
return;
}
startTime = p->StartTime();
endTime = p-> EndTime();
duration = p->Duration();
int current = 0;
@ -249,18 +279,24 @@ void cVeDcProgressBar::Set(const cEvent *p) {
} else {
tokenContainer->AddIntToken((int)eDCProgressBarIT::permashift, 0);
}
tokenContainer->AddIntToken((int)eDCProgressBarIT::currentremaining, (int)round((endTime - t) / 60));
}
bool cVeDcProgressBar::Parse(bool force) {
if (!cViewElement::Parse(force))
return false;
int current = 0;
time_t t = time(NULL);
if (t > startTime)
current = t - startTime;
if (!(current > currentLast + 3) && !force && !Dirty())
return false;
currentLast = current;
SetDirty();
if (duration <= 0) {
tokenContainer->AddIntToken((int)eDCProgressBarIT::duration, 0);
tokenContainer->AddIntToken((int)eDCProgressBarIT::elapsed, 0);
@ -276,6 +312,7 @@ bool cVeDcProgressBar::Parse(bool force) {
} else {
tokenContainer->AddIntToken((int)eDCProgressBarIT::permashift, 0);
}
tokenContainer->AddIntToken((int)eDCProgressBarIT::currentremaining, (int)round((endTime - t) / 60));
}
return true;
}
@ -583,7 +620,8 @@ void cVeDcScraperContent::SetTokenContainer(void) {
void cVeDcScraperContent::Set(const cEvent *e) {
tokenContainer->Clear();
SetPosterBanner(tokenContainer, e, NULL);
if (e)
SetPosterBanner(tokenContainer, e, NULL);
SetDirty();
}

View File

@ -34,6 +34,8 @@ public:
******************************************************************/
class cVeDcEpgInfo : public cViewElement {
private:
const cEvent *current;
const cEvent *next;
cGlobalTimers *globalTimers;
bool EventHasTimer(const cEvent *e);
public:
@ -41,8 +43,9 @@ public:
virtual ~cVeDcEpgInfo(void);
void SetGlobalTimers(cGlobalTimers *globalTimers) { this->globalTimers = globalTimers; };
void SetTokenContainer(void);
void Set(const cEvent *p, const cEvent *f);
void Set(const cEvent *p, const cEvent *f) { this->current = p; this->next = f; };
void Close(void);
bool Parse(bool forced = false);
};
/******************************************************************
* cVeDcProgressBar
@ -51,6 +54,7 @@ class cVeDcProgressBar : public cViewElement {
private:
int currentLast;
int startTime;
int endTime;
int duration;
int GetLiveBuffer(void);
public:
@ -199,4 +203,4 @@ public:
cVeDcGroupChannelListDetail(void) {};
virtual ~cVeDcGroupChannelListDetail(void) {};
};
#endif //__VIEWELEMENTSDC_H
#endif //__VIEWELEMENTSDC_H

View File

@ -391,7 +391,8 @@ bool cVeDmTimers::Parse(bool forced) {
tokenContainer->AddLoopToken(timerIndex, i, (int)eDMTimersLT::isremotetimer, globalTimers.IsRemoteTimer(i) ? "1" : "0");
tokenContainer->AddLoopToken(timerIndex, i, (int)eDMTimersLT::remotehost, globalTimers.RemoteHost(i));
const cEvent *event = Timer->Event();
if (event) {
const char *fileName = Timer->File();
if (event && fileName && !(*fileName == '@')) {
tokenContainer->AddLoopToken(timerIndex, i, (int)eDMTimersLT::title, event->Title());
} else {
const char *File = Setup.FoldersInTimerMenu ? NULL : strrchr(Timer->File(), FOLDERDELIMCHAR);
@ -867,6 +868,41 @@ bool cVeDmVdrstatistics::Parse(bool forced) {
return true;
}
/******************************************************************
* cVeDmVdrstatus
******************************************************************/
cVeDmVdrstatus::cVeDmVdrstatus(void) {
}
cVeDmVdrstatus::~cVeDmVdrstatus(void) {
}
void cVeDmVdrstatus::Close(void) {
cViewElement::Close();
}
void cVeDmVdrstatus::SetTokenContainer(void) {
tokenContainer = new skindesignerapi::cTokenContainer();
tokenContainer->DefineIntToken("{vdrIsRecordingsHandlersActive}", (int)eDMVdrstatusIT::vdrIsRecordingsHandlersActive);
tokenContainer->DefineIntToken("{vdrIsRecording}", (int)eDMVdrstatusIT::vdrIsRecording);
tokenContainer->DefineIntToken("{vdrHasTimers}", (int)eDMVdrstatusIT::vdrHasTimers);
InheritTokenContainer();
}
bool cVeDmVdrstatus::Parse(bool forced) {
if (!cViewElement::Parse(forced))
return false;
cGlobalTimers globalTimers;
globalTimers.LoadTimers();
tokenContainer->Clear();
tokenContainer->AddIntToken((int)eDMVdrstatusIT::vdrIsRecordingsHandlersActive, RecordingsHandler.Active());
tokenContainer->AddIntToken((int)eDMVdrstatusIT::vdrIsRecording, cRecordControls::Active());
tokenContainer->AddIntToken((int)eDMVdrstatusIT::vdrHasTimers, (globalTimers.Size() > 0));
SetDirty();
return true;
}
/******************************************************************
* cVeDmLastrecordings
******************************************************************/
cVeDmLastrecordings::cVeDmLastrecordings(void) {
@ -934,7 +970,7 @@ bool cVeDmLastrecordings::Parse(bool forced) {
int MAX_RECORDINGS = 10;
int availableRecordings = orderedRecs.size();
int numRecordings = min(MAX_RECORDINGS, availableRecordings);
int numRecordings = std::min(MAX_RECORDINGS, availableRecordings);
if (!numRecordings)
return true;
@ -1170,6 +1206,9 @@ void cVeDmDetailheaderRec::SetTokenContainer(void) {
tokenContainer->DefineIntToken("{isHD}", (int)eDmDetailedHeaderRecIT::isHD);
tokenContainer->DefineIntToken("{isUHD}", (int)eDmDetailedHeaderRecIT::isUHD);
tokenContainer->DefineIntToken("{isRadio}", (int)eDmDetailedHeaderRecIT::isRadio);
tokenContainer->DefineIntToken("{isRecording}", (int)eDmDetailedHeaderRecIT::isRecording);
tokenContainer->DefineIntToken("{isInUse}", (int)eDmDetailedHeaderRecIT::isInUse);
tokenContainer->DefineIntToken("{errors}", (int)eDmDetailedHeaderRecIT::errors);
InheritTokenContainer();
}
@ -1190,7 +1229,14 @@ bool cVeDmDetailheaderRec::Parse(bool forced) {
tokenContainer->AddStringToken((int)eDmDetailedHeaderRecST::epgname, info->Title());
tokenContainer->AddStringToken((int)eDmDetailedHeaderRecST::shorttext, info->ShortText());
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::framesPerSecond, info->FramesPerSecond());
int errors = -1;
// ENABLE_ERRORS is only used in VDR-2.5.4 if the coresponding patch is installed, so it can be ignored in other versions
#if (defined (APIVERSNUM) && (APIVERSNUM >= 20505)) || defined (ENABLE_ERRORS)
errors = info->Errors();
#endif
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::errors, errors);
const cEvent *event = info->GetEvent();
tChannelID channelID = tChannelID::InvalidID;
if (event) {
cString recDate = event->GetDateString();
cString recTime = event->GetTimeString();
@ -1215,16 +1261,17 @@ bool cVeDmDetailheaderRec::Parse(bool forced) {
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::durationevent, duration);
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::durationeventhours, duration / 60);
tokenContainer->AddStringToken((int)eDmDetailedHeaderRecST::durationeventminutes, *cString::sprintf("%.2d", duration%60));
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::isHD, RecordingIsHD(event)); // detect HD from 'info'
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::isUHD, RecordingIsUHD(event)); // detect UHD from 'info'
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::isRadio, RecordingIsRadio(event, info->FramesPerSecond())); // detect Radio from 'info' and FPS
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::isRecording, recording->IsInUse() & ruTimer);
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::isInUse, recording->IsInUse());
}
if (info->ChannelName() && (strlen(info->ChannelName()) > 0)) {
tokenContainer->AddStringToken((int)eDmDetailedRecST::recchannelname, info->ChannelName());
tokenContainer->AddStringToken((int)eDmDetailedRecST::recchannelid, info->ChannelID().ToString());
tokenContainer->AddIntToken((int)eDmDetailedRecIT::recchannelnumber, 0); // cannot be provided, for backward compatibility only
} else {
if (info->ChannelName() && (strlen(info->ChannelName()) > 0)) {
tokenContainer->AddStringToken((int)eDmDetailedHeaderRecST::recchannelname, info->ChannelName());
tokenContainer->AddStringToken((int)eDmDetailedHeaderRecST::recchannelid, info->ChannelID().ToString());
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::recchannelnumber, 0); // cannot be provided, for backward compatibility only
channelID = info->ChannelID();
} else {
#if defined (APIVERSNUM) && (APIVERSNUM >= 20301)
LOCK_CHANNELS_READ;
const cChannel *channel = Channels->GetByChannelID(info->ChannelID());
@ -1232,11 +1279,15 @@ bool cVeDmDetailheaderRec::Parse(bool forced) {
const cChannel *channel = Channels.GetByChannelID(info->ChannelID());
#endif
if (channel) {
tokenContainer->AddStringToken((int)eDmDetailedRecST::recchannelname, channel->Name());
tokenContainer->AddStringToken((int)eDmDetailedRecST::recchannelid, *channel->GetChannelID().ToString());
tokenContainer->AddIntToken((int)eDmDetailedRecIT::recchannelnumber, channel->Number());
}
}
tokenContainer->AddStringToken((int)eDmDetailedHeaderRecST::recchannelname, channel->Name());
tokenContainer->AddStringToken((int)eDmDetailedHeaderRecST::recchannelid, *channel->GetChannelID().ToString());
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::recchannelnumber, channel->Number());
channelID = channel->GetChannelID();
}
}
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::isHD, RecordingIsHD(event, channelID)); // detect HD from 'info'
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::isUHD, RecordingIsUHD(event, channelID)); // detect UHD from 'info'
}
string recImage = "";
string path = recording->FileName() ? recording->FileName() : "";
@ -1336,6 +1387,3 @@ bool cVeDmTablabels::Parse(bool forced) {
}
return true;
}

View File

@ -178,6 +178,18 @@ public:
bool Parse(bool forced = false);
};
/******************************************************************
* cVeDmVdrstatus
******************************************************************/
class cVeDmVdrstatus : public cViewElement {
public:
cVeDmVdrstatus(void);
virtual ~cVeDmVdrstatus(void);
void Close(void);
void SetTokenContainer(void);
bool Parse(bool forced = false);
};
/******************************************************************
* cVeDmLastrecordings
******************************************************************/
@ -253,4 +265,4 @@ public:
void SetActiveTab(int activeTab) { SetDirty(); this->activeTab = activeTab; };
bool Parse(bool forced = false);
};
#endif //__VIEWELEMENTSDM_H
#endif //__VIEWELEMENTSDM_H

View File

@ -8,7 +8,9 @@
******************************************************************/
cVeDrRecTitle::cVeDrRecTitle(void) {
recording = NULL;
event = NULL;
title = NULL;
timeShiftActive = NoRec;
}
cVeDrRecTitle::~cVeDrRecTitle(void) {
@ -21,14 +23,38 @@ void cVeDrRecTitle::SetTokenContainer(void) {
tokenContainer->DefineStringToken("{recsubtitle}", (int)eDRRecTitleST::recsubtitle);
tokenContainer->DefineStringToken("{recdate}", (int)eDRRecTitleST::recdate);
tokenContainer->DefineStringToken("{rectime}", (int)eDRRecTitleST::rectime);
tokenContainer->DefineStringToken("{eventstart}", (int)eDRRecTitleST::eventstart);
tokenContainer->DefineStringToken("{eventstop}", (int)eDRRecTitleST::eventstop);
tokenContainer->DefineIntToken("{timeshift}", (int)eDRRecTitleIT::timeshift);
InheritTokenContainer();
}
void cVeDrRecTitle::Set(const cRecording *recording) {
void cVeDrRecTitle::Set(const cRecording *recording, const cEvent *event, eRecType_t timeShiftActive) {
this->timeShiftActive = timeShiftActive;
if (this->title) {
free(this->title);
this->title = NULL;
}
if (this->recording)
this->recording = NULL;
if (this->event)
this->event = NULL;
if (!recording)
return;
this->recording = recording;
if (event)
this->event = event;
}
void cVeDrRecTitle::Set(const char *title) {
if (this->title) {
free(this->title);
this->title = NULL;
}
if (this->recording)
this->recording = NULL;
if (this->event)
this->event = NULL;
if (!title)
return;
free(this->title);
@ -44,17 +70,31 @@ bool cVeDrRecTitle::Parse(bool force) {
tokenContainer->Clear();
if (recording) {
const char *recName = NULL;
const char *recShortText = NULL;
const cRecordingInfo *recInfo = recording->Info();
if (recInfo)
if (event) {
recName = event->Title();
recShortText = event->ShortText();
} else if (recInfo) {
recName = recInfo->Title();
if (!recName)
recShortText = recInfo->ShortText();
}
if (!recName) {
recName = recording->Name();
recShortText = "";
}
tokenContainer->AddStringToken((int)eDRRecTitleST::rectitle, recName);
tokenContainer->AddStringToken((int)eDRRecTitleST::recsubtitle, recInfo ? recInfo->ShortText() : "");
tokenContainer->AddStringToken((int)eDRRecTitleST::recsubtitle, recShortText);
tokenContainer->AddStringToken((int)eDRRecTitleST::recdate, *ShortDateString(recording->Start()));
tokenContainer->AddStringToken((int)eDRRecTitleST::rectime, *TimeString(recording->Start()));
tokenContainer->AddStringToken((int)eDRRecTitleST::rectime, *TimeString(recording->Start()));
tokenContainer->AddIntToken((int)eDRRecTitleIT::timeshift, timeShiftActive);
if (event) {
tokenContainer->AddStringToken((int)eDRRecTitleST::eventstart, *TimeString(event->StartTime()));
tokenContainer->AddStringToken((int)eDRRecTitleST::eventstop, *TimeString(event->EndTime()));
}
} else if (title) {
tokenContainer->AddStringToken((int)eDRRecTitleST::rectitle, title);
tokenContainer->AddStringToken((int)eDRRecTitleST::rectitle, title);
}
SetDirty();
@ -79,6 +119,8 @@ void cVeDrRecInfo::SetTokenContainer(void) {
tokenContainer->DefineIntToken("{screenheight}", (int)eDRRecInfoIT::screenheight);
tokenContainer->DefineIntToken("{isHD}", (int)eDRRecInfoIT::isHD);
tokenContainer->DefineIntToken("{isUHD}", (int)eDRRecInfoIT::isUHD);
tokenContainer->DefineIntToken("{isRecording}", (int)eDRRecInfoIT::isRecording);
tokenContainer->DefineIntToken("{isInUse}", (int)eDRRecInfoIT::isInUse);
tokenContainer->DefineIntToken("{isWideScreen}", (int)eDRRecInfoIT::isWideScreen);
InheritTokenContainer();
}
@ -108,6 +150,8 @@ bool cVeDrRecInfo::Parse(bool force) {
tokenContainer->AddIntToken((int)eDRRecInfoIT::screenheight, screenHeight);
tokenContainer->AddIntToken((int)eDRRecInfoIT::isHD, isHD);
tokenContainer->AddIntToken((int)eDRRecInfoIT::isUHD, isUHD);
tokenContainer->AddIntToken((int)eDRRecInfoIT::isRecording, recording->IsInUse() & ruTimer);
tokenContainer->AddIntToken((int)eDRRecInfoIT::isInUse, recording->IsInUse());
tokenContainer->AddIntToken((int)eDRRecInfoIT::isWideScreen, isWideScreen);
tokenContainer->AddStringToken((int)eDRRecInfoST::resolution, resName.c_str());
tokenContainer->AddStringToken((int)eDRRecInfoST::aspect, aspectName.c_str());
@ -122,6 +166,7 @@ bool cVeDrRecInfo::Parse(bool force) {
cVeDrCurrentTime::cVeDrCurrentTime(void) {
changed = true;
current = NULL;
timeShiftActive = NoRec;
}
cVeDrCurrentTime::~cVeDrCurrentTime(void) {
@ -131,14 +176,16 @@ cVeDrCurrentTime::~cVeDrCurrentTime(void) {
void cVeDrCurrentTime::SetTokenContainer(void) {
tokenContainer = new skindesignerapi::cTokenContainer();
tokenContainer->DefineStringToken("{reccurrent}", (int)eDRCurrentTimeST::reccurrent);
tokenContainer->DefineIntToken("{timeshift}", (int)eDRCurrentTimeIT::timeshift);
InheritTokenContainer();
}
void cVeDrCurrentTime::Set(const char *current) {
void cVeDrCurrentTime::Set(const char *current, eRecType_t timeShiftActive) {
if (!current)
return;
free(this->current);
this->current = strdup(current);
this->timeShiftActive = timeShiftActive;
changed = true;
}
@ -147,6 +194,7 @@ bool cVeDrCurrentTime::Parse(bool force) {
return false;
tokenContainer->Clear();
tokenContainer->AddStringToken((int)eDRCurrentTimeST::reccurrent, current);
tokenContainer->AddIntToken((int)eDRCurrentTimeIT::timeshift, timeShiftActive);
SetDirty();
changed = false;
return true;
@ -158,8 +206,8 @@ bool cVeDrCurrentTime::Parse(bool force) {
cVeDrTotalTime::cVeDrTotalTime(void) {
changed = true;
total = NULL;
timeshiftActive = false;
timeshiftDuration = NULL;
timeShiftActive = NoRec;
}
cVeDrTotalTime::~cVeDrTotalTime(void) {
@ -175,12 +223,12 @@ void cVeDrTotalTime::SetTokenContainer(void) {
InheritTokenContainer();
}
void cVeDrTotalTime::Set(const char *total, bool timeshiftActive, const char *timeshiftDuration) {
void cVeDrTotalTime::Set(const char *total, const char *timeshiftDuration, eRecType_t timeShiftActive) {
if (!total)
return;
free(this->total);
this->total = strdup(total);
this->timeshiftActive = timeshiftActive;
this->timeShiftActive = timeShiftActive;
free(this->timeshiftDuration);
this->timeshiftDuration = NULL;
if (timeshiftDuration)
@ -194,7 +242,53 @@ bool cVeDrTotalTime::Parse(bool force) {
tokenContainer->Clear();
tokenContainer->AddStringToken((int)eDRTotalTimeST::rectotal, total);
tokenContainer->AddStringToken((int)eDRTotalTimeST::timeshifttotal, timeshiftDuration);
tokenContainer->AddIntToken((int)eDRTotalTimeIT::timeshift, timeshiftActive);
tokenContainer->AddIntToken((int)eDRTotalTimeIT::timeshift, timeShiftActive);
SetDirty();
changed = false;
return true;
}
/******************************************************************
* cVeDrTimeshiftTimes
******************************************************************/
cVeDrTimeshiftTimes::cVeDrTimeshiftTimes(void) {
changed = true;
start = "";
playbacktime = "";
timeshiftrest = "";
timeShiftActive = NoRec;
}
cVeDrTimeshiftTimes::~cVeDrTimeshiftTimes(void) {
}
void cVeDrTimeshiftTimes::SetTokenContainer(void) {
tokenContainer = new skindesignerapi::cTokenContainer();
tokenContainer->DefineStringToken("{recstart}", (int)eDRTimeshiftTimesST::recstart);
tokenContainer->DefineStringToken("{playbacktime}", (int)eDRTimeshiftTimesST::playbacktime);
tokenContainer->DefineStringToken("{timeshiftrest}", (int)eDRTimeshiftTimesST::timeshiftrest);
tokenContainer->DefineIntToken("{timeshift}", (int)eDRTimeshiftTimesIT::timeshift);
InheritTokenContainer();
}
void cVeDrTimeshiftTimes::Set(cString start, cString playbacktime, cString timeshiftrest, eRecType_t timeShiftActive) {
this->timeShiftActive = timeShiftActive;
if (strcmp(*this->start, *start) || strcmp(*this->playbacktime, *playbacktime) || strcmp(*this->timeshiftrest, *timeshiftrest)) {
this->start = start;
this->playbacktime = playbacktime;
this->timeshiftrest = timeshiftrest;
changed = true;
}
}
bool cVeDrTimeshiftTimes::Parse(bool force) {
if (!cViewElement::Parse(force) || !changed)
return false;
tokenContainer->Clear();
tokenContainer->AddStringToken((int)eDRTimeshiftTimesST::recstart, *start);
tokenContainer->AddStringToken((int)eDRTimeshiftTimesST::playbacktime, *playbacktime);
tokenContainer->AddStringToken((int)eDRTimeshiftTimesST::timeshiftrest, *timeshiftrest);
tokenContainer->AddIntToken((int)eDRTimeshiftTimesIT::timeshift, timeShiftActive);
SetDirty();
changed = false;
return true;
@ -204,7 +298,9 @@ bool cVeDrTotalTime::Parse(bool force) {
* cVeDrEndTime
******************************************************************/
cVeDrEndTime::cVeDrEndTime(void) {
changed = true;
end = "";
timeShiftActive = NoRec;
}
cVeDrEndTime::~cVeDrEndTime(void) {
@ -213,10 +309,12 @@ cVeDrEndTime::~cVeDrEndTime(void) {
void cVeDrEndTime::SetTokenContainer(void) {
tokenContainer = new skindesignerapi::cTokenContainer();
tokenContainer->DefineStringToken("{recend}", (int)eDREndTimeST::recend);
tokenContainer->DefineIntToken("{timeshift}", (int)eDREndTimeIT::timeshift);
InheritTokenContainer();
}
void cVeDrEndTime::Set(cString end) {
void cVeDrEndTime::Set(cString end, eRecType_t timeShiftActive) {
this->timeShiftActive = timeShiftActive;
if (strcmp(*this->end, *end)) {
this->end = end;
changed = true;
@ -228,6 +326,7 @@ bool cVeDrEndTime::Parse(bool force) {
return false;
tokenContainer->Clear();
tokenContainer->AddStringToken((int)eDREndTimeST::recend, *end);
tokenContainer->AddIntToken((int)eDREndTimeIT::timeshift, timeShiftActive);
SetDirty();
changed = false;
return true;
@ -239,8 +338,8 @@ bool cVeDrEndTime::Parse(bool force) {
cVeDrProgressBar::cVeDrProgressBar(void) {
current = -1;
total = -1;
timeshiftActive = false;
timeshiftTotal = -1;
timeShiftActive = NoRec;
changed = true;
}
@ -256,13 +355,14 @@ void cVeDrProgressBar::SetTokenContainer(void) {
InheritTokenContainer();
}
void cVeDrProgressBar::Set(int current, int total, bool timeshiftActive, int timeshiftTotal) {
if (this->current == current)
void cVeDrProgressBar::Set(int current, int total, eRecType_t timeShiftActive, int timeshiftTotal) {
if (!(this->current != current || this->total != total))
return;
this->current = current;
this->total = total;
this->timeshiftActive = timeshiftActive;
this->timeShiftActive = timeShiftActive;
this->timeshiftTotal = timeshiftTotal;
changed = true;
}
@ -273,10 +373,11 @@ bool cVeDrProgressBar::Parse(bool force) {
tokenContainer->Clear();
tokenContainer->AddIntToken((int)eDRProgressbarIT::current, current);
tokenContainer->AddIntToken((int)eDRProgressbarIT::total, total);
tokenContainer->AddIntToken((int)eDRProgressbarIT::timeshift, timeshiftActive);
tokenContainer->AddIntToken((int)eDRProgressbarIT::timeshift, timeShiftActive);
tokenContainer->AddIntToken((int)eDRProgressbarIT::timeshifttotal, timeshiftTotal);
SetDirty();
changed = false;
return true;
}
@ -285,12 +386,16 @@ bool cVeDrProgressBar::Parse(bool force) {
******************************************************************/
cVeDrCutMarks::cVeDrCutMarks(void) {
cutmarksIndex = -1;
lastMarks = NULL;
Reset();
changed = true;
marks = NULL;
current = -1;
total = -1;
numMarksLast = 0;
timeShiftActive = NoRec;
timeshiftTotal = -1;
}
cVeDrCutMarks::~cVeDrCutMarks(void) {
delete[] lastMarks;
}
void cVeDrCutMarks::SetTokenContainer(void) {
@ -306,34 +411,25 @@ void cVeDrCutMarks::SetTokenContainer(void) {
InheritTokenContainer();
}
void cVeDrCutMarks::Set(const cMarks *marks, int current, int total, bool timeshiftActive, int timeshiftTotal) {
void cVeDrCutMarks::Set(const cMarks *marks, int current, int total, eRecType_t timeShiftActive, int timeshiftTotal) {
int numMarks = marks->Count();
if (!(this->current != current || this->total != total || this->marks != marks || numMarksLast != numMarks))
return;
this->marks = marks;
numMarksLast = numMarks;
this->current = current;
this->total = total;
this->timeshiftActive = timeshiftActive;
this->timeShiftActive = timeShiftActive;
this->timeshiftTotal = timeshiftTotal;
}
void cVeDrCutMarks::Reset(void) {
marks = NULL;
current = -1;
total = -1;
numMarksLast = 0;
delete[] lastMarks;
lastMarks = NULL;
markActive = -1;
timeshiftActive = false;
timeshiftTotal = -1;
changed = true;
}
bool cVeDrCutMarks::Parse(bool force) {
if (!cViewElement::Parse(force))
if (!cViewElement::Parse(force) || !changed)
return false;
if (!marks || !MarksChanged()) {
return false;
}
tokenContainer->Clear();
tokenContainer->AddIntToken((int)eDRCutmarksIT::timeshift, timeshiftActive);
tokenContainer->AddIntToken((int)eDRCutmarksIT::timeshift, timeShiftActive);
int numMarks = marks->Count();
vector<int> cutmarksInfo;
cutmarksInfo.push_back(numMarks);
@ -345,7 +441,7 @@ bool cVeDrCutMarks::Parse(bool force) {
for (const cMark *m = marks->First(); m; m = marks->Next(m)) {
tokenContainer->AddLoopToken(cutmarksIndex, i, (int)eDRCutmarksLT::position, *cString::sprintf("%d", m->Position()));
tokenContainer->AddLoopToken(cutmarksIndex, i, (int)eDRCutmarksLT::total, *tot);
if (timeshiftActive) {
if (timeShiftActive) {
tokenContainer->AddLoopToken(cutmarksIndex, i, (int)eDRCutmarksLT::timeshifttotal, *timeshifttot);
}
tokenContainer->AddLoopToken(cutmarksIndex, i, (int)eDRCutmarksLT::startmark, isStartMark ? "1" : "0");
@ -360,61 +456,10 @@ bool cVeDrCutMarks::Parse(bool force) {
isStartMark = !isStartMark;
}
SetDirty();
changed = false;
return true;
}
bool cVeDrCutMarks::MarksChanged(void) {
bool redraw = false;
//if mark was active, we redraw always
if (markActive >= 0) {
markActive = -1;
redraw = true;
}
//check if current position in recording hits mark exactly
for (const cMark *m = marks->First(); m; m = marks->Next(m)) {
if (m->Position() == current) {
markActive = current;
redraw = true;
break;
}
}
if (redraw)
return true;
//if number of marks has changed, redraw
int numMarks = marks->Count();
if (numMarks != numMarksLast) {
RememberMarks();
return true;
}
if (!lastMarks)
return false;
//if position has changed, redraw
int i=0;
for (const cMark *m = marks->First(); m; m = marks->Next(m)) {
if (m->Position() != lastMarks[i]) {
RememberMarks();
return true;
}
i++;
}
return false;
}
void cVeDrCutMarks::RememberMarks(void) {
if (!marks)
return;
numMarksLast = marks->Count();
if (numMarksLast < 1)
return;
delete[] lastMarks;
lastMarks = new int[numMarksLast];
int i=0;
for (const cMark *m = marks->First(); m; m = marks->Next(m)) {
lastMarks[i] = m->Position();
i++;
}
}
/******************************************************************
* cVeDrControlIcons
******************************************************************/
@ -579,7 +624,7 @@ void cVeDrProgressModeonly::SetTokenContainer(void) {
}
void cVeDrProgressModeonly::Set(double fps, int current, int total) {
if (this->current == current)
if (!(this->current != current || this->total != total))
return;
this->fps = fps;
this->current = current;

View File

@ -4,19 +4,28 @@
#include "viewelement.h"
#include "../extensions/scrapmanager.h"
// define recordingtypes
enum eRecType_t {
NoRec = 0,
NormalRec,
TimeshiftRec
};
/******************************************************************
* cVeDrRecTitle
******************************************************************/
class cVeDrRecTitle : public cViewElement {
private:
const cRecording *recording;
const cEvent *event;
char *title;
eRecType_t timeShiftActive;
public:
cVeDrRecTitle(void);
virtual ~cVeDrRecTitle(void);
void SetTokenContainer(void);
void Set(const cRecording *recording);
void Set(const char *title);
void Set(const cRecording *recording = NULL, const cEvent *event = NULL, eRecType_t timeShiftActive = NoRec);
void Set(const char *title = NULL);
bool Parse(bool forced = false);
};
@ -41,11 +50,12 @@ class cVeDrCurrentTime : public cViewElement {
private:
bool changed;
char *current;
eRecType_t timeShiftActive;
public:
cVeDrCurrentTime(void);
virtual ~cVeDrCurrentTime(void);
void SetTokenContainer(void);
void Set(const char *current);
void Set(const char *current, eRecType_t timeShiftActive = NoRec);
bool Parse(bool forced = false);
};
@ -56,13 +66,31 @@ class cVeDrTotalTime : public cViewElement {
private:
bool changed;
char *total;
bool timeshiftActive;
eRecType_t timeShiftActive;
char *timeshiftDuration;
public:
cVeDrTotalTime(void);
virtual ~cVeDrTotalTime(void);
void SetTokenContainer(void);
void Set(const char *total, bool timeshiftActive, const char *timeshiftDuration);
void Set(const char *total, const char *timeshiftDuration = NULL, eRecType_t timeShiftActive = NoRec);
bool Parse(bool forced = false);
};
/******************************************************************
* cVeDrTimeshiftTimes
******************************************************************/
class cVeDrTimeshiftTimes : public cViewElement {
private:
cString start;
cString playbacktime;
cString timeshiftrest;
bool changed;
eRecType_t timeShiftActive;
public:
cVeDrTimeshiftTimes(void);
virtual ~cVeDrTimeshiftTimes(void);
void SetTokenContainer(void);
void Set(cString start, cString playbacktime, cString timeshiftrest, eRecType_t timeShiftActive = NoRec);
bool Parse(bool forced = false);
};
@ -72,12 +100,13 @@ public:
class cVeDrEndTime : public cViewElement {
private:
cString end;
eRecType_t timeShiftActive;
bool changed;
public:
cVeDrEndTime(void);
virtual ~cVeDrEndTime(void);
void SetTokenContainer(void);
void Set(cString end);
void Set(cString end, eRecType_t timeShiftActive = NoRec);
bool Parse(bool forced = false);
};
@ -88,14 +117,14 @@ class cVeDrProgressBar : public cViewElement {
private:
int current;
int total;
bool timeshiftActive;
eRecType_t timeShiftActive;
int timeshiftTotal;
bool changed;
public:
cVeDrProgressBar(void);
virtual ~cVeDrProgressBar(void);
void SetTokenContainer(void);
void Set(int current, int total, bool timeshiftActive, int timeshiftTotal);
void Set(int current, int total, eRecType_t timeShiftActive = NoRec, int timeshiftTotal = 0);
bool Parse(bool forced = false);
};
@ -108,19 +137,15 @@ private:
const cMarks *marks;
int current;
int total;
bool timeshiftActive;
eRecType_t timeShiftActive;
int timeshiftTotal;
int numMarksLast;
int *lastMarks;
int markActive;
bool MarksChanged(void);
void RememberMarks(void);
bool changed;
public:
cVeDrCutMarks(void);
virtual ~cVeDrCutMarks(void);
void SetTokenContainer(void);
void Set(const cMarks *marks, int current, int total, bool timeshiftActive, int timeshiftTotal);
void Reset(void);
void Set(const cMarks *marks, int current, int total, eRecType_t timeShiftActive = NoRec, int timeshiftTotal = 0);
bool Parse(bool forced = false);
};
@ -207,4 +232,4 @@ public:
bool Parse(bool forced = false);
};
#endif //__VIEWELEMENTSDR_H
#endif //__VIEWELEMENTSDR_H

View File

@ -3,6 +3,7 @@
cSkinDesigner::cSkinDesigner(string skin, cTheme *theme) : cSkin(skin.c_str(), theme) {
init = true;
initialized = false;
this->skin = skin;
backupSkin = NULL;
@ -106,11 +107,11 @@ cSkinDisplayMessage *cSkinDesigner::DisplayMessage(void) {
return displayMessage;
}
void cSkinDesigner::Reload(void) {
int cSkinDesigner::Reload(void) {
dsyslog("skindesigner: forcing full reload of templates");
if (cOsd::IsOpen()) {
esyslog("skindesigner: OSD is open, close first!");
return;
return 2;
}
cStopWatch watch;
@ -120,11 +121,13 @@ void cSkinDesigner::Reload(void) {
if (!backupSkin)
backupSkin = new cSkinLCARS();
useBackupSkin = true;
return 1;
} else {
CacheViews();
useBackupSkin = false;
watch.Stop("templates reloaded and cache created");
}
return 0;
}
void cSkinDesigner::ListAvailableFonts(void) {
@ -213,11 +216,13 @@ void cSkinDesigner::Init(void) {
esyslog("skindesigner: error during loading of templates - using LCARS as backup");
backupSkin = new cSkinLCARS();
useBackupSkin = true;
initialized = true;
} else {
CacheViews();
watch.Stop("templates loaded and caches created");
}
init = false;
initialized = true;
}
else if (config.OsdFontsChanged())
{

View File

@ -22,6 +22,7 @@ class cSkinDesigner;
class cSkinDesigner : public cSkin {
private:
bool init;
bool initialized;
string skin;
cSkinLCARS *backupSkin;
bool useBackupSkin;
@ -51,7 +52,8 @@ public:
virtual cSkinDisplayTracks *DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
virtual cSkinDisplayMessage *DisplayMessage(void);
void ActivateBackupSkin(void) { useBackupSkin = true; };
void Reload(void);
int Reload(void);
bool Initialized(void) { return initialized; };
void ListAvailableFonts(void);
bool SetCustomIntToken(string option);
bool SetCustomStringToken(string option);

View File

@ -1,7 +1,6 @@
#include "displayreplay.h"
cSDDisplayReplay::cSDDisplayReplay(cViewReplay *replayView, bool ModeOnly) {
init = true;
view = replayView;
ok = view->Init();
if (!ok)
@ -16,15 +15,12 @@ cSDDisplayReplay::~cSDDisplayReplay() {
void cSDDisplayReplay::SetRecording(const cRecording *Recording) {
if (ok) {
view->SetRecording(Recording);
if (init) {
view->SetRecordingLength(Recording->LengthInSeconds());
view->SetTimeShiftValues(Recording);
init = false;
}
}
}
void cSDDisplayReplay::SetTitle(const char *Title) {
if (!ok)
return;
view->SetTitle(Title);
}
@ -49,7 +45,9 @@ void cSDDisplayReplay::SetMode(bool Play, bool Forward, int Speed) {
void cSDDisplayReplay::SetProgress(int Current, int Total) {
if (ok) {
view->SetProgressbar(Current, Total);
view->SetMarks(marks, Current, Total);
if (marks)
view->SetMarks(marks, Current, Total);
view->SetTimeshiftTimes(Current, Total);
view->SetEndTime(Current, Total);
view->DelayOnPause();
}
@ -78,6 +76,5 @@ void cSDDisplayReplay::SetMessage(eMessageType Type, const char *Text) {
void cSDDisplayReplay::Flush(void) {
if (!ok)
return;
view->GetTimers();
view->Flush();
}

View File

@ -8,7 +8,6 @@
class cSDDisplayReplay : public cSkinDisplayReplay {
private:
bool ok;
bool init;
cViewReplay *view;
public:
cSDDisplayReplay(cViewReplay *replayView, bool ModeOnly);

View File

@ -2,7 +2,7 @@
<!ENTITY % functions SYSTEM "functions.dtd">
<!ELEMENT displaymenu (background,header,datetime,time*,message,sortmode*,colorbuttons,scrollbar*,
<!ELEMENT displaymenu (background,header,datetime,time*,vdrstatus*,message,sortmode*,colorbuttons,scrollbar*,
menudefault,menumain*,menusetup*,menuschedules*,
menutimers*,menuchannels*,menurecordings*,
menudetailedepg,menudetailedrecording,
@ -218,6 +218,20 @@
condition CDATA #IMPLIED
>
<!ELEMENT vdrstatus (areacontainer|area|areascroll)*>
<!ATTLIST vdrstatus
delay CDATA #IMPLIED
orientation CDATA #IMPLIED
fadetime CDATA #IMPLIED
shifttime CDATA #IMPLIED
shifttype CDATA #IMPLIED
shiftmode CDATA #IMPLIED
startx CDATA #IMPLIED
starty CDATA #IMPLIED
debug CDATA #IMPLIED
condition CDATA #IMPLIED
>
<!ELEMENT currentschedule (areacontainer|area|areascroll)*>
<!ATTLIST currentschedule
delay CDATA #IMPLIED
@ -316,7 +330,7 @@
>
<!ELEMENT menumain (background | header | datetime | time | colorbuttons | scrollbar | sortmode | timers |
discusage | devices | systemload | systemmemory | vdrstatistics | temperatures | currentschedule |
discusage | devices | systemload | systemmemory | vdrstatistics | vdrstatus | temperatures | currentschedule |
currentweather | lastrecordings | customtokens | menuitems)*>
<!ATTLIST menumain
x CDATA #REQUIRED
@ -501,4 +515,4 @@
debug (true|false) #IMPLIED
>
%functions;
%functions;

View File

@ -4,7 +4,7 @@
<!ELEMENT displayreplay (background | backgroundmodeonly |datetime | time |
scrapercontent | currentweather | rectitle | recinfo | currenttime |
totaltime | endtime | progressbar | cutmarks | controlicons |
totaltime | timeshifttimes | endtime | progressbar | cutmarks | controlicons |
controliconsmodeonly | progressmodeonly | jump | message | onpause |
onpausemodeonly | customtokens)*>
<!ATTLIST displayreplay
@ -153,6 +153,19 @@
condition CDATA #IMPLIED
>
<!ELEMENT timeshifttimes (areacontainer|area|areascroll)*>
<!ATTLIST timeshifttimes
delay CDATA #IMPLIED
fadetime CDATA #IMPLIED
shifttime CDATA #IMPLIED
shifttype CDATA #IMPLIED
shiftmode CDATA #IMPLIED
startx CDATA #IMPLIED
starty CDATA #IMPLIED
debug CDATA #IMPLIED
condition CDATA #IMPLIED
>
<!ELEMENT endtime (areacontainer|area|areascroll)*>
<!ATTLIST endtime
delay CDATA #IMPLIED
@ -289,4 +302,4 @@
condition CDATA #IMPLIED
>
%functions;
%functions;

View File

@ -177,14 +177,18 @@ bool cGlobalTimers::IsRecording(const cRecording *rec) {
if (!rec || !rec->Name())
return false;
std::string recName = rec->Name();
time_t recstart = rec->Start();
int size = Size();
for (int i=0; i<size; i++) {
const cTimer *t = At(i);
const char *timerFile = t->File();
if (!t->Matches() || !timerFile)
continue;
if (recName.find(timerFile) != std::string::npos)
return true;
if (recName.find(timerFile) != std::string::npos) {
time_t timerstart = t->StartTime();
if (recstart == timerstart)
return true;
}
}
return false;
}

View File

@ -178,14 +178,22 @@ cImageImporterSVG::cImageImporterSVG() {
cImageImporterSVG::~cImageImporterSVG() {
if (handle) {
#if LIBRSVG_CHECK_VERSION (2, 46, 0)
// rsvg_handle_close is deprecated since version 2.46 and looks like even not required if used with rsvg_handle_new_from_file
#else
rsvg_handle_close(handle, NULL);
#endif
g_object_unref(handle);
}
}
bool cImageImporterSVG::LoadImage(const char *path) {
if (handle) {
#if LIBRSVG_CHECK_VERSION (2, 46, 0)
// rsvg_handle_close is deprecated since version 2.46 and looks like even not required if used with rsvg_handle_new_from_file
#else
rsvg_handle_close(handle, NULL);
#endif
g_object_unref(handle);
}
@ -521,3 +529,5 @@ void cSVGTemplate::ReplaceTokens(string &line, size_t tokenStart, size_t tokenEn
std::replace( svgAlpha.begin(), svgAlpha.end(), ',', '.');
line.replace(hitAlpha, hitAlphaEnd - hitAlpha + 2, svgAlpha);
}
// vim: ts=4 sw=4 et

View File

@ -20,8 +20,7 @@
#error "VDR-2.2.0 API version or greater is required!"
#endif
static const char *VERSION = "1.2.10";
static const char *VERSION = "1.2.18";
static const char *DESCRIPTION = trNOOP("Skin Designer");
class cPluginSkinDesigner : public cPlugin, public skindesignerapi::SkindesignerAPI {
@ -241,6 +240,7 @@ cString cPluginSkinDesigner::SVDRPCommand(const char *Command, const char *Optio
cSkinDesigner *activeSkin = NULL;
cSkinDesigner *availableSkin = NULL;
config.InitSkinRefsIterator();
int result = 0;
while (availableSkin = config.GetNextSkinRef()) {
string activeSkinName = Setup.OSDSkin;
string currentSkinName = availableSkin->Description();
@ -256,6 +256,10 @@ cString cPluginSkinDesigner::SVDRPCommand(const char *Command, const char *Optio
}
if (strcasecmp(Command, "RELD") == 0) {
if (!activeSkin->Initialized()) {
ReplyCode = 503;
return "SKINDESIGNER reload of templates and caches failed: initialization not finished.";
}
config.ClearSkinSetups();
config.InitSkinIterator();
string skin = "";
@ -264,9 +268,21 @@ cString cPluginSkinDesigner::SVDRPCommand(const char *Command, const char *Optio
}
config.TranslateSetup();
config.SetSkinSetupParameters();
activeSkin->Reload();
ReplyCode = 250;
return "SKINDESIGNER reload of templates and caches forced.";
result = activeSkin->Reload();
switch (result) {
case 0:
ReplyCode = 250;
return "SKINDESIGNER reload of templates and caches forced.";
case 1:
ReplyCode = 501;
return "SKINDESIGNER reload of templates and caches failed: error during loading - using LCARS as backup.";
case 2:
ReplyCode = 503;
return "SKINDESIGNER reload of templates and caches failed: OSD is open, close first.";
default:
ReplyCode = 500;
return "SKINDESIGNER reload of templates and caches failed: unknown reason (check code).";
};
} else if (strcasecmp(Command, "DLIC") == 0) {
if (imgCache)
delete imgCache;

View File

@ -23,14 +23,14 @@
<trans lang="de_DE">Wiederholungen</trans>
<trans lang="fi_FI">Uusinnat</trans>
<trans lang="hu_HU">Ismétlés</trans>
<trans lang="it_IT">Riavvii</trans>
<trans lang="it_IT">Repliche</trans>
</token>
<token name="tr(rerunsof)">
<trans lang="en_EN">Reruns of</trans>
<trans lang="de_DE">Wiederholungen von</trans>
<trans lang="fi_FI">Uusinnat:</trans>
<trans lang="hu_HU">Ismétlés:</trans>
<trans lang="it_IT">Riavvi di</trans>
<trans lang="it_IT">Repliche:</trans>
</token>
<token name="tr(actors)">
<trans lang="en_EN">Actors</trans>
@ -156,7 +156,7 @@
<trans lang="de_DE">Nur für Erwachsene</trans>
<trans lang="fi_FI">Vain aikuisille</trans>
<trans lang="hu_HU">Felnőtt</trans>
<trans lang="it_IT">Adulti</trans>
<trans lang="it_IT">Adulto</trans>
</token>
<token name="tr(releasedate)">
<trans lang="en_EN">Release Date</trans>
@ -170,7 +170,7 @@
<trans lang="de_DE">Laufzeit</trans>
<trans lang="fi_FI">Kesto</trans>
<trans lang="hu_HU">Hossz</trans>
<trans lang="it_IT">Runtime</trans>
<trans lang="it_IT">Durata</trans>
</token>
<token name="tr(popularity)">
<trans lang="en_EN">Popularity</trans>
@ -212,7 +212,7 @@
<trans lang="de_DE">Länge der Aufnahme</trans>
<trans lang="fi_FI">Tallenteen pituus</trans>
<trans lang="hu_HU">Felvétel hossza</trans>
<trans lang="it_IT">Lnghezza registrazzione</trans>
<trans lang="it_IT">Lunghezza registrazione</trans>
</token>
<token name="tr(reclengthcutted)">
<trans lang="en_EN">Cutted Recording Length</trans>
@ -235,6 +235,13 @@
<trans lang="hu_HU">Formátum</trans>
<trans lang="it_IT">Formato</trans>
</token>
<token name="tr(errors)">
<trans lang="en_EN">Errors</trans>
<trans lang="de_DE">Fehler</trans>
<trans lang="fi_FI">Virhe</trans>
<trans lang="hu_HU">Hiba</trans>
<trans lang="it_IT">Errore</trans>
</token>
<token name="tr(searchtimer)">
<trans lang="en_EN">Searchtimer</trans>
<trans lang="de_DE">Suchtimer</trans>
@ -242,47 +249,68 @@
<trans lang="hu_HU">Időzítő kereső</trans>
<trans lang="it_IT">Cerca timer</trans>
</token>
<token name="tr(start)">
<trans lang="en_EN">start</trans>
<trans lang="de_DE">Beginn</trans>
<trans lang="fi_FI">Alkaa</trans>
<trans lang="hu_HU">Rajt</trans>
<trans lang="it_IT">Inizio</trans>
</token>
<token name="tr(rest)">
<trans lang="en_EN">rest</trans>
<trans lang="de_DE">Rest</trans>
<trans lang="fi_FI">Loput</trans>
<trans lang="hu_HU">Maradék</trans>
<trans lang="it_IT">Riposo</trans>
</token>
<token name="tr(playback)">
<trans lang="en_EN">playback</trans>
<trans lang="de_DE">Wiedergabe</trans>
<trans lang="fi_FI">Toisto</trans>
<trans lang="hu_HU">Lejátszás</trans>
<trans lang="it_IT">Riproduzione</trans>
</token>
<token name="tr(end)">
<trans lang="en_EN">end</trans>
<trans lang="de_DE">Ende</trans>
<trans lang="fi_FI">Loppu</trans>
<trans lang="hu_HU">vég</trans>
<trans lang="it_IT">Fine</trans>
<trans lang="it_IT">fine</trans>
</token>
<token name="tr(activetimers)">
<trans lang="en_EN">active timers</trans>
<trans lang="de_DE">aktive Timer</trans>
<trans lang="fi_FI">aktiivista ajastinta</trans>
<trans lang="hu_HU">aktív időzítők</trans>
<trans lang="it_IT">Timer attivi</trans>
<trans lang="it_IT">timer attivi</trans>
</token>
<token name="tr(activetimer)">
<trans lang="en_EN">active timer</trans>
<trans lang="de_DE">aktiver Timer</trans>
<trans lang="fi_FI">aktiivinen ajastin</trans>
<trans lang="hu_HU">aktív időzítő</trans>
<trans lang="it_IT">Timer attivo</trans>
<trans lang="it_IT">timer attivo</trans>
</token>
<token name="tr(lastrecs)">
<trans lang="en_EN">last recordings</trans>
<trans lang="de_DE">Neueste Aufnahmen</trans>
<trans lang="fi_FI">Uusimmat tallenteet</trans>
<trans lang="hu_HU">utolsó felvételek</trans>
<trans lang="it_IT">Ultime registrazioni</trans>
<trans lang="it_IT">ultime registrazioni</trans>
</token>
<token name="tr(sysinfo)">
<trans lang="en_EN">system information</trans>
<trans lang="de_DE">System Informationen</trans>
<trans lang="fi_FI">Järjestelmätiedot</trans>
<trans lang="hu_HU">rendszer információ</trans>
<trans lang="it_IT">Info di sistema</trans>
<trans lang="it_IT">info di sistema</trans>
</token>
<token name="tr(disc)">
<trans lang="en_EN">disc</trans>
<trans lang="de_DE">HDD</trans>
<trans lang="fi_FI">levy</trans>
<trans lang="hu_HU">Lemez</trans>
<trans lang="it_IT">Disco</trans>
<trans lang="it_IT">disco</trans>
</token>
<token name="tr(free)">
<trans lang="en_EN">free</trans>
@ -373,7 +401,7 @@
<trans lang="de_DE">Windgeschwindigkeit</trans>
<trans lang="fi_FI">Tuulen nopeus</trans>
<trans lang="hu_HU">Szélsebesség</trans>
<trans lang="it_IT">Velcità vento</trans>
<trans lang="it_IT">Velocità vento</trans>
</token>
<token name="tr(cloudcover)">
<trans lang="en_EN">Cloud Cover</trans>
@ -464,7 +492,7 @@
<trans lang="de_DE">Unterstützte Plugins</trans>
<trans lang="fi_FI">Tuetut laajennokset</trans>
<trans lang="hu_HU">Támogatott Beépülő Modulok</trans>
<trans lang="it_IT">Plugin supportati</trans>
<trans lang="it_IT">Plugins supportati</trans>
</token>
<token name="tr(usedfonts)">
<trans lang="en_EN">Used Fonts</trans>

View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="512px"
height="512px"
viewBox="0 0 512 512"
style="enable-background:new 0 0 512 512;"
xml:space="preserve"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="ico_timer_isactive.svg"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1304"
inkscape:window-height="848"
id="namedview39"
showgrid="false"
inkscape:zoom="0.4609375"
inkscape:cx="-394.84746"
inkscape:cy="256"
inkscape:window-x="302"
inkscape:window-y="113"
inkscape:window-maximized="0"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" /><g
id="g3"
style="fill:#{sdcol(iconactive)};fill-opacity:1"><path
d="M256,0C114.609,0,0,114.609,0,256c0,141.391,114.609,256,256,256c141.391,0,256-114.609,256-256 C512,114.609,397.391,0,256,0z M256,472c-119.297,0-216-96.703-216-216S136.703,40,256,40s216,96.703,216,216S375.297,472,256,472z "
id="path5"
style="fill:#{sdcol(iconactive)};fill-opacity:1" /><path
d="M336,256c0,44.188-35.812,80-80,80c-44.188,0-80-35.812-80-80c0-44.188,35.812-80,80-80C300.188,176,336,211.812,336,256z"
id="path7"
style="fill:#{sdcol(iconactive)};fill-opacity:1" /></g><g
id="g9" /><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /><g
id="g35" /><g
id="g37" /><path
style="fill:#00ff00;stroke-width:2.16949"
d="M 215.72807,507.53308 C 162.71961,498.62211 115.11053,474.12463 76.893336,436.09498 39.36807,398.75387 14.112943,351.03911 5.386094,300.99567 c -4.1222903,-23.63898 -4.1222903,-66.35236 0,-89.99133 C 14.008253,161.56122 39.263887,113.48953 75.833077,76.915237 113.15643,39.586666 154.06344,17.595366 209.35593,5.1343523 217.69335,3.2553845 235.24157,2.2725166 258.16949,2.4003239 289.26436,2.5736565 296.6974,3.3268912 314.76087,8.1350626 390.2236,28.221883 445.8588,71.540834 481.2437,137.76271 500.63865,174.05982 509.83051,212.07808 509.83051,256 c 0,53.98027 -12.71674,96.03922 -42.96516,142.10169 -14.45842,22.01739 -45.63955,53.62066 -66.63035,67.53244 -56.44714,37.41066 -122.27803,52.35994 -184.50693,41.89895 z m 79.32278,-38.26109 c 66.69474,-11.18388 124.35288,-54.9441 155.23134,-117.81436 16.81999,-34.24642 21.42302,-54.7568 21.42302,-95.45763 0,-40.70084 -4.60303,-61.2112 -21.42302,-95.45763 C 416.54007,91.841508 351.24449,46.646652 276.63579,40.351623 183.74995,32.514478 102.19857,78.121277 61.717797,160.54237 44.897813,194.7888 40.29479,215.29916 40.29479,256 c 0,40.70083 4.603023,61.21121 21.423007,95.45763 43.386713,88.33777 134.566653,134.37628 233.333053,117.81436 z"
id="path96" /><path
style="fill:#008000;stroke-width:2.16949"
d="m 236.3213,332.35775 c -21.769,-6.17206 -40.50373,-21.79987 -51.22581,-42.73063 -5.50062,-10.73785 -6.11244,-14.10376 -6.11244,-33.62712 0,-19.6807 0.58931,-22.85864 6.3474,-34.22928 7.84645,-15.49455 23.47217,-30.4091 39.82358,-38.01108 10.36368,-4.81822 15.44018,-5.76739 30.84597,-5.76739 15.40578,0 20.48229,0.94917 30.84597,5.76739 16.35141,7.60198 31.97713,22.51653 39.82357,38.01108 5.7581,11.37064 6.34741,14.54858 6.34741,34.22928 0,19.6807 -0.58931,22.85864 -6.34741,34.22928 -7.77464,15.35277 -23.49443,30.4473 -39.19346,37.63455 -14.31303,6.55273 -36.89604,8.53663 -51.15478,4.49392 z"
id="path98" /><path
style="fill:#ffff00;stroke-width:2.16949"
d="M 206.10169,504.49124 C 127.20566,487.59493 62.205776,436.20317 27.173029,363.02238 21.843258,351.88888 14.804192,333.99322 11.530661,323.25424 5.8131936,304.49781 5.578785,301.84906 5.578785,256 c 0,-45.84906 0.2344086,-48.4978 5.951876,-67.25424 C 32.549044,119.79392 80.874604,60.902059 141.75428,30.048987 162.90057,19.332308 198.31759,7.9640136 219.39566,5.1273468 248.93064,1.1525593 296.54254,3.8115829 320,10.745884 c 72.79019,21.517644 127.55914,65.552215 160.24491,128.837896 20.42019,39.53725 27.5415,69.6386 27.5415,116.41622 0,45.37717 -6.91577,75.78975 -25.65361,112.81356 -44.0919,87.12047 -131.07015,140.2941 -228.64308,139.77956 -19.26328,-0.10158 -35.11652,-1.47383 -47.38803,-4.10188 z M 310.59295,466.68002 C 373.25941,450.78337 423.80264,408.85996 452.57467,348.9124 468.66334,315.39107 471.4995,301.46686 471.4995,256 c 0,-45.46685 -2.83616,-59.39108 -18.92483,-92.91239 C 405.84324,65.720986 300.90058,18.252796 195.48196,46.798152 137.02428,62.627376 88.47007,103.99464 59.922035,162.29263 43.457751,195.91436 40.500501,210.18286 40.500501,256 c 0,43.90222 2.572306,57.57609 16.612895,88.31095 32.071417,70.20436 94.044494,116.96666 169.055394,127.56216 22.18618,3.13387 61.01346,0.74552 84.42416,-5.19309 z"
id="path100" /><path
style="fill:#800000;stroke-width:2.16949"
d="m 231.62056,329.87503 c -19.432,-7.47847 -37.58534,-24.44505 -46.3932,-43.36027 -4.18771,-8.99327 -5.12103,-14.57144 -5.13837,-30.71062 -0.019,-17.67761 0.66622,-21.09692 6.61232,-32.99612 7.49464,-14.9981 22.76182,-29.97136 38.42543,-37.68566 8.56481,-4.21817 13.67353,-5.05456 30.87326,-5.05456 17.19972,0 22.30844,0.83639 30.87326,5.05456 15.66361,7.7143 30.93078,22.68756 38.42542,37.68566 5.95268,11.91235 6.63352,15.31908 6.63352,33.19198 0,17.8729 -0.68084,21.27963 -6.63352,33.19198 -7.46529,14.93937 -22.8392,30.05422 -38.06767,37.42619 -12.70572,6.15074 -43.41742,7.94939 -55.61045,3.25686 z"
id="path120" /><path
style="fill:#800000;stroke-width:2.16949"
d="M 206.32865,503.22148 C 158.10069,492.75939 111.99781,467.4798 78.101693,432.91084 50.677575,404.94234 30.547679,372.08509 14.90829,329.76271 L 7.6930601,310.23729 7.6431391,257.08475 C 7.5934779,204.20898 7.6256812,203.83618 13.827422,185.49153 44.840309,93.7559 112.14814,31.18172 203.02701,9.5980336 c 21.63974,-5.1394252 69.64126,-6.079541 96.35674,-1.8871583 33.36001,5.2350907 78.134,25.1103657 109.1443,48.4493957 41.18678,30.998062 74.69251,79.915619 89.32754,130.415999 11.175,38.56104 11.13977,100.34395 -0.0794,139.05859 -26.26219,90.62535 -105.25138,161.57427 -197.86537,177.72481 -23.1306,4.03363 -74.7021,3.95748 -93.58227,-0.13819 z M 309.79013,467.66631 C 375.70909,451.32822 430.02995,404.43826 457.83235,339.87573 469.90119,311.84957 471.81579,300.36534 471.81579,256 c 0,-44.36534 -1.9146,-55.84957 -13.98344,-83.87572 C 430.3918,108.40199 377.49031,62.322634 311.27148,44.463759 286.98023,37.912535 244.2084,36.308376 217.61088,40.951016 143.11647,53.954133 84.368657,101.71226 53.152017,174.64529 41.988799,200.72649 40.1504,212.39437 40.162805,257.08475 c 0.01237,44.84798 1.467919,53.42624 14.047115,82.79098 28.54943,66.64548 86.63006,114.9025 157.3155,130.70755 21.33213,4.7698 73.49908,3.22124 98.26471,-2.91697 z"
id="path878" /></svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="512px"
height="512px"
viewBox="0 0 512 512"
style="enable-background:new 0 0 512 512;"
xml:space="preserve"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="ico_rec_inactive.svg"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1304"
inkscape:window-height="848"
id="namedview39"
showgrid="false"
inkscape:zoom="0.4609375"
inkscape:cx="-394.84746"
inkscape:cy="256"
inkscape:window-x="233"
inkscape:window-y="123"
inkscape:window-maximized="0"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" /><g
id="g3"
style="fill:#{sdcol(iconactive)};fill-opacity:1"><path
d="M256,0C114.609,0,0,114.609,0,256c0,141.391,114.609,256,256,256c141.391,0,256-114.609,256-256 C512,114.609,397.391,0,256,0z M256,472c-119.297,0-216-96.703-216-216S136.703,40,256,40s216,96.703,216,216S375.297,472,256,472z "
id="path5"
style="fill:#{sdcol(iconactive)};fill-opacity:1" /><path
d="M336,256c0,44.188-35.812,80-80,80c-44.188,0-80-35.812-80-80c0-44.188,35.812-80,80-80C300.188,176,336,211.812,336,256z"
id="path7"
style="fill:#{sdcol(iconactive)};fill-opacity:1" /></g><g
id="g9" /><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /><g
id="g35" /><g
id="g37" /><path
style="fill:#00ff00;stroke-width:2.16949"
d="M 215.72807,507.53308 C 162.71961,498.62211 115.11053,474.12463 76.893336,436.09498 39.36807,398.75387 14.112943,351.03911 5.386094,300.99567 c -4.1222903,-23.63898 -4.1222903,-66.35236 0,-89.99133 C 14.008253,161.56122 39.263887,113.48953 75.833077,76.915237 113.15643,39.586666 154.06344,17.595366 209.35593,5.1343523 217.69335,3.2553845 235.24157,2.2725166 258.16949,2.4003239 289.26436,2.5736565 296.6974,3.3268912 314.76087,8.1350626 390.2236,28.221883 445.8588,71.540834 481.2437,137.76271 500.63865,174.05982 509.83051,212.07808 509.83051,256 c 0,53.98027 -12.71674,96.03922 -42.96516,142.10169 -14.45842,22.01739 -45.63955,53.62066 -66.63035,67.53244 -56.44714,37.41066 -122.27803,52.35994 -184.50693,41.89895 z m 79.32278,-38.26109 c 66.69474,-11.18388 124.35288,-54.9441 155.23134,-117.81436 16.81999,-34.24642 21.42302,-54.7568 21.42302,-95.45763 0,-40.70084 -4.60303,-61.2112 -21.42302,-95.45763 C 416.54007,91.841508 351.24449,46.646652 276.63579,40.351623 183.74995,32.514478 102.19857,78.121277 61.717797,160.54237 44.897813,194.7888 40.29479,215.29916 40.29479,256 c 0,40.70083 4.603023,61.21121 21.423007,95.45763 43.386713,88.33777 134.566653,134.37628 233.333053,117.81436 z"
id="path96" /><path
style="fill:#008000;stroke-width:2.16949"
d="m 236.3213,332.35775 c -21.769,-6.17206 -40.50373,-21.79987 -51.22581,-42.73063 -5.50062,-10.73785 -6.11244,-14.10376 -6.11244,-33.62712 0,-19.6807 0.58931,-22.85864 6.3474,-34.22928 7.84645,-15.49455 23.47217,-30.4091 39.82358,-38.01108 10.36368,-4.81822 15.44018,-5.76739 30.84597,-5.76739 15.40578,0 20.48229,0.94917 30.84597,5.76739 16.35141,7.60198 31.97713,22.51653 39.82357,38.01108 5.7581,11.37064 6.34741,14.54858 6.34741,34.22928 0,19.6807 -0.58931,22.85864 -6.34741,34.22928 -7.77464,15.35277 -23.49443,30.4473 -39.19346,37.63455 -14.31303,6.55273 -36.89604,8.53663 -51.15478,4.49392 z"
id="path98" /><path
style="fill:#008000;stroke-width:2.16949"
d="M 206.10169,504.49124 C 127.20566,487.59493 62.205776,436.20317 27.173029,363.02238 21.843258,351.88888 14.804192,333.99322 11.530661,323.25424 5.8131936,304.49781 5.578785,301.84906 5.578785,256 c 0,-45.84906 0.2344086,-48.4978 5.951876,-67.25424 C 32.549044,119.79392 80.874604,60.902059 141.75428,30.048987 162.90057,19.332308 198.31759,7.9640136 219.39566,5.1273468 248.93064,1.1525593 296.54254,3.8115829 320,10.745884 c 72.79019,21.517644 127.55914,65.552215 160.24491,128.837896 20.42019,39.53725 27.5415,69.6386 27.5415,116.41622 0,45.37717 -6.91577,75.78975 -25.65361,112.81356 -44.0919,87.12047 -131.07015,140.2941 -228.64308,139.77956 -19.26328,-0.10158 -35.11652,-1.47383 -47.38803,-4.10188 z M 310.59295,466.68002 C 373.25941,450.78337 423.80264,408.85996 452.57467,348.9124 468.66334,315.39107 471.4995,301.46686 471.4995,256 c 0,-45.46685 -2.83616,-59.39108 -18.92483,-92.91239 C 405.84324,65.720986 300.90058,18.252796 195.48196,46.798152 137.02428,62.627376 88.47007,103.99464 59.922035,162.29263 43.457751,195.91436 40.500501,210.18286 40.500501,256 c 0,43.90222 2.572306,57.57609 16.612895,88.31095 32.071417,70.20436 94.044494,116.96666 169.055394,127.56216 22.18618,3.13387 61.01346,0.74552 84.42416,-5.19309 z"
id="path100" /></svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="512px"
height="512px"
viewBox="0 0 512 512"
style="enable-background:new 0 0 512 512;"
xml:space="preserve"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="ico_rec_switch.svg"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1304"
inkscape:window-height="848"
id="namedview39"
showgrid="false"
inkscape:zoom="0.4609375"
inkscape:cx="-394.84746"
inkscape:cy="256"
inkscape:window-x="233"
inkscape:window-y="123"
inkscape:window-maximized="0"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" /><g
id="g3"
style="fill:#{sdcol(iconactive)};fill-opacity:1"><path
d="M256,0C114.609,0,0,114.609,0,256c0,141.391,114.609,256,256,256c141.391,0,256-114.609,256-256 C512,114.609,397.391,0,256,0z M256,472c-119.297,0-216-96.703-216-216S136.703,40,256,40s216,96.703,216,216S375.297,472,256,472z "
id="path5"
style="fill:#{sdcol(iconactive)};fill-opacity:1" /><path
d="M336,256c0,44.188-35.812,80-80,80c-44.188,0-80-35.812-80-80c0-44.188,35.812-80,80-80C300.188,176,336,211.812,336,256z"
id="path7"
style="fill:#{sdcol(iconactive)};fill-opacity:1" /></g><g
id="g9" /><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /><g
id="g35" /><g
id="g37" /><path
style="fill:#00ff00;stroke-width:2.16949"
d="M 215.72807,507.53308 C 162.71961,498.62211 115.11053,474.12463 76.893336,436.09498 39.36807,398.75387 14.112943,351.03911 5.386094,300.99567 c -4.1222903,-23.63898 -4.1222903,-66.35236 0,-89.99133 C 14.008253,161.56122 39.263887,113.48953 75.833077,76.915237 113.15643,39.586666 154.06344,17.595366 209.35593,5.1343523 217.69335,3.2553845 235.24157,2.2725166 258.16949,2.4003239 289.26436,2.5736565 296.6974,3.3268912 314.76087,8.1350626 390.2236,28.221883 445.8588,71.540834 481.2437,137.76271 500.63865,174.05982 509.83051,212.07808 509.83051,256 c 0,53.98027 -12.71674,96.03922 -42.96516,142.10169 -14.45842,22.01739 -45.63955,53.62066 -66.63035,67.53244 -56.44714,37.41066 -122.27803,52.35994 -184.50693,41.89895 z m 79.32278,-38.26109 c 66.69474,-11.18388 124.35288,-54.9441 155.23134,-117.81436 16.81999,-34.24642 21.42302,-54.7568 21.42302,-95.45763 0,-40.70084 -4.60303,-61.2112 -21.42302,-95.45763 C 416.54007,91.841508 351.24449,46.646652 276.63579,40.351623 183.74995,32.514478 102.19857,78.121277 61.717797,160.54237 44.897813,194.7888 40.29479,215.29916 40.29479,256 c 0,40.70083 4.603023,61.21121 21.423007,95.45763 43.386713,88.33777 134.566653,134.37628 233.333053,117.81436 z"
id="path96" /><path
style="fill:#008000;stroke-width:2.16949"
d="m 236.3213,332.35775 c -21.769,-6.17206 -40.50373,-21.79987 -51.22581,-42.73063 -5.50062,-10.73785 -6.11244,-14.10376 -6.11244,-33.62712 0,-19.6807 0.58931,-22.85864 6.3474,-34.22928 7.84645,-15.49455 23.47217,-30.4091 39.82358,-38.01108 10.36368,-4.81822 15.44018,-5.76739 30.84597,-5.76739 15.40578,0 20.48229,0.94917 30.84597,5.76739 16.35141,7.60198 31.97713,22.51653 39.82357,38.01108 5.7581,11.37064 6.34741,14.54858 6.34741,34.22928 0,19.6807 -0.58931,22.85864 -6.34741,34.22928 -7.77464,15.35277 -23.49443,30.4473 -39.19346,37.63455 -14.31303,6.55273 -36.89604,8.53663 -51.15478,4.49392 z"
id="path98" /><path
style="fill:#ffff00;stroke-width:2.16949"
d="M 206.10169,504.49124 C 127.20566,487.59493 62.205776,436.20317 27.173029,363.02238 21.843258,351.88888 14.804192,333.99322 11.530661,323.25424 5.8131936,304.49781 5.578785,301.84906 5.578785,256 c 0,-45.84906 0.2344086,-48.4978 5.951876,-67.25424 C 32.549044,119.79392 80.874604,60.902059 141.75428,30.048987 162.90057,19.332308 198.31759,7.9640136 219.39566,5.1273468 248.93064,1.1525593 296.54254,3.8115829 320,10.745884 c 72.79019,21.517644 127.55914,65.552215 160.24491,128.837896 20.42019,39.53725 27.5415,69.6386 27.5415,116.41622 0,45.37717 -6.91577,75.78975 -25.65361,112.81356 -44.0919,87.12047 -131.07015,140.2941 -228.64308,139.77956 -19.26328,-0.10158 -35.11652,-1.47383 -47.38803,-4.10188 z M 310.59295,466.68002 C 373.25941,450.78337 423.80264,408.85996 452.57467,348.9124 468.66334,315.39107 471.4995,301.46686 471.4995,256 c 0,-45.46685 -2.83616,-59.39108 -18.92483,-92.91239 C 405.84324,65.720986 300.90058,18.252796 195.48196,46.798152 137.02428,62.627376 88.47007,103.99464 59.922035,162.29263 43.457751,195.91436 40.500501,210.18286 40.500501,256 c 0,43.90222 2.572306,57.57609 16.612895,88.31095 32.071417,70.20436 94.044494,116.96666 169.055394,127.56216 22.18618,3.13387 61.01346,0.74552 84.42416,-5.19309 z"
id="path100" /><path
style="fill:#ffff00;stroke-width:2.16949"
d="m 231.62056,329.87503 c -19.432,-7.47847 -37.58534,-24.44505 -46.3932,-43.36027 -4.18771,-8.99327 -5.12103,-14.57144 -5.13837,-30.71062 -0.019,-17.67761 0.66622,-21.09692 6.61232,-32.99612 7.49464,-14.9981 22.76182,-29.97136 38.42543,-37.68566 8.56481,-4.21817 13.67353,-5.05456 30.87326,-5.05456 17.19972,0 22.30844,0.83639 30.87326,5.05456 15.66361,7.7143 30.93078,22.68756 38.42542,37.68566 5.95268,11.91235 6.63352,15.31908 6.63352,33.19198 0,17.8729 -0.68084,21.27963 -6.63352,33.19198 -7.46529,14.93937 -22.8392,30.05422 -38.06767,37.42619 -12.70572,6.15074 -43.41742,7.94939 -55.61045,3.25686 z"
id="path120" /></svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -18,7 +18,7 @@
<parameter type="bool" name="scrollepg" displaytext="{tr(scrollepgtext)}">1</parameter>
<parameter type="separator" name="sepzapcockpit" displaytext="{tr(sepzapcockpit)}"/>
<parameter type="int" name="fadetimezapcockpit" displaytext="{tr(fadetimezapcockpit)}">0</parameter>
<parameter type="int" name="shifttimezapcockpit" displaytext="{tr(shifttimezapcockpit)}">200</parameter>
<parameter type="int" name="shifttimezapcockpit" displaytext="{tr(shifttimezapcockpit)}">0</parameter>
<parameter type="separator" name="sepzapcockpitdetail" displaytext="{tr(sepzapcockpitdetail)}"/>
<parameter type="int" name="zapdetaildatetimefs" min="0" max="100" displaytext="{tr(zapdetaildatetimefs)}">80</parameter>
<parameter type="int" name="zapdetailheaderfs" min="0" max="100" displaytext="{tr(zapdetailheaderfs)}">80</parameter>
@ -227,7 +227,7 @@
<trans lang="de_DE">Aufzeichnungsmenü</trans>
<trans lang="fi_FI">Tallennevalikko</trans>
<trans lang="hu_HU">Felvételek Menü</trans>
<trans lang="it_IT">Menù timer</trans>
<trans lang="it_IT">Menù registrazioni</trans>
</token>
<token name="tr(subdetailmenu)">
<trans lang="en_EN">Detailed Views (EPG, Rec, text)</trans>
@ -292,37 +292,41 @@
<trans lang="de_DE">Einblendzeit der Kanalanzeige in ms. Ist dieser Wert auf einen Wert > 0 gesetzt, werden alle OSD Elemente ausser dem VDR Menu ein- und ausgeblendet.</trans>
<trans lang="fi_FI">Häivytyksen kesto millisekunteina. Nollasta eriävä arvo aktivoi valikkojen häivytyksen.</trans>
<trans lang="hu_HU">A csatorna kijelzés elhalványulás ms-ben. Ha ez az érték be van beállítva, hogy az érték > 0, az összes OSD elemek mellett a VDR menüt és elhalványulnak.</trans>
<trans lang="it_IT">Tempo di dissolvenza della visualizzazione del canale in ms. Se questo è settato ad un valore maggiore di 0 tutti gli elementi OSD dietro al menù Vdr si dissolvono in entrata ed uscita</trans>
<trans lang="it_IT">Tempo di dissolvenza della visualizzazione del canale in ms. Settato > di 0 tutti gli elementi OSD dietro al menù Vdr si dissolvono in entrata ed uscita</trans>
</token>
<token name="tr(shifttext)">
<trans lang="en_EN">Shift time [ms]</trans>
<trans lang="de_DE">Einfahrzeit [ms]</trans>
<trans lang="fi_FI">Liukuman kesto [ms]</trans>
<trans lang="hu_HU">Késleltetés ideje [ms]</trans>
<trans lang="it_IT">Tempo di dissolvenza [ms]</trans>
<trans lang="it_IT">Tempo di cambio [ms]</trans>
</token>
<token name="tr(helpshift)">
<trans lang="en_EN">Shift time in ms. If this is set to a value larger 0 all OSD elements beside the VDR menu are shifted in and out from the bottom of the screen. If fadetime is also set to a value larger 0, still shifting is performed.</trans>
<trans lang="de_DE">Einfahrzeit in ms. Ist dieser Wert auf einen Wert > 0 gesetzt, werden alle OSD Elemente ausser dem VDR Menu vom unteren Rand des Bildschirms herein- und herausgefahren. Falls fadetime ebenfalls auf einen Wert größer 0 gesetzt ist, wird das OSD trotzdem herein- und herausgefahren.</trans>
<trans lang="fi_FI">Liukuman kesto millisekunteina. Nollasta eriävä arvo aktivoi valikkojen transitioefektit riippumatta häivytyksen kestosta.</trans>
<trans lang="hu_HU">Késleltetés idő ms-ben. Ha ez be van állítva, hogy az érték > 0, az összes OSD elemek mellett a VDR menü eltolódik, és ki a képernyő alján. Ha fadetime is ennek az értéke nagyobb 0, mindig eltolásával végezzük.</trans>
<trans lang="it_IT">Tempo di cambio in ms. Se questo è settato ad un valore maggiore di 0 tutti gli elementi OSD dietro al menù Vdr cambiano dalla parte bassa dello schermo. Se il tempo di cambio fosse settato anche ad un valore maggiore di zero, comunque il cambio viene effettuato</trans>
<trans lang="it_IT">Tempo di cambio in ms. Settato > di 0 tutti gli elementi OSD di lato al menù Vdr cambiano dalla parte bassa dello schermo. Se il tempo di cambio fosse settato anche ad un valore > di zero, comunque il cambio viene effettuato</trans>
</token>
<token name="tr(listfadetimetext)">
<trans lang="en_EN">Fade time menus [ms]</trans>
<trans lang="de_DE">Überblendungszeit Menüs [ms]</trans>
<trans lang="it_IT">Menù tempo di dissolvenza [ms]</trans>
</token>
<token name="tr(listshifttimetext)">
<trans lang="en_EN">Shift time menus [ms]</trans>
<trans lang="de_DE">Übergangszeit Menüelemente [ms]</trans>
<trans lang="it_IT">Menù Tempo di cambio [ms]</trans>
</token>
<token name="tr(helplistfadetime)">
<trans lang="en_EN">Fade time of menu elements when scrolling through the menus. If set to 0, this effect is disabled.</trans>
<trans lang="de_DE">Überblendungszeit der Menüelemente beim Bewegen durch die Menüs. Steht dieser Wert auf 0, ist dieser Effekt deaktiviert.</trans>
<trans lang="it_IT">Tempo dissolvenza elementi del menù scorrendo i menù. Settato a 0, questo effetto è disabilitato</trans>
</token>
<token name="tr(helplistshifttime)">
<trans lang="en_EN">Shift time of menu elements when scrolling through the menus. If set to 0, this effect is disabled.</trans>
<trans lang="de_DE">Übergangszeit der Menüelemente beim Bewegen durch die Menüs. Steht dieser Wert auf 0, ist dieser Effekt deaktiviert.</trans>
<trans lang="it_IT">Tempo cambio elementi del menù scorrendo i menù. Settato a 0, questo effetto è disabilitato</trans>
</token>
<!-- displaychannel -->
<token name="tr(epgtextposy)">
@ -426,10 +430,12 @@
<token name="tr(zapclnumchannels)">
<trans lang="en_EN">Number of items in channels list</trans>
<trans lang="de_DE">Anzahl der Elemente in Kanalliste</trans>
<trans lang="it_IT">Numero voci nella lista canali</trans>
</token>
<token name="tr(zapglnumgroups)">
<trans lang="en_EN">Number of items in channel group list</trans>
<trans lang="de_DE">Anzahl der Elemente in Kanalgruppenliste</trans>
<trans lang="it_IT">Numero voci nella lista gruppo canali</trans>
</token>
<token name="tr(zapclpresenttimefs)">
<trans lang="en_EN">Font size remaining time present event</trans>
@ -494,7 +500,7 @@
<trans lang="en_EN">Font size description</trans>
<trans lang="de_DE">Schriftgröße Beschreibung</trans>
<trans lang="fi_FI">Kirjasintyypin koko kuvaukselle</trans>
<trans lang="it_IT">Dimensione carattere testo breve</trans>
<trans lang="it_IT">Dimensione carattere descrizione</trans>
</token>
<token name="tr(zapcldetaildatetimefs)">
<trans lang="en_EN">Font size time in channel list detail view</trans>
@ -548,13 +554,13 @@
<trans lang="en_EN">Height channel hints (% of screen height)</trans>
<trans lang="de_DE">Höhe Kanal Hinweise (% der Bildschirmhöhe)</trans>
<trans lang="fi_FI">Korkeus (% näytön korkeudesta)</trans>
<trans lang="it_IT">Altezza suggerimenti canale (% della altezza del video)</trans>
<trans lang="it_IT">Altezza suggerimenti canale (in % altezza dello schermo)</trans>
</token>
<token name="tr(zapchannelhintswidth)">
<trans lang="en_EN">Width channel hints (% of screen width)</trans>
<trans lang="de_DE">Breite Kanal Hinweise (% der Bildschirmbreite)</trans>
<trans lang="fi_FI">Leveys (% näytön leveydestä)</trans>
<trans lang="it_IT">Larghezza suggerimenti canale (% della larghezza del video)</trans>
<trans lang="it_IT">Larghezza suggerimenti canale (in % larghezza dello schermo)</trans>
</token>
<!-- recording display -->
<token name="tr(replaytitlesize)">
@ -606,7 +612,7 @@
<trans lang="de_DE">Schriftgröße Header</trans>
<trans lang="fi_FI">Kirjasintyypin koko otsikkopalkille</trans>
<trans lang="hu_HU">Betűméret fejléc</trans>
<trans lang="it_IT">Dimensione del font del header</trans>
<trans lang="it_IT">Dimensione del font dell'intestazione</trans>
</token>
<token name="tr(headerdatefontsize)">
<trans lang="en_EN">Font size date</trans>
@ -656,7 +662,7 @@
<trans lang="de_DE">Nummerierung der Listenelemente anzeigen</trans>
<trans lang="fi_FI">Näytä numeroinnit valikkoriveillä</trans>
<trans lang="hu_HU">A listaelemek kijelzőszámozása</trans>
<trans lang="it_IT">Visualizzazione degli elementi della lista</trans>
<trans lang="it_IT">Visualizzazione numerica degli elementi della lista</trans>
</token>
<token name="tr(numitemsmain)">
<trans lang="en_EN">Number of main menu items</trans>
@ -734,7 +740,7 @@
<trans lang="de_DE">Schriftgröße Titel</trans>
<trans lang="fi_FI">Kirjasintyypin koko nimikkeelle</trans>
<trans lang="hu_HU">Betűméret cím</trans>
<trans lang="it_IT">Posizione verticale del titolo EPG</trans>
<trans lang="it_IT">Dimensione font del titolo</trans>
</token>
<token name="tr(schedulessizecurrenttext)">
<trans lang="en_EN">Font size text</trans>
@ -877,11 +883,12 @@
<trans lang="de_DE">Anzahl Menüelemente</trans>
<trans lang="fi_FI">Valikkorivien lukumäärä</trans>
<trans lang="hu_HU">menüpontok száma</trans>
<trans lang="it_IT">Numero delle voci</trans>
<trans lang="it_IT">Numero delle voci del menù</trans>
</token>
<token name="tr(recusethumbs)">
<trans lang="en_EN">Show posters</trans>
<trans lang="de_DE">Poster anzeigen</trans>
<trans lang="it_IT">Mostra poster</trans>
</token>
<token name="tr(recposydate)">
<trans lang="en_EN">Vertical position date</trans>
@ -909,7 +916,7 @@
<trans lang="de_DE">Schriftgröße Titel</trans>
<trans lang="fi_FI">Kirjasintyypin koko nimikkeelle</trans>
<trans lang="hu_HU">Betűméret cím</trans>
<trans lang="it_IT">Posizione verticale del titolo</trans>
<trans lang="it_IT">Dimensione font del titolo</trans>
</token>
<token name="tr(recposyfoldertitle)">
<trans lang="en_EN">Vertical position folder name</trans>
@ -949,6 +956,7 @@
<token name="tr(sizewidesmall)">
<trans lang="en_EN">Font size small wide menu</trans>
<trans lang="de_DE">Schriftgröße Klein breites Menü</trans>
<trans lang="it_IT">Dimensione font del menù piccolo</trans>
</token>
<token name="tr(showcurrent)">
<trans lang="en_EN">Show info for selected list element</trans>

View File

@ -19,7 +19,7 @@
<color name="fontmenuactive">FF111111</color>
<color name="progressbarback">FF222222</color>
<color name="progressbar">FF99D235</color>
<color name="progressbartimeshift">FF666666</color>
<color name="progressbartimeshift">FF99EE33</color>
<color name="cutmark">FF666666</color>
<color name="icontextactive">FFFFFFFF</color>
<color name="icontextinactive">FF333333</color>

View File

@ -19,7 +19,7 @@
<color name="fontmenuactive">FFFFFFFF</color>
<color name="progressbarback">FF222222</color>
<color name="progressbar">FF550000</color>
<color name="progressbartimeshift">FF666666</color>
<color name="progressbartimeshift">FF992222</color>
<color name="cutmark">FF666666</color>
<color name="icontextactive">FFFFFFFF</color>
<color name="icontextinactive">FFCCCCCC</color>

View File

@ -19,7 +19,7 @@
<color name="fontmenuactive">FF333333</color>
<color name="progressbarback">FF222222</color>
<color name="progressbar">FF12B2E7</color>
<color name="progressbartimeshift">FF666666</color>
<color name="progressbartimeshift">FF126696</color>
<color name="cutmark">FF666666</color>
<color name="icontextactive">FFFFFFFF</color>
<color name="icontextinactive">FF333333</color>

View File

@ -19,7 +19,7 @@
<color name="fontmenuactive">FF333333</color>
<color name="progressbarback">FF222222</color>
<color name="progressbar">FFAF3B00</color>
<color name="progressbartimeshift">FF666666</color>
<color name="progressbartimeshift">FFEE6633</color>
<color name="cutmark">FF666666</color>
<color name="icontextactive">FFFFFFFF</color>
<color name="icontextinactive">FF333333</color>

View File

@ -9,6 +9,22 @@
</area>
</background>
<datetime>
<area x="80%" y="76%" width="17%" height="6%" layer="2">
<drawtext align="right" valign="center" fontsize="{areaheight}*{replaydatetimesize}/100" font="{regular}" color="{fontdefault}" text="{daynameshort} {day}.{monthnameshort}" />
</area>
</datetime>
<time>
<area x="80%" y="79%" width="14%" height="15%" layer="2">
<drawtext x="0" align="right" valign="center" fontsize="60%" font="{digital}" color="{fontdefault}" text="{hour}:{printf('%02d', min)}" />
</area>
<area x="94%" y="79%" width="5%" height="15%" layer="2">
<drawtext name="clock" x="0" align="right" valign="center" fontsize="60%" font="{digital}" color="clrTransparent" text="1" />
<drawtext name="clocksec" x="0" y="{areaheight}/2 + {height(clock)}/2 - {height(clocksec)} - 5" fontsize="45%" font="{digital}" color="{fontdefault}" text=":{printf('%02d', sec)}" />
</area>
</time>
<channelinfo>
<area x="0" y="80%" width="20%" height="20%" layer="2">
<drawimage cache="true" condition="{channellogoexists}" imagetype="channellogo" path="{channelid}" width="80%" height="80%" align="center" valign="center" />
@ -21,13 +37,12 @@
<epginfo>
<!-- current schedule -->
<area x="67%" y="76%" width="13%" height="10%" layer="2">
<drawtext align="right" valign="center" fontsize="{areaheight}*{startstopfontsize}/100" font="{bold}" color="{fontactive}" text="{currentstart} - {currentstop}" />
<drawtext condition="empty{currentsubtitle}" align="right" valign="center" fontsize="{areaheight}*{startstopfontsize}/100" font="{bold}" color="{fontactive}" text="{currentstart} - {currentstop}" />
<drawtext condition="isset{currentsubtitle}" align="right" y="{areaheight}*{epgtextposy}/100" fontsize="{areaheight}*{startstopfontsize}/100" font="{bold}" color="{fontactive}" text="{currentstart} - {currentstop}" />
</area>
<areascroll condition="{scrollepg}++empty{currentsubtitle}" scrollelement="title" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="fast" x="20%" y="76%" width="47%" height="10%" layer="2">
<drawtext name="title" x="0" valign="center" fontsize="{areaheight}*{epgtextfontsizelarge}/100" width="100%" font="{regular}" color="{fontdefault}" text="{currenttitle}" />
</areascroll>
<areascroll condition="{scrollepg}++isset{currentsubtitle}" scrollelement="title" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="fast" x="20%" y="76%" width="47%" height="10%" layer="2">
<drawtext name="title" x="0" y="{areaheight}*{epgtextposy}/100" fontsize="{areaheight}*{epgtextfontsize}/100" width="100%" font="{regular}" color="{fontdefault}" text="{currenttitle}" />
<areascroll condition="{scrollepg}" scrollelement="title" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="fast" x="20%" y="76%" width="47%" height="10%" layer="2">
<drawtext condition="empty{currentsubtitle}" name="title" x="0" valign="center" fontsize="{areaheight}*{epgtextfontsizelarge}/100" width="100%" font="{regular}" color="{fontdefault}" text="{currenttitle}" />
<drawtext condition="isset{currentsubtitle}" name="title" x="0" y="{areaheight}*{epgtextposy}/100" fontsize="{areaheight}*{epgtextfontsize}/100" width="100%" font="{regular}" color="{fontdefault}" text="{currenttitle}" />
</areascroll>
<areascroll condition="{scrollepg}++isset{currentsubtitle}" scrollelement="subtitle" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="fast" x="20%" y="76%" width="50%" height="10%" layer="3">
<drawtext name="subtitle" x="0" y="{areaheight}*{epgsubtextposy}/100" fontsize="{areaheight}*{epgsubtextfontsize}/100" width="100%" font="{regular}" color="{fontdefault}" text="{currentsubtitle}" />
@ -37,9 +52,13 @@
<drawtext condition="isset{currentsubtitle}" x="0" y="{areaheight}*{epgsubtextposy}/100" fontsize="{areaheight}*{epgsubtextfontsize}/100" width="{areawidth} - {width(startstop)} - 10" font="{regular}" color="{fontdefault}" text="{currentsubtitle}" />
<drawtext condition="empty{currentsubtitle}" x="0" valign="center" fontsize="{areaheight}*{epgtextfontsizelarge}/100" width="{areawidth} - {width(startstop)} - 10" font="{regular}" color="{fontdefault}" text="{currenttitle}" />
</area>
<area x="70%" y="83%" width="10%" height="3%" layer="2">
<drawtext align="right" y="0" fontsize="100%" font="{regular}" color="{fontactive}" text="+{currentremaining} min" />
<!-- time remaining -->
<area x="70%" y="82%" width="10%" height="4%" layer="2">
<drawtext condition="isset{currentsubtitle}" align="right" y="0" fontsize="75%" font="{regular}" color="{fontactive}" text="+{currentremaining} min" />
<drawtext condition="empty{currentsubtitle}" align="right" y="25%" fontsize="75%" font="{regular}" color="{fontactive}" text="+{currentremaining} min" />
</area>
<!-- next schedule -->
<area x="20%" y="88%" width="60%" height="10%" layer="2">
<drawtext name="startstop" align="right" valign="center" fontsize="{areaheight}*{startstopfontsize}/100" font="{bold}" color="{fontdefault}" text="{nextstart} - {nextstop}" />
@ -54,7 +73,9 @@
<fill color="{progressbarback}" />
</area>
<area x="20%" y="86%" width="60%" height="2%" layer="3">
<drawrectangle x="0" y="0" width="{areawidth}*{elapsed}/{duration}" height="100%" color="{progressbar}" />
<drawrectangle condition="not{permashift}" x="0" y="0" width="{areawidth}*{elapsed}/{duration}" height="100%" color="{progressbar}" />
<drawrectangle condition="{permashift}" x="{elapsed}/{duration}*{areawidth} - {livebuffer}/{duration}*{areawidth}" y="0" width="{livebuffer}/{duration}*{areawidth}" height="100%" color="{progressbartimeshift}" />
<drawrectangle condition="{permashift}" x="0" y="{areaheight}*0.2" width="{areawidth}*{elapsed}/{duration} - 1" height="{areaheight}*0.6" color="{progressbar}" />
</area>
</progressbar>
@ -117,7 +138,7 @@
</channelgroup>
<currentweather>
<area x="80%" y="76%" width="19%" height="5%" layer="2">
<area x="80%" y="91%" width="17%" height="4%" layer="2">
<drawtext name="temperature" align="right" y="0" fontsize="100%" font="{regular}" color="{fontdefault}" text="{temperature}°C" />
<drawimage imagetype="icon" path="{icon}" x="{posx(temperature)} - {areaheight}" valign="center" width="0.8*{areaheight}" height="0.8*{areaheight}"/>
</area>
@ -310,13 +331,6 @@
</areascroll>
</groupchannellistdetail>
<time>
<area x="80%" y="80%" width="20%" height="15%" layer="2">
<drawtext name="clock" x="11%" valign="center" fontsize="60%" font="{digital}" color="{fontdefault}" text="{hour}:{printf('%02d', min)}" />
<drawtext name="clocksec" x="{posx(clock)} + {width(clock)}" y="{areaheight}/2 - {height(clocksec)}/2 + {height(clock)}/2 - {height(clocksec)}/2 - 5" fontsize="45%" font="{digital}" color="{fontdefault}" text=":{printf('%02d', sec)}" />
</area>
</time>
<message>
<area x="10%" y="80%" width="80%" height="15%" layer="6">
<fill color="{messageback}" />

View File

@ -23,10 +23,13 @@
<drawrectangle x="0" y="{areaheight}-1" width="100%" height="1" color="{menubackline}" />
</area>
<!-- Separators -->
<area x="1%" condition="{separator}" width="98%" layer="3">
<drawtext align="center" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="98%" color="{fontactive}" text="{column1}" />
<area x="1%" condition="{separator} ++ not{setup} ++ not{neutrinoepg} ++ not{systeminfo} ++ not{column2set}" width="98%" layer="3">
<drawtext valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="98%" color="{fontactive}" text="{column1}" />
</area>
<!-- Setup Menus -->
<area x="1%" condition="{separator} ++ {setup}" width="98%" layer="3">
<drawtext align="center" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="98%" color="{fontactive}" text="{column1}" />
</area>
<areacontainer condition="not{separator} ++ {setup}">
<area condition="{column2set}" x="1%" width="69%" layer="3">
<drawtext condition="not{current}" x="0" width="99%" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" color="{fontdefault}" text="{column1}" />
@ -42,6 +45,9 @@
</area>
</areacontainer>
<!-- Neutrino EPG Plugin -->
<area x="1%" condition="{separator} ++ {neutrinoepg}" width="98%" layer="3">
<drawtext align="center" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="98%" color="{fontactive}" text="{column1}" />
</area>
<areacontainer condition="not{separator} ++ {neutrinoepg}">
<area condition="not{current}++{column5set}" x="1%" width="100%" layer="4">
<drawtext x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontdefault}" text="{column2}" />
@ -81,10 +87,14 @@
</area>
</areacontainer>
<!-- Systeminfo Plugin -->
<area x="1%" condition="{separator} ++ {systeminfo}" width="98%" layer="3">
<drawtext align="center" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="98%" color="{fontactive}" text="{column1}" />
</area>
<areacontainer condition="not{separator} ++ {systeminfo}">
<area condition="not{current}" x="1%" width="100%" layer="4">
<drawtext x="{column1x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column1width}" color="{fontdefault}" text="{column1}" />
<drawtext x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontdefault}" text="{column2}" />
<drawtext condition="not{column3set} ++ not{column3pb}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{areawidth}-{column2x}-5" color="{fontdefault}" text="{column2}" />
<drawtext condition="{column3set} || {column3pb}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontdefault}" text="{column2}" />
<drawtext condition="not{column3pb}" x="{column3x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column3width}" color="{fontdefault}" text="{column3}" />
<drawrectangle condition="{column3pb}" x="{column3x}" y="{areaheight}*0.2" width="{column3width}" height="{areaheight}*0.6" color="{progressbar}" />
<drawrectangle condition="{column3pb}" x="{column3x}+1" y="{areaheight}*0.2+1" width="{column3width}-2" height="{areaheight}*0.6-2" color="{progressbarback}" />
@ -92,7 +102,8 @@
</area>
<area condition="{current}" x="1%" width="100%" layer="4">
<drawtext x="{column1x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column1width}" color="{fontmenuactive}" text="{column1}" />
<drawtext x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontmenuactive}" text="{column2}" />
<drawtext condition="not{column3set} ++ not{column3pb}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{areawidth}-{column2x}-2" color="{fontmenuactive}" text="{column2}" />
<drawtext condition="{column3set} || {column3pb}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontmenuactive}" text="{column2}" />
<drawtext condition="not{column3pb}" x="{column3x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column3width}" color="{fontdefault}" text="{column3}" />
<drawrectangle condition="{column3pb}" x="{column3x}" y="{areaheight}*0.2" width="{column3width}" height="{areaheight}*0.6" color="{progressbar}" />
<drawrectangle condition="{column3pb}" x="{column3x}+1" y="{areaheight}*0.2+1" width="{column3width}-2" height="{areaheight}*0.6-2" color="{progressbarback}" />
@ -100,20 +111,32 @@
</area>
</areacontainer>
<!-- Default Menus -->
<areacontainer condition="not{separator} ++ not{setup} ++ not{neutrinoepg} ++ not{systeminfo}">
<areascroll scrollelement="column1" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="{column1width}" layer="3">
<drawtext condition="not{current}" x="{column1x}" width="{column1width}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" color="{fontdefault}" text="{column1}" />
<areacontainer condition="not{separator} ++ not{setup} ++ not{neutrinoepg} ++ not{systeminfo} || {column2set} ++ not{setup} ++ not{neutrinoepg} ++ not{systeminfo}">
<areascroll condition="{column2set}" scrollelement="column1" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="{column1width}" layer="3">
<drawtext condition="not{current} ++ not{separator}" x="{column1x}" width="{column1width}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" color="{fontdefault}" text="{column1}" />
<drawtext condition="not{current} ++ {separator}" x="{column1x}" width="{column1width}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" color="{fontactive}" text="{column1}" />
<drawtext condition="{current}" name="column1" x="{column1x}" width="{column1width}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" color="{fontmenuactive}" text="{column1}" />
</areascroll>
<area condition="not{current}" x="1%" width="100%" layer="4">
<drawtext condition="{column2set}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontdefault}" text="{column2}" />
<drawtext condition="{column3set}" x="{column3x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column3width}" color="{fontdefault}" text="{column3}" />
<drawtext condition="{column4set}" x="{column4x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column4width}" color="{fontdefault}" text="{column4}" />
<drawtext condition="{column5set}" x="{column5x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column5width}" color="{fontdefault}" text="{column5}" />
<drawtext condition="{column6set}" x="{column6x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column6width}" color="{fontdefault}" text="{column6}" />
<drawtext condition="not{column2set} ++ not{separator}" x="{column1x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{areawidth}-{column1x}" color="{fontdefault}" text="{column1}" />
<drawtext condition="not{column2set} ++ {separator}" x="{column1x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{areawidth}-{column1x}" color="{fontactive}" text="{column1}" />
<drawtext condition="{column2set} ++ {column3set} ++ not{separator}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontdefault}" text="{column2}" />
<drawtext condition="{column2set} ++ {column3set} ++ {separator}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontactive}" text="{column2}" />
<drawtext condition="{column2set} ++ not{column3set} ++ not{separator}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{areawidth}-{column2x}" color="{fontdefault}" text="{column2}" />
<drawtext condition="{column2set} ++ not{column3set} ++ {separator}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{areawidth}-{column2x}" color="{fontactive}" text="{column2}" />
<drawtext condition="{column3set} ++ not{separator}" x="{column3x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column3width}" color="{fontdefault}" text="{column3}" />
<drawtext condition="{column3set} ++ {separator}" x="{column3x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column3width}" color="{fontactive}" text="{column3}" />
<drawtext condition="{column4set} ++ not{separator}" x="{column4x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column4width}" color="{fontdefault}" text="{column4}" />
<drawtext condition="{column4set} ++ {separator}" x="{column4x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column4width}" color="{fontactive}" text="{column4}" />
<drawtext condition="{column5set} ++ not{separator}" x="{column5x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column5width}" color="{fontdefault}" text="{column5}" />
<drawtext condition="{column5set} ++ {separator}" x="{column5x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column5width}" color="{fontactive}" text="{column5}" />
<drawtext condition="{column6set} ++ not{separator}" x="{column6x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column6width}" color="{fontdefault}" text="{column6}" />
<drawtext condition="{column6set} ++ {separator}" x="{column6x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column6width}" color="{fontactive}" text="{column6}" />
</area>
<area condition="{current}" x="1%" width="100%" layer="4">
<drawtext condition="{column2set}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontmenuactive}" text="{column2}" />
<drawtext condition="not{column2set}" x="{column1x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{areawidth}-{column1x}" color="{fontmenuactive}" text="{column1}" />
<drawtext condition="{column2set} ++ {column3set}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column2width}" color="{fontmenuactive}" text="{column2}" />
<drawtext condition="{column2set} ++ not{column3set}" x="{column2x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{areawidth}-{column2x}" color="{fontmenuactive}" text="{column2}" />
<drawtext condition="{column3set}" x="{column3x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column3width}" color="{fontmenuactive}" text="{column3}" />
<drawtext condition="{column4set}" x="{column4x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column4width}" color="{fontmenuactive}" text="{column4}" />
<drawtext condition="{column5set}" x="{column5x}" valign="center" font="{regular}" fontsize="{areaheight}*{defaultitemfontsize}/100" width="{column5width}" color="{fontmenuactive}" text="{column5}" />

View File

@ -47,7 +47,8 @@
<drawtext name="line4" x="0" y="{posy(line3)} + {height(line3)} + 10" width="96%" font="{regular}" fontsize="{areaheight}*{detailtextsize}/100" color="{fontdefault}" text="{tr(reclengthcutted)}: {recordinglengthcutted}" />
<drawtext name="line5" x="0" y="{posy(line4)} + {height(line4)} + 10" width="96%" font="{regular}" fontsize="{areaheight}*{detailtextsize}/100" color="{fontdefault}" text="{tr(bitrate)}: {recordingbitrate}" />
<drawtext name="line6" x="0" y="{posy(line5)} + {height(line5)} + 10" width="96%" font="{regular}" fontsize="{areaheight}*{detailtextsize}/100" color="{fontdefault}" text="{tr(format)}: {recordingformat}" />
<drawtext x="0" y="{posy(line6)} + {height(line6)} + 10" width="96%" font="{regular}" fontsize="{areaheight}*{detailtextsize}/100" color="{fontdefault}" text="{tr(searchtimer)}: {searchtimer}" />
<drawtext condition="gt({errors}, -1)" name="line7" x="0" y="{posy(line6)} + {height(line6)} + 10" width="96%" font="{regular}" fontsize="{areaheight}*{detailtextsize}/100" color="{fontdefault}" text="{tr(errors)}: {errors}" />
<drawtext x="0" y="{posy(line6)} + 2 * {height(line6)} + 20" width="96%" font="{regular}" fontsize="{areaheight}*{detailtextsize}/100" color="{fontdefault}" text="{tr(searchtimer)}: {searchtimer}" />
</tab>
<!-- TAB ACTORS -->

View File

@ -16,15 +16,15 @@
</backgroundmodeonly>
<datetime>
<area x="75%" y="75%" width="13%" height="6%" layer="2">
<area x="85%" y="75%" width="14%" height="6%" layer="2">
<drawtext align="right" y="0" fontsize="{areaheight}*{replaydatetimesize}/100" font="{regular}" color="{fontdefault}" text="{daynameshort} {day}.{monthnameshort}" />
</area>
</datetime>
<time>
<area x="89%" y="75%" width="11%" height="6%" layer="2">
<drawtext name="clock" x="0" y="0" fontsize="{areaheight}*{replaydatetimesize}/100" font="{regular}" color="{fontdefault}" text="{hour}:{printf('%02d', min)}" />
<drawtext name="clocksec" x="{posx(clock)} + {width(clock)}" y="{height(clock)} - {height(clocksec)} - 1" fontsize="{areaheight}*{replaydatetimesize}*0.8/100" font="{regular}" color="{fontdefault}" text=":{printf('%02d', sec)}" />
<area x="80%" y="80%" width="19%" height="5%" layer="2">
<drawtext name="clocksec" align="right" y="{height(clock)} - {height(clocksec)} - 1" fontsize="{areaheight}*{replaydatetimesize}*0.8/100" font="{regular}" color="{fontdefault}" text=":{printf('%02d', sec)}" />
<drawtext name="clock" x="{posx(clocksec)} - {width(clock)}" y="0" fontsize="{areaheight}*{replaydatetimesize}/100" font="{regular}" color="{fontdefault}" text="{hour}:{printf('%02d', min)}" />
</area>
</time>
@ -38,7 +38,12 @@
</scrapercontent>
<rectitle>
<area x="12%" y="75%" width="63%" height="6%" layer="2">
<area condition="{timeshift}" x="12%" y="75%" width="73%" height="6%" layer="2">
<drawtext name="eventtime" align="right" y="0" fontsize="{areaheight}*{replaytitlesize}/100" font="{bold}" color="{fontactive}" text= "{eventstart} - {eventstop}" />
<drawtext name="title" x="0" y="0" width="{areawidth} - {width(eventtime)} - 2" fontsize="{areaheight}*{replaytitlesize}/100" font="{regular}" color="{fontdefault}" text="{rectitle}" />
<drawtext condition="isset{title} ++ isset{recsubtitle}" x="{width(title)}" y="0" width="{areawidth} - {width(title)} - {width(eventtime)} - 2" fontsize="{areaheight}*{replaytitlesize}/100" font="{regular}" color="{fontdefault}" text=" - {recsubtitle}" />
</area>
<area condition="not{timeshift}" x="12%" y="75%" width="63%" height="6%" layer="2">
<drawtext name="title" x="0" y="0" fontsize="{areaheight}*{replaytitlesize}/100" font="{regular}" color="{fontdefault}" text="{rectitle}" />
<drawtext condition="isset{title} ++ isset{recsubtitle}" x="{width(title)}" y="0" fontsize="{areaheight}*{replaytitlesize}/100" font="{regular}" color="{fontdefault}" text=" - {recsubtitle}" />
</area>
@ -68,39 +73,55 @@
</recinfo>
<currenttime>
<area x="12%" y="86%" width="15%" height="5%" layer="2">
<area condition="not{timeshift}" x="12%" y="87%" width="15%" height="5%" layer="2">
<drawtext x="0" y="0" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" font="{regular}" color="{fontdefault}" text="{reccurrent}" />
</area>
<area condition="{timeshift}" x="12%" y="90%" width="15%" height="5%" layer="2">
<drawtext x="0" y="0" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" font="{regular}" color="{fontdefault}" text="({reccurrent})" />
</area>
</currenttime>
<totaltime>
<area x="80%" y="86%" width="19%" height="5%" layer="2">
<drawtext condition="not{timeshift}" align="right" y="0" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" font="{regular}" color="{fontdefault}" text="{rectotal}" />
<drawtext condition="{timeshift}" align="right" y="0" font="{regular}" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" color="{fontdefault}" text="{timeshifttotal} ({rectotal})" />
<area condition="not{timeshift}" x="80%" y="87%" width="19%" height="5%" layer="2">
<drawtext align="right" y="0" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" font="{regular}" color="{fontdefault}" text="{rectotal}" />
</area>
<area condition="{timeshift}" x="80%" y="90%" width="19%" height="5%" layer="2">
<drawtext align="right" y="0" font="{regular}" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" color="{fontdefault}" text="{timeshifttotal} ({rectotal})" />
</area>
</totaltime>
<timeshifttimes>
<area condition="{timeshift}" x="12%" y="81%" width="19%" height="5%" layer="2">
<drawtext align="left" y="0" fontsize="{areaheight}*{replayendtimesize}/100" font="{regular}" color="{fontdefault}" text="{tr(start)}: {recstart}" />
</area>
<area condition="{timeshift}" x="40%" y="81%" width="20%" height="5%" layer="2">
<drawtext condition="eq({timeshift}, 1)" align="center" y="0" fontsize="{areaheight}*{replayendtimesize}/100" font="{regular}" color="{fontdefault}" text="{tr(rest)}: -{timeshiftrest}" />
<drawtext condition="gt({timeshift}, 1)" align="center" y="0" fontsize="{areaheight}*{replayendtimesize}/100" font="{regular}" color="{fontdefault}" text="Timeshift Mode {tr(rest)}: -{timeshiftrest}" />
</area>
<area condition="{timeshift}" x="12%" y="87%" width="19%" height="5%" layer="2">
<drawtext align="left" y="0" fontsize="{areaheight}*{replayendtimesize}/100" font="{regular}" color="{fontdefault}" text="{tr(playback)}: {playbacktime}" />
</area>
</timeshifttimes>
<endtime>
<area x="80%" y="90%" width="19%" height="5%" layer="2">
<area condition="{timeshift}" x="80%" y="87%" width="19%" height="5%" layer="2">
<drawtext align="right" y="0" fontsize="{areaheight}*{replayendtimesize}/100" font="{regular}" color="{fontdefault}" text="{tr(end)}: {recend}" />
</area>
</endtime>
<progressbar>
<area background="true" x="12%" y="83%" width="87%" height="3%" layer="2">
<area background="true" x="12%" y="84%" width="87%" height="3%" layer="2">
<fill color="{progressbarback}" />
</area>
<area condition="not{timeshift}" x="12%" y="83%" width="87%" height="3%" layer="3">
<drawrectangle x="0" y="0" width="{areawidth}*{current}/{total}" height="100%" color="{progressbar}" />
</area>
<area condition="{timeshift}" x="12%" y="83%" width="87%" height="3%" layer="3">
<drawrectangle x="0" y="0" width="{total}/{timeshifttotal}*{areawidth}" height="{areaheight}" color="{progressbartimeshift}" />
<drawrectangle x="0" y="0" width="{current}/{timeshifttotal}*{areawidth}" height="{areaheight}" color="{progressbar}" />
<area x="12%" y="84%" width="87%" height="3%" layer="3">
<drawrectangle condition="not{timeshift}" x="0" y="0" width="{areawidth}*{current}/{total}" height="100%" color="{progressbar}" />
<drawrectangle condition="{timeshift}" x="0" y="{areaheight}*0.2" width="{total}/{timeshifttotal}*{areawidth}" height="{areaheight}*0.6" color="{progressbartimeshift}" />
<drawrectangle condition="{timeshift}" x="0" y="0" width="{current}/{timeshifttotal}*{areawidth}" height="{areaheight}" color="{progressbar}" />
</area>
</progressbar>
<cutmarks>
<area condition="not{timeshift}" x="12%" y="83%" width="87%" height="3%" layer="4">
<area condition="not{timeshift}" x="12%" y="84%" width="87%" height="3%" layer="4">
<loop name="marks" x="0" y="0" orientation="absolute">
<!-- draw mark -->
<drawrectangle x="{marks[position]}/{marks[total]}*{areawidth}-2" y="0" width="4" height="100%" color="{cutmark}" />
@ -112,6 +133,18 @@
<drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="30%" width="{marks[endposition]}/{marks[total]}*{areawidth} - {marks[position]}/{marks[total]}*{areawidth}" height="40%" color="{cutmark}" />
</loop>
</area>
<area condition="{timeshift}" x="12%" y="84%" width="87%" height="3%" layer="4">
<loop name="marks" x="0" y="0" orientation="absolute">
<!-- draw mark -->
<drawrectangle x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}-2" y="0" width="4" height="100%" color="{cutmark}" />
<drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}" y="0" width="5" height="2" color="{cutmark}" />
<drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}" y="{areaheight}-2" width="5" height="2" color="{cutmark}" />
<drawrectangle condition="not{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}-5" y="0" width="5" height="2" color="{cutmark}" />
<drawrectangle condition="not{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}-5" y="{areaheight}-2" width="5" height="2" color="{cutmark}" />
<!-- draw bar to next mark if mark is startmark-->
<drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}" y="30%" width="{marks[endposition]}/{marks[timeshifttotal]}*{areawidth} - {marks[position]}/{marks[timeshifttotal]}*{areawidth}" height="40%" color="{cutmark}" />
</loop>
</area>
</cutmarks>
<controlicons>

View File

@ -314,8 +314,9 @@
<drawrectangle x="0" y="0" width="2" height="100%" color="{menubackline}" />
<drawrectangle x="0" y="{areaheight}-2" width="100%" height="2" color="{menubackline}" />
<!--<drawrectangle x="{areawidth}-2" y="0" width="2" height="100%" color="{menubackline}" />-->
<drawimage condition="{timer}++{timerisactive}" imagetype="icon" path="ico_timer_is_active" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />
<drawimage condition="{timer}++not{timerisactive}" imagetype="icon" path="ico_timer_is_inactive" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />
<drawimage condition="{timer}" imagetype="icon" path="ico_timer_is_active" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />
<!--<drawimage condition="{timer}++{timerisactive}" imagetype="icon" path="ico_timer_is_active" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />
<drawimage condition="{timer}++not{timerisactive}" imagetype="icon" path="ico_timer_is_inactive" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />-->
</area>
<!--EPG without time-->
<area condition="not{tvgshowtime}" layer="4">
@ -324,8 +325,9 @@
<drawrectangle x="0" y="0" width="2" height="100%" color="{menubackline}" />
<drawrectangle x="0" y="{areaheight}-2" width="100%" height="2" color="{menubackline}" />
<!--<drawrectangle x="{areawidth}-2" y="0" width="2" height="100%" color="{menubackline}" />-->
<drawimage condition="{timer}++{timerisactive}" imagetype="icon" path="ico_timer_is_active" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />
<drawimage condition="{timer}++not{timerisactive}" imagetype="icon" path="ico_timer_is_inactive" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />
<drawimage condition="{timer}" imagetype="icon" path="ico_timer_is_active" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />
<!--<drawimage condition="{timer}++{timerisactive}" imagetype="icon" path="ico_timer_is_active" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />
<drawimage condition="{timer}++not{timerisactive}" imagetype="icon" path="ico_timer_is_inactive" x="{areawidth} - {areaheight}*0.4 - 5" y="5" width="0.4*{areaheight}" height="0.4*{areaheight}" />-->
</area>
</grid>

19
skins/metrixhd/globals.xml Normal file → Executable file
View File

@ -89,14 +89,14 @@
<trans lang="de_DE">Wiederholungen</trans>
<trans lang="fi_FI">Uusinnat</trans>
<trans lang="hu_HU">Ismétlés</trans>
<trans lang="it_IT">Riavvii</trans>
<trans lang="it_IT">Repliche</trans>
</token>
<token name="tr(rerunsof)">
<trans lang="en_EN">Reruns of</trans>
<trans lang="de_DE">Wiederholungen von</trans>
<trans lang="fi_FI">Uusinnat:</trans>
<trans lang="hu_HU">Ismétlés:</trans>
<trans lang="it_IT">Riavvi di</trans>
<trans lang="it_IT">Repliche di</trans>
</token>
<token name="tr(actors)">
<trans lang="en_EN">Actors</trans>
@ -215,14 +215,14 @@
<trans lang="de_DE">Einnahmen</trans>
<trans lang="fi_FI">Tuotto</trans>
<trans lang="hu_HU">Bevétel</trans>
<trans lang="it_IT">Incassi</trans>
<trans lang="it_IT">Incasso</trans>
</token>
<token name="tr(adult)">
<trans lang="en_EN">Adult</trans>
<trans lang="de_DE">Nur für Erwachsene</trans>
<trans lang="fi_FI">Vain aikuisille</trans>
<trans lang="hu_HU">Felnőtt</trans>
<trans lang="it_IT">Adulti</trans>
<trans lang="it_IT">Adulto</trans>
</token>
<token name="tr(releasedate)">
<trans lang="en_EN">Release Date</trans>
@ -236,7 +236,7 @@
<trans lang="de_DE">Laufzeit</trans>
<trans lang="fi_FI">Kesto</trans>
<trans lang="hu_HU">Hossz</trans>
<trans lang="it_IT">Runtime</trans>
<trans lang="it_IT">Durata</trans>
</token>
<token name="tr(popularity)">
<trans lang="en_EN">Popularity</trans>
@ -278,7 +278,7 @@
<trans lang="de_DE">Länge der Aufnahme</trans>
<trans lang="fi_FI">Tallenteen pituus</trans>
<trans lang="hu_HU">Felvétel hossza</trans>
<trans lang="it_IT">Lnghezza registrazzione</trans>
<trans lang="it_IT">Lunghezza registrazione</trans>
</token>
<token name="tr(reclengthcutted)">
<trans lang="en_EN">Cutted Recording Length</trans>
@ -383,7 +383,7 @@
<trans lang="de_DE">Windgeschwindigkeit</trans>
<trans lang="fi_FI">Tuulen nopeus</trans>
<trans lang="hu_HU">Szélsebesség</trans>
<trans lang="it_IT">Velcità vento</trans>
<trans lang="it_IT">Velocità vento</trans>
</token>
<token name="tr(cloudcover)">
<trans lang="en_EN">Cloud Cover</trans>
@ -465,22 +465,27 @@
<token name="tr(lastrecs)">
<trans lang="en_EN">last recordings</trans>
<trans lang="de_DE">Neueste Aufnahmen</trans>
<trans lang="it_IT">ultime registrazioni</trans>
</token>
<token name="tr(sysinfo)">
<trans lang="en_EN">system information</trans>
<trans lang="de_DE">System Informationen</trans>
<trans lang="it_IT">info di sistema</trans>
</token>
<token name="tr(load)">
<trans lang="en_EN">System load:</trans>
<trans lang="de_DE">Systemlast:</trans>
<trans lang="it_IT">Utilizzo del sistema</trans>
</token>
<token name="tr(vdrcpu)">
<trans lang="en_EN">VDR CPU</trans>
<trans lang="de_DE">VDR CPU</trans>
<trans lang="it_IT">VDR CPU</trans>
</token>
<token name="tr(new)">
<trans lang="en_EN">new</trans>
<trans lang="de_DE">neu</trans>
<trans lang="it_IT">nuovo</trans>
</token>
</translations>
<fonts>

View File

@ -40,79 +40,98 @@
<token name="tr(sepmainmenu)">
<trans lang="en_EN">Main Menu</trans>
<trans lang="de_DE">Hauptmenü</trans>
<trans lang="it_IT">Menù principale</trans>
</token>
<token name="tr(mainmenusmall)">
<trans lang="en_EN">Small Main Menu</trans>
<trans lang="de_DE">Schmales Hauptmenü</trans>
<trans lang="it_IT">Menù principale piccolo</trans>
</token>
<token name="tr(fadecurrenttext)">
<trans lang="en_EN">Fade time of current element [ms]</trans>
<trans lang="de_DE">Einblendzeit des aktiven Elements [ms]</trans>
<trans lang="it_IT">Tempo di dissolvenza dell'elemento attuale</trans>
</token>
<token name="tr(helpfadecurrent)">
<trans lang="en_EN">Fade time in ms. If this is set to a value larger 0 the current OSD element fade in and out.</trans>
<trans lang="de_DE">Einblendzeit in ms. Ist dieser Wert auf einen Wert > 0 gesetzt, wird das aktive OSD Element ein- und ausgeblendet</trans>
<trans lang="it_IT">Tempo di dissolvenza in ms. Settato a valore > 0 l'attuale OSD si dissolve in entrata e uscita</trans>
</token>
<token name="tr(helpshowinformation)">
<trans lang="en_EN">Show information about timers, newest recordings, system load... 'oldstyle' showes the wide timer element but lacks some other infos.</trans>
<trans lang="de_DE">Zeige Informationen über Timer, neuste Aufnahmen, Systemlast... 'oldstyle' zeigt dabei des breite Timer-Element, nutzt dafür aber nicht alle Infos.</trans>
<trans lang="it_IT">Mostra info su timers, nuove registrazioni, carico sistema... 'oldstyle mostra l'elemento timer ampio ma mancano altre info </trans>
</token>
<token name="tr(helpshowscrollbar)">
<trans lang="en_EN">Show Scrollbar in Main Menu. Auto hides the scrollbar if its not needed.</trans>
<trans lang="de_DE">Zeige die Scroll-Leiste im Hauptmenü. Auto versteckt die Leiste, wenn sie nicht benötigt wird.</trans>
<trans lang="it_IT">Mostra barra scorrimento in menù principale. Auto disabilita la barra se non necessaria</trans>
</token>
<token name="tr(helpshowweather)">
<trans lang="en_EN">Off, main menu only or main menu and channelinfo</trans>
<trans lang="de_DE">Aus, nur Hauptmenü oder Haputmenü und Kanalinformationen</trans>
<trans lang="it_IT">Spento, solo menù principale o menù princ. e info canale</trans>
</token>
<token name="tr(infolistitemsmaxtext)">
<trans lang="en_EN">Number of Information lists items (max)</trans>
<trans lang="de_DE">Elemente in den Info-Listen (max)</trans>
<trans lang="it_IT">Numero voci lista Informazioni (max)</trans>
</token>
<token name="tr(chlistitemsmaxtext)">
<trans lang="en_EN">Number of Channel list items (max)</trans>
<trans lang="de_DE">Elemente in der Kanalliste (max)</trans>
<trans lang="it_IT">Numero voci lista canali (max)</trans>
</token>
<token name="tr(listitemsmaxtext)">
<trans lang="en_EN">Number of list items (max)</trans>
<trans lang="de_DE">Elemente in andern Listen (max)</trans>
<trans lang="it_IT">Numero voci lista (max)</trans>
</token>
<token name="tr(menuitemsmaxtext)">
<trans lang="en_EN">Number of Main Menu items (max)</trans>
<trans lang="de_DE">Elemente im Hauptmenü (max)</trans>
<trans lang="it_IT">Numero voci Menù principale (max)</trans>
</token>
<token name="tr(menu)">
<trans lang="en_EN">main menu</trans>
<trans lang="de_DE">im Hauptmenü</trans>
<trans lang="it_IT">menù principale</trans>
</token>
<token name="tr(no)">
<trans lang="en_EN">no</trans>
<trans lang="de_DE">nein</trans>
<trans lang="it_IT">no</trans>
</token>
<token name="tr(yes)">
<trans lang="en_EN">yes</trans>
<trans lang="de_DE">ja</trans>
<trans lang="it_IT">si</trans>
</token>
<token name="tr(auto)">
<trans lang="en_EN">automatic</trans>
<trans lang="de_DE">automatisch</trans>
<trans lang="it_IT">automatico</trans>
</token>
<token name="tr(oldstyle)">
<trans lang="en_EN">oldsytle</trans>
<trans lang="de_DE">oldstyle</trans>
<trans lang="it_IT">oldstyle</trans>
</token>
<token name="tr(showscrollbar)">
<trans lang="en_EN">Show Scrollbar</trans>
<trans lang="de_DE">Zeige Scrollbar</trans>
<trans lang="it_IT">Mostra barra scorrimento</trans>
</token>
<token name="tr(showweather)">
<trans lang="en_EN">Show Weather info</trans>
<trans lang="de_DE">Wetter Info anzeigen</trans>
<trans lang="it_IT">Mostra info Meteo</trans>
</token>
<token name="tr(showinformation)">
<trans lang="en_EN">Show Information in main menu</trans>
<trans lang="de_DE">Zeige Informationen im Hauptmenü</trans>
<trans lang="it_IT">Mostra info nel menù principale</trans>
</token>
<!-- displaychannel / zapcockpit -->
<token name="tr(sepzapcockpit)">
@ -142,18 +161,19 @@
<token name="tr(doitsimple)">
<trans lang="en_EN">Disable text scolling</trans>
<trans lang="de_DE">Text-Scrolling abschalten</trans>
<trans lang="it_IT">Disabilita scorrimento testo</trans>
</token>
<token name="tr(zapchannelhintsheight)">
<trans lang="en_EN">Height channel hints (% of screen height)</trans>
<trans lang="de_DE">Höhe Kanal Hinweise (% der Bildschirmhöhe)</trans>
<trans lang="fi_FI">Korkeus (% näytön korkeudesta)</trans>
<trans lang="it_IT">Altezza suggerimenti canale (% della altezza del video)</trans>
<trans lang="it_IT">Altezza suggerimenti canale (in % altezza dello schermo)</trans>
</token>
<token name="tr(zapchannelhintswidth)">
<trans lang="en_EN">Width channel hints (% of screen width)</trans>
<trans lang="de_DE">Breite Kanal Hinweise (% der Bildschirmbreite)</trans>
<trans lang="fi_FI">Leveys (% näytön leveydestä)</trans>
<trans lang="it_IT">Larghezza suggerimenti canale (% della larghezza del video)</trans>
<trans lang="it_IT">Larghezza suggerimenti canale (in % larghezza dello schermo)</trans>
</token>
<!-- metrixhd -->
<token name="tr(fadetext)">
@ -166,7 +186,7 @@
<trans lang="en_EN">Fade time in ms. If this is set to a value larger 0 all OSD elements beside the VDR menu fade in and out.</trans>
<trans lang="de_DE">Einblendzeit in ms. Ist dieser Wert auf einen Wert > 0 gesetzt, werden alle OSD Elemente ausser dem VDR Menu ein- und ausgeblendet</trans>
<trans lang="fi_FI">Häivytyksen kesto millisekunteina. Nollasta eriävä arvo aktivoi häivytyksen.</trans>
<trans lang="it_IT">Tempo di dissolvenza in ms. Se settato su un valore maggiore di 0 tutti gli elementi OSD accanto al menu di VDR si dissolvono in entrata ed uscita.</trans>
<trans lang="it_IT">Tempo di dissolvenza in ms. Settato > di 0 tutti gli elementi OSD accanto al menu di VDR si dissolvono in entrata ed uscita.</trans>
</token>
<token name="tr(shifttimechanneltext)">
<trans lang="en_EN">Shift time Channel Display [ms]</trans>
@ -178,7 +198,7 @@
<trans lang="en_EN">Shifting time in ms. If this is set to a value larger 0 all OSD elements beside the VDR menu are shifted in and out from the bottom of the screen. If fadetime is also set to a value larger 0, still shifting is performed</trans>
<trans lang="de_DE">Einfahrzeit in ms. Ist dieser Wert auf einen Wert > 0 gesetzt, werden alle OSD Elemente ausser dem VDR Menu vom unteren Rand des Bildschirms herein- und herausgefahren. Falls fadetime ebenfalls auf einen Wert größer 0 gesetzt ist, wird das OSD trotzdem herein- und herausgefahren.</trans>
<trans lang="fi_FI">Liukuman kesto millisekunteina. Nollasta eriävä arvo aktivoi valikkojen transitioefektit riippumatta häivytyksen kestosta.</trans>
<trans lang="it_IT">Tempi cambio canale in ms. Se settato su un valore maggiore di 0 tutti gli elementi OSD accanto al menu di VDR vengono spostati in e out dal basso dello schermo. Lo spostamento è effettuato anche con tempo di dissolvenza maggiore di 0</trans>
<trans lang="it_IT">Tempi cambio canale in ms. Settato su un valore > di 0 tutti gli elementi OSD accanto al menu di VDR vengono spostati in e out dal basso dello schermo. Lo spostamento è effettuato anche con tempo di dissolvenza > di 0</trans>
</token>
<token name="tr(shifttimedatetimetext)">
<trans lang="en_EN">Shift time Channel Date, Time, Weather [ms]</trans>
@ -190,7 +210,7 @@
<trans lang="en_EN">Shifting time of OSD Elements date, time and weather when switching in ms. If set to 0, the elements are shown immediately.</trans>
<trans lang="de_DE">Einfahrzeit der OSD Elemente Datum, Zeit und Wetter während des Umschaltens in ms. Steht dieser Wert auf 0, werden die Elemente sofort angezeigt.</trans>
<trans lang="fi_FI">Liukuman kesto millisekunteina. Nollasta eriävä arvo aktivoi päivämäärän, kellonajan ja säätietojen transitioefektit.</trans>
<trans lang="it_IT">Tempi di cambio degli elemti OSD, Canale, Data, Tempo, Previsioni espressi in ms. Se impostato a0 gli elementi sono mostrati immediatamente.</trans>
<trans lang="it_IT">Tempi di cambio degli elemti OSD, Canale, Data, Tempo, Previsioni espressi in ms. Settato a 0 gli elementi sono mostrati immediatamente.</trans>
</token>
<token name="tr(shifttimetimerstext)">
<trans lang="en_EN">Shift time Timers Main Menu [ms]</trans>
@ -202,23 +222,27 @@
<trans lang="en_EN">Shifting time of timers display in main menu in ms. If set to 0, the timers are shown immediately.</trans>
<trans lang="de_DE">Einfahrzeit der Timer im Hauptmenü in ms. Steht dieser Wert auf 0, werden die Timer sofort angezeigt.</trans>
<trans lang="fi_FI">Liukuman kesto millisekunteina. Nollasta eriävä arvo aktivoi transitioefektit päävalikon ajastimille.</trans>
<trans lang="it_IT">Tempi di cambio del display dei Timer nel menù principale in ms. Se impostati a 0, i timers sono mostrati immediatamente.</trans>
<trans lang="it_IT">Tempi di cambio del display dei Timer nel menù principale in ms. Impostati a 0, i timers sono mostrati immediatamente.</trans>
</token>
<token name="tr(listfadetimetext)">
<trans lang="en_EN">Fade time menus [ms]</trans>
<trans lang="de_DE">Überblendungszeit Menüs [ms]</trans>
<trans lang="it_IT">Menù tempo dissolvenza [ms]</trans>
</token>
<token name="tr(listshifttimetext)">
<trans lang="en_EN">Shift time menus [ms]</trans>
<trans lang="de_DE">Übergangszeit Menüelemente [ms]</trans>
<trans lang="it_IT">Menù tempo cambio [ms]</trans>
</token>
<token name="tr(helplistfadetime)">
<trans lang="en_EN">Fade time of menu elements when scrolling through the menus. If set to 0, this effect is disabled.</trans>
<trans lang="de_DE">Überblendungszeit der Menüelemente beim Bewegen durch die Menüs. Steht dieser Wert auf 0, ist dieser Effekt deaktiviert.</trans>
<trans lang="it_IT">Tempo dissolvenza menù elementi scorrendo i menù. Settato a 0, questo effetto è disabilitato</trans>
</token>
<token name="tr(helplistshifttime)">
<trans lang="en_EN">Shift time of menu elements when scrolling through the menus. If set to 0, this effect is disabled.</trans>
<trans lang="de_DE">Übergangszeit der Menüelemente beim Bewegen durch die Menüs. Steht dieser Wert auf 0, ist dieser Effekt deaktiviert.</trans>
<trans lang="it_IT">Tempo cambio menù elementi scorrendo i menù. Settato a 0, questo effetto è disabilitato</trans>
</token>
<token name="tr(showdevices)">
<trans lang="en_EN">Show DVB device info</trans>
@ -230,7 +254,7 @@
<trans lang="en_EN">If set to true, information about usage of each available DVB device is displayed during channel switching and in the main menu</trans>
<trans lang="de_DE">Falls diese Option aktiviert ist, werden beim Umschalten und im Hauptmenü Informationen über alle verfügbaren DVB Devices ausgegeben.</trans>
<trans lang="fi_FI">Näytetään DVB-laitteiden käyttötiedot päävalikossa ja kanavanvaihdossa.</trans>
<trans lang="it_IT">Se settata su true, sono mostrate info riguardo l'uso di ciascun device DVB durante i cambi canale e nel menù principale.</trans>
<trans lang="it_IT">Settata su true, sono mostrate info riguardo l'uso di ciascun device DVB durante i cambi canale e nel menù principale.</trans>
</token>
<token name="tr(mainmenuorientation)">
<trans lang="en_EN">Orientation of main menu</trans>
@ -242,7 +266,7 @@
<trans lang="en_EN">Orientation of main menu. If orientation is set to horizontal, only the current list element is displayed. If set to vertical, 8 elements are shown in the list.</trans>
<trans lang="de_DE">Ausrichtung des Hauptmenüs. Falls die Ausrichtung auf horizontal gesetzt ist, wird nur das aktuelle Listenelement ausgegeben. Ist die Ausrichtung vertikal, werden 8 Listenelemente angezeigt.</trans>
<trans lang="fi_FI">Päävalikon orientaatio. Vaakasuuntainen: näytetään ainoastaan aktiivinen listaelementti. Pystysuuntainen: näytetään 8 elementtiä listana.</trans>
<trans lang="it_IT">Orientamento menù principale. Se l'orientamento è su orizzontale, è mostrato solo l'attuale lista degli elementi. Se settata su verticale, nella lista sono mostrati 8 elementi.</trans>
<trans lang="it_IT">Orientamento menù principale. Settato su orizzontale, è mostrato solo l'attuale lista degli elementi. Se settata su verticale, nella lista sono mostrati 8 elementi.</trans>
</token>
<token name="tr(recmenuorientation)">
<trans lang="en_EN">Orientation of recordings menu</trans>
@ -259,6 +283,7 @@
<token name="tr(setupmenuorientation)">
<trans lang="en_EN">Orientation of setup menu</trans>
<trans lang="de_DE">Ausrichtung des Einstellungsmenüs</trans>
<trans lang="it_IT">Orientamento Menù setup</trans>
</token>
<token name="tr(horizontal)">
<trans lang="en_EN">horizontal menu</trans>

View File

@ -28,7 +28,6 @@
<area x="22%" y="80%" width="76%" height="7%" layer="2">
<drawtext name="title" x="0" valign="center" font="{light}" fontsize="99%" color="{fontdefault}" text="{currenttitle}" width="{areawidth} - {width(startstop)}"/>
<drawtext name="startstop" align="right" y="0" font="{light}" fontsize="60%" color="{fontdefault}" text="{currentstart} - {currentstop}" />
<drawtext align="right" y="45%" font="{light}" fontsize="60%" color="{fontdefault}" text="+ {currentremaining} min" />
</area>
<area x="22%" y="87%" width="76%" height="7%" layer="2">
<drawtext x="0" valign="center" font="{light}" fontsize="80%" color="{fontdefault}" text="{nexttitle}" width="{areawidth} - {width(startstop)}"/>
@ -47,6 +46,9 @@
<drawrectangle x="{elapsed}/{duration}*{areawidth} - {livebuffer}/{duration}*{areawidth}" y="0" width="{livebuffer}/{duration}*{areawidth}" height="5" color="{clrRed}" />
<drawrectangle x="0" y="1" width="{elapsed}/{duration}*{areawidth}" height="3" color="{menuheader}" />
</area>
<area x="22%" y="80%" width="76%" height="7%" layer="2">
<drawtext align="right" y="45%" font="{light}" fontsize="60%" color="{fontdefault}" text="+ {currentremaining} min" />
</area>
</progressbar>
<statusinfo>

View File

@ -25,7 +25,7 @@
{currentdurationhours} Duration, full hours
{currentdurationminutes} Duration, rest of minutes
{currentelapsed} Elapsed time of current Schedule in min
{currentremaining} Remaining time of current Schedule in min
{currentremaining} Remaining time of current Schedule in min -> DEPRECATED, it doesn't work as expected
{currentrecording} true if current Schedule is recorded
{hasVPS} true if current Schedule has VPS
{nexttitle} Title of next Schedule
@ -48,6 +48,7 @@
{remaining} Remaining time of current Schedule in seconds
{permashift} true if permashift plugin is in use
{livebuffer} current buffered data in seconds
{currentremaining} Remaining time of current Schedule in min
-->
<progressbar>
</progressbar>

View File

@ -55,6 +55,15 @@
-->
<time>
</time>
<!-- Available Variables vdrstatus
{vdrIsRecordingsHandlersActive} true if active RecordingsHandlers (cut,copy,move) aka "busy"
{vdrIsRecording} true if active recording
{vdrHasTimers} true if numtimers > 0
-->
<vdrstatus>
</vdrstatus>
<!-- Available Variables sortmode:
{sortnumber} true if menu is sorted by number
{sortname} true if menu is sorted alphabetical

View File

@ -33,6 +33,7 @@
{isHD} true if recording is HD/UHD (from EPG info)
{isUHD} true if recording is UHD (from EPG info)
{isRadio} true if recording is AudioOnly (from EPG info)
{errors} recording errors (-1 if not available)
-->
<detailheader>
</detailheader>
@ -57,6 +58,7 @@
{isHD} true if recording is HD/UHD (from EPG info)
{isUHD} true if recording is HD (from EPG info)
{isRadio} true if recording is AudioOnly (from EPG info)
{errors} recording errors (-1 if not available)
{recordingsize} size of recording (automatically in GB / MB)
{recordingsizecutted} size of cutted recording (automatically in GB / MB)

View File

@ -91,6 +91,14 @@
<vdrstatistics>
</vdrstatistics>
<!-- Available Variables vdrstatus
{vdrIsRecordingsHandlersActive} true if active RecordingsHandlers (cut,copy,move) aka "busy"
{vdrIsRecording} true if active recording
{vdrHasTimers} true if numtimers > 0
-->
<vdrstatus>
</vdrstatus>
<!-- Available Variables tempreatures:
{cputemp} current cpu temperature in °C
{gputemp} current gpu temperature in °C

View File

@ -39,6 +39,7 @@
{isHD} true if recording is HD/UHD (from EPG info)
{isUHD} true if recording is UHD (from EPG info)
{isRadio} true if recording is AudioOnly (from EPG info)
{errors} recording errors (-1 if not available)
-->
<listelement>
</listelement>
@ -84,6 +85,7 @@
{isHD} true if recording is HD/UHD (from EPG info)
{isUHD} true if recording is UHD (from EPG info)
{isRadio} true if recording is AudioOnly (from EPG info)
{errors} recording errors (-1 if not available)
-->
<currentelement delay="500" fadetime="0">
</currentelement>

View File

@ -56,6 +56,10 @@
{recsubtitle} Subtitle of the Recording
{recdate} Date Recording in dd.mm.yy
{rectime} Time of Recording in hh:mm
{eventstart} Starttime of coresponding event in timeshiftmode in hh:mm
{eventstop} Endtime of coresponding event in timeshiftmode in hh:mm
{timeshift} 1 if a active recording is displayed
2 if a timeshift recording is displayed
-->
<rectitle>
</rectitle>
@ -74,42 +78,59 @@
<!-- Available Variables currenttime:
{reccurrent} Current Time in hh:mm:ss
{timeshift} 1 if a active recording is displayed
2 if a timeshift recording is displayed
-->
<currenttime>
</currenttime>
<!-- Available Variables totaltime:
{rectotal} Total Time in hh:mm:ss
{timeshift} true if a timeshifted recording is displayed
{timeshifttotal} Total Time of timeshift event in hh:mm
{rectotal} Total Time in hh:mm:ss
{timeshift} 1 if a active recording is displayed
2 if a timeshift recording is displayed
{timeshifttotal} Total Time of timeshift event in hh:mm
-->
<totaltime>
</totaltime>
<!-- Available Variables timeshifttimes:
{recstart} Start Time in hh:mm
{playbacktime} actual replaying time in timeshift mode in hh:mm
{timeshiftrest} Rest of unseen timeshift buffer in hh:mm
{timeshift} 1 if a active recording is displayed
2 if a timeshift recording is displayed
-->
<timeshifttimes>
</timeshifttimes>
<!-- Available Variables endtime:
{recend} End Time in hh:mm
{recend} End Time in hh:mm
{timeshift} 1 if a active recording is displayed
2 if a timeshift recording is displayed
-->
<endtime>
</endtime>
<!-- Available Variables progressbar:
{current} current frame of recording
{total} total frames of recording
{timeshift} true if a timeshifted recording is displayed
{timeshifttotal} total number of frames of timeshift event
{current} current frame of recording
{total} total frames of recording
{timeshift} 1 if a active recording is displayed
2 if a timeshift recording is displayed
{timeshifttotal} total number of frames of timeshift event
-->
<progressbar>
</progressbar>
<!-- Available Variables cutmarks:
{timeshift} true if a timeshifted recording is displayed
{marks[]} array of available marks
{marks[position]} frame of current mark
{marks[endposition]} frame where startmark ends
{marks[total]} total number of frames
{marks[timeshifttotal]} total number of frames of timeshift event
{marks[active]} true if current replay position hits exactly the mark
{marks[startmark]} true if mark is start mark
{timeshift} 1 if a active recording is displayed
2 if a timeshift recording is displayed
{marks[]} array of available marks
{marks[position]} frame of current mark
{marks[endposition]} frame where startmark ends
{marks[total]} total number of frames
{marks[timeshifttotal]} total number of frames of timeshift event
{marks[active]} true if current replay position hits exactly the mark
{marks[startmark]} true if mark is start mark
-->
<cutmarks>
</cutmarks>