Skip to content

Commit e345826

Browse files
authored
Merge pull request #79 from robsdedude/dynamicListItemLoading
Dynamic list item loading
2 parents 0a126ca + 65510a9 commit e345826

4 files changed

Lines changed: 115 additions & 14 deletions

File tree

CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ string(REGEX REPLACE "0+0\\." "0." VITA_VERSION_HUMAN ${VITA_VERSION})
2626

2727
set(VERSION_YAML_URL "https://vhbb.download/version.php")
2828
set(UPDATE_URL "https://github.com/devnoname120/vhbb/releases/download/${VITA_VERSION_HUMAN}/VitaHBBrowser.vpk")
29-
# Old test URL's
29+
# Old test URLs
3030
#set(VERSION_YAML_URL "https://github.com/robsdedude/vhbb/raw/updateTestBranch/release/version.yml")
3131
#set(UPDATE_URL "https://github.com/robsdedude/vhbb/raw/updateTestBranch/release/VitaHBBrowser.vpk")
3232

@@ -217,7 +217,7 @@ if (EXISTS "${psvitaipFilePath}")
217217
file(STRINGS "${psvitaipFilePath}" PSVITAIP)
218218

219219
add_custom_target(send
220-
COMMAND curl -T ${SHORT_NAME}.self ftp://${PSVITAIP}:1337/ux0:/app/${VITA_TITLEID}/eboot.bin
220+
COMMAND curl --ftp-method nocwd -T ${SHORT_NAME}.self ftp://${PSVITAIP}:1337/ux0:/app/${VITA_TITLEID}/eboot.bin
221221
DEPENDS ${SHORT_NAME}.self
222222
)
223223

@@ -227,7 +227,7 @@ if (EXISTS "${psvitaipFilePath}")
227227
)
228228

229229
add_custom_target(vpksend
230-
COMMAND curl -T ${SHORT_NAME}.vpk ftp://${PSVITAIP}:1337/ux0:/
230+
COMMAND curl --ftp-method nocwd -T ${SHORT_NAME}.vpk ftp://${PSVITAIP}:1337/ux0:/
231231
DEPENDS ${SHORT_NAME}.vpk
232232
)
233233
else ()

src/Views/ListView/listView.cpp

Lines changed: 100 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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
{

src/Views/ListView/listView.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#define LIST_MAX_Y 543 // This ordinate is included too
1111
#define LIST_RANGE_Y (LIST_MAX_Y - LIST_MIN_Y)
1212
#define LIST_HEIGHT (LIST_RANGE_Y + 1)
13+
#define PRE_RENDER_EXTRA_LIST_ITEM 30
14+
#define MAX_LOAD_LIST_ITEMS_PER_CYCLE 1
1315

1416
// Max speed px/ms above which selected item is no more selected
1517
#define LIST_SELECTION_MAX_SPEED 0.000070
@@ -27,7 +29,9 @@ class ListView: public View {
2729
virtual bool IsReadyToShow() { return true; };
2830

2931
protected:
30-
std::vector<ListItem> listItems;
32+
std::vector<Homebrew> homebrews;
33+
std::vector<std::unique_ptr<ListItem>> listItems;
34+
void LoadListItems();
3135

3236
private:
3337
Font font_43;
@@ -49,4 +53,7 @@ class ListView: public View {
4953
unsigned int lastFullyDisplayedItem();
5054
int coordinateToItem(double coordY);
5155
int updateScrollSpeed(double &scrollSpeed, unsigned long timeDif);
56+
long _LoadPreviousListItems(long firstDisplayed, long firstToLoad, long maxLoad);
57+
long _LoadShownListItems(long firstDisplayed, long lastDisplayed, long maxLoad);
58+
long _LoadNextListItems(long lastDisplayed, long lastToLoad, long loadMax);
5259
};

src/Views/ListView/searchView.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,10 @@ int SearchView::Display()
3434
auto db = Database::get_instance();
3535
std::vector<Homebrew> hbs;
3636
hbs = db->Search(SearchQuery(_ime_search_view_result->userText));
37-
listItems.clear();
38-
for (Homebrew hb : hbs)
39-
{
40-
listItems.emplace_back(hb);
41-
}
37+
homebrews = hbs;
38+
39+
std::fill(listItems.begin(), listItems.end(), nullptr);
40+
LoadListItems();
4241
lastQuery = _ime_search_view_result->userText;
4342
}
4443
else

0 commit comments

Comments
 (0)