implemented horizontal menus

This commit is contained in:
louis 2015-08-08 11:04:15 +02:00
parent b5c587b256
commit ea758f9556
54 changed files with 672 additions and 2210 deletions

15
HISTORY
View File

@ -405,3 +405,18 @@ Version 0.6.2
Version 0.6.3
- implemented horizontal menus
For displaying horizontal menus with VDR <= 2.2.x a VDR
patch is required (see /patches/vdr-2.2.0_horizontal_menu.patch
in the plugin source directory). Without this patch the keys
left/right and up/down are not toggled in horizontal menus.
With VDR >= 2.3.1 this patch is not needed anymore.
- added possibility to add conditions to <menuitems> elements
- added possibility to define a viewelement several times with
different conditions
- added "string" skin setup parameter with multiple options
- added "valign" option in <drawtextbox>. If the box height is set
and the text does not need the complete height, with valign="center"
the text can be placed horizontally centered inside the box borders.
- implemented optional horizontal main-, recordings- and
weatherforecast menu in metrixhd

9
README
View File

@ -34,8 +34,13 @@ Requirements
- libcurl
- for scaling the video picture to fit into the VDR menu window please use
softhddevice plugin revision 87c1c7be (2013-01-01) or newer.
- softhddevice plugin revision ec58e456 (2015-06-13) or newer. With older
versions shifting does not work properly
- For displaying horizontal menus with VDR <= 2.2.x a VDR patch is required
(see /patches/vdr-2.2.0_horizontal_menu.patch in the plugin source directory)
Without this patch the keys left/right and up/down are not toggled in
horizontal menus. With VDR >= 2.3.1 this patch is not needed anymore.
- epgsearch Git since commit ba7c6277 (2013-01-03) to correctly replace the
schedules menu with epgsearch

View File

