summaryrefslogtreecommitdiff
path: root/src/windows.py
diff options
context:
space:
mode:
authormathieui <mathieui@mathieui.net>2012-12-30 14:54:54 +0100
committermathieui <mathieui@mathieui.net>2012-12-30 14:54:54 +0100
commit0f9b37b8a8ee9ec469426f425a6415269653ac5a (patch)
tree1c36fa9e180af62d8c79060ed1ec2340f3926324 /src/windows.py
parent1313e7be3800d330824e1a8021e78bba5ddffe45 (diff)
downloadpoezio-0f9b37b8a8ee9ec469426f425a6415269653ac5a.tar.gz
poezio-0f9b37b8a8ee9ec469426f425a6415269653ac5a.tar.bz2
poezio-0f9b37b8a8ee9ec469426f425a6415269653ac5a.tar.xz
poezio-0f9b37b8a8ee9ec469426f425a6415269653ac5a.zip
Do not rebuild everything in order to modify a message
(should fix the “leak” on /correct, and make it faster)
Diffstat (limited to 'src/windows.py')
-rw-r--r--src/windows.py64
1 files changed, 45 insertions, 19 deletions
diff --git a/src/windows.py b/src/windows.py
index d5239a09..1bab7777 100644
--- a/src/windows.py
+++ b/src/windows.py
@@ -781,12 +781,31 @@ class TextWin(Win):
Return the number of lines that are built for the given
message.
"""
- if message is None: # line separator
- self.built_lines.append(None)
+ lines = self.build_message(message, timestamp=timestamp)
+ if self.lock:
+ self.lock_buffer.extend(lines)
+ else:
+ self.built_lines.extend(lines)
+ if not lines or not lines[0]:
return 0
+ if highlight:
+ self.highlights.append(lines[0])
+ if clean:
+ while len(self.built_lines) > self.lines_nb_limit:
+ self.built_lines.pop(0)
+ return len(lines)
+
+ def build_message(self, message, timestamp=False):
+ """
+ Build a list of lines from a message, without adding it
+ to a list
+ """
+ if message is None: # line separator
+ return [None]
txt = message.txt
if not txt:
- return 0
+ return []
+ ret = []
nick = truncate_nick(message.nickname)
offset = 0
if nick:
@@ -803,22 +822,10 @@ class TextWin(Win):
if get_theme().CHAR_TIME_RIGHT and message.str_time:
offset += 1
lines = cut_text(txt, self.width-offset)
- if self.lock:
- for line in lines:
- self.lock_buffer.append(Line(msg=message,
- start_pos=line[0],
- end_pos=line[1]))
- else:
- for line in lines:
- saved_line = Line(msg=message, start_pos=line[0], end_pos=line[1])
- self.built_lines.append(saved_line)
- if highlight:
- highlight = False
- self.highlights.append(saved_line)
- if clean:
- while len(self.built_lines) > self.lines_nb_limit:
- self.built_lines.pop(0)
- return len(lines)
+ for line in lines:
+ saved = Line(msg=message, start_pos=line[0], end_pos=line[1])
+ ret.append(saved)
+ return ret
def refresh(self):
log.debug('Refresh: %s', self.__class__.__name__)
@@ -932,6 +939,25 @@ class TextWin(Win):
while len(self.built_lines) > self.lines_nb_limit:
self.built_lines.pop(0)
+ def modify_message(self, old_id, message):
+ """
+ Find a message, and replace it with a new one
+ (instead of rebuilding everything in order to correct a message)
+ """
+ with_timestamps = config.get("show_timestamps", 'true') != 'false'
+ for i in range(len(self.built_lines)-1, 0, -1):
+ if self.built_lines[i].msg.identifier == old_id:
+ index = i
+ while index > 0 and self.built_lines[index].msg.identifier == old_id:
+ self.built_lines.pop(index)
+ index -= 1
+ index += 1
+ lines = self.build_message(message, timestamp=with_timestamps)
+ for line in lines:
+ self.built_lines.insert(index, line)
+ index +=1
+ break
+
def __del__(self):
log.debug('** TextWin: deleting %s built lines', (len(self.built_lines)))
del self.built_lines