summaryrefslogtreecommitdiff
path: root/recmenu.c
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2016-03-13 16:07:21 +0100
committerlouis <louis.braun@gmx.de>2016-03-13 16:07:21 +0100
commit4623e7b345f850ac44cdcacbd0e43e139a4baa6a (patch)
tree8046f612d0a0821624e7de006021f551ea512d15 /recmenu.c
parentd4ef992f8256d324221d15d3bef967eb044a9a86 (diff)
downloadvdr-plugin-tvguideng-4623e7b345f850ac44cdcacbd0e43e139a4baa6a.tar.gz
vdr-plugin-tvguideng-4623e7b345f850ac44cdcacbd0e43e139a4baa6a.tar.bz2
added VDR 2.3.1 compatibility
Diffstat (limited to 'recmenu.c')
-rw-r--r--recmenu.c1244
1 files changed, 622 insertions, 622 deletions
diff --git a/recmenu.c b/recmenu.c
index 3e55b00..8f23bc9 100644
--- a/recmenu.c
+++ b/recmenu.c
@@ -1,623 +1,623 @@
-#include "recmenu.h"
-#include "tvguidengosd.h"
-
-// --- cRecMenu -------------------------------------------------------------
-
-cRecMenu::cRecMenu() {
- hidden = false;
- menuWidth = 50;
- menuHeight = 0;
- maxMenuHeight = 98;
- recMenuGrid = NULL;
- osdView = NULL;
- scrollBar = NULL;
- back = NULL;
- start = NULL;
- stop = NULL;
- itemCount = 0;
- active = NULL;
- header = NULL;
- footer = NULL;
- scrolling = false;
-}
-
-cRecMenu::~cRecMenu(void) {
- menuItems.Clear();
- if (scrollBar) {
- scrollBar->Clear();
- delete scrollBar;
- scrollBar = NULL;
- }
- if (back) {
- back->Clear();
- delete back;
- back = NULL;
- }
- if (recMenuGrid) {
- recMenuGrid->Clear();
- delete recMenuGrid;
- }
- if (hidden)
- osdView->Activate();
-}
-
-/********************************************************************
-* Public Functions
-********************************************************************/
-
-void cRecMenu::Init(skindesignerapi::cOsdView *osdView) {
- this->osdView = osdView;
- recMenuGrid = osdView->GetViewGrid((int)eViewGridsRecMenu::menu);
- scrollBar = osdView->GetViewElement((int)eViewElementsRecMenu::scrollbar);
- back = osdView->GetViewElement((int)eViewElementsRecMenu::background);
- InitMenuItems();
-}
-
-void cRecMenu::Draw(void) {
- DrawHeader();
- double width = (double)menuWidth / (double)100;
- double x = (double)(100 - menuWidth)/(double)200;
- int totalHeight = GetHeight();
- int yPerc = (100 - totalHeight) / 2;
- if (header)
- yPerc += header->GetHeight();
- double y = (double)yPerc/(double)100;
-
- for (cRecMenuItem *current = start; current; current = menuItems.Next(current)) {
-
- double itemHeight = (double)(current->GetHeight())/(double)100;
- if (current->IsNew()) {
- current->SetTokens(recMenuGrid);
- recMenuGrid->SetGrid(current->Id(), x, y, width, itemHeight);
- } else {
- recMenuGrid->MoveGrid(current->Id(), x, y, width, itemHeight);
- }
- if (current->Active()) {
- recMenuGrid->SetCurrent(current->Id(), true);
- }
- y += itemHeight;
- if (current == stop)
- break;
- }
- DrawFooter();
- recMenuGrid->Display();
-}
-
-eRecMenuState cRecMenu::ProcessKey(eKeys Key) {
- eRecMenuState state = rmsContinue;
- if (!active)
- return state;
-
- state = active->ProcessKey(Key);
- if (state == rmsRefresh) {
- //Refresh current
- active->SetTokens(recMenuGrid);
- active->SetNew();
- Draw();
- } else if (state == rmsNotConsumed) {
- switch (Key & ~k_Repeat) {
- case kUp:
- if (!ScrollUp(false))
- SetLast();
- Draw();
- state = rmsConsumed;
- break;
- case kDown:
- if (!ScrollDown(false))
- SetFirst();
- Draw();
- state = rmsConsumed;
- break;
- case kLeft:
- if (PageUp())
- Draw();
- state = rmsConsumed;
- break;
- case kRight:
- if (PageDown())
- Draw();
- state = rmsConsumed;
- break;
- case kBack:
- state = rmsClose;
- break;
- default:
- break;
- }
- }
- return state;
-}
-
-void cRecMenu::DefineTokens(eViewElementsRecMenu ve, skindesignerapi::cTokenContainer *tk) {
- switch (ve) {
- case eViewElementsRecMenu::background:
- tk->DefineIntToken("{menuwidth}", (int)eBackgroundRecMenuIT::menuwidth);
- tk->DefineIntToken("{menuheight}", (int)eBackgroundRecMenuIT::menuheight);
- tk->DefineIntToken("{hasscrollbar}", (int)eBackgroundRecMenuIT::hasscrollbar);
- break;
- case eViewElementsRecMenu::scrollbar:
- tk->DefineIntToken("{menuwidth}", (int)eScrollbarRecMenuIT::menuwidth);
- tk->DefineIntToken("{posy}", (int)eScrollbarRecMenuIT::posy);
- tk->DefineIntToken("{totalheight}", (int)eScrollbarRecMenuIT::totalheight);
- tk->DefineIntToken("{height}", (int)eScrollbarRecMenuIT::height);
- tk->DefineIntToken("{offset}", (int)eScrollbarRecMenuIT::offset);
- break;
- default:
- break;
- }
-}
-
-void cRecMenu::DefineTokens(eViewGridsRecMenu vg, skindesignerapi::cTokenContainer *tk) {
- tk->DefineIntToken("{info}", (int)eRecMenuIT::info);
- tk->DefineIntToken("{lines}", (int)eRecMenuIT::lines);
- tk->DefineIntToken("{button}", (int)eRecMenuIT::button);
- tk->DefineIntToken("{buttonyesno}", (int)eRecMenuIT::buttonyesno);
- tk->DefineIntToken("{yes}", (int)eRecMenuIT::yes);
- tk->DefineIntToken("{intselector}", (int)eRecMenuIT::intselector);
- tk->DefineIntToken("{intvalue}", (int)eRecMenuIT::value);
- tk->DefineIntToken("{boolselector}", (int)eRecMenuIT::boolselector);
- tk->DefineIntToken("{stringselector}", (int)eRecMenuIT::stringselector);
- tk->DefineIntToken("{textinput}", (int)eRecMenuIT::textinput);
- tk->DefineIntToken("{editmode}", (int)eRecMenuIT::editmode);
- tk->DefineIntToken("{timeselector}", (int)eRecMenuIT::timeselector);
- tk->DefineIntToken("{dayselector}", (int)eRecMenuIT::dayselector);
- tk->DefineIntToken("{channelselector}", (int)eRecMenuIT::channelselector);
- tk->DefineIntToken("{channelnumber}", (int)eRecMenuIT::channelnumber);
- tk->DefineIntToken("{channellogoexisis}", (int)eRecMenuIT::channellogoexisis);
- tk->DefineIntToken("{weekdayselector}", (int)eRecMenuIT::weekdayselector);
- tk->DefineIntToken("{dayselected}", (int)eRecMenuIT::dayselected);
- tk->DefineIntToken("{day0set}", (int)eRecMenuIT::day0set);
- tk->DefineIntToken("{day1set}", (int)eRecMenuIT::day1set);
- tk->DefineIntToken("{day2set}", (int)eRecMenuIT::day2set);
- tk->DefineIntToken("{day3set}", (int)eRecMenuIT::day3set);
- tk->DefineIntToken("{day4set}", (int)eRecMenuIT::day4set);
- tk->DefineIntToken("{day5set}", (int)eRecMenuIT::day5set);
- tk->DefineIntToken("{day6set}", (int)eRecMenuIT::day6set);
- tk->DefineIntToken("{directoryselector}", (int)eRecMenuIT::directoryselector);
- tk->DefineIntToken("{timerconflictheader}", (int)eRecMenuIT::timerconflictheader);
- tk->DefineIntToken("{overlapstartpercent}", (int)eRecMenuIT::overlapstartpercent);
- tk->DefineIntToken("{overlapwidthpercent}", (int)eRecMenuIT::overlapwidthpercent);
- tk->DefineIntToken("{timerconflict}", (int)eRecMenuIT::timerconflict);
- tk->DefineIntToken("{infoactive}", (int)eRecMenuIT::infoactive);
- tk->DefineIntToken("{deleteactive}", (int)eRecMenuIT::deleteactive);
- tk->DefineIntToken("{editactive}", (int)eRecMenuIT::editactive);
- tk->DefineIntToken("{searchactive}", (int)eRecMenuIT::searchactive);
- tk->DefineIntToken("{timerstartpercent}", (int)eRecMenuIT::timerstartpercent);
- tk->DefineIntToken("{timerwidthpercent}", (int)eRecMenuIT::timerwidthpercent);
- tk->DefineIntToken("{event}", (int)eRecMenuIT::event);
- tk->DefineIntToken("{hastimer}", (int)eRecMenuIT::hastimer);
- tk->DefineIntToken("{recording}", (int)eRecMenuIT::recording);
- tk->DefineIntToken("{recduration}", (int)eRecMenuIT::recduration);
- tk->DefineIntToken("{searchtimer}", (int)eRecMenuIT::searchtimer);
- tk->DefineIntToken("{timeractive}", (int)eRecMenuIT::timeractive);
- tk->DefineIntToken("{activetimers}", (int)eRecMenuIT::activetimers);
- tk->DefineIntToken("{recordingsdone}", (int)eRecMenuIT::recordingsdone);
- tk->DefineIntToken("{timelineheader}", (int)eRecMenuIT::timelineheader);
- tk->DefineIntToken("{timerset}", (int)eRecMenuIT::timerset);
- tk->DefineIntToken("{channeltransponder}", (int)eRecMenuIT::channeltransponder);
- tk->DefineIntToken("{timelinetimer}", (int)eRecMenuIT::timelinetimer);
- tk->DefineIntToken("{timerstart}", (int)eRecMenuIT::timerstart);
- tk->DefineIntToken("{timerwidth}", (int)eRecMenuIT::timerwidth);
- tk->DefineIntToken("{favorite}", (int)eRecMenuIT::favorite);
- tk->DefineStringToken("{line1}", (int)eRecMenuST::line1);
- tk->DefineStringToken("{line2}", (int)eRecMenuST::line2);
- tk->DefineStringToken("{line3}", (int)eRecMenuST::line3);
- tk->DefineStringToken("{line4}", (int)eRecMenuST::line4);
- tk->DefineStringToken("{stringvalue}", (int)eRecMenuST::value);
- tk->DefineStringToken("{buttontext}", (int)eRecMenuST::buttontext);
- tk->DefineStringToken("{textyes}", (int)eRecMenuST::textyes);
- tk->DefineStringToken("{textno}", (int)eRecMenuST::textno);
- tk->DefineStringToken("{text}", (int)eRecMenuST::text);
- tk->DefineStringToken("{channelname}", (int)eRecMenuST::channelname);
- tk->DefineStringToken("{channelid}", (int)eRecMenuST::channelid);
- tk->DefineStringToken("{transponder}", (int)eRecMenuST::transponder);
- tk->DefineStringToken("{day0abbr}", (int)eRecMenuST::day0abbr);
- tk->DefineStringToken("{day1abbr}", (int)eRecMenuST::day1abbr);
- tk->DefineStringToken("{day2abbr}", (int)eRecMenuST::day2abbr);
- tk->DefineStringToken("{day3abbr}", (int)eRecMenuST::day3abbr);
- tk->DefineStringToken("{day4abbr}", (int)eRecMenuST::day4abbr);
- tk->DefineStringToken("{day5abbr}", (int)eRecMenuST::day5abbr);
- tk->DefineStringToken("{day6abbr}", (int)eRecMenuST::day6abbr);
- tk->DefineStringToken("{folder}", (int)eRecMenuST::folder);
- tk->DefineStringToken("{conflictstart}", (int)eRecMenuST::conflictstart);
- tk->DefineStringToken("{conflictstop}", (int)eRecMenuST::conflictstop);
- tk->DefineStringToken("{overlapstart}", (int)eRecMenuST::overlapstart);
- tk->DefineStringToken("{overlapstop}", (int)eRecMenuST::overlapstop);
- tk->DefineStringToken("{timertitle}", (int)eRecMenuST::timertitle);
- tk->DefineStringToken("{starttime}", (int)eRecMenuST::starttime);
- tk->DefineStringToken("{stoptime}", (int)eRecMenuST::stoptime);
- tk->DefineStringToken("{date}", (int)eRecMenuST::date);
- tk->DefineStringToken("{weekday}", (int)eRecMenuST::weekday);
- tk->DefineStringToken("{title}", (int)eRecMenuST::title);
- tk->DefineStringToken("{shorttext}", (int)eRecMenuST::shorttext);
- tk->DefineStringToken("{recname}", (int)eRecMenuST::recname);
- tk->DefineStringToken("{recstarttime}", (int)eRecMenuST::recstarttime);
- tk->DefineStringToken("{recdate}", (int)eRecMenuST::recdate);
- tk->DefineStringToken("{searchstring}", (int)eRecMenuST::searchstring);
- tk->DefineStringToken("{timerstart}", (int)eRecMenuST::timerstart);
- tk->DefineStringToken("{timerstop}", (int)eRecMenuST::timerstop);
- tk->DefineStringToken("{eventtitle}", (int)eRecMenuST::eventtitle);
- tk->DefineStringToken("{eventshorttext}", (int)eRecMenuST::eventshorttext);
- tk->DefineStringToken("{eventstart}", (int)eRecMenuST::eventstart);
- tk->DefineStringToken("{eventstop}", (int)eRecMenuST::eventstop);
- tk->DefineStringToken("{favdesc}", (int)eRecMenuST::favdesc);
-}
-
-/********************************************************************
-* Protected Functions
-********************************************************************/
-void cRecMenu::AddMenuItem(cRecMenuItem *item, bool inFront) {
- if (!inFront)
- menuItems.Add(item);
- else
- menuItems.Ins(item);
-}
-
-void cRecMenu::AddHeader(cRecMenuItem *header) {
- this->header = header;
- maxMenuHeight -= header->GetHeight();
-}
-
-void cRecMenu::AddFooter(cRecMenuItem *footer) {
- this->footer = footer;
- maxMenuHeight -= footer->GetHeight();
-}
-
-int cRecMenu::GetNumActive(void) {
- int num = 0;
- for (cRecMenuItem *current = menuItems.First(); current; current = menuItems.Next(current)) {
- if (current == active) {
- return num;
- }
- num++;
- }
- return 0;
-}
-
-bool cRecMenu::ScrollUp(bool retry) {
- if (active == start) {
- bool scrolled = SeekBack(false);
- if (scrolled && scrolling) DrawScrollbar();
- }
- if (footer && active == footer) {
- recMenuGrid->SetCurrent(footer->Id(), false);
- footer->SetInactive();
- active = stop;
- active->SetActive();
- return true;
- }
- cRecMenuItem *prev = (cRecMenuItem*)active->Prev();
- while (prev && !prev->Selectable()) {
- prev = (cRecMenuItem*)prev->Prev();
- }
- if (prev) {
- recMenuGrid->SetCurrent(active->Id(), false);
- active->SetInactive();
- active = prev;
- active->SetActive();
- return true;
- } else {
- SeekBack(false);
- if (!retry)
- ScrollUp(true);
- }
- return false;
-}
-
-bool cRecMenu::ScrollDown(bool retry) {
- if (active == stop || retry) {
- bool scrolled = SeekForward(false);
- if (scrolled && scrolling) DrawScrollbar();
- }
- cRecMenuItem *next = (cRecMenuItem*)active->Next();
- while (next && !next->Selectable()) {
- if (next == stop) {
- return ScrollDown(true);
- }
- next = (cRecMenuItem*)next->Next();
- }
- if (next) {
- recMenuGrid->SetCurrent(active->Id(), false);
- active->SetInactive();
- active = next;
- active->SetActive();
- return true;
- } else {
- SeekForward(false);
- if (!retry)
- return ScrollDown(true);
- }
- if (footer && active != footer) {
- recMenuGrid->SetCurrent(active->Id(), false);
- active->SetInactive();
- active = footer;
- active->SetActive();
- return true;
- }
- return false;
-}
-
-bool cRecMenu::PageUp(void) {
- bool scrolled = SeekBack(true);
- if (scrolled && scrolling) DrawScrollbar();
- if (!scrolled) {
- recMenuGrid->SetCurrent(active->Id(), false);
- active->SetInactive();
- active = start;
- active->SetActive();
- return true;
- }
- if (!active) {
- active = stop;
- active->SetActive();
- }
- return scrolled;
-}
-
-bool cRecMenu::PageDown(void) {
- bool scrolled = SeekForward(true);
- if (scrolled && scrolling) DrawScrollbar();
- if (!scrolled) {
- recMenuGrid->SetCurrent(active->Id(), false);
- active->SetInactive();
- active = stop;
- active->SetActive();
- return true;
- }
- if (!active) {
- active = start;
- active->SetActive();
- }
- return scrolled;
-}
-
-void cRecMenu::ClearMenuItems(bool deleteItems) {
- if (deleteItems) {
- menuItems.Clear();
- active = NULL;
- } else {
- for (cRecMenuItem *current = menuItems.First(); current; current = menuItems.Next(current)) {
- current->SetNew();
- }
- }
- itemCount = 0;
- back->Clear();
- scrollBar->Clear();
- recMenuGrid->Clear();
- if (header)
- header->SetNew();
- if (footer)
- footer->SetNew();
- if (active)
- active->SetInactive();
- active = NULL;
-}
-
-void cRecMenu::InitMenuItems(void) {
- if (menuItems.Count() == 0)
- return;
- scrolling = false;
- menuHeight = 0;
- start = menuItems.First();
- cRecMenuItem *current = start;
- while (current) {
- int itemHeight = current->GetHeight();
- if (menuHeight + itemHeight > maxMenuHeight) {
- scrolling = true;
- break;
- }
- if (current->Active())
- active = current;
- itemCount++;
- stop = current;
- menuHeight += itemHeight;
- current = menuItems.Next(current);
- }
- DrawBackground();
- Flush();
- if (scrolling) {
- DrawScrollbar();
- Flush();
- }
-}
-
-void cRecMenu::InitMenuItemsLast(void) {
- if (menuItems.Count() == 0)
- return;
- scrolling = false;
- menuHeight = 0;
- stop = menuItems.Last();
- active = stop;
- active->SetActive();
- cRecMenuItem *current = stop;
- while (current) {
- int itemHeight = current->GetHeight();
- if (menuHeight + itemHeight > maxMenuHeight) {
- scrolling = true;
- break;
- }
- itemCount++;
- start = current;
- menuHeight += itemHeight;
- current = menuItems.Prev(current);
- }
- DrawBackground();
- Flush();
- if (scrolling) {
- DrawScrollbar();
- Flush();
- }
-}
-
-int cRecMenu::GetHeight(void) {
- int totalHeight = menuHeight;
- if (header)
- totalHeight += header->GetHeight();
- if (footer)
- totalHeight += footer->GetHeight();
- return totalHeight;
-}
-
-/********************************************************************
-* Private Functions
-********************************************************************/
-
-bool cRecMenu::SeekForward(bool page) {
- int jumpStep = 0;
- if (page)
- jumpStep = itemCount;
- else
- jumpStep = itemCount/2;
- int jump = 0;
- cRecMenuItem *next = (cRecMenuItem*)stop->Next();
- while (next && jump < jumpStep) {
- stop = next;
- menuHeight += next->GetHeight();
- next = (cRecMenuItem*)next->Next();
- jump++;
- }
- while (start && menuHeight > maxMenuHeight) {
- if (active == start) {
- active = NULL;
- start->SetInactive();
- }
- menuHeight -= start->GetHeight();
- recMenuGrid->Delete(start->Id());
- start->SetNew();
- start = (cRecMenuItem*)start->Next();
- }
- if (jump > 0)
- return true;
- return false;
-}
-
-bool cRecMenu::SeekBack(bool page) {
- int jumpStep = 0;
- if (page)
- jumpStep = itemCount;
- else
- jumpStep = itemCount/2;
- int jump = 0;
- cRecMenuItem *prev = (cRecMenuItem*)start->Prev();
- while (prev && jump < jumpStep) {
- start = prev;
- menuHeight += prev->GetHeight();
- prev = (cRecMenuItem*)prev->Prev();
- jump++;
- }
- while (stop && menuHeight > maxMenuHeight) {
- if (active == stop) {
- active = NULL;
- stop->SetInactive();
- }
- menuHeight -= stop->GetHeight();
- recMenuGrid->Delete(stop->Id());
- stop->SetNew();
- stop = (cRecMenuItem*)stop->Prev();
- }
- if (jump > 0)
- return true;
- return false;
-}
-
-void cRecMenu::SetFirst(void) {
- if (!scrolling) {
- recMenuGrid->SetCurrent(active->Id(), false);
- active->SetInactive();
- active = start;
- active->SetActive();
- return;
- }
- ClearMenuItems(false);
- menuItems.First()->SetActive();
- InitMenuItems();
-}
-
-void cRecMenu::SetLast(void) {
- if (!scrolling) {
- recMenuGrid->SetCurrent(active->Id(), false);
- active->SetInactive();
- if (footer) {
- active = footer;
- } else {
- active = stop;
- }
- active->SetActive();
- return;
- }
- ClearMenuItems(false);
- InitMenuItemsLast();
-}
-
-void cRecMenu::DrawBackground(void) {
- back->Clear();
- back->ClearTokens();
- back->AddIntToken((int)eBackgroundRecMenuIT::menuwidth, menuWidth + 2);
- back->AddIntToken((int)eBackgroundRecMenuIT::menuheight, GetHeight() + 2);
- back->AddIntToken((int)eBackgroundRecMenuIT::hasscrollbar, scrolling);
- back->Display();
-}
-
-void cRecMenu::DrawScrollbar(void) {
- if (menuItems.Count() == 0)
- return;
- int scrollBarHeight = (double)itemCount / (double)menuItems.Count() * 1000;
- int startPos = 0;
- for (cRecMenuItem *current = menuItems.First(); current; current = menuItems.Next(current)) {
- if (start == current)
- break;
- startPos++;
- }
- int offset = (double)startPos / (double)menuItems.Count() * 1000;
- scrollBar->Clear();
- scrollBar->ClearTokens();
- scrollBar->AddIntToken((int)eScrollbarRecMenuIT::menuwidth, menuWidth + 2);
- int y = (100 - GetHeight())/2;
- if (header)
- y += header->GetHeight();
-
- scrollBar->AddIntToken((int)eScrollbarRecMenuIT::posy, y);
- scrollBar->AddIntToken((int)eScrollbarRecMenuIT::totalheight, menuHeight);
- scrollBar->AddIntToken((int)eScrollbarRecMenuIT::height, scrollBarHeight);
- scrollBar->AddIntToken((int)eScrollbarRecMenuIT::offset, offset);
- scrollBar->Display();
-}
-
-void cRecMenu::DrawHeader(void) {
- if (!header)
- return;
- double width = (double)menuWidth / (double)100;
- double x = (double)(100 - menuWidth)/(double)200;
- int totalHeight = GetHeight();
- double y = (double)((100 - totalHeight) / 2) / (double)100;
-
- if (header->IsNew()) {
- recMenuGrid->ClearTokens();
- header->SetTokens(recMenuGrid);
- recMenuGrid->SetGrid(header->Id(), x, y, width, (double)header->GetHeight()/(double)100);
- }
-}
-
-void cRecMenu::DrawFooter(void) {
- if (!footer)
- return;
- double width = (double)menuWidth / (double)100;
- double x = (double)(100 - menuWidth)/(double)200;
- int totalHeight = GetHeight();
- int totalMenuHeight = menuHeight;
- if (header)
- totalMenuHeight += header->GetHeight();
- double y = (double)((100 - totalHeight) / 2 + totalMenuHeight) / (double)100;
-
- if (footer->IsNew()) {
- recMenuGrid->ClearTokens();
- footer->SetTokens(recMenuGrid);
- recMenuGrid->SetGrid(footer->Id(), x, y, width, (double)footer->GetHeight()/(double)100);
- } else {
- recMenuGrid->MoveGrid(footer->Id(), x, y, width, (double)footer->GetHeight()/(double)100);
- }
- if (footer->Active()) {
- active = footer;
- recMenuGrid->SetCurrent(footer->Id(), true);
- }
+#include "recmenu.h"
+#include "tvguidengosd.h"
+
+// --- cRecMenu -------------------------------------------------------------
+
+cRecMenu::cRecMenu() {
+ hidden = false;
+ menuWidth = 50;
+ menuHeight = 0;
+ maxMenuHeight = 98;
+ recMenuGrid = NULL;
+ osdView = NULL;
+ scrollBar = NULL;
+ back = NULL;
+ start = NULL;
+ stop = NULL;
+ itemCount = 0;
+ active = NULL;
+ header = NULL;
+ footer = NULL;
+ scrolling = false;
+}
+
+cRecMenu::~cRecMenu(void) {
+ menuItems.Clear();
+ if (scrollBar) {
+ scrollBar->Clear();
+ delete scrollBar;
+ scrollBar = NULL;
+ }
+ if (back) {
+ back->Clear();
+ delete back;
+ back = NULL;
+ }
+ if (recMenuGrid) {
+ recMenuGrid->Clear();
+ delete recMenuGrid;
+ }
+ if (hidden)
+ osdView->Activate();
+}
+
+/********************************************************************
+* Public Functions
+********************************************************************/
+
+void cRecMenu::Init(skindesignerapi::cOsdView *osdView) {
+ this->osdView = osdView;
+ recMenuGrid = osdView->GetViewGrid((int)eViewGridsRecMenu::menu);
+ scrollBar = osdView->GetViewElement((int)eViewElementsRecMenu::scrollbar);
+ back = osdView->GetViewElement((int)eViewElementsRecMenu::background);
+ InitMenuItems();
+}
+
+void cRecMenu::Draw(void) {
+ DrawHeader();
+ double width = (double)menuWidth / (double)100;
+ double x = (double)(100 - menuWidth)/(double)200;
+ int totalHeight = GetHeight();
+ int yPerc = (100 - totalHeight) / 2;
+ if (header)
+ yPerc += header->GetHeight();
+ double y = (double)yPerc/(double)100;
+
+ for (cRecMenuItem *current = start; current; current = menuItems.Next(current)) {
+
+ double itemHeight = (double)(current->GetHeight())/(double)100;
+ if (current->IsNew()) {
+ current->SetTokens(recMenuGrid);
+ recMenuGrid->SetGrid(current->Id(), x, y, width, itemHeight);
+ } else {
+ recMenuGrid->MoveGrid(current->Id(), x, y, width, itemHeight);
+ }
+ if (current->Active()) {
+ recMenuGrid->SetCurrent(current->Id(), true);
+ }
+ y += itemHeight;
+ if (current == stop)
+ break;
+ }
+ DrawFooter();
+ recMenuGrid->Display();
+}
+
+eRecMenuState cRecMenu::ProcessKey(eKeys Key) {
+ eRecMenuState state = rmsContinue;
+ if (!active)
+ return state;
+
+ state = active->ProcessKey(Key);
+ if (state == rmsRefresh) {
+ //Refresh current
+ active->SetTokens(recMenuGrid);
+ active->SetNew();
+ Draw();
+ } else if (state == rmsNotConsumed) {
+ switch (Key & ~k_Repeat) {
+ case kUp:
+ if (!ScrollUp(false))
+ SetLast();
+ Draw();
+ state = rmsConsumed;
+ break;
+ case kDown:
+ if (!ScrollDown(false))
+ SetFirst();
+ Draw();
+ state = rmsConsumed;
+ break;
+ case kLeft:
+ if (PageUp())
+ Draw();
+ state = rmsConsumed;
+ break;
+ case kRight:
+ if (PageDown())
+ Draw();
+ state = rmsConsumed;
+ break;
+ case kBack:
+ state = rmsClose;
+ break;
+ default:
+ break;
+ }
+ }
+ return state;
+}
+
+void cRecMenu::DefineTokens(eViewElementsRecMenu ve, skindesignerapi::cTokenContainer *tk) {
+ switch (ve) {
+ case eViewElementsRecMenu::background:
+ tk->DefineIntToken("{menuwidth}", (int)eBackgroundRecMenuIT::menuwidth);
+ tk->DefineIntToken("{menuheight}", (int)eBackgroundRecMenuIT::menuheight);
+ tk->DefineIntToken("{hasscrollbar}", (int)eBackgroundRecMenuIT::hasscrollbar);
+ break;
+ case eViewElementsRecMenu::scrollbar:
+ tk->DefineIntToken("{menuwidth}", (int)eScrollbarRecMenuIT::menuwidth);
+ tk->DefineIntToken("{posy}", (int)eScrollbarRecMenuIT::posy);
+ tk->DefineIntToken("{totalheight}", (int)eScrollbarRecMenuIT::totalheight);
+ tk->DefineIntToken("{height}", (int)eScrollbarRecMenuIT::height);
+ tk->DefineIntToken("{offset}", (int)eScrollbarRecMenuIT::offset);
+ break;
+ default:
+ break;
+ }
+}
+
+void cRecMenu::DefineTokens(eViewGridsRecMenu vg, skindesignerapi::cTokenContainer *tk) {
+ tk->DefineIntToken("{info}", (int)eRecMenuIT::info);
+ tk->DefineIntToken("{lines}", (int)eRecMenuIT::lines);
+ tk->DefineIntToken("{button}", (int)eRecMenuIT::button);
+ tk->DefineIntToken("{buttonyesno}", (int)eRecMenuIT::buttonyesno);
+ tk->DefineIntToken("{yes}", (int)eRecMenuIT::yes);
+ tk->DefineIntToken("{intselector}", (int)eRecMenuIT::intselector);
+ tk->DefineIntToken("{intvalue}", (int)eRecMenuIT::value);
+ tk->DefineIntToken("{boolselector}", (int)eRecMenuIT::boolselector);
+ tk->DefineIntToken("{stringselector}", (int)eRecMenuIT::stringselector);
+ tk->DefineIntToken("{textinput}", (int)eRecMenuIT::textinput);
+ tk->DefineIntToken("{editmode}", (int)eRecMenuIT::editmode);
+ tk->DefineIntToken("{timeselector}", (int)eRecMenuIT::timeselector);
+ tk->DefineIntToken("{dayselector}", (int)eRecMenuIT::dayselector);
+ tk->DefineIntToken("{channelselector}", (int)eRecMenuIT::channelselector);
+ tk->DefineIntToken("{channelnumber}", (int)eRecMenuIT::channelnumber);
+ tk->DefineIntToken("{channellogoexisis}", (int)eRecMenuIT::channellogoexisis);
+ tk->DefineIntToken("{weekdayselector}", (int)eRecMenuIT::weekdayselector);
+ tk->DefineIntToken("{dayselected}", (int)eRecMenuIT::dayselected);
+ tk->DefineIntToken("{day0set}", (int)eRecMenuIT::day0set);
+ tk->DefineIntToken("{day1set}", (int)eRecMenuIT::day1set);
+ tk->DefineIntToken("{day2set}", (int)eRecMenuIT::day2set);
+ tk->DefineIntToken("{day3set}", (int)eRecMenuIT::day3set);
+ tk->DefineIntToken("{day4set}", (int)eRecMenuIT::day4set);
+ tk->DefineIntToken("{day5set}", (int)eRecMenuIT::day5set);
+ tk->DefineIntToken("{day6set}", (int)eRecMenuIT::day6set);
+ tk->DefineIntToken("{directoryselector}", (int)eRecMenuIT::directoryselector);
+ tk->DefineIntToken("{timerconflictheader}", (int)eRecMenuIT::timerconflictheader);
+ tk->DefineIntToken("{overlapstartpercent}", (int)eRecMenuIT::overlapstartpercent);
+ tk->DefineIntToken("{overlapwidthpercent}", (int)eRecMenuIT::overlapwidthpercent);
+ tk->DefineIntToken("{timerconflict}", (int)eRecMenuIT::timerconflict);
+ tk->DefineIntToken("{infoactive}", (int)eRecMenuIT::infoactive);
+ tk->DefineIntToken("{deleteactive}", (int)eRecMenuIT::deleteactive);
+ tk->DefineIntToken("{editactive}", (int)eRecMenuIT::editactive);
+ tk->DefineIntToken("{searchactive}", (int)eRecMenuIT::searchactive);
+ tk->DefineIntToken("{timerstartpercent}", (int)eRecMenuIT::timerstartpercent);
+ tk->DefineIntToken("{timerwidthpercent}", (int)eRecMenuIT::timerwidthpercent);
+ tk->DefineIntToken("{event}", (int)eRecMenuIT::event);
+ tk->DefineIntToken("{hastimer}", (int)eRecMenuIT::hastimer);
+ tk->DefineIntToken("{recording}", (int)eRecMenuIT::recording);
+ tk->DefineIntToken("{recduration}", (int)eRecMenuIT::recduration);
+ tk->DefineIntToken("{searchtimer}", (int)eRecMenuIT::searchtimer);
+ tk->DefineIntToken("{timeractive}", (int)eRecMenuIT::timeractive);
+ tk->DefineIntToken("{activetimers}", (int)eRecMenuIT::activetimers);
+ tk->DefineIntToken("{recordingsdone}", (int)eRecMenuIT::recordingsdone);
+ tk->DefineIntToken("{timelineheader}", (int)eRecMenuIT::timelineheader);
+ tk->DefineIntToken("{timerset}", (int)eRecMenuIT::timerset);
+ tk->DefineIntToken("{channeltransponder}", (int)eRecMenuIT::channeltransponder);
+ tk->DefineIntToken("{timelinetimer}", (int)eRecMenuIT::timelinetimer);
+ tk->DefineIntToken("{timerstart}", (int)eRecMenuIT::timerstart);
+ tk->DefineIntToken("{timerwidth}", (int)eRecMenuIT::timerwidth);
+ tk->DefineIntToken("{favorite}", (int)eRecMenuIT::favorite);
+ tk->DefineStringToken("{line1}", (int)eRecMenuST::line1);
+ tk->DefineStringToken("{line2}", (int)eRecMenuST::line2);
+ tk->DefineStringToken("{line3}", (int)eRecMenuST::line3);
+ tk->DefineStringToken("{line4}", (int)eRecMenuST::line4);
+ tk->DefineStringToken("{stringvalue}", (int)eRecMenuST::value);
+ tk->DefineStringToken("{buttontext}", (int)eRecMenuST::buttontext);
+ tk->DefineStringToken("{textyes}", (int)eRecMenuST::textyes);
+ tk->DefineStringToken("{textno}", (int)eRecMenuST::textno);
+ tk->DefineStringToken("{text}", (int)eRecMenuST::text);
+ tk->DefineStringToken("{channelname}", (int)eRecMenuST::channelname);
+ tk->DefineStringToken("{channelid}", (int)eRecMenuST::channelid);
+ tk->DefineStringToken("{transponder}", (int)eRecMenuST::transponder);
+ tk->DefineStringToken("{day0abbr}", (int)eRecMenuST::day0abbr);
+ tk->DefineStringToken("{day1abbr}", (int)eRecMenuST::day1abbr);
+ tk->DefineStringToken("{day2abbr}", (int)eRecMenuST::day2abbr);
+ tk->DefineStringToken("{day3abbr}", (int)eRecMenuST::day3abbr);
+ tk->DefineStringToken("{day4abbr}", (int)eRecMenuST::day4abbr);
+ tk->DefineStringToken("{day5abbr}", (int)eRecMenuST::day5abbr);
+ tk->DefineStringToken("{day6abbr}", (int)eRecMenuST::day6abbr);
+ tk->DefineStringToken("{folder}", (int)eRecMenuST::folder);
+ tk->DefineStringToken("{conflictstart}", (int)eRecMenuST::conflictstart);
+ tk->DefineStringToken("{conflictstop}", (int)eRecMenuST::conflictstop);
+ tk->DefineStringToken("{overlapstart}", (int)eRecMenuST::overlapstart);
+ tk->DefineStringToken("{overlapstop}", (int)eRecMenuST::overlapstop);
+ tk->DefineStringToken("{timertitle}", (int)eRecMenuST::timertitle);
+ tk->DefineStringToken("{starttime}", (int)eRecMenuST::starttime);
+ tk->DefineStringToken("{stoptime}", (int)eRecMenuST::stoptime);
+ tk->DefineStringToken("{date}", (int)eRecMenuST::date);
+ tk->DefineStringToken("{weekday}", (int)eRecMenuST::weekday);
+ tk->DefineStringToken("{title}", (int)eRecMenuST::title);
+ tk->DefineStringToken("{shorttext}", (int)eRecMenuST::shorttext);
+ tk->DefineStringToken("{recname}", (int)eRecMenuST::recname);
+ tk->DefineStringToken("{recstarttime}", (int)eRecMenuST::recstarttime);
+ tk->DefineStringToken("{recdate}", (int)eRecMenuST::recdate);
+ tk->DefineStringToken("{searchstring}", (int)eRecMenuST::searchstring);
+ tk->DefineStringToken("{timerstart}", (int)eRecMenuST::timerstart);
+ tk->DefineStringToken("{timerstop}", (int)eRecMenuST::timerstop);
+ tk->DefineStringToken("{eventtitle}", (int)eRecMenuST::eventtitle);
+ tk->DefineStringToken("{eventshorttext}", (int)eRecMenuST::eventshorttext);
+ tk->DefineStringToken("{eventstart}", (int)eRecMenuST::eventstart);
+ tk->DefineStringToken("{eventstop}", (int)eRecMenuST::eventstop);
+ tk->DefineStringToken("{favdesc}", (int)eRecMenuST::favdesc);
+}
+
+/********************************************************************
+* Protected Functions
+********************************************************************/
+void cRecMenu::AddMenuItem(cRecMenuItem *item, bool inFront) {
+ if (!inFront)
+ menuItems.Add(item);
+ else
+ menuItems.Ins(item);
+}
+
+void cRecMenu::AddHeader(cRecMenuItem *header) {
+ this->header = header;
+ maxMenuHeight -= header->GetHeight();
+}
+
+void cRecMenu::AddFooter(cRecMenuItem *footer) {
+ this->footer = footer;
+ maxMenuHeight -= footer->GetHeight();
+}
+
+int cRecMenu::GetNumActive(void) {
+ int num = 0;
+ for (cRecMenuItem *current = menuItems.First(); current; current = menuItems.Next(current)) {
+ if (current == active) {
+ return num;
+ }
+ num++;
+ }
+ return 0;
+}
+
+bool cRecMenu::ScrollUp(bool retry) {
+ if (active == start) {
+ bool scrolled = SeekBack(false);
+ if (scrolled && scrolling) DrawScrollbar();
+ }
+ if (footer && active == footer) {
+ recMenuGrid->SetCurrent(footer->Id(), false);
+ footer->SetInactive();
+ active = stop;
+ active->SetActive();
+ return true;
+ }
+ cRecMenuItem *prev = (cRecMenuItem*)active->Prev();
+ while (prev && !prev->Selectable()) {
+ prev = (cRecMenuItem*)prev->Prev();
+ }
+ if (prev) {
+ recMenuGrid->SetCurrent(active->Id(), false);
+ active->SetInactive();
+ active = prev;
+ active->SetActive();
+ return true;
+ } else {
+ SeekBack(false);
+ if (!retry)
+ ScrollUp(true);
+ }
+ return false;
+}
+
+bool cRecMenu::ScrollDown(bool retry) {
+ if (active == stop || retry) {
+ bool scrolled = SeekForward(false);
+ if (scrolled && scrolling) DrawScrollbar();
+ }
+ cRecMenuItem *next = (cRecMenuItem*)active->Next();
+ while (next && !next->Selectable()) {
+ if (next == stop) {
+ return ScrollDown(true);
+ }
+ next = (cRecMenuItem*)next->Next();
+ }
+ if (next) {
+ recMenuGrid->SetCurrent(active->Id(), false);
+ active->SetInactive();
+ active = next;
+ active->SetActive();
+ return true;
+ } else {
+ SeekForward(false);
+ if (!retry)
+ return ScrollDown(true);
+ }
+ if (footer && active != footer) {
+ recMenuGrid->SetCurrent(active->Id(), false);
+ active->SetInactive();
+ active = footer;
+ active->SetActive();
+ return true;
+ }
+ return false;
+}
+
+bool cRecMenu::PageUp(void) {
+ bool scrolled = SeekBack(true);
+ if (scrolled && scrolling) DrawScrollbar();
+ if (!scrolled) {
+ recMenuGrid->SetCurrent(active->Id(), false);
+ active->SetInactive();
+ active = start;
+ active->SetActive();
+ return true;
+ }
+ if (!active) {
+ active = stop;
+ active->SetActive();
+ }
+ return scrolled;
+}
+
+bool cRecMenu::PageDown(void) {
+ bool scrolled = SeekForward(true);
+ if (scrolled && scrolling) DrawScrollbar();
+ if (!scrolled) {
+ recMenuGrid->SetCurrent(active->Id(), false);
+ active->SetInactive();
+ active = stop;
+ active->SetActive();
+ return true;
+ }
+ if (!active) {
+ active = start;
+ active->SetActive();
+ }
+ return scrolled;
+}
+
+void cRecMenu::ClearMenuItems(bool deleteItems) {
+ if (deleteItems) {
+ menuItems.Clear();
+ active = NULL;
+ } else {
+ for (cRecMenuItem *current = menuItems.First(); current; current = menuItems.Next(current)) {
+ current->SetNew();
+ }
+ }
+ itemCount = 0;
+ back->Clear();
+ scrollBar->Clear();
+ recMenuGrid->Clear();
+ if (header)
+ header->SetNew();
+ if (footer)
+ footer->SetNew();
+ if (active)
+ active->SetInactive();
+ active = NULL;
+}
+
+void cRecMenu::InitMenuItems(void) {
+ if (menuItems.Count() == 0)
+ return;
+ scrolling = false;
+ menuHeight = 0;
+ start = menuItems.First();
+ cRecMenuItem *current = start;
+ while (current) {
+ int itemHeight = current->GetHeight();
+ if (menuHeight + itemHeight > maxMenuHeight) {
+ scrolling = true;
+ break;
+ }
+ if (current->Active())
+ active = current;
+ itemCount++;
+ stop = current;
+ menuHeight += itemHeight;
+ current = menuItems.Next(current);
+ }
+ DrawBackground();
+ Flush();
+ if (scrolling) {
+ DrawScrollbar();
+ Flush();
+ }
+}
+
+void cRecMenu::InitMenuItemsLast(void) {
+ if (menuItems.Count() == 0)
+ return;
+ scrolling = false;
+ menuHeight = 0;
+ stop = menuItems.Last();
+ active = stop;
+ active->SetActive();
+ cRecMenuItem *current = stop;
+ while (current) {
+ int itemHeight = current->GetHeight();
+ if (menuHeight + itemHeight > maxMenuHeight) {
+ scrolling = true;
+ break;
+ }
+ itemCount++;
+ start = current;
+ menuHeight += itemHeight;
+ current = menuItems.Prev(current);
+ }
+ DrawBackground();
+ Flush();
+ if (scrolling) {
+ DrawScrollbar();
+ Flush();
+ }
+}
+
+int cRecMenu::GetHeight(void) {
+ int totalHeight = menuHeight;
+ if (header)
+ totalHeight += header->GetHeight();
+ if (footer)
+ totalHeight += footer->GetHeight();
+ return totalHeight;
+}
+
+/********************************************************************
+* Private Functions
+********************************************************************/
+
+bool cRecMenu::SeekForward(bool page) {
+ int jumpStep = 0;
+ if (page)
+ jumpStep = itemCount;
+ else
+ jumpStep = itemCount/2;
+ int jump = 0;
+ cRecMenuItem *next = (cRecMenuItem*)stop->Next();
+ while (next && jump < jumpStep) {
+ stop = next;
+ menuHeight += next->GetHeight();
+ next = (cRecMenuItem*)next->Next();
+ jump++;
+ }
+ while (start && menuHeight > maxMenuHeight) {
+ if (active == start) {
+ active = NULL;
+ start->SetInactive();
+ }
+ menuHeight -= start->GetHeight();
+ recMenuGrid->Delete(start->Id());
+ start->SetNew();
+ start = (cRecMenuItem*)start->Next();
+ }
+ if (jump > 0)
+ return true;
+ return false;
+}
+
+bool cRecMenu::SeekBack(bool page) {
+ int jumpStep = 0;
+ if (page)
+ jumpStep = itemCount;
+ else
+ jumpStep = itemCount/2;
+ int jump = 0;
+ cRecMenuItem *prev = (cRecMenuItem*)start->Prev();
+ while (prev && jump < jumpStep) {
+ start = prev;
+ menuHeight += prev->GetHeight();
+ prev = (cRecMenuItem*)prev->Prev();
+ jump++;
+ }
+ while (stop && menuHeight > maxMenuHeight) {
+ if (active == stop) {
+ active = NULL;
+ stop->SetInactive();
+ }
+ menuHeight -= stop->GetHeight();
+ recMenuGrid->Delete(stop->Id());
+ stop->SetNew();
+ stop = (cRecMenuItem*)stop->Prev();
+ }
+ if (jump > 0)
+ return true;
+ return false;
+}
+
+void cRecMenu::SetFirst(void) {
+ if (!scrolling) {
+ recMenuGrid->SetCurrent(active->Id(), false);
+ active->SetInactive();
+ active = start;
+ active->SetActive();
+ return;
+ }
+ ClearMenuItems(false);
+ menuItems.First()->SetActive();
+ InitMenuItems();
+}
+
+void cRecMenu::SetLast(void) {
+ if (!scrolling) {
+ recMenuGrid->SetCurrent(active->Id(), false);
+ active->SetInactive();
+ if (footer) {
+ active = footer;
+ } else {
+ active = stop;
+ }
+ active->SetActive();
+ return;
+ }
+ ClearMenuItems(false);
+ InitMenuItemsLast();
+}
+
+void cRecMenu::DrawBackground(void) {
+ back->Clear();
+ back->ClearTokens();
+ back->AddIntToken((int)eBackgroundRecMenuIT::menuwidth, menuWidth + 2);
+ back->AddIntToken((int)eBackgroundRecMenuIT::menuheight, GetHeight() + 2);
+ back->AddIntToken((int)eBackgroundRecMenuIT::hasscrollbar, scrolling);
+ back->Display();
+}
+
+void cRecMenu::DrawScrollbar(void) {
+ if (menuItems.Count() == 0)
+ return;
+ int scrollBarHeight = (double)itemCount / (double)menuItems.Count() * 1000;
+ int startPos = 0;
+ for (cRecMenuItem *current = menuItems.First(); current; current = menuItems.Next(current)) {
+ if (start == current)
+ break;
+ startPos++;
+ }
+ int offset = (double)startPos / (double)menuItems.Count() * 1000;
+ scrollBar->Clear();
+ scrollBar->ClearTokens();
+ scrollBar->AddIntToken((int)eScrollbarRecMenuIT::menuwidth, menuWidth + 2);
+ int y = (100 - GetHeight())/2;
+ if (header)
+ y += header->GetHeight();
+
+ scrollBar->AddIntToken((int)eScrollbarRecMenuIT::posy, y);
+ scrollBar->AddIntToken((int)eScrollbarRecMenuIT::totalheight, menuHeight);
+ scrollBar->AddIntToken((int)eScrollbarRecMenuIT::height, scrollBarHeight);
+ scrollBar->AddIntToken((int)eScrollbarRecMenuIT::offset, offset);
+ scrollBar->Display();
+}
+
+void cRecMenu::DrawHeader(void) {
+ if (!header)
+ return;
+ double width = (double)menuWidth / (double)100;
+ double x = (double)(100 - menuWidth)/(double)200;
+ int totalHeight = GetHeight();
+ double y = (double)((100 - totalHeight) / 2) / (double)100;
+
+ if (header->IsNew()) {
+ recMenuGrid->ClearTokens();
+ header->SetTokens(recMenuGrid);
+ recMenuGrid->SetGrid(header->Id(), x, y, width, (double)header->GetHeight()/(double)100);
+ }
+}
+
+void cRecMenu::DrawFooter(void) {
+ if (!footer)
+ return;
+ double width = (double)menuWidth / (double)100;
+ double x = (double)(100 - menuWidth)/(double)200;
+ int totalHeight = GetHeight();
+ int totalMenuHeight = menuHeight;
+ if (header)
+ totalMenuHeight += header->GetHeight();
+ double y = (double)((100 - totalHeight) / 2 + totalMenuHeight) / (double)100;
+
+ if (footer->IsNew()) {
+ recMenuGrid->ClearTokens();
+ footer->SetTokens(recMenuGrid);
+ recMenuGrid->SetGrid(footer->Id(), x, y, width, (double)footer->GetHeight()/(double)100);
+ } else {
+ recMenuGrid->MoveGrid(footer->Id(), x, y, width, (double)footer->GetHeight()/(double)100);
+ }
+ if (footer->Active()) {
+ active = footer;
+ recMenuGrid->SetCurrent(footer->Id(), true);
+ }
} \ No newline at end of file