OSD: Lookahead 0-3 positions when scrolling (#1009)
* Lookahead 3 positions when scrolling * Add lookahead position adjustment 0 = disabled 1 = 1 position ahead 2 = 2 positions ahead (default) 3 = 3 positions ahead * Implement lookahead config variable (0-3 positions)
This commit is contained in:
2
cfg.cpp
2
cfg.cpp
@@ -130,6 +130,7 @@ static const ini_var_t ini_vars[] =
|
||||
{ "OSD_LOCK", (void*)(&(cfg.osd_lock)), STRING, 0, sizeof(cfg.osd_lock) - 1 },
|
||||
{ "OSD_LOCK_TIME", (void*)(&(cfg.osd_lock_time)), UINT16, 0, 60 },
|
||||
{ "DEBUG", (void *)(&(cfg.debug)), UINT8, 0, 1 },
|
||||
{ "LOOKAHEAD", (void *)(&(cfg.lookahead)), UINT8, 0, 3 },
|
||||
{ "MAIN", (void*)(&(cfg.main)), STRING, 0, sizeof(cfg.main) - 1 },
|
||||
{"VFILTER_INTERLACE_DEFAULT", (void*)(&(cfg.vfilter_interlace_default)), STRING, 0, sizeof(cfg.vfilter_interlace_default) - 1 },
|
||||
};
|
||||
@@ -580,6 +581,7 @@ void cfg_parse()
|
||||
cfg.rumble = 1;
|
||||
cfg.wheel_force = 50;
|
||||
cfg.dvi_mode = 2;
|
||||
cfg.lookahead = 2;
|
||||
cfg.hdr = 0;
|
||||
cfg.hdr_max_nits = 1000;
|
||||
cfg.hdr_avg_nits = 250;
|
||||
|
||||
1
cfg.h
1
cfg.h
@@ -98,6 +98,7 @@ typedef struct {
|
||||
char osd_lock[25];
|
||||
uint16_t osd_lock_time;
|
||||
char debug;
|
||||
uint8_t lookahead;
|
||||
char main[1024];
|
||||
char vfilter_interlace_default[1023];
|
||||
} cfg_t;
|
||||
|
||||
152
file_io.cpp
152
file_io.cpp
@@ -1758,7 +1758,8 @@ int ScanDirectory(char* path, int mode, const char *extension, int options, cons
|
||||
if(iSelectedEntry + 1 < flist_nDirEntries()) // scroll within visible items
|
||||
{
|
||||
iSelectedEntry++;
|
||||
if (iSelectedEntry > iFirstEntry + OsdGetSize() - 1) iFirstEntry = iSelectedEntry - OsdGetSize() + 1;
|
||||
// Start scrolling when cursor is cfg.lookahead positions from bottom
|
||||
if (iSelectedEntry > iFirstEntry + OsdGetSize() - (cfg.lookahead + 1)) iFirstEntry = iSelectedEntry - OsdGetSize() + (cfg.lookahead + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1773,45 +1774,105 @@ int ScanDirectory(char* path, int mode, const char *extension, int options, cons
|
||||
if (iSelectedEntry > 0) // scroll within visible items
|
||||
{
|
||||
iSelectedEntry--;
|
||||
if (iSelectedEntry < iFirstEntry) iFirstEntry = iSelectedEntry;
|
||||
// Start scrolling when cursor is cfg.lookahead positions from top
|
||||
if (iSelectedEntry < iFirstEntry + cfg.lookahead) iFirstEntry = iSelectedEntry - cfg.lookahead;
|
||||
if (iFirstEntry < 0) iFirstEntry = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else if (mode == SCANF_NEXT_PAGE)
|
||||
{
|
||||
if (iSelectedEntry < iFirstEntry + OsdGetSize() - 2)
|
||||
// Calculate cursor position relative to current page
|
||||
int cursor_offset = iSelectedEntry - iFirstEntry;
|
||||
|
||||
// Check if we're already on the last page (less than a full page left)
|
||||
int remaining_entries = flist_nDirEntries() - iFirstEntry;
|
||||
if (remaining_entries <= OsdGetSize())
|
||||
{
|
||||
iSelectedEntry = iFirstEntry + OsdGetSize() - 1;
|
||||
if (iSelectedEntry >= flist_nDirEntries()) iSelectedEntry = flist_nDirEntries() - 1;
|
||||
// On last page - allow cursor to go to actual last row
|
||||
iSelectedEntry = flist_nDirEntries() - 1;
|
||||
iFirstEntry = flist_nDirEntries() - OsdGetSize();
|
||||
if (iFirstEntry < 0) iFirstEntry = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
iSelectedEntry += OsdGetSize();
|
||||
// Move to next page
|
||||
iFirstEntry += OsdGetSize();
|
||||
if (iSelectedEntry >= flist_nDirEntries())
|
||||
{
|
||||
iSelectedEntry = flist_nDirEntries() - 1;
|
||||
iFirstEntry = iSelectedEntry - OsdGetSize() + 1;
|
||||
if (iFirstEntry < 0) iFirstEntry = 0;
|
||||
}
|
||||
else if (iFirstEntry + OsdGetSize() > flist_nDirEntries())
|
||||
if (iFirstEntry >= flist_nDirEntries())
|
||||
{
|
||||
// At end, stay on last page
|
||||
iFirstEntry = flist_nDirEntries() - OsdGetSize();
|
||||
if (iFirstEntry < 0) iFirstEntry = 0;
|
||||
iSelectedEntry = flist_nDirEntries() - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Special handling for top row - jump to cfg.lookahead positions from bottom
|
||||
if (cursor_offset == 0)
|
||||
{
|
||||
iSelectedEntry = iFirstEntry + OsdGetSize() - (cfg.lookahead + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Maintain relative cursor position, but respect cfg.lookahead buffer from bottom
|
||||
iSelectedEntry = iFirstEntry + cursor_offset;
|
||||
|
||||
// If cursor would be on bottom cfg.lookahead rows of page, keep it at cfg.lookahead from bottom
|
||||
if (cursor_offset >= OsdGetSize() - cfg.lookahead)
|
||||
{
|
||||
iSelectedEntry = iFirstEntry + OsdGetSize() - (cfg.lookahead + 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure we don't go past the end
|
||||
if (iSelectedEntry >= flist_nDirEntries())
|
||||
{
|
||||
iSelectedEntry = flist_nDirEntries() - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else if (mode == SCANF_PREV_PAGE)
|
||||
{
|
||||
if(iSelectedEntry != iFirstEntry)
|
||||
// Calculate cursor position relative to current page
|
||||
int cursor_offset = iSelectedEntry - iFirstEntry;
|
||||
|
||||
// Check if we're already on the first page (less than a full page to go back)
|
||||
if (iFirstEntry <= OsdGetSize())
|
||||
{
|
||||
iSelectedEntry = iFirstEntry;
|
||||
// On first page - allow cursor to go to actual first row
|
||||
iSelectedEntry = 0;
|
||||
iFirstEntry = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Move to previous page
|
||||
iFirstEntry -= OsdGetSize();
|
||||
if (iFirstEntry < 0) iFirstEntry = 0;
|
||||
iSelectedEntry = iFirstEntry;
|
||||
|
||||
// Special handling for bottom row - jump to cfg.lookahead from top
|
||||
if (cursor_offset == OsdGetSize() - 1)
|
||||
{
|
||||
iSelectedEntry = iFirstEntry + cfg.lookahead;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Maintain relative cursor position, but respect cfg.lookahead buffer from top
|
||||
iSelectedEntry = iFirstEntry + cursor_offset;
|
||||
|
||||
// If cursor would be on top cfg.lookahead rows of page, keep it at cfg.lookahead from top
|
||||
if (cursor_offset <= cfg.lookahead - 1)
|
||||
{
|
||||
iSelectedEntry = iFirstEntry + cfg.lookahead;
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure we don't go past the end
|
||||
if (iSelectedEntry >= flist_nDirEntries())
|
||||
{
|
||||
iSelectedEntry = flist_nDirEntries() - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (mode == SCANF_SET_ITEM)
|
||||
@@ -1838,65 +1899,6 @@ int ScanDirectory(char* path, int mode, const char *extension, int options, cons
|
||||
if (iFirstEntry < 0) iFirstEntry = 0;
|
||||
}
|
||||
}
|
||||
else if (mode == SCANF_NEXT_CHAR)
|
||||
{
|
||||
//DirItem is sorted, so just advance until the first character changes.
|
||||
//if we reach the end before that don't change anything.
|
||||
//If we change d_type also consider that 'next'. This means next
|
||||
//advances through directories, and then advances through files
|
||||
|
||||
int found = -1;
|
||||
char curChar = toupper(DirItem[iSelectedEntry].altname[0]);
|
||||
char curdType = DirItem[iSelectedEntry].de.d_type;
|
||||
for (int i = iSelectedEntry+1; i < flist_nDirEntries(); i++)
|
||||
{
|
||||
if (toupper(DirItem[i].altname[0]) != curChar || DirItem[i].de.d_type != curdType)
|
||||
{
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found >= 0)
|
||||
{
|
||||
iSelectedEntry = found;
|
||||
if (iSelectedEntry + (OsdGetSize() / 2) >= flist_nDirEntries()) iFirstEntry = flist_nDirEntries() - OsdGetSize();
|
||||
else iFirstEntry = iSelectedEntry - (OsdGetSize()/2) + 1;
|
||||
if (iFirstEntry < 0) iFirstEntry = 0;
|
||||
}
|
||||
}
|
||||
else if (mode == SCANF_PREV_CHAR)
|
||||
{
|
||||
|
||||
//Previous seek seeks to the FIRST entry that starts with the previous letter
|
||||
//Search backward until the first char changes, and then continue looking backward
|
||||
//until it changes again.
|
||||
int found = -1;
|
||||
bool sawChange = false;
|
||||
char curChar = toupper(DirItem[iSelectedEntry].altname[0]);
|
||||
char curdType = DirItem[iSelectedEntry].de.d_type;
|
||||
for (int i = iSelectedEntry-1; i >= 0; i--)
|
||||
{
|
||||
if (toupper(DirItem[i].altname[0]) != curChar || DirItem[i].de.d_type != curdType)
|
||||
{
|
||||
if (sawChange)
|
||||
{
|
||||
found = i+1;
|
||||
break;
|
||||
}
|
||||
sawChange = true;
|
||||
curChar = toupper(DirItem[i].altname[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if (found >= 0)
|
||||
{
|
||||
iSelectedEntry = found;
|
||||
if (iSelectedEntry + (OsdGetSize() / 2) >= flist_nDirEntries()) iFirstEntry = flist_nDirEntries() - OsdGetSize();
|
||||
else iFirstEntry = iSelectedEntry - (OsdGetSize()/2) + 1;
|
||||
if (iFirstEntry < 0) iFirstEntry = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//printf("dir scan for key: %x/%c\n", mode, mode);
|
||||
|
||||
Reference in New Issue
Block a user