Implemented keyboard selection. Now I need to fix /mouse/ selections that select nothing, because apparently /that/ was broken...

This commit is contained in:
Pietro Gagliardi 2014-12-16 11:28:08 -05:00
parent 5db1b0f1c4
commit 3f42acb475
2 changed files with 95 additions and 0 deletions

View File

@ -1,6 +1,7 @@
// 5 december 2014
static const handlerfunc keyDownHandlers[] = {
keyDownSelectHandler,
NULL,
};

View File

@ -92,6 +92,10 @@ the routine below is intended to simulate the comctl32.dll listview keyboard nav
horizontal scrolling is different because unlike the comctl32 listview, we say that a single column in each row has the keyboard focus, so left and right navigate between columns here, instead of scrolling left/right by pixels.
TODO provide an override for scrolling by pixels?
TODO any other keyboard shortcuts?
TODO browser keys
TODO media navigation keys
TODO XBUTTON1/2?
TODO clear keys?
keyboard selection behaviors of the windows 7 listview:
with 100 items (0-99), the window currently shows items 30 through 47 as well as having item 48 partially visible
@ -125,3 +129,93 @@ when nothing is selected:
for left and right we will simulate up and down, respectively (so right selects row 0 column 0); remember that you can't have either row or column be -1 but not both
*/
HANDLER(keyDownSelectHandler)
{
intptr_t row;
intptr_t column;
if (t->count == 0 || t->nColumns == 0) // no items to select
return FALSE;
row = t->selectedRow;
column = t->selectedColumn;
switch (wParam) {
case VK_UP:
if (row == -1)
return FALSE;
row--;
if (row < 0)
row = 0;
break;
case VK_DOWN:
if (row == -1) {
row = 0;
column = 0;
} else {
row++;
if (row > t->count - 1)
row = t->count - 1;
}
break;
case VK_LEFT:
if (column == -1)
return FALSE;
column--;
if (column < 0)
column = 0;
break;
case VK_RIGHT:
if (column == -1) {
row = 0;
column = 0;
} else {
column++;
if (column > t->nColumns - 1)
column = t->nColumns - 1;
}
break;
case VK_HOME:
row = 0;
if (column == -1)
column = 0;
break;
case VK_END:
row = t->count - 1;
if (column == -1)
column = 0;
break;
case VK_PRIOR:
if (row == -1) {
row = 0;
column = 0;
} else {
row = t->vscrollpos;
if (row == t->selectedRow)
// TODO investigate why the - 1 is needed here and below
// TODO if this is a misunderstanding of how t->vpagesize works, figure out what happens if there is no partially visible row, and what is supposed to happen
row -= t->vpagesize - 1;
if (row < 0)
row = 0;
}
break;
case VK_NEXT:
if (row == -1) {
row = t->vpagesize;
column = 0;
} else {
row = t->vscrollpos + t->vpagesize - 1;
if (row == t->selectedRow)
row += t->vpagesize - 1;
if (row > t->count - 1)
row = t->count - 1;
}
break;
default:
return FALSE;
}
doselect(t, row, column);
*lResult = 0;
return TRUE;
}
// TODO check keyboard selections with nothing selected