Compare commits

...

46 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
32 changed files with 1422 additions and 1045 deletions

26
HISTORY
View File

@ -503,3 +503,29 @@ 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

@ -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
@ -735,6 +737,13 @@ enum class eDMVdrstatisticsIT {
count = 0
};
enum class eDMVdrstatusIT {
vdrIsRecordingsHandlersActive,
vdrIsRecording,
vdrHasTimers,
count
};
enum class eDMTemperaturesST {
count = 0
};
@ -1176,6 +1185,8 @@ enum class eLeMenuRecordingsIT {
isUHD,
isRadio,
isRecording,
isInUse,
errors,
count
};
@ -1226,6 +1237,8 @@ enum class eCeMenuRecordingsIT {
isUHD,
isRadio,
isRecording,
isInUse,
errors,
count
};
@ -1341,6 +1354,8 @@ enum class eDmDetailedHeaderRecIT {
isUHD,
isRadio,
isRecording,
isInUse,
errors,
count
};
@ -1453,6 +1468,8 @@ enum class eDmDetailedRecIT {
isUHD,
isRadio,
isRecording,
isInUse,
errors,
count
};
@ -1514,6 +1531,7 @@ enum class eDRRecInfoIT {
isHD,
isUHD,
isRecording,
isInUse,
isWideScreen,
count
};

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

@ -608,6 +608,8 @@ void cViewDetailRec::SetTokenContainer(void) {
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);
@ -672,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();
@ -697,10 +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

@ -177,9 +177,9 @@ void cViewReplay::GetGlobalTimers(void) {
}
void cViewReplay::SetTimeShiftValues(int current, int total) {
timeShiftActive = NoRec;
if (!recording)
return;
timeShiftActive = NoRec;
#if APIVERSNUM >= 20101
int usage = recording->IsInUse();
if (usage & ruTimer)
@ -313,8 +313,9 @@ void cViewReplay::SetProgressbar(int current, int total) {
}
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

@ -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"))
@ -585,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;
};
@ -667,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,8 +303,7 @@ bool cVeDevices::Parse(bool forced) {
const cDevice *recDevice = RecordControl->Device();
if (recDevice) {
mutexDevices.Lock();
if (recDevices)
{
if (recDevices) {
int d = recDevice->DeviceNumber();
for (int i = 0; i < numDevices; i++) {
if (devices[i] == d) {
@ -319,6 +316,27 @@ bool cVeDevices::Parse(bool forced) {
}
}
}
} // 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
@ -356,13 +374,7 @@ 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, devices[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::recording, (recDevices && recDevices[i]) ? "1" : "0");
const cChannel *channel = device->GetCurrentlyTunedTransponder();
const cSource *source = (channel) ? Sources.Get(channel->Source()) : NULL;
@ -388,7 +400,6 @@ bool cVeDevices::Parse(bool forced) {
}
SetDirty();
lastRefresh = cTimeMs::Now();
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();
}
@ -593,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

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;
@ -1171,6 +1207,8 @@ void cVeDmDetailheaderRec::SetTokenContainer(void) {
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();
}
@ -1191,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();
@ -1216,17 +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)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
} 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());
@ -1234,11 +1279,15 @@ bool cVeDmDetailheaderRec::Parse(bool forced) {
const cChannel *channel = Channels.GetByChannelID(info->ChannelID());
#endif
if (channel) {
tokenContainer->AddStringToken((int)eDmDetailedHeaderRecST::recchannelname, channel->Name());
tokenContainer->AddStringToken((int)eDmDetailedHeaderRecST::recchannelid, *channel->GetChannelID().ToString());
tokenContainer->AddIntToken((int)eDmDetailedHeaderRecIT::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() : "";
@ -1338,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

@ -120,6 +120,7 @@ void cVeDrRecInfo::SetTokenContainer(void) {
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();
}
@ -150,6 +151,7 @@ bool cVeDrRecInfo::Parse(bool force) {
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());

View File

@ -45,7 +45,8 @@ 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();

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

@ -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) {
rsvg_handle_read_stream_sync(handle, NULL, NULL, NULL);
#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) {
rsvg_handle_read_stream_sync(handle, NULL, NULL, NULL);
#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.15";
static const char *VERSION = "1.2.18";
static const char *DESCRIPTION = trNOOP("Skin Designer");
class cPluginSkinDesigner : public cPlugin, public skindesignerapi::SkindesignerAPI {

View File

@ -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>

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>

View File

@ -16,10 +16,10 @@
</datetime>
<time>
<area x="80%" y="80%" width="14%" height="15%" layer="2">
<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="80%" width="5%" height="15%" layer="2">
<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>
@ -37,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}" />
@ -53,6 +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>
<!-- 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}" />
@ -71,10 +77,6 @@
<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>
<!-- time remaining -->
<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" />
</area>
</progressbar>
<statusinfo>
@ -136,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>

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

@ -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>