summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2015-08-08 11:04:15 +0200
committerlouis <louis.braun@gmx.de>2015-08-08 11:04:15 +0200
commitea758f955655ee48b0c3b0f277c21e8cbc045316 (patch)
tree1326c86deede899b6d8394c611a09831ff1858fe
parentb5c587b2567e4ac838a33363d02ad228d94b9b14 (diff)
downloadvdr-plugin-skindesigner-ea758f955655ee48b0c3b0f277c21e8cbc045316.tar.gz
vdr-plugin-skindesigner-ea758f955655ee48b0c3b0f277c21e8cbc045316.tar.bz2
implemented horizontal menus
-rw-r--r--HISTORY15
-rw-r--r--README9
-rw-r--r--displaymenu.c6
-rw-r--r--displaymenu.h10
-rw-r--r--dtd/displayaudiotracks.dtd2
-rw-r--r--dtd/displaymenu.dtd3
-rw-r--r--dtd/displaymenuplugin.dtd12
-rw-r--r--dtd/functions.dtd1
-rw-r--r--dtd/setup.dtd3
-rw-r--r--libcore/skinsetup.c74
-rw-r--r--libcore/skinsetup.h12
-rw-r--r--libtemplate/globals.c9
-rw-r--r--libtemplate/globals.h1
-rw-r--r--libtemplate/parameter.c18
-rw-r--r--libtemplate/templateview.c202
-rw-r--r--libtemplate/templateview.h24
-rw-r--r--libtemplate/templateviewelement.c9
-rw-r--r--libtemplate/templateviewelement.h1
-rw-r--r--libtemplate/templateviewlist.c11
-rw-r--r--libtemplate/templateviewlist.h1
-rw-r--r--libtemplate/xmlparser.c32
-rw-r--r--patches/vdr-2.2.0_horizontal_menu.patch79
-rw-r--r--setup.c2
-rw-r--r--skins/metrixhd/setup.xml23
-rw-r--r--skins/metrixhd/xmlfiles/displayaudiotracks.xml18
-rw-r--r--skins/metrixhd/xmlfiles/displaychannel.xml153
-rw-r--r--skins/metrixhd/xmlfiles/displaymenu.xml68
-rw-r--r--skins/metrixhd/xmlfiles/displaymenuchannels.xml71
-rw-r--r--skins/metrixhd/xmlfiles/displaymenudefault.xml81
-rw-r--r--skins/metrixhd/xmlfiles/displaymenudetailepg.xml199
-rw-r--r--skins/metrixhd/xmlfiles/displaymenudetailrecording.xml187
-rw-r--r--skins/metrixhd/xmlfiles/displaymenudetailtext.xml28
-rw-r--r--skins/metrixhd/xmlfiles/displaymenumain.xml150
-rw-r--r--skins/metrixhd/xmlfiles/displaymenurecordings.xml208
-rw-r--r--skins/metrixhd/xmlfiles/displaymenuschedules.xml87
-rw-r--r--skins/metrixhd/xmlfiles/displaymenusetup.xml40
-rw-r--r--skins/metrixhd/xmlfiles/displaymenutimers.xml58
-rw-r--r--skins/metrixhd/xmlfiles/displaymessage.xml7
-rw-r--r--skins/metrixhd/xmlfiles/displayreplay.xml199
-rw-r--r--skins/metrixhd/xmlfiles/displayvolume.xml6
-rw-r--r--skins/metrixhd/xmlfiles/plug-setup-skinpreview.xml17
-rw-r--r--skins/metrixhd/xmlfiles/plug-tvguideng-detail.xml208
-rw-r--r--skins/metrixhd/xmlfiles/plug-tvguideng-recmenu.xml174
-rw-r--r--skins/metrixhd/xmlfiles/plug-tvguideng-root.xml97
-rw-r--r--skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecast.xml147
-rw-r--r--skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml27
-rw-r--r--skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml30
-rw-r--r--skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml26
-rw-r--r--views/displaymenulistview.c9
-rw-r--r--views/displaymenulistview.h1
-rw-r--r--views/displaymenurootview.c7
-rw-r--r--views/displaymenurootview.h1
-rw-r--r--views/displaymenuview.c2
-rw-r--r--views/view.c17
54 files changed, 672 insertions, 2210 deletions
diff --git a/HISTORY b/HISTORY
index f0895a1..4a86e9a 100644
--- a/HISTORY
+++ b/HISTORY
@@ -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
diff --git a/README b/README
index ddbb10b..99e5abd 100644
--- a/README
+++ b/README
@@ -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
diff --git a/displaymenu.c b/displaymenu.c
index ea589cb..2e78793 100644
--- a/displaymenu.c
+++ b/displaymenu.c
@@ -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;
diff --git a/displaymenu.h b/displaymenu.h
index 5b697b4..5aee6d1 100644
--- a/displaymenu.h
+++ b/displaymenu.h
@@ -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);
diff --git a/dtd/displayaudiotracks.dtd b/dtd/displayaudiotracks.dtd
index b4b0c59..e4abd21 100644
--- a/dtd/displayaudiotracks.dtd
+++ b/dtd/displayaudiotracks.dtd
@@ -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)*>
diff --git a/dtd/displaymenu.dtd b/dtd/displaymenu.dtd
index 0569d42..ecbc374 100644
--- a/dtd/displaymenu.dtd
+++ b/dtd/displaymenu.dtd
@@ -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)*>
diff --git a/dtd/displaymenuplugin.dtd b/dtd/displaymenuplugin.dtd
index 1f9560f..168d047 100644
--- a/dtd/displaymenuplugin.dtd
+++ b/dtd/displaymenuplugin.dtd
@@ -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
diff --git a/dtd/functions.dtd b/dtd/functions.dtd
index 85ef1f5..7b08437 100644
--- a/dtd/functions.dtd
+++ b/dtd/functions.dtd
@@ -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
diff --git a/dtd/setup.dtd b/dtd/setup.dtd
index d56fc40..15f1928 100644
--- a/dtd/setup.dtd
+++ b/dtd/setup.dtd
@@ -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)+>
diff --git a/libcore/skinsetup.c b/libcore/skinsetup.c
index e52ff41..c9ae7bd 100644
--- a/libcore/skinsetup.c
+++ b/libcore/skinsetup.c
@@ -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();
diff --git a/libcore/skinsetup.h b/libcore/skinsetup.h
index 29649ed..a664ebc 100644
--- a/libcore/skinsetup.h
+++ b/libcore/skinsetup.h
@@ -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);
diff --git a/libtemplate/globals.c b/libtemplate/globals.c
index 822b993..3fd0705 100644
--- a/libtemplate/globals.c
+++ b/libtemplate/globals.c
@@ -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));
diff --git a/libtemplate/globals.h b/libtemplate/globals.h
index d566fac..12ee917 100644
--- a/libtemplate/globals.h
+++ b/libtemplate/globals.h
@@ -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);
diff --git a/libtemplate/parameter.c b/libtemplate/parameter.c
index 21e02e1..d76cb35 100644
--- a/libtemplate/parameter.c
+++ b/libtemplate/parameter.c
@@ -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());
}
} \ No newline at end of file
diff --git a/libtemplate/templateview.c b/libtemplate/templateview.c
index fcedee8..78d6fdf 100644
--- a/libtemplate/templateview.c
+++ b/libtemplate/templateview.c
@@ -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) {
diff --git a/libtemplate/templateview.h b/libtemplate/templateview.h
index 726ce68..1713cdc 100644
--- a/libtemplate/templateview.h
+++ b/libtemplate/templateview.h
@@ -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);
};
diff --git a/libtemplate/templateviewelement.c b/libtemplate/templateviewelement.c
index 0171bdb..56672b8 100644
--- a/libtemplate/templateviewelement.c
+++ b/libtemplate/templateviewelement.c
@@ -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();
}
diff --git a/libtemplate/templateviewelement.h b/libtemplate/templateviewelement.h
index 32f2ecc..189e9e5 100644
--- a/libtemplate/templateviewelement.h
+++ b/libtemplate/templateviewelement.h
@@ -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);
diff --git a/libtemplate/templateviewlist.c b/libtemplate/templateviewlist.c
index 1d5dabe..a831d2d 100644
--- a/libtemplate/templateviewlist.c
+++ b/libtemplate/templateviewlist.c
@@ -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;
diff --git a/libtemplate/templateviewlist.h b/libtemplate/templateviewlist.h
index 5806745..4cc4ccb 100644
--- a/libtemplate/templateviewlist.h
+++ b/libtemplate/templateviewlist.h
@@ -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);
diff --git a/libtemplate/xmlparser.c b/libtemplate/xmlparser.c
index ce41918..ba5684e 100644
--- a/libtemplate/xmlparser.c
+++ b/libtemplate/xmlparser.c
@@ -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) {
diff --git a/patches/vdr-2.2.0_horizontal_menu.patch b/patches/vdr-2.2.0_horizontal_menu.patch
new file mode 100644
index 0000000..a7fae81
--- /dev/null
+++ b/patches/vdr-2.2.0_horizontal_menu.patch
@@ -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
diff --git a/setup.c b/setup.c
index e2abab4..f8fae07 100644
--- a/setup.c
+++ b/setup.c
@@ -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));
}
}
diff --git a/skins/metrixhd/setup.xml b/skins/metrixhd/setup.xml
index 4ed34b8..ad1d246 100644
--- a/skins/metrixhd/setup.xml
+++ b/skins/metrixhd/setup.xml
@@ -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>
diff --git a/skins/metrixhd/xmlfiles/displayaudiotracks.xml b/skins/metrixhd/xmlfiles/displayaudiotracks.xml
index 8c5af98..def251b 100644
--- a/skins/metrixhd/xmlfiles/displayaudiotracks.xml
+++ b/skins/metrixhd/xmlfiles/displayaudiotracks.xml
@@ -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">
diff --git a/skins/metrixhd/xmlfiles/displaychannel.xml b/skins/metrixhd/xmlfiles/displaychannel.xml
index 13b9c07..9817b9d 100644
--- a/skins/metrixhd/xmlfiles/displaychannel.xml
+++ b/skins/metrixhd/xmlfiles/displaychannel.xml
@@ -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>
diff --git a/skins/metrixhd/xmlfiles/displaymenu.xml b/skins/metrixhd/xmlfiles/displaymenu.xml
index 1389bef..53b70fb 100644
--- a/skins/metrixhd/xmlfiles/displaymenu.xml
+++ b/skins/metrixhd/xmlfiles/displaymenu.xml
@@ -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}" />
diff --git a/skins/metrixhd/xmlfiles/displaymenuchannels.xml b/skins/metrixhd/xmlfiles/displaymenuchannels.xml
index 3e6f771..5b3a184 100644
--- a/skins/metrixhd/xmlfiles/displaymenuchannels.xml
+++ b/skins/metrixhd/xmlfiles/displaymenuchannels.xml
@@ -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> \ No newline at end of file
+</menuchannels>
diff --git a/skins/metrixhd/xmlfiles/displaymenudefault.xml b/skins/metrixhd/xmlfiles/displaymenudefault.xml
index d3f56c1..de4b49a 100644
--- a/skins/metrixhd/xmlfiles/displaymenudefault.xml
+++ b/skins/metrixhd/xmlfiles/displaymenudefault.xml
@@ -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}" />
diff --git a/skins/metrixhd/xmlfiles/displaymenudetailepg.xml b/skins/metrixhd/xmlfiles/displaymenudetailepg.xml
index 39bd991..0f5c224 100644
--- a/skins/metrixhd/xmlfiles/displaymenudetailepg.xml
+++ b/skins/metrixhd/xmlfiles/displaymenudetailepg.xml
@@ -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> \ No newline at end of file
+</menudetailedepg>
diff --git a/skins/metrixhd/xmlfiles/displaymenudetailrecording.xml b/skins/metrixhd/xmlfiles/displaymenudetailrecording.xml
index 47f096d..dfcd5ac 100644
--- a/skins/metrixhd/xmlfiles/displaymenudetailrecording.xml
+++ b/skins/metrixhd/xmlfiles/displaymenudetailrecording.xml
@@ -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">
diff --git a/skins/metrixhd/xmlfiles/displaymenudetailtext.xml b/skins/metrixhd/xmlfiles/displaymenudetailtext.xml
index 5fd8997..59cda9b 100644
--- a/skins/metrixhd/xmlfiles/displaymenudetailtext.xml
+++ b/skins/metrixhd/xmlfiles/displaymenudetailtext.xml
@@ -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> \ No newline at end of file
+</menudetailedtext>
diff --git a/skins/metrixhd/xmlfiles/displaymenumain.xml b/skins/metrixhd/xmlfiles/displaymenumain.xml
index 775b435..7bd8e33 100644
--- a/skins/metrixhd/xmlfiles/displaymenumain.xml
+++ b/skins/metrixhd/xmlfiles/displaymenumain.xml
@@ -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}" />
diff --git a/skins/metrixhd/xmlfiles/displaymenurecordings.xml b/skins/metrixhd/xmlfiles/displaymenurecordings.xml
index 6e8f527..9cef713 100644
--- a/skins/metrixhd/xmlfiles/displaymenurecordings.xml
+++ b/skins/metrixhd/xmlfiles/displaymenurecordings.xml
@@ -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> \ No newline at end of file
+
+ <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>
diff --git a/skins/metrixhd/xmlfiles/displaymenuschedules.xml b/skins/metrixhd/xmlfiles/displaymenuschedules.xml
index d1f0428..b32ea99 100644
--- a/skins/metrixhd/xmlfiles/displaymenuschedules.xml
+++ b/skins/metrixhd/xmlfiles/displaymenuschedules.xml
@@ -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> \ No newline at end of file
+</menuschedules>
diff --git a/skins/metrixhd/xmlfiles/displaymenusetup.xml b/skins/metrixhd/xmlfiles/displaymenusetup.xml
index d2fc400..4e2ae0f 100644
--- a/skins/metrixhd/xmlfiles/displaymenusetup.xml
+++ b/skins/metrixhd/xmlfiles/displaymenusetup.xml
@@ -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}" />
diff --git a/skins/metrixhd/xmlfiles/displaymenutimers.xml b/skins/metrixhd/xmlfiles/displaymenutimers.xml
index 5eb453f..b9be696 100644
--- a/skins/metrixhd/xmlfiles/displaymenutimers.xml
+++ b/skins/metrixhd/xmlfiles/displaymenutimers.xml
@@ -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> \ No newline at end of file
+</menutimers>
diff --git a/skins/metrixhd/xmlfiles/displaymessage.xml b/skins/metrixhd/xmlfiles/displaymessage.xml
index 3a398bf..1ab2bd5 100644
--- a/skins/metrixhd/xmlfiles/displaymessage.xml
+++ b/skins/metrixhd/xmlfiles/displaymessage.xml
@@ -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}" />
diff --git a/skins/metrixhd/xmlfiles/displayreplay.xml b/skins/metrixhd/xmlfiles/displayreplay.xml
index 6993f9a..d2fa71b 100644
--- a/skins/metrixhd/xmlfiles/displayreplay.xml
+++ b/skins/metrixhd/xmlfiles/displayreplay.xml
@@ -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}" />
diff --git a/skins/metrixhd/xmlfiles/displayvolume.xml b/skins/metrixhd/xmlfiles/displayvolume.xml
index f33f653..db78bde 100644
--- a/skins/metrixhd/xmlfiles/displayvolume.xml
+++ b/skins/metrixhd/xmlfiles/displayvolume.xml
@@ -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}%" />
diff --git a/skins/metrixhd/xmlfiles/plug-setup-skinpreview.xml b/skins/metrixhd/xmlfiles/plug-setup-skinpreview.xml
index 32115e3..8642626 100644
--- a/skins/metrixhd/xmlfiles/plug-setup-skinpreview.xml
+++ b/skins/metrixhd/xmlfiles/plug-setup-skinpreview.xml
@@ -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}" />
diff --git a/skins/metrixhd/xmlfiles/plug-tvguideng-detail.xml b/skins/metrixhd/xmlfiles/plug-tvguideng-detail.xml
index ef8403d..e6ab374 100644
--- a/skins/metrixhd/xmlfiles/plug-tvguideng-detail.xml
+++ b/skins/metrixhd/xmlfiles/plug-tvguideng-detail.xml
@@ -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">
diff --git a/skins/metrixhd/xmlfiles/plug-tvguideng-recmenu.xml b/skins/metrixhd/xmlfiles/plug-tvguideng-recmenu.xml
index d2f3174..058f1f5 100644
--- a/skins/metrixhd/xmlfiles/plug-tvguideng-recmenu.xml
+++ b/skins/metrixhd/xmlfiles/plug-tvguideng-recmenu.xml
@@ -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"/>
diff --git a/skins/metrixhd/xmlfiles/plug-tvguideng-root.xml b/skins/metrixhd/xmlfiles/plug-tvguideng-root.xml
index 3a909f2..442c921 100644
--- a/skins/metrixhd/xmlfiles/plug-tvguideng-root.xml
+++ b/skins/metrixhd/xmlfiles/plug-tvguideng-root.xml
@@ -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>
diff --git a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecast.xml b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecast.xml
index e4f4960..08b85ab 100644
--- a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecast.xml
+++ b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecast.xml
@@ -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>
diff --git a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml
index 4932759..365abf7 100644
--- a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml
+++ b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml
@@ -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}" />
diff --git a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml
index 10b588c..802fa90 100644
--- a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml
+++ b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml
@@ -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}" />
diff --git a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml
index c21c62a..86670fa 100644
--- a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml
+++ b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml
@@ -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}" />
diff --git a/views/displaymenulistview.c b/views/displaymenulistview.c
index 29927b2..b96bdc2 100644
--- a/views/displaymenulistview.c
+++ b/views/displaymenulistview.c
@@ -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++) {
diff --git a/views/displaymenulistview.h b/views/displaymenulistview.h
index c7aba12..3acba56 100644
--- a/views/displaymenulistview.h
+++ b/views/displaymenulistview.h
@@ -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);
diff --git a/views/displaymenurootview.c b/views/displaymenurootview.c
index bf3981f..2d4e457 100644
--- a/views/displaymenurootview.c
+++ b/views/displaymenurootview.c
@@ -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);
diff --git a/views/displaymenurootview.h b/views/displaymenurootview.h
index cec7708..294b6ee 100644
--- a/views/displaymenurootview.h
+++ b/views/displaymenurootview.h
@@ -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);
diff --git a/views/displaymenuview.c b/views/displaymenuview.c
index 9f732e2..53ab558 100644
--- a/views/displaymenuview.c
+++ b/views/displaymenuview.c
@@ -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);
diff --git a/views/view.c b/views/view.c
index ad1635c..c2cfea9 100644
--- a/views/view.c
+++ b/views/view.c
@@ -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;
}