summaryrefslogtreecommitdiff
path: root/coreengine/viewdisplayplugin.c
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2016-01-26 18:32:38 +0100
committerlouis <louis.braun@gmx.de>2016-01-26 18:32:38 +0100
commit809fbda03c5014ba9cd361f5113d1d717cd41ea6 (patch)
tree264bbc5640375f1bcb165fc7f4a3e595adcc26ca /coreengine/viewdisplayplugin.c
parent196dd7eb9965a405bb16b51dc870fbbb31aeef87 (diff)
downloadvdr-plugin-skindesigner-809fbda03c5014ba9cd361f5113d1d717cd41ea6.tar.gz
vdr-plugin-skindesigner-809fbda03c5014ba9cd361f5113d1d717cd41ea6.tar.bz2
Version 0.8.0 beta
Diffstat (limited to 'coreengine/viewdisplayplugin.c')
-rw-r--r--coreengine/viewdisplayplugin.c556
1 files changed, 556 insertions, 0 deletions
diff --git a/coreengine/viewdisplayplugin.c b/coreengine/viewdisplayplugin.c
new file mode 100644
index 0000000..1619944
--- /dev/null
+++ b/coreengine/viewdisplayplugin.c
@@ -0,0 +1,556 @@
+#include "viewdisplayplugin.h"
+#include "../config.h"
+/***********************************************************
+* cViewPlugin
+***********************************************************/
+cViewPlugin::cViewPlugin(int id, int plugId) {
+ this->id = id;
+ this->plugId = plugId;
+ viewId = eViewType::DisplayPlugin;
+ viewName = strdup("displayplugin");
+ if (id == 0)
+ numViews = plgManager->GetNumSubviews(plugId) + 1;
+ else
+ numViews = 1;
+ views = new cViewPlugin*[numViews];
+ views[0] = this;
+ for (int i=1; i < numViews; i++) {
+ views[i] = NULL;
+ }
+ numViewElements = plgManager->GetNumViewElements(plugId, id);
+ viewElements = new cViewElement*[numViewElements];
+ for (int i=0; i < numViewElements; i++) {
+ viewElements[i] = NULL;
+ }
+ SetViewElements();
+ numViewGrids = plgManager->GetNumViewGrids(plugId, id);
+ viewGrids = new cViewGrid*[numViewGrids];
+ for (int i=0; i < numViewGrids; i++) {
+ viewGrids[i] = NULL;
+ }
+ SetViewGrids();
+ tabView = NULL;
+ viewChanged = true;
+ newViewId = 0;
+}
+
+cViewPlugin::~cViewPlugin(void) {
+ for (int i=0; i< numViewGrids; i++)
+ delete viewGrids[i];
+ delete[] viewGrids;
+ delete tabView;
+ for (int i=1; i < numViews; i++) {
+ delete views[i];
+ }
+ delete[] views;
+}
+
+/***********************************************************
+* Public Functions
+***********************************************************/
+bool cViewPlugin::ReadFromXML(const char *plugName, const char *tplName, cSdOsd *osd) {
+ cString xmlFile = cString::sprintf("plug-%s-%s", plugName, tplName);
+ cXmlParser parser;
+ if (osd)
+ parser.SetOsd(osd);
+ else
+ parser.SetOsd(&sdOsd);
+ if (!parser.ReadView(this, *xmlFile)) {
+ return false;
+ }
+ if (!parser.ParsePluginView()) {
+ return false;
+ }
+ return true;
+}
+
+bool cViewPlugin::ReadSubViews(const char *plugName) {
+ plgManager->InitPluginSubviewIterator(plugId);
+ int svId = -1;
+ string svTpl = "";
+ while (plgManager->GetNextSubView(svId, svTpl)) {
+ cViewPlugin *plugSubView = new cViewPlugin(svId, plugId);
+ if (!plugSubView->ReadFromXML(plugName, svTpl.c_str(), &sdOsd))
+ return false;
+ views[svId] = plugSubView;
+ }
+ return true;
+}
+
+
+void cViewPlugin::SetGlobals(cGlobals *globals) {
+ cView::SetGlobals(globals);
+ for (int i=0; i < numViewGrids; i++) {
+ if (viewGrids[i])
+ viewGrids[i]->SetGlobals(globals);
+ }
+ for (int i=1; i < numViews; i++) {
+ views[i]->SetGlobals(globals);
+ }
+ if (tabView) {
+ tabView->SetGlobals(globals);
+ }
+}
+
+void cViewPlugin::AddViewElement(cVePlugin *viewElement) {
+ int veId = ViewElementId(viewElement->Name());
+ if (veId == ATTR_UNKNOWN)
+ return;
+ viewElement->SetId(veId);
+ viewElement->SetPluginId(plugId);
+ viewElement->SetViewId(id);
+ viewElement->SetTokenContainer();
+ viewElements[veId] = viewElement;
+}
+
+void cViewPlugin::AddViewGrid(cViewGrid *viewGrid) {
+ int gId = GridId(viewGrid->Name());
+ if (gId == ATTR_UNKNOWN)
+ return;
+ viewGrid->SetId(gId);
+ viewGrid->SetPluginId(plugId);
+ viewGrid->SetViewId(id);
+ viewGrid->SetTokenContainer();
+ viewGrids[gId] = viewGrid;
+}
+
+void cViewPlugin::AddTab(cArea *tab) {
+ if (!tabView) {
+ tabView = new cPluginTabView(id, plugId);
+ tabView->SetOsd(&sdOsd);
+ }
+ tabView->AddTab(tab);
+}
+
+void cViewPlugin::AddScrollbar(cVeDmScrollbar *scrollbar) {
+ if (!tabView) {
+ tabView = new cPluginTabView(id, plugId);
+ tabView->SetOsd(&sdOsd);
+ }
+ int id = ViewElementId("scrollbar");
+ scrollbar->SetId(id);
+ scrollbar->SetTokenContainer();
+ tabView->AddScrollbar(scrollbar);
+}
+
+void cViewPlugin::AddTablabels(cVeDmTablabels *tablabels) {
+ if (!tabView) {
+ tabView = new cPluginTabView(id, plugId);
+ tabView->SetOsd(&sdOsd);
+ }
+ int id = ViewElementId("tablabels");
+ tablabels->SetId(id);
+ tablabels->SetTokenContainer();
+ tabView->AddTablabels(tablabels);
+}
+
+void cViewPlugin::PreCache(void) {
+ if (container.Width() > 0) {
+ attribs->SetContainer(container.X(), container.Y(), container.Width(), container.Height());
+ attribs->Cache();
+ }
+ cView::PreCache();
+ for (int i=0; i < numViewGrids; i++) {
+ if (viewGrids[i]) {
+ viewGrids[i]->SetContainer(0, 0, attribs->Width(), attribs->Height());
+ viewGrids[i]->PreCache();
+ }
+ }
+ for (int i=1; i < numViews; i++) {
+ views[i]->SetContainer(0, 0, attribs->Width(), attribs->Height());
+ views[i]->PreCache();
+ }
+ if (tabView) {
+ tabView->PreCache(0, 0, attribs->Width(), attribs->Height());
+ }
+}
+
+cVePlugin *cViewPlugin::GetViewElement(int veId) {
+ if (!viewElements[veId])
+ return NULL;
+ cVePlugin *ve = dynamic_cast<cVePlugin*>(viewElements[veId]);
+ return ve;
+}
+
+cViewGrid *cViewPlugin::GetViewGrid(int gId) {
+ return viewGrids[gId];
+}
+
+cPluginTabView *cViewPlugin::GetViewTab(void) {
+ return tabView;
+}
+
+void cViewPlugin::Hide(void) {
+ for (int i=0; i < numViewGrids; i++) {
+ if (viewGrids[i])
+ viewGrids[i]->Hide();
+ }
+ for (int i=0; i < numViewElements; i++) {
+ if (viewElements[i])
+ viewElements[i]->Hide();
+ }
+}
+
+void cViewPlugin::Show(void) {
+ for (int i=0; i < numViewGrids; i++) {
+ if (viewGrids[i])
+ viewGrids[i]->Show();
+ }
+ for (int i=0; i < numViewElements; i++) {
+ if (viewElements[i])
+ viewElements[i]->Show();
+ }
+}
+/***********************************************************
+* libskindesigner api interface
+***********************************************************/
+bool cViewPlugin::InitOsd(void) {
+ return Init();
+}
+
+void cViewPlugin::CloseOsd(void) {
+ viewChanged = true;
+ newViewId = 0;
+ Close();
+ for (int i=0 ; i < numViewGrids; i++) {
+ if (viewGrids[i])
+ viewGrids[i]->Close();
+ }
+ for (int i=1 ; i < numViews; i++) {
+ if (views[i])
+ views[i]->Close();
+ }
+}
+
+void cViewPlugin::Deactivate(int viewId, bool hide) {
+ for (int i=0; i < numViewElements; i++) {
+ if (viewElements[i])
+ viewElements[i]->StopScrolling(false);
+ }
+ if (hide)
+ views[viewId]->Hide();
+}
+
+void cViewPlugin::Activate(int viewId) {
+ viewChanged = true;
+ newViewId = viewId;
+ views[viewId]->Show();
+}
+
+void cViewPlugin::SetViewElementTokens(int veId, int viewId, skindesignerapi::cTokenContainer *tk) {
+ cVePlugin *ve = views[viewId]->GetViewElement(veId);
+ if (!ve)
+ return;
+ ve->Set(tk);
+}
+
+void cViewPlugin::ClearViewElement(int veId, int viewId) {
+ cVePlugin *ve = views[viewId]->GetViewElement(veId);
+ if (!ve)
+ return;
+ ve->StopScrolling();
+ ve->Clear();
+}
+
+void cViewPlugin::DisplayViewElement(int veId, int viewId) {
+ cVePlugin *ve = views[viewId]->GetViewElement(veId);
+ if (!ve)
+ return;
+ if (ve->Parse())
+ ve->Render();
+}
+
+void cViewPlugin::SetGrid(long gId, int viewId, int viewGridId, double x, double y, double width, double height, skindesignerapi::cTokenContainer *tk){
+ cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId);
+ if (!grid)
+ return;
+ grid->CheckSize(gId);
+ grid->PositionGrid(gId, x, y, width, height);
+ if (tk) {
+ //only set tokens new if necessary
+ grid->SetTokens(gId, tk);
+ }
+}
+
+void cViewPlugin::SetGridCurrent(long gId, int viewId, int viewGridId, bool current) {
+ if (gId < 0)
+ return;
+ cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId);
+ if (!grid)
+ return;
+ grid->SetCurrentGrid(gId, current);
+}
+
+void cViewPlugin::DeleteGrid(long gId, int viewId, int viewGridId) {
+ cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId);
+ if (!grid)
+ return;
+ grid->DeleteGrid(gId);
+}
+
+void cViewPlugin::DisplayGrids(int viewId, int viewGridId) {
+ cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId);
+ if (!grid)
+ return;
+ grid->Render();
+}
+
+void cViewPlugin::ClearGrids(int viewId, int viewGridId) {
+ cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId);
+ if (!grid)
+ return;
+ grid->ClearGrids();
+}
+
+void cViewPlugin::SetTabTokens(int viewId, skindesignerapi::cTokenContainer *tk) {
+ cPluginTabView *tab = views[viewId]->GetViewTab();
+ if (!tab)
+ return;
+ tab->SetOsd(&sdOsd);
+ tab->Set(tk);
+}
+
+void cViewPlugin::TabLeft(int viewId) {
+ cPluginTabView *tab = views[viewId]->GetViewTab();
+ if (!tab)
+ return;
+ tab->KeyLeft();
+}
+
+void cViewPlugin::TabRight(int viewId) {
+ cPluginTabView *tab = views[viewId]->GetViewTab();
+ if (!tab)
+ return;
+ tab->KeyRight();
+}
+
+void cViewPlugin::TabUp(int viewId) {
+ cPluginTabView *tab = views[viewId]->GetViewTab();
+ if (!tab)
+ return;
+ tab->KeyUp();
+}
+
+void cViewPlugin::TabDown(int viewId) {
+ cPluginTabView *tab = views[viewId]->GetViewTab();
+ if (!tab)
+ return;
+ tab->KeyDown();
+}
+
+void cViewPlugin::DisplayTabs(int viewId) {
+ cPluginTabView *tab = views[viewId]->GetViewTab();
+ if (!tab)
+ return;
+ tab->Render();
+}
+
+void cViewPlugin::ClearTab(int viewId) {
+ cPluginTabView *tab = views[viewId]->GetViewTab();
+ if (!tab)
+ return;
+ tab->Clear();
+}
+
+void cViewPlugin::Flush(void) {
+ if (viewChanged) {
+ viewChanged = false;
+ newTvFrame = views[newViewId]->GetTvFrame();
+ menuInit = true;
+ }
+ cView::Flush();
+}
+
+bool cViewPlugin::ChannelLogoExists(string channelId) {
+ return imgCache->LogoExists(channelId);
+}
+
+string cViewPlugin::GetEpgImagePath(void) {
+ return *config.epgImagePath;
+}
+
+/***********************************************************
+* Private Functions
+***********************************************************/
+void cViewPlugin::SetViewElements(void) {
+ plgManager->InitViewElementIterator(plugId, id);
+ int veId = -1;
+ string veName = "";
+ while (plgManager->GetNextViewElement(veId, veName)) {
+ viewElementNames.insert(pair<string, int>(veName, veId));
+ }
+}
+
+void cViewPlugin::SetViewGrids(void) {
+ plgManager->InitViewGridIterator(plugId, id);
+ int gId = -1;
+ string gName = "";
+ while (plgManager->GetNextViewGrid(gId, gName)) {
+ gridNames.insert(pair<string, int>(gName, gId));
+ }
+}
+
+int cViewPlugin::GridId(const char *name) {
+ map<string, int>::iterator hit = gridNames.find(name);
+ if (hit != gridNames.end())
+ return (int)hit->second;
+ return ATTR_UNKNOWN;
+}
+
+/***********************************************************
+* cPluginTabView
+***********************************************************/
+cPluginTabView::cPluginTabView(int viewId, int plugId) {
+ sdOsd = NULL;
+ init = true;
+ drawScrollbar = true;
+ scrollbar = NULL;
+ tablabels = NULL;
+ detailView = new cViewDetailAdvancedPlugin(viewId, plugId);
+ firstTab = true;
+}
+
+cPluginTabView::~cPluginTabView(void) {
+ delete scrollbar;
+ delete tablabels;
+ delete detailView;
+}
+
+void cPluginTabView::SetGlobals(cGlobals *globals) {
+ detailView->SetGlobals(globals);
+ if (scrollbar)
+ scrollbar->SetGlobals(globals);
+ if (tablabels)
+ tablabels->SetGlobals(globals);
+}
+
+void cPluginTabView::AddTab(cArea *tab) {
+ if (firstTab) {
+ tab->SetActiveTab(true);
+ firstTab = false;
+ }
+ detailView->AddArea(tab);
+}
+
+void cPluginTabView::AddScrollbar(cVeDmScrollbar *scrollbar) {
+ this->scrollbar = scrollbar;
+}
+
+void cPluginTabView::AddTablabels(cVeDmTablabels *tablabels) {
+ this->tablabels = tablabels;
+}
+
+void cPluginTabView::PreCache(int containerX, int containerY, int containerWidth, int containerHeight) {
+ detailView->SetOsd(sdOsd);
+ detailView->SetTokenContainer();
+ detailView->SetContainer(containerX, containerY, containerWidth, containerHeight);
+ detailView->Cache();
+ if (scrollbar) {
+ scrollbar->SetContainer(containerX, containerY, containerWidth, containerHeight);
+ scrollbar->Cache();
+ }
+ if (tablabels) {
+ tablabels->SetContainer(containerX, containerY, containerWidth, containerHeight);
+ tablabels->Cache();
+ }
+}
+
+void cPluginTabView::Set(skindesignerapi::cTokenContainer *tk) {
+ detailView->Set(tk);
+}
+
+void cPluginTabView::Render(void) {
+ detailView->Render();
+ if (drawScrollbar) {
+ drawScrollbar = false;
+ DrawScrollbar();
+ }
+ if (!init)
+ return;
+ init = false;
+ vector<const char*> tabs;
+ int activeTab = detailView->GetTabs(tabs);
+ if (tablabels) {
+ tablabels->SetTabs(tabs);
+ tablabels->SetActiveTab(activeTab);
+ if (tablabels->Parse())
+ tablabels->Render();
+ }
+}
+
+void cPluginTabView::Clear(void) {
+ init = true;
+ drawScrollbar = true;
+ detailView->ResetTabs();
+ detailView->Close();
+ if (tablabels)
+ tablabels->Close();
+ if (scrollbar)
+ scrollbar->Close();
+}
+
+void cPluginTabView::KeyLeft(void) {
+ if (detailView->NumTabs() > 1) {
+ detailView->Clear();
+ detailView->PrevTab();
+ detailView->SetDirty();
+ if (tablabels) {
+ tablabels->Clear();
+ tablabels->SetActiveTab(detailView->ActiveTab());
+ if (tablabels->Parse())
+ tablabels->Render();
+ }
+ sdOsd->Flush();
+ drawScrollbar = true;
+ } else {
+ //scroll page
+ if (detailView->ScrollUp(true)) {
+ drawScrollbar = true;
+ }
+ }
+}
+
+void cPluginTabView::KeyRight(void) {
+ if (detailView->NumTabs() > 1) {
+ detailView->Clear();
+ detailView->NextTab();
+ detailView->SetDirty();
+ if (tablabels) {
+ tablabels->Clear();
+ tablabels->SetActiveTab(detailView->ActiveTab());
+ if (tablabels->Parse())
+ tablabels->Render();
+ }
+ sdOsd->Flush();
+ drawScrollbar = true;
+ } else {
+ //scroll page
+ if (detailView->ScrollDown(true)) {
+ drawScrollbar = true;
+ }
+ }
+}
+
+void cPluginTabView::KeyUp(void) {
+ if (detailView->ScrollUp()) {
+ drawScrollbar = true;
+ }
+}
+
+void cPluginTabView::KeyDown(void) {
+ if (detailView->ScrollDown()) {
+ drawScrollbar = true;
+ }
+}
+
+void cPluginTabView::DrawScrollbar(void) {
+ if (!scrollbar)
+ return;
+ int barheight = 0;
+ int offset = 0;
+ bool end = true;
+ detailView->Scrollbar(barheight, offset, end);
+ scrollbar->SetDetail(barheight, offset, end);
+ scrollbar->Render();
+}
+