Skip to content

Commit e60debb

Browse files
committed
buttons/core/views: Pass message info data to spoiler classes.
This commit: * Pass message info data to SpoilerButton and show_spoiler method. * Pass message info data to SpoilerView and return to message info view popup upon `Esc` and `Enter`. * Extract spoiler buttons processing to a create_spoiler_buttons. Tests amended.
1 parent 2b4f57f commit e60debb

File tree

5 files changed

+148
-16
lines changed

5 files changed

+148
-16
lines changed

tests/ui_tools/test_buttons.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,34 @@ def spoiler_button(
321321
header_len: int = 0,
322322
header: List[Any] = [""],
323323
content: List[Any] = [""],
324+
message: Message = {},
325+
topic_links: Dict[str, Tuple[str, int, bool]] = {},
326+
message_links: Dict[str, Tuple[str, int, bool]] = {},
327+
time_mentions: List[Tuple[str, str]] = [],
328+
spoilers: List[Tuple[int, List[Any], List[Any]]] = [],
324329
display_attr: Optional[str] = None,
325330
) -> SpoilerButton:
326331
self.content = content
327332
self.header_len = header_len
328333
self.header = header
334+
self.message = message
335+
self.topic_links = topic_links
336+
self.message_links = message_links
337+
self.time_mentions = time_mentions
338+
self.spoilers = spoilers
329339
self.display_attr = display_attr
330-
return SpoilerButton(self.controller, header_len, header, content, display_attr)
340+
return SpoilerButton(
341+
self.controller,
342+
header_len,
343+
header,
344+
content,
345+
message,
346+
topic_links,
347+
message_links,
348+
time_mentions,
349+
spoilers,
350+
display_attr,
351+
)
331352

332353
def test_init(self, mocker: MockerFixture) -> None:
333354
self.update_widget = mocker.patch(MODULE + ".SpoilerButton.update_widget")
@@ -374,7 +395,12 @@ def test_show_spoiler(self) -> None:
374395
mocked_button.show_spoiler()
375396

376397
mocked_button.controller.show_spoiler.assert_called_once_with(
377-
mocked_button.content
398+
mocked_button.content,
399+
mocked_button.message,
400+
mocked_button.topic_links,
401+
mocked_button.message_links,
402+
mocked_button.time_mentions,
403+
mocked_button.spoilers,
378404
)
379405

380406

tests/ui_tools/test_popups.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -970,7 +970,17 @@ def mock_external_classes(self, mocker: MockerFixture) -> None:
970970
self.controller, "maximum_popup_dimensions", return_value=(64, 64)
971971
)
972972
mocker.patch(MODULE + ".urwid.SimpleFocusListWalker", return_value=[])
973-
self.spoiler_view = SpoilerView(self.controller, "Spoiler View", "")
973+
self.message = Message(id=1)
974+
self.spoiler_view = SpoilerView(
975+
self.controller,
976+
"Spoiler View",
977+
"",
978+
self.message,
979+
OrderedDict(),
980+
OrderedDict(),
981+
list(),
982+
list(),
983+
)
974984

