From 906bec022379ed86b573e4ef59cb6fa1b31a3f86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 11 May 2008 21:32:00 +0000 Subject: [PATCH] Add generic list scrolling See issue #3234 for more details. svn path=/trunk/; revision=33451 --- reactos/base/setup/usetup/genlist.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/reactos/base/setup/usetup/genlist.c b/reactos/base/setup/usetup/genlist.c index cb9362b06cc..19433f087ed 100644 --- a/reactos/base/setup/usetup/genlist.c +++ b/reactos/base/setup/usetup/genlist.c @@ -46,6 +46,8 @@ typedef struct _GENERIC_LIST { LIST_ENTRY ListHead; + PLIST_ENTRY FirstShown; + PLIST_ENTRY LastShown; SHORT Left; SHORT Top; SHORT Right; @@ -230,13 +232,14 @@ DrawListEntries(PGENERIC_LIST GenericList) coPos.Y = GenericList->Top + 1; Width = GenericList->Right - GenericList->Left - 1; - Entry = GenericList->ListHead.Flink; + Entry = GenericList->FirstShown; while (Entry != &GenericList->ListHead) { ListEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry); if (coPos.Y == GenericList->Bottom) break; + GenericList->LastShown = Entry; FillConsoleOutputAttribute (StdOutput, (GenericList->CurrentEntry == ListEntry) ? @@ -289,6 +292,7 @@ DrawGenericList(PGENERIC_LIST List, SHORT Right, SHORT Bottom) { + List->FirstShown = List->ListHead.Flink; List->Left = Left; List->Top = Top; List->Right = Right; @@ -314,6 +318,11 @@ ScrollDownGenericList (PGENERIC_LIST List) if (List->CurrentEntry->Entry.Flink != &List->ListHead) { Entry = List->CurrentEntry->Entry.Flink; + if (List->LastShown == &List->CurrentEntry->Entry) + { + List->FirstShown = List->FirstShown->Flink; + List->LastShown = List->LastShown->Flink; + } List->CurrentEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry); DrawListEntries(List); } @@ -331,6 +340,11 @@ ScrollUpGenericList (PGENERIC_LIST List) if (List->CurrentEntry->Entry.Blink != &List->ListHead) { Entry = List->CurrentEntry->Entry.Blink; + if (List->FirstShown == &List->CurrentEntry->Entry) + { + List->FirstShown = List->FirstShown->Blink; + List->LastShown = List->LastShown->Blink; + } List->CurrentEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry); DrawListEntries(List); }