Skip to content

Commit e4e5cb8

Browse files
committed
feature: Updated view for recentconversation view.
fixes: zulip#1565.
1 parent 9b91f5a commit e4e5cb8

File tree

1 file changed

+49
-20
lines changed

1 file changed

+49
-20
lines changed

zulipterminal/ui_tools/views.py

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,12 @@ def read_message(self, index: int = -1) -> None:
305305
self.model.mark_message_ids_as_read(read_msg_ids)
306306

307307

308+
308309
class RecentConversationsView(urwid.Frame):
309310
def __init__(self, controller: Any) -> None:
310311
self.controller = controller
311312
self.model = controller.model
313+
312314
self.conversations = self.model.group_recent_conversations()
313315
self.all_conversations = self.conversations.copy()
314316
self.search_lock = threading.Lock()
@@ -327,9 +329,13 @@ def __init__(self, controller: Any) -> None:
327329
list_box = urwid.ListBox(self.log)
328330

329331
super().__init__(list_box, header=search_header)
332+
330333
if len(self.log) > 1:
331-
self.body.set_focus_valign("middle") # Fix: Call on self.body (the ListBox)
332-
self.log.set_focus(1) # Focus on first conversation row
334+
self.log.set_focus(1)
335+
self.body.set_focus(1)
336+
self.set_focus("body")
337+
self.body.set_focus_valign("middle")
338+
333339