975985
def test_keypress_any_key(
976986
self, widget_size: Callable[[Widget], urwid_Size]
@@ -986,7 +996,13 @@ def test_keypress_exit_popup(
986996
) -> None:
987997
size = widget_size(self.spoiler_view)
988998
self.spoiler_view.keypress(size, key)
989-
assert self.controller.exit_popup.called
999+
self.controller.show_msg_info.assert_called_once_with(
1000+
msg=self.message,
1001+
topic_links=OrderedDict(),
1002+
message_links=OrderedDict(),
1003+
time_mentions=list(),
1004+
spoilers=list(),
1005+
)
9901006

9911007
def test_keypress_navigation(
9921008
self,

zulipterminal/core.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -490,9 +490,27 @@ def report_warning(
490490
"""
491491
self.view.set_footer_text(text, "task:warning", duration)
492492

493-
def show_spoiler(self, content: str) -> None:
493+
def show_spoiler(
494+
self,
495+
content: str,
496+
message: Message,
497+
topic_links: Dict[str, Tuple[str, int, bool]],
498+
message_links: Dict[str, Tuple[str, int, bool]],
499+
time_mentions: List[Tuple[str, str]],
500+
spoilers: List[Tuple[int, List[Any], List[Any]]],
501+
) -> None:
494502
self.show_pop_up(
495-
SpoilerView(self, "Spoiler (up/down scrolls)", content), "area:msg"
503+
SpoilerView(
504+
self,
505+
"Spoiler (up/down scrolls)",
506+
content,
507+
message,
508+
topic_links,
509+
message_links,
510+
time_mentions,
511+
spoilers,
512+
),
513+
"area:msg",
496514
)
497515

498516
def show_media_confirmation_popup(

zulipterminal/ui_tools/buttons.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,10 +324,20 @@ def __init__(
324324
header_len: int,
325325
header: List[Any],
326326
content: List[Any],
327+
message: Message,
328+
topic_links: Dict[str, Tuple[str, int, bool]],
329+
message_links: Dict[str, Tuple[str, int, bool]],
330+
time_mentions: List[Tuple[str, str]],
331+
spoilers: List[Tuple[int, List[Any], List[Any]]],
327332
display_attr: Optional[str],
328333
) -> None:
329334
self.controller = controller
330335
self.content = content
336+
self.message = message
337+
self.topic_links = topic_links
338+
self.message_links = message_links
339+
self.time_mentions = time_mentions
340+
self.spoilers = spoilers
331341

332342
super().__init__("")
333343
self.update_widget(header_len, header, display_attr)
@@ -344,7 +354,14 @@ def update_widget(
344354
self._w = urwid.AttrMap(icon, display_attr, focus_map="selected")
345355

346356
def show_spoiler(self, *_: Any) -> None:
347-
self.controller.show_spoiler(self.content)
357+
self.controller.show_spoiler(
358+
self.content,
359+
self.message,
360+
self.topic_links,
361+
self.message_links,
362+
self.time_mentions,
363+
self.spoilers,
364+
)
348365

349366

350367
class TopicButton(TopButton):

zulipterminal/ui_tools/views.py

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,12 +1078,39 @@ def __init__(
10781078

10791079

10801080
class SpoilerView(PopUpView):
1081-
def __init__(self, controller: Any, title: str, content: str) -> None:
1081+
def __init__(
1082+
self,
1083+
controller: Any,
1084+
title: str,
1085+
content: str,
1086+
message: Message,
1087+
topic_links: Dict[str, Tuple[str, int, bool]],
1088+
message_links: Dict[str, Tuple[str, int, bool]],
1089+
time_mentions: List[Tuple[str, str]],
1090+
spoilers: List[Tuple[int, List[Any], List[Any]]],
1091+
) -> None:
1092+
self.message = message
1093+
self.topic_links = topic_links
1094+
self.message_links = message_links
1095+
self.time_mentions = time_mentions
1096+
self.spoilers = spoilers
10821097
width, _ = controller.maximum_popup_dimensions()
10831098
widget = [urwid.Text(content)]
10841099

10851100
super().__init__(controller, widget, "MSG_INFO", width, title)
10861101

1102+
def keypress(self, size: urwid_Size, key: str) -> str:
1103+
if is_command_key("EXIT_POPUP", key) or is_command_key("ACTIVATE_BUTTON", key):
1104+
self.controller.show_msg_info(
1105+
msg=self.message,
1106+
topic_links=self.topic_links,
1107+
message_links=self.message_links,
1108+
time_mentions=self.time_mentions,
1109+
spoilers=self.spoilers,
1110+
)
1111+
return key
1112+
return super().keypress(size, key)
1113+
10871114

10881115
class AboutView(PopUpView):
10891116
def __init__(
@@ -1703,14 +1730,9 @@ def __init__(
17031730
popup_width = max(popup_width, topic_link_width)
17041731

17051732
if spoilers:
1706-
spoiler_buttons = []
1707-
spoiler_width = 0
1708-
for index, (header_len, header, content) in enumerate(spoilers):
1709-
spoiler_width = max(header_len, spoiler_width)
1710-
display_attr = None if index % 2 else "popup_contrast"
1711-
spoiler_buttons.append(
1712-
SpoilerButton(controller, header_len, header, content, display_attr)
1713-
)
1733+
spoiler_buttons, spoiler_width = self.create_spoiler_buttons(
1734+
controller, spoilers
1735+
)
17141736

17151737
# slice_index = Number of labels before message links + 1 newline
17161738
# + 1 'Spoilers' category label.
@@ -1751,6 +1773,39 @@ def create_link_buttons(
17511773

17521774
return link_widgets, link_width
17531775

1776+
def create_spoiler_buttons(
1777+
self, controller: Any, spoilers: List[Tuple[int, List[Any], List[Any]]]
1778+
) -> Tuple[List[SpoilerButton], int]:
1779+
spoiler_buttons = []
1780+
spoiler_width = 0
1781+
1782+
for index, (header_len, header, content) in enumerate(spoilers):
1783+
spoiler_width = max(header_len, spoiler_width)
1784+
1785+
display_attr = None if index % 2 else "popup_contrast"
1786+
1787+
processed_header = [f"{index+1}: "] + header
1788+
processed_header_len = sum(
1789+
len(part[1]) if isinstance(part, tuple) else len(part)
1790+
for part in processed_header
1791+
)
1792+
1793+
spoiler_buttons.append(
1794+
SpoilerButton(
1795+
controller,
1796+
processed_header_len,
1797+
processed_header,
1798+
header + ["\n\n"] + content,
1799+
self.msg,
1800+
self.topic_links,
1801+
self.message_links,
1802+
self.time_mentions,
1803+
self.spoilers,
1804+
display_attr,
1805+
)
1806+
)
1807+
return spoiler_buttons, spoiler_width
1808+
17541809
def keypress(self, size: urwid_Size, key: str) -> str:
17551810
if is_command_key("EDIT_HISTORY", key) and self.show_edit_history_label:
17561811
self.controller.show_edit_history(

0 commit comments

Comments
 (0)