Add element timeShiftTimes to displayreplay

In displayreplay the tokens recstart, playbacktime and timeshiftrest
added to display start time, actual playback time and the rest of
the actual recording in timeshiftmode.
This commit is contained in:
kamel5 2021-02-12 15:20:34 +01:00
parent 1fc5379e2e
commit afa9cb77a3
11 changed files with 248 additions and 37 deletions

View File

@ -129,6 +129,7 @@ enum class eVeDisplayReplay {
recinfo,
currenttime,
totaltime,
timeshifttimes,
endtime,
progressbar,
cutmarks,
@ -1522,6 +1523,11 @@ enum class eDRCurrentTimeST {
count
};
enum class eDRCurrentTimeIT {
timeshift = 0,
count
};
enum class eDRTotalTimeST {
rectotal = 0,
timeshifttotal,
@ -1533,11 +1539,28 @@ enum class eDRTotalTimeIT {
count
};
enum class eDRTimeshiftTimesST {
recstart = 0,
playbacktime,
timeshiftrest,
count
};
enum class eDRTimeshiftTimesIT {
timeshift = 0,
count
};
enum class eDREndTimeST {
recend = 0,
count
};
enum class eDREndTimeIT {
timeshift = 0,
count
};
enum class eDRProgressbarIT {
current = 0,
total,

View File

@ -6,6 +6,7 @@
cViewReplay::cViewReplay(void) {
veCustomTokens = NULL;
veTimeshiftTimes = NULL;
veEndTime = NULL;
veMessage = NULL;
veScraperContent = NULL;
@ -45,6 +46,7 @@ void cViewReplay::SetViewElements(void) {
viewElementNames.insert(pair<string, int>("rectitle", (int)eVeDisplayReplay::rectitle));
viewElementNames.insert(pair<string, int>("recinfo", (int)eVeDisplayReplay::recinfo));
viewElementNames.insert(pair<string, int>("currenttime", (int)eVeDisplayReplay::currenttime));
viewElementNames.insert(pair<string, int>("timeshifttimes", (int)eVeDisplayReplay::timeshifttimes));
viewElementNames.insert(pair<string, int>("endtime", (int)eVeDisplayReplay::endtime));
viewElementNames.insert(pair<string, int>("totaltime", (int)eVeDisplayReplay::totaltime));
viewElementNames.insert(pair<string, int>("progressbar", (int)eVeDisplayReplay::progressbar));
@ -92,6 +94,10 @@ void cViewReplay::SetViewElementObjects(void) {
{
veTotalTime = dynamic_cast<cVeDrTotalTime*>(viewElements[i]);
}
else if (dynamic_cast<cVeDrTimeshiftTimes*>(viewElements[i]))
{
veTimeshiftTimes = dynamic_cast<cVeDrTimeshiftTimes*>(viewElements[i]);
}
else if (dynamic_cast<cVeDrEndTime*>(viewElements[i]))
{
veEndTime = dynamic_cast<cVeDrEndTime*>(viewElements[i]);
@ -153,8 +159,11 @@ void cViewReplay::ClearVariables(void) {
timeShiftFramesTotal = -1;
timeShiftLength = -1;
timeShiftDuration = "";
timeshiftrest = "";
if (veCustomTokens)
veCustomTokens->Reset();
if (veTimeshiftTimes)
veTimeshiftTimes->Set(cString(""), cString(""), cString(""));
if (veEndTime)
veEndTime->Set(cString(""));
if (veCutMarks)
@ -200,17 +209,20 @@ void cViewReplay::SetTimeShiftValues(int current, int total) {
if (!Schedule)
return;
// Get event at actual recording position
const cEvent *eventEnde = Schedule->GetEventAround(time(NULL));
const cEvent *eventEnde = Schedule->GetEventAround(time(0));
if (!eventEnde)
return;
double fps = recording->FramesPerSecond();
// End of live program
time_t liveEventStop = eventEnde->EndTime();
// Begin of timeshift recording
time_t recordingStart = time(0) - recording->LengthInSeconds();
timeShiftFramesTotal = (liveEventStop - recordingStart) * fps;
// actual timeshiftlength
timeShiftLength = liveEventStop - recordingStart;
// Get event at actual replay position
int secondsafter = (int)(recording->LengthInSeconds() * (1.0 - (double)current / (double)total));
const cEvent *eventReplay = Schedule->GetEventAround(time(NULL) - secondsafter);
// timeshiftlength until end of live program
timeShiftFramesTotal = total * ((double)timeShiftLength / (double)recording->LengthInSeconds());
// Get event at actual replay position (add 30sec for a better match)
int timeShiftSecondsAfter = (int)(recording->LengthInSeconds() * (1.0 - (double)current / (double)total)) + 30;
const cEvent *eventReplay = Schedule->GetEventAround(time(0) - timeShiftSecondsAfter);
// Display title at replay position
if (eventReplay && eventReplay != lastEvent && veRecTitle) {
veRecTitle->Set(recording, eventReplay, true);
@ -220,6 +232,9 @@ void cViewReplay::SetTimeShiftValues(int current, int total) {
int mins = (timeShiftLength / 60) % 60;
int hours = (timeShiftLength / 3600) % 24;
timeShiftDuration = cString::sprintf("%d:%02d", hours, mins);
mins = (timeShiftSecondsAfter / 60) % 60;
hours = (timeShiftSecondsAfter / 3600) % 24;
timeshiftrest = cString::sprintf("%d:%02d", hours, mins);
}
void cViewReplay::SetRecording(const cRecording *recording) {
@ -249,16 +264,30 @@ void cViewReplay::SetTitle(const char *title) {
void cViewReplay::SetCurrent(const char *current) {
if (veCurrentTime)
veCurrentTime->Set(current);
veCurrentTime->Set(current, timeShiftActive);
Render((int)eVeDisplayReplay::currenttime);
}
void cViewReplay::SetTotal(const char *total) {
if (veTotalTime)
veTotalTime->Set(total, timeShiftActive, *timeShiftDuration);
veTotalTime->Set(total, *timeShiftDuration, timeShiftActive);
Render((int)eVeDisplayReplay::totaltime);
}
void cViewReplay::SetTimeshiftTimes(int current, int total) {
if (!veTimeshiftTimes || reclength == 0)
return;
time_t recordingStart = 0;
time_t playbackTime = 0;
if (timeShiftActive) {
recordingStart = time(0) - recording->LengthInSeconds();
playbackTime = time(0) - (int)(recording->LengthInSeconds() * (1.0 - (double)current / (double)total));
} else
recordingStart = recording->Start();
veTimeshiftTimes->Set(TimeString(recordingStart), TimeString(playbackTime), timeshiftrest, timeShiftActive);
Render((int)eVeDisplayReplay::timeshifttimes);
}
void cViewReplay::SetEndTime(int current, int total) {
if (!veEndTime || reclength == 0)
return;
@ -270,12 +299,12 @@ void cViewReplay::SetEndTime(int current, int total) {
}
double rest = (double)(totalLength - current) / (double)totalLength;
time_t end = time(0) + rest * recordingLength;
veEndTime->Set(TimeString(end));
veEndTime->Set(TimeString(end), timeShiftActive);
Render((int)eVeDisplayReplay::endtime);
}
void cViewReplay::SetProgressbar(int current, int total) {
SetTimeShiftValues(current, total);
// SetTimeShiftValues(current, total);
if (veProgressbar)
veProgressbar->Set(current, total, timeShiftActive, timeShiftFramesTotal);
Render((int)eVeDisplayReplay::progressbar);

View File

@ -12,6 +12,7 @@ private:
cVeDrScraperContent *veScraperContent;
cVeDrCurrentTime *veCurrentTime;
cVeDrTotalTime *veTotalTime;
cVeDrTimeshiftTimes *veTimeshiftTimes;
cVeDrEndTime *veEndTime;
cVeDrProgressBar *veProgressbar;
cVeDrCutMarks *veCutMarks;
@ -31,11 +32,11 @@ private:
bool timeShiftActive;
int timeShiftFramesTotal;
int timeShiftLength;
cString timeshiftrest;
cString timeShiftDuration;
bool timersLoaded;
cGlobalTimers globalTimers;
void GetGlobalTimers(void);
void SetTimeShiftValues(int current, int total);
void SetViewElements(void);
void ClearVariables(void);
void SetViewElementObjects(void);
@ -47,9 +48,11 @@ public:
void SetModeOnly(bool modeOnly) { this->modeOnly = modeOnly; };
void SetRecordingLength(int length) { reclength = length; };
void SetRecording(const cRecording *recording);
void SetTimeShiftValues(int current, int total);
void SetTitle(const char *title);
void SetCurrent(const char *current);
void SetTotal(const char *total);
void SetTimeshiftTimes(int current, int total);
void SetEndTime(int current, int total);
void SetProgressbar(int current, int total);
void SetMarks(const cMarks *marks, int current, int total);

View File

@ -169,6 +169,8 @@ cViewElement *cViewElement::CreateViewElement(const char *name, const char *view
e = new cVeDrCurrentTime();
else if (!strcmp(name, "totaltime"))
e = new cVeDrTotalTime();
else if (!strcmp(name, "timeshifttimes"))
e = new cVeDrTimeshiftTimes();
else if (!strcmp(name, "endtime"))
e = new cVeDrEndTime();
else if (!strcmp(name, "progressbar") && !strcmp(viewname, "displayreplay"))

View File

@ -10,6 +10,7 @@ cVeDrRecTitle::cVeDrRecTitle(void) {
recording = NULL;
event = NULL;
title = NULL;
timeshiftActive = false;
}
cVeDrRecTitle::~cVeDrRecTitle(void) {
@ -163,6 +164,7 @@ bool cVeDrRecInfo::Parse(bool force) {
cVeDrCurrentTime::cVeDrCurrentTime(void) {
changed = true;
current = NULL;
timeshiftActive = false;
}
cVeDrCurrentTime::~cVeDrCurrentTime(void) {
@ -172,14 +174,16 @@ cVeDrCurrentTime::~cVeDrCurrentTime(void) {
void cVeDrCurrentTime::SetTokenContainer(void) {
tokenContainer = new skindesignerapi::cTokenContainer();
tokenContainer->DefineStringToken("{reccurrent}", (int)eDRCurrentTimeST::reccurrent);
tokenContainer->DefineIntToken("{timeshift}", (int)eDRCurrentTimeIT::timeshift);
InheritTokenContainer();
}
void cVeDrCurrentTime::Set(const char *current) {
void cVeDrCurrentTime::Set(const char *current, bool timeshiftActive) {
if (!current)
return;
free(this->current);
this->current = strdup(current);
this->timeshiftActive = timeshiftActive;
changed = true;
}
@ -188,6 +192,7 @@ bool cVeDrCurrentTime::Parse(bool force) {
return false;
tokenContainer->Clear();
tokenContainer->AddStringToken((int)eDRCurrentTimeST::reccurrent, current);
tokenContainer->AddIntToken((int)eDRCurrentTimeIT::timeshift, timeshiftActive);
SetDirty();
changed = false;
return true;
@ -199,8 +204,8 @@ bool cVeDrCurrentTime::Parse(bool force) {
cVeDrTotalTime::cVeDrTotalTime(void) {
changed = true;
total = NULL;
timeshiftActive = false;
timeshiftDuration = NULL;
timeshiftActive = false;
}
cVeDrTotalTime::~cVeDrTotalTime(void) {
@ -216,7 +221,7 @@ void cVeDrTotalTime::SetTokenContainer(void) {
InheritTokenContainer();
}
void cVeDrTotalTime::Set(const char *total, bool timeshiftActive, const char *timeshiftDuration) {
void cVeDrTotalTime::Set(const char *total, const char *timeshiftDuration, bool timeshiftActive) {
if (!total)
return;
free(this->total);
@ -241,11 +246,59 @@ bool cVeDrTotalTime::Parse(bool force) {
return true;
}
/******************************************************************
* cVeDrTimeshiftTimes
******************************************************************/
cVeDrTimeshiftTimes::cVeDrTimeshiftTimes(void) {
changed = true;
start = "";
playbacktime = "";
timeshiftrest = "";
timeshiftActive = false;
}
cVeDrTimeshiftTimes::~cVeDrTimeshiftTimes(void) {
}
void cVeDrTimeshiftTimes::SetTokenContainer(void) {
tokenContainer = new skindesignerapi::cTokenContainer();
tokenContainer->DefineStringToken("{recstart}", (int)eDRTimeshiftTimesST::recstart);
tokenContainer->DefineStringToken("{playbacktime}", (int)eDRTimeshiftTimesST::playbacktime);
tokenContainer->DefineStringToken("{timeshiftrest}", (int)eDRTimeshiftTimesST::timeshiftrest);
tokenContainer->DefineIntToken("{timeshift}", (int)eDRTimeshiftTimesIT::timeshift);
InheritTokenContainer();
}
void cVeDrTimeshiftTimes::Set(cString start, cString playbacktime, cString timeshiftrest, bool timeshiftActive) {
this->timeshiftActive = timeshiftActive;
if (strcmp(*this->start, *start) || strcmp(*this->playbacktime, *playbacktime) || strcmp(*this->timeshiftrest, *timeshiftrest)) {
this->start = start;
this->playbacktime = playbacktime;
this->timeshiftrest = timeshiftrest;
changed = true;
}
}
bool cVeDrTimeshiftTimes::Parse(bool force) {
if (!cViewElement::Parse(force) || !changed)
return false;
tokenContainer->Clear();
tokenContainer->AddStringToken((int)eDRTimeshiftTimesST::recstart, *start);
tokenContainer->AddStringToken((int)eDRTimeshiftTimesST::playbacktime, *playbacktime);
tokenContainer->AddStringToken((int)eDRTimeshiftTimesST::timeshiftrest, *timeshiftrest);
tokenContainer->AddIntToken((int)eDRTimeshiftTimesIT::timeshift, timeshiftActive);
SetDirty();
changed = false;
return true;
}
/******************************************************************
* cVeDrEndTime
******************************************************************/
cVeDrEndTime::cVeDrEndTime(void) {
changed = true;
end = "";
timeshiftActive = false;
}
cVeDrEndTime::~cVeDrEndTime(void) {
@ -254,10 +307,12 @@ cVeDrEndTime::~cVeDrEndTime(void) {
void cVeDrEndTime::SetTokenContainer(void) {
tokenContainer = new skindesignerapi::cTokenContainer();
tokenContainer->DefineStringToken("{recend}", (int)eDREndTimeST::recend);
tokenContainer->DefineIntToken("{timeshift}", (int)eDREndTimeIT::timeshift);
InheritTokenContainer();
}
void cVeDrEndTime::Set(cString end) {
void cVeDrEndTime::Set(cString end, bool timeshiftActive) {
this->timeshiftActive = timeshiftActive;
if (strcmp(*this->end, *end)) {
this->end = end;
changed = true;
@ -269,6 +324,7 @@ bool cVeDrEndTime::Parse(bool force) {
return false;
tokenContainer->Clear();
tokenContainer->AddStringToken((int)eDREndTimeST::recend, *end);
tokenContainer->AddIntToken((int)eDREndTimeIT::timeshift, timeshiftActive);
SetDirty();
changed = false;
return true;
@ -280,8 +336,8 @@ bool cVeDrEndTime::Parse(bool force) {
cVeDrProgressBar::cVeDrProgressBar(void) {
current = -1;
total = -1;
timeshiftActive = false;
timeshiftTotal = -1;
timeshiftActive = false;
changed = true;
}
@ -304,6 +360,7 @@ void cVeDrProgressBar::Set(int current, int total, bool timeshiftActive, int tim
this->total = total;
this->timeshiftActive = timeshiftActive;
this->timeshiftTotal = timeshiftTotal;
changed = true;
}
@ -327,6 +384,7 @@ bool cVeDrProgressBar::Parse(bool force) {
cVeDrCutMarks::cVeDrCutMarks(void) {
cutmarksIndex = -1;
lastMarks = NULL;
timeshiftActive = false;
Reset();
}

View File

@ -43,11 +43,12 @@ class cVeDrCurrentTime : public cViewElement {
private:
bool changed;
char *current;
bool timeshiftActive;
public:
cVeDrCurrentTime(void);
virtual ~cVeDrCurrentTime(void);
void SetTokenContainer(void);
void Set(const char *current);
void Set(const char *current, bool timeshiftActive = false);
bool Parse(bool forced = false);
};
@ -64,7 +65,25 @@ public:
cVeDrTotalTime(void);
virtual ~cVeDrTotalTime(void);
void SetTokenContainer(void);
void Set(const char *total, bool timeshiftActive, const char *timeshiftDuration);
void Set(const char *total, const char *timeshiftDuration = NULL, bool timeshiftActive = false);
bool Parse(bool forced = false);
};
/******************************************************************
* cVeDrTimeshiftTimes
******************************************************************/
class cVeDrTimeshiftTimes : public cViewElement {
private:
cString start;
cString playbacktime;
cString timeshiftrest;
bool changed;
bool timeshiftActive;
public:
cVeDrTimeshiftTimes(void);
virtual ~cVeDrTimeshiftTimes(void);
void SetTokenContainer(void);
void Set(cString start, cString playbacktime, cString timeshiftrest, bool timeshiftActive = false);
bool Parse(bool forced = false);
};
@ -74,12 +93,13 @@ public:
class cVeDrEndTime : public cViewElement {
private:
cString end;
bool timeshiftActive;
bool changed;
public:
cVeDrEndTime(void);
virtual ~cVeDrEndTime(void);
void SetTokenContainer(void);
void Set(cString end);
void Set(cString end, bool timeshiftActive = false);
bool Parse(bool forced = false);
};
@ -97,7 +117,7 @@ public:
cVeDrProgressBar(void);
virtual ~cVeDrProgressBar(void);
void SetTokenContainer(void);
void Set(int current, int total, bool timeshiftActive, int timeshiftTotal);
void Set(int current, int total, bool timeshiftActive = false, int timeshiftTotal = 0);
bool Parse(bool forced = false);
};
@ -121,7 +141,7 @@ public:
cVeDrCutMarks(void);
virtual ~cVeDrCutMarks(void);
void SetTokenContainer(void);
void Set(const cMarks *marks, int current, int total, bool timeshiftActive, int timeshiftTotal);
void Set(const cMarks *marks, int current, int total, bool timeshiftActive = false, int timeshiftTotal = 0);
void Reset(void);
bool Parse(bool forced = false);
};

View File

@ -53,8 +53,10 @@ void cSDDisplayReplay::SetMode(bool Play, bool Forward, int Speed) {
void cSDDisplayReplay::SetProgress(int Current, int Total) {
if (ok) {
view->SetTimeShiftValues(Current, Total);
view->SetProgressbar(Current, Total);
view->SetMarks(marks, Current, Total);
view->SetTimeshiftTimes(Current, Total);
view->SetEndTime(Current, Total);
view->DelayOnPause();
}

View File

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

View File

@ -242,6 +242,27 @@
<trans lang="hu_HU">Időzítő kereső</trans>
<trans lang="it_IT">Cerca timer</trans>
</token>
<token name="tr(start)">
<trans lang="en_EN">start</trans>
<trans lang="de_DE">Beginn</trans>
<trans lang="fi_FI">Alkaa</trans>
<trans lang="hu_HU">Rajt</trans>
<trans lang="it_IT">Inizio</trans>
</token>
<token name="tr(rest)">
<trans lang="en_EN">rest</trans>
<trans lang="de_DE">Rest</trans>
<trans lang="fi_FI">Loput</trans>
<trans lang="hu_HU">Maradék</trans>
<trans lang="it_IT">Riposo</trans>
</token>
<token name="tr(playback)">
<trans lang="en_EN">playback</trans>
<trans lang="de_DE">Wiedergabe</trans>
<trans lang="fi_FI">Toisto</trans>
<trans lang="hu_HU">Lejátszás</trans>
<trans lang="it_IT">Riproduzione</trans>
</token>
<token name="tr(end)">
<trans lang="en_EN">end</trans>
<trans lang="de_DE">Ende</trans>

View File

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

View File

@ -76,7 +76,8 @@
</recinfo>
<!-- Available Variables currenttime:
{reccurrent} Current Time in hh:mm:ss
{reccurrent} Current Time in hh:mm:ss
{timeshift} true if a timeshifted recording is displayed
-->
<currenttime>
</currenttime>
@ -89,8 +90,18 @@
<totaltime>
</totaltime>
<!-- Available Variables timeshifttimes:
{recstart} Start Time in hh:mm
{playbacktime} actual replaying time in timeshift mode in hh:mm
{timeshiftrest} Rest of unseen timeshift buffer in hh:mm
{timeshift} true if a timeshifted recording is displayed
-->
<timeshifttimes>
</timeshifttimes>
<!-- Available Variables endtime:
{recend} End Time in hh:mm
{timeshift} true if a timeshifted recording is displayed
-->
<endtime>
</endtime>