@ -65,6 +65,12 @@ void cSDDisplayMenu::SetMenuSortMode(eMenuSortMode MenuSortMode) {
rootView->SetSortMode(MenuSortMode);
}
eMenuOrientation cSDDisplayMenu::MenuOrientation(void) {
if (!doOutput)
return moVertical;
return rootView->MenuOrientation();
}
void cSDDisplayMenu::SetPluginMenu(string name, int menu, int type, bool init) {
pluginName = name;
pluginMenu = menu;

View File

@ -4,6 +4,15 @@
#include "libtemplate/template.h"
#include "views/displaymenurootview.h"
#if defined(APIVERSNUM) && APIVERSNUM < 20301
#ifndef MENU_ORIENTATION_DEFINED
enum eMenuOrientation {
moVertical = 0,
moHorizontal
};
#endif
#endif
enum eViewState {
vsInit,
vsMenuInit,
@ -32,6 +41,7 @@ public:
virtual void Clear(void);
virtual void SetMenuCategory(eMenuCategory MenuCat);
virtual void SetMenuSortMode(eMenuSortMode MenuSortMode);
virtual eMenuOrientation MenuOrientation(void);
virtual void SetPluginMenu(string name, int menu, int type, bool init);
virtual void SetTitle(const char *Title);
virtual void SetButtons(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);

View File

@ -42,7 +42,7 @@
align (left|top|center|bottom|right) #IMPLIED
menuitemwidth CDATA #IMPLIED
numlistelements CDATA #REQUIRED
orientation (horizontal|vertical) #REQUIRED
orientation CDATA #REQUIRED
>
<!ELEMENT listelement (areacontainer|area|areascroll)*>

View File

@ -418,7 +418,8 @@
menuitemwidth CDATA #IMPLIED
determinatefont CDATA #IMPLIED
numlistelements CDATA #REQUIRED
orientation (horizontal|vertical) #REQUIRED
orientation CDATA #REQUIRED
condition CDATA #IMPLIED
>
<!ELEMENT listelement (areacontainer|area|areascroll)*>

View File

@ -18,46 +18,55 @@
<!ELEMENT background (areacontainer|area|areascroll)*>
<!ATTLIST background
condition CDATA #IMPLIED
debug CDATA #IMPLIED
>
<!ELEMENT header (areacontainer|area|areascroll)*>
<!ATTLIST header
condition CDATA #IMPLIED
debug CDATA #IMPLIED
>
<!ELEMENT datetime (areacontainer|area|areascroll)*>
<!ATTLIST datetime
condition CDATA #IMPLIED
debug CDATA #IMPLIED
>
<!ELEMENT message (areacontainer|area|areascroll)*>
<!ATTLIST message
condition CDATA #IMPLIED
debug CDATA #IMPLIED
>
<!ELEMENT colorbuttons (areacontainer|area|areascroll)*>
<!ATTLIST colorbuttons
condition CDATA #IMPLIED
debug CDATA #IMPLIED
>
<!ELEMENT scrollbar (areacontainer|area|areascroll)*>
<!ATTLIST scrollbar
condition CDATA #IMPLIED
debug CDATA #IMPLIED
>
<!ELEMENT detailheader (areacontainer|area|areascroll)*>
<!ATTLIST detailheader
condition CDATA #IMPLIED
debug CDATA #IMPLIED
>
<!ELEMENT tablabels (areacontainer|area|areascroll)*>
<!ATTLIST tablabels
condition CDATA #IMPLIED
debug CDATA #IMPLIED
>
<!ELEMENT menuitems (listelement,currentelement?)>
<!ATTLIST menuitems
condition CDATA #IMPLIED
x CDATA #REQUIRED
y CDATA #REQUIRED
width CDATA #REQUIRED
@ -65,7 +74,7 @@
align (left|top|center|bottom|right) #IMPLIED
menuitemwidth CDATA #IMPLIED
numlistelements CDATA #REQUIRED
orientation (horizontal|vertical) #REQUIRED
orientation CDATA #REQUIRED
>
<!ELEMENT listelement (areacontainer|area|areascroll)*>
@ -75,6 +84,7 @@
<!ELEMENT currentelement (areacontainer|area|areascroll)*>
<!ATTLIST currentelement
condition CDATA #IMPLIED
delay CDATA #REQUIRED
fadetime CDATA #IMPLIED
debug CDATA #IMPLIED

View File

@ -95,6 +95,7 @@
width CDATA #REQUIRED
height CDATA #IMPLIED
align (left|center|right) #IMPLIED
valign (top|center|bottom) #IMPLIED
maxlines CDATA #IMPLIED
floatwidth CDATA #IMPLIED
floatheight CDATA #IMPLIED

View File

@ -13,10 +13,11 @@
<!ELEMENT parameter (#PCDATA)>
<!ATTLIST parameter
name NMTOKEN #REQUIRED
type (int|bool) #REQUIRED
type (int|bool|string) #REQUIRED
min NMTOKEN #IMPLIED
max NMTOKEN #IMPLIED
displaytext CDATA #REQUIRED
options CDATA #IMPLIED
>
<!ELEMENT token (trans)+>

View File

@ -1,6 +1,7 @@
#include "skinsetup.h"
#include "../config.h"
#include "../libtemplate/xmlparser.h"
#include "../libcore/helpers.h"
// --- cSkinSetupParameter -----------------------------------------------------------
@ -10,7 +11,17 @@ cSkinSetupParameter::cSkinSetupParameter(void) {
displayText = "";
min = 0;
max = 1000;
value = 0;
value = 0;
options = NULL;
optionsTranslated = NULL;
numOptions = 0;
}
cSkinSetupParameter::~cSkinSetupParameter(void) {
if (numOptions > 0 && options && optionsTranslated) {
delete[] options;
delete[] optionsTranslated;
}
}
void cSkinSetupParameter::Debug(void) {
@ -19,9 +30,16 @@ void cSkinSetupParameter::Debug(void) {
sType = "bool";
else if (type == sptInt)
sType = "int";
dsyslog("skindesigner: name \"%s\", type %s, displayText \"%s\", Value %d", name.c_str(), sType.c_str(), displayText.c_str(), value);
else if (type == sptString)
sType = "string";
dsyslog("skindesigner: name \"%s\", type %s, displayText \"%s\", Value: %d", name.c_str(), sType.c_str(), displayText.c_str(), value);
if (type == sptInt)
dsyslog("skindesigner: min %d, max %d", min, max);
if (type == sptString && options) {
for (int i=0; i < numOptions; i++) {
dsyslog("skindesigner: option %d: %s, translated: %s", i+1, options[i], optionsTranslated[i]);
}
}
}
// --- cSkinSetupMenu -----------------------------------------------------------
@ -88,7 +106,7 @@ void cSkinSetupMenu::InitIterators(void) {
subMenuIt = subMenus.begin();
}
void cSkinSetupMenu::SetParameter(eSetupParameterType paramType, string name, string displayText, string min, string max, string value) {
void cSkinSetupMenu::SetParameter(eSetupParameterType paramType, string name, string displayText, string min, string max, string value, string options) {
cSkinSetupParameter *param = new cSkinSetupParameter();
param->type = paramType;
param->name = name;
@ -100,8 +118,26 @@ void cSkinSetupMenu::SetParameter(eSetupParameterType paramType, string name, st
if (max.size() && paramType == sptInt) {
param->max = atoi(max.c_str());
}
param->value = atoi(value.c_str());
if (paramType == sptString) {
splitstring o(options.c_str());
vector<string> opts = o.split(',', 1);
int numOpts = opts.size();
if (numOpts > 0) {
param->numOptions = numOpts;
param->options = new const char*[numOpts];
int i=0;
for (vector<string>::iterator it = opts.begin(); it != opts.end(); it++) {
string option = trim(*it);
char *s = new char[option.size()];
strcpy(s, option.c_str());
param->options[i++] = s;
}
}
}
parameters.push_back(param);
}
@ -185,7 +221,7 @@ void cSkinSetup::SubMenuDone(void) {
}
}
void cSkinSetup::SetParameter(string type, string name, string displayText, string min, string max, string value) {
void cSkinSetup::SetParameter(string type, string name, string displayText, string min, string max, string value, string options) {
if (!type.size() || !name.size() || !displayText.size() || !value.size()) {
esyslog("skindesigner: invalid setup parameter for skin %s", skin.c_str());
return;
@ -195,12 +231,14 @@ void cSkinSetup::SetParameter(string type, string name, string displayText, stri
paramType = sptInt;
} else if (!type.compare("bool")) {
paramType = sptBool;
} else if (!type.compare("string")) {
paramType = sptString;
}
if (paramType == sptUnknown) {
esyslog("skindesigner: invalid setup parameter for skin %s", skin.c_str());
return;
}
currentMenu->SetParameter(paramType, name, displayText, min, max, value);
currentMenu->SetParameter(paramType, name, displayText, min, max, value, options);
}
cSkinSetupParameter *cSkinSetup::GetNextParameter(void) {
@ -221,7 +259,14 @@ void cSkinSetup::AddToGlobals(cGlobals *globals) {
rootMenu->InitIterators();
cSkinSetupParameter *param = NULL;
while (param = rootMenu->GetNextParameter()) {
globals->AddInt(param->name, param->value);
if (param->type == sptString) {
string value = param->options[param->value];
globals->AddString(param->name, value);
string intName = "index" + param->name;
globals->AddInt(intName, param->value);
} else {
globals->AddInt(param->name, param->value);
}
}
}
@ -233,6 +278,23 @@ void cSkinSetup::TranslateSetup(void) {
if (Translate(param->displayText, transl)) {
param->displayText = transl;
}
if (param->type == sptString && param->numOptions > 0) {
param->optionsTranslated = new const char*[param->numOptions];
for (int i = 0; i < param->numOptions; i++) {
string option = param->options[i];
string optionTransToken = "{tr(" + option + ")}";
string optionTranslated = "";
if (Translate(optionTransToken, optionTranslated)) {
char *s = new char[optionTranslated.size()];
strcpy(s, optionTranslated.c_str());
param->optionsTranslated[i] = s;
} else {
char *s = new char[option.size()];
strcpy(s, option.c_str());
param->optionsTranslated[i] = s;
}
}
}
}
rootMenu->InitIterators();

View File

@ -15,6 +15,7 @@ using namespace std;
enum eSetupParameterType {
sptInt,
sptBool,
sptString,
sptUnknown
};
@ -24,13 +25,16 @@ class cSkinSetupParameter {
private:
public:
cSkinSetupParameter(void);
virtual ~cSkinSetupParameter(void) {};
virtual ~cSkinSetupParameter(void);
eSetupParameterType type;
string name;
string displayText;
int min;
int max;
int value;
int value;
const char* *options;
const char* *optionsTranslated;
int numOptions;
void Debug(void);
};
@ -55,7 +59,7 @@ public:
void SetParent(cSkinSetupMenu *p) { parent = p; };
cSkinSetupMenu *GetParent(void) { return parent; };
void AddSubMenu(cSkinSetupMenu *sub) { subMenus.push_back(sub); };
void SetParameter(eSetupParameterType paramType, string name, string displayText, string min, string max, string value);
void SetParameter(eSetupParameterType paramType, string name, string displayText, string min, string max, string value, string options);
void InitIterators(void);
void InitParameterIterator(void) { paramIt = parameters.begin(); };
cSkinSetupParameter *GetNextParameter(bool deep = true);
@ -82,7 +86,7 @@ public:
bool ReadFromXML(void);
void SetSubMenu(string name, string displayText);
void SubMenuDone(void);
void SetParameter(string type, string name, string displayText, string min, string max, string value);
void SetParameter(string type, string name, string displayText, string min, string max, string value, string options);
void InitParameterIterator(void) { rootMenu->InitIterators(); };
cSkinSetupParameter *GetNextParameter(void);
cSkinSetupParameter *GetParameter(string name);

View File

@ -149,6 +149,15 @@ void cGlobals::ReplaceStringVars(string &value) {
}
bool cGlobals::GetString(string &name, string &value) {
map<string,string>::iterator hit = stringVars.find(name);
if (hit == stringVars.end())
return false;
value = hit->second;
return true;
}
bool cGlobals::AddTranslation(string name, map < string, string > transl) {
translations.erase(name);
translations.insert(pair<string, map < string, string > >(name, transl));

View File

@ -47,6 +47,7 @@ public:
void ReplaceDoubleVars(string &value);
void AddString(string &name, string &value);
void ReplaceStringVars(string &value);
bool GetString(string &name, string &value);
bool AddTranslation(string name, map < string, string > transl);
bool Translate(string text, string &translation);
void AddCustomInt(string &name, int value);

View File

@ -291,6 +291,14 @@ void cConditionalParameter::Evaluate(map < string, int > *intTokens, map < strin
tokenTrue = true;
}
}
if (!tokenTrue) {
string value = "";
if (globals->GetString(cond->tokenName, value)) {
if (!value.compare(cond->strCompareValue)) {
tokenTrue = true;
}
}
}
} else if (cond->type == ctStringNotEquals) {
if (stringTokens) {
map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
@ -313,6 +321,14 @@ void cConditionalParameter::Evaluate(map < string, int > *intTokens, map < strin
tokenTrue = true;
}
}
if (!tokenTrue) {
string value = "";
if (globals->GetString(cond->tokenName, value)) {
if (value.find(cond->strCompareValue) != string::npos) {
tokenTrue = true;
}
}
}
} else if (cond->type == ctStringNotContains) {
if (stringTokens) {
map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
@ -472,6 +488,6 @@ string cConditionalParameter::StripWhitespaces(string value) {
void cConditionalParameter::Debug(void) {
dsyslog("skindesigner: Condition %s, Type: %s, cond is %s", value.c_str(), (type == cpAnd)?"and combination":((type == cpOr)?"or combination":"single param") , isTrue?"true":"false");
for (vector<sCondition>::iterator it = conditions.begin(); it != conditions.end(); it++) {
dsyslog("skindesigner: cond token %s, type: %d, compareValue %d, negated: %d", it->tokenName.c_str(), it->type, it->compareValue, it->isNegated);
dsyslog("skindesigner: cond token %s, type: %d, compareValue %d, negated: %d, strCompareValue %s", it->tokenName.c_str(), it->type, it->compareValue, it->isNegated, it->strCompareValue.c_str());
}
}

View File

@ -14,11 +14,11 @@ cTemplateView::cTemplateView(void) {
}
cTemplateView::~cTemplateView() {
for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
for (multimap < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
delete it->second;
}
for (map < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
for (multimap < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
delete it->second;
}
@ -64,11 +64,15 @@ void cTemplateView::SetContainer(int x, int y, int width, int height) {
}
cTemplateViewElement *cTemplateView::GetViewElement(eViewElement ve) {
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end()) {
return NULL;
pair<multimap< eViewElement, cTemplateViewElement* >::iterator, multimap< eViewElement, cTemplateViewElement* >::iterator> rangeViewElements;
rangeViewElements = viewElements.equal_range(ve);
for (multimap<eViewElement, cTemplateViewElement*>::iterator it = rangeViewElements.first; it!=rangeViewElements.second; ++it) {
cTemplateViewElement *viewElement = it->second;
if (viewElement->Execute()) {
return viewElement;
}
}
return hit->second;
return NULL;
}
void cTemplateView::InitViewElementIterator(void) {
@ -104,10 +108,21 @@ cTemplateViewGrid *cTemplateView::GetNextViewGrid(void) {
}
cTemplateViewList *cTemplateView::GetViewList(eViewList vl) {
map < eViewList, cTemplateViewList* >::iterator hit = viewLists.find(vl);
if (hit == viewLists.end())
return NULL;
return hit->second;
if (viewLists.size() == 1) {
multimap < eViewList, cTemplateViewList* >::iterator hit = viewLists.find(vl);
if (hit == viewLists.end())
return NULL;
return hit->second;
}
pair<multimap< eViewList, cTemplateViewList* >::iterator, multimap< eViewList, cTemplateViewList* >::iterator> rangeViewLists;
rangeViewLists = viewLists.equal_range(vl);
for (multimap<eViewList, cTemplateViewList*>::iterator it = rangeViewLists.first; it!=rangeViewLists.second; ++it) {
cTemplateViewList *viewList = it->second;
if (viewList->Execute()) {
return viewList;
}
}
return NULL;
}
void cTemplateView::InitViewListIterator(void) {
@ -190,7 +205,7 @@ cRect cTemplateView::GetOsdSize(void) {
int cTemplateView::GetNumPixmaps(void) {
int numPixmaps = 0;
for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
for (multimap < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
cTemplateViewElement *viewElement = it->second;
numPixmaps += viewElement->GetNumPixmaps();
}
@ -198,10 +213,9 @@ int cTemplateView::GetNumPixmaps(void) {
}
int cTemplateView::GetNumPixmapsViewElement(eViewElement ve) {
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end())
cTemplateViewElement *viewElement = GetViewElement(ve);
if (!viewElement)
return 0;
cTemplateViewElement *viewElement = hit->second;
return viewElement->GetNumPixmaps();
}
@ -248,15 +262,14 @@ tColor cTemplateView::DebugGridFontColor(void) {
}
bool cTemplateView::ExecuteView(eViewElement ve) {
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end())
cTemplateViewElement *viewElement = GetViewElement(ve);
if (!viewElement)
return false;
cTemplateViewElement *viewElement = hit->second;
return viewElement->Execute();
return true;
}
bool cTemplateView::DetachViewElement(eViewElement ve) {
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
multimap < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end())
return false;
cTemplateViewElement *viewElement = hit->second;
@ -264,10 +277,9 @@ bool cTemplateView::DetachViewElement(eViewElement ve) {
}
string cTemplateView::GetViewElementMode(eViewElement ve) {
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end())
cTemplateViewElement *viewElement = GetViewElement(ve);
if (!viewElement)
return "";
cTemplateViewElement *viewElement = hit->second;
return viewElement->GetMode();
}
@ -563,9 +575,8 @@ void cTemplateView::PreCache(bool isSubview) {
int osdWidth = parameters->GetNumericParameter(ptWidth);
int osdHeight = parameters->GetNumericParameter(ptHeight);
int pixOffset = 0;
//Cache ViewElements
for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
for (multimap < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
cTemplateViewElement *viewElement = it->second;
viewElement->SetGlobals(globals);
if (!isSubview)
@ -588,7 +599,7 @@ void cTemplateView::PreCache(bool isSubview) {
}
//Cache ViewLists
for (map < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
for (multimap < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
cTemplateViewList *viewList = it->second;
viewList->SetGlobals(globals);
//viewlists in subviews need complete container information
@ -632,13 +643,13 @@ void cTemplateView::Debug(void) {
parameters->Debug();
for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
for (multimap < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
esyslog("skindesigner: ++++++++ ViewElement: %s", GetViewElementName(it->first).c_str());
cTemplateViewElement *viewElement = it->second;
viewElement->Debug();
}
for (map < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
for (multimap < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
esyslog("skindesigner: ++++++++ ViewList: %s", GetViewListName(it->first).c_str());
cTemplateViewList *viewList = it->second;
viewList->Debug();
@ -787,6 +798,7 @@ void cTemplateView::SetFunctionDefinitions(void) {
attributes.insert("width");
attributes.insert("height");
attributes.insert("align");
attributes.insert("valign");
attributes.insert("maxlines");
attributes.insert("font");
attributes.insert("fontsize");
@ -1008,7 +1020,7 @@ string cTemplateViewChannel::GetViewElementName(eViewElement ve) {
return name;
}
void cTemplateViewChannel::AddPixmap(string sViewElement, cTemplatePixmapNode *pix, vector<stringpair> &viewElementattributes) {
void cTemplateViewChannel::AddViewElement(string sViewElement, cTemplateViewElement *viewElement) {
eViewElement ve = veUndefined;
if (!sViewElement.compare("background")) {
@ -1055,17 +1067,7 @@ void cTemplateViewChannel::AddPixmap(string sViewElement, cTemplatePixmapNode *p
return;
}
pix->SetGlobals(globals);
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end()) {
cTemplateViewElement *viewElement = new cTemplateViewElement();
viewElement->SetParameters(viewElementattributes);
viewElement->AddPixmap(pix);
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
} else {
(hit->second)->AddPixmap(pix);
}
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
}
/************************************************************************************
@ -1246,6 +1248,7 @@ cTemplateViewMenu::cTemplateViewMenu(void) {
attributes.insert("menuitemwidth");
attributes.insert("determinatefont");
attributes.insert("numlistelements");
attributes.insert("condition");
funcsAllowed.insert(pair< string, set<string> >("menuitems", attributes));
//definition of allowed parameters for currentitems viewlist
@ -1516,7 +1519,7 @@ void cTemplateViewMenu::AddPluginView(string plugName, int templNo, cTemplateVie
}
}
void cTemplateViewMenu::AddPixmap(string sViewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes) {
void cTemplateViewMenu::AddViewElement(string sViewElement, cTemplateViewElement *viewElement) {
eViewElement ve = veUndefined;
if (!sViewElement.compare("background")) {
@ -1568,20 +1571,7 @@ void cTemplateViewMenu::AddPixmap(string sViewElement, cTemplatePixmapNode *pix,
return;
}
pix->SetGlobals(globals);
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end()) {
cTemplateViewElement *viewElement = new cTemplateViewElement();
viewElement->SetParameters(viewElementattributes);
if (viewElement->DebugTokens()) {
dsyslog("skindesigner: activating token debugging for view element %s", sViewElement.c_str());
}
viewElement->AddPixmap(pix);
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
} else {
(hit->second)->AddPixmap(pix);
}
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
}
void cTemplateViewMenu::AddViewList(string sViewList, cTemplateViewList *viewList) {
@ -1657,7 +1647,7 @@ string cTemplateViewMessage::GetViewElementName(eViewElement ve) {
return name;
}
void cTemplateViewMessage::AddPixmap(string sViewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes) {
void cTemplateViewMessage::AddViewElement(string sViewElement, cTemplateViewElement *viewElement) {
eViewElement ve = veUndefined;
if (!sViewElement.compare("background")) {
@ -1671,17 +1661,7 @@ void cTemplateViewMessage::AddPixmap(string sViewElement, cTemplatePixmapNode *p
return;
}
pix->SetGlobals(globals);
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end()) {
cTemplateViewElement *viewElement = new cTemplateViewElement();
viewElement->SetParameters(viewElementattributes);
viewElement->AddPixmap(pix);
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
} else {
(hit->second)->AddPixmap(pix);
}
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
}
/************************************************************************************
@ -1814,7 +1794,7 @@ string cTemplateViewReplay::GetViewElementName(eViewElement ve) {
return name;
}
void cTemplateViewReplay::AddPixmap(string sViewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes) {
void cTemplateViewReplay::AddViewElement(string sViewElement, cTemplateViewElement *viewElement) {
eViewElement ve = veUndefined;
if (!sViewElement.compare("background")) {
@ -1864,17 +1844,7 @@ void cTemplateViewReplay::AddPixmap(string sViewElement, cTemplatePixmapNode *pi
return;
}
pix->SetGlobals(globals);
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end()) {
cTemplateViewElement *viewElement = new cTemplateViewElement();
viewElement->SetParameters(viewElementattributes);
viewElement->AddPixmap(pix);
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
} else {
(hit->second)->AddPixmap(pix);
}
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
}
@ -1931,7 +1901,7 @@ string cTemplateViewVolume::GetViewElementName(eViewElement ve) {
return name;
}
void cTemplateViewVolume::AddPixmap(string sViewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes) {
void cTemplateViewVolume::AddViewElement(string sViewElement, cTemplateViewElement *viewElement) {
eViewElement ve = veUndefined;
if (!sViewElement.compare("background")) {
@ -1945,17 +1915,7 @@ void cTemplateViewVolume::AddPixmap(string sViewElement, cTemplatePixmapNode *pi
return;
}
pix->SetGlobals(globals);
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end()) {
cTemplateViewElement *viewElement = new cTemplateViewElement();
viewElement->SetParameters(viewElementattributes);
viewElement->AddPixmap(pix);
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
} else {
(hit->second)->AddPixmap(pix);
}
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
}
/************************************************************************************
@ -2041,7 +2001,7 @@ string cTemplateViewAudioTracks::GetViewListName(eViewList vl) {
return name;
}
void cTemplateViewAudioTracks::AddPixmap(string sViewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes) {
void cTemplateViewAudioTracks::AddViewElement(string sViewElement, cTemplateViewElement *viewElement) {
eViewElement ve = veUndefined;
if (!sViewElement.compare("background")) {
@ -2055,17 +2015,7 @@ void cTemplateViewAudioTracks::AddPixmap(string sViewElement, cTemplatePixmapNod
return;
}
pix->SetGlobals(globals);
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end()) {
cTemplateViewElement *viewElement = new cTemplateViewElement();
viewElement->SetParameters(viewElementattributes);
viewElement->AddPixmap(pix);
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
} else {
(hit->second)->AddPixmap(pix);
}
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
}
void cTemplateViewAudioTracks::AddViewList(string sViewList, cTemplateViewList *viewList) {
@ -2148,18 +2098,12 @@ void cTemplateViewPlugin::AddSubView(string sSubView, cTemplateView *subView) {
subViews.insert(pair< eSubView, cTemplateView* >((eSubView)subViewId, subView));
}
void cTemplateViewPlugin::AddPixmap(string sViewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes) {
void cTemplateViewPlugin::AddViewElement(string sViewElement, cTemplateViewElement *viewElement) {
eViewElement ve = veUndefined;
string viewElementName = "";
int viewElementID = -1;
bool found = false;
for (vector<pair<string, string> >::iterator it = viewElementattributes.begin(); it != viewElementattributes.end(); it++) {
if (!(it->first).compare("name")) {
viewElementName = it->second;
found = true;
break;
}
}
bool found = viewElement->GetName(viewElementName);
if (found) {
viewElementID = config.GetPluginViewElementID(pluginName, viewElementName, viewID);
@ -2178,30 +2122,14 @@ void cTemplateViewPlugin::AddPixmap(string sViewElement, cTemplatePixmapNode *pi
viewElementID = pve;
}
pix->SetGlobals(globals);
ve = (eViewElement)viewElementID;
map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
if (hit == viewElements.end()) {
cTemplateViewElement *viewElement = new cTemplateViewElement();
viewElement->SetParameters(viewElementattributes);
viewElement->AddPixmap(pix);
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
} else {
(hit->second)->AddPixmap(pix);
}
viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
}
void cTemplateViewPlugin::AddPixmapGrid(cTemplatePixmapNode *pix, vector<pair<string, string> > &gridAttributes) {
void cTemplateViewPlugin::AddGrid(cTemplateViewGrid *viewGrid) {
string gridName = "";
bool found = false;
for (vector<pair<string, string> >::iterator it = gridAttributes.begin(); it != gridAttributes.end(); it++) {
if (!(it->first).compare("name")) {
gridName = it->second;
found = true;
break;
}
}
bool found = viewGrid->GetName(gridName);
if (!found) {
esyslog("skindesigner: no name defined for plugin %s grid", pluginName.c_str());
}
@ -2212,17 +2140,7 @@ void cTemplateViewPlugin::AddPixmapGrid(cTemplatePixmapNode *pix, vector<pair<st
return;
}
pix->SetGlobals(globals);
map < int, cTemplateViewGrid* >::iterator hit = viewGrids.find(gridID);
if (hit == viewGrids.end()) {
cTemplateViewGrid *viewGrid = new cTemplateViewGrid();
viewGrid->SetParameters(gridAttributes);
viewGrid->AddPixmap(pix);
viewGrids.insert(pair< int, cTemplateViewGrid*>(gridID, viewGrid));
} else {
(hit->second)->AddPixmap(pix);
}
viewGrids.insert(pair< int, cTemplateViewGrid*>(gridID, viewGrid));
}
void cTemplateViewPlugin::AddViewTab(cTemplateViewTab *viewTab) {

View File

@ -49,8 +49,8 @@ protected:
int containerWidth;
int containerHeight;
//basic view data structures
map < eViewElement, cTemplateViewElement* > viewElements;
map < eViewList, cTemplateViewList* > viewLists;
multimap < eViewElement, cTemplateViewElement* > viewElements;
multimap < eViewList, cTemplateViewList* > viewLists;
map < int, cTemplateViewGrid* > viewGrids;
map < eSubView, cTemplateView* > subViews;
vector< cTemplateViewTab* > viewTabs;
@ -76,8 +76,8 @@ public:
virtual string GetViewListName(eViewList vl) { return ""; };
virtual void AddSubView(string sSubView, cTemplateView *subView) {};
virtual void AddPluginView(string plugName, int templNo, cTemplateView *plugView) {};
virtual void AddPixmap(string sViewElement, cTemplatePixmapNode *pix, vector<stringpair> &viewElementattributes) {};
virtual void AddPixmapGrid(cTemplatePixmapNode *pix, vector<pair<string, string> > &gridAttributes) {};
virtual void AddViewElement(string sViewElement, cTemplateViewElement *viewElement) {};
virtual void AddGrid(cTemplateViewGrid *viewGrid) {};
virtual void AddViewList(string sViewList, cTemplateViewList *viewList) {};
virtual void AddViewTab(cTemplateViewTab *viewTab) {};
//Setter Functions
@ -151,7 +151,7 @@ public:
cTemplateViewChannel(void);
virtual ~cTemplateViewChannel(void);
string GetViewElementName(eViewElement ve);
void AddPixmap(string viewElement, cTemplatePixmapNode *pix, vector<stringpair> &viewElementattributes);
void AddViewElement(string sViewElement, cTemplateViewElement *viewElement);
};
// --- cTemplateViewMenu -------------------------------------------------------------
@ -169,7 +169,7 @@ public:
string GetViewListName(eViewList vl);
void AddSubView(string sSubView, cTemplateView *subView);
void AddPluginView(string plugName, int templNo, cTemplateView *plugView);
void AddPixmap(string viewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes);
void AddViewElement(string sViewElement, cTemplateViewElement *viewElement);
void AddViewList(string sViewList, cTemplateViewList *viewList);
void AddViewTab(cTemplateViewTab *viewTab);
};
@ -183,7 +183,7 @@ public:
cTemplateViewMessage(void);
virtual ~cTemplateViewMessage(void);
string GetViewElementName(eViewElement ve);
void AddPixmap(string viewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes);
void AddViewElement(string sViewElement, cTemplateViewElement *viewElement);
};
// --- cTemplateViewReplay -------------------------------------------------------------
@ -195,7 +195,7 @@ public:
cTemplateViewReplay(void);
virtual ~cTemplateViewReplay(void);
string GetViewElementName(eViewElement ve);
void AddPixmap(string viewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes);
void AddViewElement(string sViewElement, cTemplateViewElement *viewElement);
};
// --- cTemplateViewVolume -------------------------------------------------------------
@ -207,7 +207,7 @@ public:
cTemplateViewVolume(void);
virtual ~cTemplateViewVolume(void);
string GetViewElementName(eViewElement ve);
void AddPixmap(string viewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes);
void AddViewElement(string sViewElement, cTemplateViewElement *viewElement);
};
// --- cTemplateViewAudioTracks -------------------------------------------------------------
@ -221,7 +221,7 @@ public:
virtual ~cTemplateViewAudioTracks(void);
string GetViewElementName(eViewElement ve);
string GetViewListName(eViewList vl);
void AddPixmap(string viewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes);
void AddViewElement(string sViewElement, cTemplateViewElement *viewElement);
void AddViewList(string sViewList, cTemplateViewList *viewList);
};
@ -235,8 +235,8 @@ public:
cTemplateViewPlugin(string pluginName, int viewID);
virtual ~cTemplateViewPlugin(void);
void AddSubView(string sSubView, cTemplateView *subView);
void AddPixmap(string viewElement, cTemplatePixmapNode *pix, vector<pair<string, string> > &viewElementattributes);
void AddPixmapGrid(cTemplatePixmapNode *pix, vector<pair<string, string> > &gridAttributes);
void AddViewElement(string sViewElement, cTemplateViewElement *viewElement);
void AddGrid(cTemplateViewGrid *viewGrid);
void AddViewTab(cTemplateViewTab *viewTab);
};

View File

@ -97,6 +97,15 @@ int cTemplateViewElement::GetNumPixmaps(void) {
return numPixmaps;
};
bool cTemplateViewElement::GetName(string &name) {
if (!parameters)
return false;
name = parameters->GetParameter(ptName);
if (name.size() > 0)
return true;
return false;
}
void cTemplateViewElement::InitPixmapNodeIterator(void) {
pixmapNodeIterator = viewPixmapNodes.begin();
}

View File

@ -111,6 +111,7 @@ public:
void SetPixOffset(int offset) { pixOffset = offset; };
int GetPixOffset(void) { return pixOffset; };
virtual int GetNumPixmaps(void);
bool GetName(string &name);
void InitPixmapNodeIterator(void);
cTemplatePixmapNode *GetNextPixmapNode(void);
void InitPixmapIterator(void);

View File

@ -25,9 +25,7 @@ void cTemplateViewList::SetGlobals(cGlobals *globals) {
bool cTemplateViewList::CalculateListParameters(void) {
if (!parameters)
return false;
parameters->SetContainer(containerX, containerY, containerWidth, containerHeight);
parameters->SetGlobals(globals);
bool paramsValid = parameters->CalculateParameters();
bool paramsValid = false;
if (!listElement)
return false;
listElement->SetContainer(parameters->GetNumericParameter(ptX),
@ -67,6 +65,13 @@ bool cTemplateViewList::CalculateListParameters(map < string, int > *intTokens)
return paramsValid;
}
eOrientation cTemplateViewList::GetOrientation(void) {
if (!parameters)
return orNone;
int orientation = parameters->GetNumericParameter(ptOrientation);
return (eOrientation)orientation;
}
int cTemplateViewList::GetAverageFontWidth(void) {
int defaultAverageFontWidth = 20;

View File

@ -36,6 +36,7 @@ public:
bool CalculateListParameters(map < string, int > *intTokens);
cTemplateViewElement *GetListElement(void) { return listElement; };
cTemplateViewElement *GetListElementCurrent(void) { return currentElement; };
eOrientation GetOrientation(void);
int GetAverageFontWidth(void);
cFont *GetTextAreaFont(void);
int GetMenuItemWidth(void);

View File

@ -199,12 +199,16 @@ void cXmlParser::ParseViewElement(cTemplateView *subView) {
if (!view)
return;
const char *viewElement = NodeName();
const char *viewElementName = NodeName();
vector<stringpair> attributes = ParseAttributes();
ValidateAttributes("viewelement", attributes);
if (!LevelDown())
return;
cTemplateViewElement *viewElement = new cTemplateViewElement();
viewElement->SetParameters(attributes);
do {
if (!CheckNodeName("areacontainer") && !CheckNodeName("area") && !CheckNodeName("areascroll")) {
esyslog("skindesigner: invalid tag \"%s\" in viewelement", NodeName());
@ -216,12 +220,15 @@ void cXmlParser::ParseViewElement(cTemplateView *subView) {
} else {
pix = ParseAreaContainer();
}
if (subView)
subView->AddPixmap(viewElement, pix, attributes);
else
view->AddPixmap(viewElement, pix, attributes);
pix->SetGlobals(globals);
viewElement->AddPixmap(pix);
} while (NextNode());
LevelUp();
if (subView)
subView->AddViewElement(viewElementName, viewElement);
else
view->AddViewElement(viewElementName, viewElement);
}
void cXmlParser::ParseViewList(cTemplateView *subView) {
@ -323,6 +330,10 @@ void cXmlParser::ParseGrid(void) {
if (!LevelDown())
return;
cTemplateViewGrid *viewGrid = new cTemplateViewGrid();
viewGrid->SetParameters(attributes);
do {
if (!CheckNodeName("areacontainer") && !CheckNodeName("area") && !CheckNodeName("areascroll")) {
@ -335,9 +346,12 @@ void cXmlParser::ParseGrid(void) {
} else {
pix = ParseAreaContainer();
}
view->AddPixmapGrid(pix, attributes);
pix->SetGlobals(globals);
viewGrid->AddPixmap(pix);
} while (NextNode());
LevelUp();
view->AddGrid(viewGrid);
}
cTemplatePixmap *cXmlParser::ParseArea(void) {
@ -579,15 +593,17 @@ void cXmlParser::ParseSetupParameter(void) {
string attributeMax = "max";
string paramMax = "";
string paramValue = "";
string attributeOptions = "options";
string paramOptions="";
GetAttribute(attributeType, paramType);
GetAttribute(attributeName, paramName);
GetAttribute(attributeDisplayText, paramDisplayText);
GetAttribute(attributeMin, paramMin);
GetAttribute(attributeMax, paramMax);
GetAttribute(attributeOptions, paramOptions);
GetNodeValue(paramValue);
skinSetup->SetParameter(paramType, paramName, paramDisplayText, paramMin, paramMax, paramValue);
skinSetup->SetParameter(paramType, paramName, paramDisplayText, paramMin, paramMax, paramValue, paramOptions);
}
void cXmlParser::ValidateAttributes(const char *nodeName, vector<stringpair> &attributes) {

View File

@ -0,0 +1,79 @@
Common subdirectories: vdr-2.2.0/PLUGINS and /usr/local/src/vdr-2.2.0/PLUGINS
Common subdirectories: vdr-2.2.0/libsi and /usr/local/src/vdr-2.2.0/libsi
diff -upN '--exclude=Make.config' vdr-2.2.0/osdbase.c /usr/local/src/vdr-2.2.0/osdbase.c
--- vdr-2.2.0/osdbase.c 2015-01-15 11:11:11.000000000 +0100
+++ /usr/local/src/vdr-2.2.0/osdbase.c 2015-08-06 17:27:18.778646643 +0200
@@ -87,6 +87,7 @@ cOsdMenu::cOsdMenu(const char *Title, in
title = NULL;
menuCategory = mcUnknown;
menuSortMode = msmUnknown;
+ menuOrientation = moVertical;
SetTitle(Title);
SetCols(c0, c1, c2, c3, c4);
first = 0;
@@ -231,6 +232,7 @@ void cOsdMenu::Display(void)
if (menuCategory != displayMenu->MenuCategory())
displayMenu->SetMenuCategory(menuCategory);
displayMenu->SetMenuSortMode(menuSortMode);
+ menuOrientation = displayMenu->MenuOrientation();
displayMenuItems = displayMenu->MaxItems();
displayMenu->SetTabs(cols[0], cols[1], cols[2], cols[3], cols[4]);//XXX
displayMenu->SetTitle(title);
@@ -541,13 +543,13 @@ eOSState cOsdMenu::ProcessKey(eKeys Key)
case k0: return osUnknown;
case k1...k9: return hasHotkeys ? HotKey(Key) : osUnknown;
case kUp|k_Repeat:
- case kUp: CursorUp(); break;
+ case kUp: if (menuOrientation == moHorizontal) PageUp(); else CursorUp(); break;
case kDown|k_Repeat:
- case kDown: CursorDown(); break;
+ case kDown: if (menuOrientation == moHorizontal) PageDown(); else CursorDown(); break;
case kLeft|k_Repeat:
- case kLeft: PageUp(); break;
+ case kLeft: if (menuOrientation == moHorizontal) CursorUp(); else PageUp(); break;
case kRight|k_Repeat:
- case kRight: PageDown(); break;
+ case kRight: if (menuOrientation == moHorizontal) CursorDown(); else PageDown(); break;
case kBack: return osBack;
case kOk: if (marked >= 0) {
SetStatus(NULL);
diff -upN '--exclude=Make.config' vdr-2.2.0/osdbase.h /usr/local/src/vdr-2.2.0/osdbase.h
--- vdr-2.2.0/osdbase.h 2015-01-15 11:09:18.000000000 +0100
+++ /usr/local/src/vdr-2.2.0/osdbase.h 2015-07-31 15:23:29.232867174 +0200
@@ -93,6 +93,7 @@ private:
int first, current, marked;
eMenuCategory menuCategory;
eMenuSortMode menuSortMode;
+ eMenuOrientation menuOrientation;
cOsdMenu *subMenu;
const char *helpRed, *helpGreen, *helpYellow, *helpBlue;
bool helpDisplayed;
Common subdirectories: vdr-2.2.0/po and /usr/local/src/vdr-2.2.0/po
diff -upN '--exclude=Make.config' vdr-2.2.0/skins.h /usr/local/src/vdr-2.2.0/skins.h
--- vdr-2.2.0/skins.h 2015-01-15 11:45:47.000000000 +0100
+++ /usr/local/src/vdr-2.2.0/skins.h 2015-08-06 17:33:41.500188153 +0200
@@ -129,6 +129,12 @@ enum eMenuSortMode {
msmProvider
};
+#define MENU_ORIENTATION_DEFINED 1
+enum eMenuOrientation {
+ moVertical = 0,
+ moHorizontal
+ };
+
class cSkinDisplayMenu : public cSkinDisplay {
///< This class implements the general purpose menu display, which is
///< used throughout the program to display information and let the
@@ -179,6 +185,10 @@ public:
///< Sets the mode by which the items in this menu are sorted.
///< This is purely informative and may be used by a skin to display the
///< current sort mode by means of some text or symbol.
+ virtual eMenuOrientation MenuOrientation(void) { return moVertical; }
+ ///< Asks the skin for the orientation of the displayed menu
+ ///< If menu orientation is set to horizontal, the keys left / right
+ ///< and up / down are just toggled
virtual void Scroll(bool Up, bool Page);
///< If this menu contains a text area that can be scrolled, this function
///< will be called to actually scroll the text. Up indicates whether the
Common subdirectories: vdr-2.2.0/symbols and /usr/local/src/vdr-2.2.0/symbols

View File

@ -471,6 +471,8 @@ void cSkindesignerSkinSetup::Set(void) {
Add(new cMenuEditIntItem(param->displayText.c_str(), &param->value, param->min, param->max));
} else if (param->type == sptBool) {
Add(new cMenuEditBoolItem(param->displayText.c_str(), &param->value));
} else if (param->type == sptString) {
Add(new cMenuEditStraItem(param->displayText.c_str(), &param->value, param->numOptions, param->optionsTranslated));
}
}

View File

@ -8,6 +8,9 @@
<parameter type="int" name="shifttimedatetime" min="0" max="1000" displaytext="{tr(shifttimedatetimetext)}">0</parameter>
<parameter type="int" name="shifttimetimers" min="0" max="1000" displaytext="{tr(shifttimetimerstext)}">0</parameter>
<parameter type="bool" name="showdevices" displaytext="{tr(showdevices)}">0</parameter>
<parameter type="string" name="mainmenuorientation" displaytext="{tr(mainmenuorientation)}" options="horizontal,vertical">1</parameter>
<parameter type="string" name="recmenuorientation" displaytext="{tr(recmenuorientation)}" options="horizontal,vertical">1</parameter>
<parameter type="string" name="weathermenuorientation" displaytext="{tr(weathermenuorientation)}" options="horizontal,vertical">1</parameter>
</menu>
<translations>
@ -33,5 +36,25 @@
<trans lang="de_DE">DVB Karten Info beim Umschalten anzeigen</trans>
<trans lang="fi_FI">Näytä DVB-tiedot kanavanvaihdossa</trans>
</token>
<token name="tr(mainmenuorientation)">
<trans lang="en_EN">Orientation of main menu</trans>
<trans lang="de_DE">Ausrichtung des Hauptmenüs</trans>
</token>
<token name="tr(recmenuorientation)">
<trans lang="en_EN">Orientation of recordings menu</trans>
<trans lang="de_DE">Ausrichtung des Aufzeichnugsmenüs</trans>
</token>
<token name="tr(weathermenuorientation)">
<trans lang="en_EN">Orientation of weatherforecast menu</trans>
<trans lang="de_DE">Ausrichtung des Wettermenüs</trans>
</token>
<token name="tr(horizontal)">
<trans lang="en_EN">horizontal menu</trans>
<trans lang="de_DE">horizontales Menü</trans>
</token>
<token name="tr(vertical)">
<trans lang="en_EN">vertical menu</trans>
<trans lang="de_DE">vertikales Menü</trans>
</token>
</translations>
</setup>

View File

@ -2,19 +2,12 @@
<!DOCTYPE displayaudiotracks SYSTEM "../../../dtd/displayaudiotracks.dtd">
<displayaudiotracks x="25%" y="0" width="50%" height="100%" fadetime="{fadetime}">
<!-- Available Variables background:
{numtracks} number of displayed tracks
-->
<background>
<area x="0" y="{areaheight} - {numtracks} * {areaheight} / 10 - {areaheight} / 10" width="100%" height="{areaheight} / 10 + {areaheight} / 10 * {numtracks}" layer="1">
<fill color="{clrTransBlack}" />
</area>
</background>
<!-- Available Variables header:
{numtracks} number of displayed tracks
{title} title of menu
-->
<header>
<area x="0" y="{areaheight} - {numtracks} * {areaheight} / 10 - {areaheight} / 10" width="100%" height="{areaheight} / 10" layer="2">
<drawtext x="10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
@ -22,15 +15,8 @@
<drawimage condition="{isac3}" imagetype="icon" path="ico_ac3" x="{areawidth} - {areaheight}*0.9" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9"/>
</area>
</header>
<!-- Available Variables header:
{numelements} number of displayed tracks
-->
<menuitems x="0" y="{areaheight} - {numelements} * {areaheight} / 10" orientation="vertical" width="100%" height="{numelements} * {areaheight} / 10" align="top" numlistelements="{numelements}">
<!-- Available Variables auidotrack listelement:
{current} true if item is currently selected
{title} title of auio track
-->
<listelement>
<!-- Background -->
<area x="1%" width="98%" layer="2">

View File

@ -13,13 +13,6 @@
</area>
</background>
<!-- Available Variables channelinfo:
{channelnumber} Number of Channel, with "-" in case of channel switching
{channelname} Name of current Channel
{channellogoexists} true if a channel logo exists
{channelid} ChannelID as path to display channel logo
{switching} true if a number is pressed on the remote to switch to a dedicated channel
-->
<channelinfo>
<area x="22%" y="80%" width="76%" height="7%" layer="2">
<fill condition="not{switching}" color="{clrTransparent}" />
@ -30,27 +23,7 @@
<drawtext condition="not{channellogoexists}" x="5" valign="center" font="{light}" fontsize="40%" color="{clrWhite}" text="{channelnumber}: {channelname}" />
</area>
</channelinfo>
<!-- Available Variables epginfo:
{currenttitle} Title of the current Schedule
{currentsubtitle} Subtitle of the current Schedule
{currentstart} Start of current Schedule in hh:mm
{currentstop} End of current Schedule in hh:mm
{currentduration} Duration of current Schedule in min
{currentdurationhours} Duration, full hours
{currentdurationminutes} Duration, rest of minutes
{currentelapsed} Elapsed time of current Schedule in min
{currentremaining} Remaining time of current Schedule in min
{currentrecording} true if current Schedule is recorded
{hasVPS} true if current Schedule has VPS
{nexttitle} Title of next Schedule
{nextsubtitle} Subtitle of next Schedule
{nextstart} Start of next Schedule in hh:mm
{nextstop} Stop of next Schedule in hh:mm
{nextduration} Duration of next Schedule in min
{nextdurationhours} Duration, full hours
{nextdurationminutes} Duration, rest of minutes
{nextrecording} true if next Schedule will be recorded
-->
<epginfo>
<area x="22%" y="80%" width="76%" height="7%" layer="2">
<drawtext name="title" x="0" valign="center" font="{light}" fontsize="99%" color="{clrWhite}" text="{currenttitle}" width="{areawidth} - {width(startstop)}"/>
@ -64,15 +37,6 @@
</area>
</epginfo>
<!-- Available Variables progressbar:
{start} Start of current Schedule in hh:mm
{stop} End of current Schedule in hh:mm
{duration} Total Duration of current Schedule in seconds
{elapsed} Elapsed time of current Schedule in seconds
{remaining} Remaining time of current Schedule in seconds
{permashift} true if permashift plugin is in use
{livebuffer} current buffered data in seconds
-->
<progressbar>
<area condition="not{permashift}" x="22%" y="87%" width="76%" height="3" layer="2">
<drawrectangle x="0" y="1" width="100%" height="1" color="{clrWhite}" />
@ -85,15 +49,6 @@
</area>
</progressbar>
<!-- Available Variables statusinfo:
{isRadio} true if channel is a radio channel
{hasVT} true if channel has video text
{isStereo} true if a stereo audio trac is available
{isDolby} true if a dolby audio track is available
{isEncrypted} true if channel is encrypted
{isRecording} true if currently a recording is running on this channel
{newmails} true if mailbox plugin is installed and new mails are available
-->
<statusinfo>
<area x="22%" y="94%" width="76%" height="6%" layer="2">
<!-- encrypted / decrypted icon -->
@ -111,23 +66,9 @@
</area>
</statusinfo>
<!-- Available Variables audioinfo:
{numaudiotracks} number of available audio tracks for current channel
{audiochannel} 0 if current channel is stereo, 1 for left chanel only, 2 for right channel only
{trackdesc} description of the current audio track
{tracklang} language of the current audio track
-->
<audioinfo>
</audioinfo>
<!-- Available Variables screenresolution:
{screenwidth} width of currently displayed channel in px
{screenheight} height of currently displayed channel in px
{resolution} resolution: hd1080i, hd720p, sd576i
{aspect} screen aspect, each 4:3, 16:9 or 21:9
{isHD} true for hd1080i and hd720p
{isWideScreen} true if aspect is 16:9 or 21:9
-->
<screenresolution>
<area x="22%" y="94%" width="76%" height="6%" layer="2">
<!-- widescreen icon -->
@ -141,15 +82,6 @@
</area>
</screenresolution>
<!-- Available Variables dvbdeviceinfo:
{prevAvailable} true if previous Channel Group is avaialble
{nextAvailable} true if next Channel Group is avaialble
{group} Name of current Channel Group
{nextgroup} Name of next Channel Group
{prevgroup} Name of prev Channel Group
{sepexists} true if a channel separator logo exists
{seppath} path for separator logo to use in imagetype "seplogo"
-->
<channelgroup>
<area x="0" y="80%" width="20%" height="20%" layer="2">
<drawimage condition="{sepexists}" imagetype="seplogo" path="{seppath}" width="98%" height="98%" align="center" valign="center" />
@ -162,37 +94,15 @@
</area>
</channelgroup>
<!-- Available Variables signalquality:
{signalstrength} STR value of currently displayed channel
{signalquality} SNR value of currently displayed channel
-->
<signalquality>
<area x="22%" y="94%" width="76%" height="6%" layer="3">
<drawtext x="0" valign="center" font="{light}" fontsize="70%" color="{clrWhite}" text="STR: {signalstrength}% SNR: {signalquality}%" />
</area>
</signalquality>
<!-- background of signalmeter, will only be drawn if signalquality was deleted -->
<signalqualityback>
</signalqualityback>
<!-- Available Variables devices:
{numdevices} number of available devices
{devices[]} array with available devices
{devices[num]} number of current device
{devices[type]} type of device (DVB-S, DVB-C, ...)
{devices[istuned]} true if device is currently tuned to a transponder
{devices[livetv]} true if device is currently playing livetv
{devices[recording]} true if device is currently recording
{devices[hascam]} true if device has a CAM
{devices[cam]} number of CAM
{devices[signalstrength]} signalstrength of devcie
{devices[signalquality]} signalstrength of devcie
{devices[channelnumber]} number of the currently tuned channel
{devices[channelname]} name of the currently tuned channel
{devices[channelid]} ID of the currently tuned channel
{devices[source]} source of the currently tuned channel
-->
<devices condition="{showdevices}" detached="true" delay="100" shifttime="{shifttimedatetime}" shifttype="right" shiftmode="slowed">
<area x="70%" y="30%" width="30%" height="{areaheight}/12 * {numdevices}" layer="1" background="true">
<fill color="{clrTransBlack}"/>
@ -211,26 +121,6 @@
</area>
</devices>
<!-- Available Variables currentweather:
{timestamp} timestamp of forecast in dd.mm hh:mm
{temperature} current temperature in °C
{apparenttemperature} apparent (feeled) temperature
{mintemperature} minimum temperature this day
{maxtemperature} maximum temperature this day
{summary} short weather summary
{icon} weather icon
{precipitationintensity} precipitation intensity in l/m2
{precipitationprobability} precipitation probability in %
{precipitationtype} precipitation type
{humidity} humidity in %
{windspeed} windspeed in km/h
{windbearing} wind bearing in °
{windbearingstring} wind bearing (N, NE, ...)
{visibility} visibility in km
{cloudcover} cloud cover in %
{pressure} pressure in HPo
{ozone} ozone value in DU
-->
<currentweather detached="true" delay="100" shifttime="{shifttimedatetime}" shifttype="right" shiftmode="slowed">
<area background="true" x="70%" y="15%" width="30%" height="13%" layer="1">
<fill color="{clrTransBlack}" />
@ -248,22 +138,6 @@
</area>
</currentweather>
<!-- Available Variables scrapercontent:
{posterpath} Full Path of Poster to use in image path attribute
{posterwidth} width of poster in pixel
{posterheight} height of poster in pixel
{hasPoster} true if poster is available
{bannerpath} Full Path of banner to use in image path attribute
{bannerwidth} width of banner in pixel
{bannerheight} height of banner in pixel
{hasBanner} true if banner is available
Use this tokens if you want to display a banner for series and a poster for movies:
{mediapath} Full Path of Poster or Banner to use in image path attribute
{mediawidth} width of image in pixel
{mediaheight} height of image in pixel
{isbanner} true if image is a banner, false if it is a poster
-->
<scrapercontent detached="true" delay="0" fadetime="0">
<area condition="{isbanner}" x="0" y="0" width="{areaheight}*0.13*{mediawidth}/{mediaheight}" height="13%" layer="2">
<drawimage imagetype="image" path="{mediapath}" align="center" valign="center" width="{areawidth}" height="{areaheight}"/>
@ -273,17 +147,6 @@
</area>
</scrapercontent>
<!-- Available Variables datetime:
{time} time in hh:mm
{day} day in digits
{dayleadingzero} day in digits with leading 0
{dayname} Full name of the day
{daynameshort} Short 3 char name of the day
{month} month in digits with leading 0
{monthname} Full name of the month
{monthnameshort} 3 letter abbrivation of month name
{year} year in yyyy
-->
<datetime detached="true" delay="100" shifttime="{shifttimedatetime}" shifttype="right" shiftmode="slowed">
<area background="true" x="70%" y="0" width="30%" height="13%" layer="1">
<fill color="{clrTransBlack}" />
@ -297,13 +160,7 @@
<drawtext x="1%" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{time}" />
</area>
</datetime>
<!-- Available Variables message:
{text} message text
{status} true if message is a status message
{info} true if message is a info message
{warning} true if message is a warn message
{error} true if message is a error message
-->
<message>
<area x="10%" y="45%" width="80%" height="10%" layer="1">
<fill color="{clrTransBlack}" />
@ -315,11 +172,7 @@
</area>
</message>
<!-- Available Variables customtokens:
all custom tokens set by the svdrp command SCTK are available in this viewelement
For instance, use an appropriate script which runs periodically as cronjob and
sets these custom tokens with svdrpsend or dbus2vdr
-->
<customtokens>
</customtokens>
</displaychannel>

View File

@ -13,11 +13,7 @@
]>
<displaymenu x="3%" y="5%" width="94%" height="90%" fadetime="0">
<!--
The following background, header, datetime and colorbuttons definitions are default
implementations. If one or more of these elements are not implemented in the subview,
the default implementations are used.
-->
<background>
<!-- background left Menu -->
<area x="0" y="0" width="63%" height="100%" layer="1">
@ -28,18 +24,7 @@
<fill color="{clrTransBlueLight}" />
</area>
</background>
<!-- Available Variables header:
{title} title of current menu
{vdrversion} running VDR Version
{hasicon} true if a menu icon is available
{icon} path of menu icon
{freetime} available disc capacity in hh:mm
{freepercent} available disc capacity in percent
{usedpercent} used disc capacity in percent
{freegb} available disc capacity in gigabytes
{discalert} true if disc usage is > 95%
{vdrusagestring} localized VDR internal usage string
-->
<header>
<area x="0" y="0" width="41%" height="10%" layer="2">
<drawtext condition="not{hasicon}" x="5" width="{areawidth}-10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
@ -47,17 +32,7 @@
<drawtext condition="{hasicon}" x="{areaheight}" valign="center" width="{areawidth}-{areaheight}-10" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
</area>
</header>
<!-- Available Variables datetime:
{time} time in hh:mm
{day} day in digits
{dayleadingzero} day in digits with leading 0
{dayname} Full name of the day
{daynameshort} Short 3 char name of the day
{month} month in digits with leading 0
{monthname} Full name of the month
{monthnameshort} 3 letter abbrivation of month name
{year} year in yyyy
-->
<datetime>
<area x="41%" y="0" width="12%" height="10%" layer="2">
<drawtext align="right" y="5%" font="{light}" fontsize="50%" color="{clrWhite}" text="{dayname}" />
@ -67,13 +42,7 @@
<drawtext align="center" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{time}" />
</area>
</datetime>
<!-- Available Variables message:
{text} message text
{status} true if message is an status message
{info} true if message is an info message
{warning} true if message is an warn message
{error} true if message is an error message
-->
<message>
<area x="5%" y="75%" width="90%" height="15%" layer="7">
<fill color="{clrTransBlack}" />
@ -85,12 +54,6 @@
</area>
</message>
<!-- Available Variables sortmode:
{sortnumber} true if menu is sorted by number
{sortname} true if menu is sorted alphabetical
{sorttime} true if menu is sorted by time
{sortprovider} true if menu is sorted by provider
-->
<sortmode>
<area x="35%" y="2%" width="6%" height="6%" layer="4">
<drawimage condition="{sortnumber}" imagetype="icon" path="ico_sort_number" x="0" y="0" width="100%" height="100%"/>
@ -99,28 +62,7 @@
<drawimage condition="{sortprovider}" imagetype="icon" path="ico_sort_provider" x="0" y="0" width="100%" height="100%"/>
</area>
</sortmode>
<!-- Available Variables colorbuttons:
{red1} true if red button is button 1
{red2} true if red button is button 2
{red3} true if red button is button 3
{red4} true if red button is button 4
{green1} true if green button is button 1
{green2} true if green button is button 2
{green3} true if green button is button 3
{green4} true if green button is button 4
{yellow1} true if yellow button is button 1
{yellow2} true if yellow button is button 2
{yellow3} true if yellow button is button 3
{yellow4} true if yellow button is button 4
{blue1} true if blue button is button 1
{blue2} true if blue button is button 2
{blue3} true if blue button is button 3
{blue4} true if blue button is button 4
{red} label of red button
{green} label of green button
{yellow} label of yellow button
{blue} label of blue button
-->
<colorbuttons>
<area x="0" y="92%" width="15%" height="8%" layer="2">
<drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />

View File

@ -1,25 +1,5 @@
<menuchannels x="0" y="0" width="100%" height="100%" fadetime="0">
<menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="16">
<!-- Available Variables channels menu listelement:
{nummenuitem} number of item in list, starts with 1
{number} number of the displayed channel
{name} name of the displayed channel
{channelid} ChannelID as path to display channel logo
{transponder} Transponder of channel
{frequency} Frequency of channel
{source} Source of channel (S, C, T)
{sourcedescription} Descriptin of source from sources.conf
{position} orbital position of the satellite in case this is a DVB-S source
{isAtsc} true if channel is a ATSC channel
{isCable} true if channel is cable channel
{isSat} true if channel is a satellite channel
{isTerr} true if channel is terrestrical
{presenteventtitle} title of present event on this channel
{presenteventstart} present event start time in hh::mm
{presenteventstop} present event event stop time in hh::mm
{current} true if item is currently selected
{separator} true if item is a list separator
-->
<listelement>
<!-- Background -->
<area x="1%" width="58%" layer="2">
@ -37,51 +17,6 @@
<drawtext x="20" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{name}" />
</area>
</listelement>
<!-- additional element which is drawn for current element -->
<!-- Available Variables channels menu currentelement:
{number} number of the displayed channel
{name} name of the displayed channel
{channelid} ChannelID as path to display channel logo
{transponder} Transponder of channel
{frequency} Frequency of channel
{source} Source of channel (S, C, T)
{sourcedescription} Descriptin of source from sources.conf
{position} orbital position of the satellite in case this is a DVB-S source
{isAtsc} true if channel is a ATSC channel
{isCable} true if channel is cable channel
{isSat} true if channel is a satellite channel
{isTerr} true if channel is terrestrical
{presenteventtitle} title of present event on this channel
{presenteventstart} present event start time in hh::mm
{presenteventstop} present event stop time in hh::mm
{presenteventshorttext} present event short text
{presenteventdescription} present event description
{presenteventday} present event name of day
{presenteventdate} present event date in dd:mm:yy
{presenteventelapsed} present event elapsed time
{presenteventduration} present event duration
{presenteventdurationhours} duration, full hours
{presenteventdurationminutes} duration, rest of minutes
{hasposter} true if a scraped poster is available for this elements present evemt
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{nexteventtitle} title of next event on this channel
{nexteventstart} next event start time in hh::mm
{nexteventstop} next event event stop time in hh::mm
{nexteventshorttext} next event short text
{nexteventdescription} next event description
{nexteventday} next event name of day
{nexteventdate} next event date in dd:mm:yy
{nexteventduration} next event duration
{nexteventdurationhours} duration, full hours
{nexteventdurationminutes} duration, rest of minutes
{schedule[]} array with following 10 schedules
{schedule[title]} title of event
{schedule[shorttext]} shorttext of event
{schedule[start]} start time of event in hh:mm
{schedule[stop]} stop time of event in hh:mm
-->
<currentelement delay="500" fadetime="0">
<area x="63%" y="0" width="36%" height="85%" layer="2">
<drawimage name="logo" imagetype="channellogo" path="{channelid}" x="10" y="0" width="30%" height="10%" />
@ -108,10 +43,6 @@
</areascroll>
</currentelement>
</menuitems>
<!-- Available Variables colorbuttons:
{height} height in one-tenth of a percent of total height
{offset} offset from top in one-tenth of a percent of total height
-->
<scrollbar>
<area x="60%" y="10%" width="2%" height="82%" layer="3">
<fill color="{clrWhite}" />
@ -119,4 +50,4 @@
<drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
</area>
</scrollbar>
</menuchannels>
</menuchannels>

View File

@ -5,12 +5,7 @@
<fill color="{clrTransBlack}" />
</area>
</background>
<!-- Available Variables header:
{title} title of current menu
{vdrversion} running VDR Version
{hasicon} true if a menu icon is available
{icon} path of menu icon
-->
<header>
<area x="0" y="0" width="75%" height="10%" layer="2">
<drawtext condition="not{hasicon}" x="5" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
@ -18,16 +13,7 @@
<drawtext condition="{hasicon}" x="{areaheight}" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
</area>
</header>
<!-- Available Variables datetime:
{time} time in hh:mm
{day} day in digits
{dayleadingzero} day in digits with leading 0
{dayname} Full name of the day
{daynameshort} Short 3 char name of the day
{month} month in digits with leading 0
{monthname} Full name of the month
{year} year in yyyy
-->
<datetime>
<area x="80%" y="0" width="10%" height="10%" layer="2">
<drawtext align="right" y="0%" font="{light}" fontsize="50%" color="{clrWhite}" text="{dayname}" />
@ -38,28 +24,6 @@
</area>
</datetime>
<!-- Available Variables colorbuttons:
{red1} true if red button is button 1
{red2} true if red button is button 2
{red3} true if red button is button 3
{red4} true if red button is button 4
{green1} true if green button is button 1
{green2} true if green button is button 2
{green3} true if green button is button 3
{green4} true if green button is button 4
{yellow1} true if yellow button is button 1
{yellow2} true if yellow button is button 2
{yellow3} true if yellow button is button 3
{yellow4} true if yellow button is button 4
{blue1} true if blue button is button 1
{blue2} true if blue button is button 2
{blue3} true if blue button is button 3
{blue4} true if blue button is button 4
{red} label of red button
{green} label of green button
{yellow} label of yellow button
{blue} label of blue button
-->
<colorbuttons>
<area x="0" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
@ -110,47 +74,8 @@
<drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
</area>
</scrollbar>
<!-- IMPORTANT: menuitemwidth and determinatefont have to be defined here. menuitemwidth defines the total width of the
default menu items, determinatefont the function which sets the actual font to use. With that it is possible to determinate
the correct column widths -->
<menuitems x="0" y="10%" orientation="vertical" width="94%" height="82%" align="center" menuitemwidth="94%" determinatefont="column1" numlistelements="16">
<!-- Available Variables default menu listelement:
{nummenuitem} number of item in list, starts with 1
{column1} text of column1
{column2} text of column2
{column3} text of column3
{column4} text of column4
{column5} text of column5
{column6} text of column6
{column2set} true if column2 is used
{column3set} true if column3 is used
{column4set} true if column4 is used
{column5set} true if column5 is used
{column6set} true if column6 is used
{column2x} proposed x value of column2
{column3x} proposed x value of column3
{column4x} proposed x value of column4
{column5x} proposed x value of column5
{column6x} proposed x value of column6
{column1width} proposed width of column1
{column2width} proposed width of column2
{column3width} proposed width of column3
{column4width} proposed width of column4
{column5width} proposed width of column5
{column6width} proposed width of column6
{columnscroll} number of column which should have scrollable text
{current} true if column is currently selected
{separator} true if column is a list separator
A dynamic token is set to indicate the current menu category or the plugin which is currently running.
With that it is possible to display different default menus with an individual style.
If a setup menu is diplayed, the token
{setup} is set to true
For the commands menu
{commands} is set to true
If a plugin is running, a token called as the name of the plugin is set to true
{pluginname} is set to true
-->
<listelement>
<area x="0" condition="not{separator}" width="100%" layer="2">
<fill condition="not{current}" color="{clrTransparent}" />

View File

@ -21,28 +21,7 @@
<fill color="{clrTransparent}" />
</area>
</datetime>
<!-- Available Variables colorbuttons:
{red1} true if red button is button 1
{red2} true if red button is button 2
{red3} true if red button is button 3
{red4} true if red button is button 4
{green1} true if green button is button 1
{green2} true if green button is button 2
{green3} true if green button is button 3
{green4} true if green button is button 4
{yellow1} true if yellow button is button 1
{yellow2} true if yellow button is button 2
{yellow3} true if yellow button is button 3
{yellow4} true if yellow button is button 4
{blue1} true if blue button is button 1
{blue2} true if blue button is button 2
{blue3} true if blue button is button 3
{blue4} true if blue button is button 4
{red} label of red button
{green} label of green button
{yellow} label of yellow button
{blue} label of blue button
-->
<colorbuttons>
<area x="0" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
@ -85,38 +64,7 @@
<drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
</area>
</colorbuttons>
<!-- Available Variables in detailheader elements:
{title} title of event
{shorttext} shorttext of event
{start} event start time in hh::mm
{stop} event stop time
{day} day of current event
{date} date of current event in dd.mm.yy
{daynumeric} day as number
{month} month as number
{year} year as number
{running} true if event is currently running
{elapsed} elapsed time of event, if not running 0
{duration} duration of event
{durationhours} duration, full hours
{durationminutes} duration, rest of minutes
{vps} vps description string
{channelname} Channelname of event
{channelnumber} Channelnumber of event
{channelid} ChannelID as path to display channel logo
{ismovie} true if event is scraped as a movie
{isseries} true if event is scraped as a series
{posteravailable} true if a poster is available
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{banneravailable} true if a banner is available
{bannerwidth} width of banner
{bannerheight} height of banner
{bannerpath} path of banner
{epgpicavailable} true if a epg picture is available
{epgpicpath} path of epg picture
-->
<detailheader>
<area x="1%" y="0" width="98%" height="20%" layer="3">
<drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="15%" height="80%" valign="center" />
@ -129,10 +77,7 @@
<drawtext name="shorttext" x="{width(logo)} + 20" y="{posy(title)} + {height(title)}" font="{light}" fontsize="25%" color="{clrWhite}" text="{shorttext}" />
</area>
</detailheader>
<!-- Available Variables scrollbar:
{height} height in one-tenth of a percent of total height
{offset} offset from top in one-tenth of a percent of total height
-->
<scrollbar>
<area x="98%" y="20%" width="2%" height="65%" layer="3">
<fill color="{clrWhite}" />
@ -140,137 +85,6 @@
<drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
</area>
</scrollbar>
<!-- Available Variables in tab elements:
{title} title of event
{shorttext} shorttext of event
{description} description of event
{start} event start time in hh::mm
{stop} event stop time
{day} Day of event as three letter abrivation
{date} Date of event
{daynumeric} day as number
{month} month as number
{year} year as number
{running} true if event is currently running
{elapsed} elapsed time of event, if not running 0
{duration} duration of event
{durationhours} duration, full hours
{durationminutes} duration, rest of minutes
{vps} vps description string
{channelid} ChannelID as path to display channel logo
{hasreruns} true if reruns of this event are found
{reruns[]} array with reruns
{reruns[title]} title of rerun
{reruns[shorttext]} shorttext of rerun
{reruns[date]} date of rerun in dd:mm
{reruns[day]} short dayname of rerun
{reruns[start]} start time of rerun in hh:mm
{reruns[stop]} stop time of rerun in hh:mm
{reruns[channelname]} name of channel on which rerun occurs
{reruns[channelnumber]} number of channel on which rerun occurs
{reruns[channelid]} id of channel on which rerun occurs to display channel logo
{reruns[channellogoexists]} true if channel logo exists
{epgpic1avaialble} true if first epg picture is available
{epgpic2avaialble} true if first epg picture is available
{epgpic3avaialble} true if first epg picture is available
{epgpic1path} path of first epg picture
{epgpic2path} path of second epg picture
{epgpic3path} path of third epg picture
{ismovie} true if event is scraped as a movie
Available variables for movies:
{movietitle} movie title from themoviedb
{movieoriginalTitle} movie original title from themoviedb
{movietagline} movie tagline from themoviedb
{movieoverview} movie overview from themoviedb
{movieadult} true if movie is rated as adult
{moviebudget} movie budget from themoviedb in $
{movierevenue} movie revenue from themoviedb in $
{moviegenres} movie genres from themoviedb
{moviehomepage} movie homepage from themoviedb
{moviereleasedate} movie release date from themoviedb
{movieruntime} movie runtime from themoviedb
{moviepopularity} movie popularity from themoviedb
{movievoteaverage} movie vote average from themoviedb
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{fanartwidth} width of scraped fanart
{fanartheight} height of scraped fanart
{fanartpath} absolute path of scraped fanart
{movieiscollection} true if movie is part of a collection
{moviecollectionName} name of movie collection
{collectionposterwidth} width of scraped collection poster
{collectionposterheight} height of scraped collection poster
{collectionposterpath} absolute path of scraped collection poster
{collectionfanartwidth} width of scraped collection fanart
{collectionfanartheight} height of scraped collection fanart
{collectionfanartpath} absolute path of scraped collection fanart
{actors[]} array with movie actors
{actors[name]} real name of actor
{actors[role]} actor role
{actors[thumb]} absolute path of scraped actor thumb
{actors[thumbwidth]} width of scraped actor thumb
{actors[thumbheight]} height of scraped actor thumb
{isseries} true if event is scraped as a series
Available variables for series:
{seriesname} name of series
{seriesoverview} series overview
{seriesfirstaired} first aired date
{seriesnetwork} network which produces series
{seriesgenre} series genre
{seriesrating} series thetvdb rating
{seriesstatus} status of series (running / finished)
{episodetitle} title of episode
{episodenumber} number of episode
{episodeseason} season of episode
{episodefirstaired} first aired date of episode
{episodegueststars} guest stars of episode
{episodeoverview} episode overview
{episoderating} user rating for episode
{episodeimagewidth} episode image width
{episodeimageheight} episode image height
{episodeimagepath} episode image path
{seasonposterwidth} episode season poster width
{seasonposterheight} episode season poster height
{seasonposterpath} episode season poster path
{seriesposter1width} width of 1st poster
{seriesposter1height} height of 1st poster
{seriesposter1path} path of 1st poster
{seriesposter2width} width of 2nd poster
{seriesposter2height} height of 2nd poster
{seriesposter2path} path of 2nd poster
{seriesposter3width} width of 3rd poster
{seriesposter3height} height of 3rd poster
{seriesposter3path} path of 3rd poster
{seriesfanart1width} width of 1st fanart
{seriesfanart1height} height of 1st fanart
{seriesfanart1path} path of 1st fanart
{seriesfanart2width} width of 2nd fanart
{seriesfanart2height} height of 2nd fanart
{seriesfanart2path} path of 2nd fanart
{seriesfanart3width} width of 3rd fanart
{seriesfanart3height} height of 3rd fanart
{seriesfanart3path} path of 3rd fanart
{seriesbanner1width} width of 1st banner
{seriesbanner1height} height of 1st banner
{seriesbanner1path} path of 1st banner
{seriesbanner2width} width of 2nd banner
{seriesbanner2height} height of 2nd banner
{seriesbanner2path} path of 2nd banner
{seriesbanner3width} width of 3rd banner
{seriesbanner3height} height of 3rd banner
{seriesbanner3path} path of 3rd fanart
{actors[]} array with movie actors
{actors[name]} real name of actor
{actors[role]} actor role
{actors[thumb]} absolute path of scraped actor thumb
{actors[thumbwidth]} width of scraped actor thumb
{actors[thumbheight]} height of scraped actor thumb
-->
<!-- a tab is one scrolling area, just position and draw as inside a normal area -->
<!-- TAB EPGINFO -->
<tab name="EPG Info" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
@ -331,11 +145,6 @@
<drawimage condition="{movieiscollection}" name="collectionposter" imagetype="image" path="{collectionposterpath}" align="center" y="{posy(collectionfanart)} + {height(collectionfanart)} + 20" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {collectionposterheight} / {collectionposterwidth}"/>
</tab>
<!-- Available Variables tablabels:
{tabs[]} array with available tab labels
{tabs[title]} title of tab
{tabs[current]} true if tab is displayed currently
-->
<tablabels>
<area x="0" y="85%" width="98%" height="5%" layer="3">
<loop name="tabs" x="0" y="0" orientation="horizontal">
@ -346,4 +155,4 @@
</loop>
</area>
</tablabels>
</menudetailedepg>
</menudetailedepg>

View File

@ -21,28 +21,7 @@
<fill color="{clrTransparent}" />
</area>
</datetime>
<!-- Available Variables colorbuttons:
{red1} true if red button is button 1
{red2} true if red button is button 2
{red3} true if red button is button 3
{red4} true if red button is button 4
{green1} true if green button is button 1
{green2} true if green button is button 2
{green3} true if green button is button 3
{green4} true if green button is button 4
{yellow1} true if yellow button is button 1
{yellow2} true if yellow button is button 2
{yellow3} true if yellow button is button 3
{yellow4} true if yellow button is button 4
{blue1} true if blue button is button 1
{blue2} true if blue button is button 2
{blue3} true if blue button is button 3
{blue4} true if blue button is button 4
{red} label of red button
{green} label of green button
{yellow} label of yellow button
{blue} label of blue button
-->
<colorbuttons>
<area x="0" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
@ -85,34 +64,7 @@
<drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
</area>
</colorbuttons>
<!-- Available Variables in detailheader elements:
{name} full name of recording (including folders)
{epgname} Name of recording (Name from EPG)
{shorttext} shorttext of recording
{date} date of recording in dd.mm.yy
{time} time of current recording in hh:mm
{daynumeric} day as number
{month} month as number
{year} year as number
{duration} real duration of recording in minutes
{durationhours} real duration, full hours
{durationminutes} real duration, rest of minutes
{durationevent} duration of corresponding event in minutes
{durationeventhours} event duration, full hours
{durationeventminutes} event duration, rest of minutes
{ismovie} true if event is scraped as a movie
{isseries} true if event is scraped as a series
{posteravailable} true if a poster is available
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{banneravailable} true if a banner is available
{bannerwidth} width of banner
{bannerheight} height of banner
{bannerpath} path of banner
{recimgavailable} true if a recording image is available in the recording path
{recimgpath} path of rec image
-->
<detailheader>
<area x="1%" y="0" width="98%" height="20%" layer="3">
<drawimage condition="{isseries}++{banneravailable}++not{recimgavailable}" imagetype="image" path="{bannerpath}" x="{areawidth} - {areawidth}/3 - 10" valign="center" width="{areawidth}/3" height="{areawidth}/3 * {bannerheight} / {bannerwidth}"/>
@ -124,10 +76,7 @@
<drawtext name="shorttext" x="20" y="{posy(title)} + {height(title)}" font="{light}" fontsize="25%" color="{clrWhite}" text="{shorttext}" />
</area>
</detailheader>
<!-- Available Variables scrollbar:
{height} height in one-tenth of a percent of total height
{offset} offset from top in one-tenth of a percent of total height
-->
<scrollbar>
<area x="98%" y="20%" width="2%" height="65%" layer="3">
<fill color="{clrWhite}" />
@ -135,132 +84,7 @@
<drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
</area>
</scrollbar>
<!-- Available Variables in tab elements:
{name} full name of recording (including folders)
{epgname} Name of recording (Name from EPG)
{shorttext} shorttext of recording
{description} description of recording
{date} date of recording in dd.mm.yy
{time} time of recording in hh:mm
{daynumeric} day as number
{month} month as number
{year} year as number
{duration} real duration of recording in minutes
{durationhours} real duration, full hours
{durationminutes} real duration, rest of minutes
{durationevent} duration of corresponding event in minutes
{durationeventhours} event duration, full hours
{durationeventminutes} event duration, rest of minutes
{recordingsize} size of recording (automatically in GB / MB)
{recordingsizecutted} size of cutted recording (automatically in GB / MB)
{recordinglength} length of recording (in hh::mm:ss)
{recordinglengthcutted} length of cutted recording (in hh::mm:ss)
{recordingbitrate} bitrate of recording (in MBit/s)
{recordingformat} format of recording (TS / PS)
{searchtimer} name of accordign searchtimer (if available)
{recimg1avaialble} true if first recording image is available
{recimg2avaialble} true if first recording image is available
{recimg3avaialble} true if first recording image is available
{recimg1path} path of first recording image
{recimg2path} path of second recording image
{recimg3path} path of third recording image
{ismovie} true if event is scraped as a movie
Available variables for movies:
{movietitle} movie title from themoviedb
{movieoriginalTitle} movie original title from themoviedb
{movietagline} movie tagline from themoviedb
{movieoverview} movie overview from themoviedb
{movieadult} true if movie is rated as adult
{moviebudget} movie budget from themoviedb in $
{movierevenue} movie revenue from themoviedb in $
{moviegenres} movie genres from themoviedb
{moviehomepage} movie homepage from themoviedb
{moviereleasedate} movie release date from themoviedb
{movieruntime} movie runtime from themoviedb
{moviepopularity} movie popularity from themoviedb
{movievoteaverage} movie vote average from themoviedb
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{fanartwidth} width of scraped fanart
{fanartheight} height of scraped fanart
{fanartpath} absolute path of scraped fanart
{movieiscollection} true if movie is part of a collection
{moviecollectionName} name of movie collection
{collectionposterwidth} width of scraped collection poster
{collectionposterheight} height of scraped collection poster
{collectionposterpath} absolute path of scraped collection poster
{collectionfanartwidth} width of scraped collection fanart
{collectionfanartheight} height of scraped collection fanart
{collectionfanartpath} absolute path of scraped collection fanart
{actors[]} array with movie actors
{actors[name]} real name of actor
{actors[role]} actor role
{actors[thumb]} absolute path of scraped actor thumb
{actors[thumbwidth]} width of scraped actor thumb
{actors[thumbheight]} height of scraped actor thumb
{isseries} true if event is scraped as a series
Available variables for series:
{seriesname} name of series
{seriesoverview} series overview
{seriesfirstaired} first aired date
{seriesnetwork} network which produces series
{seriesgenre} series genre
{seriesrating} series thetvdb rating
{seriesstatus} status of series (running / finished)
{episodetitle} title of episode
{episodenumber} number of episode
{episodeseason} season of episode
{episodefirstaired} first aired date of episode
{episodegueststars} guest stars of episode
{episodeoverview} episode overview
{episoderating} user rating for episode
{episodeimagewidth} episode image width
{episodeimageheight} episode image height
{episodeimagepath} episode image path
{seasonposterwidth} episode season poster width
{seasonposterheight} episode season poster height
{seasonposterpath} episode season poster path
{seriesposter1width} width of 1st poster
{seriesposter1height} height of 1st poster
{seriesposter1path} path of 1st poster
{seriesposter2width} width of 2nd poster
{seriesposter2height} height of 2nd poster
{seriesposter2path} path of 2nd poster
{seriesposter3width} width of 3rd poster
{seriesposter3height} height of 3rd poster
{seriesposter3path} path of 3rd poster
{seriesfanart1width} width of 1st fanart
{seriesfanart1height} height of 1st fanart
{seriesfanart1path} path of 1st fanart
{seriesfanart2width} width of 2nd fanart
{seriesfanart2height} height of 2nd fanart
{seriesfanart2path} path of 2nd fanart
{seriesfanart3width} width of 3rd fanart
{seriesfanart3height} height of 3rd fanart
{seriesfanart3path} path of 3rd fanart
{seriesbanner1width} width of 1st banner
{seriesbanner1height} height of 1st banner
{seriesbanner1path} path of 1st banner
{seriesbanner2width} width of 2nd banner
{seriesbanner2height} height of 2nd banner
{seriesbanner2path} path of 2nd banner
{seriesbanner3width} width of 3rd banner
{seriesbanner3height} height of 3rd banner
{seriesbanner3path} path of 3rd fanart
{actors[]} array with movie actors
{actors[name]} real name of actor
{actors[role]} actor role
{actors[thumb]} absolute path of scraped actor thumb
{actors[thumbwidth]} width of scraped actor thumb
{actors[thumbheight]} height of scraped actor thumb
-->
<!-- a tab is one scrolling area, just position and draw as inside a normal area -->
<tab name="Info" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
<drawtextbox condition="not{isseries}++not{ismovie}" x="0" y="0" width="96%" font="{light}" fontsize="8%" color="{clrWhite}" text="{description}" />
<drawimage condition="{isseries}" name="seriesposter" imagetype="image" path="{seriesposter1path}" x="{areawidth}*0.7" y="0" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seriesposter1height} / {seriesposter1width}"/>
@ -308,11 +132,6 @@
<drawimage condition="{movieiscollection}" name="collectionposter" imagetype="image" path="{collectionposterpath}" align="center" y="{posy(collectionfanart)} + {height(collectionfanart)} + 20" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {collectionposterheight} / {collectionposterwidth}"/>
</tab>
<!-- Available Variables tablabels:
{tabs[]} array with available tab labels
{tabs[title]} title of tab
{tabs[current]} true if tab is displayed currently
-->
<tablabels>
<area x="0" y="85%" width="98%" height="5%" layer="3">
<loop name="tabs" x="0" y="0" orientation="horizontal">

View File

@ -18,28 +18,7 @@
<drawtext align="center" valign="center" font="{light}" fontsize="60%" color="{clrWhite}" text="{time}" />
</area>
</datetime>
<!-- Available Variables colorbuttons:
{red1} true if red button is button 1
{red2} true if red button is button 2
{red3} true if red button is button 3
{red4} true if red button is button 4
{green1} true if green button is button 1
{green2} true if green button is button 2
{green3} true if green button is button 3
{green4} true if green button is button 4
{yellow1} true if yellow button is button 1
{yellow2} true if yellow button is button 2
{yellow3} true if yellow button is button 3
{yellow4} true if yellow button is button 4
{blue1} true if blue button is button 1
{blue2} true if blue button is button 2
{blue3} true if blue button is button 3
{blue4} true if blue button is button 4
{red} label of red button
{green} label of green button
{yellow} label of yellow button
{blue} label of blue button
-->
<colorbuttons>
<area x="0" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
@ -90,10 +69,7 @@
</area>
</scrollbar>
<!-- Available Variables in tab elements:
{text} detailed text
-->
<tab name="text" x="2%" y="10%" width="94%" height="80%" layer="2" scrollheight="{areaheight}/4">
<drawtextbox x="0" y="0" width="96%" font="{light}" fontsize="5%" color="{clrWhite}" text="{text}" />
</tab>
</menudetailedtext>
</menudetailedtext>

View File

@ -1,7 +1,4 @@
<menumain x="0" y="0" width="100%" height="100%" fadetime="0">
<!--
static content of main menu, is only drawn once at main menu startup
-->
<background>
<!-- main menu background -->
<area x="0" y="0" width="71%" height="70%" layer="1">
@ -13,26 +10,13 @@
<drawrectangle x="53%" y="0" width="47%" height="100%" color="{clrTransBlack}" />
</area>
</background>
<!-- Available Variables header:
{title} title of current menu
{vdrversion} running VDR Version
-->
<header>
<area x="0" y="0" width="70%" height="7%" layer="2">
<drawtext x="10" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="{title} {vdrversion}" />
</area>
</header>
<!-- Available Variables datetime:
{time} time in hh:mm
{day} day in digits
{dayleadingzero} day in digits with leading 0
{dayname} Full name of the day
{daynameshort} Short 3 char name of the day
{month} month in digits with leading 0
{monthname} Full name of the month
{monthnameshort} 3 letter abbrivation of month name
{year} year in yyyy
-->
<datetime>
<area x="75%" y="0" width="13%" height="10%" layer="3">
<drawtext align="right" y="0%" font="{light}" fontsize="55%" color="{clrWhite}" text="{dayname}" />
@ -43,28 +27,6 @@
</area>
</datetime>
<!-- Available Variables colorbuttons:
{red1} true if red button is button 1
{red2} true if red button is button 2
{red3} true if red button is button 3
{red4} true if red button is button 4
{green1} true if green button is button 1
{green2} true if green button is button 2
{green3} true if green button is button 3
{green4} true if green button is button 4
{yellow1} true if yellow button is button 1
{yellow2} true if yellow button is button 2
{yellow3} true if yellow button is button 3
{yellow4} true if yellow button is button 4
{blue1} true if blue button is button 1
{blue2} true if blue button is button 2
{blue3} true if blue button is button 3
{blue4} true if blue button is button 4
{red} label of red button
{green} label of green button
{yellow} label of yellow button
{blue} label of blue button
-->
<colorbuttons>
<area x="0" y="63%" width="18%" height="7%" layer="2">
<drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
@ -107,20 +69,7 @@
<drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
</area>
</colorbuttons>
<!-- Available Variables timers:
{numtimers} number of active timers (max. 15 timers will be displayed)
{numtimerconflicts} number of current timer conflicts
{timers[]} array with active timers (local and remote if remotetimers plugin is in use)
{timers[title]} title of timer
{timers[datetime]} date and time of timer
{timers[recording]} true if timer is recording currently
{timers[channelname]} name of channel for which timer is created
{timers[channelnumber]} number of channel
{timers[channelid]} ChannelID of channel
{timers[channellogoexists]} true if channel logo exists
{timers[isremotetimer]} true if timer is a remote timer from remotetimers plugin
-->
<timers detached="true" delay="100" shifttime="{shifttimetimers}" startx="0" starty="100%">
<area x="0" y="75%" width="{areawidth}/8 - 5" height="25%" layer="1">
<fill color="{clrTransBlack}" />
@ -167,14 +116,6 @@
</area>
</timers>
<!-- Available Variables discusage:
{freetime} available disc capacity in hh:mm
{freepercent} available disc capacity in percent
{usedpercent} used disc capacity in percent
{freegb} available disc capacity in gigabytes
{discalert} true if disc usage is > 95%
{vdrusagestring} localized VDR internal usage string
-->
<discusage detached="true" delay="100" fadetime="0">
<area background="true" x="75%" y="26%" width="25%" height="10%" layer="1">
<fill condition="not{discalert}" color="{clrTransBlack}"/>
@ -187,26 +128,6 @@
</area>
</discusage>
<!-- Available Variables currentweather:
{timestamp} timestamp of forecast in dd.mm hh:mm
{temperature} current temperature in °C
{apparenttemperature} apparent (feeled) temperature
{mintemperature} minimum daily temperature in °C
{maxtemperature} maximum daily temperature in °C
{summary} short weather summary
{icon} weather icon
{precipitationintensity} precipitation intensity in l/m2
{precipitationprobability} precipitation probability in %
{precipitationtype} precipitation type
{humidity} humidity in %
{windspeed} windspeed in km/h
{windbearing} wind bearing in °
{windbearingstring} wind bearing (N, NE, ...)
{visibility} visibility in km
{cloudcover} cloud cover in %
{pressure} pressure in HPo
{ozone} ozone value in DU
-->
<currentweather detached="true" delay="100" fadetime="0">
<area x="75%" y="13%" width="25%" height="10%" layer="2">
<drawrectangle x="0" y="0" width="53%" height="100%" color="{clrTransBlueLight}" />
@ -224,23 +145,6 @@
</area>
</currentweather>
<!-- Available Variables devices:
{numdevices} number of available devices
{devices[]} array with available devices
{devices[num]} number of current device
{devices[type]} type of device (DVB-S, DVB-C, ...)
{devices[istuned]} true if device is currently tuned to a transponder
{devices[livetv]} true if device is currently playing livetv
{devices[recording]} true if device is currently recording
{devices[hascam]} true if device has a CAM
{devices[cam]} number of CAM
{devices[signalstrength]} signalstrength of devcie
{devices[signalquality]} signalstrength of devcie
{devices[channelnumber]} number of the currently tuned channel
{devices[channelname]} name of the currently tuned channel
{devices[channelid]} ID of the currently tuned channel
{devices[source]} source of the currently tuned channel
-->
<devices condition="{showdevices}" detached="true" delay="100" fadetime="0">
<area background="true" x="75%" y="48%" width="25%" height="{areaheight}/12 * {numdevices}" layer="1">
<fill color="{clrTransBlack}"/>
@ -259,9 +163,6 @@
</area>
</devices>
<!-- Available Variables systemload:
{load} current system load
-->
<systemload detached="true" delay="100" fadetime="0">
<area background="true" x="75%" y="40%" width="25%" height="5%" layer="1">
<fill color="{clrTransBlack}"/>
@ -271,23 +172,10 @@
</area>
</systemload>
<!-- Available Variables customtokens:
all custom tokens set by the svdrp command SCTK are available in this viewelement
For instance, use an appropriate script which runs periodically as cronjob and
sets these custom tokens with svdrpsend or dbus2vdr
-->
<customtokens>
</customtokens>
<menuitems x="0" y="7%" orientation="vertical" width="70%" height="56%" align="center" numlistelements="8">
<!-- Available Variables main menu listelement:
{nummenuitem} number of item in list, starts with 1
{label} label of menu item
{number} number of menu item (or empty string if not set)
{icon} path of appropriate icon
{current} true if item is currently selected
{separator} true if item is a list separator
-->
<menuitems condition="strequal({mainmenuorientation}, 'vertical')" x="0" y="7%" orientation="vertical" width="70%" height="56%" align="center" numlistelements="8">
<listelement>
<area x="0" width="60%" layer="2">
<fill condition="not{current}" color="{clrTransparent}" />
@ -297,12 +185,6 @@
<drawtext name="menutext" x="20" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{number} {label}" />
</areascroll>
</listelement>
<!-- additional element which is drawn for current element -->
<!-- Available Variables main menu currentelement:
{label} label of menu item
{number} number of menu item (or empty string if not set)
{icon} path of appropriate icon
-->
<currentelement delay="50" fadetime="0">
<area x="61%" y="22%" width="36%" height="52%" layer="2">
<fill color="{clrTransBlueLight}" />
@ -312,8 +194,30 @@
</area>
</currentelement>
</menuitems>
<scrollbar>
<menuitems condition="strequal({mainmenuorientation}, 'horizontal')" x="0" y="7%" orientation="horizontal" width="70%" height="56%" align="center" numlistelements="1">
<listelement>
<area y="10%" height="80%" layer="2">
<drawrectangle condition="{current}" x="20%" y="0" width="60%" height="100%" color="{clrTransBlueLight}" />
</area>
<area y="10%" height="80%" layer="3">
<drawimage condition="{current}" imagetype="menuicon" path="{icon}" align="center" y="10%" width="{areaheight}*0.6" height="{areaheight}*0.6"/>
</area>
<areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" y="70%" height="20%" layer="4">
<drawtext name="menutext" align="center" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{label}" />
</areascroll>
</listelement>
</menuitems>
<scrollbar condition="strequal({mainmenuorientation}, 'horizontal')">
<area condition="{hasprev}" x="0" y="7%" width="14%" height="56%" layer="2">
<drawimage imagetype="icon" path="ico_arrow_left" align="center" valign="center" width="{areawidth}*0.8" height="{areawidth}*0.8"/>
</area>
<area condition="{hasnext}" x="56%" y="7%" width="14%" height="56%" layer="2">
<drawimage imagetype="icon" path="ico_arrow_right" align="center" valign="center" width="{areawidth}*0.8" height="{areawidth}*0.8"/>
</area>
</scrollbar>
<scrollbar condition="strequal({mainmenuorientation}, 'vertical')">
<area x="68%" y="7%" width="2%" height="56%" layer="2">
<fill color="{clrWhite}" />
<drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />

View File

@ -1,39 +1,49 @@
<menurecordings x="0" y="0" width="100%" height="100%" fadetime="0">
<menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="16">
<!-- Available Variables recordings menu listelement:
{nummenuitem} number of item in list, starts with 1
{name} Name of recording
{epgname} Name of recording (Name from EPG)
{shorttext} Short Text of recording
{description} Descrption of recording
{date} Date of recording (day dd.mm.yyyy)
{time} Time of recording
{daynumeric} day as number
{month} month as number
{year} year as number
{duration} real duration of recording in minutes
{durationhours} real duration, full hours
{durationminutes} real duration, rest of minutes
{durationevent} duration of corresponding event in minutes
{durationeventhours} event duration, full hours
{durationeventminutes} event duration, rest of minutes
{current} true if item is currently selected
{new} true if recording is new
{percentseen} percent already watched, -1 for VDR < 2.1.8
{watched} true if percentseen > 85% including MarginStop of not cutted recording
{cutted} true if recording is cutted
{folder} true if item is a folder
{numrecordingsfolder} if item is a folder, number of recordings in this folder
{newrecordingsfolder} if item is a folder, number of new recordings in this folder
{hasposterthumbnail} true if a scraped poster thumbnail is available for recording
{thumbnailbwidth} width of scraped poster thumbnail
{thumbnailheight} height of scraped poster thumbnail
{thumbnailpath} absolute path of scraped poster thumbnail
{hasposter} true if a scraped poster is available for recording
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
-->
<background condition="strequal({recmenuorientation}, 'horizontal')">
<!-- horizontal menu -->
<area x="0" y="0" width="100%" height="10%" layer="1">
<fill color="{clrTransBlack}" />
</area>
<area x="0" y="60%" width="100%" height="40%" layer="1">
<fill color="{clrTransBlack}" />
</area>
<area x="5%" y="10%" width="90%" height="50%" layer="1">
<fill color="{clrTransBlueLight}" />
</area>
</background>
<header condition="strequal({recmenuorientation}, 'horizontal')">
<!-- horizontal menu -->
<area x="0" y="0" width="70%" height="10%" layer="2">
<drawtext condition="not{hasicon}" x="5" width="{areawidth}-10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
<drawimage condition="{hasicon}" name="menuicon" imagetype="menuicon" path="{icon}" x="5" valign="center" width="{areaheight}*8/10" height="80%"/>
<drawtext condition="{hasicon}" x="{areaheight}" valign="center" width="{areawidth}-{areaheight}-10" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
</area>
</header>
<datetime condition="strequal({recmenuorientation}, 'horizontal')">
<!-- horizontal menu -->
<area x="70%" y="0" width="15%" height="10%" layer="2">
<drawtext align="right" y="5%" font="{light}" fontsize="50%" color="{clrWhite}" text="{dayname}" />
<drawtext align="right" y="45%" font="{light}" fontsize="50%" color="{clrWhite}" text="{day}. {monthnameshort}" />
</area>
<area x="85%" y="0" width="15%" height="10%" layer="2">
<drawtext align="center" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{time}" />
</area>
</datetime>
<sortmode condition="strequal({recmenuorientation}, 'horizontal')">
<!-- horizontal menu -->
<area x="60%" y="2%" width="6%" height="6%" layer="4">
<drawimage condition="{sortnumber}" imagetype="icon" path="ico_sort_number" x="0" y="0" width="100%" height="100%"/>
<drawimage condition="{sortname}" imagetype="icon" path="ico_sort_name" x="0" y="0" width="100%" height="100%"/>
<drawimage condition="{sorttime}" imagetype="icon" path="ico_sort_time" x="0" y="0" width="100%" height="100%"/>
<drawimage condition="{sortprovider}" imagetype="icon" path="ico_sort_provider" x="0" y="0" width="100%" height="100%"/>
</area>
</sortmode>
<menuitems condition="strequal({recmenuorientation}, 'vertical')" x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="16">
<listelement>
<!-- Background -->
<area x="1%" width="58%" layer="2">
@ -55,33 +65,6 @@
<drawimage condition="not{new}++{cutted}" imagetype="icon" path="ico_cutted" x="{areawidth} - {areaheight}" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
</area>
</listelement>
<!-- additional element which is drawn for current element -->
<!-- Available Variables channels menu currentelement:
{name} Real Name of recording (Name of Recording Folder)
{epgname} Name of recording (Name from EPG)
{shorttext} Short Text of recording
{description} Descrption of recording
{date} Date of recording
{time} Time of recording
{daynumeric} day as number
{month} month as number
{year} year as number
{duration} real duration of recording in minutes
{durationhours} real duration, full hours
{durationminutes} real duration, rest of minutes
{durationevent} duration of corresponding event in minutes
{durationeventhours} event duration, full hours
{durationeventminutes} event duration, rest of minutes
{new} true if recording is new
{cutted} true if recording is cutted
{folder} true if item is a folder
{numrecordingsfolder} if item is a folder, number of recordings in this folder
{newrecordingsfolder} if item is a folder, number of new recordings in this folder
{hasposter} true if a scraped poster is available for recording
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
-->
<currentelement delay="500" fadetime="0">
<area x="63%" y="0" width="36%" height="100%" layer="2">
<!-- header -->
@ -96,15 +79,104 @@
</area>
</currentelement>
</menuitems>
<!-- Available Variables colorbuttons:
{height} height in one-tenth of a percent of total height
{offset} offset from top in one-tenth of a percent of total height
-->
<scrollbar>
<menuitems condition="strequal({recmenuorientation}, 'horizontal')" x="0" y="10%" orientation="horizontal" width="100%" height="82%" align="center" numlistelements="10">
<listelement>
<!-- Background -->
<area y="64%" height="36%" layer="2">
<fill condition="not{current}" color="{clrTransparent}" />
<fill condition="{current}" color="{clrTransBlueLight}" />
<fill condition="{separator}" color="{clrSemiTransBlack}" />
</area>
<!-- recording folder -->
<area condition="{folder}" y="64%" height="36%" layer="3">
<drawimage name="foldericon" imagetype="icon" path="ico_recfolder" align="center" y="0" width="0.6*{areaheight} * 92 / 136" height="0.6*{areaheight}" />
<drawtextbox align="center" valign="center" maxlines="3" x="1%" y="63%" width="98%" height="37%" font="{light}" fontsize="12%" color="{clrWhite}" text="{name} ({numrecordingsfolder}, {newrecordingsfolder} new)" />
</area>
<!-- recording item -->
<area condition="not{folder}" y="64%" height="36%" layer="3">
<drawimage condition="{hasposterthumbnail}" imagetype="image" path="{thumbnailpath}" align="center" y="8" width="{areaheight}*0.6 * {thumbnailbwidth} / {thumbnailheight}" height="{areaheight}*0.6"/>
<drawimage condition="not{hasposterthumbnail}" imagetype="icon" path="ico_recording" align="center" y="8" width="{areaheight}*0.5 * {thumbnailbwidth} / {thumbnailheight}" height="{areaheight}*0.6"/>
<drawtextbox align="center" valign="center" maxlines="3" x="1%" y="63%" width="98%" height="37%" font="{light}" fontsize="12%" color="{clrWhite}" text="{name}" />
</area>
</listelement>
<currentelement delay="500" fadetime="0">
<area x="5%" y="0" width="90%" height="61%" layer="2">
<!-- scraper poster -->
<drawimage condition="{hasposter}" name="poster" imagetype="image" path="{posterpath}" x="1%" y="2%" width="{areaheight}*0.96 * {posterwidth} / {posterheight}" height="96%"/>
<!-- header -->
<drawtext condition="{hasposter}" name="title" x="{width(poster)} + 0.04*{areawidth}" y="0" font="{semibold}" fontsize="10%" color="{clrWhite}" text="{epgname}" />
<drawtext condition="{hasposter}" name="shorttext" x="{width(poster)} + 0.04*{areawidth}" y="{height(title)}" width="0.96*{areawidth} - {width(poster)}" font="{semibold}" fontsize="8%" color="{clrWhite}" text="{shorttext}" />
<drawtext condition="{hasposter}" name="datetime" x="{width(poster)} + 0.04*{areawidth}" y="{posy(shorttext)} + {height(shorttext)}" font="{light}" fontsize="7%" color="{clrWhite}" text="{date} {time}, {duration} min" />
<drawtext condition="not{hasposter}" name="title" x="2%" y="0" font="{semibold}" fontsize="10%" color="{clrWhite}" text="{epgname}" />
<drawtext condition="not{hasposter}" name="shorttext" x="2%" y="{height(title)}" width="98%" font="{semibold}" fontsize="8%" color="{clrWhite}" text="{shorttext}" />
<drawtext condition="not{hasposter}" name="datetime" x="2%" y="{posy(shorttext)} + {height(shorttext)}" font="{light}" fontsize="7%" color="{clrWhite}" text="{date} {time}, {duration} min" />
<!-- description -->
<drawtextbox condition="{hasposter}" x="{width(poster)} + 0.04*{areawidth}" y="{posy(datetime)} + {height(datetime)} + 10" width="{areawidth}*0.94 - {width(poster)}" height="{areaheight}*0.92 - {posy(datetime)}" font="{light}" fontsize="7%" color="{clrWhite}" text="{description}" />
<drawtextbox condition="not{hasposter}" x="2%" y="{posy(datetime)} + {height(datetime)} + 10" width="{areawidth}*0.98" height="{areaheight}*0.92 - {posy(datetime)}" font="{light}" fontsize="7%" color="{clrWhite}" text="{description}" />
</area>
</currentelement>
</menuitems>
<scrollbar condition="strequal({recmenuorientation}, 'vertical')">
<area x="60%" y="10%" width="2%" height="82%" layer="3">
<fill color="{clrWhite}" />
<drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
<drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
</area>
</scrollbar>
</menurecordings>
<scrollbar condition="strequal({recmenuorientation}, 'horizontal')">
<area x="0" y="{areaheight}*0.6" width="100%" height="{areaheight}*0.025" layer="3">
<fill color="{clrWhite}" />
<drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
<drawrectangle x="4 + {areawidth} * {offset} / 1000" y="4" width="{areawidth} * {height} / 1000 - 8" height="{areaheight} - 8" color="{clrWhite}" />
</area>
</scrollbar>
<colorbuttons condition="strequal({recmenuorientation}, 'horizontal')">
<!-- horizontal menu -->
<area x="0" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
<drawrectangle condition="{red1}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
<drawtext condition="{green1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
<drawrectangle condition="{green1}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
<drawtext condition="{yellow1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
<drawrectangle condition="{yellow1}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
<drawtext condition="{blue1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
<drawrectangle condition="{blue1}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
</area>
<area x="25%" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
<drawrectangle condition="{red2}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
<drawtext condition="{green2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
<drawrectangle condition="{green2}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
<drawtext condition="{yellow2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
<drawrectangle condition="{yellow2}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
<drawtext condition="{blue2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
<drawrectangle condition="{blue2}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
</area>
<area x="50%" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
<drawrectangle condition="{red3}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
<drawtext condition="{green3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
<drawrectangle condition="{green3}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
<drawtext condition="{yellow3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
<drawrectangle condition="{yellow3}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
<drawtext condition="{blue3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
<drawrectangle condition="{blue3}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
</area>
<area x="75%" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
<drawrectangle condition="{red4}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
<drawtext condition="{green4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
<drawrectangle condition="{green4}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
<drawtext condition="{yellow4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
<drawrectangle condition="{yellow4}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
<drawtext condition="{blue4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
<drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
</area>
</colorbuttons>
</menurecordings>

View File

@ -1,18 +1,4 @@
<menuschedules x="0" y="0" width="100%" height="100%" fadetime="0">
<!-- Available Variables header:
{title} title of current menu
{vdrversion} running VDR Version
{hasicon} true if a menu icon is available
{icon} path of menu icon
{channelnumber} Number of Channel of current event
{channelname} Name of current Channel of current event
{channellogoexists} true if a channel logo exists
{channelid} ChannelID as path to display channel logo
{whatson} true if menu "What's on" is displayed
{whatsonnow} true if menu "What's on now" is displayed
{whatsonnext} true if menu "What's on next" is displayed
{whatsonfavorites} true if EPGSearch Favorites menu is displayed
-->
<header>
<area x="0" y="0" width="38%" height="10%" layer="2">
<drawimage condition="{whatsonnow}||{whatsonnext}||{whatsonfavorites}" name="menuicon" imagetype="menuicon" path="{icon}" x="5" valign="center" width="{areaheight}*8/10" height="80%"/>
@ -23,36 +9,6 @@
</header>
<menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="16">
<!-- Available Variables schedules menu listelement:
{nummenuitem} number of item in list, starts with 1
{title} title of event
{shorttext} shorttext of event
{start} event start time in hh::mm
{stop} event stop time
{day} day of current event as three letter abrivation
{date} date of current event in dd.mm.yy
{daynumeric} day as number
{month} month as number
{year} year as number
{running} true if event is currently running
{elapsed} elapsed time of event, if not running 0
{duration} duration of event
{durationhours} duration, full hours
{durationminutes} duration, rest of minutes
{current} true if item is currently selected
{separator} true if item is a list separator
{channelname} Channel Name
{channelnumber} Channel Number
{channelid} ChannelID as path to display channel logo
{channellogoexists} true if a channel logo exists
{whatson} true if menu "What's on" is displayed
{whatsonnow} true if menu "What's on now" is displayed
{whatsonnext} true if menu "What's on next" is displayed
{whatsonfavorites} true if EPGSearch Favorites menu is displayed
{timerpartitial} true if partitial timer is set for the event
{timerfull} true if full timer is set for the event
{hasVPS} true if event has VPS information
-->
<listelement>
<!-- Background -->
<area x="1%" width="58%" layer="2">
@ -132,42 +88,6 @@
<drawtext x="20" valign="center" font="{light}" fontsize="95%" color="{clrBlueLight}" text="{title}" />
</area>
</listelement>
<!-- additional element which is drawn for current element -->
<!-- Available Variables schedules menu currentelement:
{title} title of event
{shorttext} shorttext of event
{description} detailed description of event
{start} event start time in hh::mm
{stop} event stop time
{day} day of current event
{date} date of current event in dd.mm.yy
{daynumeric} day as number
{month} month as number
{year} year as number
{running} true if event is currently running
{elapsed} elapsed time of event, if not running 0
{duration} duration of event
{durationhours} duration, full hours
{durationminutes} duration, rest of minutes
{channelname} Channel Name
{channelnumber} Channel Number
{channelid} ChannelID as path to display channel logo
{channellogoexists} true if a channel logo exists
{hasposter} true if a scraped poster is available for this element
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{timerpartitial} true if partitial timer is set for the event
{timerfull} true if full timer is set for the event
{whatson} true if menu "What's on" is displayed
{whatsonnow} true if menu "What's on now" is displayed
{whatsonnext} true if menu "What's on next" is displayed
{schedule[]} array with next 10 schedules, only for whatsonnow and whatsonnext
{schedule[title]} title of event
{schedule[shorttext]} shorttext of event
{schedule[start]} start time of event in hh:mm
{schedule[stop]} stop time of event in hh:mm
-->
<currentelement delay="500" fadetime="0">
<area condition="{whatson}" x="63%" y="0" width="36%" height="100%" layer="2">
<!-- title -->
@ -211,10 +131,7 @@
</areacontainer>
</currentelement>
</menuitems>
<!-- Available Variables scrollbar:
{height} height in one-tenth of a percent of total height
{offset} offset from top in one-tenth of a percent of total height
-->
<scrollbar>
<area x="60%" y="10%" width="2%" height="82%" layer="3">
<fill color="{clrWhite}" />
@ -222,4 +139,4 @@
<drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
</area>
</scrollbar>
</menuschedules>
</menuschedules>

View File

@ -1,7 +1,4 @@
<menusetup x="0" y="0" width="100%" height="100%" fadetime="0">
<!--
static content of main menu, is only drawn once at main menu startup
-->
<background>
<area x="0" y="0" width="100%" height="100%" layer="1">
<fill color="{clrTransBlack}" />
@ -10,27 +7,14 @@
<drawrectangle x="0" y="0" width="52%" height="100%" color="{clrTransBlueLight}" />
</area>
</background>
<!-- Available Variables header:
{title} title of current menu
{vdrversion} running VDR Version
{icon} icon path
-->
<header>
<area x="0" y="0" width="70%" height="7%" layer="2">
<drawimage name="menuicon" imagetype="menuicon" path="{icon}" x="5" valign="center" width="{areaheight}*8/10" height="80%"/>
<drawtext x="{areaheight}" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
</area>
</header>
<!-- Available Variables datetime:
{time} time in hh:mm
{day} day in digits
{dayleadingzero} day in digits with leading 0
{dayname} Full name of the day
{daynameshort} Short 3 char name of the day
{month} month in digits with leading 0
{monthname} Full name of the month
{year} year in yyyy
-->
<datetime>
<area x="84%" y="0" width="8%" height="7%" layer="3">
<drawtext align="right" y="0%" font="{light}" fontsize="55%" color="{clrWhite}" text="{dayname}" />
@ -41,12 +25,6 @@
</area>
</datetime>
<!-- Available Variables colorbuttons:
{red} label of red button
{green} label of green button
{yellow} label of yellow button
{blue} label of blue button
-->
<colorbuttons>
<area x="0" y="93%" width="25%" height="7%" layer="2">
<drawtext x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
@ -67,14 +45,6 @@
</colorbuttons>
<menuitems x="0" y="7%" orientation="vertical" width="98%" height="86%" align="center" numlistelements="10">
<!-- Available Variables setup menu listelement:
{nummenuitem} number of item in list, starts with 1
{label} label of menu item
{number} number of menu item (or empty string if not set)
{icon} path of appropriate icon
{current} true if item is currently selected
{separator} true if item is a list separator
-->
<listelement>
<area x="0" width="60%" layer="2">
<fill condition="not{current}" color="{clrTransparent}" />
@ -84,12 +54,6 @@
<drawtext name="menutext" x="20" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{number} {label}" />
</areascroll>
</listelement>
<!-- additional element which is drawn for current element -->
<!-- Available Variables main menu currentelement:
{label} label of menu item
{number} number of menu item (or empty string if not set)
{icon} path of appropriate icon
-->
<currentelement delay="50" fadetime="0">
<area x="61%" y="30%" width="37%" height="36%" layer="2">
<fill color="{clrTransBlueLight}" />

View File

@ -1,28 +1,5 @@
<menutimers x="0" y="0" width="100%" height="100%" fadetime="0">
<menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="16">
<!-- Available Variables channels menu listelement:
{nummenuitem} number of item in list, starts with 1
{title} Title of Timer
{timerstart} Start Time of Timer in hh::mm
{timerstop} End Time of Timer in hh::mm
{day} Day (numerical)
{dayname} Day, for repeating timers days where timer is active
{month} Month (two digits)
{monthname} Month, three letter abbrevation
{year} Year (4 digits)
{channelname} Name of channel which is set for the timer
{channelid} ID of channel which is set for the timer (for dispalying channel logo)
{channelnumber} Number of channel which is set for the timer
{eventtitle} Title of corresponding event
{eventstart} Start Time of corresponding event in hh::mm
{eventstop} Stop Time of corresponding event in hh::mm
{current} true if item is currently selected
{flagactive} true if timer is active
{flaginstant} true if timer is an instant timer
{flagvps} true if timer uses VPS
{flagrecording} true if is recording currently
{flagpending} true if timer is pending
-->
<listelement>
<!-- Background -->
<area x="1%" width="58%" layer="2">
@ -38,34 +15,6 @@
<drawtext name="timertext" x="10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{dayname} {day}. {timerstart} - {timerstop}: {title}" />
</areascroll>
</listelement>
<!-- additional element which is drawn for current element -->
<!-- Available Variables channels menu currentelement:
{title} Title of Timer
{timerstart} Start Time of Timer in hh::mm
{timerstop} End Time of Timer in hh::mm
{day} Day (numerical)
{dayname} Day, for repeating timers days where timer is active
{month} Month (two digits)
{monthname} Month, three letter abbrevation
{year} Year (4 digits)
{channelname} Name of channel which is set for the timer
{channelid} ID of channel which is set for the timer (for dispalying channel logo)
{channelnumber} Number of channel which is set for the timer
{eventtitle} Title of corresponding event
{eventstart} Start Time of corresponding event in hh::mm
{eventstop} Stop Time of corresponding event in hh::mm
{eventshorttext} Short Text corresponding event
{eventdescription} Description corresponding event
{hasposter} true if a scraped poster is available for event
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{flagactive} true if timer is active
{flaginstant} true if timer is an instant timer
{flagvps} true if timer uses VPS
{flagrecording} true if is recording currently
{flagpending} true if timer is pending
-->
<currentelement delay="500" fadetime="0">
<area x="63%" y="0" width="36%" height="15%" layer="2">
<drawimage name="logo" imagetype="channellogo" path="{channelid}" x="10" y="0" width="30%" height="100%" />
@ -83,10 +32,7 @@
</area>
</currentelement>
</menuitems>
<!-- Available Variables colorbuttons:
{height} height in one-tenth of a percent of total height
{offset} offset from top in one-tenth of a percent of total height
-->
<scrollbar>
<area x="60%" y="10%" width="2%" height="82%" layer="3">
<fill color="{clrWhite}" />
@ -94,4 +40,4 @@
<drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
</area>
</scrollbar>
</menutimers>
</menutimers>

View File

@ -8,13 +8,6 @@
</area>
</background>
<!-- Available Variables message:
{text} message text
{status} true if message is a status message
{info} true if message is a info message
{warning} true if message is a warn message
{error} true if message is a error message
-->
<message>
<area x="0" y="0" width="100%" height="100%" layer="2">
<drawrectangle condition="{status}" x="20" y="0" width="20" height="100%" color="{clrGreen}" />

View File

@ -21,17 +21,6 @@
</area>
</backgroundmodeonly>
<!-- Available Variables datetime:
{time} time in hh:mm
{day} day in digits
{dayleadingzero} day in digits with leading 0
{dayname} Full name of the day
{daynameshort} Short 3 char name of the day
{month} month in digits with leading 0
{monthname} Full name of the month
{monthnameshort} 3 letter abbrivation of month name
{year} year in yyyy
-->
<datetime>
<area x="70%" y="0" width="13%" height="13%" layer="2">
<drawtext align="right" y="0" font="{light}" fontsize="50%" color="{clrWhite}" text="{dayname}" />
@ -42,22 +31,6 @@
</area>
</datetime>
<!-- Available Variables scrapercontent:
{posterpath} Full Path of Poster to use in image path attribute
{posterwidth} width of poster in pixel
{posterheight} height of poster in pixel
{hasPoster} true if poster is available
{bannerpath} Full Path of banner to use in image path attribute
{bannerwidth} width of banner in pixel
{bannerheight} height of banner in pixel
{hasBanner} true if banner is available
Use this tokens if you want to display a banner for series and a poster for movies:
{mediapath} Full Path of Poster or Banner to use in image path attribute
{mediawidth} width of image in pixel
{mediaheight} height of image in pixel
{isbanner} true if image is a banner, false if it is a poster
-->
<scrapercontent>
<area condition="{isbanner}" x="0" y="0" width="{areaheight}*0.13*{mediawidth}/{mediaheight}" height="13%" layer="2">
<drawimage imagetype="image" path="{mediapath}" align="center" valign="center" width="{areawidth}" height="{areaheight}"/>
@ -67,12 +40,6 @@
</area>
</scrapercontent>
<!-- Available Variables rectitle:
{rectitle} Title of Recording
{recsubtitle} Subtitle of the Recording
{recdate} Date Recording in dd.mm.yy
{rectime} Time of Recording in hh:mm
-->
<rectitle>
<area x="1%" y="80%" width="69%" height="8%" layer="2">
<drawtext x="0" name="title" valign="center" width="{areawidth}" font="{semibold}" fontsize="85%" color="{clrBlueLight}" text="{rectitle}" />
@ -80,14 +47,6 @@
</area>
</rectitle>
<!-- Available Variables recinfo:
{screenwidth} width of currently displayed recording in px
{screenheight} height of currently displayed recording in px
{resolution} resolution: hd1080i, hd720p, sd576i
{aspect} screen aspect, each 4:3, 16:9 or 21:9
{isHD} true for hd1080i and hd720p
{isWideScreen} true if aspect is 16:9 or 21:9
-->
<recinfo>
<area x="70%" y="80%" width="29%" height="8%" layer="2">
<!-- widescreen icon -->
@ -101,20 +60,12 @@
</area>
</recinfo>
<!-- Available Variables currenttime:
{reccurrent} Current Time in hh:mm:ss
-->
<currenttime>
<area x="1%" y="92%" width="30%" height="7%" layer="2">
<drawtext x="0" valign="center" font="{light}" fontsize="100%" color="{clrTransBlueLight}" text="{reccurrent}" />
</area>
</currenttime>
<!-- Available Variables totaltime:
{rectotal} Total Time in hh:mm:ss
{timeshift} true if a timeshifted recording is displayed
{timeshifttotal} Total Time of timeshift event in hh:mm
-->
<totaltime>
<area x="69%" y="92%" width="30%" height="7%" layer="2">
<drawtext condition="not{timeshift}" align="right" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="{rectotal}" />
@ -122,20 +73,12 @@
</area>
</totaltime>
<!-- Available Variables endtime:
{recend} End Time in hh:mm
-->
<endtime>
<area x="63%" y="92%" width="20%" height="7%" layer="2">
<drawtext align="center" valign="bottom" font="{light}" fontsize="60%" color="{clrWhite}" text="{tr(endsat)}: {recend}" />
</area>
</endtime>
<!-- Available Variables progressbar:
{current} current frame of recording
{total} total frames of recording
{timeshift} true if a timeshifted recording is displayed
{timeshifttotal} total number of frames of timeshift event
-->
<progressbar>
<area condition="not{timeshift}" x="5%" y="89%" width="90%" height="3%" layer="2">
<fill color="{clrDarkGray}" />
@ -148,16 +91,6 @@
</area>
</progressbar>
<!-- Available Variables cutmarks:
{timeshift} true if a timeshifted recording is displayed
{marks[]} array of available marks
{marks[position]} frame of current mark
{marks[endposition]} frame where startmark ends
{marks[total]} total number of frames
{marks[timeshifttotal]} total number of frames of timeshift event
{marks[active]} true if current replay position hits exactly the mark
{marks[startmark]} true if mark is start mark
-->
<cutmarks>
<area condition="not{timeshift}" x="5%" y="89%" width="90%" height="3%" layer="3">
<loop name="marks" x="0" y="0" orientation="absolute">
@ -197,18 +130,6 @@
</area>
</cutmarks>
<!-- Available Variables controlicons and controliconsmodeonly:
{play} true if recording is played currently
{pause} true if recording is paused
{forward} true if fast forwarding
{forward1x} true if fast forwarding 1x (with 3 trickspeeds)
{forward2x} true if fast forwarding 2x (with 3 trickspeeds)
{forward3x} true if fast forwarding 3x (with 3 trickspeeds)
{rewind} true if rewinding
{rewind1x} true if rewinding 1x (with 3 trickspeeds)
{rewind2x} true if rewinding 2x (with 3 trickspeeds)
{rewind3x} true if rewinding 3x (with 3 trickspeeds)
-->
<controlicons>
<area x="30%" y="93%" width="40%" height="7%" layer="3">
<drawimage condition="not{rewind} ++ not{rewind1x} ++ not{rewind2x} ++ not{rewind3x}" imagetype="icon" path="ico_rew_off" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
@ -253,9 +174,6 @@
</area>
</controliconsmodeonly>
<!-- Available Variables jump:
{jump} time to jump to in hh:mm
-->
<jump>
<area x="35%" y="45%" width="30%" height="10%" layer="1">
<fill color="{clrTransBlack}" />
@ -265,114 +183,6 @@
</area>
</jump>
<!-- Available Variables onpause and onpausemodeonly:
{name} title of recording
{shorttext} shorttext of recording
{description} description of recording
{date} date of recording in dd.mm.yy
{time} time of recording in hh:mm
{daynumeric} day as number
{month} month as number
{year} year as number
{duration} real duration of recording in minutes
{durationhours} real duration, full hours
{durationminutes} real duration, rest of minutes
{durationevent} duration of corresponding event in minutes
{durationeventhours} event duration, full hours
{durationeventminutes} event duration, rest of minutes
{ismovie} true if event is scraped as a movie
Available variables for movies:
{movietitle} movie title from themoviedb
{movieoriginalTitle} movie original title from themoviedb
{movietagline} movie tagline from themoviedb
{movieoverview} movie overview from themoviedb
{movieadult} true if movie is rated as adult
{moviebudget} movie budget from themoviedb in $
{movierevenue} movie revenue from themoviedb in $
{moviegenres} movie genres from themoviedb
{moviehomepage} movie homepage from themoviedb
{moviereleasedate} movie release date from themoviedb
{movieruntime} movie runtime from themoviedb
{moviepopularity} movie popularity from themoviedb
{movievoteaverage} movie vote average from themoviedb
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{fanartwidth} width of scraped fanart
{fanartheight} height of scraped fanart
{fanartpath} absolute path of scraped fanart
{movieiscollection} true if movie is part of a collection
{moviecollectionName} name of movie collection
{collectionposterwidth} width of scraped collection poster
{collectionposterheight} height of scraped collection poster
{collectionposterpath} absolute path of scraped collection poster
{collectionfanartwidth} width of scraped collection fanart
{collectionfanartheight} height of scraped collection fanart
{collectionfanartpath} absolute path of scraped collection fanart
{actors[]} array with movie actors
{actors[name]} real name of actor
{actors[role]} actor role
{actors[thumb]} absolute path of scraped actor thumb
{actors[thumbwidth]} width of scraped actor thumb
{actors[thumbheight]} height of scraped actor thumb
{isseries} true if event is scraped as a series
Available variables for series:
{seriesname} name of series
{seriesoverview} series overview
{seriesfirstaired} first aired date
{seriesnetwork} network which produces series
{seriesgenre} series genre
{seriesrating} series thetvdb rating
{seriesstatus} status of series (running / finished)
{episodetitle} title of episode
{episodenumber} number of episode
{episodeseason} season of episode
{episodefirstaired} first aired date of episode
{episodegueststars} guest stars of episode
{episodeoverview} episode overview
{episoderating} user rating for episode
{episodeimagewidth} episode image width
{episodeimageheight} episode image height
{episodeimagepath} episode image path
{seasonposterwidth} episode season poster width
{seasonposterheight} episode season poster height
{seasonposterpath} episode season poster path
{seriesposter1width} width of 1st poster
{seriesposter1height} height of 1st poster
{seriesposter1path} path of 1st poster
{seriesposter2width} width of 2nd poster
{seriesposter2height} height of 2nd poster
{seriesposter2path} path of 2nd poster
{seriesposter3width} width of 3rd poster
{seriesposter3height} height of 3rd poster
{seriesposter3path} path of 3rd poster
{seriesfanart1width} width of 1st fanart
{seriesfanart1height} height of 1st fanart
{seriesfanart1path} path of 1st fanart
{seriesfanart2width} width of 2nd fanart
{seriesfanart2height} height of 2nd fanart
{seriesfanart2path} path of 2nd fanart
{seriesfanart3width} width of 3rd fanart
{seriesfanart3height} height of 3rd fanart
{seriesfanart3path} path of 3rd fanart
{seriesbanner1width} width of 1st banner
{seriesbanner1height} height of 1st banner
{seriesbanner1path} path of 1st banner
{seriesbanner2width} width of 2nd banner
{seriesbanner2height} height of 2nd banner
{seriesbanner2path} path of 2nd banner
{seriesbanner3width} width of 3rd banner
{seriesbanner3height} height of 3rd banner
{seriesbanner3path} path of 3rd fanart
{actors[]} array with movie actors
{actors[name]} real name of actor
{actors[role]} actor role
{actors[thumb]} absolute path of scraped actor thumb
{actors[thumbwidth]} width of scraped actor thumb
{actors[thumbheight]} height of scraped actor thumb
-->
<onpause delay="60" fadetime="{fadeTime}">
<area x="0" y="0" width="100%" height="100%" layer="7">
<fill color="{clrSemiTransBlack}" />
@ -390,13 +200,6 @@
</area>
</onpausemodeonly>
<!-- Available Variables message:
{text} message text
{status} true if message is a status message
{info} true if message is a info message
{warning} true if message is a warn message
{error} true if message is a error message
-->
<message>
<area x="10%" y="45%" width="80%" height="10%" layer="1">
<fill color="{clrTransBlack}" />

View File

@ -8,12 +8,6 @@
</area>
</background>
<!-- Available Variables volume:
{volume} current volume, range from 0 to 255
{volpercent} current volume in %
{maxvolume} maximal volume
{mute} true if volume is muted
-->
<volume>
<area x="0" y="0" width="100%" height="50%" layer="2">
<drawtext x="10" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="{tr(volume)}: {volpercent}%" />

View File

@ -70,22 +70,7 @@
<drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
</area>
</scrollbar>
<!-- Available Variables in detailheader and tab:
{menuheader} "Preview: Skin <skinname>"
{skinname} name of skin
{author} skin author
{fonts[]} array with fonts used by skin
{fonts[name]} name of font
{fonts[installed]} true if font is installed on system
{plugins[]} array with plugins supported by skin
{plugins[name]} name of plugin
{screenshots[]} array with screenshots
{screenshots[desc]} description of screenshot
{screenshots[path]} screenshot path
-->
<detailheader>
<area x="0" y="0" width="100%" height="20%" layer="2">
<fill color="{clrTransBlueLight}" />

View File

@ -15,10 +15,6 @@
</area>
</viewelement>
<!-- Available Variables scrollbar:
{height} height of scrollbar in tenth of a percent of total height
{offset} offset in tenth of a percent of total height
-->
<scrollbar>
<area x="98%" y="20%" width="2%" height="65%" layer="3">
<fill color="{clrWhite}" />
@ -27,28 +23,6 @@
</area>
</scrollbar>
<!-- Available Variables Footer:
{red1} true if red button is button 1
{red2} true if red button is button 2
{red3} true if red button is button 3
{red4} true if red button is button 4
{green1} true if green button is button 1
{green2} true if green button is button 2
{green3} true if green button is button 3
{green4} true if green button is button 4
{yellow1} true if yellow button is button 1
{yellow2} true if yellow button is button 2
{yellow3} true if yellow button is button 3
{yellow4} true if yellow button is button 4
{blue1} true if blue button is button 1
{blue2} true if blue button is button 2
{blue3} true if blue button is button 3
{blue4} true if blue button is button 4
{red} label of red button
{green} label of green button
{yellow} label of yellow button
{blue} label of blue button
-->
<viewelement name="footer">
<area x="0" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
@ -92,50 +66,10 @@
</area>
</viewelement>
<!-- Available Variables time:
{time} timestring in hh:mm
{sec} current seconds
{min} current minutes
{hour} current hours
{hmins} current "hourminutes" to display an hour hand
-->
<viewelement name="time">
</viewelement>
<!-- Available Variables in detailheader elements:
{title} title of event
{shorttext} shorttext of event
{start} event start time in hh::mm
{stop} event stop time
{day} Day of event as three letter abrivation
{date} date of current event in dd.mm.yy
{daynumeric} day as number
{month} month as number
{year} year as number
{running} true if event is currently running
{elapsed} elapsed time of event, if not running 0
{duration} duration of event
{durationhours} duration, full hours
{durationminutes} duration, rest of minutes
{vps} vps description string
{channelname} Channelname of event
{channelnumber} Channelnumber of event
{channellogoexists} true if a channel logo exists
{channelid} ChannelID as path to display channel logo
{ismovie} true if event is scraped as a movie
{isseries} true if event is scraped as a series
{posteravailable} true if a poster is available
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{banneravailable} true if a banner is available
{bannerwidth} width of banner
{bannerheight} height of banner
{bannerpath} path of banner
{epgpicavailable} true if a epg picture is available
{epgpicpath} path of epg picture
-->
<viewelement name="header">
<area x="1%" y="0" width="98%" height="20%" layer="3">
<drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="15%" height="80%" valign="center" />
@ -149,140 +83,6 @@
</area>
</viewelement>
<!-- Available Variables in tab elements:
{title} title of event
{shorttext} shorttext of event
{description} description of event
{start} event start time in hh::mm
{stop} event stop time
{day} Day of event as three letter abrivation
{date} date of current event in dd.mm.yy
{daynumeric} day as number
{month} month as number
{year} year as number
{running} true if event is currently running
{elapsed} elapsed time of event, if not running 0
{duration} duration of event
{durationhours} duration, full hours
{durationminutes} duration, rest of minutes
{vps} vps description string
{channellogoexists} true if a channel logo exists
{channelid} ChannelID as path to display channel logo
{hasreruns} true if reruns of this event are found
{reruns[]} array with reruns
{reruns[title]} title of rerun
{reruns[shorttext]} shorttext of rerun
{reruns[date]} date of rerun in dd:mm
{reruns[day]} short dayname of rerun
{reruns[start]} start time of rerun in hh:mm
{reruns[stop]} stop time of rerun in hh:mm
{reruns[channelname]} name of channel on which rerun occurs
{reruns[channelnumber]} number of channel on which rerun occurs
{reruns[channelid]} id of channel on which rerun occurs to display channel logo
{reruns[channellogoexists]} true if channel logo exists
{epgpic1avaialble} true if first epg picture is available
{epgpic2avaialble} true if first epg picture is available
{epgpic3avaialble} true if first epg picture is available
{epgpic1path} path of first epg picture
{epgpic2path} path of second epg picture
{epgpic3path} path of third epg picture
{ismovie} true if event is scraped as a movie
Available variables for movies:
{movietitle} movie title from themoviedb
{movieoriginalTitle} movie original title from themoviedb
{movietagline} movie tagline from themoviedb
{movieoverview} movie overview from themoviedb
{movieadult} true if movie is rated as adult
{moviebudget} movie budget from themoviedb in $
{movierevenue} movie revenue from themoviedb in $
{moviegenres} movie genres from themoviedb
{moviehomepage} movie homepage from themoviedb
{moviereleasedate} movie release date from themoviedb
{movieruntime} movie runtime from themoviedb
{moviepopularity} movie popularity from themoviedb
{movievoteaverage} movie vote average from themoviedb
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
{fanartwidth} width of scraped fanart
{fanartheight} height of scraped fanart
{fanartpath} absolute path of scraped fanart
{movieiscollection} true if movie is part of a collection
{moviecollectionName} name of movie collection
{collectionposterwidth} width of scraped collection poster
{collectionposterheight} height of scraped collection poster
{collectionposterpath} absolute path of scraped collection poster
{collectionfanartwidth} width of scraped collection fanart
{collectionfanartheight} height of scraped collection fanart
{collectionfanartpath} absolute path of scraped collection fanart
{actors[]} array with movie actors
{actors[name]} real name of actor
{actors[role]} actor role
{actors[thumb]} absolute path of scraped actor thumb
{actors[thumbwidth]} width of scraped actor thumb
{actors[thumbheight]} height of scraped actor thumb
{isseries} true if event is scraped as a series
Available variables for series:
{seriesname} name of series
{seriesoverview} series overview
{seriesfirstaired} first aired date
{seriesnetwork} network which produces series
{seriesgenre} series genre
{seriesrating} series thetvdb rating
{seriesstatus} status of series (running / finished)
{episodetitle} title of episode
{episodenumber} number of episode
{episodeseason} season of episode
{episodefirstaired} first aired date of episode
{episodegueststars} guest stars of episode
{episodeoverview} episode overview
{episoderating} user rating for episode
{episodeimagewidth} episode image width
{episodeimageheight} episode image height
{episodeimagepath} episode image path
{seasonposterwidth} episode season poster width
{seasonposterheight} episode season poster height
{seasonposterpath} episode season poster path
{seriesposter1width} width of 1st poster
{seriesposter1height} height of 1st poster
{seriesposter1path} path of 1st poster
{seriesposter2width} width of 2nd poster
{seriesposter2height} height of 2nd poster
{seriesposter2path} path of 2nd poster
{seriesposter3width} width of 3rd poster
{seriesposter3height} height of 3rd poster
{seriesposter3path} path of 3rd poster
{seriesfanart1width} width of 1st fanart
{seriesfanart1height} height of 1st fanart
{seriesfanart1path} path of 1st fanart
{seriesfanart2width} width of 2nd fanart
{seriesfanart2height} height of 2nd fanart
{seriesfanart2path} path of 2nd fanart
{seriesfanart3width} width of 3rd fanart
{seriesfanart3height} height of 3rd fanart
{seriesfanart3path} path of 3rd fanart
{seriesbanner1width} width of 1st banner
{seriesbanner1height} height of 1st banner
{seriesbanner1path} path of 1st banner
{seriesbanner2width} width of 2nd banner
{seriesbanner2height} height of 2nd banner
{seriesbanner2path} path of 2nd banner
{seriesbanner3width} width of 3rd banner
{seriesbanner3height} height of 3rd banner
{seriesbanner3path} path of 3rd fanart
{actors[]} array with movie actors
{actors[name]} real name of actor
{actors[role]} actor role
{actors[thumb]} absolute path of scraped actor thumb
{actors[thumbwidth]} width of scraped actor thumb
{actors[thumbheight]} height of scraped actor thumb
-->
<!-- a tab is one scrolling area, just position and draw as inside a normal area -->
<!-- just define as many tabs as needed -->
<!-- TAB EPGINFO -->
<tab name="EPG Info" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
<drawtextbox condition="not{isseries}++not{ismovie}" x="0" y="0" width="96%" font="{light}" fontsize="8%" color="{clrWhite}" text="{description}" />
@ -343,14 +143,6 @@
</tab>
<!-- Available Variables tablabels:
{currenttab} name of currently active tab
{prevtab} name of prev tab
{nexttab} name of next tab
{tabs[]} array with available tab labels
{tabs[title]} title of tab
{tabs[current]} true if tab is displayed currently
-->
<tablabels>
<area x="0" y="85%" width="98%" height="5%" layer="3">
<loop name="tabs" x="0" y="0" orientation="horizontal">

View File

@ -2,11 +2,6 @@
<!DOCTYPE displayplugin SYSTEM "../../../dtd/displayplugin.dtd">
<displayplugin x="0" y="0" width="100%" height="100%">
<!-- Available Variables Background:
{menuwidth} menuwidth in percent of screenwidth
{menuheight} menuheight in percent of screenheight
{hasscrollbar} true if menu needs a scrollbar
-->
<viewelement name="background">
<area condition="not{hasscrollbar}" x="0" y="0" width="100%" height="100%" layer="4">
<drawrectangle x="{areawidth}/2 - {menuwidth}*{areawidth}/100/2" y="{areaheight}/2 - {menuheight}*{areaheight}/100/2" width="{menuwidth}*{areawidth}/100" height="{menuheight}*{areaheight}/100" color="{clrTransBlack}" />
@ -16,13 +11,6 @@
</area>
</viewelement>
<!-- Available Variables Scrollbar:
{menuwidth} menuwidth in percent of screenwidth
{posy} y position of scrollbar start in percent of screenheight
{totalheight} height of complete scrollbar in percent of screenheight
{height} height in tenth of a percent of total height
{offset} offset in tenth of a percent
-->
<viewelement name="scrollbar">
<area x="0" y="0" width="100%" height="100%" layer="5">
<drawrectangle x="{areawidth}/2 + {menuwidth}*{areawidth}/100/2" y="{posy}*{areaheight}/100" width="2%" height="{totalheight}*{areaheight}/100" color="{clrWhite}" />
@ -34,21 +22,10 @@
</viewelement>
<grid name="recmenu" x="0" y="0" width="100%" height="100%">
<!-- Background
{current} true if item is currently selected
-->
<area condition="not{info}++not{buttonyesno}++not{timerconflictheader}++not{timerconflict}++not{timelineheader}++not{timelinetimer}" layer="5">
<fill condition="{current}" color="{clrTransBlueLight}" />
<fill condition="not{current}" color="{clrTransBlack}" />
</area>
<!-- info item
{info} true
{lines} number of lines to display (max. 4)
{line1} text of line 1
{line2} text of line 1
{line3} text of line 1
{line4} text of line 1
-->
<area condition="{info}" layer="5">
<drawtext condition="eq({lines}, 1)" align="center" valign="center" font="{semibold}" fontsize="60%" color="{clrWhite}" text="{line1}" />
@ -64,20 +41,9 @@
<drawtext condition="eq({lines}, 4)" align="center" y="50%" font="{semibold}" fontsize="22%" color="{clrWhite}" text="{line3}" />
<drawtext condition="eq({lines}, 4)" align="center" y="75%" font="{semibold}" fontsize="22%" color="{clrWhite}" text="{line4}" />
</area>
<!-- button
{button} true
{buttontext} text to display on button
-->
<area condition="{button}" layer="6">
<drawtext align="center" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{buttontext}" />
</area>
<!-- yes / no button
{buttonyesno} true
{yes} true if button is set to yes
{textyes} text to display on yes button
{textno} text to display on no button
-->
<areacontainer condition="{buttonyesno}">
<area layer="5">
<drawrectangle condition="not{current}" x="2%" y="5%" width="46%" height="90%" color="{clrDarkGray}"/>
@ -92,42 +58,21 @@
<drawtext name="notext" x="3*{areawidth}/4 - {width(notext)}/2" valign="center" font="{light}" fontsize="70%" color="{clrWhite}" text="{textno}" />
</area>
</areacontainer>
<!-- Int Selector
{intselector} true
{text} title of selector
{value} current value of selector, integer
-->
<area condition="{intselector}" layer="6">
<drawtext x="1%" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{text}" />
<drawtext align="right" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{value} " />
</area>
<!-- Bool Selector
{boolselector} true
{text} title of selector
{value} current value of selector, true or false
-->
<area condition="{boolselector}" layer="6">
<drawtext x="1%" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{text}" />
<drawimage condition="{value}" imagetype="icon" path="ico_yes" x="{areawidth} - {areaheight}*0.8" y="10%" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
<drawimage condition="not{value}" imagetype="icon" path="ico_no" x="{areawidth} - {areaheight}*0.8" y="10%" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
</area>
<!-- String Selector
{stringselector} true
{text} title of selector
{value} current value of selector, string
-->
<area condition="{stringselector}" layer="6">
<drawtext x="1%" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{text}" />
<drawimage imagetype="icon" path="ico_arrow_right" x="{areawidth} - {areaheight}*0.8" y="10%" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
<drawtext name="value" x="{areawidth} - {width(value)} - {areaheight}" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{value}" />
<drawimage imagetype="icon" path="ico_arrow_left" x="{areawidth} - {width(value)} - 2*{areaheight}" y="10%" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
</area>
<!-- Text Input
{textinput} true
{editmode} true if currently in edit mode
{text} title of selector
{value} current value of selector, string
-->
<areacontainer condition="{textinput}">
<area layer="6">
<drawtext x="1%" y="10%" font="{light}" fontsize="40%" color="{clrWhite}" text="{text}" />
@ -138,32 +83,14 @@
<drawtext align="right" y="55%" font="{light}" fontsize="40%" color="{clrBlack}" text="{value} " />
</area>
</areacontainer>
<!-- Time Selector
{timeselector} true
{text} title of selector
{value} current value of selector, hh:mm
-->
<area condition="{timeselector}" layer="6">
<drawtext x="1%" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{text}" />
<drawtext align="right" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{value} " />
</area>
<!-- Day Selector
{dayselector} true
{text} title of selector
{value} current value of selector, dd.mm
-->
<area condition="{dayselector}" layer="6">
<drawtext x="1%" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{text}" />
<drawtext align="right" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{value} " />
</area>
<!-- Channel Selector
{channelselector} true
{text} title of selector
{channelnumber} number of currently selected channel, 0 for "all channels"
{channelname} name of channel or "all channels"
{channelid} id of channel
{channellogoexisis} true if channel logo exists
-->
<area condition="{channelselector}" layer="6">
<drawtext x="1%" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{text}" />
<drawimage condition="{channellogoexisis}" imagetype="channellogo" path="{channelid}" x="{areawidth}-{areaheight}" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9" />
@ -171,13 +98,6 @@
<drawtext condition="not{channellogoexisis}++{channelnumber}" align="right" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{channelnumber} {channelname} " />
<drawtext condition="not{channelnumber}" align="right" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{channelname} " />
</area>
<!-- Weekday Selector
{weekdayselector} true
{text} title of selector
{dayselected} number of currently selected day (0 - 6)
{day0abbr} ... {day6abbr} localized one character abbrevation for weekdays from Monday to Sunday
{day0set} ... {day6set} true if according weekday from Monday to Sunday is set
-->
<areacontainer condition="{weekdayselector}">
<area layer="6">
<drawtext x="1%" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{text}" />
@ -223,27 +143,12 @@
<drawtext name="day6" x="{areawidth} - {areaheight}*1.0 + {areaheight}/4 - {width(day6)}/2" valign="center" font="{light}" fontsize="50%" color="{clrWhite}" text="{day6abbr}" />
</area>
</areacontainer>
<!-- Directory Selector
{directoryselector} true
{text} title of selector
{folder} current folder of selector, string
-->
<area condition="{directoryselector}" layer="6">
<drawtext x="1%" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{text}" />
<drawimage imagetype="icon" path="ico_arrow_right" x="{areawidth} - {areaheight}*0.8" y="10%" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
<drawtext name="folder" x="{areawidth} - {width(folder)} - {areaheight}" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{folder}" />
<drawimage imagetype="icon" path="ico_arrow_left" x="{areawidth} - {width(folder)} - 2*{areaheight}" y="10%" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
</area>
<!-- Timerconflict Header
{timerconflictheader} true
{text} title of Timerconflict Header
{conflictstart} start of conflict in hh:mm
{conflictstop} end of conflict in hh:mm
{overlapstart} start of overlap in hh:mm
{overlapstop} end of overlap in hh:mm
{overlapstartpercent} start of overlap in percent of total conflict time width
{overlapwidthpercent} width of overlap in percent of total conflict time width
-->
<areacontainer condition="{timerconflictheader}">
<area layer="5">
<drawtext name="title" x="{areawidth}*0.7*0.5 - {width(title)}/2" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{text}" />
@ -257,25 +162,6 @@
<drawrectangle x="{areawidth}*0.7 + {overlapstartpercent}*{areawidth}*0.3/100" y="50%" width="{overlapwidthpercent}*{areawidth}*0.3/100" height="50%" color="{clrRedTrans}"/>
</area>
</areacontainer>
<!-- Timerconflict
{timerconflict} true
{timertitle} title of timer
{channelname} name of channel
{channelid} channel ID
{transponder} transponder of channel
{starttime} start of timer in hh:mm
{stoptime} end of timer in hh:mm
{date} date of timer in dd.mm.yy
{weekday} weekday of timer, 3 letter abrivation
{infoactive} true if info icon is active
{deleteactive} true if delete icon is active
{editactive} true if edit icon is active
{searchactive} true if search icon is active
{timerstartpercent} start of timer in percent of total conflict time width
{timerwidthpercent} end of timer in percent of total conflict time width
{overlapstartpercent} start of overlap in percent of total conflict time width
{overlapwidthpercent} width of overlap in percent of total conflict time width
-->
<areacontainer condition="{timerconflict}">
<area layer="5">
<drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="70%" height="100%"/>
@ -300,20 +186,6 @@
<drawrectangle x="{areawidth}*0.7 + {overlapstartpercent}*{areawidth}*0.3/100" y="0" width="{overlapwidthpercent}*{areawidth}*0.3/100" height="100%" color="{clrRedTrans}"/>
</area>
</areacontainer>
<!-- Event
{event} true
{title} title of event
{shorttext} shorttext of event
{starttime} start of event in hh:mm
{stoptime} end of event in hh:mm
{date} date of event in dd.mm.yy
{weekday} weekday of event, 3 letter abrivation
{channelnumber} number of channel
{channelname} name of channel
{channelid} id of channel
{channellogoexisis} true if channel logo exists
{hastimer} true if event has a timer
-->
<area condition="{event}" layer="6">
<drawimage condition="{current}" imagetype="icon" path="ico_info_active" x="{areaheight}*0.05" valign="center" width="{areaheight}*0.5" height="{areaheight}*0.5"/>
<drawimage condition="not{current}" imagetype="icon" path="ico_info_inactive" x="{areaheight}*0.05" valign="center" width="{areaheight}*0.5" height="{areaheight}*0.5"/>
@ -325,31 +197,10 @@
<drawimage condition="not{current}++not{hastimer}" imagetype="icon" path="ico_record_inactive" x="{areawidth} - {areaheight}*0.6" valign="center" width="{areaheight}*0.5" height="{areaheight}*0.5"/>
<drawimage condition="{hastimer}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*0.6" valign="center" width="{areaheight}*0.5" height="{areaheight}*0.5"/>
</area>
<!-- Recording
{recording} true
{recname} title of recording
{recstarttime} start of recording in hh:mm
{recdate} date of recording in dd.mm.yy
{recduration} duration of recording in min
{channelnumber} number of channel
{channelname} name of channel
{channelid} id of channel
{channellogoexisis} true if channel logo exists
-->
<area condition="{recording}" layer="6">
<drawtext x="1%" y="0" font="{light}" width="98%" fontsize="50%" color="{clrWhite}" text="{recname}" />
<drawtext x="55%" y="0" font="{light}" width="98%" fontsize="35%" color="{clrWhite}" text="{recdate} {recstarttime} - {recduration} min, {channelname}" />
</area>
<!-- Searchtimer
{searchtimer} true
{timeractive} true if searchtimer is active
{searchstring} searchtimer search string
{activetimers} number of active timers caused by this searchtimer
{recordingsdone} number of recordings done by this searchtimer
{searchactive} true if search icon is active
{editactive} true if edit icon is active
{deleteactive} true if delete icon is active
-->
<area condition="{searchtimer}" layer="6">
<drawimage condition="{current}++{searchactive}" imagetype="icon" path="ico_search_active" x="{areaheight}*0.05" valign="center" width="{areaheight}*0.5" height="{areaheight}*0.5"/>
<drawimage condition="not{current}||not{searchactive}" imagetype="icon" path="ico_search_inactive" x="{areaheight}*0.05" valign="center" width="{areaheight}*0.5" height="{areaheight}*0.5"/>
@ -361,22 +212,6 @@
<drawtext condition="{timeractive}" align="right" y="5%" font="{regular}" fontsize="35%" color="{clrWhite}" text="active " />
<drawtext x="{areaheight}*1.8" y="55%" font="{light}" fontsize="35%" color="{clrWhite}" text="Active Timers: {activetimers}, Recordings: {recordingsdone}" />
</area>
<!-- Timeline Header
{timelineheader} true
{date} date of current day in weekdayname dd.mm.yyyy
{timerset} true if timer info is set
{channelname} name of channel of timer
{channelid} channel ID of channel of timer
{channellogoexisis} true if channel logo exists
{channelnumber} number of channel of timer
{channeltransponder} transponder of channel of timer
{timerstart} start of timer in hh:mm
{timerstop} end of timer in hh:mm
{eventtitle} title of according event
{eventshorttext} short text of according event
{eventstart} start time of according event
{eventstop} end time of according event
-->
<areacontainer condition="{timelineheader}">
<area layer="5">
<drawtext align="center" y="1%" font="{regular}" fontsize="35%" color="{clrWhite}" text="Timer for {date}" />
@ -438,11 +273,6 @@
<drawtext x="{areaheight}*0.8" y="57%" width="{areawidth}-{areaheight}" font="{light}" fontsize="25%" color="{clrWhite}" text="{eventtitle} - {eventshorttext}"/>
</area>
</areacontainer>
<!-- Timeline Timer
{timelinetimer} true
{timerstart} start of timer in tenth percent of complete 24h width
{timerwidth} width of timer in tenth percent of complete 24h width
-->
<areacontainer condition="{timelinetimer}">
<area layer="5">
<drawrectangle condition="{current}" x="5%" y="0" width="90%" height="100%" color="{clrTransBlueLight}"/>
@ -453,10 +283,6 @@
<drawrectangle x="{areawidth}*0.05 + {timerstart}*{areawidth}*0.9/1000" y="25%" width="{timerwidth}*{areawidth}*0.9/1000" height="50%" color="{clrBlack}"/>
</area>
</areacontainer>
<!-- Favorites
{favorite} true
{favdesc} description of favorite
-->
<area condition="{favorite}" layer="6">
<drawimage condition="{current}" imagetype="icon" path="ico_search_active" x="{areaheight}*0.1" valign="center" width="{areaheight}*0.5" height="{areaheight}*0.5"/>
<drawimage condition="not{current}" imagetype="icon" path="ico_search_inactive" x="{areaheight}*0.1" valign="center" width="{areaheight}*0.5" height="{areaheight}*0.5"/>

View File

@ -27,32 +27,6 @@
</area>
</viewelement>
<!-- Tokens available in Header
{isdummy} true if active element is a dummy element
{title} title of event of active grid
{shorttext} shorttext of event of active grid
{description} detailed description of event of active grid
{start} event start time in hh::mm
{stop} event stop time
{day} day of event of active grid
{date} date of event of active grid in dd.mm.yy
{daynumeric} day as number
{month} month as number
{year} year as number
{running} true if event is currently running
{elapsed} elapsed time of event, if not running 0
{duration} duration of event
{durationhours} duration, full hours
{durationminutes} duration, rest of minutes
{channelname} Channel Name
{channelnumber} Channel Number
{channelid} ChannelID as path to display channel logo
{channellogoexists} true if channel logo exists
{hasposter} true if a scraped poster is available for this element
{posterwidth} width of scraped poster
{posterheight} height of scraped poster
{posterpath} absolute path of scraped poster
-->
<viewelement name="header_hor">
<areascroll condition="not{isdummy}++not{hasposter}" orientation="vertical" mode="forthandback" delay="1000" scrollspeed="medium" x="1%" y="1%" width="68%" height="19%" layer="2">
<drawtext x="0" y="0" font="{semibold}" width="100%" fontsize="25%" color="{clrWhite}" text="{day} {daynumeric}.{month} {start} - {stop}" />
@ -95,28 +69,6 @@
</area>
</viewelement>
<!-- Available Variables Footer:
{red1} true if red button is button 1
{red2} true if red button is button 2
{red3} true if red button is button 3
{red4} true if red button is button 4
{green1} true if green button is button 1
{green2} true if green button is button 2
{green3} true if green button is button 3
{green4} true if green button is button 4
{yellow1} true if yellow button is button 1
{yellow2} true if yellow button is button 2
{yellow3} true if yellow button is button 3
{yellow4} true if yellow button is button 4
{blue1} true if blue button is button 1
{blue2} true if blue button is button 2
{blue3} true if blue button is button 3
{blue4} true if blue button is button 4
{red} label of red button
{green} label of green button
{yellow} label of yellow button
{blue} label of blue button
-->
<viewelement name="footer_hor">
<area x="0" y="92%" width="25%" height="8%" layer="2">
<drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
@ -202,21 +154,7 @@
<drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
</area>
</viewelement>
<!-- Available Variables time:
{time} timestring in hh:mm
{sec} current seconds
{min} current minutes
{hour} current hours
{hmins} current "hourminutes" to display an hour hand
{day} day in digits
{dayleadingzero} day in digits with leading 0
{dayname} Full name of the day
{daynameshort} Short 3 char name of the day
{month} month in digits with leading 0
{monthname} Full name of the month
{monthnameshort} 3 letter abbrivation of month name
{year} year in yyyy
-->
<viewelement name="time_hor">
<area x="70%" y="0" width="{areawidth}*0.145" height="12%" layer="2">
<drawtext align="right" y="5%" font="{light}" fontsize="45%" color="{clrWhite}" text="{dayname}" />
@ -237,10 +175,6 @@
</area>
</viewelement>
<!-- Tokens available in datetimeline
{weekday} weekday of current display
{date} date of current display
-->
<viewelement name="datetimeline_hor">
<area x="0" y="20%" width="15%" height="5%" layer="3">
<drawtext align="center" valign="center" font="{semibold}" fontsize="90%" color="{clrWhite}" text="{weekday} {date}" />
@ -254,9 +188,6 @@
</area>
</viewelement>
<!-- Tokens available in timeindicator
{percenttotal} position of current time indicator in tenth of a percent of complete time shown
-->
<viewelement name="timeindicator_hor">
<area x="15%" y="20%" width="85%" height="72%" layer="4">
<drawrectangle x="{percenttotal}*{areawidth}/1000" y="0" width="1" height="100%" color="{clrRed}" />
@ -269,9 +200,6 @@
</area>
</viewelement>
<!-- Tokens available in timeline
{timestring} time of grid in hh:mm
-->
<grid name="timeline_hor" x="15%" y="20%" width="85%" height="5%">
<area layer="1">
<drawrectangle condition="{fullhour}" x="1" y="1" width="{areawidth}-2" height="{areaheight}-2" color="{clrTransWhite}"/>
@ -294,12 +222,6 @@
</area>
</grid>
<!-- Tokens available in channels
{name} name of channel
{number} number of channel
{channelid} id of channel to display channel logo
{channellogoexists} true if channel logo exists
-->
<grid name="channels_hor" x="5%" y="25%" width="10%" height="67%">
<area layer="2">
<drawimage condition="{channellogoexists}" imagetype="channellogo" path="{channelid}" align="center" valign="center" width="80%" height="80%" />
@ -314,10 +236,6 @@
</area>
</grid>
<!-- Tokens available in channelgroups
{color} alternates grid by grid from true to false
{group} name of channel group
-->
<grid name="channelgroups_hor" x="0" y="25%" width="5%" height="67%">
<area layer="2">
<drawrectangle condition="{color}" x="1" y="1" width="{areawidth}-2" height="{areaheight}-2" color="{clrTransBlack}" />
@ -338,16 +256,6 @@
</area>
</grid>
<!-- Tokens available in schedules
{color} alternates grid by grid from true to false
{dummy} true if grid is a dummy grid
{timer} true if a timer is set for the according event
{switchtimer} true if a switchtimer is set for the according event
{title} title of grid
{shorttext} shorttext of grid
{start} start time in hh:mm
{stop} stop time in hh:dd
-->
<grid name="schedules_hor" x="15%" y="25%" width="85%" height="67%">
<area layer="2">
<drawrectangle condition="{color}++not{current}" x="1" y="1" width="{areawidth}-2" height="{areaheight}-2" color="{clrTransBlack}" />
@ -381,9 +289,6 @@
</area>
</grid>
<!-- Tokens available in channeljump
{channel} current user input for channel jump
-->
<viewelement name="channeljump">
</viewelement>

View File

@ -2,22 +2,26 @@
<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
<background>
<!-- background left Menu -->
<background condition="eq({indexweathermenuorientation}, 1)">
<area x="0" y="0" width="50%" height="100%" layer="1">
<fill color="{clrTransBlack}" />
</area>
<!-- background right detail view -->
<area x="50%" y="3%" width="50%" height="94%" layer="1">
<fill color="{clrTransBlueLight}" />
</area>
</background>
<!-- Available Variables header:
{title} title of current menu
{vdrversion} running VDR Version
{hasicon} true if a menu icon is available
{icon} path of menu icon
-->
<background condition="eq({indexweathermenuorientation}, 0)">
<area x="0" y="0" width="100%" height="10%" layer="1">
<fill color="{clrTransBlack}" />
</area>
<area x="5%" y="10%" width="90%" height="72%" layer="1">
<fill color="{clrTransBlueLight}" />
</area>
<area x="0" y="82%" width="100%" height="18%" layer="1">
<fill color="{clrTransBlack}" />
</area>
</background>
<header>
<area x="0" y="0" width="50%" height="10%" layer="2">
<drawtext condition="not{hasicon}" x="5" width="{areawidth}-10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
@ -38,82 +42,7 @@
</area>
</colorbuttons>
<menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="10">
<!-- Available Variables:
{current}
{menuitemtext} "Current Weather", "Next 48 hours" or "Next 7 days"
{iscurrent} true if item is "Current Weather"
{ishourly} true if item is "Next 48 hours"
{isdaily} true if item is "Next 7 days"
{city} configured city to display weather for
{latitude} latitude
{longitude} longitude
If {iscurrent} is true, the following tokens are set:
{timestamp} timestamp in hh:mm dd.mm of current forecast
{temperature} current temperature in °C
{apparenttemperature} apparent (felt) temperature in °C
{summary} short summary of current weather
{icon} path to use in <drawimage> to display appropriate weather icon
{precipitationintensity} precipitation intensity in l/qm
{precipitationprobability} precipitation probability in %
{precipitationtype} precipitation type (snow, ...)
{humidity} humidity in %
{windspeed} wind speed in km/h
{windbearing} wind bearing in degrees
{windbearingstring} wind bearing as human readable string (e.g NE, NNE, ...)
{visibility} visibility in km
{cloudcover} cloud cover in %
{pressure} pressure in HPa
{ozone} Ozone in DU (Dobson Unit)
If {ishourly} is true, the following tokens are set:
{summary} short summary of weather
{icon} path to use in <drawimage> to display appropriate weather icon
{hourly[]} array with up to 48 hourly forecasts
{hourly[num]} number of forecast, starting at 1
{hourly[timestamp]} timestamp in hh:mm
{hourly[temperature]} temperature in °C
{hourly[apparenttemperature]} apparent (felt) temperature in °C
{hourly[summary]} short summary
{hourly[icon]} path to use in <drawimage> to display appropriate weather icon
{hourly[precipitationintensity]} precipitation intensity in l/qm
{hourly[precipitationprobability]} precipitation probability in %
{hourly[precipitationtype]} precipitation type (snow, ...)
{hourly[humidity]} humidity in %
{hourly[windspeed]} wind speed in km/h
{hourly[windbearing]} wind bearing in degrees
{hourly[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
{hourly[visibility]} visibility in km
{hourly[cloudcover]} cloud cover in %
{hourly[pressure]} pressure in HPa
{hourly[ozone]} Ozone in DU (Dobson Unit)
If {isdaily} is true, the following tokens are set:
{summary} short summary of weather
{icon} path to use in <drawimage> to display appropriate weather icon
{daily[day]} day of forecast in dd.mm
{daily[dayname]} three letter abbrivated day name
{daily[temperaturemin]} minimum temperature at this day in °C
{daily[temperaturemintime]} time of minimum temperature
{daily[temperaturemax]} maximum temperature at this day in °C
{daily[temperaturemaxtime]} time of maximum temperature
{daily[summary]} short summary
{daily[icon]} path to use in <drawimage> to display appropriate weather icon
{daily[precipitationintensity]} precipitation intensity in l/qm
{daily[precipitationprobability]} precipitation probability in %
{daily[precipitationtype]} precipitation type (snow, ...)
{daily[humidity]} humidity in %
{daily[windspeed]} wind speed in km/h
{daily[windbearing]} wind bearing in degrees
{daily[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
{daily[visibility]} visibility in km
{daily[cloudcover]} cloud cover in %
{daily[pressure]} pressure in HPa
{daily[ozone]} Ozone in DU (Dobson Unit)
-->
<menuitems condition="strequal({weathermenuorientation}, 'vertical')" x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="10">
<listelement>
<!-- Background -->
<area x="1%" width="46%" layer="2">
@ -124,8 +53,6 @@
<drawtext x="10" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{menuitemtext}" />
</area>
</listelement>
<!-- additional element which is drawn for current element -->
<!-- All Tokens from listelement are available -->
<currentelement delay="100" fadetime="0">
<area condition="{iscurrent}" x="51%" y="0" width="48%" height="100%" layer="3">
<drawimage name="weathericon" imagetype="icon" path="{icon}" x="2%" y="0" width="{areawidth}*0.3" height="{areawidth}*0.3"/>
@ -161,4 +88,50 @@
</area>
</currentelement>
</menuitems>
<menuitems condition="strequal({weathermenuorientation}, 'horizontal')" x="0" y="10%" orientation="horizontal" width="100%" height="90%" align="center" numlistelements="3">
<listelement>
<!-- Background -->
<area y="80%" height="20%" layer="2">
<fill condition="not{current}" color="{clrTransparent}" />
<fill condition="{current}" color="{clrTransBlueLight}" />
</area>
<area y="80%" height="20%" layer="3">
<drawtextbox x="0" y="0" width="100%" height="100%" align="center" valign="center" font="{light}" fontsize="40%" color="{clrWhite}" text="{menuitemtext}" />
</area>
</listelement>
<currentelement delay="100" fadetime="0">
<area condition="{iscurrent}" x="10%" y="5%" width="80%" height="70%" layer="3">
<drawimage name="weathericon" imagetype="icon" path="{icon}" x="2%" y="0" width="{areaheight}*0.4" height="{areaheight}*0.4"/>
<drawtext align="right" y="0" font="{semibold}" fontsize="10%" color="{clrWhite}" text="{city}" />
<drawtext align="right" y="9%" font="{light}" fontsize="10%" color="{clrWhite}" text="{timestamp}" />
<drawtext align="right" y="18%" font="{light}" fontsize="25%" color="{clrWhite}" text="{temperature}°C" />
<drawtext align="right" y="40%" font="{light}" fontsize="10%" color="{clrWhite}" text="{summary}" />
<drawtext x="0" y="40%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(apparenttemp)}: {apparenttemperature} °C" />
<drawtext x="0" y="48%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(precipitationprobability)}: {precipitationprobability} %" />
<drawtext x="0" y="56%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(precipitationintensity)}: {precipitationintensity} l/qm" />
<drawtext x="0" y="64%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(humidity)}: {humidity} %" />
<drawtext x="0" y="72%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(windspeed)}: {windspeed} km/h" />
<drawtext x="0" y="80%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(windbearing)}: {windbearingstring} ({windbearing} °)" />
<drawtext x="0" y="88%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(cloudcover)}: {cloudcover} %" />
</area>
<area condition="{ishourly}" x="10%" y="5%" width="80%" height="70%" layer="3">
<loop name="hourly" x="0" y="0" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/12" overflow="cut">
<drawtext x="0" font="{semibold}" fontsize="7%" valign="center" color="{clrWhite}" text="{hourly[timestamp]}" />
<drawimage imagetype="icon" path="{hourly[icon]}" x="18%" valign="center" width="{rowheight}*0.8" height="{rowheight}*0.8"/>
<drawtext x="30%" font="{light}" fontsize="7%" valign="center" color="{clrWhite}" text="{hourly[temperature]}°C" />
<drawtext x="48%" font="{light}" fontsize="5%" valign="center" width="52%" color="{clrWhite}" text="{hourly[summary]}" />
<drawrectangle x="0" y="{rowheight} - 1" width="{columnwidth}" height="1" color="{clrWhite}" />
</loop>
</area>
<area condition="{isdaily}" x="10%" y="5%" width="80%" height="70%" layer="3">
<loop name="daily" x="0" y="0" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/7" overflow="cut">
<drawtext x="0" font="{semibold}" fontsize="{rowheight}/2" y="5" color="{clrWhite}" text="{daily[dayname]} {daily[day]}" />
<drawtext x="35%" font="{light}" fontsize="{rowheight}/2" y="5" color="{clrWhite}" text="{daily[temperaturemin]}°C - {daily[temperaturemax]}°C" />
<drawtext x="0" font="{light}" fontsize="{rowheight}*0.3" width="{columnwidth} - {rowheight}*0.7" y="{rowheight}*0.6" color="{clrWhite}" text="{daily[summary]}" />
<drawimage imagetype="icon" path="{daily[icon]}" x="{columnwidth} - {rowheight}*0.7" valign="center" width="{rowheight}*0.7" height="{rowheight}*0.7"/>
<drawrectangle x="0" y="{rowheight} - 1" width="{columnwidth}" height="1" color="{clrWhite}" />
</loop>
</area>
</currentelement>
</menuitems>
</menuplugin>

View File

@ -26,37 +26,14 @@
</area>
</colorbuttons>
<scrollbar>
<scrollbar>
<area x="98%" y="20%" width="2%" height="65%" layer="3">
<fill color="{clrWhite}" />
<drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
<drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
</area>
</scrollbar>
<!-- Available Variables in detailheader and tab:
{menuheader} "Current Weather"
{city} configured city to display weather for
{latitude} latitude
{longitude} longitude
{timestamp} timestamp in hh:mm dd.mm of current forecast
{temperature} current temperature in °C
{apparenttemperature} apparent (felt) temperature in °C
{temperaturemin} minimum temperature the day in °C
{temperaturemax} maximum temperature the day in °C
{summary} short summary of current weather
{icon} path to use in <drawimage> to display appropriate weather icon
{precipitationintensity} precipitation intensity in l/qm
{precipitationprobability} precipitation probability in %
{precipitationtype} precipitation type (snow, ...)
{humidity} humidity in %
{windspeed} wind speed in km/h
{windbearing} wind bearing in degrees
{windbearingstring} wind bearing as human readable string (e.g NE, NNE, ...)
{visibility} visibility in km
{cloudcover} cloud cover in %
{pressure} pressure in HPa
{ozone} Ozone in DU (Dobson Unit)
-->
<detailheader>
<area x="0" y="0" width="100%" height="20%" layer="2">
<fill color="{clrTransBlueLight}" />

View File

@ -26,7 +26,7 @@
</area>
</colorbuttons>
<scrollbar>
<scrollbar>
<area x="98%" y="20%" width="2%" height="65%" layer="3">
<fill color="{clrWhite}" />
<drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
@ -34,34 +34,6 @@
</area>
</scrollbar>
<!-- Available Variables in detailheader and tab:
{summary} short summary of weather
{icon} path to use in <drawimage> to display appropriate weather icon
{city} configured city to display weather for
{latitude} latitude
{longitude} longitude
{daily[day]} day of forecast in dd.mm
{daily[dayname]} three letter abbrivated day name
{daily[temperaturemin]} minimum temperature at this day in °C
{daily[temperaturemintime]} time of minimum temperature
{daily[temperaturemax]} maximum temperature at this day in °C
{daily[temperaturemaxtime]} time of maximum temperature
{daily[summary]} short summary
{daily[icon]} path to use in <drawimage> to display appropriate weather icon
{daily[precipitationintensity]} precipitation intensity in l/qm
{daily[precipitationprobability]} precipitation probability in %
{daily[precipitationtype]} precipitation type (snow, ...)
{daily[humidity]} humidity in %
{daily[windspeed]} wind speed in km/h
{daily[windbearing]} wind bearing in degrees
{daily[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
{daily[visibility]} visibility in km
{daily[cloudcover]} cloud cover in %
{daily[pressure]} pressure in HPa
{daily[ozone]} Ozone in DU (Dobson Unit)
-->
<detailheader>
<area x="0" y="0" width="100%" height="20%" layer="2">
<fill color="{clrTransBlueLight}" />

View File

@ -34,32 +34,6 @@
</area>
</scrollbar>
<!-- Available Variables in detailheader and tab:
{summary} short summary of weather
{icon} path to use in <drawimage> to display appropriate weather icon
{city} configured city to display weather for
{latitude} latitude
{longitude} longitude
{hourly[]} array with up to 48 hourly forecasts
{hourly[num]} number of forecast, starting at 1
{hourly[timestamp]} timestamp in hh:mm
{hourly[temperature]} temperature in °C
{hourly[apparenttemperature]} apparent (felt) temperature in °C
{hourly[summary]} short summary
{hourly[icon]} path to use in <drawimage> to display appropriate weather icon
{hourly[precipitationintensity]} precipitation intensity in l/qm
{hourly[precipitationprobability]} precipitation probability in %
{hourly[precipitationtype]} precipitation type (snow, ...)
{hourly[humidity]} humidity in %
{hourly[windspeed]} wind speed in km/h
{hourly[windbearing]} wind bearing in degrees
{hourly[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
{hourly[visibility]} visibility in km
{hourly[cloudcover]} cloud cover in %
{hourly[pressure]} pressure in HPa
{hourly[ozone]} Ozone in DU (Dobson Unit)
-->
<detailheader>
<area x="0" y="0" width="100%" height="20%" layer="2">
<fill color="{clrTransBlueLight}" />

View File

@ -81,6 +81,15 @@ int cDisplayMenuListView::GetListWidth(void) {
return 1920;
}
eMenuOrientation cDisplayMenuListView::MenuOrientation(void) {
if (!tmplList) {
return moVertical;
}
eOrientation orientation = tmplList->GetOrientation();
if (orientation == orHorizontal)
return moHorizontal;
return moVertical;
}
void cDisplayMenuListView::Clear(void) {
for (int i=0; i<itemCount; i++) {

View File

@ -26,6 +26,7 @@ public:
void SetTabs(int tab1, int tab2, int tab3, int tab4, int tab5);
int GetMaxItems(void) { return itemCount; };
int GetListWidth(void);
eMenuOrientation MenuOrientation(void);
void AddDefaultMenuItem(int index, string *tabTexts, bool current, bool selectable);
string AddMainMenuItem(int index, const char *itemText, bool current, bool selectable);
void AddSetupMenuItem(int index, const char *itemText, bool current, bool selectable);

View File

@ -226,6 +226,13 @@ void cDisplayMenuRootView::SetSortMode(eMenuSortMode sortMode) {
view->SetSortMode(sortMode);
}
eMenuOrientation cDisplayMenuRootView::MenuOrientation(void) {
if (!listView) {
return moVertical;
}
return listView->MenuOrientation();
}
void cDisplayMenuRootView::CorrectDefaultMenu(void) {
if (viewType > svMenuDefault && viewType != svMenuPlugin) {
SetMenu(mcUnknown, true);

View File

@ -55,6 +55,7 @@ public:
void SetMenu(eMenuCategory menuCat, bool menuInit);
void SetSelectedPluginMainMenu(string name) { selectedPluginMainMenu = name; };
void SetSortMode(eMenuSortMode sortMode);
eMenuOrientation MenuOrientation(void);
void SetCurrentRecording(string rec) { currentRecording = rec; };
void CorrectDefaultMenu(void);
void SetPluginMenu(string name, int menu, int type);

View File

@ -221,6 +221,8 @@ void cDisplayMenuView::DrawScrollbar(int numMax, int numDisplayed, int offset) {
intTokens.insert(pair<string, int>("height", barHeight));
intTokens.insert(pair<string, int>("offset", barOffset));
intTokens.insert(pair<string, int>("hasprev", (offset == 0) ? 0 : 1));
intTokens.insert(pair<string, int>("hasnext", (offset + numMax == numDisplayed) ? 0 : 1));
ClearViewElement(veScrollbar);
DrawViewElement(veScrollbar, &stringTokens, &intTokens);

View File

@ -284,7 +284,6 @@ void cView::DestroyDetachedViewElement(eViewElement ve) {
detachedViewElements.erase(hit);
}
void cView::ClearAnimations(int cat) {
//stop and delete all animated elements from this viewelement
if (animations.size() == 0)
@ -746,6 +745,7 @@ void cView::DoDrawTextBox(int num, cTemplateFunction *func, int x0, int y0) {
string fontName = func->GetFontName();
int fontSize = func->GetNumericParameter(ptFontSize);
int align = func->GetNumericParameter(ptAlign);
int valign = func->GetNumericParameter(ptValign);
int maxLines = func->GetNumericParameter(ptMaxLines);
tColor clr = func->GetColorParameter(ptColor);
tColor clrBack = clrTransparent;
@ -759,6 +759,14 @@ void cView::DoDrawTextBox(int num, cTemplateFunction *func, int x0, int y0) {
int fontHeight = fontManager->Height(fontName, fontSize);
int lines = wrapper.Lines();
int yLine = y;
if (height > 0 && valign == alCenter) {
int totalHeight = lines * fontHeight;
if (totalHeight < height) {
yLine += (height - totalHeight) / 2;
}
}
for (int line=0; line < lines; line++) {
int xLine = x;
if (align == alCenter) {
@ -771,15 +779,16 @@ void cView::DoDrawTextBox(int num, cTemplateFunction *func, int x0, int y0) {
cPoint pos(xLine, yLine);
if (maxLines > 0 && line == maxLines-1) {
string lastLine = wrapper.GetLine(line);
if (lines > maxLines) {
if (lines > maxLines) {
lastLine += "...";
}
DrawText(num, pos, lastLine.c_str(), clr, clrBack, fontName, fontSize);
DrawText(num, pos, lastLine.c_str(), clr, clrBack, fontName, fontSize);
break;
} else if (height > 0 && yLine - y + 2*fontHeight > height) {
} else if (line != (lines-1) && height > 0 && yLine - y + 2*fontHeight > height) {
DrawText(num, pos, "...", clr, clrBack, fontName, fontSize);
break;
}
esyslog("skindesigner: drawing regular line yLine %d", yLine);
DrawText(num, pos, wrapper.GetLine(line), clr, clrBack, fontName, fontSize);
yLine += fontHeight;
}