diff --git a/src/screens.py b/src/screens.py index 5d7fc9d..9b8382e 100644 --- a/src/screens.py +++ b/src/screens.py @@ -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 ) - ) - log("Первоначальная загрузка виджетов чата завершена") + 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,31 +144,38 @@ class ChatScreen(Screen): if not self.is_chat_update_blocked: self.is_chat_update_blocked = True - dialogs = await self.telegram_client.get_dialogs( - limit=self.limit, archived=False - ) - log("Получены диалоги") + try: + # Получаем диалоги для текущей папки + dialogs = await self.telegram_client.get_dialogs( + limit=self.limit, + archived=False, + folder=self.current_folder + ) + log(f"Получены диалоги для папки {self.current_folder}") - # Фильтруем диалоги по поисковому запросу - if self.search_query: - dialogs = [ - d for d in dialogs - if self.search_query.lower() in normalize_text(d.name).lower() - ] + # Фильтруем диалоги по поисковому запросу + if self.search_query: + dialogs = [ + d for d in dialogs + if self.search_query.lower() in normalize_text(d.name).lower() + ] - limit = len(dialogs) - self.mount_chats(limit) + limit = len(dialogs) + self.mount_chats(limit) - 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.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) + 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 if dialogs[i].message else "")) + chat.peer_id = dialogs[i].id + chat.is_selected = (i == self.selected_chat_index) + chat.folder = 1 if self.current_folder else 0 - self.is_chat_update_blocked = False - log("Чаты обновлены") + except Exception as e: + log(f"Ошибка обновления чатов: {e}") + finally: + self.is_chat_update_blocked = False + log("Чаты обновлены") else: log("Обновление чатов невозможно: уже выполняется") @@ -167,58 +187,42 @@ 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() - self.update_chat_list() + 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): yield Footer() with Horizontal(id="main_container"): with Vertical(id="chats"): yield Label( - "Навигация: Tab - переключение фокуса, ↑↓ - выбор чата, Enter - открыть, Esc - назад, / - поиск", + "Навигация: Tab - переключение фокуса, ↑↓ - выбор чата, Enter - открыть чат, Esc - назад, / - поиск, [] - папки", id="help_label", classes="help-text" ) diff --git a/src/widgets.py b/src/widgets.py index be0c0d2..77eaffb 100644 --- a/src/widgets.py +++ b/src/widgets.py @@ -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):