summaryrefslogtreecommitdiff
path: root/views
diff options
context:
space:
mode:
Diffstat (limited to 'views')
-rw-r--r--views/displaymessageview.c3
-rw-r--r--views/displaypluginview.c207
-rw-r--r--views/displaypluginview.h33
-rw-r--r--views/view.c104
-rw-r--r--views/view.h3
-rw-r--r--views/viewgrid.c31
-rw-r--r--views/viewgrid.h2
7 files changed, 363 insertions, 20 deletions
diff --git a/views/displaymessageview.c b/views/displaymessageview.c
index c1ffe47..b51802b 100644
--- a/views/displaymessageview.c
+++ b/views/displaymessageview.c
@@ -18,6 +18,9 @@ bool cDisplayMessageView::createOsd(void) {
cOsd::OsdTop() + osdSize.Y(),
osdSize.Width(),
osdSize.Height());
+ if (!ok) {
+ DeleteOsdOnExit(false);
+ }
return ok;
}
diff --git a/views/displaypluginview.c b/views/displaypluginview.c
index 89ff94c..f3471cb 100644
--- a/views/displaypluginview.c
+++ b/views/displaypluginview.c
@@ -1,17 +1,26 @@
#define __STL_CONFIG_H
#include "displaypluginview.h"
-cDisplayPluginView::cDisplayPluginView(cTemplateView *tmplView) : cView(tmplView) {
+cDisplayPluginView::cDisplayPluginView(cTemplateView *tmplView, bool isRootView) : cView(tmplView) {
+ init = true;
+ tabInit = true;
+ tabScrolled = true;
+ hidden = false;
intTokens = NULL;
stringTokens = NULL;
loopTokens = NULL;
- DeleteOsdOnExit();
+ currentTmplTab = NULL;
+ tabView = NULL;
+ if (isRootView)
+ DeleteOsdOnExit();
SetFadeTime(tmplView->GetNumericParameter(ptFadeTime));
}
cDisplayPluginView::~cDisplayPluginView() {
CancelSave();
FadeOut();
+ if (tabView)
+ delete tabView;
}
bool cDisplayPluginView::createOsd(void) {
@@ -23,10 +32,49 @@ bool cDisplayPluginView::createOsd(void) {
return ok;
}
+void cDisplayPluginView::Deactivate(bool hide) {
+ Stop();
+ if (!hide)
+ return;
+ HidePixmaps();
+ for (map< int, cViewGrid* >::iterator it = viewGrids.begin(); it != viewGrids.end(); it++) {
+ cViewGrid *viewGrid = it->second;
+ viewGrid->Hide();
+ }
+ hidden = true;
+}
+
+void cDisplayPluginView::Activate(void) {
+ if (tvScaled) {
+ cDevice::PrimaryDevice()->ScaleVideo(scalingWindow);
+ }
+ if (hidden) {
+ ShowPixmaps();
+ for (map< int, cViewGrid* >::iterator it = viewGrids.begin(); it != viewGrids.end(); it++) {
+ cViewGrid *viewGrid = it->second;
+ viewGrid->Show();
+ }
+ }
+ Start();
+}
+
+void cDisplayPluginView::CleanViewElement(int id) {
+ if (ViewElementScrolls((eViewElement)id)) {
+ currentlyScrolling = false;
+ if (Running())
+ Stop();
+ DestroyViewElement((eViewElement)id);
+ } else {
+ ClearViewElement((eViewElement)id);
+ }
+}
+
void cDisplayPluginView::DisplayViewElement(int id) {
if (!intTokens || !stringTokens || !loopTokens)
return;
DrawViewElement((eViewElement)id, stringTokens, intTokens, loopTokens);
+ if (!init && ViewElementScrolls((eViewElement)id))
+ Start();
}
void cDisplayPluginView::InitGrids(int viewGridID) {
@@ -75,9 +123,162 @@ void cDisplayPluginView::ClearGrids(int viewGridID) {
(hit->second)->Clear();
}
+void cDisplayPluginView::SetTabIntTokens(map<string,int> *intTokens) {
+ tabIntTokens = *intTokens;
+}
+
+void cDisplayPluginView::SetTabStringTokens(map<string,string> *stringTokens) {
+ tabStringTokens = *stringTokens;
+}
+
+void cDisplayPluginView::SetTabLoopTokens(map<string,vector<map<string,string> > > *loopTokens) {
+ tabLoopTokens = *loopTokens;
+}
+
+void cDisplayPluginView::SetTabs(void) {
+ tmplView->InitViewTabIterator();
+ cTemplateViewTab *tmplTab = NULL;
+ while(tmplTab = tmplView->GetNextViewTab()) {
+ tmplTab->ParseDynamicParameters(&tabIntTokens, true);
+ tmplTab->ClearDynamicFunctionParameters();
+ tmplTab->ParseDynamicFunctionParameters(&tabStringTokens, &tabIntTokens);
+ if (tmplTab->DoExecute()) {
+ activeTabs.push_back(tmplTab);
+ }
+ }
+ atIt = activeTabs.begin();
+}
+
+void cDisplayPluginView::TabLeft(void) {
+ if (activeTabs.size() > 1) {
+ currentTmplTab = GetPrevTab();
+ delete tabView;
+ tabView = NULL;
+ tabScrolled = true;
+ } else {
+ tabScrolled = tabView->KeyLeft();
+ }
+}
+
+void cDisplayPluginView::TabRight(void) {
+ if (activeTabs.size() > 1) {
+ currentTmplTab = GetNextTab();
+ delete tabView;
+ tabView = NULL;
+ tabScrolled = true;
+ } else {
+ tabScrolled = tabView->KeyRight();
+ }
+}
+
+void cDisplayPluginView::TabUp(void) {
+ tabScrolled = tabView->KeyUp();
+}
+
+void cDisplayPluginView::TabDown(void) {
+ tabScrolled = tabView->KeyDown();
+}
+
+void cDisplayPluginView::DisplayTab(void) {
+ if (tabInit) {
+ currentTmplTab = *atIt;
+ tabInit = false;
+ }
+ if (!tabView) {
+ tabView = new cDisplayMenuTabView(currentTmplTab);
+ tabView->SetTokens(&tabIntTokens, &tabStringTokens, &tabLoopTokens);
+ tabView->CreateTab();
+ tabView->Start();
+ DrawTabLabels();
+ }
+ if (tabScrolled) {
+ DrawScrollbar();
+ }
+}
+
+cTemplateViewTab *cDisplayPluginView::GetPrevTab(void) {
+ if (atIt == activeTabs.begin()) {
+ atIt = activeTabs.end();
+ }
+ atIt--;
+ return *atIt;
+}
+
+cTemplateViewTab *cDisplayPluginView::GetNextTab(void) {
+ atIt++;
+ if (atIt == activeTabs.end()) {
+ atIt = activeTabs.begin();
+ }
+ return *atIt;
+}
+
+void cDisplayPluginView::DrawScrollbar(void) {
+ map < string, string > scrollbarStringTokens;
+ map < string, int > scrollbarIntTokens;
+
+ int barTop = 0;
+ int barHeight = 0;
+ tabView->GetScrollbarPosition(barTop, barHeight);
+
+ scrollbarIntTokens.insert(pair<string,int>("height", barHeight));
+ scrollbarIntTokens.insert(pair<string,int>("offset", barTop));
+ ClearViewElement((eViewElement)pveScrollbar);
+ DrawViewElement((eViewElement)pveScrollbar, &scrollbarStringTokens, &scrollbarIntTokens);
+}
+
+void cDisplayPluginView::DrawTabLabels(void) {
+ if (!ViewElementImplemented((eViewElement)pveTablabels)) {
+ return;
+ }
+ map < string, string > labelStringTokens;
+ map < string, int > labelIntTokens;
+ map < string, vector< map< string, string > > > labelLoopTokens;
+
+ string labelPrev = "";
+ string labelPrevTemp = "";
+ string labelCurrent = "";
+ string labelNext = "";
+ bool wasCurrent = false;
+ vector< map< string, string > > tabLabels;
+ for (list<cTemplateViewTab*>::iterator it = activeTabs.begin(); it != activeTabs.end(); it++) {
+ cTemplateViewTab *tab = *it;
+ map< string, string > tabLabel;
+ tabLabel.insert(pair< string, string >("tabs[title]", tab->GetName()));
+ if (wasCurrent) {
+ labelNext = tab->GetName();
+ }
+ if (tab == currentTmplTab) {
+ wasCurrent = true;
+ labelCurrent = tab->GetName();
+ labelPrev = labelPrevTemp;
+ tabLabel.insert(pair< string, string >("tabs[current]", "1"));
+ } else {
+ wasCurrent = false;
+ tabLabel.insert(pair< string, string >("tabs[current]", "0"));
+ }
+ labelPrevTemp = tab->GetName();
+ tabLabels.push_back(tabLabel);
+ }
+ if (labelNext.size() == 0 && activeTabs.size() > 0) {
+ cTemplateViewTab *firstTab = activeTabs.front();
+ labelNext = firstTab->GetName();
+ }
+ if (labelPrev.size() == 0 && activeTabs.size() > 0) {
+ cTemplateViewTab *lastTab = activeTabs.back();
+ labelPrev = lastTab->GetName();
+ }
+ labelStringTokens.insert(pair< string, string >("currenttab", labelCurrent));
+ labelStringTokens.insert(pair< string, string >("nexttab", labelNext));
+ labelStringTokens.insert(pair< string, string >("prevtab", labelPrev));
+ labelLoopTokens.insert(pair< string, vector< map< string, string > > >("tabs", tabLabels));
+
+ ClearViewElement((eViewElement)pveTablabels);
+ DrawViewElement((eViewElement)pveTablabels, &labelStringTokens, &labelIntTokens, &labelLoopTokens);
+}
+
void cDisplayPluginView::Action(void) {
SetInitFinished();
FadeIn();
DoFlush();
cView::Action();
-}
+} \ No newline at end of file
diff --git a/views/displaypluginview.h b/views/displaypluginview.h
index b170116..b3307a6 100644
--- a/views/displaypluginview.h
+++ b/views/displaypluginview.h
@@ -1,25 +1,45 @@
#ifndef __DISPLAYPLUGINVIEW_H
#define __DISPLAYPLUGINVIEW_H
+#include <list>
#include <vdr/thread.h>
#include "../libtemplate/template.h"
#include "view.h"
#include "viewgrid.h"
+#include "displaymenutabview.h"
class cDisplayPluginView : public cView {
private:
+ bool init;
+ bool tabInit;
+ bool tabScrolled;
+ bool hidden;
map<string,int> *intTokens;
map<string,string> *stringTokens;
map<string,vector<map<string,string> > > *loopTokens;
map< int, cViewGrid* > viewGrids;
+ map<string,int> tabIntTokens;
+ map<string,string> tabStringTokens;
+ map<string,vector<map<string,string> > > tabLoopTokens;
+ cTemplateViewTab *currentTmplTab;
+ list<cTemplateViewTab*> activeTabs;
+ list<cTemplateViewTab*>::iterator atIt;
+ cDisplayMenuTabView *tabView;
+ cTemplateViewTab *GetPrevTab(void);
+ cTemplateViewTab *GetNextTab(void);
+ void DrawScrollbar(void);
+ void DrawTabLabels(void);
virtual void Action(void);
public:
- cDisplayPluginView(cTemplateView *tmplView);
+ cDisplayPluginView(cTemplateView *tmplView, bool isRootView);
virtual ~cDisplayPluginView();
bool createOsd(void);
+ void Deactivate(bool hide);
+ void Activate(void);
void SetIntTokens(map<string,int> *intTokens) { this->intTokens = intTokens; };
void SetStringTokens(map<string,string> *stringTokens) { this->stringTokens = stringTokens; };
void SetLoopTokens(map<string,vector<map<string,string> > > *loopTokens) { this->loopTokens = loopTokens; };
+ void CleanViewElement(int id);
void DisplayViewElement(int id);
void InitGrids(int viewGridID);
void SetGrid(int viewGridID, long gridID, double x, double y, double width, double height, map<string,int> *intTokens, map<string,string> *stringTokens);
@@ -27,7 +47,16 @@ public:
void DeleteGrid(int viewGridID, long gridID);
void DisplayGrids(int viewGridID);
void ClearGrids(int viewGridID);
- void DoStart(void) { Start(); };
+ void SetTabIntTokens(map<string,int> *intTokens);
+ void SetTabStringTokens(map<string,string> *stringTokens);
+ void SetTabLoopTokens(map<string,vector<map<string,string> > > *loopTokens);
+ void SetTabs(void);
+ void TabLeft(void);
+ void TabRight(void);
+ void TabUp(void);
+ void TabDown(void);
+ void DisplayTab(void);
+ void DoStart(void) { init = false; Start(); };
void Flush(void) { DoFlush(); };
};
#endif //__DISPLAYPLUGINVIEW_H
diff --git a/views/view.c b/views/view.c
index 1571d2e..9e5a53a 100644
--- a/views/view.c
+++ b/views/view.c
@@ -16,7 +16,7 @@ cView::cView(cTemplateView *tmplView) : cPixmapContainer(tmplView->GetNumPixmaps
Init();
}
-cView::cView(cTemplateViewElement *tmplItem) : cPixmapContainer(tmplItem->GetNumPixmaps()) {
+cView::cView(cTemplateViewElement *tmplItem) : cPixmapContainer(tmplItem ? tmplItem->GetNumPixmaps() : 0) {
this->tmplItem = tmplItem;
tmplView = NULL;
tmplTab = NULL;
@@ -164,6 +164,23 @@ void cView::ClearViewElement(eViewElement ve) {
}
}
+void cView::DestroyViewElement(eViewElement ve) {
+ if (!tmplView)
+ return;
+ cTemplateViewElement *viewElement = tmplView->GetViewElement(ve);
+ if (!viewElement)
+ return;
+ int pixCurrent = viewElement->GetPixOffset();
+ if (pixCurrent < 0)
+ return;
+ cTemplatePixmap *pix = NULL;
+ viewElement->InitIterator();
+ while(pix = viewElement->GetNextPixmap()) {
+ DestroyPixmap(pixCurrent);
+ pixCurrent++;
+ }
+}
+
void cView::ActivateScrolling(void) {
if (veScroll == veUndefined)
return;
@@ -192,6 +209,22 @@ bool cView::ViewElementImplemented(eViewElement ve) {
return tmplView->GetNumPixmapsViewElement(ve);
}
+bool cView::ViewElementScrolls(eViewElement ve) {
+ if (scrollingPix < 0)
+ return false;
+ if (!tmplView)
+ return false;
+ cTemplateViewElement *viewElement = tmplView->GetViewElement(ve);
+ if (!viewElement)
+ return false;
+ int pixStart = viewElement->GetPixOffset();
+ int numPixmaps = viewElement->GetNumPixmaps();
+ if ( (scrollingPix >= pixStart) && (scrollingPix < (pixStart + numPixmaps)) )
+ return true;
+ return false;
+}
+
+
void cView::CreateViewPixmap(int num, cTemplatePixmap *pix, cRect *size) {
cRect pixSize;
if (size) {
@@ -236,6 +269,9 @@ void cView::DrawPixmap(int num, cTemplatePixmap *pix, map < string, vector< map<
case ftDrawText:
DoDrawText(num, func);
break;
+ case ftDrawTextVertical:
+ DoDrawTextVertical(num, func);
+ break;
case ftDrawTextBox: {
int floating = func->GetNumericParameter(ptFloat);
if (floating > flNone) {
@@ -438,6 +474,53 @@ void cView::DoDrawText(int num, cTemplateFunction *func, int x0, int y0) {
DrawText(num, pos, text.c_str(), clr, clrBack, fontName, fontSize);
}
+void cView::DoDrawTextVertical(int num, cTemplateFunction *func, int x0, int y0) {
+ string fontName = func->GetFontName();
+ int fontSize = func->GetNumericParameter(ptFontSize);
+ tColor clr = func->GetColorParameter(ptColor);
+ tColor clrBack = clrTransparent;
+ string text = func->GetText(false);
+ cImage *textVertical = imgCache->GetVerticalText(text, clr, fontName, fontSize);
+ if (!textVertical)
+ return;
+
+ //align has to be set here because here we know the image size
+ int x = 0;
+ int y = 0;
+ int align = func->GetNumericParameter(ptAlign);
+ if (align == alCenter) {
+ int containerWidth = func->GetContainerWidth();
+ x = (containerWidth - textVertical->Width()) / 2;
+ } else if (align == alLeft) {
+ x = 0;
+ } else if (align = alRight) {
+ int containerWidth = func->GetContainerWidth();
+ x = (containerWidth - textVertical->Width());
+ } else {
+ x = func->GetNumericParameter(ptX);
+ }
+
+ int valign = func->GetNumericParameter(ptValign);
+ if (valign == alCenter) {
+ int containerHeight = func->GetContainerHeight();
+ y = (containerHeight - textVertical->Height()) / 2;
+ } else if (align == alTop) {
+ y = 0;
+ } else if (align = alBottom) {
+ int containerHeight = func->GetContainerHeight();
+ y = (containerHeight - textVertical->Height());
+ } else {
+ y = func->GetNumericParameter(ptY);
+ }
+
+ if (x < 0) x = 0;
+ x += x0;
+ if (y < 0) y = func->GetContainerHeight() - textVertical->Height() - 5;
+ y += y0;
+ cPoint pos(x,y);
+ DrawImage(num, pos, *textVertical);
+}
+
void cView::DoDrawTextBox(int num, cTemplateFunction *func, int x0, int y0) {
string text = func->GetText(false);
if (text.size() < 3)
@@ -858,17 +941,22 @@ cGrid::~cGrid() {
void cGrid::Set(double x, double y, double width, double height,
map <string,int> *intTokens, map <string,string> *stringTokens) {
+
if ((width != this->width) || (height != this->height)) {
+ this->width = width;
+ this->height = height;
resized = true;
dirty = false;
} else {
resized = false;
}
- this->x = x;
- this->y = y;
- this->width = width;
- this->height = height;
- moved = true;
+ if (this->x != x || this->y != y) {
+ this->x = x;
+ this->y = y;
+ moved = true;
+ } else {
+ moved = false;
+ }
if (intTokens) {
this->intTokens = *intTokens;
SetCurrent(current);
@@ -889,6 +977,8 @@ void cGrid::SetCurrent(bool current) {
}
void cGrid::Move(void) {
+ if (!tmplItem)
+ return;
tmplItem->InitIterator();
cTemplatePixmap *pix = NULL;
int pixCurrent = 0;
@@ -905,6 +995,8 @@ void cGrid::Move(void) {
}
void cGrid::Draw(void) {
+ if (!tmplItem)
+ return;
if (tmplItem->DebugTokens()) {
DebugTokens("Grid", &stringTokens, &intTokens);
}
diff --git a/views/view.h b/views/view.h
index 7b5bd9b..77ad318 100644
--- a/views/view.h
+++ b/views/view.h
@@ -13,6 +13,7 @@ private:
void Init(void);
void DoFill(int num, cTemplateFunction *func);
void DoDrawText(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
+ void DoDrawTextVertical(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
void DoDrawTextBox(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
void DoDrawFloatingTextBox(int num, cTemplateFunction *func);
void DoDrawRectangle(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
@@ -40,7 +41,9 @@ protected:
int scrollSpeed;
void DrawViewElement(eViewElement ve, map <string,string> *stringTokens = NULL, map <string,int> *intTokens = NULL, map < string, vector< map< string, string > > > *loopTokens = NULL);
void ClearViewElement(eViewElement ve);
+ void DestroyViewElement(eViewElement ve);
bool ViewElementImplemented(eViewElement ve);
+ bool ViewElementScrolls(eViewElement ve);
void CreateViewPixmap(int num, cTemplatePixmap *pix, cRect *size = NULL);
void CreateScrollingPixmap(int num, cTemplatePixmap *pix, cSize &drawportSize);
void DrawPixmap(int num, cTemplatePixmap *pix, map < string, vector< map< string, string > > > *loopTokens = NULL, bool flushPerLoop = false);
diff --git a/views/viewgrid.c b/views/viewgrid.c
index 6488ccd..008133e 100644
--- a/views/viewgrid.c
+++ b/views/viewgrid.c
@@ -25,7 +25,6 @@ void cViewGrid::SetGrid(long gridID,
}
void cViewGrid::SetCurrent(long gridID, bool current) {
- esyslog("skindesigner: setting %ld to current %d", gridID, current);
map<long,cGrid*>::iterator hit = grids.find(gridID);
if (hit != grids.end())
(hit->second)->SetCurrent(current);
@@ -35,7 +34,6 @@ void cViewGrid::Delete(long gridID) {
map<long,cGrid*>::iterator hit = grids.find(gridID);
if (hit == grids.end())
return;
- esyslog("skindesigner: deleting grid %ld", gridID);
delete (hit->second);
grids.erase(gridID);
}
@@ -47,28 +45,43 @@ void cViewGrid::Clear(void) {
}
void cViewGrid::Render(void) {
- esyslog("skindesigner: rendering %ld grids", grids.size());
for (map < long, cGrid* >::iterator it = grids.begin(); it != grids.end(); it++) {
cGrid *grid = it->second;
if (grid->Dirty()) {
if (grid->Moved()) {
- grid->DeletePixmaps();
+ grid->Move();
}
- esyslog("skindesigner: rendering grid %ld", it->first);
+ grid->Clear();
+ //esyslog("skindesigner: rendering grid %ld", it->first);
grid->Draw();
} else if (grid->Resized()) {
- esyslog("skindesigner: resizing grid %ld", it->first);
+ //esyslog("skindesigner: resizing grid %ld", it->first);
grid->DeletePixmaps();
grid->Draw();
} else if (grid->Moved()) {
- esyslog("skindesigner: moving grid %ld", it->first);
- grid->Move();
+ //esyslog("skindesigner: moving grid %ld", it->first);
+ grid->Move();
} else {
- esyslog("skindesigner: skipping grid %ld", it->first);
+ //esyslog("skindesigner: skipping grid %ld", it->first);
}
}
}
+void cViewGrid::Hide(void) {
+ for (map < long, cGrid* >::iterator it = grids.begin(); it != grids.end(); it++) {
+ cGrid *grid = it->second;
+ grid->HidePixmaps();
+ }
+}
+
+void cViewGrid::Show(void) {
+ for (map < long, cGrid* >::iterator it = grids.begin(); it != grids.end(); it++) {
+ cGrid *grid = it->second;
+ grid->ShowPixmaps();
+ }
+}
+
+
void cViewGrid::Debug(void) {
} \ No newline at end of file
diff --git a/views/viewgrid.h b/views/viewgrid.h
index 84209c3..0fc11f6 100644
--- a/views/viewgrid.h
+++ b/views/viewgrid.h
@@ -20,6 +20,8 @@ public:
void Delete(long gridID);
void Clear(void);
void Render(void);
+ void Hide(void);
+ void Show(void);
void Debug(void);
};