Author: andar

Revision: 5094

Log:
        Fix displaying lines that are longer than the number of columns

Diff:
Modified: trunk/deluge/ui/console/screen.py
===================================================================
--- trunk/deluge/ui/console/screen.py   2009-04-19 19:51:11 UTC (rev 5093)
+++ trunk/deluge/ui/console/screen.py   2009-04-19 19:55:40 UTC (rev 5094)
@@ -116,7 +116,74 @@
         """
         log.debug("adding line: %s", text)
 
-        self.lines.extend(text.splitlines())
+        def get_line_length(line):
+            """
+            Returns the string length without the color formatting.
+
+            """
+            while line.find("{{") != -1:
+                line = line[:line.find("{{")] + line[line.find("}}") + 2:]
+
+            return len(line)
+
+        def get_line_chunks(line):
+            """
+            Returns a list of 2-tuples (color string, text)
+
+            """
+            chunks = []
+            num_chunks = line.count("{{")
+            for i in range(num_chunks):
+                # Find the beginning and end of the color tag
+                beg = line.find("{{")
+                end = line.find("}}") + 2
+                color = line[beg:end]
+                line = line[end:]
+
+                # Check to see if this is the last chunk
+                if i + 1 == num_chunks:
+                    text = line
+                else:
+                    # Not the last chunk so get the text up to the next tag
+                    # and remove the text from line
+                    text = line[:line.find("{{")]
+                    line = line[line.find("{{"):]
+
+                chunks.append((color, text))
+
+            return chunks
+
+        for line in text.splitlines():
+            # We need to check for line lengths here and split as necessary
+            line_length = get_line_length(line)
+            if line_length >= (self.cols - 1):
+                s = ""
+                # The length of the text without the color tags
+                s_len = 0
+                # We need to split this over multiple lines
+                for chunk in get_line_chunks(line):
+                    if (len(chunk[1]) + s_len) < (self.cols - 1):
+                        # This chunk plus the current string in 's' isn't over
+                        # the maximum width, so just append the color tag and 
text
+                        s += chunk[0] + chunk[1]
+                        s_len += len(chunk[1])
+                    else:
+                        # The chunk plus the current string in 's' is too long.
+                        # We need to take as much of the chunk and put it into 
's'
+                        # with the color tag.
+                        remain = (self.cols - 1) - s_len
+                        s += chunk[0] + chunk[1][:remain]
+                        # We append the line since it's full
+                        self.lines.append(s)
+                        # Start a new 's' with the remainder chunk
+                        s = chunk[0] + chunk[1][remain:]
+                        s_len = len(chunk[1][remain:])
+                # Append the final string which may or may not be the full 
width
+                if s:
+                    self.lines.append(s)
+            else:
+                self.lines.append(line)
+
         while len(self.lines) > LINES_BUFFER_SIZE:
             # Remove the oldest line if the max buffer size has been reached
             del self.lines[0]



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"deluge-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/deluge-commit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to