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,10 +144,14 @@ 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
try:
# Получаем диалоги для текущей папки
dialogs = await self.telegram_client.get_dialogs( 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: if self.search_query:
@ -149,11 +166,14 @@ class ChatScreen(Screen):
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
except Exception as e:
log(f"Ошибка обновления чатов: {e}")
finally:
self.is_chat_update_blocked = False self.is_chat_update_blocked = False
log("Чаты обновлены") log("Чаты обновлены")
else: else:
@ -167,50 +187,34 @@ 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()
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() self.update_chat_list()
def compose(self): def compose(self):
@ -218,7 +222,7 @@ class ChatScreen(Screen):
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):