mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2026-03-06 09:27:33 +01:00
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 <noreply@anthropic.com>
This commit is contained in:
@@ -166,16 +166,9 @@ class ConversationListBuffer(BaseBuffer):
|
|||||||
convo_id = self.get_convo_id(convo)
|
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
|
user_handle = getattr(profile, "handle", None) or (profile.get("handle") if isinstance(profile, dict) else None) or handle
|
||||||
title = _("Chat: {0}").format(user_handle)
|
title = _("Chat: {0}").format(user_handle)
|
||||||
# Create the buffer
|
# Create the buffer under direct_messages node
|
||||||
import application
|
import application
|
||||||
wx.CallAfter(
|
wx.CallAfter(self._create_chat_buffer, application.app.controller, title, convo_id)
|
||||||
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
|
|
||||||
)
|
|
||||||
# Refresh conversation list
|
# Refresh conversation list
|
||||||
wx.CallAfter(self.start_stream, True, False)
|
wx.CallAfter(self.start_stream, True, False)
|
||||||
except Exception:
|
except Exception:
|
||||||
@@ -325,7 +318,7 @@ class ConversationListBuffer(BaseBuffer):
|
|||||||
post.message.Destroy()
|
post.message.Destroy()
|
||||||
|
|
||||||
def view_chat(self):
|
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()
|
conversation = self.get_conversation()
|
||||||
if not conversation:
|
if not conversation:
|
||||||
output.speak(_("No conversation selected."), True)
|
output.speak(_("No conversation selected."), True)
|
||||||
@@ -348,14 +341,39 @@ class ConversationListBuffer(BaseBuffer):
|
|||||||
title = _("Chat: {0}").format(names)
|
title = _("Chat: {0}").format(names)
|
||||||
|
|
||||||
import application
|
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",
|
buffer_type="chat_messages",
|
||||||
session_type="blueski",
|
session_type="blueski",
|
||||||
buffer_title=title,
|
buffer_title=title,
|
||||||
|
parent_tab=chats_position,
|
||||||
kwargs={"session": self.session, "convo_id": convo_id, "name": title},
|
kwargs={"session": self.session, "convo_id": convo_id, "name": title},
|
||||||
start=True
|
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):
|
def destroy_status(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user