|
@ -489,6 +489,25 @@ void qmenu_free(Qmenu* qm) { |
|
|
free(qm); |
|
|
free(qm); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ORCA_FORCE_NO_INLINE |
|
|
|
|
|
static void qmenu_drive_upordown(Qmenu* qm, int req_up_or_down) { |
|
|
|
|
|
struct Qmenu_item_extra* extras = qmenu_item_extras_ptr(qm); |
|
|
|
|
|
ITEM* starting = current_item(qm->ncurses_menu); |
|
|
|
|
|
menu_driver(qm->ncurses_menu, req_up_or_down); |
|
|
|
|
|
ITEM* cur = current_item(qm->ncurses_menu); |
|
|
|
|
|
for (;;) { |
|
|
|
|
|
if (!cur || cur == starting) |
|
|
|
|
|
break; |
|
|
|
|
|
if (!qmenu_itemextra(extras, cur)->is_spacer) |
|
|
|
|
|
break; |
|
|
|
|
|
ITEM* prev = cur; |
|
|
|
|
|
menu_driver(qm->ncurses_menu, req_up_or_down); |
|
|
|
|
|
cur = current_item(qm->ncurses_menu); |
|
|
|
|
|
if (cur == prev) |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action) { |
|
|
bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action) { |
|
|
struct Qmenu_item_extra* extras = qmenu_item_extras_ptr(qm); |
|
|
struct Qmenu_item_extra* extras = qmenu_item_extras_ptr(qm); |
|
|
switch (key) { |
|
|
switch (key) { |
|
@ -504,41 +523,13 @@ bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action) { |
|
|
out_action->picked.id = cur ? qmenu_itemextra(extras, cur)->user_id : 0; |
|
|
out_action->picked.id = cur ? qmenu_itemextra(extras, cur)->user_id : 0; |
|
|
return true; |
|
|
return true; |
|
|
} break; |
|
|
} break; |
|
|
case KEY_UP: { |
|
|
case KEY_UP: |
|
|
ITEM* starting = current_item(qm->ncurses_menu); |
|
|
qmenu_drive_upordown(qm, REQ_UP_ITEM); |
|
|
menu_driver(qm->ncurses_menu, REQ_UP_ITEM); |
|
|
|
|
|
ITEM* cur = current_item(qm->ncurses_menu); |
|
|
|
|
|
for (;;) { |
|
|
|
|
|
if (!cur || cur == starting) |
|
|
|
|
|
break; |
|
|
|
|
|
if (!qmenu_itemextra(extras, cur)->is_spacer) |
|
|
|
|
|
break; |
|
|
|
|
|
ITEM* prev = cur; |
|
|
|
|
|
menu_driver(qm->ncurses_menu, REQ_UP_ITEM); |
|
|
|
|
|
cur = current_item(qm->ncurses_menu); |
|
|
|
|
|
if (cur == prev) |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
case KEY_DOWN: |
|
|
case KEY_DOWN: { |
|
|
qmenu_drive_upordown(qm, REQ_DOWN_ITEM); |
|
|
ITEM* starting = current_item(qm->ncurses_menu); |
|
|
|
|
|
menu_driver(qm->ncurses_menu, REQ_DOWN_ITEM); |
|
|
|
|
|
ITEM* cur = current_item(qm->ncurses_menu); |
|
|
|
|
|
for (;;) { |
|
|
|
|
|
if (!cur || cur == starting) |
|
|
|
|
|
break; |
|
|
|
|
|
if (!qmenu_itemextra(extras, cur)->is_spacer) |
|
|
|
|
|
break; |
|
|
|
|
|
ITEM* prev = cur; |
|
|
|
|
|
menu_driver(qm->ncurses_menu, REQ_DOWN_ITEM); |
|
|
|
|
|
cur = current_item(qm->ncurses_menu); |
|
|
|
|
|
if (cur == prev) |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|