From 8b8389d975f1867d5e6a8be678678fa3206f4fda Mon Sep 17 00:00:00 2001 From: louis Date: Wed, 15 Oct 2014 18:04:12 +0200 Subject: [PATCH] implemented cSDDisplayMenu::GetTextAreaFont() --- HISTORY | 2 ++ displaymenu.c | 8 +++++- displaymenu.h | 1 + libcore/fontmanager.c | 6 +++++ libcore/fontmanager.h | 1 + libtemplate/templateviewlist.c | 48 ++++++++++++++++++++++++++++++++++ libtemplate/templateviewlist.h | 1 + views/displaymenurootview.c | 20 +++++++++++--- views/displaymenurootview.h | 1 + 9 files changed, 84 insertions(+), 4 deletions(-) diff --git a/HISTORY b/HISTORY index 6fc9968..a5d89e8 100644 --- a/HISTORY +++ b/HISTORY @@ -21,3 +21,5 @@ Version 0.0.2 - changed display of menu lists, do flush first after complete rendering - added support for custom tokens in dislaychannel - added vps token in menudetailepg +- implemented cSDDisplayMenu::GetTextAreaFont() + diff --git a/displaymenu.c b/displaymenu.c index 6764699..d452dbf 100644 --- a/displaymenu.c +++ b/displaymenu.c @@ -2,6 +2,7 @@ #include "libcore/helpers.h" cSDDisplayMenu::cSDDisplayMenu(cTemplate *menuTemplate) { + textAreaFont = NULL; doOutput = true; state = vsInit; if (!menuTemplate) { @@ -20,6 +21,8 @@ cSDDisplayMenu::~cSDDisplayMenu() { if (!doOutput) return; delete rootView; + if (textAreaFont) + delete textAreaFont; } void cSDDisplayMenu::Scroll(bool Up, bool Page) { @@ -180,7 +183,10 @@ int cSDDisplayMenu::GetTextAreaWidth(void) const { } const cFont *cSDDisplayMenu::GetTextAreaFont(bool FixedFont) const { - return NULL; + if (textAreaFont) + return textAreaFont; + textAreaFont = rootView->GetTextAreaFont(); + return textAreaFont; } void cSDDisplayMenu::SetScrollbar(int Total, int Offset) { diff --git a/displaymenu.h b/displaymenu.h index 58bc9c9..c453f3d 100644 --- a/displaymenu.h +++ b/displaymenu.h @@ -18,6 +18,7 @@ private: cDisplayMenuRootView *rootView; eViewState state; bool doOutput; + mutable cFont *textAreaFont; protected: int Tab(int n); public: diff --git a/libcore/fontmanager.c b/libcore/fontmanager.c index 1dcba44..1f45af7 100644 --- a/libcore/fontmanager.c +++ b/libcore/fontmanager.c @@ -108,6 +108,12 @@ cFont *cFontManager::Font(string fontName, int fontSize) { return font; } +cFont *cFontManager::FontUncached(string fontName, int fontSize) { + cMutexLock MutexLock(&mutex); + cFont *font = CreateFont(fontName, fontSize); + return font; +} + /******************************************************************************** * Private Functions ********************************************************************************/ diff --git a/libcore/fontmanager.h b/libcore/fontmanager.h index 7067dfc..bfabb5c 100644 --- a/libcore/fontmanager.h +++ b/libcore/fontmanager.h @@ -28,6 +28,7 @@ class cFontManager { int Width(string fontName, int fontSize, const char *text); int Height(string fontName, int fontSize); cFont *Font(string fontName, int fontSize); + cFont *FontUncached(string fontName, int fontSize); void Debug(void); void ListAvailableFonts(void); }; diff --git a/libtemplate/templateviewlist.c b/libtemplate/templateviewlist.c index 808a89f..e75c528 100644 --- a/libtemplate/templateviewlist.c +++ b/libtemplate/templateviewlist.c @@ -115,6 +115,54 @@ int cTemplateViewList::GetAverageFontWidth(void) { return averageFontWidth; } +cFont *cTemplateViewList::GetTextAreaFont(void) { + if (!listElement) + return NULL; + + int fontWidth = 0; + int numItems = GetNumericParameter(ptNumElements); + int listHeight = GetNumericParameter(ptHeight); + if (listHeight <= 0) + return NULL; + int itemHeight = (double)listHeight / (double)numItems; + string fontFuncName = parameters->GetParameter(ptDeterminateFont); + + cTemplateFunction *fontFunc = listElement->GetFunction(fontFuncName); + if (!fontFunc) + return NULL; + + string fontNameToken = fontFunc->GetParameter(ptFont); + string paramFontSize = fontFunc->GetParameter(ptFontSize); + + string fontName = ""; + if ((fontNameToken.find("{") == 0) && (fontNameToken.find("}") == (fontNameToken.size()-1))) { + fontNameToken = fontNameToken.substr(1, fontNameToken.size()-2); + map::iterator hit = globals->fonts.find(fontNameToken); + if (hit != globals->fonts.end()) { + fontName = hit->second; + } else { + map::iterator def = globals->fonts.find("vdrOsd"); + if (def == globals->fonts.end()) + return NULL; + fontName = def->second; + } + } else { + //if no token, directly use input + fontName = fontNameToken; + } + + cNumericParameter pFontSize(paramFontSize); + pFontSize.SetGlobals(globals); + pFontSize.SetAreaSize(1000, itemHeight); + pFontSize.SetVertical(); + int fontSize = pFontSize.Parse(paramFontSize); + if (!pFontSize.Valid()) + return NULL; + + return fontManager->FontUncached(fontName, fontSize); +} + + int cTemplateViewList::GetMenuItemWidth(void) { return GetNumericParameter(ptMenuItemWidth); } diff --git a/libtemplate/templateviewlist.h b/libtemplate/templateviewlist.h index 8998384..b124a7c 100644 --- a/libtemplate/templateviewlist.h +++ b/libtemplate/templateviewlist.h @@ -41,6 +41,7 @@ public: cTemplateViewElement *GetListElement(void) { return listElement; }; cTemplateViewElement *GetListElementCurrent(void) { return currentElement; }; int GetAverageFontWidth(void); + cFont *GetTextAreaFont(void); int GetMenuItemWidth(void); int GetNumPixmaps(void); void Debug(void); diff --git a/views/displaymenurootview.c b/views/displaymenurootview.c index 2d878ee..93848c2 100644 --- a/views/displaymenurootview.c +++ b/views/displaymenurootview.c @@ -288,15 +288,29 @@ int cDisplayMenuRootView::GetListViewWidth(void) { int cDisplayMenuRootView::GetTextAreaWidth(void) { if (!tmplView) return 1900; - cTemplateView *tempSubView = tmplView->GetSubView(svMenuDefault); - if (!tempSubView) + cTemplateView *tmplSubView = tmplView->GetSubView(svMenuDefault); + if (!tmplSubView) return 1900; - int areaWidth = tempSubView->GetNumericParameter(ptWidth); + int areaWidth = tmplSubView->GetNumericParameter(ptWidth); if (areaWidth > 0) return areaWidth; return 1900; } +cFont *cDisplayMenuRootView::GetTextAreaFont(void) { + if (!tmplView) + return NULL; + cTemplateView *tmplSubViewDefault = tmplView->GetSubView(svMenuDefault); + if (!tmplSubViewDefault) + return NULL; + + cTemplateViewList *tmplViewList = tmplSubViewDefault->GetViewList(vlMenuItem); + if (!tmplViewList) + return NULL; + + return tmplViewList->GetTextAreaFont(); +} + void cDisplayMenuRootView::Render(void) { diff --git a/views/displaymenurootview.h b/views/displaymenurootview.h index b3f4c62..2979746 100644 --- a/views/displaymenurootview.h +++ b/views/displaymenurootview.h @@ -46,6 +46,7 @@ public: int GetMaxItems(void); int GetListViewWidth(void); int GetTextAreaWidth(void); + cFont *GetTextAreaFont(void); bool SubViewAvailable(void) { return subViewAvailable; }; cDisplayMenuListView *GetListView(void) { return listView; }; void Render(void);