mirror of
https://github.com/tw93/Mole.git
synced 2026-02-15 23:46:11 +00:00
feat(ui): allow arrow keys and space during search filtering
- Modified FORCE_CHAR mode in read_key() to recognize arrow keys and space - Users can now navigate and select items while typing in search mode - Improves UX by eliminating need to press Enter before selecting - ESC key still works to cancel search This restores V1.19.0 behavior where navigation worked during search
This commit is contained in:
@@ -170,7 +170,43 @@ read_key() {
|
|||||||
case "$key" in
|
case "$key" in
|
||||||
$'\n' | $'\r') echo "ENTER" ;;
|
$'\n' | $'\r') echo "ENTER" ;;
|
||||||
$'\x7f' | $'\x08') echo "DELETE" ;;
|
$'\x7f' | $'\x08') echo "DELETE" ;;
|
||||||
$'\x1b') echo "QUIT" ;;
|
$'\x1b')
|
||||||
|
# Check if this is an escape sequence (arrow keys) or ESC key
|
||||||
|
if IFS= read -r -s -n 1 -t 0.1 rest 2> /dev/null; then
|
||||||
|
if [[ "$rest" == "[" ]]; then
|
||||||
|
if IFS= read -r -s -n 1 -t 0.1 rest2 2> /dev/null; then
|
||||||
|
case "$rest2" in
|
||||||
|
"A") echo "UP" ;;
|
||||||
|
"B") echo "DOWN" ;;
|
||||||
|
"C") echo "RIGHT" ;;
|
||||||
|
"D") echo "LEFT" ;;
|
||||||
|
"3")
|
||||||
|
IFS= read -r -s -n 1 -t 0.1 rest3 2> /dev/null
|
||||||
|
[[ "$rest3" == "~" ]] && echo "DELETE" || echo "OTHER"
|
||||||
|
;;
|
||||||
|
*) echo "OTHER" ;;
|
||||||
|
esac
|
||||||
|
else echo "QUIT"; fi
|
||||||
|
elif [[ "$rest" == "O" ]]; then
|
||||||
|
if IFS= read -r -s -n 1 -t 0.1 rest2 2> /dev/null; then
|
||||||
|
case "$rest2" in
|
||||||
|
"A") echo "UP" ;;
|
||||||
|
"B") echo "DOWN" ;;
|
||||||
|
"C") echo "RIGHT" ;;
|
||||||
|
"D") echo "LEFT" ;;
|
||||||
|
*) echo "OTHER" ;;
|
||||||
|
esac
|
||||||
|
else echo "OTHER"; fi
|
||||||
|
else
|
||||||
|
# Not an escape sequence, it's ESC key
|
||||||
|
echo "QUIT"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# No following characters, it's ESC key
|
||||||
|
echo "QUIT"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
' ') echo "SPACE" ;; # Allow space in filter mode for selection
|
||||||
[[:print:]]) echo "CHAR:$key" ;;
|
[[:print:]]) echo "CHAR:$key" ;;
|
||||||
*) echo "OTHER" ;;
|
*) echo "OTHER" ;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -201,7 +201,6 @@ paginated_multi_select() {
|
|||||||
export MOLE_MENU_SORT_MODE="$sort_mode"
|
export MOLE_MENU_SORT_MODE="$sort_mode"
|
||||||
export MOLE_MENU_SORT_REVERSE="$sort_reverse"
|
export MOLE_MENU_SORT_REVERSE="$sort_reverse"
|
||||||
restore_terminal
|
restore_terminal
|
||||||
unset MOLE_READ_KEY_FORCE_CHAR
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Interrupt handler
|
# Interrupt handler
|
||||||
@@ -595,7 +594,6 @@ paginated_multi_select() {
|
|||||||
"QUIT")
|
"QUIT")
|
||||||
if [[ "$filter_mode" == "true" ]]; then
|
if [[ "$filter_mode" == "true" ]]; then
|
||||||
filter_mode="false"
|
filter_mode="false"
|
||||||
unset MOLE_READ_KEY_FORCE_CHAR
|
|
||||||
filter_query=""
|
filter_query=""
|
||||||
applied_query=""
|
applied_query=""
|
||||||
top_index=0
|
top_index=0
|
||||||
@@ -791,7 +789,6 @@ paginated_multi_select() {
|
|||||||
else
|
else
|
||||||
# Enter filter mode
|
# Enter filter mode
|
||||||
filter_mode="true"
|
filter_mode="true"
|
||||||
export MOLE_READ_KEY_FORCE_CHAR=1
|
|
||||||
filter_query=""
|
filter_query=""
|
||||||
top_index=0
|
top_index=0
|
||||||
cursor_pos=0
|
cursor_pos=0
|
||||||
@@ -839,6 +836,46 @@ paginated_multi_select() {
|
|||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
"TOUCHID")
|
||||||
|
if [[ "$filter_mode" == "true" ]]; then
|
||||||
|
filter_query+="t"
|
||||||
|
rebuild_view
|
||||||
|
need_full_redraw=true
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"RIGHT")
|
||||||
|
if [[ "$filter_mode" == "true" ]]; then
|
||||||
|
filter_query+="l"
|
||||||
|
rebuild_view
|
||||||
|
need_full_redraw=true
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"LEFT")
|
||||||
|
if [[ "$filter_mode" == "true" ]]; then
|
||||||
|
filter_query+="h"
|
||||||
|
rebuild_view
|
||||||
|
need_full_redraw=true
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"MORE")
|
||||||
|
if [[ "$filter_mode" == "true" ]]; then
|
||||||
|
filter_query+="m"
|
||||||
|
rebuild_view
|
||||||
|
need_full_redraw=true
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"UPDATE")
|
||||||
|
if [[ "$filter_mode" == "true" ]]; then
|
||||||
|
filter_query+="u"
|
||||||
|
rebuild_view
|
||||||
|
need_full_redraw=true
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
;;
|
||||||
"CHAR:f" | "CHAR:F")
|
"CHAR:f" | "CHAR:F")
|
||||||
if [[ "$filter_mode" == "true" ]]; then
|
if [[ "$filter_mode" == "true" ]]; then
|
||||||
filter_query+="${key#CHAR:}"
|
filter_query+="${key#CHAR:}"
|
||||||
@@ -906,17 +943,9 @@ paginated_multi_select() {
|
|||||||
if [[ "$filter_mode" == "true" ]]; then
|
if [[ "$filter_mode" == "true" ]]; then
|
||||||
applied_query="$filter_query"
|
applied_query="$filter_query"
|
||||||
filter_mode="false"
|
filter_mode="false"
|
||||||
unset MOLE_READ_KEY_FORCE_CHAR
|
# Preserve cursor/top_index so navigation during search is respected
|
||||||
top_index=0
|
|
||||||
cursor_pos=0
|
|
||||||
|
|
||||||
searching="true"
|
|
||||||
draw_menu # paint "searching..."
|
|
||||||
drain_pending_input # drop any extra keypresses (e.g., double-Enter)
|
|
||||||
rebuild_view
|
rebuild_view
|
||||||
searching="false"
|
# Fall through to confirmation logic
|
||||||
draw_menu
|
|
||||||
continue
|
|
||||||
fi
|
fi
|
||||||
# In normal mode: smart Enter behavior
|
# In normal mode: smart Enter behavior
|
||||||
# 1. Check if any items are already selected
|
# 1. Check if any items are already selected
|
||||||
|
|||||||
Reference in New Issue
Block a user