Compare commits
46 Commits
Author | SHA1 | Date |
---|---|---|
kamel5 | 79a95914f0 | |
kamel5 | 2f64512710 | |
kamel5 | d11d09ca6e | |
Peter Bieringer | 9690f6d8a0 | |
Peter Bieringer | 5e5e5c4fbc | |
kamel5 | 5b61c36484 | |
kamel5 | 7d269ffd85 | |
kamel5 | c6c89529a6 | |
kamel5 | da79cb71b4 | |
kamel5 | 8aeb848044 | |
kamel5 | b55994a8a6 | |
kamel5 | b47f544ad5 | |
kamel5 | 4a89d28f03 | |
kamel5 | 7c47c8e225 | |
kamel5 | ebd99e119c | |
kamel5 | 3c7e014dcc | |
kamel5 | b977e3582a | |
kamel5 | 9b63e8327f | |
kamel5 | a7fc762b3d | |
kamel5 | 596c86c780 | |
kamel5 | d6f5e6808b | |
Peter Bieringer | 0259d38d2f | |
Peter Bieringer | 0b2666f62d | |
Peter Bieringer | d4b1765aaf | |
Peter Bieringer | 3aae0169b4 | |
kamel5 | 0159d536d0 | |
kamel5 | ccba1c23fd | |
kamel5 | 6583c93a6f | |
Peter Bieringer | 2d7a9ab3a3 | |
Peter Bieringer | 4daec64480 | |
Peter Bieringer | 64658a1f56 | |
Peter Bieringer | fce870a315 | |
kamel5 | 09925e6113 | |
kamel5 | 4b2861e030 | |
Peter Bieringer | 39c1062353 | |
Peter Bieringer | 589749731f | |
Peter Bieringer | 1c9fd38cc7 | |
Peter Bieringer | 0ca96e8b3a | |
Peter Bieringer | 700798ba21 | |
kamel5 | 0aeb15d03a | |
kamel5 | 22b24eb455 | |
kamel5 | f5a29826cb | |
kamel5 | 50879fa931 | |
kamel5 | 894b5865cd | |
Peter Bieringer | fda2a4ec74 | |
Peter Bieringer | 4821574437 |
26
HISTORY
26
HISTORY
|
@ -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
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
/******************************************************************
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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}" />
|
||||
|
|
|
@ -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 -->
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue