From 73bfe932694955aa3485f645ace33b95e6eeb2c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Pav=C3=B3n=20Abi=C3=A1n?= Date: Tue, 17 Feb 2026 22:47:26 +0100 Subject: [PATCH] Nest Bluesky chat buffers under Chats node and prevent duplicates Replicate the Mastodon pattern where conversation buffers are inserted as children of the direct_messages node, making Chats expandable in the tree. Also adds duplicate detection and auto-navigation to existing chat buffers. Co-Authored-By: Claude Opus 4.6 --- src/controller/buffers/blueski/chat.py | 40 +++++++++++++++++++------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/controller/buffers/blueski/chat.py b/src/controller/buffers/blueski/chat.py index b10adc67..a219d436 100644 --- a/src/controller/buffers/blueski/chat.py +++ b/src/controller/buffers/blueski/chat.py @@ -166,16 +166,9 @@ class ConversationListBuffer(BaseBuffer): convo_id = self.get_convo_id(convo) user_handle = getattr(profile, "handle", None) or (profile.get("handle") if isinstance(profile, dict) else None) or handle title = _("Chat: {0}").format(user_handle) - # Create the buffer + # Create the buffer under direct_messages node import application - wx.CallAfter( - application.app.controller.create_buffer, - buffer_type="chat_messages", - session_type="blueski", - buffer_title=title, - kwargs={"session": self.session, "convo_id": convo_id, "name": title}, - start=True - ) + wx.CallAfter(self._create_chat_buffer, application.app.controller, title, convo_id) # Refresh conversation list wx.CallAfter(self.start_stream, True, False) except Exception: @@ -325,7 +318,7 @@ class ConversationListBuffer(BaseBuffer): post.message.Destroy() def view_chat(self): - """Open the conversation in a separate buffer.""" + """Open the conversation in a separate buffer (nested under Chats node).""" conversation = self.get_conversation() if not conversation: output.speak(_("No conversation selected."), True) @@ -348,14 +341,39 @@ class ConversationListBuffer(BaseBuffer): title = _("Chat: {0}").format(names) import application - application.app.controller.create_buffer( + self._create_chat_buffer(application.app.controller, title, convo_id) + + def _create_chat_buffer(self, controller, title, convo_id): + """Create a chat buffer under the direct_messages node, avoiding duplicates.""" + account_name = self.session.get_name() + + # Avoid duplicates: if buffer already exists, navigate to it + existing = controller.search_buffer(title, account_name) + if existing: + index = controller.view.search(title, account_name) + if index is not None: + controller.view.change_buffer(index) + return + + # Insert under direct_messages node (like Mastodon's ConversationBuffer) + chats_position = controller.view.search("direct_messages", account_name) + if chats_position is None: + chats_position = controller.view.search(account_name, account_name) + + controller.create_buffer( buffer_type="chat_messages", session_type="blueski", buffer_title=title, + parent_tab=chats_position, kwargs={"session": self.session, "convo_id": convo_id, "name": title}, start=True ) + # Navigate to the newly created buffer + new_index = controller.view.search(title, account_name) + if new_index is not None: + controller.view.change_buffer(new_index) + def destroy_status(self): pass