summaryrefslogtreecommitdiff
path: root/recmenu.c
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2014-01-10 12:44:01 +0100
committerlouis <louis.braun@gmx.de>2014-01-10 12:44:01 +0100
commit84629bde6c85ba9bec34324a89e8fe4de8d2caa5 (patch)
tree71a8dbc9d0580b2c2430ef2dc2362e245ad4ac48 /recmenu.c
parentda40191cfc9a37c6d4cb4be8eab68a33c856d2da (diff)
downloadvdr-plugin-tvguide-84629bde6c85ba9bec34324a89e8fe4de8d2caa5.tar.gz
vdr-plugin-tvguide-84629bde6c85ba9bec34324a89e8fe4de8d2caa5.tar.bz2
Added possibility to manage EPG Search Timers in red button recording menu
Diffstat (limited to 'recmenu.c')
-rw-r--r--recmenu.c406
1 files changed, 226 insertions, 180 deletions
diff --git a/recmenu.c b/recmenu.c
index 0dc1606..7f782e9 100644
--- a/recmenu.c
+++ b/recmenu.c
@@ -1,3 +1,4 @@
+#include <list>
#include "recmenu.h"
// --- cRecMenu -------------------------------------------------------------
@@ -7,8 +8,8 @@ cRecMenu::cRecMenu(void) {
height = 2*border;
headerHeight = 0;
footerHeight = 0;
- scrollHeight = 0;
- scrollItemHeight = 0;
+ currentHeight = 0;
+ deleteMenuItems = true;
scrollable = false;
scrollbarWidth = 3 * border;
pixmapScrollBar = NULL;
@@ -23,7 +24,7 @@ cRecMenu::cRecMenu(void) {
cRecMenu::~cRecMenu(void) {
if (header)
delete header;
- menuItems.Clear();
+ ClearMenuItems();
if (footer)
delete footer;
if (pixmapScrollBar)
@@ -44,64 +45,55 @@ void cRecMenu::SetWidthPixel(int pixel) {
int cRecMenu::CalculateOptimalWidth(void) {
int optWidth = 0;
- for (cRecMenuItem *item = menuItems.First(); item; item = menuItems.Next(item)) {
- int itemWidth = item->GetWidth();
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ int itemWidth = (*item)->GetWidth();
if (itemWidth > optWidth)
optWidth = itemWidth;
}
return optWidth;
}
-
-void cRecMenu::AddMenuItem(cRecMenuItem *item, cRecMenuItem *before) {
- if (!before)
- menuItems.Add(item);
- else
- menuItems.Ins(item, before);
-}
-
-void cRecMenu::AddMenuItemScroll(cRecMenuItem *item) {
- scrollHeight += item->GetHeight();
- stopIndex++;
- numItems++;
- if (scrollItemHeight == 0)
- scrollItemHeight = item->GetHeight();
- menuItems.Add(item);
-}
-
-bool cRecMenu::CheckHeight(void) {
- int nextHeight = headerHeight + footerHeight + scrollHeight + 2*border + 150;
- if (nextHeight > geoManager.osdHeight) {
- scrollable = true;
- return false;
- }
- return true;
-}
-
-void cRecMenu::CalculateHeight(void) {
- height = 2*border;
+bool cRecMenu::CalculateHeight(bool reDraw) {
+ int newHeight = 2*border;
if (header)
- height += headerHeight;
- for (cRecMenuItem *item = menuItems.First(); item; item = menuItems.Next(item)) {
- height += item->GetHeight();
+ newHeight += headerHeight;
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ newHeight += (*item)->GetHeight();
}
if (footer)
- height += footerHeight;
- y = (geoManager.osdHeight - height) / 2;
-
- if (scrollable) {
- width += scrollbarWidth + border;
+ newHeight += footerHeight;
+
+ y = (geoManager.osdHeight - newHeight) / 2;
+
+ if (newHeight != height) {
+ height = newHeight;
+ if (scrollable && !reDraw) {
+ width += scrollbarWidth + border;
+ }
+ return true;
}
+ return false;
}
void cRecMenu::CreatePixmap(void) {
+ if (pixmap)
+ osdManager.releasePixmap(pixmap);
pixmap = osdManager.requestPixmap(3, cRect(x, y, width, height));
if (scrollable) {
int scrollBarX = x + width - scrollbarWidth - border;
int scrollBarY = y + border + headerHeight;
int scrollBarHeight = height - headerHeight - footerHeight - 2 * border;
+ if (pixmapScrollBar)
+ osdManager.releasePixmap(pixmapScrollBar);
pixmapScrollBar = osdManager.requestPixmap(4, cRect(scrollBarX, scrollBarY, scrollbarWidth, scrollBarHeight));
- }
+ } else
+ pixmapScrollBar = NULL;
+}
+
+void cRecMenu::SetHeader(cRecMenuItem *header) {
+ this->header = header;
+ headerHeight = header->GetHeight();
+ height += headerHeight;
}
void cRecMenu::SetFooter(cRecMenuItem *footer) {
@@ -110,45 +102,99 @@ void cRecMenu::SetFooter(cRecMenuItem *footer) {
height += footerHeight;
}
-void cRecMenu::SetHeader(cRecMenuItem *header) {
- this->header = header;
- headerHeight = header->GetHeight();
- height += headerHeight;
-}
+void cRecMenu::ClearMenuItems(void) {
+ if (deleteMenuItems) {
+ for (std::list<cRecMenuItem*>::iterator it = menuItems.begin(); it != menuItems.end(); it++) {
+ delete *it;
+ }
+ }
+ menuItems.clear();
+};
-cRecMenuItem *cRecMenu::GetActiveMenuItem(void) {
- for (cRecMenuItem *item = menuItems.First(); item; item = menuItems.Next(item)) {
- if (item->isActive())
- return item;
+void cRecMenu::InitMenu(bool complete) {
+ currentHeight = 0;
+ numItems = 0;
+ if (scrollable) {
+ width -= scrollbarWidth + border;
+ osdManager.releasePixmap(pixmapScrollBar);
+ pixmapScrollBar = NULL;
+ delete imgScrollBar;
+ imgScrollBar = NULL;
}
- if (footer && footer->isActive())
- return footer;
- return NULL;
+ osdManager.releasePixmap(pixmap);
+ pixmap = NULL;
+ for (std::list<cRecMenuItem*>::iterator it = menuItems.begin(); it != menuItems.end(); it++) {
+ if (deleteMenuItems)
+ delete *it;
+ else
+ (*it)->Hide();
+ }
+ menuItems.clear();
+ if (complete) {
+ startIndex = 0;
+ stopIndex = 0;
+ scrollable = false;
+ } else {
+ stopIndex = startIndex;
+ }
+
}
-int cRecMenu::GetActive(bool withOffset) {
- int numActive = withOffset?startIndex:0;
- int i = 0;
- for (cRecMenuItem *item = menuItems.First(); item; item = menuItems.Next(item)) {
- if (item->isActive()) {
- numActive += i;
- break;
+
+void cRecMenu::AddMenuItem(cRecMenuItem *item, bool inFront) {
+ if (!inFront)
+ menuItems.push_back(item);
+ else
+ menuItems.push_front(item);
+}
+
+bool cRecMenu::AddMenuItemInitial(cRecMenuItem *item) {
+ currentHeight += item->GetHeight();
+ int totalHeight = headerHeight + footerHeight + currentHeight + 2*border;
+ if (totalHeight >= geoManager.osdHeight) {
+ scrollable = true;
+ currentHeight -= item->GetHeight();
+ if (deleteMenuItems) {
+ delete item;
}
- i++;
+ return false;
}
- return numActive;
+ stopIndex++;
+ numItems++;
+ menuItems.push_back(item);
+ return true;
+}
+
+void cRecMenu::Activate(cRecMenuItem *itemOld, cRecMenuItem *item) {
+ itemOld->setInactive();
+ itemOld->setBackground();
+ itemOld->Draw();
+ item->setActive();
+ item->setBackground();
+ item->Draw();
}
bool cRecMenu::ActivatePrev(void) {
cRecMenuItem *activeItem = GetActiveMenuItem();
if (!scrollable && footer && footer->isActive()) {
- Activate(footer, menuItems.Last());
- return true;
+ if (menuItems.size() > 0) {
+ cRecMenuItem *itemLast = menuItems.back();
+ Activate(footer, itemLast);
+ return true;
+ }
} else if (activeItem) {
cRecMenuItem *prev = NULL;
- for (cRecMenuItem *item = menuItems.Prev(activeItem); item; item = menuItems.Prev(item)) {
- if (item->isSelectable()) {
- prev = item;
+ bool foundActive = false;
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.end(); item != menuItems.begin(); ) {
+ item--;
+ if (*item == activeItem) {
+ foundActive = true;
+ continue;
+ }
+ if (!foundActive)
+ continue;
+ if ((*item)->isSelectable()) {
+ prev = *item;
break;
}
}
@@ -160,47 +206,25 @@ bool cRecMenu::ActivatePrev(void) {
return false;
}
-bool cRecMenu::ActivateNext(void) {
- cRecMenuItem *activeItem = GetActiveMenuItem();
- if (activeItem) {
- cRecMenuItem *next = NULL;
- for (cRecMenuItem *item = menuItems.Next(activeItem); item; item = menuItems.Next(item)) {
- if (item->isSelectable()) {
- next = item;
- break;
- }
- }
- if (next) {
- Activate(activeItem , next);
- return true;
- } else if (!scrollable && footer && footer->isSelectable()) {
- Activate(activeItem , footer);
- return true;
- }
- }
- return false;
-}
-
-void cRecMenu::Activate(cRecMenuItem *itemOld, cRecMenuItem *item) {
- itemOld->setInactive();
- itemOld->setBackground();
- itemOld->Draw();
- item->setActive();
- item->setBackground();
- item->Draw();
-}
-
void cRecMenu::ScrollUp(void) {
if (footer && footer->isActive()) {
- Activate(footer, menuItems.Last());
+ if (menuItems.size() > 0)
+ Activate(footer, menuItems.back());
} else {
//get perv x items
int numNewItems = numItems / 2;
int numAdded = 0;
cRecMenuItem *newItem = NULL;
while (newItem = GetMenuItem(startIndex-1)) {
- AddMenuItem(newItem, menuItems.First());
- menuItems.Del(menuItems.Last(), true);
+ AddMenuItem(newItem, true);
+ cRecMenuItem *last = menuItems.back();
+ if (deleteMenuItems) {
+ delete last;
+ } else {
+ last->setInactive();
+ last->Hide();
+ }
+ menuItems.pop_back();
stopIndex--;
startIndex--;
numAdded++;
@@ -208,30 +232,71 @@ void cRecMenu::ScrollUp(void) {
break;
}
if (numAdded != 0) {
- Arrange(true);
- Display(true);
+ scrollable = true;
+ if (CalculateHeight(true))
+ CreatePixmap();
+ Arrange(deleteMenuItems);
+ Display(deleteMenuItems);
ActivatePrev();
}
}
}
+bool cRecMenu::ActivateNext(void) {
+ cRecMenuItem *activeItem = GetActiveMenuItem();
+ if (activeItem) {
+ cRecMenuItem *next = NULL;
+ bool foundActive = false;
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ if (*item == activeItem) {
+ foundActive = true;
+ continue;
+ }
+ if (!foundActive)
+ continue;
+ if ((*item)->isSelectable()) {
+ next = *item;
+ break;
+ }
+ }
+ if (next) {
+ Activate(activeItem , next);
+ return true;
+ } else if (!scrollable && footer && footer->isSelectable()) {
+ Activate(activeItem , footer);
+ return true;
+ }
+ }
+ return false;
+}
+
void cRecMenu::ScrollDown(void) {
//get next x items
int numNewItems = numItems / 2;
int numAdded = 0;
cRecMenuItem *newItem = NULL;
while (newItem = GetMenuItem(stopIndex)) {
- menuItems.Add(newItem);
- menuItems.Del(menuItems.First(), true);
- stopIndex++;
+ menuItems.push_back(newItem);
+ cRecMenuItem *first = menuItems.front();
+ if (deleteMenuItems) {
+ delete first;
+ } else {
+ first->setInactive();
+ first->Hide();
+ }
+ menuItems.pop_front();
startIndex++;
+ stopIndex++;
numAdded++;
if (numAdded >= numNewItems)
break;
}
if (numAdded != 0) {
- Arrange(true);
- Display(true);
+ scrollable = true;
+ if (CalculateHeight(true))
+ CreatePixmap();
+ Arrange(deleteMenuItems);
+ Display(deleteMenuItems);
ActivateNext();
} else {
//last item reached, activate footer
@@ -246,9 +311,9 @@ void cRecMenu::JumpBegin(void) {
cRecMenuItem *activeItem = GetActiveMenuItem();
if (!scrollable) {
cRecMenuItem *firstSelectable= NULL;
- for (cRecMenuItem *item = menuItems.First(); item; item = menuItems.Next(item)) {
- if (item->isSelectable()) {
- firstSelectable = item;
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ if ((*item)->isSelectable()) {
+ firstSelectable = *item;
break;
}
}
@@ -260,7 +325,7 @@ void cRecMenu::JumpBegin(void) {
activeItem->setBackground();
if (footer)
footer->Draw();
- menuItems.Clear();
+ ClearMenuItems();
int currentItem = 0;
cRecMenuItem *newItem = NULL;
while (newItem = GetMenuItem(currentItem)) {
@@ -272,9 +337,10 @@ void cRecMenu::JumpBegin(void) {
Arrange(true);
startIndex = 0;
stopIndex = numItems-1;
- menuItems.First()->setActive();
- menuItems.First()->setBackground();
- menuItems.First()->Draw();
+ cRecMenuItem *first = menuItems.front();
+ first->setActive();
+ first->setBackground();
+ first->Draw();
Display(true);
}
}
@@ -288,9 +354,10 @@ void cRecMenu::JumpEnd(void) {
if (footer && footer->isSelectable()) {
lastSelectable = footer;
} else {
- for (cRecMenuItem *item = menuItems.Last(); item; item = menuItems.Prev(item)) {
- if (item->isSelectable()) {
- lastSelectable = item;
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.end(); item != menuItems.begin(); ) {
+ item--;
+ if ((*item)->isSelectable()) {
+ lastSelectable = *item;
break;
}
}
@@ -301,13 +368,13 @@ void cRecMenu::JumpEnd(void) {
} else {
activeItem->setInactive();
activeItem->setBackground();
- menuItems.Clear();
+ ClearMenuItems();
int totalNumItems = GetTotalNumMenuItems();
int currentItem = totalNumItems-1;
int itemsAdded = 0;
cRecMenuItem *newItem = NULL;
while (newItem = GetMenuItem(currentItem)) {
- AddMenuItem(newItem, menuItems.First());
+ AddMenuItem(newItem, true);
currentItem--;
itemsAdded++;
if (itemsAdded >= numItems)
@@ -321,9 +388,10 @@ void cRecMenu::JumpEnd(void) {
footer->setBackground();
footer->Draw();
} else {
- menuItems.Last()->setActive();
- menuItems.Last()->setBackground();
- menuItems.Last()->Draw();
+ cRecMenuItem *last = menuItems.back();
+ last->setActive();
+ last->setBackground();
+ last->Draw();
}
Display(true);
}
@@ -344,10 +412,10 @@ void cRecMenu::Arrange(bool scroll) {
}
yElement += header->GetHeight();
}
- for (cRecMenuItem *item = menuItems.First(); item; item = menuItems.Next(item)) {
- item->SetGeometry(xElement, yElement, widthElement);
- item->SetPixmaps();
- yElement += item->GetHeight();
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ (*item)->SetGeometry(xElement, yElement, widthElement);
+ (*item)->SetPixmaps();
+ yElement += (*item)->GetHeight();
}
if (footer && !scroll) {
footer->SetGeometry(xElement, yElement, widthElement);
@@ -367,9 +435,10 @@ void cRecMenu::Display(bool scroll) {
header->setBackground();
header->Draw();
}
- for (cRecMenuItem *item = menuItems.First(); item; item = menuItems.Next(item)) {
- item->setBackground();
- item->Draw();
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ (*item)->setBackground();
+ (*item)->Show();
+ (*item)->Draw();
}
if (footer && !scroll) {
footer->setBackground();
@@ -387,8 +456,8 @@ void cRecMenu::Hide(void) {
header->Hide();
if (footer)
footer->Hide();
- for (cRecMenuItem *item = menuItems.First(); item; item = menuItems.Next(item)) {
- item->Hide();
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ (*item)->Hide();
}
}
@@ -400,8 +469,8 @@ void cRecMenu::Show(void) {
header->Show();
if (footer)
footer->Show();
- for (cRecMenuItem *item = menuItems.First(); item; item = menuItems.Next(item)) {
- item->Show();
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ (*item)->Show();
}
}
@@ -418,58 +487,35 @@ void cRecMenu::DrawScrollBar(void) {
pixmapScrollBar->DrawImage(cPoint(4, 2 + offset), *imgScrollBar);
}
-int cRecMenu::GetIntValue(int itemNumber) {
- cRecMenuItem *item = NULL;
- item = menuItems.Get(itemNumber);
- if (item) {
- return item->GetIntValue();
- }
- return -1;
-}
-
-time_t cRecMenu::GetTimeValue(int itemNumber) {
- cRecMenuItem *item = NULL;
- item = menuItems.Get(itemNumber);
- if (item) {
- return item->GetTimeValue();
- }
- return 0;
-}
-
-bool cRecMenu::GetBoolValue(int itemNumber) {
- cRecMenuItem *item = NULL;
- item = menuItems.Get(itemNumber);
- if (item) {
- return item->GetBoolValue();
- }
- return false;
-}
-
-cString cRecMenu::GetStringValue(int itemNumber) {
- cRecMenuItem *item = NULL;
- item = menuItems.Get(itemNumber);
- if (item) {
- return item->GetStringValue();
+cRecMenuItem *cRecMenu::GetActiveMenuItem(void) {
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ if ((*item)->isActive())
+ return *item;
}
- return cString("");
+ if (footer && footer->isActive())
+ return footer;
+ return NULL;
}
-const cEvent *cRecMenu::GetEventValue(int itemNumber) {
- cRecMenuItem *item = NULL;
- item = menuItems.Get(itemNumber);
- if (item) {
- return item->GetEventValue();
+cRecMenuItem *cRecMenu::GetMenuItemAt(int num) {
+ int current = 0;
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ if (current == num)
+ return *item;
+ current++;
}
return NULL;
}
-cTimer *cRecMenu::GetTimerValue(int itemNumber) {
- cRecMenuItem *item = NULL;
- item = menuItems.Get(itemNumber);
- if (item) {
- return item->GetTimerValue();
+int cRecMenu::GetActive(void) {
+ int numActive = startIndex;
+ for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
+ if ((*item)->isActive()) {
+ break;
+ }
+ numActive++;
}
- return NULL;
+ return numActive;
}
eRecMenuState cRecMenu::ProcessKey(eKeys Key) {
@@ -485,12 +531,12 @@ eRecMenuState cRecMenu::ProcessKey(eKeys Key) {
} else if (state == rmsNotConsumed) {
switch (Key & ~k_Repeat) {
case kUp:
- if (!ActivatePrev() && scrollable)
+ if (!ActivatePrev())
ScrollUp();
state = rmsConsumed;
break;
case kDown:
- if (!ActivateNext() && scrollable)
+ if (!ActivateNext())
ScrollDown();
state = rmsConsumed;
break;