Improve the performance of the userlist refresh

Also only run one regex on search_for_color()
This commit is contained in:
mathieui 2015-06-22 00:54:43 +02:00
parent 0627a85483
commit 79644da690
No known key found for this signature in database
GPG key ID: C59F84CEEFD616E3
2 changed files with 32 additions and 13 deletions

View file

@ -10,12 +10,12 @@ user list, and updates private tabs when necessary.
import logging
log = logging.getLogger(__name__)
import bisect
import curses
import os
import random
import re
from datetime import datetime
from functools import reduce
from . import ChatTab, Tab
@ -1089,7 +1089,7 @@ class MucTab(ChatTab):
and typ != "unavailable"):
new_user = User(from_nick, affiliation, show,
status, role, jid, deterministic, color)
self.users.append(new_user)
bisect.insort_left(self.users, new_user)
self.core.events.trigger('muc_join', presence, self)
if '110' in status_codes or self.own_nick == from_nick:
# second part of the condition is a workaround for old
@ -1200,7 +1200,7 @@ class MucTab(ChatTab):
affiliation, role, show, status)
if self.core.current_tab() is self:
self.text_win.refresh()
self.user_win.refresh(self.users)
self.user_win.refresh_if_changed(self.users)
self.info_header.refresh(self, self.text_win)
self.input.refresh()
self.core.doupdate()
@ -1230,7 +1230,7 @@ class MucTab(ChatTab):
deterministic = config.get_by_tabname('deterministic_nick_colors', self.name)
user = User(from_nick, affiliation,
show, status, role, jid, deterministic, color)
self.users.append(user)
bisect.insort_left(self.users, user)
hide_exit_join = config.get_by_tabname('hide_exit_join',
self.general_jid)
if hide_exit_join != 0:
@ -1277,6 +1277,8 @@ class MucTab(ChatTab):
self.name)
user.change_color(color, deterministic)
user.change_nick(new_nick)
self.users.remove(user)
bisect.insort_left(self.users, user)
if config.get_by_tabname('display_user_color_in_join_part',
self.general_jid):
@ -1698,8 +1700,7 @@ class MucTab(ChatTab):
return color
nick_color_aliases = config.get_by_tabname('nick_color_aliases', self.name)
if nick_color_aliases:
nick_alias = re.sub('^_*', '', nick)
nick_alias = re.sub('_*$', '', nick_alias)
nick_alias = re.sub('^_*(.*?)_*$', '\\1', nick)
color = config.get_by_tabname(nick_alias, 'muc_colors')
return color

View file

@ -13,10 +13,17 @@ import poopt
from config import config
from theming import to_curses_attr, get_theme
def userlist_to_cache(userlist):
result = []
for user in userlist:
result.append((user.nick, user.status, user.chatstate, user.affiliation, user.role))
return result
class UserList(Win):
def __init__(self):
Win.__init__(self)
self.pos = 0
self.cache = []
def scroll_up(self):
self.pos += self.height-1
@ -32,25 +39,36 @@ class UserList(Win):
def draw_plus(self, y):
self.addstr(y, self.width-2, '++', to_curses_attr(get_theme().COLOR_MORE_INDICATOR))
def refresh_if_changed(self, users):
old = self.cache
new = userlist_to_cache(users[self.pos:self.pos+self.height])
if len(old) != len(new):
self.cache = new
self.refresh(users)
return
for i in range(len(old)):
if old[i] != new[i]:
self.cache = new
self.refresh(users)
def refresh(self, users):
log.debug('Refresh: %s', self.__class__.__name__)
if config.get('hide_user_list'):
return # do not refresh if this win is hidden.
if len(users) < self.height:
self.pos = 0
elif self.pos >= len(users) - self.height and self.pos != 0:
self.pos = len(users) - self.height
self._win.erase()
asc_sort = (config.get('user_list_sort').lower() == 'asc')
if asc_sort:
y, x = self._win.getmaxyx()
y -= 1
users = sorted(users)
else:
y = 0
users = sorted(users)
if len(users) < self.height:
self.pos = 0
elif self.pos >= len(users) - self.height and self.pos != 0:
self.pos = len(users) - self.height
for user in users[self.pos:]:
for user in users[self.pos:self.pos+self.height]:
self.draw_role_affiliation(y, user)
self.draw_status_chatstate(y, user)
self.addstr(y, 2,