summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2004-03-14 10:34:56 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2004-03-14 10:34:56 +0100
commit5f39e62ea159267c1dfce5774150c555d312cf6b (patch)
tree278e1d4e131ff618cc772160ed962ef8bab19868
parent99f54a7780293b109edafd48d90c53619ba00de7 (diff)
downloadvdr-5f39e62ea159267c1dfce5774150c555d312cf6b.tar.gz
vdr-5f39e62ea159267c1dfce5774150c555d312cf6b.tar.bz2
Improved performance when paging through very long menu lists
-rw-r--r--HISTORY3
-rw-r--r--menu.c20
-rw-r--r--osd.c34
3 files changed, 23 insertions, 34 deletions
diff --git a/HISTORY b/HISTORY
index 36f95371..d140769f 100644
--- a/HISTORY
+++ b/HISTORY
@@ -2714,7 +2714,7 @@ Video Disk Recorder Revision History
whether an event is currently running (see MANUAL under "The "Schedule" Menu"
for details).
-2004-03-13: Version 1.3.6
+2004-03-14: Version 1.3.6
- Completed the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed some descriptor handling in 'libsi' (thanks to Stéphane Esté-Gracias).
@@ -2738,3 +2738,4 @@ Video Disk Recorder Revision History
This was also necessary to better display itemized texts.
- Fixed detecting the running status in case an empty EPG event is broadcast (thanks
to Michael Pennewiß for pointing this out).
+- Improved performance when paging through very long menu lists.
diff --git a/menu.c b/menu.c
index 494440c8..72030664 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c 1.295 2004/03/07 09:40:34 kls Exp $
+ * $Id: menu.c 1.296 2004/03/14 10:31:13 kls Exp $
*/
#include "menu.h"
@@ -1008,13 +1008,8 @@ public:
cMenuTimers::cMenuTimers(void)
:cOsdMenu(tr("Timers"), 2, CHNUMWIDTH, 10, 6, 6)
{
- int i = 0;
- cTimer *timer;
-
- while ((timer = Timers.Get(i)) != NULL) {
- Add(new cMenuTimerItem(timer));
- i++;
- }
+ for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer))
+ Add(new cMenuTimerItem(timer));
if (Setup.SortTimers)
Sort();
SetHelp(tr("Edit"), tr("New"), tr("Delete"), Setup.SortTimers ? tr("On/Off") : tr("Mark"));
@@ -1493,13 +1488,8 @@ cMenuCommands::cMenuCommands(const char *Title, cCommands *Commands, const char
SetHasHotkeys();
commands = Commands;
parameters = Parameters ? strdup(Parameters) : NULL;
- int i = 0;
- cCommand *command;
-
- while ((command = commands->Get(i)) != NULL) {
- Add(new cOsdItem(hk(command->Title())));
- i++;
- }
+ for (cCommand *command = commands->First(); command; command = commands->Next(command))
+ Add(new cOsdItem(hk(command->Title())));
}
cMenuCommands::~cMenuCommands()
diff --git a/osd.c b/osd.c
index 2af1db2c..7ede0015 100644
--- a/osd.c
+++ b/osd.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: osd.c 1.44 2004/03/05 15:27:48 kls Exp $
+ * $Id: osd.c 1.45 2004/03/14 10:33:20 kls Exp $
*/
#include "osd.h"
@@ -429,14 +429,11 @@ void cOsdMenu::Display(void)
Interface->Help(helpRed, helpGreen, helpYellow, helpBlue);
int count = Count();
if (count > 0) {
- for (int i = 0; i < count; i++) {
- cOsdItem *item = Get(i);
- if (item)
- cStatus::MsgOsdItem(item->Text(), i);
- }
+ int ni = 0;
+ for (cOsdItem *item = First(); item; item = Next(item))
+ cStatus::MsgOsdItem(item->Text(), ni++);
if (current < 0)
current = 0; // just for safety - there HAS to be a current item!
- int n = 0;
if (current - first >= MAXOSDITEMS || current < first) {
first = current - MAXOSDITEMS / 2;
if (first + MAXOSDITEMS > count)
@@ -444,15 +441,15 @@ void cOsdMenu::Display(void)
if (first < 0)
first = 0;
}
- for (int i = first; i < count; i++) {
- cOsdItem *item = Get(i);
- if (item) {
- item->Display(i - first, i == current ? clrBlack : clrWhite, i == current ? clrCyan : clrBackground);
- if (i == current)
- cStatus::MsgOsdCurrentItem(item->Text());
- }
+ int i = first;
+ int n = 0;
+ for (cOsdItem *item = Get(first); item; item = Next(item)) {
+ item->Display(i - first, i == current ? clrBlack : clrWhite, i == current ? clrCyan : clrBackground);
+ if (i == current)
+ cStatus::MsgOsdCurrentItem(item->Text());
if (++n == MAXOSDITEMS) //TODO get this from Interface!!!
break;
+ i++;
}
}
if (!isempty(status))
@@ -562,12 +559,13 @@ void cOsdMenu::PageDown(void)
{
current += MAXOSDITEMS;
first += MAXOSDITEMS;
- if (current > Count() - 1) {
- current = Count() - 1;
- first = max(0, Count() - MAXOSDITEMS);
+ int count = Count();
+ if (current > count - 1) {
+ current = count - 1;
+ first = max(0, count - MAXOSDITEMS);
}
if (SpecialItem(current)) {
- current += (current < Count() - 1) ? 1 : -1;
+ current += (current < count - 1) ? 1 : -1;
first = max(first, current - MAXOSDITEMS);
}
Display();