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
132
src/screens.py
132
src/screens.py
@ -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"
|
||||||
)
|
)
|
||||||
|
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user