UNSTABLE | Messages work

This commit is contained in:
wheelchairy 2025-03-27 11:32:33 +03:00
parent 74efe83f07
commit 6d11fee925

View File

@ -201,20 +201,27 @@ class TelegramTUI:
]) ])
) )
# Создаем левую панель (чаты)
self.left_panel = urwid.LineBox(
urwid.Pile([
('pack', urwid.Text(('help', "Tab - переключение фокуса, ↑↓ - выбор чата, Enter - открыть чат, Esc - назад, / - поиск, [] - папки"), align='center')),
('pack', self.search_edit),
self.chat_list
])
)
# Создаем правую панель (сообщения)
self.right_panel = urwid.LineBox(
urwid.Pile([
self.message_list,
('pack', self.input_edit)
])
)
# Создаем основной виджет чатов
self.chat_widget = urwid.Columns([ self.chat_widget = urwid.Columns([
('weight', 30, urwid.LineBox( ('weight', 30, self.left_panel),
urwid.Pile([ ('weight', 70, self.right_panel)
('pack', urwid.Text(('help', "Tab - переключение фокуса, ↑↓ - выбор чата, Enter - открыть чат, Esc - назад, / - поиск, [] - папки"), align='center')),
('pack', self.search_edit),
self.chat_list
])
)),
('weight', 70, urwid.LineBox(
urwid.Pile([
self.message_list,
('pack', self.input_edit)
])
))
]) ])
# Создаем основной виджет # Создаем основной виджет
@ -225,7 +232,7 @@ class TelegramTUI:
'header' 'header'
), ),
footer=urwid.AttrMap( footer=urwid.AttrMap(
urwid.Text(' Q: Выход | Tab: Переключение фокуса | Enter: Выбор', align='center'), urwid.Text(' Q: Выход | Tab: Переключение фокуса | Enter: Выбор/Отправка | Esc: Назад', align='center'),
'footer' 'footer'
) )
) )
@ -235,7 +242,8 @@ class TelegramTUI:
self.folders = [] self.folders = []
self.chats = [] self.chats = []
self.selected_chat_index = 0 self.selected_chat_index = 0
self.focused_element = "chat_list" # chat_list, search self.focused_element = "chat_list" # chat_list, search, messages, input
self.current_chat_id = None
def switch_screen(self, screen_name: str): def switch_screen(self, screen_name: str):
"""Переключение между экранами""" """Переключение между экранами"""
@ -426,24 +434,29 @@ class TelegramTUI:
async def handle_chat_input(self, key): async def handle_chat_input(self, key):
"""Обработка ввода в экране чатов""" """Обработка ввода в экране чатов"""
if key == 'tab': if key == 'tab':
# Переключаем фокус # Переключаем фокус циклически
if self.focused_element == "chat_list": if self.focused_element == "chat_list":
self.focused_element = "search" self.focused_element = "search"
self.chat_widget.focus_position = 0 self.left_panel.original_widget.focus_position = 1 # Фокус на поиск
pile = self.chat_widget.widget_list[0].original_widget # Получаем Pile из LineBox elif self.focused_element == "search":
pile.focus_position = 1 # Фокус на поиск if self.current_chat_id:
else: self.focused_element = "input"
self.chat_widget.focus_position = 1 # Правая панель
self.right_panel.original_widget.focus_position = 1 # Фокус на ввод
else:
self.focused_element = "chat_list"
self.chat_widget.focus_position = 0 # Левая панель
self.left_panel.original_widget.focus_position = 2 # Фокус на список чатов
elif self.focused_element == "input":
self.focused_element = "chat_list" self.focused_element = "chat_list"
self.chat_widget.focus_position = 0 self.chat_widget.focus_position = 0 # Левая панель
pile = self.chat_widget.widget_list[0].original_widget # Получаем Pile из LineBox self.left_panel.original_widget.focus_position = 2 # Фокус на список чатов
pile.focus_position = 2 # Фокус на список чатов
elif key == '/': elif key == '/':
# Фокус на поиск # Фокус на поиск
self.focused_element = "search" self.focused_element = "search"
self.chat_widget.focus_position = 0 self.chat_widget.focus_position = 0
pile = self.chat_widget.widget_list[0].original_widget # Получаем Pile из LineBox self.left_panel.original_widget.focus_position = 1
pile.focus_position = 1
elif key == '[': elif key == '[':
# Переход в предыдущую папку # Переход в предыдущую папку
@ -473,17 +486,38 @@ class TelegramTUI:
self.chat_list.set_focus(self.selected_chat_index) self.chat_list.set_focus(self.selected_chat_index)
self.update_selected_chat() self.update_selected_chat()
elif key == 'enter' and self.focused_element == "chat_list": elif key == 'enter':
# Открываем выбранный чат if self.focused_element == "chat_list" and self.chat_walker:
if self.chat_walker: # Открываем выбранный чат
focused = self.chat_walker[self.selected_chat_index] focused = self.chat_walker[self.selected_chat_index]
self.current_chat_id = focused.chat_id
await self.update_message_list(focused.chat_id) await self.update_message_list(focused.chat_id)
self.chat_widget.focus_position = 1 # Переключаемся на сообщения self.focused_element = "input"
self.chat_widget.focus_position = 1 # Правая панель
self.right_panel.original_widget.focus_position = 1 # Фокус на ввод
elif self.focused_element == "input" and self.current_chat_id:
# Отправляем сообщение
message = self.input_edit.get_edit_text()
if message.strip():
try:
await self.telegram_client.send_message(self.current_chat_id, message)
self.input_edit.set_edit_text("") # Очищаем поле ввода
await self.update_message_list(self.current_chat_id) # Обновляем список сообщений
except Exception as e:
print(f"Ошибка отправки сообщения: {e}")
elif key == 'esc': elif key == 'esc':
# Возвращаемся к списку чатов if self.focused_element in ("input", "messages"):
self.chat_widget.focus_position = 0 # Возвращаемся к списку чатов
self.focused_element = "chat_list" self.focused_element = "chat_list"
self.chat_widget.focus_position = 0 # Левая панель
self.left_panel.original_widget.focus_position = 2 # Фокус на список чатов
self.current_chat_id = None # Сбрасываем текущий чат
elif self.focused_element == "search":
# Возвращаемся к списку чатов из поиска
self.focused_element = "chat_list"
self.left_panel.original_widget.focus_position = 2
def unhandled_input(self, key): def unhandled_input(self, key):
"""Обработка необработанных нажатий клавиш""" """Обработка необработанных нажатий клавиш"""