@@ -88,9 +88,99 @@ ListView::ListView(std::vector<Homebrew> homebrews)
8888{
8989 log_printf (DBG_DEBUG, " posY: %d" , posY);
9090 log_printf (DBG_DEBUG, " homebrews size: %d" , homebrews.size ());
91- for (Homebrew hb : homebrews)
91+ this ->homebrews = homebrews;
92+ listItems = std::vector<std::unique_ptr<ListItem>>(homebrews.size ());
93+ LoadListItems ();
94+ }
95+
96+ long ListView::_LoadPreviousListItems (long firstDisplayed, long firstToLoad, long maxLoad)
97+ {
98+ long loaded = 0 ;
99+ for (long i = firstDisplayed; i >= firstToLoad; i--)
100+ {
101+ if (!listItems[i])
102+ {
103+ listItems[i] = std::make_unique<ListItem>(homebrews[i]);
104+ if (++loaded > maxLoad)
105+ {
106+ break ;
107+ }
108+ }
109+ }
110+ return loaded;
111+ }
112+
113+ long ListView::_LoadShownListItems (long firstDisplayed, long lastDisplayed, long maxLoad)
114+ {
115+ long loaded = 0 ;
116+ for (long i = firstDisplayed; i <= lastDisplayed; i++)
92117 {
93- listItems.emplace_back (hb);
118+ if (!listItems[i])
119+ {
120+ listItems[i] = std::make_unique<ListItem>(homebrews[i]);
121+ if (++loaded > maxLoad)
122+ {
123+ break ;
124+ }
125+ }
126+ }
127+ return loaded;
128+ }
129+
130+ long ListView::_LoadNextListItems (long lastDisplayed, long lastToLoad, long maxLoad)
131+ {
132+ long loaded = 0 ;
133+ for (long i = lastDisplayed; i <= lastToLoad; i++)
134+ {
135+ if (!listItems[i])
136+ {
137+ listItems[i] = std::make_unique<ListItem>(homebrews[i]);
138+ if (++loaded > maxLoad)
139+ {
140+ break ;
141+ }
142+ }
143+ }
144+ return loaded;
145+ }
146+
147+ void ListView::LoadListItems ()
148+ {
149+ auto first = (long )firstDisplayedItem ();
150+ auto last = (long )lastDisplayedItem ();
151+ long firstToLoad = std::max<long >(first - PRE_RENDER_EXTRA_LIST_ITEM, 0 );
152+ long lastToLoad = std::min<long >(last + PRE_RENDER_EXTRA_LIST_ITEM, listItems.size ());
153+ long loaded = 0 ;
154+ for (long i = 0 ; i < firstToLoad; i++)
155+ {
156+ listItems[i] = nullptr ;
157+ }
158+ for (long i = lastToLoad; i < (long )listItems.size (); i++)
159+ {
160+ listItems[i] = nullptr ;
161+ }
162+
163+ loaded += _LoadShownListItems (first, last, MAX_LOAD_LIST_ITEMS_PER_CYCLE);
164+ if (loaded >= MAX_LOAD_LIST_ITEMS_PER_CYCLE)
165+ return ;
166+
167+ if (scrollSpeed >= 0 )
168+ {
169+ // preferably pre-load further down the list
170+ loaded += _LoadNextListItems (first, last, MAX_LOAD_LIST_ITEMS_PER_CYCLE);
171+ if (loaded >= MAX_LOAD_LIST_ITEMS_PER_CYCLE)
172+ return ;
173+ loaded += _LoadPreviousListItems (first, last, MAX_LOAD_LIST_ITEMS_PER_CYCLE);
174+ if (loaded >= MAX_LOAD_LIST_ITEMS_PER_CYCLE)
175+ return ;
176+ } else {
177+ // preferably pre-load further up the list
178+ loaded += _LoadPreviousListItems (first, last, MAX_LOAD_LIST_ITEMS_PER_CYCLE);
179+ if (loaded >= MAX_LOAD_LIST_ITEMS_PER_CYCLE)
180+ return ;
181+ loaded += _LoadNextListItems (first, last, MAX_LOAD_LIST_ITEMS_PER_CYCLE);
182+ if (loaded >= MAX_LOAD_LIST_ITEMS_PER_CYCLE)
183+ return ;
94184 }
95185}
96186
@@ -127,7 +217,7 @@ int ListView::HandleInput(int focus, const Input& input)
127217 log_printf (DBG_DEBUG, " Clicked, adding view..." );
128218 try
129219 {
130- Activity::get_instance ()->AddView (std::make_shared<HomebrewView>(listItems .at (selectedItem). homebrew ));
220+ Activity::get_instance ()->AddView (std::make_shared<HomebrewView>(homebrews .at (selectedItem)));
131221 }
132222 catch (const std::exception& ex)
133223 {
@@ -205,7 +295,7 @@ int ListView::HandleInput(int focus, const Input& input)
205295 log_printf (DBG_DEBUG, " Pressed, adding view..." );
206296 try
207297 {
208- Activity::get_instance ()->AddView (std::make_shared<HomebrewView>(listItems .at (selectedItem). homebrew ));
298+ Activity::get_instance ()->AddView (std::make_shared<HomebrewView>(homebrews .at (selectedItem)));
209299 }
210300 catch (const std::exception& ex)
211301 {
@@ -227,6 +317,8 @@ int ListView::HandleInput(int focus, const Input& input)
227317 }
228318 }
229319
320+ LoadListItems ();
321+
230322 return 0 ;
231323}
232324
@@ -246,7 +338,10 @@ int ListView::Display()
246338 }
247339 for (int i = firstDisplayedItem (); i <= lastDisplayedItem (); i++)
248340 {
249- listItems[i].Display (itemPosY (i), i == selectedItem, itemHighlightAlpha);
341+ if (listItems[i])
342+ {
343+ listItems[i]->Display (itemPosY (i), i == selectedItem, itemHighlightAlpha);
344+ }
250345 }
251346 if (itemHighlightDirection)
252347 {
0 commit comments