Skip to content

Commit c368490

Browse files
Fix some render errors (Caused by Loading components) and optimize workspace switching
1 parent 577dec7 commit c368490

File tree

3 files changed

+57
-15
lines changed

3 files changed

+57
-15
lines changed

app.py

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ def switch_to_workspace(self, workspace_number):
106106
loop.create_task(self.animate_loading())
107107
loop.create_task(self.component_did_mount())
108108

109+
@property
110+
def is_chatbox_rendered(self):
111+
return not self._loading and self.chatbox and type(self.chatbox) is ChatBox
112+
109113
@property
110114
def sidebar(self):
111115
return self.columns.contents[0][0].original_widget
@@ -578,13 +582,13 @@ def scroll_messages(self, *args):
578582

579583
@asyncio.coroutine
580584
def mark_read_slack(self, index):
581-
if not self.chatbox.body or not self.chatbox.body.body:
585+
if not self.is_chatbox_rendered:
582586
return
583587

584588
if index is None or index == -1:
585589
index = len(self.chatbox.body.body) - 1
586590

587-
if self.chatbox.body.body and self.chatbox.body.body and len(self.chatbox.body.body) > index:
591+
if len(self.chatbox.body.body) > index:
588592
message = self.chatbox.body.body[index]
589593

590594
# Only apply for message
@@ -616,11 +620,12 @@ def _go_to_channel(self, channel_id):
616620
messages = self.render_messages(self.store.state.messages, channel_id=channel_id)
617621

618622
header = self.render_chatbox_header()
619-
self.chatbox.body.body[:] = messages
620-
self.chatbox.header = header
621-
self.chatbox.message_box.is_read_only = self.store.state.channel.get('is_read_only', False)
622-
self.sidebar.select_channel(channel_id)
623-
self.urwid_loop.set_alarm_in(0, self.scroll_messages)
623+
if self.is_chatbox_rendered:
624+
self.chatbox.body.body[:] = messages
625+
self.chatbox.header = header
626+
self.chatbox.message_box.is_read_only = self.store.state.channel.get('is_read_only', False)
627+
self.sidebar.select_channel(channel_id)
628+
self.urwid_loop.set_alarm_in(0, self.scroll_messages)
624629

625630
if len(self.store.state.messages) == 0:
626631
self.go_to_sidebar()
@@ -694,7 +699,7 @@ def start_real_time(self):
694699

695700
def stop_typing(*args):
696701
# Prevent error while switching workspace
697-
if self.chatbox is not None:
702+
if self.is_chatbox_rendered:
698703
self.chatbox.message_box.typing = None
699704

700705
alarm = None
@@ -725,6 +730,9 @@ def stop_typing(*args):
725730
)
726731

727732
if event.get('channel') == self.store.state.channel['id']:
733+
if not self.is_chatbox_rendered:
734+
return
735+
728736
if event.get('subtype') == 'message_deleted':
729737
for widget in self.chatbox.body.body:
730738
if hasattr(widget, 'ts') and getattr(widget, 'ts') == event['deleted_ts']:
@@ -741,6 +749,9 @@ def stop_typing(*args):
741749
else:
742750
pass
743751
elif event['type'] == 'user_typing':
752+
if not self.is_chatbox_rendered:
753+
return
754+
744755
if event.get('channel') == self.store.state.channel['id']:
745756
user = self.store.find_user_by_id(event['user'])
746757
name = user.get('display_name') or user.get('real_name') or user['name']
@@ -755,6 +766,9 @@ def stop_typing(*args):
755766
self.store.is_snoozed = event['dnd_status']['snooze_enabled']
756767
self.sidebar.profile.set_snooze(self.store.is_snoozed)
757768
elif event.get('ok', False):
769+
if not self.is_chatbox_rendered:
770+
return
771+
758772
# Message was sent, Slack confirmed it.
759773
self.chatbox.body.body.extend(self.render_messages([{
760774
'text': event['text'],
@@ -841,11 +855,18 @@ def unhandled_input(self, key):
841855
elif key == keymap['open_quick_switcher']:
842856
return self.open_quick_switcher()
843857
elif key in ('1', '2', '3', '4', '5', '6', '7', '8', '9') and len(self.workspaces) >= int(key):
844-
if self.workspaces_line is not None:
845-
self.workspaces_line.select(int(key))
846-
# Stop rtm to switch workspace
847-
self.real_time_task.cancel()
848-
return self.switch_to_workspace(int(key))
858+
# Loading or only 1 workspace
859+
if self._loading or self.workspaces_line is None:
860+
return
861+
862+
# Workspace is selected
863+
if selected_workspace - 1 == self.workspaces_line.selected:
864+
return
865+
866+
self.workspaces_line.select(selected_workspace)
867+
# Stop rtm to switch workspace
868+
self.real_time_task.cancel()
869+
return self.switch_to_workspace(selected_workspace)
849870
elif key == keymap['set_snooze']:
850871
return self.open_set_snooze()
851872

sclack/components.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,17 +1053,24 @@ def __init__(self, workspaces):
10531053
workspace = Workspace(index + 1, name)
10541054
urwid.connect_signal(workspace, 'select_workspace', self.switch_workspace)
10551055
body.append(('pack', workspace))
1056+
self.selected = 0
10561057
self.body = body
10571058
self.body[0][1].select()
10581059
super(Workspaces, self).__init__(urwid.Columns(body), 'workspace_line')
10591060

10601061
def select(self, number):
10611062
for workspace in self.body:
10621063
workspace[1].deselect()
1064+
10631065
if number > 1:
10641066
self.body[number - 2][1].select_as_previous()
1067+
10651068
self.body[number - 1][1].select()
1069+
new_selected = number - 1
1070+
1071+
self.selected = new_selected
10661072

10671073
def switch_workspace(self, number):
1068-
self.select(number)
1069-
urwid.emit_signal(self, 'switch_workspace', number)
1074+
if number - 1 != self.selected:
1075+
self.select(number)
1076+
urwid.emit_signal(self, 'switch_workspace', number)

sclack/loading.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def status_message(self):
6060
def status_message(self, value):
6161
self._status_message.set_text(value)
6262

63+
6364
class LoadingSideBar(urwid.Frame):
6465
def __init__(self):
6566
header = TextDivider(placeholder(size=12))
@@ -71,6 +72,19 @@ def __init__(self):
7172
for size in [5, 7, 19, 8, 0, 3, 22, 14, 11, 13]])
7273
super(LoadingSideBar, self).__init__(body, header=header, footer=divider)
7374

75+
def update_items(self, event):
76+
pass
77+
78+
def get_all_channels(self):
79+
return []
80+
81+
def get_all_groups(self):
82+
return []
83+
84+
def get_all_dms(self):
85+
return []
86+
87+
7488
class SlackBot(urwid.Pile):
7589
_matrix = [
7690
[(' \uE0BA', 'white', 'h69'), (' ', 'white', 'white'), ('\uE0B8 ', 'white', 'h200')],

0 commit comments

Comments
 (0)