mirror of
https://github.com/rkd77/elinks.git
synced 2025-02-02 15:09:23 -05:00
Merge with git+ssh://pasky/srv/git/elinks.git
This commit is contained in:
commit
50223a91ae
@ -254,80 +254,57 @@ count_menu_size(struct terminal *term, struct menu *menu)
|
|||||||
int_bounds(&menu->box.y, 0, height - my);
|
int_bounds(&menu->box.y, 0, height - my);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
search_selectable(struct menu *menu, int pos, int dir)
|
|
||||||
{
|
|
||||||
assert(pos >= 0 && pos < menu->size && (dir == 1 || dir == -1));
|
|
||||||
if_assert_failed return -1;
|
|
||||||
|
|
||||||
while (!mi_is_selectable(&menu->items[pos])) {
|
|
||||||
if (dir > 0 && pos == menu->size - 1)
|
|
||||||
return -1;
|
|
||||||
else if (dir < 0 && pos == 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
pos += dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
scroll_menu(struct menu *menu, int steps, int wrap)
|
scroll_menu(struct menu *menu, int steps, int wrap)
|
||||||
{
|
{
|
||||||
int height, scr_i, pos;
|
int height, scr_i, pos, start;
|
||||||
int s = steps ? steps/abs(steps) : 1; /* Selectable item search direction. */
|
int s = steps ? steps/abs(steps) : 1; /* Selectable item search direction. */
|
||||||
|
|
||||||
if (menu->size <= 0) {
|
if (menu->size <= 0) {
|
||||||
|
no_item:
|
||||||
/* Menu is empty. */
|
/* Menu is empty. */
|
||||||
menu->selected = -1;
|
menu->selected = -1;
|
||||||
menu->first = 0;
|
menu->first = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move by required steps and handle wraparound if needed.
|
start = pos = menu->selected;
|
||||||
* A step of zero can be used, indicating we want to select
|
|
||||||
* item corresponding to |menu->selected| value rather than
|
if (!steps) steps = 1;
|
||||||
* moving by to a position relative to this value.
|
|
||||||
* We override search direction for selectable items if we encounter
|
while (steps) {
|
||||||
* a limit, since it depends in which conditions this limit is
|
pos += s, steps -= s;
|
||||||
* attained. */
|
|
||||||
menu->selected += steps;
|
while (1) {
|
||||||
if (menu->selected >= menu->size) {
|
if (start == pos) {
|
||||||
if (wrap) {
|
goto select_item;
|
||||||
menu->selected = 0;
|
} else if (pos >= menu->size && s == 1) {
|
||||||
s = 1;
|
if (wrap) {
|
||||||
} else {
|
pos = 0;
|
||||||
menu->selected = int_max(0, menu->size - 1);
|
} else {
|
||||||
s = -1;
|
pos = menu->size - 1;
|
||||||
}
|
goto select_item;
|
||||||
} else if (menu->selected < 0) {
|
}
|
||||||
if (wrap) {
|
} else if (pos < 0 && s == -1) {
|
||||||
menu->selected = int_max(0, menu->size - 1);
|
if (wrap) {
|
||||||
s = -1;
|
pos = menu->size - 1;
|
||||||
} else {
|
} else {
|
||||||
menu->selected = 0;
|
pos = 0;
|
||||||
s = 1;
|
goto select_item;
|
||||||
|
}
|
||||||
|
} else if (!mi_is_selectable(&menu->items[pos])) {
|
||||||
|
pos += s;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start == -1) start = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Current selected item may be an unselectable item, so we need to
|
select_item:
|
||||||
* find first selectable item near to it.
|
if (!mi_is_selectable(&menu->items[pos]))
|
||||||
* @s = 1 : ascending search.
|
goto no_item;
|
||||||
* @s = -1: descending search. */
|
|
||||||
|
|
||||||
/* Search first selectable item in one direction. */
|
|
||||||
pos = search_selectable(menu, menu->selected, s);
|
|
||||||
if (pos == -1) {
|
|
||||||
/* If not found, invert the search direction and try again. */
|
|
||||||
pos = search_selectable(menu, menu->selected, -s);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* No selectable item found, just return. */
|
|
||||||
if (pos == -1) {
|
|
||||||
menu->selected = -1;
|
|
||||||
menu->first = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
menu->selected = pos;
|
menu->selected = pos;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user