From 475964a7810214229c9d60c79e00192fd65eb1a0 Mon Sep 17 00:00:00 2001 From: louis Date: Sat, 18 Jan 2014 14:10:42 +0100 Subject: left / right scroll page up / down in recmenu result lists --- recmenu.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 90 insertions(+), 5 deletions(-) (limited to 'recmenu.c') diff --git a/recmenu.c b/recmenu.c index 65c409d..9a9a002 100644 --- a/recmenu.c +++ b/recmenu.c @@ -150,7 +150,7 @@ void cRecMenu::AddMenuItem(cRecMenuItem *item, bool inFront) { menuItems.push_front(item); } -bool cRecMenu::AddMenuItemInitial(cRecMenuItem *item) { +bool cRecMenu::AddMenuItemInitial(cRecMenuItem *item, bool inFront) { currentHeight += item->GetHeight(); int totalHeight = headerHeight + footerHeight + currentHeight + 2*border; if (totalHeight >= geoManager.osdHeight) { @@ -161,9 +161,14 @@ bool cRecMenu::AddMenuItemInitial(cRecMenuItem *item) { } return false; } - stopIndex++; numItems++; - menuItems.push_back(item); + if (!inFront) { + stopIndex++; + menuItems.push_back(item); + } else { + startIndex--; + menuItems.push_front(item); + } return true; } @@ -315,6 +320,86 @@ bool cRecMenu::ScrollDown(void) { return true; } +void cRecMenu::PageUp(void) { + cRecMenuItem *activeItem = GetActiveMenuItem(); + if (!activeItem) + return; + if (!scrollable) { + JumpBegin(); + return; + } + int newActive = GetActive() - numItems; + if (newActive < 0) + newActive = 0; + activeItem->setInactive(); + activeItem->setBackground(); + ClearMenuItems(); + currentHeight = 0; + stopIndex = startIndex; + numItems = 0; + cRecMenuItem *newItem = NULL; + bool spaceLeft = true; + while (newItem = GetMenuItem(startIndex-1)) { + if (startIndex-1 == newActive) + newItem->setActive(); + spaceLeft = AddMenuItemInitial(newItem, true); + if (!spaceLeft) + break; + } + if (spaceLeft) { + while (newItem = GetMenuItem(stopIndex)) { + spaceLeft = AddMenuItemInitial(newItem); + if (!spaceLeft) + break; + } + } + if (GetActive() == numItems) + menuItems.front()->setActive(); + if (CalculateHeight(true)) + CreatePixmap(); + Arrange(deleteMenuItems); + Display(deleteMenuItems); +} + +void cRecMenu::PageDown(void) { + cRecMenuItem *activeItem = GetActiveMenuItem(); + if (!activeItem) + return; + if (!scrollable) { + JumpEnd(); + return; + } + int newActive = GetActive() + numItems; + activeItem->setInactive(); + activeItem->setBackground(); + ClearMenuItems(); + currentHeight = 0; + numItems = 0; + startIndex = stopIndex; + cRecMenuItem *newItem = NULL; + bool spaceLeft = true; + while (newItem = GetMenuItem(stopIndex)) { + if (stopIndex == newActive) + newItem->setActive(); + spaceLeft = AddMenuItemInitial(newItem); + if (!spaceLeft) + break; + } + if (spaceLeft) { + while (newItem = GetMenuItem(startIndex-1)) { + spaceLeft = AddMenuItemInitial(newItem, true); + if (!spaceLeft) + break; + } + } + if (GetActive() == GetTotalNumMenuItems()) + menuItems.back()->setActive(); + if (CalculateHeight(true)) + CreatePixmap(); + Arrange(deleteMenuItems); + Display(deleteMenuItems); +} + void cRecMenu::JumpBegin(void) { cRecMenuItem *activeItem = GetActiveMenuItem(); if (!scrollable) { @@ -551,11 +636,11 @@ eRecMenuState cRecMenu::ProcessKey(eKeys Key) { state = rmsConsumed; break; case kLeft: - JumpBegin(); + PageUp(); state = rmsConsumed; break; case kRight: - JumpEnd(); + PageDown(); state = rmsConsumed; break; default: -- cgit v1.2.3