diff --git a/install.sh b/install.sh index f392c24..45eaf2b 100755 --- a/install.sh +++ b/install.sh @@ -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 }