Use namedtuples instead of dict, this should GREATELY lower the memory footprint
This commit is contained in:
parent
2d81b7407b
commit
dca88cadbd
3 changed files with 31 additions and 36 deletions
16
src/room.py
16
src/room.py
|
@ -14,7 +14,7 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with Poezio. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from text_buffer import TextBuffer
|
||||
from text_buffer import TextBuffer, Message
|
||||
from datetime import datetime
|
||||
from random import randrange
|
||||
from config import config
|
||||
|
@ -111,18 +111,10 @@ class Room(TextBuffer):
|
|||
color = self.do_highlight(txt, time, nickname)
|
||||
if time: # History messages are colored to be distinguished
|
||||
color = theme.COLOR_INFORMATION_TEXT
|
||||
time = time if time is not None else datetime.now()
|
||||
time = time or datetime.now()
|
||||
nick_color = nick_color or user.color if user else None
|
||||
message = {'txt': txt, 'colorized':colorized,
|
||||
'time':time}
|
||||
if nickname:
|
||||
message['nickname'] = nickname
|
||||
if nick_color:
|
||||
message['nick_color'] = nick_color
|
||||
if color:
|
||||
message['color'] = color
|
||||
if user:
|
||||
message['user'] = user
|
||||
message = Message(txt=txt, colorized=colorized, nick_color=nick_color,
|
||||
time=time, nickname=nickname, color=color, user=user)
|
||||
# message = Message(txt, time, nickname, nick_color, color, colorized, user=user)
|
||||
while len(self.messages) > self.messages_nb_limit:
|
||||
self.messages.pop(0)
|
||||
|
|
|
@ -21,10 +21,14 @@ Define the TextBuffer class
|
|||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
import collections
|
||||
|
||||
from datetime import datetime
|
||||
import theme
|
||||
from config import config
|
||||
|
||||
Message = collections.namedtuple('Message', 'txt colorized nick_color time nickname color user')
|
||||
|
||||
class TextBuffer(object):
|
||||
"""
|
||||
This class just keep trace of messages, in a list with various
|
||||
|
@ -43,14 +47,8 @@ class TextBuffer(object):
|
|||
def add_message(self, txt, time=None, nickname=None, colorized=False, nick_color=None):
|
||||
color = theme.COLOR_NORMAL_TEXT if nickname is not None else theme.COLOR_INFORMATION_TEXT
|
||||
nick_color = nick_color
|
||||
msg = {'txt': txt, 'colorized':colorized,
|
||||
'time':time or datetime.now()}
|
||||
if nickname:
|
||||
msg['nickname'] = nickname
|
||||
if nick_color:
|
||||
msg['nick_color'] = nick_color
|
||||
if color:
|
||||
msg['color'] = color
|
||||
msg = Message(txt=txt, colorized=colorized, nick_color=nick_color,
|
||||
time=time or datetime.now(), nickname=nickname, color=color, user=None)
|
||||
self.messages.append(msg)
|
||||
while len(self.messages) > self.messages_nb_limit:
|
||||
self.messages.pop(0)
|
||||
|
|
|
@ -48,6 +48,9 @@ import theme
|
|||
import common
|
||||
import wcwidth
|
||||
import singleton
|
||||
import collections
|
||||
|
||||
Line = collections.namedtuple('Line', 'text colorized text_offset text_color nickname_color time nickname')
|
||||
|
||||
g_lock = Lock()
|
||||
|
||||
|
@ -515,14 +518,14 @@ class TextWin(Win):
|
|||
if message is None: # line separator
|
||||
self.built_lines.append(None)
|
||||
return 0
|
||||
txt = message.get('txt')
|
||||
txt = message.txt
|
||||
if not txt:
|
||||
return 0
|
||||
else:
|
||||
txt = txt.replace('\t', ' ')
|
||||
# length of the time
|
||||
offset = 9+len(theme.CHAR_TIME_LEFT[:1])+len(theme.CHAR_TIME_RIGHT[:1])
|
||||
nickname = message.get('nickname')
|
||||
nickname = message.nickname
|
||||
if nickname and len(nickname) >= 25:
|
||||
nick = nickname[:25]+'…'
|
||||
else:
|
||||
|
@ -533,18 +536,20 @@ class TextWin(Win):
|
|||
nb = 0
|
||||
while txt != '':
|
||||
(txt, cutted_txt) = cut_text(txt, self.width-offset-1)
|
||||
l = {'colorized': message.get('colorized'),
|
||||
'text_offset':offset,
|
||||
'text_color':message.get('color'),
|
||||
'text': cutted_txt
|
||||
}
|
||||
color = message.get('user').color if message.get('user') else message.get('nick_color')
|
||||
if first and color:
|
||||
l['nickname_color'] = color
|
||||
if first:
|
||||
l['time'] = message.get('time').strftime("%H:%M:%S")
|
||||
l['nickname'] = nick
|
||||
self.built_lines.append(l)
|
||||
color = message.user.color if message.user else message.nick_color
|
||||
else:
|
||||
color = None
|
||||
if first:
|
||||
time = message.time.strftime("%H:%M:%S")
|
||||
nickname = nick
|
||||
else:
|
||||
time = None
|
||||
nickname = None
|
||||
self.built_lines.append(Line(text=cutted_txt, colorized=message.colorized,
|
||||
text_offset=offset, text_color=message.color,
|
||||
nickname_color=color, time=time,
|
||||
nickname=nickname))
|
||||
nb += 1
|
||||
first = False
|
||||
while len(self.built_lines) > self.lines_nb_limit:
|
||||
|
@ -569,9 +574,9 @@ class TextWin(Win):
|
|||
if line is None:
|
||||
self.write_line_separator()
|
||||
else:
|
||||
self.write_time(line.get('time'))
|
||||
self.write_nickname(line.get('nickname'), line.get('nickname_color'))
|
||||
self.write_text(y, line.get('text_offset'), line.get('text'), line.get('text_color'), line.get('colorized'))
|
||||
self.write_time(line.time)
|
||||
self.write_nickname(line.nickname, line.nickname_color)
|
||||
self.write_text(y, line.text_offset, line.text, line.text_color, line.colorized)
|
||||
if y != self.height-1:
|
||||
self.addstr('\n')
|
||||
self._refresh()
|
||||
|
|
Loading…
Reference in a new issue