Skip to content

Commit fc9ca2f

Browse files
committed
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 629bab6 commit fc9ca2f

File tree

5 files changed

+77
-11
lines changed

5 files changed

+77
-11
lines changed

zulipterminal/core.py

Lines changed: 13 additions & 4 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_caption=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_caption=button.caption)
138140

139141
self._finalize_show(w_list)
140142

@@ -166,6 +168,11 @@ def narrow_to_topic(self, button: Any) -> None:
166168
self._finalize_show(w_list)
167169

168170
def narrow_to_user(self, button: Any) -> None:
171+
pm_details = {
172+
'caption': button.caption,
173+
'recipient_email': button.email,
174+
'sender_id': self.model.user_id
175+
}
169176
if hasattr(button, 'message'):
170177
emails = [recipient['email']
171178
for recipient in button.message['display_recipient']
@@ -197,9 +204,11 @@ def narrow_to_user(self, button: Any) -> None:
197204

198205
if hasattr(button, 'message'):
199206
w_list = create_msg_box_list(
200-
self.model, msg_id_list, button.message['id'])
207+
self.model, msg_id_list, button.message['id'],
208+
pm_details=pm_details)
201209
else:
202-
w_list = create_msg_box_list(self.model, msg_id_list)
210+
w_list = create_msg_box_list(
211+
self.model, msg_id_list, pm_details=pm_details)
203212

204213
self._finalize_show(w_list)
205214

zulipterminal/model.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,10 @@ def append_message(self, event: Event) -> None:
457457
last_message = self.msg_list.log[-1].original_widget.message
458458
else:
459459
last_message = None
460+
461+
# Removing the dummy message when a new message comes
462+
if(self.msg_list.log[0].original_widget.message['id'] is None):
463+
del self.msg_list.log[0]
460464
msg_w_list = create_msg_box_list(self, [response['id']],
461465
last_message=last_message)
462466
if not msg_w_list:

zulipterminal/ui_tools/boxes.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,14 @@ 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, is_empty_narrow: 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+
self.is_in_empty_narrow = is_empty_narrow
130131
self.user_id = None # type: Union[int, None]
131132
self.last_message = last_message
132133
# if this is the first message
@@ -149,6 +150,8 @@ def _time_for_message(self, message: Dict[str, Any]) -> str:
149150
return ctime(message['timestamp'])[:-8]
150151

151152
def need_recipient_header(self) -> bool:
153+
if self.is_in_empty_narrow:
154+
return True
152155
last_msg = self.last_message
153156
if self.message['type'] == 'stream':
154157
if (last_msg['type'] == 'stream' and
@@ -461,19 +464,22 @@ def keypress(self, size: Tuple[int, int], key: str) -> str:
461464
self.model.controller.narrow_to_topic(self)
462465
elif is_command_key('GO_BACK', key):
463466
self.model.controller.show_all_messages(self)
464-
elif is_command_key('REPLY_AUTHOR', key):
467+
elif (is_command_key('REPLY_AUTHOR', key) and
468+
not self.is_in_empty_narrow):
465469
self.model.controller.view.write_box.private_box_view(
466470
email=self.message['sender_email']
467471
)
468-
elif is_command_key('MENTION_REPLY', key):
472+
elif (is_command_key('MENTION_REPLY', key) and
473+
not self.is_in_empty_narrow):
469474
self.keypress(size, 'enter')
470475
mention = '@**' + self.message['sender_full_name'] + '** '
471476
self.model.controller.view.write_box.msg_write_box.set_edit_text(
472477
mention)
473478
self.model.controller.view.write_box.msg_write_box.set_edit_pos(
474479
len(mention))
475480
self.model.controller.view.middle_column.set_focus('footer')
476-
elif is_command_key('QUOTE_REPLY', key):
481+
elif (is_command_key('QUOTE_REPLY', key) and
482+
not self.is_in_empty_narrow):
477483
self.keypress(size, 'enter')
478484
quote = '```quote\n' + self.message['content'] + '\n```\n'
479485
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)