UNSTABLE | Backup

This commit is contained in:
wheelchairy 2025-03-27 10:55:08 +03:00
parent c1355b7bf9
commit 9ac58a6bfe
2 changed files with 84 additions and 66 deletions

View File

@ -75,7 +75,9 @@ class ChatScreen(Screen):
self.search_query = "" self.search_query = ""
self.selected_chat_index = 0 self.selected_chat_index = 0
self.chats = [] 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): async def on_mount(self):
self.limit = 100 self.limit = 100
@ -88,15 +90,26 @@ class ChatScreen(Screen):
self.search_input = self.query_one("#search_input") self.search_input = self.query_one("#search_input")
self.help_label = self.query_one("#help_label") 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("Первоначальная загрузка виджетов чатов...") log("Первоначальная загрузка виджетов чатов...")
self.mount_chats( try:
len( dialogs = await self.telegram_client.get_dialogs(
await self.telegram_client.get_dialogs( limit=self.limit,
limit=self.limit, archived=False archived=False,
) folder=self.current_folder
) )
) self.mount_chats(len(dialogs))
log("Первоначальная загрузка виджетов чата завершена") log("Первоначальная загрузка виджетов чата завершена")
except Exception as e:
log(f"Ошибка загрузки чатов: {e}")
self.is_chat_update_blocked = False self.is_chat_update_blocked = False
await self.update_chat_list() await self.update_chat_list()
@ -131,31 +144,38 @@ class ChatScreen(Screen):
if not self.is_chat_update_blocked: if not self.is_chat_update_blocked:
self.is_chat_update_blocked = True self.is_chat_update_blocked = True
dialogs = await self.telegram_client.get_dialogs( try:
limit=self.limit, archived=False # Получаем диалоги для текущей папки
) dialogs = await self.telegram_client.get_dialogs(
log("Получены диалоги") limit=self.limit,
archived=False,
folder=self.current_folder
)
log(f"Получены диалоги для папки {self.current_folder}")
# Фильтруем диалоги по поисковому запросу # Фильтруем диалоги по поисковому запросу
if self.search_query: if self.search_query:
dialogs = [ dialogs = [
d for d in dialogs d for d in dialogs
if self.search_query.lower() in normalize_text(d.name).lower() if self.search_query.lower() in normalize_text(d.name).lower()
] ]
limit = len(dialogs) limit = len(dialogs)
self.mount_chats(limit) self.mount_chats(limit)
for i in range(limit): for i in range(limit):
chat = self.chat_container.query_one(f"#chat-{i + 1}") chat = self.chat_container.query_one(f"#chat-{i + 1}")
chat.username = normalize_text(str(dialogs[i].name)) 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.peer_id = dialogs[i].id
chat.is_selected = (i == self.selected_chat_index) 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
self.is_chat_update_blocked = False except Exception as e:
log("Чаты обновлены") log(f"Ошибка обновления чатов: {e}")
finally:
self.is_chat_update_blocked = False
log("Чаты обновлены")
else: else:
log("Обновление чатов невозможно: уже выполняется") log("Обновление чатов невозможно: уже выполняется")
@ -167,58 +187,42 @@ class ChatScreen(Screen):
def on_key(self, event: Key) -> None: def on_key(self, event: Key) -> None:
if event.key == "tab": if event.key == "tab":
# Переключаем фокус между элементами # Переключаем фокус между поиском и списком чатов
if self.focused_element == "search": if self.focused_element == "search":
self.focused_element = "chat_list" self.focused_element = "chat_list"
self.search_input.blur() 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": elif self.focused_element == "chat_list":
self.focused_element = "search" self.focused_element = "search"
self.search_input.focus() self.search_input.focus()
self.update_chat_list()
return return
if self.focused_element == "search": if event.key == "/":
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 == "/":
# Фокус на поиск # Фокус на поиск
self.focused_element = "search" self.focused_element = "search"
self.search_input.focus() 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): def compose(self):
yield Footer() yield Footer()
with Horizontal(id="main_container"): with Horizontal(id="main_container"):
with Vertical(id="chats"): with Vertical(id="chats"):
yield Label( yield Label(
"Навигация: Tab - переключение фокуса, ↑↓ - выбор чата, Enter - открыть, Esc - назад, / - поиск", "Навигация: Tab - переключение фокуса, ↑↓ - выбор чата, Enter - открыть чат, Esc - назад, / - поиск, [] - папки",
id="help_label", id="help_label",
classes="help-text" classes="help-text"
) )

View File

@ -102,14 +102,15 @@ class Chat(Static):
height: 3; height: 3;
content-align: center middle; content-align: center middle;
border: solid $accent; border: solid $accent;
margin-right: 1;
} }
.chat-content { .chat-content {
width: 100%; width: 100%;
margin-left: 1;
} }
.chat-name { .chat-name {
color: $text; color: $text;
text-style: bold; text-style: bold;
margin-bottom: 1;
} }
.chat-message { .chat-message {
color: $text-muted; color: $text-muted;
@ -129,6 +130,7 @@ class Chat(Static):
self._msg = "" self._msg = ""
self._peer_id = 0 self._peer_id = 0
self._is_selected = False self._is_selected = False
self._folder = 0
def on_mount(self) -> None: def on_mount(self) -> None:
self.switcher = self.screen.query_one("#dialog_switcher", ContentSwitcher) self.switcher = self.screen.query_one("#dialog_switcher", ContentSwitcher)
@ -168,6 +170,15 @@ class Chat(Static):
self._is_selected = value self._is_selected = value
self.set_class(value, "-selected") 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: def on_focus(self) -> None:
# Снимаем выделение со всех чатов # Снимаем выделение со всех чатов
for chat in self.screen.query(Chat): for chat in self.screen.query(Chat):
@ -222,7 +233,10 @@ class Chat(Static):
msg = normalize_text(self._msg) or "Нет сообщений" msg = normalize_text(self._msg) or "Нет сообщений"
msg = msg[:50] + "..." if len(msg) > 50 else msg 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") yield Static(msg, classes="chat-message")
class Dialog(Widget): class Dialog(Widget):