Skip to content

Commit 2b0b628

Browse files
committed
boxes/utils/view: Sets current narrow label for empty narrow.
A dummy message is used to update label for empty narrow headers which did not change before. Both streams and PM covered Fixes: zulip#259 Fixes: zulip#266
1 parent a601d9c commit 2b0b628

File tree

5 files changed

+104
-21
lines changed

5 files changed

+104
-21
lines changed

zulipterminal/core.py

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

134134
if hasattr(button, 'message'):
135135
w_list = create_msg_box_list(
136-
self.model, msg_id_list, button.message['id'])
136+
self.model, msg_id_list, button.message['id'],
137+
stream_caption=button.caption)
137138
else:
138-
w_list = create_msg_box_list(self.model, msg_id_list)
139+
w_list = create_msg_box_list(self.model, msg_id_list,
140+
stream_caption=button.caption)
139141

140142
self._finalize_show(w_list)
141143

@@ -167,6 +169,11 @@ def narrow_to_topic(self, button: Any) -> None:
167169
self._finalize_show(w_list)
168170

169171
def narrow_to_user(self, button: Any) -> None:
172+
pm_details = {
173+
'caption': button.caption,
174+
'recipient_email': button.email,
175+
'sender_id': self.model.user_id
176+
}
170177
if hasattr(button, 'message'):
171178
emails = [recipient['email']
172179
for recipient in button.message['display_recipient']
@@ -198,9 +205,11 @@ def narrow_to_user(self, button: Any) -> None:
198205

199206
if hasattr(button, 'message'):
200207
w_list = create_msg_box_list(
201-
self.model, msg_id_list, button.message['id'])
208+
self.model, msg_id_list, button.message['id'],
209+
pm_details=pm_details)
202210
else:
203-
w_list = create_msg_box_list(self.model, msg_id_list)
211+
w_list = create_msg_box_list(
212+
self.model, msg_id_list, pm_details=pm_details)
204213

205214
self._finalize_show(w_list)
206215

zulipterminal/model.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,12 @@ def append_message(self, event: Event) -> None:
492492
last_message = self.msg_list.log[-1].original_widget.message
493493
else:
494494
last_message = None
495+
# Removing the dummy message when a new message comes
496+
if self.msg_list.log:
497+
dummy_message = self.msg_list.log[0].original_widget.message
498+
if dummy_message.get('id') is None:
499+
del self.msg_list.log[0]
500+
495501
msg_w_list = create_msg_box_list(self, [response['id']],
496502
last_message=last_message)
497503
if not msg_w_list:

zulipterminal/ui_tools/boxes.py

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,14 @@ def keypress(self, size: Tuple[int, int], key: str) -> str:
117117

118118
class MessageBox(urwid.Pile):
119119
def __init__(self, message: Dict[str, Any], model: Any,
120-
last_message: Any) -> None:
120+
last_message: Any, is_empty_narrow: bool=False) -> None:
121121
self.model = model
122122
self.message = message
123123
self.caption = ''
124124
self.stream_id = None # type: Union[int, None]
125125
self.title = ''
126126
self.email = ''
127+
self.is_in_empty_narrow = is_empty_narrow
127128
self.user_id = None # type: Union[int, None]
128129
self.last_message = last_message
129130
# if this is the first message
@@ -146,6 +147,8 @@ def _time_for_message(self, message: Dict[str, Any]) -> str:
146147
return ctime(message['timestamp'])[:-8]
147148

