mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
				synced 2023-10-19 15:58:31 +00:00 
			
		
		
		
	added Plugin Interface
This commit is contained in:
		
							
								
								
									
										1
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -56,4 +56,5 @@ Version 0.0.3 | ||||
| - fixed Bug with menuselection Patch | ||||
| - added tokens {month}, {monthname} and {year} in displaymenutimers listitem and currentitem | ||||
| - added dedicated tokens for posters and banners in <srapercontent> in displaychannel and displayreplay | ||||
| - added Plugin Interface | ||||
|  | ||||
|   | ||||
							
								
								
									
										17
									
								
								config.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								config.c
									
									
									
									
									
								
							| @@ -171,6 +171,23 @@ cString cDesignerConfig::GetSkinRessourcePath(void) { | ||||
|     return cString::sprintf("%s%s", *skinPath, osdSkin.c_str()); | ||||
| } | ||||
|  | ||||
| void cDesignerConfig::AddPlugin(string name, map < int, string > &menus) { | ||||
|     plugins.insert(pair< string, map < int, string > >(name, menus)); | ||||
| } | ||||
|  | ||||
| void cDesignerConfig::InitPluginIterator(void) { | ||||
|     plugIt = plugins.begin(); | ||||
| } | ||||
|  | ||||
| map <int,string> *cDesignerConfig::GetPluginTemplates(string &name) { | ||||
|     if (plugIt == plugins.end()) | ||||
|         return NULL; | ||||
|     name = plugIt->first; | ||||
|     map <int,string> *templates = &plugIt->second; | ||||
|     plugIt++; | ||||
|     return templates;  | ||||
| } | ||||
|  | ||||
| cString cDesignerConfig::CheckSlashAtEnd(std::string path) { | ||||
|     try { | ||||
|         if (!(path.at(path.size()-1) == '/')) | ||||
|   | ||||
							
								
								
									
										7
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								config.h
									
									
									
									
									
								
							| @@ -13,7 +13,7 @@ | ||||
|  | ||||
| class cDesignerConfig { | ||||
| private: | ||||
|     cString CheckSlashAtEnd(std::string path); | ||||
|     cString CheckSlashAtEnd(string path); | ||||
|     bool epgImagePathSet; | ||||
|     bool skinPathSet; | ||||
|     bool logoPathSet; | ||||
| @@ -23,6 +23,8 @@ private: | ||||
|     string fontFix; | ||||
|     string fontOsd; | ||||
|     string fontSml; | ||||
|     map < string, map < int, string > > plugins; | ||||
|     map < string, map < int, string > >::iterator plugIt; | ||||
| public: | ||||
|     cDesignerConfig(); | ||||
|     ~cDesignerConfig(); | ||||
| @@ -43,6 +45,9 @@ public: | ||||
|     void SetOSDFonts(void); | ||||
|     bool OsdFontsChanged(void); | ||||
|     cString GetSkinRessourcePath(void); | ||||
|     void AddPlugin(string name, map < int, string > &menus); | ||||
|     void InitPluginIterator(void); | ||||
|     map <int,string> *GetPluginTemplates(string &name); | ||||
|     cString logoExtension; | ||||
|     cString skinPath; | ||||
|     cString logoPath; | ||||
|   | ||||
							
								
								
									
										16
									
								
								designer.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								designer.c
									
									
									
									
									
								
							| @@ -16,6 +16,8 @@ cSkinDesigner::cSkinDesigner(string skin) : cSkin(skin.c_str(), &::Theme) { | ||||
|     volumeTemplate = NULL; | ||||
|     audiotracksTemplate = NULL; | ||||
|  | ||||
|     currentMenu = NULL; | ||||
|  | ||||
|     dsyslog("skindesigner: skin %s started", skin.c_str()); | ||||
| } | ||||
|  | ||||
| @@ -32,6 +34,7 @@ const char *cSkinDesigner::Description(void) { | ||||
| } | ||||
|  | ||||
| cSkinDisplayChannel *cSkinDesigner::DisplayChannel(bool WithInfo) { | ||||
|     currentMenu = NULL; | ||||
|     cSkinDisplayChannel *displayChannel = NULL; | ||||
|     if (!useBackupSkin) { | ||||
|         Init(); | ||||
| @@ -43,18 +46,22 @@ cSkinDisplayChannel *cSkinDesigner::DisplayChannel(bool WithInfo) { | ||||
| } | ||||
|  | ||||
| cSkinDisplayMenu *cSkinDesigner::DisplayMenu(void) { | ||||
|     cSkinDisplayMenu *displayMenu = NULL; | ||||
|     if (!useBackupSkin) { | ||||
|         cSDDisplayMenu *displayMenu = NULL; | ||||
|         Init(); | ||||
|         firstDisplay = false; | ||||
|         displayMenu = new cSDDisplayMenu(menuTemplate); | ||||
|         currentMenu = displayMenu; | ||||
|         return displayMenu; | ||||
|     } else { | ||||
|         displayMenu = backupSkin->DisplayMenu(); | ||||
|         cSkinDisplayMenu *displayMenu = backupSkin->DisplayMenu(); | ||||
|         currentMenu = NULL; | ||||
|         return displayMenu; | ||||
|     } | ||||
|     return displayMenu; | ||||
| } | ||||
|  | ||||
| cSkinDisplayReplay *cSkinDesigner::DisplayReplay(bool ModeOnly) { | ||||
|     currentMenu = NULL; | ||||
|     cSkinDisplayReplay *displayReplay = NULL; | ||||
|     if (!useBackupSkin) { | ||||
|         Init(); | ||||
| @@ -66,6 +73,7 @@ cSkinDisplayReplay *cSkinDesigner::DisplayReplay(bool ModeOnly) { | ||||
| } | ||||
|  | ||||
| cSkinDisplayVolume *cSkinDesigner::DisplayVolume(void) { | ||||
|     currentMenu = NULL; | ||||
|     cSkinDisplayVolume *displayVolume = NULL; | ||||
|     if (!useBackupSkin) { | ||||
|         Init(); | ||||
| @@ -77,6 +85,7 @@ cSkinDisplayVolume *cSkinDesigner::DisplayVolume(void) { | ||||
| } | ||||
|  | ||||
| cSkinDisplayTracks *cSkinDesigner::DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks) { | ||||
|     currentMenu = NULL; | ||||
|     cSkinDisplayTracks *displayTracks = NULL; | ||||
|     if (!useBackupSkin) { | ||||
|         Init(); | ||||
| @@ -88,6 +97,7 @@ cSkinDisplayTracks *cSkinDesigner::DisplayTracks(const char *Title, int NumTrack | ||||
| } | ||||
|  | ||||
| cSkinDisplayMessage *cSkinDesigner::DisplayMessage(void) { | ||||
|     currentMenu = NULL; | ||||
|     cSkinDisplayMessage *displayMessage = NULL; | ||||
|     if (!useBackupSkin) { | ||||
|         Init(); | ||||
|   | ||||
| @@ -25,6 +25,7 @@ private: | ||||
|     cTemplate *replayTemplate; | ||||
|     cTemplate *volumeTemplate; | ||||
|     cTemplate *audiotracksTemplate; | ||||
|     cSDDisplayMenu *currentMenu; | ||||
|     void Init(void); | ||||
|     void ReloadCaches(void); | ||||
|     void DeleteTemplates(void); | ||||
| @@ -45,6 +46,7 @@ public: | ||||
|     void ListAvailableFonts(void); | ||||
|     bool SetCustomToken(string option); | ||||
|     void ListCustomTokens(void); | ||||
|     cSDDisplayMenu *GetDisplayMenu(void) { return currentMenu; }; | ||||
| }; | ||||
|  | ||||
| #endif //__SKINDESIGNER_H | ||||
|   | ||||
| @@ -5,6 +5,9 @@ cSDDisplayMenu::cSDDisplayMenu(cTemplate *menuTemplate) { | ||||
|     textAreaFont = NULL;  | ||||
|     doOutput = true; | ||||
|     state = vsInit; | ||||
|     pluginMenu = -1; | ||||
|     pluginName = ""; | ||||
|     pluginMenuType = mtUnknown; | ||||
|     if (!menuTemplate) { | ||||
|         doOutput = false; | ||||
|         esyslog("skindesigner: displayMenu no valid template - aborting"); | ||||
| @@ -53,6 +56,16 @@ void cSDDisplayMenu::SetMenuCategory(eMenuCategory MenuCat) { | ||||
|         state = vsMenuInit; | ||||
| } | ||||
|  | ||||
| void cSDDisplayMenu::SetPluginMenu(string name, int menu, int type, bool init) { | ||||
|     pluginName = name; | ||||
|     pluginMenu = menu; | ||||
|     pluginMenuType = (ePluginMenuType)type; | ||||
|     rootView->SetPluginMenu(pluginName, pluginMenu, pluginMenuType); | ||||
|     if (!init) { | ||||
|         rootView->SetMenu(mcPlugin, false);         | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cSDDisplayMenu::SetTitle(const char *Title) { | ||||
|     if (!doOutput) | ||||
|         return; | ||||
| @@ -146,6 +159,22 @@ bool cSDDisplayMenu::SetItemRecording(const cRecording *Recording, int Index, bo | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool cSDDisplayMenu::SetItemPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens, int Index, bool Current, bool Selectable) { | ||||
|     if (!doOutput) | ||||
|         return true; | ||||
|     if (!rootView->SubViewAvailable()) | ||||
|         return false; | ||||
|     if (config.blockFlush) | ||||
|         rootView->LockFlush(); | ||||
|     cDisplayMenuListView *list = rootView->GetListView(); | ||||
|     if (!list) | ||||
|         return false; | ||||
|     list->AddPluginMenuItem(stringTokens, intTokens, loopTokens, Index, Current, Selectable); | ||||
|     if (state == vsIdle) | ||||
|         state = vsMenuUpdate; | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| void cSDDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable) { | ||||
|     if (!doOutput) | ||||
|         return; | ||||
| @@ -222,6 +251,14 @@ void cSDDisplayMenu::SetText(const char *Text, bool FixedFont) { | ||||
|     state = vsMenuDetail; | ||||
| } | ||||
|  | ||||
| bool cSDDisplayMenu::SetPluginText(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens) { | ||||
|     if (!doOutput) | ||||
|         return true; | ||||
|     bool tmplOk = rootView->SetDetailedViewPlugin(stringTokens, intTokens, loopTokens); | ||||
|     state = vsMenuDetail; | ||||
|     return tmplOk; | ||||
| } | ||||
|  | ||||
| void cSDDisplayMenu::Flush(void) { | ||||
|     if (!doOutput) | ||||
|         return; | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| #ifndef __DISPLAYMENU_H | ||||
| #define __DISPLAYMENU_H | ||||
|  | ||||
| #include "designer.h" | ||||
| #include "libtemplate/template.h" | ||||
| #include "views/displaymenurootview.h" | ||||
|  | ||||
| @@ -18,6 +17,9 @@ private: | ||||
|     cDisplayMenuRootView *rootView; | ||||
|     eViewState state; | ||||
|     bool doOutput; | ||||
|     string pluginName; | ||||
|     int pluginMenu; | ||||
|     ePluginMenuType pluginMenuType; | ||||
|     mutable cFont *textAreaFont; | ||||
| protected: | ||||
|     int Tab(int n); | ||||
| @@ -28,6 +30,7 @@ public: | ||||
|     virtual int MaxItems(void); | ||||
|     virtual void Clear(void); | ||||
|     virtual void SetMenuCategory(eMenuCategory MenuCat); | ||||
|     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); | ||||
|     virtual void SetMessage(eMessageType Type, const char *Text); | ||||
| @@ -36,10 +39,12 @@ public: | ||||
|     virtual bool SetItemTimer(const cTimer *Timer, int Index, bool Current, bool Selectable); | ||||
|     virtual bool SetItemChannel(const cChannel *Channel, int Index, bool Current, bool Selectable, bool WithProvider); | ||||
|     virtual bool SetItemRecording(const cRecording *Recording, int Index, bool Current, bool Selectable, int Level, int Total, int New); | ||||
|     virtual bool SetItemPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens, int Index, bool Current, bool Selectable); | ||||
|     virtual void SetScrollbar(int Total, int Offset); | ||||
|     virtual void SetEvent(const cEvent *Event); | ||||
|     virtual void SetRecording(const cRecording *Recording); | ||||
|     virtual void SetText(const char *Text, bool FixedFont); | ||||
|     virtual bool SetPluginText(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens); | ||||
|     virtual void Flush(void); | ||||
|     virtual void SetTabs(int Tab1, int Tab2 = 0, int Tab3 = 0, int Tab4 = 0, int Tab5 = 0); | ||||
|     virtual int GetTextAreaWidth(void) const; | ||||
|   | ||||
							
								
								
									
										96
									
								
								dtd/displaymenuplugin.dtd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								dtd/displaymenuplugin.dtd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| <?xml encoding="UTF-8"?> | ||||
|  | ||||
| <!ENTITY % functions SYSTEM "functions.dtd"> | ||||
|  | ||||
| <!ELEMENT menuplugin (background|header|datetime|message|colorbuttons|scrollbar|detailheader|menuitems|tab|tablabels)*> | ||||
| <!ATTLIST menuplugin | ||||
|   x CDATA #REQUIRED | ||||
|   y CDATA #REQUIRED | ||||
|   width CDATA #REQUIRED | ||||
|   height CDATA #REQUIRED | ||||
|   fadetime CDATA #IMPLIED | ||||
|   scaletvx CDATA #IMPLIED | ||||
|   scaletvy CDATA #IMPLIED | ||||
|   scaletvwidth CDATA #IMPLIED | ||||
|   scaletvheight CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT background (area)*> | ||||
| <!ATTLIST background | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT header (area|areascroll)*> | ||||
| <!ATTLIST header | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT datetime (area|areascroll)*> | ||||
| <!ATTLIST datetime | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT message (area|areascroll)*> | ||||
| <!ATTLIST message | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT colorbuttons (area|areascroll)*> | ||||
| <!ATTLIST colorbuttons | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT scrollbar (area|areascroll)*> | ||||
| <!ATTLIST scrollbar | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT detailheader (area|areascroll)*> | ||||
| <!ATTLIST detailheader | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT tablabels (area|areascroll)*> | ||||
| <!ATTLIST tablabels | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT menuitems (listelement,currentelement?)> | ||||
| <!ATTLIST menuitems | ||||
|   x CDATA #REQUIRED | ||||
|   y CDATA #REQUIRED | ||||
|   width CDATA #REQUIRED | ||||
|   height CDATA #REQUIRED | ||||
|   align (left|top|center|bottom|right) #IMPLIED | ||||
|   menuitemwidth CDATA #IMPLIED | ||||
|   numlistelements CDATA #REQUIRED | ||||
|   orientation (horizontal|vertical) #REQUIRED | ||||
| > | ||||
|  | ||||
| <!ELEMENT listelement (area|areascroll)*> | ||||
| <!ATTLIST listelement | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT currentelement (area|areascroll)*> | ||||
| <!ATTLIST currentelement | ||||
|   delay CDATA #REQUIRED | ||||
|   fadetime CDATA #IMPLIED | ||||
|   debug CDATA #IMPLIED | ||||
| > | ||||
|  | ||||
| <!ELEMENT tab (loop|fill|drawtext|drawtextbox|drawimage|drawrectangle|drawellipse)*> | ||||
| <!ATTLIST tab | ||||
|   x CDATA #REQUIRED | ||||
|   y CDATA #REQUIRED | ||||
|   width CDATA #REQUIRED | ||||
|   height CDATA #REQUIRED | ||||
|   layer CDATA #REQUIRED | ||||
|   name CDATA #REQUIRED | ||||
|   scrollheight CDATA #REQUIRED | ||||
|   transparency CDATA #IMPLIED | ||||
|   condition CDATA #IMPLIED | ||||
|   debug (true|false) #IMPLIED | ||||
| > | ||||
|  | ||||
| %functions; | ||||
| @@ -53,7 +53,24 @@ bool cTemplate::ReadFromXML(void) { | ||||
|     if (!parser.ParseView()) { | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
|     //read additional plugin templates | ||||
|     bool ok = true; | ||||
|     if (viewType == vtDisplayMenu) { | ||||
|         config.InitPluginIterator(); | ||||
|         map <int,string> *plugTemplates = NULL; | ||||
|         string plugName; | ||||
|         while ( plugTemplates = config.GetPluginTemplates(plugName) ) { | ||||
|             for (map <int,string>::iterator it = plugTemplates->begin(); it != plugTemplates->end(); it++) { | ||||
|                 int templateNumber = it->first; | ||||
|                 stringstream templateName; | ||||
|                 templateName << "plug-" << plugName << "-" << it->second.c_str(); | ||||
|                 if (parser.ReadPluginView(plugName, templateNumber, templateName.str())) { | ||||
|                     ok = parser.ParsePluginView(plugName, templateNumber); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return ok; | ||||
| } | ||||
|  | ||||
| void cTemplate::SetGlobals(cGlobals *globals) {  | ||||
|   | ||||
| @@ -26,6 +26,17 @@ cTemplateView::~cTemplateView() { | ||||
|         delete *it; | ||||
|     } | ||||
|  | ||||
|     for (map < eSubView, cTemplateView* >::iterator it = subViews.begin(); it != subViews.end(); it++) { | ||||
|         delete it->second; | ||||
|     } | ||||
|  | ||||
|     for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it != pluginViews.end(); it++) { | ||||
|         map< int, cTemplateView*> plugViews = it->second; | ||||
|         for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) { | ||||
|             delete it2->second; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (parameters) | ||||
|         delete parameters; | ||||
|  | ||||
| @@ -93,6 +104,22 @@ cTemplateView *cTemplateView::GetSubView(eSubView sv) { | ||||
|     return hit->second; | ||||
| } | ||||
|  | ||||
| cTemplateView *cTemplateView::GetPluginView(string pluginName, int pluginMenu) { | ||||
|     map < string, map< int, cTemplateView*> >::iterator hit = pluginViews.find(pluginName); | ||||
|  | ||||
|     if (hit == pluginViews.end()) | ||||
|        return NULL; | ||||
|  | ||||
|     map< int, cTemplateView*> plugViews = hit->second; | ||||
|     map< int, cTemplateView*>::iterator hit2 = plugViews.find(pluginMenu); | ||||
|  | ||||
|     if (hit2 == plugViews.end()) | ||||
|         return NULL; | ||||
|  | ||||
|     return hit2->second; | ||||
| } | ||||
|  | ||||
|  | ||||
| void cTemplateView::InitViewTabIterator(void) { | ||||
|     vtIt = viewTabs.begin(); | ||||
| } | ||||
| @@ -388,6 +415,15 @@ void cTemplateView::PreCache(bool isSubview) { | ||||
|         subView->PreCache(true); | ||||
|     } | ||||
|  | ||||
|     //Cache Plugin Subviews | ||||
|     for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it != pluginViews.end(); it++) { | ||||
|         map< int, cTemplateView*> plugViews = it->second; | ||||
|         for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) { | ||||
|             cTemplateView *plugView = it2->second; | ||||
|             plugView->SetContainer(0, 0, osdWidth, osdHeight); | ||||
|             plugView->PreCache(true); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cTemplateView::Debug(void) { | ||||
| @@ -418,6 +454,15 @@ void cTemplateView::Debug(void) { | ||||
|         cTemplateView *subView = it->second; | ||||
|         subView->Debug();        | ||||
|     } | ||||
|      | ||||
|     for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it!= pluginViews.end(); it++) { | ||||
|         esyslog("skindesigner: ++++++++ Plugin: %s", it->first.c_str()); | ||||
|         map< int, cTemplateView*> plugViews = it->second; | ||||
|         for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) { | ||||
|             esyslog("skindesigner: Tmpl %d", it2->first); | ||||
|             ((cTemplateView*)it2->second)->Debug(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @@ -934,6 +979,19 @@ cTemplateViewMenu::cTemplateViewMenu(void) { | ||||
|     attributes.insert("scrollheight"); | ||||
|     funcsAllowed.insert(pair< string, set<string> >("tab", attributes)); | ||||
|  | ||||
|     //definition of allowed parameters for plugin menus | ||||
|     attributes.clear(); | ||||
|     attributes.insert("x"); | ||||
|     attributes.insert("y"); | ||||
|     attributes.insert("width"); | ||||
|     attributes.insert("height"); | ||||
|     attributes.insert("fadetime"); | ||||
|     attributes.insert("scaletvx"); | ||||
|     attributes.insert("scaletvy"); | ||||
|     attributes.insert("scaletvwidth"); | ||||
|     attributes.insert("scaletvheight"); | ||||
|     funcsAllowed.insert(pair< string, set<string> >("menuplugin", attributes)); | ||||
|  | ||||
|     SetSubViews(); | ||||
|     SetViewElements(); | ||||
|     SetViewLists(); | ||||
| @@ -1120,6 +1178,20 @@ void cTemplateViewMenu::AddSubView(string sSubView, cTemplateView *subView) { | ||||
|     subViews.insert(pair<eSubView, cTemplateView*>(sv, subView)); | ||||
| } | ||||
|  | ||||
| void cTemplateViewMenu::AddPluginView(string plugName, int templNo, cTemplateView *plugView) { | ||||
|     plugView->SetGlobals(globals); | ||||
|  | ||||
|     map < string, map< int, cTemplateView*> >::iterator hit = pluginViews.find(plugName); | ||||
|  | ||||
|     if (hit == pluginViews.end()) { | ||||
|         map< int, cTemplateView*> plugTemplates; | ||||
|         plugTemplates.insert(pair<int, cTemplateView*>(templNo, plugView)); | ||||
|         pluginViews.insert(pair< string, map< int, cTemplateView*> >(plugName, plugTemplates)); | ||||
|     } else { | ||||
|         hit->second.insert(pair<int, cTemplateView*>(templNo, plugView)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cTemplateViewMenu::AddPixmap(string sViewElement, cTemplatePixmap *pix, bool debugViewElement) { | ||||
|     eViewElement ve = veUndefined; | ||||
|      | ||||
|   | ||||
| @@ -32,7 +32,8 @@ enum eSubView { | ||||
|     svMenuChannels, | ||||
|     svMenuDetailedEpg, | ||||
|     svMenuDetailedRecording, | ||||
|     svMenuDetailedText | ||||
|     svMenuDetailedText, | ||||
|     svMenuPlugin, | ||||
| }; | ||||
|  | ||||
| class cTemplateView { | ||||
| @@ -51,6 +52,7 @@ protected: | ||||
|     map < eViewList, cTemplateViewList* > viewLists; | ||||
|     map < eSubView, cTemplateView* > subViews; | ||||
|     vector< cTemplateViewTab* > viewTabs; | ||||
|     map < string, map< int, cTemplateView*> > pluginViews; | ||||
|     //helpers to iterate data structures | ||||
|     map < eViewElement, cTemplateViewElement* >::iterator veIt; | ||||
|     map < eViewList, cTemplateViewList* >::iterator vlIt; | ||||
| @@ -68,7 +70,8 @@ public: | ||||
|     virtual string GetSubViewName(eSubView sv) { return ""; }; | ||||
|     virtual string GetViewElementName(eViewElement ve) { return ""; }; | ||||
|     virtual string GetViewListName(eViewList vl) { return ""; }; | ||||
|     virtual void AddSubView(string sSubView, cTemplateView *subView) {};     | ||||
|     virtual void AddSubView(string sSubView, cTemplateView *subView) {}; | ||||
|     virtual void AddPluginView(string plugName, int templNo, cTemplateView *plugView) {}; | ||||
|     virtual void AddPixmap(string sViewElement, cTemplatePixmap *pix, bool debugViewElement) {}; | ||||
|     virtual void AddViewList(string sViewList, cTemplateViewList *viewList) {}; | ||||
|     virtual void AddViewTab(cTemplateViewTab *viewTab) {}; | ||||
| @@ -84,6 +87,7 @@ public: | ||||
|     cTemplateViewList *GetViewList(eViewList vl); | ||||
|     void InitViewListIterator(void); | ||||
|     cTemplateViewList *GetNextViewList(void); | ||||
|     bool IsListView(void) { return viewLists.size() > 0 ? true : false; }; | ||||
|     //access tabs | ||||
|     void InitViewTabIterator(void); | ||||
|     cTemplateViewTab *GetNextViewTab(void); | ||||
| @@ -91,6 +95,8 @@ public: | ||||
|     cTemplateView *GetSubView(eSubView sv); | ||||
|     void InitSubViewIterator(void); | ||||
|     cTemplateView *GetNextSubView(void); | ||||
|     //access plugin views | ||||
|     cTemplateView *GetPluginView(string pluginName, int pluginMenu); | ||||
|     //Getter Functions | ||||
|     const char *GetViewName(void) { return viewName.c_str(); }; | ||||
|     int GetNumericParameter(eParamType type); | ||||
| @@ -140,6 +146,7 @@ public: | ||||
|     string GetViewElementName(eViewElement ve); | ||||
|     string GetViewListName(eViewList vl); | ||||
|     void AddSubView(string sSubView, cTemplateView *subView); | ||||
|     void AddPluginView(string plugName, int templNo, cTemplateView *plugView); | ||||
|     void AddPixmap(string viewElement, cTemplatePixmap *pix, bool debugViewElement); | ||||
|     void AddViewList(string sViewList, cTemplateViewList *viewList); | ||||
|     void AddViewTab(cTemplateViewTab *viewTab); | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| #include "xmlparser.h" | ||||
| #include "../config.h" | ||||
| #include "../libcore/helpers.h" | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| @@ -61,6 +62,33 @@ bool cXmlParser::ReadView(cTemplateView *view, string xmlFile) { | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool cXmlParser::ReadPluginView(string plugName, int templateNumber, string templateName) { | ||||
|  | ||||
|     string xmlPath = GetPath(templateName); | ||||
|  | ||||
|     if (!FileExists(xmlPath) || ctxt == NULL) { | ||||
|         return false; | ||||
|     } | ||||
|     DeleteDocument(); | ||||
|     doc = xmlCtxtReadFile(ctxt, xmlPath.c_str(), NULL, XML_PARSE_NOENT | XML_PARSE_DTDVALID); | ||||
|      | ||||
|     if (doc == NULL) { | ||||
|         return false; | ||||
|     } | ||||
|     if (ctxt->valid == 0) { | ||||
|         esyslog("skindesigner: Failed to validate %s", xmlPath.c_str()); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     root = xmlDocGetRootElement(doc); | ||||
|  | ||||
|     if (root == NULL) { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool cXmlParser::ReadGlobals(cGlobals *globals, string xmlFile) { | ||||
|     this->globals = globals; | ||||
|      | ||||
| @@ -132,6 +160,42 @@ bool cXmlParser::ParseView(void) { | ||||
|      | ||||
| } | ||||
|  | ||||
| bool cXmlParser::ParsePluginView(string plugName, int templateNumber) { | ||||
|  | ||||
|     cTemplateView *plugView = new cTemplateViewMenu(); | ||||
|     view->AddPluginView(plugName, templateNumber, plugView); | ||||
|  | ||||
|     vector<pair<string, string> > attribs; | ||||
|     ParseAttributes(root->properties, root, attribs); | ||||
|  | ||||
|     plugView->SetParameters(attribs); | ||||
|  | ||||
|     xmlNodePtr childNode = root->xmlChildrenNode; | ||||
|  | ||||
|     while (childNode != NULL) { | ||||
|  | ||||
|         if (childNode->type != XML_ELEMENT_NODE) { | ||||
|             childNode = childNode->next; | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (plugView->ValidViewElement((const char*)childNode->name)) { | ||||
|             bool debugViewElement = DebugViewElement(childNode); | ||||
|             ParseViewElement(childNode->name, childNode->xmlChildrenNode, debugViewElement, plugView); | ||||
|         } else if (plugView->ValidViewList((const char*)childNode->name)) { | ||||
|             ParseViewList(childNode, plugView); | ||||
|         } else if (!xmlStrcmp(childNode->name, (const xmlChar *) "tab")) { | ||||
|             ParseViewTab(childNode, plugView);            | ||||
|         } else { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         childNode = childNode->next; | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool cXmlParser::ParseGlobals(void) { | ||||
|     xmlNodePtr node = root->xmlChildrenNode; | ||||
|      | ||||
|   | ||||
| @@ -47,8 +47,10 @@ public: | ||||
|     cXmlParser(void); | ||||
|     virtual ~cXmlParser(void); | ||||
|     bool ReadView(cTemplateView *view, string xmlFile); | ||||
|     bool ReadPluginView(string plugName, int templateNumber, string templateName); | ||||
|     bool ReadGlobals(cGlobals *globals, string xmlFile); | ||||
|     bool ParseView(void); | ||||
|     bool ParsePluginView(string plugName, int templateNumber); | ||||
|     bool ParseGlobals(void); | ||||
|     void DeleteDocument(void); | ||||
| }; | ||||
|   | ||||
							
								
								
									
										38
									
								
								services.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								services.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| #ifndef __SKINDESIGNERSERVICES_H | ||||
| #define __SKINDESIGNERSERVICES_H | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| #include <string> | ||||
| #include <map> | ||||
|  | ||||
| /********************************************************************* | ||||
| * Data Structures for Service Calls | ||||
| *********************************************************************/ | ||||
|  | ||||
| // Data structure for service "RegisterPlugin" | ||||
| class RegisterPlugin { | ||||
| public: | ||||
| 	RegisterPlugin(void) { | ||||
| 		name = ""; | ||||
| 	}; | ||||
| 	void SetMenu(int key, string templateName) { | ||||
| 		menus.insert(pair<int, string>(key, templateName)); | ||||
| 	} | ||||
| // in | ||||
| 	string name;				 //name of plugin | ||||
| 	map< int, string > menus;    //menus as key -> templatename hashmap  | ||||
| //out | ||||
| }; | ||||
|  | ||||
| // Data structure for service "GetDisplayMenu" | ||||
| class GetDisplayMenu { | ||||
| public: | ||||
| 	GetDisplayMenu(void) { | ||||
| 		displayMenu = NULL; | ||||
| 	}; | ||||
| // in | ||||
| //out	 | ||||
| 	cSDDisplayMenu *displayMenu; | ||||
| }; | ||||
| #endif //__SKINDESIGNERSERVICES_H | ||||
							
								
								
									
										340
									
								
								skindesclient-0.0.1/COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								skindesclient-0.0.1/COPYING
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,340 @@ | ||||
| 		    GNU GENERAL PUBLIC LICENSE | ||||
| 		       Version 2, June 1991 | ||||
|  | ||||
|  Copyright (C) 1989, 1991 Free Software Foundation, Inc. | ||||
|  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
| 			    Preamble | ||||
|  | ||||
|   The licenses for most software are designed to take away your | ||||
| freedom to share and change it.  By contrast, the GNU General Public | ||||
| License is intended to guarantee your freedom to share and change free | ||||
| software--to make sure the software is free for all its users.  This | ||||
| General Public License applies to most of the Free Software | ||||
| Foundation's software and to any other program whose authors commit to | ||||
| using it.  (Some other Free Software Foundation software is covered by | ||||
| the GNU Lesser General Public License instead.)  You can apply it to | ||||
| your programs, too. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| this service if you wish), that you receive source code or can get it | ||||
| if you want it, that you can change the software or use pieces of it | ||||
| in new free programs; and that you know you can do these things. | ||||
|  | ||||
|   To protect your rights, we need to make restrictions that forbid | ||||
| anyone to deny you these rights or to ask you to surrender the rights. | ||||
| These restrictions translate to certain responsibilities for you if you | ||||
| distribute copies of the software, or if you modify it. | ||||
|  | ||||
|   For example, if you distribute copies of such a program, whether | ||||
| gratis or for a fee, you must give the recipients all the rights that | ||||
| you have.  You must make sure that they, too, receive or can get the | ||||
| source code.  And you must show them these terms so they know their | ||||
| rights. | ||||
|  | ||||
|   We protect your rights with two steps: (1) copyright the software, and | ||||
| (2) offer you this license which gives you legal permission to copy, | ||||
| distribute and/or modify the software. | ||||
|  | ||||
|   Also, for each author's protection and ours, we want to make certain | ||||
| that everyone understands that there is no warranty for this free | ||||
| software.  If the software is modified by someone else and passed on, we | ||||
| want its recipients to know that what they have is not the original, so | ||||
| that any problems introduced by others will not reflect on the original | ||||
| authors' reputations. | ||||
|  | ||||
|   Finally, any free program is threatened constantly by software | ||||
| patents.  We wish to avoid the danger that redistributors of a free | ||||
| program will individually obtain patent licenses, in effect making the | ||||
| program proprietary.  To prevent this, we have made it clear that any | ||||
| patent must be licensed for everyone's free use or not licensed at all. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
| 		    GNU GENERAL PUBLIC LICENSE | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||
|  | ||||
|   0. This License applies to any program or other work which contains | ||||
| a notice placed by the copyright holder saying it may be distributed | ||||
| under the terms of this General Public License.  The "Program", below, | ||||
| refers to any such program or work, and a "work based on the Program" | ||||
| means either the Program or any derivative work under copyright law: | ||||
| that is to say, a work containing the Program or a portion of it, | ||||
| either verbatim or with modifications and/or translated into another | ||||
| language.  (Hereinafter, translation is included without limitation in | ||||
| the term "modification".)  Each licensee is addressed as "you". | ||||
|  | ||||
| Activities other than copying, distribution and modification are not | ||||
| covered by this License; they are outside its scope.  The act of | ||||
| running the Program is not restricted, and the output from the Program | ||||
| is covered only if its contents constitute a work based on the | ||||
| Program (independent of having been made by running the Program). | ||||
| Whether that is true depends on what the Program does. | ||||
|  | ||||
|   1. You may copy and distribute verbatim copies of the Program's | ||||
| source code as you receive it, in any medium, provided that you | ||||
| conspicuously and appropriately publish on each copy an appropriate | ||||
| copyright notice and disclaimer of warranty; keep intact all the | ||||
| notices that refer to this License and to the absence of any warranty; | ||||
| and give any other recipients of the Program a copy of this License | ||||
| along with the Program. | ||||
|  | ||||
| You may charge a fee for the physical act of transferring a copy, and | ||||
| you may at your option offer warranty protection in exchange for a fee. | ||||
|  | ||||
|   2. You may modify your copy or copies of the Program or any portion | ||||
| of it, thus forming a work based on the Program, and copy and | ||||
| distribute such modifications or work under the terms of Section 1 | ||||
| above, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) You must cause the modified files to carry prominent notices | ||||
|     stating that you changed the files and the date of any change. | ||||
|  | ||||
|     b) You must cause any work that you distribute or publish, that in | ||||
|     whole or in part contains or is derived from the Program or any | ||||
|     part thereof, to be licensed as a whole at no charge to all third | ||||
|     parties under the terms of this License. | ||||
|  | ||||
|     c) If the modified program normally reads commands interactively | ||||
|     when run, you must cause it, when started running for such | ||||
|     interactive use in the most ordinary way, to print or display an | ||||
|     announcement including an appropriate copyright notice and a | ||||
|     notice that there is no warranty (or else, saying that you provide | ||||
|     a warranty) and that users may redistribute the program under | ||||
|     these conditions, and telling the user how to view a copy of this | ||||
|     License.  (Exception: if the Program itself is interactive but | ||||
|     does not normally print such an announcement, your work based on | ||||
|     the Program is not required to print an announcement.) | ||||
|  | ||||
| These requirements apply to the modified work as a whole.  If | ||||
| identifiable sections of that work are not derived from the Program, | ||||
| and can be reasonably considered independent and separate works in | ||||
| themselves, then this License, and its terms, do not apply to those | ||||
| sections when you distribute them as separate works.  But when you | ||||
| distribute the same sections as part of a whole which is a work based | ||||
| on the Program, the distribution of the whole must be on the terms of | ||||
| this License, whose permissions for other licensees extend to the | ||||
| entire whole, and thus to each and every part regardless of who wrote it. | ||||
|  | ||||
| Thus, it is not the intent of this section to claim rights or contest | ||||
| your rights to work written entirely by you; rather, the intent is to | ||||
| exercise the right to control the distribution of derivative or | ||||
| collective works based on the Program. | ||||
|  | ||||
| In addition, mere aggregation of another work not based on the Program | ||||
| with the Program (or with a work based on the Program) on a volume of | ||||
| a storage or distribution medium does not bring the other work under | ||||
| the scope of this License. | ||||
|  | ||||
|   3. You may copy and distribute the Program (or a work based on it, | ||||
| under Section 2) in object code or executable form under the terms of | ||||
| Sections 1 and 2 above provided that you also do one of the following: | ||||
|  | ||||
|     a) Accompany it with the complete corresponding machine-readable | ||||
|     source code, which must be distributed under the terms of Sections | ||||
|     1 and 2 above on a medium customarily used for software interchange; or, | ||||
|  | ||||
|     b) Accompany it with a written offer, valid for at least three | ||||
|     years, to give any third party, for a charge no more than your | ||||
|     cost of physically performing source distribution, a complete | ||||
|     machine-readable copy of the corresponding source code, to be | ||||
|     distributed under the terms of Sections 1 and 2 above on a medium | ||||
|     customarily used for software interchange; or, | ||||
|  | ||||
|     c) Accompany it with the information you received as to the offer | ||||
|     to distribute corresponding source code.  (This alternative is | ||||
|     allowed only for noncommercial distribution and only if you | ||||
|     received the program in object code or executable form with such | ||||
|     an offer, in accord with Subsection b above.) | ||||
|  | ||||
| The source code for a work means the preferred form of the work for | ||||
| making modifications to it.  For an executable work, complete source | ||||
| code means all the source code for all modules it contains, plus any | ||||
| associated interface definition files, plus the scripts used to | ||||
| control compilation and installation of the executable.  However, as a | ||||
| special exception, the source code distributed need not include | ||||
| anything that is normally distributed (in either source or binary | ||||
| form) with the major components (compiler, kernel, and so on) of the | ||||
| operating system on which the executable runs, unless that component | ||||
| itself accompanies the executable. | ||||
|  | ||||
| If distribution of executable or object code is made by offering | ||||
| access to copy from a designated place, then offering equivalent | ||||
| access to copy the source code from the same place counts as | ||||
| distribution of the source code, even though third parties are not | ||||
| compelled to copy the source along with the object code. | ||||
|  | ||||
|   4. You may not copy, modify, sublicense, or distribute the Program | ||||
| except as expressly provided under this License.  Any attempt | ||||
| otherwise to copy, modify, sublicense or distribute the Program is | ||||
| void, and will automatically terminate your rights under this License. | ||||
| However, parties who have received copies, or rights, from you under | ||||
| this License will not have their licenses terminated so long as such | ||||
| parties remain in full compliance. | ||||
|  | ||||
|   5. You are not required to accept this License, since you have not | ||||
| signed it.  However, nothing else grants you permission to modify or | ||||
| distribute the Program or its derivative works.  These actions are | ||||
| prohibited by law if you do not accept this License.  Therefore, by | ||||
| modifying or distributing the Program (or any work based on the | ||||
| Program), you indicate your acceptance of this License to do so, and | ||||
| all its terms and conditions for copying, distributing or modifying | ||||
| the Program or works based on it. | ||||
|  | ||||
|   6. Each time you redistribute the Program (or any work based on the | ||||
| Program), the recipient automatically receives a license from the | ||||
| original licensor to copy, distribute or modify the Program subject to | ||||
| these terms and conditions.  You may not impose any further | ||||
| restrictions on the recipients' exercise of the rights granted herein. | ||||
| You are not responsible for enforcing compliance by third parties to | ||||
| this License. | ||||
|  | ||||
|   7. If, as a consequence of a court judgment or allegation of patent | ||||
| infringement or for any other reason (not limited to patent issues), | ||||
| conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot | ||||
| distribute so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you | ||||
| may not distribute the Program at all.  For example, if a patent | ||||
| license would not permit royalty-free redistribution of the Program by | ||||
| all those who receive copies directly or indirectly through you, then | ||||
| the only way you could satisfy both it and this License would be to | ||||
| refrain entirely from distribution of the Program. | ||||
|  | ||||
| If any portion of this section is held invalid or unenforceable under | ||||
| any particular circumstance, the balance of the section is intended to | ||||
| apply and the section as a whole is intended to apply in other | ||||
| circumstances. | ||||
|  | ||||
| It is not the purpose of this section to induce you to infringe any | ||||
| patents or other property right claims or to contest validity of any | ||||
| such claims; this section has the sole purpose of protecting the | ||||
| integrity of the free software distribution system, which is | ||||
| implemented by public license practices.  Many people have made | ||||
| generous contributions to the wide range of software distributed | ||||
| through that system in reliance on consistent application of that | ||||
| system; it is up to the author/donor to decide if he or she is willing | ||||
| to distribute software through any other system and a licensee cannot | ||||
| impose that choice. | ||||
|  | ||||
| This section is intended to make thoroughly clear what is believed to | ||||
| be a consequence of the rest of this License. | ||||
|  | ||||
|   8. If the distribution and/or use of the Program is restricted in | ||||
| certain countries either by patents or by copyrighted interfaces, the | ||||
| original copyright holder who places the Program under this License | ||||
| may add an explicit geographical distribution limitation excluding | ||||
| those countries, so that distribution is permitted only in or among | ||||
| countries not thus excluded.  In such case, this License incorporates | ||||
| the limitation as if written in the body of this License. | ||||
|  | ||||
|   9. The Free Software Foundation may publish revised and/or new versions | ||||
| of the General Public License from time to time.  Such new versions will | ||||
| be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
| Each version is given a distinguishing version number.  If the Program | ||||
| specifies a version number of this License which applies to it and "any | ||||
| later version", you have the option of following the terms and conditions | ||||
| either of that version or of any later version published by the Free | ||||
| Software Foundation.  If the Program does not specify a version number of | ||||
| this License, you may choose any version ever published by the Free Software | ||||
| Foundation. | ||||
|  | ||||
|   10. If you wish to incorporate parts of the Program into other free | ||||
| programs whose distribution conditions are different, write to the author | ||||
| to ask for permission.  For software which is copyrighted by the Free | ||||
| Software Foundation, write to the Free Software Foundation; we sometimes | ||||
| make exceptions for this.  Our decision will be guided by the two goals | ||||
| of preserving the free status of all derivatives of our free software and | ||||
| of promoting the sharing and reuse of software generally. | ||||
|  | ||||
| 			    NO WARRANTY | ||||
|  | ||||
|   11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||||
| FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN | ||||
| OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||||
| PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||||
| OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS | ||||
| TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE | ||||
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||||
| REPAIR OR CORRECTION. | ||||
|  | ||||
|   12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||||
| REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||||
| INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||||
| OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||||
| TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||||
| YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||||
| PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||||
| POSSIBILITY OF SUCH DAMAGES. | ||||
|  | ||||
| 		     END OF TERMS AND CONDITIONS | ||||
|  | ||||
| 	    How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| convey the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation; either version 2 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU General Public License | ||||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA | ||||
|  | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
| If the program is interactive, make it output a short notice like this | ||||
| when it starts in an interactive mode: | ||||
|  | ||||
|     Gnomovision version 69, Copyright (C) year name of author | ||||
|     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||||
|     This is free software, and you are welcome to redistribute it | ||||
|     under certain conditions; type `show c' for details. | ||||
|  | ||||
| The hypothetical commands `show w' and `show c' should show the appropriate | ||||
| parts of the General Public License.  Of course, the commands you use may | ||||
| be called something other than `show w' and `show c'; they could even be | ||||
| mouse-clicks or menu items--whatever suits your program. | ||||
|  | ||||
| You should also get your employer (if you work as a programmer) or your | ||||
| school, if any, to sign a "copyright disclaimer" for the program, if | ||||
| necessary.  Here is a sample; alter the names: | ||||
|  | ||||
|   Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||||
|   `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||||
|  | ||||
|   <signature of Ty Coon>, 1 April 1989 | ||||
|   Ty Coon, President of Vice | ||||
|  | ||||
| This General Public License does not permit incorporating your program into | ||||
| proprietary programs.  If your program is a subroutine library, you may | ||||
| consider it more useful to permit linking proprietary applications with the | ||||
| library.  If this is what you want to do, use the GNU Lesser General | ||||
| Public License instead of this License. | ||||
							
								
								
									
										123
									
								
								skindesclient-0.0.1/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								skindesclient-0.0.1/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | ||||
| # | ||||
| # Makefile for a Video Disk Recorder plugin | ||||
| # | ||||
| # $Id$ | ||||
|  | ||||
| # The official name of this plugin. | ||||
| # This name will be used in the '-P...' option of VDR to load the plugin. | ||||
| # By default the main source file also carries this name. | ||||
|  | ||||
| PLUGIN = skindesclient | ||||
|  | ||||
| ### The version number of this plugin (taken from the main source file): | ||||
|  | ||||
| VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g') | ||||
|  | ||||
| ### The directory environment: | ||||
|  | ||||
| # Use package data if installed...otherwise assume we're under the VDR source directory: | ||||
| PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc)) | ||||
| LIBDIR = $(call PKGCFG,libdir) | ||||
| LOCDIR = $(call PKGCFG,locdir) | ||||
| PLGCFG = $(call PKGCFG,plgcfg) | ||||
| # | ||||
| TMPDIR ?= /tmp | ||||
|  | ||||
| ### The compiler options: | ||||
|  | ||||
| export CFLAGS   = $(call PKGCFG,cflags) | ||||
| export CXXFLAGS = $(call PKGCFG,cxxflags) | ||||
|  | ||||
| ### The version number of VDR's plugin API: | ||||
|  | ||||
| APIVERSION = $(call PKGCFG,apiversion) | ||||
|  | ||||
| ### Allow user defined options to overwrite defaults: | ||||
|  | ||||
| -include $(PLGCFG) | ||||
|  | ||||
| ### The name of the distribution archive: | ||||
|  | ||||
| ARCHIVE = $(PLUGIN)-$(VERSION) | ||||
| PACKAGE = vdr-$(ARCHIVE) | ||||
|  | ||||
| ### The name of the shared object file: | ||||
|  | ||||
| SOFILE = libvdr-$(PLUGIN).so | ||||
|  | ||||
| ### Includes and Defines (add further entries here): | ||||
|  | ||||
| INCLUDES += | ||||
|  | ||||
| DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' | ||||
|  | ||||
| ### The object files (add further files here): | ||||
|  | ||||
| OBJS = $(PLUGIN).o \ | ||||
|        libskindesigner/skindesignerosdbase.o | ||||
|  | ||||
| ### The main target: | ||||
|  | ||||
| all: $(SOFILE) i18n | ||||
|  | ||||
| ### Implicit rules: | ||||
|  | ||||
| %.o: %.c | ||||
| 	$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $< | ||||
|  | ||||
| ### Dependencies: | ||||
|  | ||||
| MAKEDEP = $(CXX) -MM -MG | ||||
| DEPFILE = .dependencies | ||||
| $(DEPFILE): Makefile | ||||
| 	@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ | ||||
|  | ||||
| -include $(DEPFILE) | ||||
|  | ||||
| ### Internationalization (I18N): | ||||
|  | ||||
| PODIR     = po | ||||
| I18Npo    = $(wildcard $(PODIR)/*.po) | ||||
| I18Nmo    = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file)))) | ||||
| I18Nmsgs  = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file)))))) | ||||
| I18Npot   = $(PODIR)/$(PLUGIN).pot | ||||
|  | ||||
| %.mo: %.po | ||||
| 	msgfmt -c -o $@ $< | ||||
|  | ||||
| $(I18Npot): $(wildcard *.c) | ||||
| 	xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^` | ||||
|  | ||||
| %.po: $(I18Npot) | ||||
| 	msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< | ||||
| 	@touch $@ | ||||
|  | ||||
| $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo | ||||
| 	install -D -m644 $< $@ | ||||
|  | ||||
| .PHONY: i18n | ||||
| i18n: $(I18Nmo) $(I18Npot) | ||||
|  | ||||
| install-i18n: $(I18Nmsgs) | ||||
|  | ||||
| ### Targets: | ||||
|  | ||||
| $(SOFILE): $(OBJS) | ||||
| 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ | ||||
|  | ||||
| install-lib: $(SOFILE) | ||||
| 	install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) | ||||
|  | ||||
| install: install-lib install-i18n | ||||
|  | ||||
| dist: $(I18Npo) clean | ||||
| 	@-rm -rf $(TMPDIR)/$(ARCHIVE) | ||||
| 	@mkdir $(TMPDIR)/$(ARCHIVE) | ||||
| 	@cp -a * $(TMPDIR)/$(ARCHIVE) | ||||
| 	@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE) | ||||
| 	@-rm -rf $(TMPDIR)/$(ARCHIVE) | ||||
| 	@echo Distribution package created as $(PACKAGE).tgz | ||||
|  | ||||
| clean: | ||||
| 	@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot | ||||
| 	@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ | ||||
							
								
								
									
										16
									
								
								skindesclient-0.0.1/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								skindesclient-0.0.1/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| This is a "plugin" for the Video Disk Recorder (VDR). | ||||
|  | ||||
| Written by:                  Louis Braun <louis.braun@gmx.de> | ||||
|  | ||||
| Project's homepage:          --- | ||||
|  | ||||
| Latest version available at: --- | ||||
|  | ||||
| This program is free software; you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation; either version 2 of the License, or | ||||
| (at your option) any later version. | ||||
| See the file COPYING for more information. | ||||
|  | ||||
| Description: This is just an example how to use the skindesigner  | ||||
| template engine with a VDR plugin | ||||
							
								
								
									
										50
									
								
								skindesclient-0.0.1/libskindesigner/services.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								skindesclient-0.0.1/libskindesigner/services.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| #ifndef __SKINDESIGNERSERVICES_H | ||||
| #define __SKINDESIGNERSERVICES_H | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| #include <string> | ||||
| #include <map> | ||||
|  | ||||
| enum eMenuType { | ||||
|     mtList, | ||||
|     mtText | ||||
| }; | ||||
|  | ||||
| class cSDDisplayMenu : public cSkinDisplayMenu { | ||||
| public: | ||||
|     virtual void SetPluginMenu(string name, int menu, int type, bool init); | ||||
|     virtual bool SetItemPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens, int Index, bool Current, bool Selectable); | ||||
|     virtual bool SetPluginText(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens); | ||||
| }; | ||||
|  | ||||
| /********************************************************************* | ||||
| * Data Structures for Service Calls | ||||
| *********************************************************************/ | ||||
|  | ||||
| // Data structure for service "RegisterPlugin" | ||||
| class RegisterPlugin { | ||||
| public: | ||||
| 	RegisterPlugin(void) { | ||||
| 		name = ""; | ||||
| 	}; | ||||
| 	void SetMenu(int key, string templateName) { | ||||
| 		menus.insert(pair<int, string>(key, templateName)); | ||||
| 	} | ||||
| // in | ||||
| 	string name;				 //name of plugin | ||||
| 	map< int, string > menus;    //menus as key -> templatename hashmap  | ||||
| //out | ||||
| }; | ||||
|  | ||||
| // Data structure for service "GetDisplayMenu" | ||||
| class GetDisplayMenu { | ||||
| public: | ||||
| 	GetDisplayMenu(void) { | ||||
| 		displayMenu = NULL; | ||||
| 	}; | ||||
| // in | ||||
| //out	 | ||||
| 	cSDDisplayMenu *displayMenu; | ||||
| }; | ||||
| #endif //__SKINDESIGNERSERVICES_H | ||||
							
								
								
									
										169
									
								
								skindesclient-0.0.1/libskindesigner/skindesignerosdbase.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								skindesclient-0.0.1/libskindesigner/skindesignerosdbase.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | ||||
| #include "skindesignerosdbase.h" | ||||
|  | ||||
| /********************************************************************** | ||||
| * cSkindesignerOsdItem | ||||
| **********************************************************************/ | ||||
| cSkindesignerOsdItem::cSkindesignerOsdItem(eOSState State) : cOsdItem(State) { | ||||
| 	sdDisplayMenu = NULL; | ||||
| } | ||||
|  | ||||
| cSkindesignerOsdItem::cSkindesignerOsdItem(const char *Text, eOSState State, bool Selectable) : cOsdItem(Text, State, Selectable) { | ||||
| 	sdDisplayMenu = NULL; | ||||
| }   | ||||
|  | ||||
| cSkindesignerOsdItem::~cSkindesignerOsdItem() { | ||||
|  | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable) { | ||||
| 	if (sdDisplayMenu) { | ||||
| 		if (!sdDisplayMenu->SetItemPlugin(&stringTokens, &intTokens, &loopTokens, Index, Current, Selectable)) { | ||||
| 			DisplayMenu->SetItem(Text(), Index, Current, Selectable); | ||||
| 		} | ||||
| 	} else { | ||||
| 		DisplayMenu->SetItem(Text(), Index, Current, Selectable); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdItem::AddStringToken(string key, string value) { | ||||
| 	stringTokens.insert(pair<string,string>(key, value)); | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdItem::AddIntToken(string key, int value) { | ||||
| 	intTokens.insert(pair<string,int>(key, value)); | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdItem::AddLoopToken(string loopName, map<string, string> &tokens) { | ||||
| 	map<string, vector<map<string, string> > >::iterator hitLoop = loopTokens.find(loopName); | ||||
| 	if (hitLoop == loopTokens.end()) { | ||||
| 		vector<map<string, string> > tokenVector; | ||||
| 		tokenVector.push_back(tokens); | ||||
| 		loopTokens.insert(pair<string, vector<map<string, string> > >(loopName, tokenVector)); | ||||
| 	} else { | ||||
| 		vector<map<string, string> > *tokenVector = &hitLoop->second; | ||||
| 		tokenVector->push_back(tokens); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /********************************************************************** | ||||
| * cSkindesignerOsdMenu | ||||
| **********************************************************************/ | ||||
| cSkindesignerOsdMenu::cSkindesignerOsdMenu(const char *Title, int c0, int c1, int c2, int c3, int c4) : cOsdMenu(Title, c0, c1, c2, c3, c4) { | ||||
| 	init = true; | ||||
|     displayText = false; | ||||
| 	sdDisplayMenu = NULL; | ||||
| 	pluginName = ""; | ||||
| 	SetMenuCategory(mcPlugin); | ||||
| 	SetSkinDesignerDisplayMenu(); | ||||
| } | ||||
|  | ||||
| cSkindesignerOsdMenu::~cSkindesignerOsdMenu() { | ||||
|  | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::SetPluginMenu(int menu, eMenuType type) { | ||||
| 	if (type == mtList) | ||||
| 		displayText = false; | ||||
| 	else if (type == mtText) | ||||
| 		displayText = true; | ||||
|  | ||||
| 	if (sdDisplayMenu) { | ||||
| 		sdDisplayMenu->SetPluginMenu(pluginName, menu, type, init); | ||||
| 	} | ||||
|     init = false; | ||||
| } | ||||
|  | ||||
| bool cSkindesignerOsdMenu::SetSkinDesignerDisplayMenu(void) { | ||||
| 	static cPlugin *pSkinDesigner = cPluginManager::GetPlugin("skindesigner"); | ||||
|   	if (!pSkinDesigner) { | ||||
|     	return false;	 | ||||
|   	} | ||||
|   	GetDisplayMenu call; | ||||
|   	bool ok = pSkinDesigner->Service("GetDisplayMenu", &call); | ||||
|   	if (ok && call.displayMenu) { | ||||
|   		sdDisplayMenu = call.displayMenu; | ||||
|   		return true; | ||||
|   	} | ||||
|   	return false; | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::ClearTokens(void) { | ||||
| 	text = ""; | ||||
|     stringTokens.clear(); | ||||
|     intTokens.clear(); | ||||
|     loopTokens.clear(); | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::AddStringToken(string key, string value) { | ||||
| 	stringTokens.insert(pair<string,string>(key, value)); | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::AddIntToken(string key, int value) { | ||||
| 	intTokens.insert(pair<string,int>(key, value)); | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::AddLoopToken(string loopName, map<string, string> &tokens) { | ||||
| 	map<string, vector<map<string, string> > >::iterator hitLoop = loopTokens.find(loopName); | ||||
| 	if (hitLoop == loopTokens.end()) { | ||||
| 		vector<map<string, string> > tokenVector; | ||||
| 		tokenVector.push_back(tokens); | ||||
| 		loopTokens.insert(pair<string, vector<map<string, string> > >(loopName, tokenVector)); | ||||
| 	} else { | ||||
| 		vector<map<string, string> > *tokenVector = &hitLoop->second; | ||||
| 		tokenVector->push_back(tokens); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::TextKeyLeft(void) { | ||||
|     if (!displayText) | ||||
|         return; | ||||
|     DisplayMenu()->Scroll(true, true); | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::TextKeyRight(void) { | ||||
|     if (!displayText) | ||||
|         return; | ||||
|     DisplayMenu()->Scroll(false, true); | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::TextKeyUp(void) { | ||||
|     if (!displayText) | ||||
|         return; | ||||
|     DisplayMenu()->Scroll(true, false); | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::TextKeyDown(void) { | ||||
|     if (!displayText) | ||||
|         return; | ||||
|     DisplayMenu()->Scroll(false, false); | ||||
| } | ||||
|  | ||||
| void cSkindesignerOsdMenu::Display(void) { | ||||
| 	if (displayText) { | ||||
| 		if (sdDisplayMenu) { | ||||
| 			if (sdDisplayMenu->SetPluginText(&stringTokens, &intTokens, &loopTokens)) { | ||||
|                 esyslog("skindesclient: template found"); | ||||
|                 sdDisplayMenu->Flush(); | ||||
|             } else { | ||||
|                 esyslog("skindesclient: no template found, drawing default"); | ||||
|                 DisplayMenu()->Clear(); | ||||
|                 DisplayMenu()->SetText(text.c_str(), false); | ||||
|                 DisplayMenu()->Flush(); | ||||
|             } | ||||
| 		} else { | ||||
|             DisplayMenu()->Clear(); | ||||
| 			DisplayMenu()->SetText(text.c_str(), false); | ||||
|             DisplayMenu()->Flush(); | ||||
| 		} | ||||
|         return; | ||||
| 	} | ||||
| 	if (sdDisplayMenu) { | ||||
| 		for (cOsdItem *item = First(); item; item = Next(item)) { | ||||
| 	        cSkindesignerOsdItem *sdItem = dynamic_cast<cSkindesignerOsdItem*>(item); | ||||
| 	        if (sdItem) | ||||
| 				sdItem->SetDisplayMenu(sdDisplayMenu); | ||||
| 		} | ||||
| 	} | ||||
| 	cOsdMenu::Display(); | ||||
| } | ||||
							
								
								
									
										62
									
								
								skindesclient-0.0.1/libskindesigner/skindesignerosdbase.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								skindesclient-0.0.1/libskindesigner/skindesignerosdbase.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| #ifndef __SKINDESIGNEROSDBASE_H | ||||
| #define __SKINDESIGNEROSDBASE_H | ||||
|  | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <map> | ||||
| #include <set> | ||||
| #include <sstream> | ||||
| #include <vdr/osdbase.h> | ||||
| #include <vdr/plugin.h> | ||||
| #include "services.h" | ||||
|  | ||||
| class cSkindesignerOsdItem : public cOsdItem { | ||||
| private: | ||||
| 	cSDDisplayMenu *sdDisplayMenu; | ||||
| 	map < string, string > stringTokens; | ||||
|     map < string, int > intTokens; | ||||
|     map < string, vector< map< string, string > > > loopTokens; | ||||
| protected: | ||||
| public: | ||||
|     cSkindesignerOsdItem(eOSState State = osUnknown); | ||||
|     cSkindesignerOsdItem(const char *Text, eOSState State = osUnknown, bool Selectable = true); | ||||
|     virtual ~cSkindesignerOsdItem(); | ||||
|     virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable); | ||||
| 	void SetDisplayMenu(cSDDisplayMenu *sdDisplayMenu) { this->sdDisplayMenu = sdDisplayMenu; }; | ||||
|     void AddStringToken(string key, string value); | ||||
| 	void AddIntToken(string key, int value); | ||||
|     void AddLoopToken(string loopName, map<string, string> &tokens); | ||||
| }; | ||||
|  | ||||
|  | ||||
| class cSkindesignerOsdMenu : public cOsdMenu { | ||||
| private: | ||||
|     bool init; | ||||
|     bool displayText; | ||||
|     string pluginName; | ||||
| 	cSDDisplayMenu *sdDisplayMenu; | ||||
|     string text; | ||||
|     map < string, string > stringTokens; | ||||
|     map < string, int > intTokens; | ||||
|     map < string, vector< map< string, string > > > loopTokens; | ||||
| 	bool SetSkinDesignerDisplayMenu(void); | ||||
| protected: | ||||
|     void ClearTokens(void); | ||||
|     void SetPluginName(string name) {pluginName = name; }; | ||||
| 	void SetPluginMenu(int menu, eMenuType type); | ||||
|     void SetText(string text) { this->text = text; }; | ||||
|     void AddStringToken(string key, string value); | ||||
|     void AddIntToken(string key, int value); | ||||
|     void AddLoopToken(string loopName, map<string, string> &tokens); | ||||
|     void TextKeyLeft(void); | ||||
|     void TextKeyRight(void); | ||||
|     void TextKeyUp(void); | ||||
|     void TextKeyDown(void); | ||||
| public: | ||||
|     cSkindesignerOsdMenu(const char *Title, int c0 = 0, int c1 = 0, int c2 = 0, int c3 = 0, int c4 = 0); | ||||
|     virtual ~cSkindesignerOsdMenu(); | ||||
|     virtual void Display(void); | ||||
| }; | ||||
|  | ||||
| #endif // __SKINDESIGNEROSDBASE_H | ||||
|  | ||||
							
								
								
									
										148
									
								
								skindesclient-0.0.1/osdmenu.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								skindesclient-0.0.1/osdmenu.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| #include <vdr/osdbase.h> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <map> | ||||
| #include <set> | ||||
| #include <sstream> | ||||
| #include "libskindesigner/skindesignerosdbase.h" | ||||
|  | ||||
| enum eMenus { | ||||
| 	meListMain, | ||||
|     meListSub, | ||||
| 	meDetail | ||||
| }; | ||||
|  | ||||
| class cPlugOsdMenu : public cSkindesignerOsdMenu { | ||||
| private: | ||||
| 	void SetMenu(int numItems, bool subfolder = false); | ||||
|     void SetDetailView(int element); | ||||
| public: | ||||
| 	cPlugOsdMenu(void); | ||||
|     virtual ~cPlugOsdMenu(); | ||||
|     virtual eOSState ProcessKey(eKeys key); | ||||
| }; | ||||
|  | ||||
|  | ||||
| //*************************************************************************** | ||||
| // Public Functions | ||||
| //*************************************************************************** | ||||
|  | ||||
| cPlugOsdMenu::cPlugOsdMenu(void) : cSkindesignerOsdMenu("Skindesigner Client") { | ||||
| 	SetPluginName("skindesclient"); | ||||
| 	SetMenu(10); | ||||
| } | ||||
|  | ||||
| cPlugOsdMenu::~cPlugOsdMenu(void) { | ||||
| 	 | ||||
| } | ||||
|  | ||||
| eOSState cPlugOsdMenu::ProcessKey(eKeys key) { | ||||
|     eOSState state = cOsdMenu::ProcessKey(key); | ||||
|     switch (key) { | ||||
|         case kOk: { | ||||
|             int element = Current(); | ||||
|             if (element%2) | ||||
|                 SetDetailView(element); | ||||
|             else | ||||
|                 SetMenu(25, true); | ||||
|             state = osContinue; | ||||
|             break; | ||||
|         } case kLeft: { | ||||
|             TextKeyLeft(); | ||||
|             state = osContinue; | ||||
|             break; | ||||
|         } case kRight: { | ||||
|             TextKeyRight(); | ||||
|             state = osContinue;             | ||||
|             break; | ||||
|         } case kUp: { | ||||
|             TextKeyUp(); | ||||
|             state = osContinue;             | ||||
|             break; | ||||
|         } case kDown: { | ||||
|             TextKeyDown(); | ||||
|             state = osContinue;             | ||||
|             break; | ||||
|         } | ||||
|         default: | ||||
|             break; | ||||
|     } | ||||
|     return state; | ||||
| } | ||||
|  | ||||
| //*************************************************************************** | ||||
| // Private Functions | ||||
| //*************************************************************************** | ||||
|  | ||||
| void cPlugOsdMenu::SetMenu(int numItems, bool subfolder) { | ||||
|     eMenus menu = subfolder ? meListSub : meListMain; | ||||
|     SetPluginMenu(menu, mtList); | ||||
|     Clear(); | ||||
|  | ||||
|     for (int i=0; i < numItems; i++) { | ||||
|         cSkindesignerOsdItem *item = new cSkindesignerOsdItem(); | ||||
|         //add some tokens to the menu item | ||||
|         stringstream text; | ||||
|         if (i%2) | ||||
|             text << "DetailItem" << (i+1); | ||||
|         else | ||||
|             text << "FolderItem" << (i+1); | ||||
|         item->SetText(text.str().c_str()); | ||||
|         item->AddIntToken("itemnumber", i); | ||||
|         item->AddStringToken("menuitemtext", text.str().c_str()); | ||||
|  | ||||
|         stringstream text2; | ||||
|         text2 << "CurrentItemText" << (i+1) << "\n"; | ||||
|         text2 << "CurrentItemText" << (i+1) << "\n"; | ||||
|         text2 << "CurrentItemText" << (i+1) << "\n"; | ||||
|         text2 << "CurrentItemText" << (i+1) << "\n"; | ||||
|         text2 << "CurrentItemText" << (i+1) << "\n"; | ||||
|         text2 << "CurrentItemText" << (i+1) << "\n"; | ||||
|         item->AddStringToken("currentitemtext", text2.str().c_str()); | ||||
|          | ||||
|         //Loop Token Example | ||||
|         for (int row=0; row<20; row++) { | ||||
|             map<string, string> tokens; | ||||
|             for (int col=0; col<3; col++) { | ||||
|                 stringstream key; | ||||
|                 stringstream value; | ||||
|                 key << "loop1[" << "col" << col << "]"; | ||||
|                 value << "menuitem" << i << "-" << row << "x" << col; | ||||
|                 tokens.insert(pair<string,string>(key.str(), value.str())); | ||||
|             } | ||||
|             item->AddLoopToken("loop1", tokens); | ||||
|         } | ||||
|         //Add item | ||||
|         bool current = (i==0)?true:false; | ||||
|         Add(item, current); | ||||
|     } | ||||
|     SetHelp("Red", "Green", "Yellow", "Blue"); | ||||
|     Display(); | ||||
| } | ||||
|  | ||||
| void cPlugOsdMenu::SetDetailView(int element) { | ||||
|     SetPluginMenu(meDetail, mtText); | ||||
|     Clear(); | ||||
|     ClearTokens(); | ||||
|      | ||||
|     SetText("Text to be displayed if skindesigner templates are not available"); | ||||
|  | ||||
|     AddIntToken("menuitem", element); | ||||
|     AddStringToken("tabtext", "String Token to be displayed if skindesigner template is available"); | ||||
|  | ||||
|     //Loop Token Example | ||||
|     for (int row=0; row<25; row++) { | ||||
|         map<string, string> tokens; | ||||
|         for (int col=0; col<10; col++) { | ||||
|             stringstream key; | ||||
|             stringstream value; | ||||
|             key << "loop1[" << "col" << col << "]"; | ||||
|             value << "row" << row << "-" << "col" << "-" << col; | ||||
|             tokens.insert(pair<string,string>(key.str(), value.str())); | ||||
|         } | ||||
|         AddLoopToken("loop1", tokens); | ||||
|     } | ||||
|  | ||||
|     SetHelp("Red", "Green", "Yellow", "Blue"); | ||||
|     Display(); | ||||
| } | ||||
							
								
								
									
										147
									
								
								skindesclient-0.0.1/skindesclient.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								skindesclient-0.0.1/skindesclient.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| /* | ||||
|  * skindesclient.c: A plugin for the Video Disk Recorder | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  * | ||||
|  * $Id$ | ||||
|  */ | ||||
|  | ||||
| #include <vdr/plugin.h> | ||||
| #include "osdmenu.c" | ||||
| #include "libskindesigner/services.h" | ||||
|  | ||||
| static const char *VERSION        = "0.0.1"; | ||||
| static const char *DESCRIPTION    = "SkinDesigner Test Client"; | ||||
| static const char *MAINMENUENTRY  = "Skindesclient"; | ||||
|  | ||||
| class cPluginSkindesclient : public cPlugin { | ||||
| private: | ||||
|   // Add any member variables or functions you may need here. | ||||
| public: | ||||
|   cPluginSkindesclient(void); | ||||
|   virtual ~cPluginSkindesclient(); | ||||
|   virtual const char *Version(void) { return VERSION; } | ||||
|   virtual const char *Description(void) { return DESCRIPTION; } | ||||
|   virtual const char *CommandLineHelp(void); | ||||
|   virtual bool ProcessArgs(int argc, char *argv[]); | ||||
|   virtual bool Initialize(void); | ||||
|   virtual bool Start(void); | ||||
|   virtual void Stop(void); | ||||
|   virtual void Housekeeping(void); | ||||
|   virtual void MainThreadHook(void); | ||||
|   virtual cString Active(void); | ||||
|   virtual time_t WakeupTime(void); | ||||
|   virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; } | ||||
|   virtual cOsdObject *MainMenuAction(void); | ||||
|   virtual cMenuSetupPage *SetupMenu(void); | ||||
|   virtual bool SetupParse(const char *Name, const char *Value); | ||||
|   virtual bool Service(const char *Id, void *Data = NULL); | ||||
|   virtual const char **SVDRPHelpPages(void); | ||||
|   virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode); | ||||
|   }; | ||||
|  | ||||
| cPluginSkindesclient::cPluginSkindesclient(void) | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
| cPluginSkindesclient::~cPluginSkindesclient() | ||||
| { | ||||
| } | ||||
|  | ||||
| const char *cPluginSkindesclient::CommandLineHelp(void) | ||||
| { | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| bool cPluginSkindesclient::ProcessArgs(int argc, char *argv[]) | ||||
| { | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| bool cPluginSkindesclient::Initialize(void) | ||||
| { | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| bool cPluginSkindesclient::Start(void) | ||||
| { | ||||
|   RegisterPlugin reg; | ||||
|   reg.name = "skindesclient"; | ||||
|   reg.SetMenu(meListMain, "menulistmain.xml"); | ||||
|   reg.SetMenu(meListSub, "menulistsub.xml"); | ||||
|   reg.SetMenu(meDetail, "menudetail.xml"); | ||||
|   static cPlugin *pSkinDesigner = cPluginManager::GetPlugin("skindesigner"); | ||||
|   if (pSkinDesigner) { | ||||
|     bool ok = pSkinDesigner->Service("RegisterPlugin", ®); | ||||
|   } else { | ||||
|     esyslog("skindesclient: skindesigner not available"); | ||||
|   } | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| void cPluginSkindesclient::Stop(void) | ||||
| { | ||||
|   // Stop any background activities the plugin is performing. | ||||
| } | ||||
|  | ||||
| void cPluginSkindesclient::Housekeeping(void) | ||||
| { | ||||
|   // Perform any cleanup or other regular tasks. | ||||
| } | ||||
|  | ||||
| void cPluginSkindesclient::MainThreadHook(void) | ||||
| { | ||||
|   // Perform actions in the context of the main program thread. | ||||
|   // WARNING: Use with great care - see PLUGINS.html! | ||||
| } | ||||
|  | ||||
| cString cPluginSkindesclient::Active(void) | ||||
| { | ||||
|   // Return a message string if shutdown should be postponed | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| time_t cPluginSkindesclient::WakeupTime(void) | ||||
| { | ||||
|   // Return custom wakeup time for shutdown script | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| cOsdObject *cPluginSkindesclient::MainMenuAction(void) | ||||
| { | ||||
|   cOsdObject *menu = new cPlugOsdMenu();   | ||||
|   return menu; | ||||
| } | ||||
|  | ||||
| cMenuSetupPage *cPluginSkindesclient::SetupMenu(void) | ||||
| { | ||||
|   // Return a setup menu in case the plugin supports one. | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| bool cPluginSkindesclient::SetupParse(const char *Name, const char *Value) | ||||
| { | ||||
|   // Parse your own setup parameters and store their values. | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| bool cPluginSkindesclient::Service(const char *Id, void *Data) | ||||
| { | ||||
|   // Handle custom service requests from other plugins | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| const char **cPluginSkindesclient::SVDRPHelpPages(void) | ||||
| { | ||||
|   // Return help text for SVDRP commands this plugin implements | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| cString cPluginSkindesclient::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode) | ||||
| { | ||||
|   // Process SVDRP commands this plugin implements | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| VDRPLUGINCREATOR(cPluginSkindesclient); // Don't touch this! | ||||
| @@ -0,0 +1,80 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd"> | ||||
|  | ||||
| <menuplugin x="0" y="0" width="100%" height="100%" fadetime="0"> | ||||
|     <background> | ||||
|         <area x="0" y="0" width="100%" height="100%" layer="1"> | ||||
|             <fill color="{clrTransBlack}" /> | ||||
|         </area> | ||||
|     </background> | ||||
|     <!-- dummyheader --> | ||||
|     <header> | ||||
|         <area x="0" y="0" width="1" height="1" layer="1"> | ||||
|             <fill color="{clrTransparent}" /> | ||||
|         </area> | ||||
|     </header> | ||||
|     <datetime> | ||||
|         <area x="0" y="0" width="1" height="1" layer="1"> | ||||
|             <fill color="{clrTransparent}" /> | ||||
|         </area> | ||||
|     </datetime> | ||||
|     <colorbuttons> | ||||
|     </colorbuttons> | ||||
|     <!-- Available Variables in detail header: | ||||
|     {menuitem}          Number of menu item element from list  | ||||
|     {tabtext}           Text for Tab | ||||
|     --> | ||||
|     <detailheader> | ||||
|         <area x="0" y="0" width="100%" height="20%" layer="2"> | ||||
|             <fill color="{clrTransBlueLight}" /> | ||||
|         </area> | ||||
|         <area x="0" y="0" width="100%" height="20%" layer="3"> | ||||
|             <drawtext x="20" valign="center" font="{light}" fontsize="40%" color="{clrWhite}" text="Header for menuitem {menuitem} detailed information" /> | ||||
|         </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}" /> | ||||
|             <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 tab elements: | ||||
|     {menuitem}          Number of menu item element from list  | ||||
|     {tabtext}           Text for Tab | ||||
|     {loop1[]}           test array | ||||
|     {loop1[col0]}       test array first col | ||||
|     ... | ||||
|     {loop1[col3]}       test array fourth col | ||||
|     --> | ||||
|     <!-- TAB TEST1 --> | ||||
|     <tab name="Test1" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4"> | ||||
|         <drawtextbox x="0" y="0" width="96%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tabtext}" /> | ||||
|     </tab> | ||||
|     <!-- TAB TEST2 --> | ||||
|     <tab name="Test2" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4"> | ||||
|         <drawtext x="10" y="0" width="96%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tabtext}" /> | ||||
|         <loop name="loop1" x="0" y="9%" width="{areawidth} - 40" orientation="vertical"> | ||||
|             <drawtext x="20" y="0" width="{areawidth} - 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{loop1[col0]} {loop1[col1]} {loop1[col2]} {loop1[col3]}" /> | ||||
|         </loop> | ||||
|     </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"> | ||||
|                 <drawrectangle condition="{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrTransBlueLight}" /> | ||||
|                 <drawrectangle condition="not{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrTransBlueLight}" /> | ||||
|                 <drawrectangle condition="not{tabs[current]}" x="2" y="2" width="{width(label)} - 4" height="{areaheight}-4" color="{clrTransparent}" /> | ||||
|                 <drawtext name="label" x="0" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="  {tabs[title]}  " /> | ||||
|             </loop> | ||||
|         </area> | ||||
|     </tablabels> | ||||
| </menuplugin> | ||||
| @@ -0,0 +1,67 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd"> | ||||
|  | ||||
| <menuplugin 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 | ||||
|     --> | ||||
|     <header> | ||||
|     </header> | ||||
|  | ||||
|     <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="6"> | ||||
|         <!-- Available Variables schedules menu listelement: | ||||
|         {nummenuitem}             number of item in list, starts with 1 | ||||
|         {current} | ||||
|         {separator} | ||||
|         {itemnumber} | ||||
|         {menuitemtext} | ||||
|         {currentitemtext} | ||||
|         --> | ||||
|         <listelement> | ||||
|             <!-- Background --> | ||||
|             <area x="1%" width="58%" layer="2"> | ||||
|                 <fill condition="not{current}" color="{clrTransparent}" /> | ||||
|                 <fill condition="{current}" color="{clrTransBlueLight}" /> | ||||
|             </area> | ||||
|             <area x="1%" width="58%" layer="3"> | ||||
|                 <drawtext x="10" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{itemnumber} {menuitemtext}" /> | ||||
|             </area> | ||||
|         </listelement> | ||||
|         <!-- additional element which is drawn for current element --> | ||||
|         <!-- Available Variables schedules menu currentelement: | ||||
|         {itemnumber} | ||||
|         {menuitemtext} | ||||
|         {currentitemtext} | ||||
|         {loop1[]}           test array | ||||
|         {loop1[col0]}       test array first col | ||||
|         ... | ||||
|         {loop1[col2]}       test array third col | ||||
|         --> | ||||
|         <currentelement delay="500" fadetime="0"> | ||||
|             <area x="63%" y="0" width="36%" height="85%" layer="3"> | ||||
|                 <drawtext align="center" y="0" font="{semibold}" width="{areawidth}-20" fontsize="15%" color="{clrWhite}" text="{itemnumber}" /> | ||||
|                 <drawtext align="center" y="15%" font="{semibold}" width="{areawidth}-20" fontsize="8%" color="{clrWhite}" text="{menuitemtext}" /> | ||||
|                 <drawtextbox x="10" y="{areaheight}/3" width="{areawidth}-20" font="{light}" fontsize="{areaheight}/15" color="{clrWhite}" text="{currentitemtext}" /> | ||||
|             </area> | ||||
|             <areascroll mode="carriagereturn" orientation="vertical" delay="1000" scrollspeed="medium" x="63%" y="85%" width="36%" height="15%" layer="3"> | ||||
|                 <loop name="loop1" x="0" y="0" orientation="vertical"> | ||||
|                     <drawtext x="10" font="{light}" width="{areawidth}-20" fontsize="20%" color="{clrWhite}" text="{loop1[col0]} {loop1[col1]} {loop1[col2]}" /> | ||||
|                 </loop> | ||||
|             </areascroll> | ||||
|         </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}" /> | ||||
|             <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> | ||||
| </menuplugin> | ||||
| @@ -0,0 +1,67 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd"> | ||||
|  | ||||
| <menuplugin 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 | ||||
|     --> | ||||
|     <header> | ||||
|     </header> | ||||
|  | ||||
|     <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="12"> | ||||
|         <!-- Available Variables schedules menu listelement: | ||||
|         {nummenuitem}             number of item in list, starts with 1 | ||||
|         {current} | ||||
|         {separator} | ||||
|         {itemnumber} | ||||
|         {menuitemtext} | ||||
|         {currentitemtext} | ||||
|         --> | ||||
|         <listelement> | ||||
|             <!-- Background --> | ||||
|             <area x="1%" width="58%" layer="2"> | ||||
|                 <fill condition="not{current}" color="{clrTransparent}" /> | ||||
|                 <fill condition="{current}" color="{clrTransBlueLight}" /> | ||||
|             </area> | ||||
|             <area x="1%" width="58%" layer="3"> | ||||
|                 <drawtext x="10" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{itemnumber} {menuitemtext}" /> | ||||
|             </area> | ||||
|         </listelement> | ||||
|         <!-- additional element which is drawn for current element --> | ||||
|         <!-- Available Variables schedules menu currentelement: | ||||
|         {itemnumber} | ||||
|         {menuitemtext} | ||||
|         {currentitemtext} | ||||
|         {loop1[]}           test array | ||||
|         {loop1[col0]}       test array first col | ||||
|         ... | ||||
|         {loop1[col2]}       test array third col | ||||
|         --> | ||||
|         <currentelement delay="500" fadetime="0"> | ||||
|             <area x="63%" y="0" width="36%" height="85%" layer="3"> | ||||
|                 <drawtext align="center" y="0" font="{semibold}" width="{areawidth}-20" fontsize="15%" color="{clrWhite}" text="{itemnumber}" /> | ||||
|                 <drawtext align="center" y="15%" font="{semibold}" width="{areawidth}-20" fontsize="8%" color="{clrWhite}" text="{menuitemtext}" /> | ||||
|                 <drawtextbox x="10" y="{areaheight}/3" width="{areawidth}-20" font="{light}" fontsize="{areaheight}/15" color="{clrWhite}" text="{currentitemtext}" /> | ||||
|             </area> | ||||
|             <areascroll mode="carriagereturn" orientation="vertical" delay="1000" scrollspeed="medium" x="63%" y="85%" width="36%" height="15%" layer="3"> | ||||
|                 <loop name="loop1" x="0" y="0" orientation="vertical"> | ||||
|                     <drawtext x="10" font="{light}" width="{areawidth}-20" fontsize="20%" color="{clrWhite}" text="{loop1[col0]} {loop1[col1]} {loop1[col2]}" /> | ||||
|                 </loop> | ||||
|             </areascroll> | ||||
|         </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}" /> | ||||
|             <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> | ||||
| </menuplugin> | ||||
| @@ -12,7 +12,7 @@ | ||||
| #include "config.h" | ||||
| #include "designer.h" | ||||
| #include "setup.h" | ||||
|  | ||||
| #include "services.h" | ||||
|  | ||||
| #if defined(APIVERSNUM) && APIVERSNUM < 20000  | ||||
| #error "VDR-2.0.0 API version or greater is required!" | ||||
| @@ -150,6 +150,34 @@ bool cPluginSkinDesigner::SetupParse(const char *Name, const char *Value) { | ||||
| } | ||||
|  | ||||
| bool cPluginSkinDesigner::Service(const char *Id, void *Data) { | ||||
|     if (Data == NULL) | ||||
|         return false; | ||||
|  | ||||
|     if (strcmp(Id, "RegisterPlugin") == 0) { | ||||
|         RegisterPlugin* call = (RegisterPlugin*) Data; | ||||
|         if (call->menus.size() < 1) { | ||||
|             esyslog("skindesigner: error - plugin without menus registered"); | ||||
|             return false; | ||||
|         } | ||||
|         config.AddPlugin(call->name, call->menus); | ||||
|         dsyslog("skindesigner: plugin %s has registered %d templates", call->name.c_str(), call->menus.size()); | ||||
|         return true; | ||||
|     } else if (strcmp(Id, "GetDisplayMenu") == 0) { | ||||
|         GetDisplayMenu* call = (GetDisplayMenu*) Data; | ||||
|         cSkin *current = Skins.Current(); | ||||
|         for (vector<cSkinDesigner*>::iterator skin = skins.begin(); skin != skins.end(); skin++) { | ||||
|             if (*skin == current) { | ||||
|                 cSDDisplayMenu *displayMenu = (*skin)->GetDisplayMenu(); | ||||
|                 if (displayMenu) { | ||||
|                     call->displayMenu = displayMenu; | ||||
|                     return true; | ||||
|                 } else | ||||
|                     return false; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -8,6 +8,7 @@ cDisplayMenuDetailView::cDisplayMenuDetailView(cTemplateView *tmplDetailView) : | ||||
|     recording = NULL; | ||||
|     text = NULL; | ||||
|     detailViewInit = true; | ||||
|     isPluginTextView = false; | ||||
|     currentTmplTab = NULL; | ||||
|     tabView = NULL; | ||||
| } | ||||
| @@ -18,6 +19,21 @@ cDisplayMenuDetailView::~cDisplayMenuDetailView() { | ||||
|         delete tabView; | ||||
| } | ||||
|  | ||||
| void cDisplayMenuDetailView::SetPluginTokens(map<string,string> *plugStringTokens, map<string,int> *plugIntTokens, map<string,vector<map<string,string> > > *plugLoopTokens) { | ||||
|     for (map<string,string>::iterator it = plugStringTokens->begin(); it != plugStringTokens->end(); it++) { | ||||
|         stringTokens.insert(pair<string,string>(it->first, it->second)); | ||||
|     } | ||||
|  | ||||
|     for (map<string,int>::iterator it = plugIntTokens->begin(); it != plugIntTokens->end(); it++) { | ||||
|         intTokens.insert(pair<string,int>(it->first, it->second)); | ||||
|     } | ||||
|  | ||||
|     for(map<string,vector<map<string,string> > >::iterator it = plugLoopTokens->begin(); it != plugLoopTokens->end(); it++) { | ||||
|         loopTokens.insert(pair<string,vector<map<string,string> > >(it->first, it->second)); | ||||
|     } | ||||
|     isPluginTextView = true; | ||||
| } | ||||
|  | ||||
| void cDisplayMenuDetailView::Clear(void) { | ||||
|     ClearViewElement(veDetailHeader); | ||||
|     ClearViewElement(veScrollbar); | ||||
| @@ -435,7 +451,7 @@ bool cDisplayMenuDetailView::LoadReruns(vector< map< string, string > > *reruns) | ||||
|     int rerunNaxChannel = config.rerunMaxChannel; | ||||
|  | ||||
|     Epgsearch_searchresults_v1_0 data; | ||||
|     string strQuery = event->Title(); | ||||
|     string strQuery = (event->Title()) ? event->Title() : ""; | ||||
|     data.query = (char *)strQuery.c_str(); | ||||
|     data.mode = 0; | ||||
|     data.channelNr = 0; | ||||
| @@ -879,6 +895,7 @@ void cDisplayMenuDetailView::DrawHeader(void) { | ||||
|         } | ||||
|  | ||||
|         DrawViewElement(veDetailHeader, &headerStringTokens, &headerIntTokens); | ||||
|         return; | ||||
|     } else if (recording) { | ||||
|         string name = recording->Name() ? recording->Name() : ""; | ||||
|         headerStringTokens.insert(pair<string,string>("name", name)); | ||||
| @@ -937,6 +954,11 @@ void cDisplayMenuDetailView::DrawHeader(void) { | ||||
|             headerStringTokens.insert(pair<string,string>("recimgpath", ""));             | ||||
|         } | ||||
|         DrawViewElement(veDetailHeader, &headerStringTokens, &headerIntTokens); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (isPluginTextView) { | ||||
|         DrawViewElement(veDetailHeader, &stringTokens, &intTokens); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -9,6 +9,7 @@ | ||||
| class cDisplayMenuDetailView : public cView { | ||||
| private: | ||||
|     bool detailViewInit; | ||||
|     bool isPluginTextView; | ||||
|     const cEvent *event; | ||||
|     const cRecording *recording; | ||||
|     const char *text; | ||||
| @@ -39,6 +40,7 @@ public: | ||||
|     void SetEvent(const cEvent *event) { this->event = event; }; | ||||
|     void SetRecording(const cRecording *recording) { this->recording = recording; }; | ||||
|     void SetText(const char *text) { this->text = text; }; | ||||
|     void SetPluginTokens(map<string,string> *plugStringTokens, map<string,int> *plugIntTokens, map<string,vector<map<string,string> > > *plugLoopTokens); | ||||
|     void Clear(void); | ||||
|     void Render(void); | ||||
|     void KeyLeft(void); | ||||
|   | ||||
| @@ -668,3 +668,48 @@ void cDisplayMenuItemCurrentRecordingView::Action(void) { | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /************************************************************* | ||||
| * cDisplayMenuItemCurrentPluginView | ||||
| *************************************************************/ | ||||
|  | ||||
| cDisplayMenuItemCurrentPluginView::cDisplayMenuItemCurrentPluginView(cTemplateViewElement *tmplCurrent, map <string,string> &plugStringTokens,  | ||||
|                                                                      map <string,int> &plugIntTokens, map<string,vector<map<string,string> > > &pluginLoopTokens) | ||||
|                          : cDisplayMenuItemCurrentView(tmplCurrent) { | ||||
|  | ||||
|     stringTokens = plugStringTokens; | ||||
|     intTokens = plugIntTokens; | ||||
|     loopTokens = pluginLoopTokens; | ||||
| } | ||||
|  | ||||
| cDisplayMenuItemCurrentPluginView::~cDisplayMenuItemCurrentPluginView() { | ||||
| } | ||||
|  | ||||
| void cDisplayMenuItemCurrentPluginView::Prepare(void) { | ||||
| } | ||||
|  | ||||
|  | ||||
| void cDisplayMenuItemCurrentPluginView::Render(void) { | ||||
|     SetTokensPosMenuItem(); | ||||
|     DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens, &loopTokens); | ||||
| } | ||||
|  | ||||
| void cDisplayMenuItemCurrentPluginView::Clear(void) { | ||||
|      | ||||
| } | ||||
|  | ||||
| void cDisplayMenuItemCurrentPluginView::Action(void) { | ||||
|     SetInitFinished(); | ||||
|     DoSleep(delay); | ||||
|     Render(); | ||||
|     FadeIn(); | ||||
|     DoFlush(); | ||||
|     if (scrolling) { | ||||
|         DoSleep(scrollDelay); | ||||
|         if (scrollOrientation == orHorizontal) { | ||||
|             ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode); | ||||
|         } else { | ||||
|             ScrollVertical(scrollingPix, scrollDelay, scrollSpeed); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -91,4 +91,17 @@ public: | ||||
|     void Render(void); | ||||
|     void Clear(void); | ||||
| }; | ||||
|  | ||||
| class cDisplayMenuItemCurrentPluginView: public cDisplayMenuItemCurrentView { | ||||
| private: | ||||
|     map<string,vector<map<string,string> > > loopTokens; | ||||
|     void Action(void); | ||||
| public: | ||||
|     cDisplayMenuItemCurrentPluginView(cTemplateViewElement *tmplCurrent, map <string,string> &plugStringTokens, map <string,int> &plugIntTokens, map<string,vector<map<string,string> > > &pluginLoopTokens); | ||||
|     virtual ~cDisplayMenuItemCurrentPluginView(); | ||||
|     void Prepare(void); | ||||
|     void Render(void); | ||||
|     void Clear(void); | ||||
| }; | ||||
|  | ||||
| #endif //__DISPLAYMENUITEMCURRENTVIEW_H | ||||
|   | ||||
| @@ -764,6 +764,61 @@ void cDisplayMenuItemRecordingView::Debug(void) { | ||||
|     esyslog("skindesigner: Recording: %s", recording ? recording->Title() : "Recording is NULL"); | ||||
| } | ||||
|  | ||||
| /************************************************************* | ||||
| * cDisplayMenuItemPluginView | ||||
| *************************************************************/ | ||||
|  | ||||
| cDisplayMenuItemPluginView::cDisplayMenuItemPluginView(cTemplateViewList *tmplList, map<string,string> *plugStringTokens, map<string,int> *plugIntTokens,  | ||||
|                                                        map<string,vector<map<string,string> > > *pluginLoopTokens, int index, bool current, bool selectable)  | ||||
|                                                        : cDisplayMenuItemView(tmplList, current, selectable) { | ||||
|  | ||||
|     for (map<string,string>::iterator it = plugStringTokens->begin(); it != plugStringTokens->end(); it++) { | ||||
|         stringTokens.insert(pair<string,string>(it->first, it->second)); | ||||
|     } | ||||
|  | ||||
|     for (map<string,int>::iterator it = plugIntTokens->begin(); it != plugIntTokens->end(); it++) { | ||||
|         intTokens.insert(pair<string,int>(it->first, it->second)); | ||||
|     } | ||||
|  | ||||
|     for(map<string,vector<map<string,string> > >::iterator it = pluginLoopTokens->begin(); it != pluginLoopTokens->end(); it++) { | ||||
|         loopTokens.insert(pair<string,vector<map<string,string> > >(it->first, it->second)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| cDisplayMenuItemPluginView::~cDisplayMenuItemPluginView() { | ||||
| } | ||||
|  | ||||
| void cDisplayMenuItemPluginView::SetTokens(void) { | ||||
|     if (!itemInit) return; | ||||
|     itemInit = false; | ||||
|     intTokens.insert(pair<string,int>("current", current)); | ||||
| } | ||||
|  | ||||
|  | ||||
| void cDisplayMenuItemPluginView::Prepare(void) { | ||||
|     ArrangeContainer(); | ||||
| } | ||||
|  | ||||
| void cDisplayMenuItemPluginView::Render(void) { | ||||
|      | ||||
|     DrawListItem(&stringTokens, &intTokens); | ||||
|      | ||||
|     if (current) { | ||||
|         cTemplateViewElement *tmplCurrent = tmplList->GetListElementCurrent(); | ||||
|         if (tmplCurrent) { | ||||
|             currentView = new cDisplayMenuItemCurrentPluginView(tmplCurrent, stringTokens, intTokens, loopTokens); | ||||
|             currentView->Start(); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     dirty = false; | ||||
| } | ||||
|  | ||||
| void cDisplayMenuItemPluginView::Debug(void) { | ||||
|     esyslog("skindesigner: Plugin Menu Item ---------------"); | ||||
|     cDisplayMenuItemView::Debug(); | ||||
| } | ||||
|  | ||||
| /************************************************************* | ||||
| * cDisplayMenuItemTrackView | ||||
| *************************************************************/ | ||||
|   | ||||
| @@ -125,6 +125,18 @@ public: | ||||
|     void Debug(void); | ||||
| }; | ||||
|  | ||||
| class cDisplayMenuItemPluginView: public cDisplayMenuItemView { | ||||
| private: | ||||
|     map<string,vector<map<string,string> > > loopTokens; | ||||
| public: | ||||
|     cDisplayMenuItemPluginView(cTemplateViewList *tmplList, map<string,string> *plugStringTokens, map<string,int> *plugIntTokens, map<string,vector<map<string,string> > > *pluginLoopTokens, int index, bool current, bool selectable); | ||||
|     virtual ~cDisplayMenuItemPluginView(); | ||||
|     void SetTokens(void); | ||||
|     void Prepare(void); | ||||
|     void Render(void); | ||||
|     void Debug(void); | ||||
| }; | ||||
|  | ||||
| class cDisplayMenuItemTrackView: public cDisplayMenuItemView { | ||||
| private: | ||||
|     const char *title; | ||||
|   | ||||
| @@ -182,6 +182,17 @@ void cDisplayMenuListView::AddRecordingMenuItem(int index, const cRecording *rec | ||||
|     menuItems[index] = item;             | ||||
| } | ||||
|  | ||||
| void cDisplayMenuListView::AddPluginMenuItem(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens, int index, bool current, bool selectable) { | ||||
|     if (index >= itemCount) | ||||
|         return; | ||||
|     if (menuItems[index]) { | ||||
|         menuItems[index]->SetCurrent(current); | ||||
|         return; | ||||
|     } | ||||
|     cDisplayMenuItemView *item = new cDisplayMenuItemPluginView(tmplList, stringTokens, intTokens, loopTokens, index, current, selectable); | ||||
|     menuItems[index] = item; | ||||
| } | ||||
|  | ||||
| void cDisplayMenuListView::AddTracksMenuItem(int index, const char *title, bool current, bool selectable) { | ||||
|     if (index >= itemCount) | ||||
|         return; | ||||
|   | ||||
| @@ -27,6 +27,7 @@ public: | ||||
|     void AddChannelsMenuItem(int index, const cChannel *channel, bool withProvider, bool current, bool selectable); | ||||
|     void AddTimersMenuItem(int index, const cTimer *timer, bool current, bool selectable); | ||||
|     void AddRecordingMenuItem(int index, const cRecording *recording, int level, int total, int isNew, bool current, bool selectable); | ||||
|     void AddPluginMenuItem(map<string,string> *stringTokens, map<string,int> *intTokens, map<string, vector<map<string,string> > > *loopTokens, int index, bool current, bool selectable); | ||||
|     void AddTracksMenuItem(int index, const char *title, bool current, bool selectable); | ||||
|     void Render(void); | ||||
|     void Debug(void); | ||||
|   | ||||
| @@ -10,6 +10,10 @@ cDisplayMenuRootView::cDisplayMenuRootView(cTemplateView *rootView) : cView(root | ||||
|     viewType = svUndefined; | ||||
|     subView = NULL; | ||||
|     subViewAvailable = false; | ||||
|     pluginName = ""; | ||||
|     pluginMenu = -1; | ||||
|     pluginMenuType = mtUnknown; | ||||
|     pluginMenuChanged = false; | ||||
|     view = NULL; | ||||
|     listView = NULL; | ||||
|     detailView = NULL; | ||||
| @@ -84,6 +88,12 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { | ||||
|     eSubView newViewType = svUndefined; | ||||
|     cat = menuCat; | ||||
|     bool isListView = true; | ||||
|     if (menuCat != mcPlugin) { | ||||
|         pluginName = ""; | ||||
|         pluginMenu = -1; | ||||
|         pluginMenuType = mtUnknown; | ||||
|         pluginMenuChanged = false; | ||||
|     } | ||||
|     switch (menuCat) { | ||||
|         case mcMain: | ||||
|             newViewType = svMenuMain; | ||||
| @@ -119,17 +129,34 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { | ||||
|             newViewType = svMenuDetailedText; | ||||
|             isListView = false; | ||||
|             break; | ||||
|         case mcPlugin: | ||||
|             newViewType = svMenuPlugin; | ||||
|             isListView = ( pluginMenuType == mtList ) ? true : false; | ||||
|             break; | ||||
|         default: | ||||
|             newViewType = svMenuDefault; | ||||
|             break; | ||||
|     } | ||||
|     if (newViewType != viewType) { | ||||
|         subView = tmplView->GetSubView(newViewType); | ||||
|         if (!subView) { | ||||
|             subViewAvailable = false; | ||||
|             subView = tmplView->GetSubView(svMenuDefault); | ||||
|     if (newViewType != viewType || pluginMenuChanged) { | ||||
|         if (newViewType == svMenuPlugin) { | ||||
|             subView = tmplView->GetPluginView(pluginName, pluginMenu); | ||||
|             if (!subView) { | ||||
|                 subViewAvailable = false; | ||||
|                 if (isListView) | ||||
|                     subView = tmplView->GetSubView(svMenuDefault); | ||||
|                 else | ||||
|                     subView = tmplView->GetSubView(svMenuDetailedText); | ||||
|             } else { | ||||
|                 subViewAvailable = true; | ||||
|             } | ||||
|         } else { | ||||
|             subViewAvailable = true; | ||||
|             subView = tmplView->GetSubView(newViewType); | ||||
|             if (!subView) { | ||||
|                 subViewAvailable = false; | ||||
|                 subView = tmplView->GetSubView(svMenuDefault); | ||||
|             } else { | ||||
|                 subViewAvailable = true; | ||||
|             } | ||||
|         } | ||||
|         //Cleanup | ||||
|         if (view) { | ||||
| @@ -144,7 +171,6 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { | ||||
|             delete detailView; | ||||
|             detailView = NULL; | ||||
|         } | ||||
|          | ||||
|         //Create new View | ||||
|         switch (newViewType) { | ||||
|             case svMenuMain: | ||||
| @@ -162,7 +188,6 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { | ||||
|         view->SetMenuCat(cat); | ||||
|         //Cleanup root view | ||||
|         ClearRootView(); | ||||
|  | ||||
|         if (isListView) { | ||||
|             //Create menu item list | ||||
|             cTemplateViewList *tmplMenuItems = subView->GetViewList(vlMenuItem); | ||||
| @@ -177,6 +202,17 @@ void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| void cDisplayMenuRootView::SetPluginMenu(string name, int menu, int type) {  | ||||
|     if (pluginName.compare(name) || menu != pluginMenu || type != pluginMenuType) | ||||
|         pluginMenuChanged = true; | ||||
|     else | ||||
|         pluginMenuChanged = false; | ||||
|  | ||||
|     pluginName = name;  | ||||
|     pluginMenu = menu;  | ||||
|     pluginMenuType = (ePluginMenuType)type; | ||||
| } | ||||
|  | ||||
| void cDisplayMenuRootView::SetTitle(const char *title) { | ||||
|     menuTitle = title; | ||||
|     if (view) | ||||
| @@ -254,6 +290,16 @@ void cDisplayMenuRootView::SetDetailedViewText(const char *text) { | ||||
|     detailView->SetText(text); | ||||
| } | ||||
|  | ||||
| bool cDisplayMenuRootView::SetDetailedViewPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens) { | ||||
|     if (!detailView) { | ||||
|         SetMenu(mcPlugin, true); | ||||
|         if (!subViewAvailable) | ||||
|             return false; | ||||
|     } | ||||
|     detailView->SetPluginTokens(stringTokens, intTokens, loopTokens); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| void cDisplayMenuRootView::KeyInput(bool up, bool page) { | ||||
|     if (!detailView) | ||||
|         return; | ||||
|   | ||||
| @@ -6,12 +6,22 @@ | ||||
| #include "displaymenulistview.h" | ||||
| #include "displaymenudetailview.h" | ||||
|  | ||||
| enum ePluginMenuType { | ||||
|     mtList, | ||||
|     mtText, | ||||
|     mtUnknown | ||||
| }; | ||||
|  | ||||
| class cDisplayMenuRootView : public cView { | ||||
| private: | ||||
|     eMenuCategory cat; | ||||
|     eSubView viewType; | ||||
|     cTemplateView *subView; | ||||
|     bool subViewAvailable; | ||||
|     string pluginName; | ||||
|     int pluginMenu; | ||||
|     ePluginMenuType pluginMenuType; | ||||
|     bool pluginMenuChanged; | ||||
|     cDisplayMenuView *view; | ||||
|     cDisplayMenuListView *listView; | ||||
|     cDisplayMenuDetailView *detailView; | ||||
| @@ -34,6 +44,7 @@ public: | ||||
|     virtual ~cDisplayMenuRootView(); | ||||
|     bool createOsd(void); | ||||
|     void SetMenu(eMenuCategory menuCat, bool menuInit); | ||||
|     void SetPluginMenu(string name, int menu, int type); | ||||
|     void SetTitle(const char *title); | ||||
|     void SetChannel(const cChannel *channel) { view->SetChannel(channel); }; | ||||
|     const cChannel *GetChannel(void) { return view->GetChannel(); }; | ||||
| @@ -43,6 +54,7 @@ public: | ||||
|     void SetDetailedViewEvent(const cEvent *event); | ||||
|     void SetDetailedViewRecording(const cRecording *recording); | ||||
|     void SetDetailedViewText(const char *text); | ||||
|     bool SetDetailedViewPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens); | ||||
|     void KeyInput(bool up, bool page); | ||||
|     void Clear(void); | ||||
|     int GetMaxItems(void); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user