summaryrefslogtreecommitdiff
path: root/coreengine/viewelement.c
diff options
context:
space:
mode:
Diffstat (limited to 'coreengine/viewelement.c')
-rw-r--r--coreengine/viewelement.c1062
1 files changed, 531 insertions, 531 deletions
diff --git a/coreengine/viewelement.c b/coreengine/viewelement.c
index 5f6f04b..4759b60 100644
--- a/coreengine/viewelement.c
+++ b/coreengine/viewelement.c
@@ -1,532 +1,532 @@
-#include "viewelement.h"
-#include "../config.h"
-
-/******************************************************************
-* cViewElement
-******************************************************************/
-cViewElement::cViewElement(void) {
- sdOsd = NULL;
- id = -1;
- dirty = true;
- init = true;
- drawn = false;
- scrollingStarted = false;
- blocked = false;
- detached = false;
- waitOnWakeup = true;
- startAnimation = true;
- globals = NULL;
- tokenContainer = NULL;
- attribs = new cViewElementAttribs((int)eViewElementAttribs::count);
- detacher = NULL;
- fader = NULL;
- shifter = NULL;
-}
-
-cViewElement::cViewElement(const cViewElement &other) {
- sdOsd = other.sdOsd;
- id = other.id;
- dirty = other.dirty;
- init = other.init;
- drawn = false;
- scrollingStarted = false;
- blocked = false;
- detached = false;
- waitOnWakeup = true;
- startAnimation = true;
- globals = other.globals;
- container.Set(other.container.X(), other.container.Y(), other.container.Width(), other.container.Height());
- tokenContainer = NULL;
- attribs = new cViewElementAttribs(*other.attribs);
-
- for (cAreaNode *node = other.areaNodes.First(); node; node = other.areaNodes.Next(node)) {
- if (cArea *a = dynamic_cast<cArea*>(node)) {
- areaNodes.Add(new cArea(*a));
- } else if (cAreaContainer *ac = dynamic_cast<cAreaContainer*>(node)) {
- areaNodes.Add(new cAreaContainer(*ac));
- }
- }
-
- detacher = NULL;
- fader = NULL;
- shifter = NULL;
-}
-
-cViewElement::~cViewElement(void) {
- delete attribs;
- delete detacher;
- delete fader;
- delete shifter;
- delete tokenContainer;
-}
-
-/******************************************************************
-* Public Functions
-******************************************************************/
-cViewElement *cViewElement::CreateViewElement(const char *name, const char *viewname) {
- cViewElement *e = NULL;
-
- //common view elements
- if (!strcmp(name, "background") && strcmp(viewname, "displayaudiotracks"))
- e = new cViewElement();
- else if (!strcmp(name, "datetime"))
- e = new cVeDateTime();
- else if (!strcmp(name, "time"))
- e = new cVeTime();
- else if (!strcmp(name, "message"))
- e = new cVeMessage();
- else if (!strcmp(name, "devices"))
- e = new cVeDevices();
- else if (!strcmp(name, "currentweather"))
- e = new cVeCurrentWeather();
- else if (!strcmp(name, "customtokens"))
- e = new cVeCustomTokens();
-
- //displaychannel viewelements
- else if (!strcmp(name, "channelinfo"))
- e = new cVeDcChannelInfo();
- else if (!strcmp(name, "channelgroup"))
- e = new cVeDcChannelGroup();
- else if (!strcmp(name, "epginfo"))
- e = new cVeDcEpgInfo();
- else if (!strcmp(name, "progressbar") && !strcmp(viewname, "displaychannel"))
- e = new cVeDcProgressBar();
- else if (!strcmp(name, "statusinfo"))
- e = new cVeDcStatusInfo();
- else if (!strcmp(name, "audioinfo"))
- e = new cVeDcAudioInfo();
- else if (!strcmp(name, "screenresolution"))
- e = new cVeDcScreenResolution();
- else if (!strcmp(name, "signalquality"))
- e = new cVeDcSignalQuality();
- else if (!strcmp(name, "scrapercontent") && !strcmp(viewname, "displaychannel"))
- e = new cVeDcScraperContent();
- else if (!strcmp(name, "ecminfo"))
- e = new cVeDcEcmInfo();
-
- //displaymenu viewelements
- else if (!strcmp(name, "header") && strcmp(viewname, "displayaudiotracks"))
- e = new cVeDmHeader();
- else if (!strcmp(name, "sortmode"))
- e = new cVeDmSortmode();
- else if (!strcmp(name, "colorbuttons"))
- e = new cVeDmColorbuttons();
- else if (!strcmp(name, "scrollbar"))
- e = new cVeDmScrollbar();
- else if (!strcmp(name, "timers"))
- e = new cVeDmTimers();
- else if (!strcmp(name, "currentschedule"))
- e = new cVeDmCurrentschedule();
- else if (!strcmp(name, "discusage"))
- e = new cVeDmDiscusage();
- else if (!strcmp(name, "systemload"))
- e = new cVeDmSystemload();
- else if (!strcmp(name, "systemmemory"))
- e = new cVeDmSystemmemory();
- else if (!strcmp(name, "temperatures"))
- e = new cVeDmTemperatures();
- else if (!strcmp(name, "vdrstatistics"))
- e = new cVeDmVdrstatistics();
- else if (!strcmp(name, "lastrecordings"))
- e = new cVeDmLastrecordings();
- else if (!strcmp(name, "detailheaderepg"))
- e = new cVeDmDetailheaderEpg();
- else if (!strcmp(name, "detailheaderrec"))
- e = new cVeDmDetailheaderRec();
- else if (!strcmp(name, "detailheaderplugin"))
- e = new cVeDmDetailheaderPlugin();
- else if (!strcmp(name, "tablabels"))
- e = new cVeDmTablabels();
-
- //displayreplay viewelements
- else if (!strcmp(name, "backgroundmodeonly"))
- e = new cViewElement();
- else if (!strcmp(name, "rectitle"))
- e = new cVeDrRecTitle();
- else if (!strcmp(name, "recinfo"))
- e = new cVeDrRecInfo();
- else if (!strcmp(name, "currenttime"))
- e = new cVeDrCurrentTime();
- else if (!strcmp(name, "totaltime"))
- e = new cVeDrTotalTime();
- else if (!strcmp(name, "endtime"))
- e = new cVeDrEndTime();
- else if (!strcmp(name, "progressbar") && !strcmp(viewname, "displayreplay"))
- e = new cVeDrProgressBar();
- else if (!strcmp(name, "cutmarks"))
- e = new cVeDrCutMarks();
- else if (!strcmp(name, "controlicons"))
- e = new cVeDrControlIcons();
- else if (!strcmp(name, "controliconsmodeonly"))
- e = new cVeDrControlIcons();
- else if (!strcmp(name, "progressmodeonly"))
- e = new cVeDrProgressModeonly();
- else if (!strcmp(name, "jump"))
- e = new cVeDrJump();
- else if (!strcmp(name, "onpause"))
- e = new cVeDrOnPause();
- else if (!strcmp(name, "onpausemodeonly"))
- e = new cVeDrOnPause();
- else if (!strcmp(name, "scrapercontent") && !strcmp(viewname, "displayreplay"))
- e = new cVeDrScraperContent();
-
- //displayvolume viewelements
- else if (!strcmp(name, "volume"))
- e = new cVeVolume();
-
- //displayvolume viewelements
- else if (!strcmp(name, "background") && !strcmp(viewname, "displayaudiotracks"))
- e = new cVeDtBackground();
- else if (!strcmp(name, "header") && !strcmp(viewname, "displayaudiotracks"))
- e = new cVeDtHeader();
-
- //default
- else {
- dsyslog("skindesigner: unknown view element %s", name);
- e = new cViewElement();
- }
-
- return e;
-}
-
-void cViewElement::SetGlobals(cGlobals *globals) {
- this->globals = globals;
- attribs->SetGlobals(globals);
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->SetGlobals(globals);
- }
-}
-
-void cViewElement::SetTokenContainer(void) {
- tokenContainer = new skindesignerapi::cTokenContainer();
- InheritTokenContainer();
-}
-
-bool cViewElement::Detached(void) {
- return detached;
-}
-
-void cViewElement::SetContainer(int x, int y, int width, int height) {
- container.SetX(x);
- container.SetY(y);
- container.SetWidth(width);
- container.SetHeight(height);
-}
-
-void cViewElement::SetAttributes(vector<stringpair> &attributes) {
- attribs->Set(attributes);
-}
-
-void cViewElement::AddArea(cAreaNode *area) {
- areaNodes.Add(area);
-}
-
-void cViewElement::SetAreaX(int x) {
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->SetX(x);
- }
-}
-
-void cViewElement::SetAreaY(int y) {
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->SetY(y);
- }
-}
-
-void cViewElement::SetAreaWidth(int width) {
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->SetWidth(width);
- }
-}
-
-void cViewElement::SetAreaHeight(int height) {
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->SetHeight(height);
- }
-}
-
-void cViewElement::SetPosition(int newX, int newY, int newWidth, int newHeight) {
- cRect newPos(newX, newY, newWidth, newHeight);
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->SetViewPort(newPos);
- }
-}
-
-void cViewElement::Cache(void) {
- attribs->SetContainer(container.X(), container.Y(), container.Width(), container.Height());
- attribs->Cache();
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->SetContainer(container.X(), container.Y(), container.Width(), container.Height());
- node->Cache();
- }
-}
-
-bool cViewElement::Execute(void) {
- return attribs->DoExecute();
-}
-
-void cViewElement::Clear(void) {
- tokenContainer->Clear();
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- sdOsd->Lock();
- node->Clear();
- sdOsd->Unlock();
- }
- dirty = false;
- drawn = false;
- scrollingStarted = false;
-}
-
-void cViewElement::Hide(void) {
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- sdOsd->Lock();
- node->Hide();
- sdOsd->Unlock();
- }
- init = true;
- StopScrolling();
-}
-
-void cViewElement::Show(void) {
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- sdOsd->Lock();
- node->Show();
- sdOsd->Unlock();
- }
-}
-
-void cViewElement::WakeUp(void) {
- if (!detacher || !waitOnWakeup) {
- return;
- }
- detacher->WakeUp();
-}
-
-void cViewElement::Close(void) {
- delete detacher;
- detacher = NULL;
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- sdOsd->Lock();
- node->Close();
- sdOsd->Unlock();
- }
- StopScrolling();
- dirty = true;
- init = true;
- startAnimation = true;
- drawn = false;
- scrollingStarted = false;
- blocked = false;
-}
-
-void cViewElement::Render(void) {
- if (!dirty || blocked)
- return;
-
- if (attribs->DoDebug())
- Debug();
-
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- //Check redraw of already scrolling list element
- if (drawn && scrollingStarted && node->Scrolling()) {
- if (DoScroll()) {
- //current list element
- continue;
- } else {
- //not current list element anymore
- scrollingStarted = false;
- }
- }
- sdOsd->Lock();
- node->Clear();
- sdOsd->Unlock();
- if (!node->Execute())
- continue;
- if (node->BackgroundArea() && drawn)
- continue;
- sdOsd->Lock();
- node->Render();
- sdOsd->Unlock();
-
- if (DoScroll() && node->Scrolling()) {
- cArea *scrollArea = node->ScrollingArea();
- if (scrollArea) {
- scrollingStarted = true;
- cAnimation *scroller = new cAnimation(scrollArea);
- scrollers.Add(scroller);
- scroller->Start();
- }
- }
- }
- dirty = false;
- drawn = true;
- if (startAnimation) {
- startAnimation = false;
- StartAnimation();
- }
-}
-
-void cViewElement::StopScrolling(bool deletePixmaps) {
- for (cAnimation *scroller = scrollers.First(); scroller; scroller = scrollers.Next(scroller)) {
- scroller->Stop(deletePixmaps);
- }
- scrollers.Clear();
-}
-
-void cViewElement::ParseDetached(void) {
- Parse(true);
-}
-
-void cViewElement::RenderDetached(void) {
- blocked = false;
- Render();
-}
-
-bool cViewElement::Shifting(void) {
- if (attribs->ShiftTime() >= 0) {
- return true;
- }
- return false;
-}
-
-bool cViewElement::Fading(void) {
- if (attribs->FadeTime() >= 0) {
- return true;
- }
- return false;
-}
-
-int cViewElement::FadeTime(void) {
- return attribs->FadeTime();
-}
-
-int cViewElement::ShiftTime(void) {
- return attribs->ShiftTime();
-}
-
-int cViewElement::ShiftMode(void) {
- return attribs->ShiftMode();
-}
-
-void cViewElement::StartAnimation(void) {
- if (ShiftTime() > 0) {
- cRect shiftbox = CoveredArea();
- cPoint ref = cPoint(shiftbox.X(), shiftbox.Y());
- cPoint start = ShiftStart(shiftbox);
- SetPosition(start, ref);
- sdOsd->Flush();
- delete shifter;
- shifter = new cAnimation((cShiftable*)this, start, ref, true);
- shifter->Start();
- } else if (FadeTime() > 0) {
- SetTransparency(100);
- sdOsd->Flush();
- delete fader;
- fader = new cAnimation((cFadable*)this, true);
- fader->Start();
- }
-}
-
-void cViewElement::SetTransparency(int transparency, bool force) {
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- sdOsd->Lock();
- node->SetTransparency(transparency);
- sdOsd->Unlock();
- }
-}
-
-void cViewElement::SetPosition(cPoint &position, cPoint &reference, bool force) {
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- sdOsd->Lock();
- node->SetPosition(position, reference);
- sdOsd->Unlock();
- }
-}
-
-cRect cViewElement::CoveredArea(void) {
- cRect unionArea;
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- unionArea.Combine(node->CoveringArea());
- }
- return unionArea;
-}
-
-void cViewElement::Flush(void) {
- sdOsd->Flush();
-}
-
-bool cViewElement::Parse(bool forced) {
- if (blocked && !forced) {
- return false;
- }
- if (!Detached() || !init) {
- return true;
- }
- delete detacher;
- detacher = new cAnimation((cDetachable*)this, waitOnWakeup, startAnimation);
- detacher->Start();
- startAnimation = false;
- init = false;
- blocked = true;
- return false;
-}
-
-cFunction *cViewElement::GetFunction(const char *name) {
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- if (cFunction *f = node->GetFunction(name))
- return f;
- }
- return NULL;
-}
-
-void cViewElement::Debug(bool full) {
- esyslog("skindesigner: ---> viewElement %d", id);
- tokenContainer->Debug();
- esyslog("skindesigner: container %d %d %dx%d", container.X(), container.Y(), container.Width(), container.Height());
- attribs->Debug();
- if (!full)
- return;
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->Debug(full);
- }
-}
-
-/******************************************************************
-* protected Functions
-******************************************************************/
-void cViewElement::InheritTokenContainer(void) {
- tokenContainer->CreateContainers();
- attribs->SetTokenContainer(tokenContainer);
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->SetTokenContainer(tokenContainer);
- }
-}
-
-void cViewElement::InheritTokenContainerDeep(void) {
- tokenContainer->CreateContainers();
- attribs->SetTokenContainerDeep(tokenContainer);
- for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
- node->SetTokenContainerDeep(tokenContainer);
- }
-}
-
-cPoint cViewElement::ShiftStart(cRect &shiftbox) {
- eShiftType type = (eShiftType)attribs->ShiftType();
- cPoint start;
- if (type == eShiftType::none) {
- start = attribs->ShiftStartpoint();
- } else if (type == eShiftType::left) {
- start.SetX(-shiftbox.Width());
- start.SetY(shiftbox.Y());
- } else if (type == eShiftType::right) {
- start.SetX(cOsd::OsdWidth());
- start.SetY(shiftbox.Y());
- } else if (type == eShiftType::top) {
- start.SetX(shiftbox.X());
- start.SetY(-shiftbox.Height());
- } else if (type == eShiftType::bottom) {
- start.SetX(shiftbox.X());
- start.SetY(cOsd::OsdHeight());
- }
- return start;
+#include "viewelement.h"
+#include "../config.h"
+
+/******************************************************************
+* cViewElement
+******************************************************************/
+cViewElement::cViewElement(void) {
+ sdOsd = NULL;
+ id = -1;
+ dirty = true;
+ init = true;
+ drawn = false;
+ scrollingStarted = false;
+ blocked = false;
+ detached = false;
+ waitOnWakeup = true;
+ startAnimation = true;
+ globals = NULL;
+ tokenContainer = NULL;
+ attribs = new cViewElementAttribs((int)eViewElementAttribs::count);
+ detacher = NULL;
+ fader = NULL;
+ shifter = NULL;
+}
+
+cViewElement::cViewElement(const cViewElement &other) {
+ sdOsd = other.sdOsd;
+ id = other.id;
+ dirty = other.dirty;
+ init = other.init;
+ drawn = false;
+ scrollingStarted = false;
+ blocked = false;
+ detached = false;
+ waitOnWakeup = true;
+ startAnimation = true;
+ globals = other.globals;
+ container.Set(other.container.X(), other.container.Y(), other.container.Width(), other.container.Height());
+ tokenContainer = NULL;
+ attribs = new cViewElementAttribs(*other.attribs);
+
+ for (cAreaNode *node = other.areaNodes.First(); node; node = other.areaNodes.Next(node)) {
+ if (cArea *a = dynamic_cast<cArea*>(node)) {
+ areaNodes.Add(new cArea(*a));
+ } else if (cAreaContainer *ac = dynamic_cast<cAreaContainer*>(node)) {
+ areaNodes.Add(new cAreaContainer(*ac));
+ }
+ }
+
+ detacher = NULL;
+ fader = NULL;
+ shifter = NULL;
+}
+
+cViewElement::~cViewElement(void) {
+ delete attribs;
+ delete detacher;
+ delete fader;
+ delete shifter;
+ delete tokenContainer;
+}
+
+/******************************************************************
+* Public Functions
+******************************************************************/
+cViewElement *cViewElement::CreateViewElement(const char *name, const char *viewname) {
+ cViewElement *e = NULL;
+
+ //common view elements
+ if (!strcmp(name, "background") && strcmp(viewname, "displayaudiotracks"))
+ e = new cViewElement();
+ else if (!strcmp(name, "datetime"))
+ e = new cVeDateTime();
+ else if (!strcmp(name, "time"))
+ e = new cVeTime();
+ else if (!strcmp(name, "message"))
+ e = new cVeMessage();
+ else if (!strcmp(name, "devices"))
+ e = new cVeDevices();
+ else if (!strcmp(name, "currentweather"))
+ e = new cVeCurrentWeather();
+ else if (!strcmp(name, "customtokens"))
+ e = new cVeCustomTokens();
+
+ //displaychannel viewelements
+ else if (!strcmp(name, "channelinfo"))
+ e = new cVeDcChannelInfo();
+ else if (!strcmp(name, "channelgroup"))
+ e = new cVeDcChannelGroup();
+ else if (!strcmp(name, "epginfo"))
+ e = new cVeDcEpgInfo();
+ else if (!strcmp(name, "progressbar") && !strcmp(viewname, "displaychannel"))
+ e = new cVeDcProgressBar();
+ else if (!strcmp(name, "statusinfo"))
+ e = new cVeDcStatusInfo();
+ else if (!strcmp(name, "audioinfo"))
+ e = new cVeDcAudioInfo();
+ else if (!strcmp(name, "screenresolution"))
+ e = new cVeDcScreenResolution();
+ else if (!strcmp(name, "signalquality"))
+ e = new cVeDcSignalQuality();
+ else if (!strcmp(name, "scrapercontent") && !strcmp(viewname, "displaychannel"))
+ e = new cVeDcScraperContent();
+ else if (!strcmp(name, "ecminfo"))
+ e = new cVeDcEcmInfo();
+
+ //displaymenu viewelements
+ else if (!strcmp(name, "header") && strcmp(viewname, "displayaudiotracks"))
+ e = new cVeDmHeader();
+ else if (!strcmp(name, "sortmode"))
+ e = new cVeDmSortmode();
+ else if (!strcmp(name, "colorbuttons"))
+ e = new cVeDmColorbuttons();
+ else if (!strcmp(name, "scrollbar"))
+ e = new cVeDmScrollbar();
+ else if (!strcmp(name, "timers"))
+ e = new cVeDmTimers();
+ else if (!strcmp(name, "currentschedule"))
+ e = new cVeDmCurrentschedule();
+ else if (!strcmp(name, "discusage"))
+ e = new cVeDmDiscusage();
+ else if (!strcmp(name, "systemload"))
+ e = new cVeDmSystemload();
+ else if (!strcmp(name, "systemmemory"))
+ e = new cVeDmSystemmemory();
+ else if (!strcmp(name, "temperatures"))
+ e = new cVeDmTemperatures();
+ else if (!strcmp(name, "vdrstatistics"))
+ e = new cVeDmVdrstatistics();
+ else if (!strcmp(name, "lastrecordings"))
+ e = new cVeDmLastrecordings();
+ else if (!strcmp(name, "detailheaderepg"))
+ e = new cVeDmDetailheaderEpg();
+ else if (!strcmp(name, "detailheaderrec"))
+ e = new cVeDmDetailheaderRec();
+ else if (!strcmp(name, "detailheaderplugin"))
+ e = new cVeDmDetailheaderPlugin();
+ else if (!strcmp(name, "tablabels"))
+ e = new cVeDmTablabels();
+
+ //displayreplay viewelements
+ else if (!strcmp(name, "backgroundmodeonly"))
+ e = new cViewElement();
+ else if (!strcmp(name, "rectitle"))
+ e = new cVeDrRecTitle();
+ else if (!strcmp(name, "recinfo"))
+ e = new cVeDrRecInfo();
+ else if (!strcmp(name, "currenttime"))
+ e = new cVeDrCurrentTime();
+ else if (!strcmp(name, "totaltime"))
+ e = new cVeDrTotalTime();
+ else if (!strcmp(name, "endtime"))
+ e = new cVeDrEndTime();
+ else if (!strcmp(name, "progressbar") && !strcmp(viewname, "displayreplay"))
+ e = new cVeDrProgressBar();
+ else if (!strcmp(name, "cutmarks"))
+ e = new cVeDrCutMarks();
+ else if (!strcmp(name, "controlicons"))
+ e = new cVeDrControlIcons();
+ else if (!strcmp(name, "controliconsmodeonly"))
+ e = new cVeDrControlIcons();
+ else if (!strcmp(name, "progressmodeonly"))
+ e = new cVeDrProgressModeonly();
+ else if (!strcmp(name, "jump"))
+ e = new cVeDrJump();
+ else if (!strcmp(name, "onpause"))
+ e = new cVeDrOnPause();
+ else if (!strcmp(name, "onpausemodeonly"))
+ e = new cVeDrOnPause();
+ else if (!strcmp(name, "scrapercontent") && !strcmp(viewname, "displayreplay"))
+ e = new cVeDrScraperContent();
+
+ //displayvolume viewelements
+ else if (!strcmp(name, "volume"))
+ e = new cVeVolume();
+
+ //displayvolume viewelements
+ else if (!strcmp(name, "background") && !strcmp(viewname, "displayaudiotracks"))
+ e = new cVeDtBackground();
+ else if (!strcmp(name, "header") && !strcmp(viewname, "displayaudiotracks"))
+ e = new cVeDtHeader();
+
+ //default
+ else {
+ dsyslog("skindesigner: unknown view element %s", name);
+ e = new cViewElement();
+ }
+
+ return e;
+}
+
+void cViewElement::SetGlobals(cGlobals *globals) {
+ this->globals = globals;
+ attribs->SetGlobals(globals);
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->SetGlobals(globals);
+ }
+}
+
+void cViewElement::SetTokenContainer(void) {
+ tokenContainer = new skindesignerapi::cTokenContainer();
+ InheritTokenContainer();
+}
+
+bool cViewElement::Detached(void) {
+ return detached;
+}
+
+void cViewElement::SetContainer(int x, int y, int width, int height) {
+ container.SetX(x);
+ container.SetY(y);
+ container.SetWidth(width);
+ container.SetHeight(height);
+}
+
+void cViewElement::SetAttributes(vector<stringpair> &attributes) {
+ attribs->Set(attributes);
+}
+
+void cViewElement::AddArea(cAreaNode *area) {
+ areaNodes.Add(area);
+}
+
+void cViewElement::SetAreaX(int x) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->SetX(x);
+ }
+}
+
+void cViewElement::SetAreaY(int y) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->SetY(y);
+ }
+}
+
+void cViewElement::SetAreaWidth(int width) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->SetWidth(width);
+ }
+}
+
+void cViewElement::SetAreaHeight(int height) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->SetHeight(height);
+ }
+}
+
+void cViewElement::SetPosition(int newX, int newY, int newWidth, int newHeight) {
+ cRect newPos(newX, newY, newWidth, newHeight);
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->SetViewPort(newPos);
+ }
+}
+
+void cViewElement::Cache(void) {
+ attribs->SetContainer(container.X(), container.Y(), container.Width(), container.Height());
+ attribs->Cache();
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->SetContainer(container.X(), container.Y(), container.Width(), container.Height());
+ node->Cache();
+ }
+}
+
+bool cViewElement::Execute(void) {
+ return attribs->DoExecute();
+}
+
+void cViewElement::Clear(void) {
+ tokenContainer->Clear();
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ sdOsd->Lock();
+ node->Clear();
+ sdOsd->Unlock();
+ }
+ dirty = false;
+ drawn = false;
+ scrollingStarted = false;
+}
+
+void cViewElement::Hide(void) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ sdOsd->Lock();
+ node->Hide();
+ sdOsd->Unlock();
+ }
+ init = true;
+ StopScrolling();
+}
+
+void cViewElement::Show(void) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ sdOsd->Lock();
+ node->Show();
+ sdOsd->Unlock();
+ }
+}
+
+void cViewElement::WakeUp(void) {
+ if (!detacher || !waitOnWakeup) {
+ return;
+ }
+ detacher->WakeUp();
+}
+
+void cViewElement::Close(void) {
+ delete detacher;
+ detacher = NULL;
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ sdOsd->Lock();
+ node->Close();
+ sdOsd->Unlock();
+ }
+ StopScrolling();
+ dirty = true;
+ init = true;
+ startAnimation = true;
+ drawn = false;
+ scrollingStarted = false;
+ blocked = false;
+}
+
+void cViewElement::Render(void) {
+ if (!dirty || blocked)
+ return;
+
+ if (attribs->DoDebug())
+ Debug();
+
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ //Check redraw of already scrolling list element
+ if (drawn && scrollingStarted && node->Scrolling()) {
+ if (DoScroll()) {
+ //current list element
+ continue;
+ } else {
+ //not current list element anymore
+ scrollingStarted = false;
+ }
+ }
+ sdOsd->Lock();
+ node->Clear();
+ sdOsd->Unlock();
+ if (!node->Execute())
+ continue;
+ if (node->BackgroundArea() && drawn)
+ continue;
+ sdOsd->Lock();
+ node->Render();
+ sdOsd->Unlock();
+
+ if (DoScroll() && node->Scrolling()) {
+ cArea *scrollArea = node->ScrollingArea();
+ if (scrollArea) {
+ scrollingStarted = true;
+ cAnimation *scroller = new cAnimation(scrollArea);
+ scrollers.Add(scroller);
+ scroller->Start();
+ }
+ }
+ }
+ dirty = false;
+ drawn = true;
+ if (startAnimation) {
+ startAnimation = false;
+ StartAnimation();
+ }
+}
+
+void cViewElement::StopScrolling(bool deletePixmaps) {
+ for (cAnimation *scroller = scrollers.First(); scroller; scroller = scrollers.Next(scroller)) {
+ scroller->Stop(deletePixmaps);
+ }
+ scrollers.Clear();
+}
+
+void cViewElement::ParseDetached(void) {
+ Parse(true);
+}
+
+void cViewElement::RenderDetached(void) {
+ blocked = false;
+ Render();
+}
+
+bool cViewElement::Shifting(void) {
+ if (attribs->ShiftTime() >= 0) {
+ return true;
+ }
+ return false;
+}
+
+bool cViewElement::Fading(void) {
+ if (attribs->FadeTime() >= 0) {
+ return true;
+ }
+ return false;
+}
+
+int cViewElement::FadeTime(void) {
+ return attribs->FadeTime();
+}
+
+int cViewElement::ShiftTime(void) {
+ return attribs->ShiftTime();
+}
+
+int cViewElement::ShiftMode(void) {
+ return attribs->ShiftMode();
+}
+
+void cViewElement::StartAnimation(void) {
+ if (ShiftTime() > 0) {
+ cRect shiftbox = CoveredArea();
+ cPoint ref = cPoint(shiftbox.X(), shiftbox.Y());
+ cPoint start = ShiftStart(shiftbox);
+ SetPosition(start, ref);
+ sdOsd->Flush();
+ delete shifter;
+ shifter = new cAnimation((cShiftable*)this, start, ref, true);
+ shifter->Start();
+ } else if (FadeTime() > 0) {
+ SetTransparency(100);
+ sdOsd->Flush();
+ delete fader;
+ fader = new cAnimation((cFadable*)this, true);
+ fader->Start();
+ }
+}
+
+void cViewElement::SetTransparency(int transparency, bool force) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ sdOsd->Lock();
+ node->SetTransparency(transparency);
+ sdOsd->Unlock();
+ }
+}
+
+void cViewElement::SetPosition(cPoint &position, cPoint &reference, bool force) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ sdOsd->Lock();
+ node->SetPosition(position, reference);
+ sdOsd->Unlock();
+ }
+}
+
+cRect cViewElement::CoveredArea(void) {
+ cRect unionArea;
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ unionArea.Combine(node->CoveringArea());
+ }
+ return unionArea;
+}
+
+void cViewElement::Flush(void) {
+ sdOsd->Flush();
+}
+
+bool cViewElement::Parse(bool forced) {
+ if (blocked && !forced) {
+ return false;
+ }
+ if (!Detached() || !init) {
+ return true;
+ }
+ delete detacher;
+ detacher = new cAnimation((cDetachable*)this, waitOnWakeup, startAnimation);
+ detacher->Start();
+ startAnimation = false;
+ init = false;
+ blocked = true;
+ return false;
+}
+
+cFunction *cViewElement::GetFunction(const char *name) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ if (cFunction *f = node->GetFunction(name))
+ return f;
+ }
+ return NULL;
+}
+
+void cViewElement::Debug(bool full) {
+ esyslog("skindesigner: ---> viewElement %d", id);
+ tokenContainer->Debug();
+ esyslog("skindesigner: container %d %d %dx%d", container.X(), container.Y(), container.Width(), container.Height());
+ attribs->Debug();
+ if (!full)
+ return;
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->Debug(full);
+ }
+}
+
+/******************************************************************
+* protected Functions
+******************************************************************/
+void cViewElement::InheritTokenContainer(void) {
+ tokenContainer->CreateContainers();
+ attribs->SetTokenContainer(tokenContainer);
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->SetTokenContainer(tokenContainer);
+ }
+}
+
+void cViewElement::InheritTokenContainerDeep(void) {
+ tokenContainer->CreateContainers();
+ attribs->SetTokenContainerDeep(tokenContainer);
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->SetTokenContainerDeep(tokenContainer);
+ }
+}
+
+cPoint cViewElement::ShiftStart(cRect &shiftbox) {
+ eShiftType type = (eShiftType)attribs->ShiftType();
+ cPoint start;
+ if (type == eShiftType::none) {
+ start = attribs->ShiftStartpoint();
+ } else if (type == eShiftType::left) {
+ start.SetX(-shiftbox.Width());
+ start.SetY(shiftbox.Y());
+ } else if (type == eShiftType::right) {
+ start.SetX(cOsd::OsdWidth());
+ start.SetY(shiftbox.Y());
+ } else if (type == eShiftType::top) {
+ start.SetX(shiftbox.X());
+ start.SetY(-shiftbox.Height());
+ } else if (type == eShiftType::bottom) {
+ start.SetX(shiftbox.X());
+ start.SetY(cOsd::OsdHeight());
+ }
+ return start;
} \ No newline at end of file