148149
def need_recipient_header(self) -> bool:
150+
if self.is_in_empty_narrow:
151+
return True
149152
last_msg = self.last_message
150153
if self.message['type'] == 'stream':
151154
if (last_msg['type'] == 'stream' and
@@ -167,6 +170,15 @@ def need_recipient_header(self) -> bool:
167170
else:
168171
raise RuntimeError("Invalid message type")
169172

173+
def _check_if_self_PM(self) -> bool:
174+
recipient_list = self.message['display_recipient']
175+
if len(recipient_list) == 1 and \
176+
recipient_list[0]['email'] == \
177+
self.model.user_email:
178+
return True
179+
else:
180+
return False
181+
170182
def stream_header(self) -> Any:
171183
bar_color = self.model.stream_dict[self.stream_id]['color']
172184
bar_color = 's' + bar_color[:2] + bar_color[3] + bar_color[5]
@@ -180,11 +192,14 @@ def stream_header(self) -> Any:
180192
return header
181193

182194
def private_header(self) -> Any:
183-
self.recipients = ', '.join(list(
184-
recipient['full_name']
185-
for recipient in self.message['display_recipient']
186-
if recipient['email'] != self.model.user_email
187-
))
195+
if self._check_if_self_PM():
196+
self.recipients = self.message['display_recipient'][0]['full_name']
197+
else:
198+
self.recipients = ', '.join(list(
199+
recipient['full_name']
200+
for recipient in self.message['display_recipient']
201+
if recipient['email'] != self.model.user_email
202+
))
188203
title_markup = ('header', [
189204
('custom', 'Private Messages with'),
190205
('selected', ": "),
@@ -419,11 +434,14 @@ def mouse_event(self, size: Tuple[int, int], event: Any, button: Any,
419434

420435
def get_recipients(self) -> str:
421436
emails = []
422-
for recipient in self.message['display_recipient']:
423-
email = recipient['email']
424-
if email == self.model.user_email:
425-
continue
426-
emails.append(recipient['email'])
437+
if self._check_if_self_PM():
438+
emails.append(self.model.user_email)
439+
else:
440+
for recipient in self.message['display_recipient']:
441+
email = recipient['email']
442+
if email == self.model.user_email:
443+
continue
444+
emails.append(recipient['email'])
427445
return ', '.join(emails)
428446

429447
def keypress(self, size: Tuple[int, int], key: str) -> str:
@@ -458,19 +476,22 @@ def keypress(self, size: Tuple[int, int], key: str) -> str:
458476
self.model.controller.narrow_to_topic(self)
459477
elif is_command_key('GO_BACK', key):
460478
self.model.controller.show_all_messages(self)
461-
elif is_command_key('REPLY_AUTHOR', key):
479+
elif is_command_key('REPLY_AUTHOR', key) and \
480+
not self.is_in_empty_narrow:
462481
self.model.controller.view.write_box.private_box_view(
463482
email=self.message['sender_email']
464483
)
465-
elif is_command_key('MENTION_REPLY', key):
484+
elif is_command_key('MENTION_REPLY', key) and \
485+
not self.is_in_empty_narrow:
466486
self.keypress(size, 'enter')
467487
mention = '@**' + self.message['sender_full_name'] + '** '
468488
self.model.controller.view.write_box.msg_write_box.set_edit_text(
469489
mention)
470490
self.model.controller.view.write_box.msg_write_box.set_edit_pos(
471491
len(mention))
472492
self.model.controller.view.middle_column.set_focus('footer')
473-
elif is_command_key('QUOTE_REPLY', key):
493+
elif is_command_key('QUOTE_REPLY', key) and \
494+
not self.is_in_empty_narrow:
474495
self.keypress(size, 'enter')
475496
quote = '```quote\n' + self.message['content'] + '\n```\n'
476497
self.model.controller.view.write_box.msg_write_box.set_edit_text(

zulipterminal/ui_tools/utils.py

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
from typing import Any, Iterable, List, Union, Dict
22

33
import urwid
4+
import time
45

56
from zulipterminal.ui_tools.boxes import MessageBox
67

78

89
def create_msg_box_list(model: Any, messages: Union[None, Iterable[Any]]=None,
910
focus_msg_id: Union[None, int]=None,
10-
last_message: Union[None, Any]=None) -> List[Any]:
11+
last_message: Union[None, Any]=None,
12+
stream_caption: Any=None,
13+
pm_details: Any=None) -> List[Any]:
1114
"""
1215
MessageBox for every message displayed is created here.
1316
"""
@@ -18,8 +21,47 @@ def create_msg_box_list(model: Any, messages: Union[None, Iterable[Any]]=None,
1821
message_list.sort(key=lambda msg: msg['timestamp'])
1922
w_list = []
2023
focus_msg = None
24+
is_empty_narrow = False
2125
last_msg = last_message
2226
muted_msgs = 0 # No of messages that are muted.
27+
if last_msg is not None and last_msg['id'] is None:
28+
last_message = None
29+
# We create a dummy message to show in narrows with
30+
# no previous messages, whose author is welcome bot.
31+
if (message_list == [] and (stream_caption is not None or
32+
pm_details is not None)):
33+
msg = {}
34+
if stream_caption is not None:
35+
msg.update({
36+
'type': 'stream',
37+
'display_recipient': stream_caption,
38+
'stream_id': model.stream_id,
39+
'subject': model.stream_dict[model.stream_id]['description'],
40+
})
41+
elif pm_details is not None:
42+
msg.update({
43+
'type': 'private',
44+
'display_recipient': [{'full_name': pm_details['caption'],
45+
'email': pm_details['recipient_email'],
46+
'id': None}],
47+
'sender_id': pm_details['sender_id'],
48+
})
49+
msg.update({
50+
'content': "<p> There are no messages in this stream. </p>",
51+
'client': 'Internal',
52+
'sender_full_name': 'Welcome Bot',
53+
'sender_short_name': 'welcome-bot',
54+
'content_type': 'text/html',
55+
'sender_email': '[email protected]',
56+
'sender_realm_str': 'zulip',
57+
'timestamp': int(time.time()),
58+
'id': None,
59+
'reactions': [],
60+
'flags': ['read']
61+
})
62+
message_list.append(msg)
63+
is_empty_narrow = True
64+
2365
for msg in message_list:
2466
# Remove messages of muted topics / streams.
2567
if is_muted(msg, model):
@@ -37,11 +79,13 @@ def create_msg_box_list(model: Any, messages: Union[None, Iterable[Any]]=None,
3779
if msg['id'] == focus_msg_id:
3880
focus_msg = message_list.index(msg) - muted_msgs
3981
w_list.append(urwid.AttrMap(
40-
MessageBox(msg, model, last_msg),
82+
MessageBox(msg, model, last_msg, is_empty_narrow),
4183
msg_flag,
4284
'msg_selected'
4385
))
44-
last_msg = msg
86+
# We don't want to set dummy message as last message.
87+
if not is_empty_narrow:
88+
last_msg = msg
4589
if focus_msg is not None:
4690
model.set_focus_in_current_narrow(focus_msg)
4791
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)