334340
def _build_body_contents(
335341
self, conversations: List[Dict[str, Any]]
@@ -343,6 +349,10 @@ def _build_body_contents(
343349
contents.append(row)
344350

345351
return contents
352+
def focus_restored(self) -> None:
353+
if self.focus_position is not None:
354+
self.set_focus(self.focus_position)
355+
self.controller.update_screen()
346356

347357
def _build_header_row(self) -> urwid.Widget:
348358
columns = [
@@ -372,11 +382,11 @@ def _build_conversation_row(self, conv: Dict[str, Any], idx: int) -> urwid.Widge
372382
("weight", 1, urwid.Text(time)),
373383
]
374384
row = urwid.Columns(columns, dividechars=1)
375-
385+
focus_style = "selected"
386+
decorated_row = urwid.AttrMap(row, None, focus_style)
376387
button = urwid.Button("", on_press=self._on_row_click, user_data=conv)
377-
button._label = row
378-
button._w = urwid.AttrMap(row, None, "highlight")
379-
388+
button._label = f"#{stream} / {topic}" # Fixed: Use a string
389+
button._w = decorated_row
380390
return button
381391

382392
def _on_row_click(self, button: urwid.Button, conv: Dict[str, Any]) -> None:
@@ -403,7 +413,6 @@ def update_conversations(self, search_box: Any, new_text: str) -> None:
403413
]
404414

405415
self.empty_search = len(filtered_conversations) == 0
406-
407416
self.log.clear()
408417
if not self.empty_search:
409418
self.log.extend(self._build_body_contents(filtered_conversations))
@@ -412,11 +421,11 @@ def update_conversations(self, search_box: Any, new_text: str) -> None:
412421

413422
if len(self.log) > 1:
414423
self.log.set_focus(1)
415-
self.controller.update_screen()
424+
416425

417426
def mouse_event(
418427
self,
419-
size: tuple[int, int],
428+
size: Tuple[int, int],
420429
event: str,
421430
button: int,
422431
col: int,
@@ -434,7 +443,7 @@ def mouse_event(
434443
return True
435444
return super().mouse_event(size, event, button, col, row, focus)
436445

437-
def keypress(self, size: tuple[int, int], key: str) -> Optional[str]:
446+
def keypress(self, size: Tuple[int, int], key: str) -> Optional[str]:
438447
if is_command_key("SEARCH_RECENT_CONVERSATIONS", key):
439448
self.set_focus("header")
440449
self.search_box.set_caption(" ")
@@ -467,9 +476,20 @@ def keypress(self, size: tuple[int, int], key: str) -> Optional[str]:
467476
elif is_command_key("ALL_MESSAGES", key):
468477
self.controller.view.middle_column.set_view("messages")
469478
return None
479+
elif is_command_key("GO_RIGHT", key):
480+
self.controller.view.show_right_panel(visible=True)
481+
self.controller.view.body.set_focus(2)
482+
self.set_focus("body")
483+
self.controller.update_screen()
484+
return None
485+
elif is_command_key("GO_LEFT", key):
486+
self.controller.view.show_left_panel(visible=True)
487+
self.controller.view.body.set_focus(0)
488+
self.set_focus("body")
489+
self.controller.update_screen()
490+
return None
470491
return super().keypress(size, key)
471492

472-
473493
class StreamsViewDivider(urwid.Divider):
474494
"""
475495
A custom urwid.Divider to visually separate pinned and unpinned streams.
@@ -716,7 +736,6 @@ def mouse_event(
716736
self.keypress(size, primary_key_for_command("GO_DOWN"))
717737
return super().mouse_event(size, event, button, col, row, focus)
718738

719-
720739
class MiddleColumnView(urwid.Frame):
721740
def __init__(self, view: Any, model: Any, write_box: Any, search_box: Any) -> None:
722741
self.model = model
@@ -733,6 +752,7 @@ def __init__(self, view: Any, model: Any, write_box: Any, search_box: Any) -> No
733752
super().__init__(self.message_view, header=search_box, footer=write_box)
734753

735754
def set_view(self, view_name: str) -> None:
755+
736756
if view_name == "recent":
737757
self.current_view = self.recent_convo_view
738758
header = None
@@ -756,6 +776,7 @@ def check_narrow_and_switch_view(self) -> None:
756776
"""
757777
Check if the model's narrow has changed and switch to MessageView if necessary.
758778
"""
779+
759780
current_narrow = self.model.narrow
760781
if (
761782
current_narrow != self.last_narrow
@@ -764,7 +785,7 @@ def check_narrow_and_switch_view(self) -> None:
764785
self.set_view("messages")
765786
self.last_narrow = current_narrow
766787

767-
def keypress(self, size: tuple[int, int], key: str) -> Optional[str]:
788+
def keypress(self, size: Tuple[int, int], key: str) -> Optional[str]:
768789
self.check_narrow_and_switch_view()
769790

770791
if self.focus_position in ["footer", "header"]:
@@ -807,11 +828,9 @@ def keypress(self, size: tuple[int, int], key: str) -> Optional[str]:
807828

808829
elif is_command_key("GO_LEFT", key):
809830
self.view.show_left_panel(visible=True)
810-
return None
811831

812832
elif is_command_key("GO_RIGHT", key):
813833
self.view.show_right_panel(visible=True)
814-
return None
815834

816835
elif is_command_key("NEXT_UNREAD_TOPIC", key):
817836
narrow = self.model.narrow
@@ -862,7 +881,7 @@ def keypress(self, size: tuple[int, int], key: str) -> Optional[str]:
862881
): # 'r', 'enter', '@', '>', 'R'
863882
if self.current_view != self.message_view:
864883
self.set_view("messages")
865-
if self.message_view.log:
884+
if len(self.message_view.log)>0:
866885
self.message_view.set_focus(len(self.message_view.log) - 1)
867886
self.current_view.keypress(size, key)
868887
if self.footer.focus is not None:
@@ -871,20 +890,30 @@ def keypress(self, size: tuple[int, int], key: str) -> Optional[str]:
871890
return None
872891

873892
elif is_command_key("STREAM_MESSAGE", key):
893+
if self.controller.is_in_editor_mode():
894+
self.controller.exit_editor_mode()
874895
if self.current_view != self.message_view:
875896
self.set_view("messages")
876897
self.current_view.keypress(size, key)
877898
if self.footer.focus is None:
878899
stream_id = self.model.stream_id
879900
stream_dict = self.model.stream_dict
880901
if stream_id is None:
881-
self.footer.stream_box_view(0)
882-
else:
883-
self.footer.stream_box_view(caption=stream_dict[stream_id]["name"])
902+
# Set to a default or the intended stream
903+
default_stream_id = next(iter(stream_dict.keys()), 0)
904+
self.model.stream_id = default_stream_id
905+
stream_id = default_stream_id
906+
try:
907+
stream_data = stream_dict.get(stream_id, {})
908+
if not stream_data:
909+
raise KeyError(f"No data for stream_id {stream_id}")
910+
caption = stream_data.get("name", "Unknown Stream")
911+
self.footer.stream_box_view(stream_id, caption=caption)
912+
except KeyError:
913+
self.footer.stream_box_view(0, caption="Unknown Stream") # Fallback
884914
self.set_focus("footer")
885915
self.footer.focus_position = 0
886916
return None
887-
888917
elif is_command_key("STREAM_NARROW", key):
889918
if (
890919
self.current_view != self.message_view

0 commit comments

Comments
 (0)