Skip to content

Commit 2552dc5

Browse files
committed
Sets current stream marker for empty streams.
Current stream headers for empty/muted/new streams used to not get updated. We now introduce a dummy message to update label. Fixes: zulip#259
1 parent 9a79ece commit 2552dc5

File tree

4 files changed

+44
-11
lines changed

4 files changed

+44
-11
lines changed

zulipterminal/core.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,11 @@ def narrow_to_stream(self, button: Any) -> None:
132132

133133
if hasattr(button, 'message'):
134134
w_list = create_msg_box_list(
135-
self.model, msg_id_list, button.message['id'])
135+
self.model, msg_id_list, button.message['id'],
136+
stream_cap=button.caption)
136137
else:
137-
w_list = create_msg_box_list(self.model, msg_id_list)
138+
w_list = create_msg_box_list(self.model, msg_id_list,
139+
stream_cap=button.caption)
138140

139141
self._finalize_show(w_list)
140142

zulipterminal/ui_tools/boxes.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,15 @@ def keypress(self, size: Tuple[int, int], key: str) -> str:
120120

121121
class MessageBox(urwid.Pile):
122122
def __init__(self, message: Dict[str, Any], model: Any,
123-
last_message: Any) -> None:
123+
last_message: Any, empty_stream: bool=False) -> None:
124124
self.model = model
125125
self.message = message
126126
self.caption = ''
127127
self.stream_id = None # type: Union[int, None]
128128
self.title = ''
129129
self.email = ''
130+
# if this is the only message in the stream
131+
self.empty_stream = empty_stream
130132
self.user_id = None # type: Union[int, None]
131133
self.last_message = last_message
132134
# if this is the first message
@@ -149,6 +151,8 @@ def _time_for_message(self, message: Dict[str, Any]) -> str:
149151
return ctime(message['timestamp'])[:-8]
150152

151153
def need_recipient_header(self) -> bool:
154+
if(self.empty_stream):
155+
return True
152156
last_msg = self.last_message
153157
if self.message['type'] == 'stream':
154158
if (last_msg['type'] == 'stream' and
@@ -334,6 +338,11 @@ def main_view(self) -> List[Any]:
334338
else:
335339
recipient_header = None
336340

341+
# Dummy messages with just headers and no content
342+
if self.empty_stream:
343+
parts = [(recipient_header, recipient_header is not None)]
344+
return [part for part, condition in parts if condition]
345+
337346
# Content Header
338347
message = {
339348
key: {
@@ -461,19 +470,19 @@ def keypress(self, size: Tuple[int, int], key: str) -> str:
461470
self.model.controller.narrow_to_topic(self)
462471
elif is_command_key('GO_BACK', key):
463472
self.model.controller.show_all_messages(self)
464-
elif is_command_key('REPLY_AUTHOR', key):
473+
elif is_command_key('REPLY_AUTHOR', key) and not self.empty_stream:
465474
self.model.controller.view.write_box.private_box_view(
466475
email=self.message['sender_email']
467476
)
468-
elif is_command_key('MENTION_REPLY', key):
477+
elif is_command_key('MENTION_REPLY', key) and not self.empty_stream:
469478
self.keypress(size, 'enter')
470479
mention = '@**' + self.message['sender_full_name'] + '** '
471480
self.model.controller.view.write_box.msg_write_box.set_edit_text(
472481
mention)
473482
self.model.controller.view.write_box.msg_write_box.set_edit_pos(
474483
len(mention))
475484
self.model.controller.view.middle_column.set_focus('footer')
476-
elif is_command_key('QUOTE_REPLY', key):
485+
elif is_command_key('QUOTE_REPLY', key) and not self.empty_stream:
477486
self.keypress(size, 'enter')
478487
quote = '```quote\n' + self.message['content'] + '\n```\n'
479488
self.model.controller.view.write_box.msg_write_box.set_edit_text(

zulipterminal/ui_tools/utils.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77

88
def create_msg_box_list(model: Any, messages: Union[None, Iterable[Any]]=None,
99
focus_msg_id: Union[None, int]=None,
10-
last_message: Union[None, Any]=None) -> List[Any]:
10+
last_message: Union[None, Any]=None,
11+
stream_cap: Any=None) -> List[Any]:
1112
"""
1213
MessageBox for every message displayed is created here.
1314
"""
@@ -18,11 +19,27 @@ def create_msg_box_list(model: Any, messages: Union[None, Iterable[Any]]=None,
1819
message_list.sort(key=lambda msg: msg['timestamp'])
1920
w_list = []
2021
focus_msg = None
22+
empty_stream = False
2123
last_msg = last_message
2224
muted_msgs = 0 # No of messages that are muted.
25+
26+
# We create a dummy message to show as stream header.
27+
# This message has only type, caption and empty subject
28+
if message_list == [] and stream_cap is not None:
29+
msg = {}
30+
msg['type'] = 'stream'
31+
msg['display_recipient'] = stream_cap
32+
msg['stream_id'] = model.stream_id
33+
msg['subject'] = ''
34+
msg['id'] = None
35+
msg['reactions'] = []
36+
msg['flags'] = ['read']
37+
message_list.append(msg)
38+
empty_stream = True
39+
2340
for msg in message_list:
2441
# Remove messages of muted topics / streams.
25-
if is_muted(msg, model):
42+
if not empty_stream and is_muted(msg, model):
2643
muted_msgs += 1
2744
continue
2845

@@ -34,14 +51,16 @@ def create_msg_box_list(model: Any, messages: Union[None, Iterable[Any]]=None,
3451
msg_flag = None
3552
elif focus_msg is None:
3653
focus_msg = message_list.index(msg) - muted_msgs
37-
if msg['id'] == focus_msg_id:
54+
if not empty_stream and msg['id'] == focus_msg_id:
3855
focus_msg = message_list.index(msg) - muted_msgs
3956
w_list.append(urwid.AttrMap(
40-
MessageBox(msg, model, last_msg),
57+
MessageBox(msg, model, last_msg, empty_stream),
4158
msg_flag,
4259
'msg_selected'
4360
))
44-
last_msg = msg
61+
# We don't want to set dummy message as last message.
62+
if not empty_stream:
63+
last_msg = msg
4564
if focus_msg is not None:
4665
model.set_focus_in_current_narrow(focus_msg)
4766
return w_list

zulipterminal/ui_tools/views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ def load_old_messages(self, anchor: int=10000000000) -> None:
5151
ids_to_keep = self.model.get_message_ids_in_current_narrow()
5252
if self.log:
5353
top_message_id = self.log[0].original_widget.message['id']
54+
# This for the dummy message
55+
if top_message_id is None:
56+
return
5457
ids_to_keep.remove(top_message_id) # update this id
5558
no_update_baseline = {top_message_id}
5659
else:

0 commit comments

Comments
 (0)