primitivus (chat): fixed nick completion. Completion is now managed per widget, if completion method exists
This commit is contained in:
parent
04515e5013
commit
22d70f23c4
2 changed files with 34 additions and 27 deletions
|
|
@ -156,6 +156,10 @@ class OccupantWidget(urwid.WidgetWrap):
|
|||
def parent(self):
|
||||
return self.mess_data.parent
|
||||
|
||||
@property
|
||||
def nick(self):
|
||||
return self.occupant_data.nick
|
||||
|
||||
def selectable(self):
|
||||
return True
|
||||
|
||||
|
|
@ -253,6 +257,29 @@ class Chat(PrimitivusWidget, quick_chat.QuickChat):
|
|||
|
||||
return super(Chat, self).keypress(size, key)
|
||||
|
||||
def completion(self, text, completion_data):
|
||||
"""Completion method which complete nicknames in group chat
|
||||
|
||||
for params, see [sat_widgets.AdvancedEdit]
|
||||
"""
|
||||
if self.type != C.CHAT_GROUP:
|
||||
return text
|
||||
|
||||
space = text.rfind(" ")
|
||||
start = text[space + 1:]
|
||||
words = [w.nick for w in self.occupants_walker if isinstance(w, OccupantWidget) and w.nick.startswith(start)]
|
||||
if not words:
|
||||
return text
|
||||
try:
|
||||
word_idx = words.index(completion_data['last_word']) + 1
|
||||
except (KeyError, ValueError):
|
||||
word_idx = 0
|
||||
else:
|
||||
if word_idx == len(words):
|
||||
word_idx = 0
|
||||
word = completion_data['last_word'] = words[word_idx]
|
||||
return u"{}{}{}".format(text[:space + 1], word, ': ' if space < 0 else '')
|
||||
|
||||
def getMenu(self):
|
||||
"""Return Menu bar"""
|
||||
menu = sat_widgets.Menu(self.host.loop)
|
||||
|
|
|
|||
|
|
@ -64,36 +64,16 @@ class EditBar(sat_widgets.ModalEdit):
|
|||
|
||||
def _text_completion(self, text, completion_data, mode):
|
||||
if mode == C.MODE_INSERTION:
|
||||
return self._nick_completion(text, completion_data)
|
||||
if self.host.selected_widget is not None:
|
||||
try:
|
||||
completion = self.host.selected_widget.completion
|
||||
except AttributeError:
|
||||
return text
|
||||
else:
|
||||
return completion(text, completion_data)
|
||||
else:
|
||||
return text
|
||||
|
||||
def _nick_completion(self, text, completion_data):
|
||||
"""Completion method which complete pseudo in group chat
|
||||
for params, see AdvancedEdit"""
|
||||
nicks = []
|
||||
for profile, clist in self.host.contact_lists.iteritems():
|
||||
for contact in clist.selected:
|
||||
chat = self.host.widgets.getWidget(quick_chat.QuickChat, contact, profile)
|
||||
if chat.type != C.CHAT_GROUP:
|
||||
continue
|
||||
space = text.rfind(" ")
|
||||
start = text[space + 1:]
|
||||
nicks.extend(list(chat.occupants))
|
||||
if nicks:
|
||||
nicks.sort()
|
||||
try:
|
||||
start_idx = nicks.index(completion_data['last_nick']) + 1
|
||||
if start_idx == len(nicks):
|
||||
start_idx = 0
|
||||
except (KeyError, ValueError):
|
||||
start_idx = 0
|
||||
for idx in range(start_idx, len(nicks)) + range(0, start_idx):
|
||||
if nicks[idx].lower().startswith(start.lower()):
|
||||
completion_data['last_nick'] = nicks[idx]
|
||||
return text[:space + 1] + nicks[idx] + (': ' if space < 0 else '')
|
||||
return text
|
||||
|
||||
def onTextEntered(self, editBar):
|
||||
"""Called when text is entered in the main edit bar"""
|
||||
if self.mode == C.MODE_INSERTION:
|
||||
|
|
|
|||
Loading…
Reference in a new issue