fix: main menu 30s refresh, stats submenu flicker-free via tput

This commit is contained in:
anten-ka
2026-04-08 22:01:02 +03:00
parent 6ec2123f83
commit 0dae922d1b

View File

@@ -131,7 +131,7 @@ show_main_menu() {
echo -e " ${CYAN}5${NC}) О программе ▸"
echo -e " ${CYAN}0${NC}) ${DIM}Выход${NC}"
echo -e " ${DIM}${line2}${NC}"
echo -e " ${DIM}Обновление через 1 сек${NC}"
echo -e " ${DIM}Обновление через 30 сек${NC}"
echo -ne " ${WHITE}${NC}"
}
@@ -946,8 +946,8 @@ main() {
while true; do
clear
show_main_menu
# Auto-refresh: 1 sec timeout
if read -t 1 -r choice; then
# Auto-refresh: 30 sec timeout
if read -t 30 -r choice; then
case "$choice" in
1) submenu_proxy ;;
2) submenu_stats ;;
@@ -957,32 +957,57 @@ main() {
0|q|exit) echo ""; log_info "До встречи! 👋"; exit 0 ;;
*) log_error "Неверный выбор" ;;
esac
# Пауза после подменю (кроме статистики — у неё свой цикл)
if [ "$choice" != "2" ]; then
echo ""
echo -ne " ${DIM}Нажмите Enter для возврата в меню...${NC}"
read -r
fi
fi
# If read timed out, loop refreshes the dashboard
done
}
# ── Статистика (авто-обновление 1 сек) ──────────────────────────────────────
# ── Статистика (авто-обновление 1 сек, без мерцания) ───────────────────────
submenu_stats() {
# Инициализируем статистику при первом входе
if type stats_init &>/dev/null; then
stats_init 2>/dev/null
fi
local line2; line2=$(printf '─%.0s' {1..54})
local first_draw=1
# Скрываем курсор для плавного обновления
tput civis 2>/dev/null
# Восстанавливаем курсор при выходе из функции
trap 'tput cnorm 2>/dev/null; trap - RETURN' RETURN
while true; do
clear
echo ""
if [ "$first_draw" -eq 1 ]; then
clear
first_draw=0
else
# Перемещаем курсор в начало экрана вместо clear — нет мерцания
tput cup 0 0 2>/dev/null || printf '\033[H'
fi
# Рисуем весь экран поверх старого содержимого
echo -e "\033[J" # очищаем от курсора до конца (убирает хвосты)
echo -e " ${BOLD}${WHITE}📊 Статистика трафика${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -e " ${DIM}${line2}${NC}"
if type show_traffic_stats &>/dev/null; then
show_traffic_stats
else
echo -e " ${DIM}Модуль статистики не загружен.${NC}"
echo -e " ${DIM}Файл lib/stats.sh не найден.${NC}"
echo ""
fi
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -e " ${DIM}${line2}${NC}"
local stats_on="вкл"
if type toggle_stats &>/dev/null; then
local cfg_val
@@ -992,27 +1017,34 @@ submenu_stats() {
echo -e " ${CYAN}1${NC}) Вкл/Выкл подсчёт (сейчас: ${stats_on})"
echo -e " ${CYAN}2${NC}) Установить/обновить сборщик статистики"
echo -e " ${CYAN}0${NC}) ${DIM}← Назад${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -e " ${DIM}Обновление через 1 сек${NC}"
echo -e " ${DIM}${line2}${NC}"
echo -e " ${DIM}Обновление каждую секунду${NC}"
# Показываем курсор для ввода, потом снова скрываем
tput cnorm 2>/dev/null
echo -ne " ${WHITE}${NC}"
if read -t 1 -r ch; then
tput civis 2>/dev/null
case "$ch" in
1)
if type toggle_stats &>/dev/null; then
toggle_stats
echo -ne " ${DIM}Нажмите Enter...${NC}"; read -r
first_draw=1 # полная перерисовка после действия
fi
;;
2)
if type install_stats_collector &>/dev/null; then
install_stats_collector
echo -ne " ${DIM}Нажмите Enter...${NC}"; read -r
first_draw=1
fi
;;
0|"") return ;;
esac
fi
tput civis 2>/dev/null
done
}