mirror of
https://github.com/avitoras/telegram-tui.git
synced 2025-07-27 19:26:10 +00:00
UNSTABLE | Backup
This commit is contained in:
parent
c1355b7bf9
commit
9ac58a6bfe
@ -75,7 +75,9 @@ class ChatScreen(Screen):
|
||||
self.search_query = ""
|
||||
self.selected_chat_index = 0
|
||||
self.chats = []
|
||||
self.focused_element = "search" # search, chat_list, dialog
|
||||
self.focused_element = "search" # search, chat_list
|
||||
self.current_folder = None # None - основная папка, число - ID папки
|
||||
self.folders = [] # Список доступных папок
|
||||
|
||||
async def on_mount(self):
|
||||
self.limit = 100
|
||||
@ -88,15 +90,26 @@ class ChatScreen(Screen):
|
||||
self.search_input = self.query_one("#search_input")
|
||||
self.help_label = self.query_one("#help_label")
|
||||
|
||||
# Получаем список папок
|
||||
try:
|
||||
self.folders = await self.telegram_client.get_dialogs(folder=1)
|
||||
log(f"Найдено папок: {len(self.folders)}")
|
||||
except Exception as e:
|
||||
log(f"Ошибка получения папок: {e}")
|
||||
self.folders = []
|
||||
|
||||
# Загружаем чаты
|
||||
log("Первоначальная загрузка виджетов чатов...")
|
||||
self.mount_chats(
|
||||
len(
|
||||
await self.telegram_client.get_dialogs(
|
||||
limit=self.limit, archived=False
|
||||
)
|
||||
)
|
||||
try:
|
||||
dialogs = await self.telegram_client.get_dialogs(
|
||||
limit=self.limit,
|
||||
archived=False,
|
||||
folder=self.current_folder
|
||||
)
|
||||
self.mount_chats(len(dialogs))
|
||||
log("Первоначальная загрузка виджетов чата завершена")
|
||||
except Exception as e:
|
||||
log(f"Ошибка загрузки чатов: {e}")
|
||||
|
||||
self.is_chat_update_blocked = False
|
||||
await self.update_chat_list()
|
||||
@ -131,10 +144,14 @@ class ChatScreen(Screen):
|
||||
if not self.is_chat_update_blocked:
|
||||
self.is_chat_update_blocked = True
|
||||
|
||||
try:
|
||||
# Получаем диалоги для текущей папки
|
||||
dialogs = await self.telegram_client.get_dialogs(
|
||||
limit=self.limit, archived=False
|
||||
limit=self.limit,
|
||||
archived=False,
|
||||
folder=self.current_folder
|
||||
)
|
||||
log("Получены диалоги")
|
||||
log(f"Получены диалоги для папки {self.current_folder}")
|
||||
|
||||
# Фильтруем диалоги по поисковому запросу
|
||||
if self.search_query:
|
||||
@ -149,11 +166,14 @@ class ChatScreen(Screen):
|
||||
for i in range(limit):
|
||||
chat = self.chat_container.query_one(f"#chat-{i + 1}")
|
||||
chat.username = normalize_text(str(dialogs[i].name))
|
||||
chat.msg = normalize_text(str(dialogs[i].message.message))
|
||||
chat.msg = normalize_text(str(dialogs[i].message.message if dialogs[i].message else ""))
|
||||
chat.peer_id = dialogs[i].id
|
||||
chat.is_selected = (i == self.selected_chat_index)
|
||||
chat.is_focused = (self.focused_element == "chat_list" and i == self.selected_chat_index)
|
||||
chat.folder = 1 if self.current_folder else 0
|
||||
|
||||
except Exception as e:
|
||||
log(f"Ошибка обновления чатов: {e}")
|
||||
finally:
|
||||
self.is_chat_update_blocked = False
|
||||
log("Чаты обновлены")
|
||||
else:
|
||||
@ -167,50 +187,34 @@ class ChatScreen(Screen):
|
||||
|
||||
def on_key(self, event: Key) -> None:
|
||||
if event.key == "tab":
|
||||
# Переключаем фокус между элементами
|
||||
# Переключаем фокус между поиском и списком чатов
|
||||
if self.focused_element == "search":
|
||||
self.focused_element = "chat_list"
|
||||
self.search_input.blur()
|
||||
self.update_chat_list()
|
||||
# Фокусируемся на первом чате
|
||||
first_chat = self.chat_container.query_one("#chat-1")
|
||||
if first_chat:
|
||||
first_chat.focus()
|
||||
elif self.focused_element == "chat_list":
|
||||
self.focused_element = "search"
|
||||
self.search_input.focus()
|
||||
self.update_chat_list()
|
||||
return
|
||||
|
||||
if self.focused_element == "search":
|
||||
return
|
||||
|
||||
chats = self.chat_container.query(Chat)
|
||||
if not chats:
|
||||
return
|
||||
|
||||
if event.key == "up":
|
||||
self.selected_chat_index = max(0, self.selected_chat_index - 1)
|
||||
for i, chat in enumerate(chats):
|
||||
chat.is_selected = (i == self.selected_chat_index)
|
||||
chat.is_focused = (i == self.selected_chat_index)
|
||||
# Прокручиваем к выбранному чату
|
||||
selected_chat = chats[self.selected_chat_index]
|
||||
self.chat_container.scroll_to(selected_chat, animate=False)
|
||||
elif event.key == "down":
|
||||
self.selected_chat_index = min(len(chats) - 1, self.selected_chat_index + 1)
|
||||
for i, chat in enumerate(chats):
|
||||
chat.is_selected = (i == self.selected_chat_index)
|
||||
chat.is_focused = (i == self.selected_chat_index)
|
||||
# Прокручиваем к выбранному чату
|
||||
selected_chat = chats[self.selected_chat_index]
|
||||
self.chat_container.scroll_to(selected_chat, animate=False)
|
||||
elif event.key == "enter":
|
||||
chats[self.selected_chat_index].on_click()
|
||||
elif event.key == "escape":
|
||||
# Возвращаемся к списку чатов
|
||||
self.app.pop_screen()
|
||||
self.app.push_screen("chats")
|
||||
elif event.key == "/":
|
||||
if event.key == "/":
|
||||
# Фокус на поиск
|
||||
self.focused_element = "search"
|
||||
self.search_input.focus()
|
||||
elif event.key == "[":
|
||||
# Переход в предыдущую папку
|
||||
if self.current_folder is not None:
|
||||
self.current_folder = None
|
||||
self.selected_chat_index = 0
|
||||
self.update_chat_list()
|
||||
elif event.key == "]":
|
||||
# Переход в следующую папку
|
||||
if self.current_folder is None and self.folders:
|
||||
self.current_folder = 1 # Архив
|
||||
self.selected_chat_index = 0
|
||||
self.update_chat_list()
|
||||
|
||||
def compose(self):
|
||||
@ -218,7 +222,7 @@ class ChatScreen(Screen):
|
||||
with Horizontal(id="main_container"):
|
||||
with Vertical(id="chats"):
|
||||
yield Label(
|
||||
"Навигация: Tab - переключение фокуса, ↑↓ - выбор чата, Enter - открыть, Esc - назад, / - поиск",
|
||||
"Навигация: Tab - переключение фокуса, ↑↓ - выбор чата, Enter - открыть чат, Esc - назад, / - поиск, [] - папки",
|
||||
id="help_label",
|
||||
classes="help-text"
|
||||
)
|
||||
|
@ -102,14 +102,15 @@ class Chat(Static):
|
||||
height: 3;
|
||||
content-align: center middle;
|
||||
border: solid $accent;
|
||||
margin-right: 1;
|
||||
}
|
||||
.chat-content {
|
||||
width: 100%;
|
||||
margin-left: 1;
|
||||
}
|
||||
.chat-name {
|
||||
color: $text;
|
||||
text-style: bold;
|
||||
margin-bottom: 1;
|
||||
}
|
||||
.chat-message {
|
||||
color: $text-muted;
|
||||
@ -129,6 +130,7 @@ class Chat(Static):
|
||||
self._msg = ""
|
||||
self._peer_id = 0
|
||||
self._is_selected = False
|
||||
self._folder = 0
|
||||
|
||||
def on_mount(self) -> None:
|
||||
self.switcher = self.screen.query_one("#dialog_switcher", ContentSwitcher)
|
||||
@ -168,6 +170,15 @@ class Chat(Static):
|
||||
self._is_selected = value
|
||||
self.set_class(value, "-selected")
|
||||
|
||||
@property
|
||||
def folder(self) -> int:
|
||||
return self._folder
|
||||
|
||||
@folder.setter
|
||||
def folder(self, value: int) -> None:
|
||||
self._folder = value
|
||||
self.refresh()
|
||||
|
||||
def on_focus(self) -> None:
|
||||
# Снимаем выделение со всех чатов
|
||||
for chat in self.screen.query(Chat):
|
||||
@ -222,7 +233,10 @@ class Chat(Static):
|
||||
msg = normalize_text(self._msg) or "Нет сообщений"
|
||||
msg = msg[:50] + "..." if len(msg) > 50 else msg
|
||||
|
||||
yield Static(name, classes="chat-name")
|
||||
# Добавляем метку папки если нужно
|
||||
folder_label = " [Архив]" if self._folder == 1 else ""
|
||||
|
||||
yield Static(f"{name}{folder_label}", classes="chat-name")
|
||||
yield Static(msg, classes="chat-message")
|
||||
|
||||
class Dialog(Widget):
|
||||
|
Loading…
x
Reference in New Issue
Block a user