mirror of https://github.com/mgba-emu/mgba.git
mGUI: Skip second scan loop when possible
This commit is contained in:
parent
0d96ba4f8f
commit
7640c38684
1
CHANGES
1
CHANGES
|
@ -92,6 +92,7 @@ Misc:
|
|||
- Debugger: Keep track of global cycle count
|
||||
- FFmpeg: Add looping option for GIF/APNG
|
||||
- mGUI: Show battery percentage
|
||||
- mGUI: Skip second scan loop when possible
|
||||
- Qt: Renderer can be changed while a game is running
|
||||
- Qt: Add hex index to palette view
|
||||
- Qt: Add transformation matrix info to sprite view
|
||||
|
|
|
@ -89,6 +89,8 @@ static bool _refreshDirectory(struct GUIParams* params, const char* currentPath,
|
|||
char* n2 = malloc(len);
|
||||
snprintf(n2, len, "%s/", name);
|
||||
name = n2;
|
||||
} else if (filterName && !filterName(name)) {
|
||||
continue;
|
||||
} else {
|
||||
name = strdup(name);
|
||||
}
|
||||
|
@ -96,59 +98,58 @@ static bool _refreshDirectory(struct GUIParams* params, const char* currentPath,
|
|||
++items;
|
||||
}
|
||||
qsort(GUIMenuItemListGetPointer(currentFiles, 1), GUIMenuItemListSize(currentFiles) - 1, sizeof(struct GUIMenuItem), _strpcmp);
|
||||
i = 0;
|
||||
size_t item = 0;
|
||||
while (item < GUIMenuItemListSize(currentFiles)) {
|
||||
++i;
|
||||
if (!(i % SCANNING_THRESHOLD_2)) {
|
||||
uint32_t input = 0;
|
||||
GUIPollInput(params, &input, 0);
|
||||
if (input & (1 << GUI_INPUT_CANCEL)) {
|
||||
dir->close(dir);
|
||||
return false;
|
||||
}
|
||||
|
||||
params->drawStart();
|
||||
if (params->guiPrepare) {
|
||||
params->guiPrepare();
|
||||
}
|
||||
GUIFontPrintf(params->font, 0, GUIFontHeight(params->font), GUI_ALIGN_LEFT, 0xFFFFFFFF, "(scanning item %"PRIz"u of %"PRIz"u)", i, items);
|
||||
GUIFontPrintf(params->font, 0, GUIFontHeight(params->font) * 2, GUI_ALIGN_LEFT, 0xFFFFFFFF, "%s", currentPath);
|
||||
if (params->guiFinish) {
|
||||
params->guiFinish();
|
||||
}
|
||||
params->drawEnd();
|
||||
}
|
||||
struct GUIMenuItem* testItem = GUIMenuItemListGetPointer(currentFiles, item);
|
||||
if (testItem->data != (void*) VFS_FILE) {
|
||||
++item;
|
||||
continue;
|
||||
}
|
||||
bool failed = false;
|
||||
if (filterName && !filterName(testItem->title)) {
|
||||
failed = true;
|
||||
}
|
||||
|
||||
if (!failed && filterContents) {
|
||||
struct VFile* vf = dir->openFile(dir, testItem->title, O_RDONLY);
|
||||
if (!vf) {
|
||||
failed = true;
|
||||
} else {
|
||||
if (!filterContents(vf)) {
|
||||
failed = true;
|
||||
if (preselect || filterContents) {
|
||||
i = 0;
|
||||
size_t item = 0;
|
||||
while (item < GUIMenuItemListSize(currentFiles)) {
|
||||
++i;
|
||||
// If we're not filtering the contents, this loop is fast, so there's no need to show updates
|
||||
if (filterContents && !(i % SCANNING_THRESHOLD_2)) {
|
||||
uint32_t input = 0;
|
||||
GUIPollInput(params, &input, 0);
|
||||
if (input & (1 << GUI_INPUT_CANCEL)) {
|
||||
dir->close(dir);
|
||||
return false;
|
||||
}
|
||||
vf->close(vf);
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
free((char*) testItem->title);
|
||||
GUIMenuItemListShift(currentFiles, item, 1);
|
||||
} else {
|
||||
if (preselect && strncmp(testItem->title, preselect, PATH_MAX) == 0) {
|
||||
params->fileIndex = item;
|
||||
params->drawStart();
|
||||
if (params->guiPrepare) {
|
||||
params->guiPrepare();
|
||||
}
|
||||
GUIFontPrintf(params->font, 0, GUIFontHeight(params->font), GUI_ALIGN_LEFT, 0xFFFFFFFF, "(scanning item %"PRIz"u of %"PRIz"u)", i, items);
|
||||
GUIFontPrintf(params->font, 0, GUIFontHeight(params->font) * 2, GUI_ALIGN_LEFT, 0xFFFFFFFF, "%s", currentPath);
|
||||
if (params->guiFinish) {
|
||||
params->guiFinish();
|
||||
}
|
||||
params->drawEnd();
|
||||
}
|
||||
struct GUIMenuItem* testItem = GUIMenuItemListGetPointer(currentFiles, item);
|
||||
if (testItem->data != (void*) VFS_FILE) {
|
||||
++item;
|
||||
continue;
|
||||
}
|
||||
bool failed = false;
|
||||
if (filterContents) {
|
||||
struct VFile* vf = dir->openFile(dir, testItem->title, O_RDONLY);
|
||||
if (!vf) {
|
||||
failed = true;
|
||||
} else {
|
||||
if (!filterContents(vf)) {
|
||||
failed = true;
|
||||
}
|
||||
vf->close(vf);
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
free((char*) testItem->title);
|
||||
GUIMenuItemListShift(currentFiles, item, 1);
|
||||
} else {
|
||||
if (preselect && strncmp(testItem->title, preselect, PATH_MAX) == 0) {
|
||||
params->fileIndex = item;
|
||||
}
|
||||
++item;
|
||||
}
|
||||
++item;
|
||||
}
|
||||
}
|
||||
dir->close(dir);
|
||||
|
|
Loading…
Reference in New Issue