def content(self, trim_left=0, trim_top=0, cols=None, rows=None, attr_map=None): """ Return the canvas content as a list of rows where each row is a list of (attr, cs, text) tuples. trim_left, trim_top, cols, rows may be set by CompositeCanvas when rendering a partially obscured canvas. """ maxcol, maxrow = self.cols(), self.rows() if not cols: cols = maxcol - trim_left if not rows: rows = maxrow - trim_top assert trim_left >= 0 and trim_left < maxcol assert cols > 0 and trim_left + cols <= maxcol assert trim_top >= 0 and trim_top < maxrow assert rows > 0 and trim_top + rows <= maxrow if trim_top or rows < maxrow: text_attr_cs = list( zip(self._text[trim_top:trim_top + rows], self._attr[trim_top:trim_top + rows], self._cs[trim_top:trim_top + rows])) else: text_attr_cs = list(zip(self._text, self._attr, self._cs)) for text, a_row, cs_row in text_attr_cs: if trim_left or cols < self._maxcol: text, a_row, cs_row = trim_text_attr_cs( text, a_row, cs_row, trim_left, trim_left + cols) attr_cs = rle_product(a_row, cs_row) i = 0 row = [] for (a, cs), run in attr_cs: if attr_map and a in attr_map: a = attr_map[a] row.append((a, cs, text[i:i + run])) i += run yield row
def content(self, trim_left=0, trim_top=0, cols=None, rows=None, attr_map=None): """ Return the canvas content as a list of rows where each row is a list of (attr, cs, text) tuples. trim_left, trim_top, cols, rows may be set by CompositeCanvas when rendering a partially obscured canvas. """ maxcol, maxrow = self.cols(), self.rows() if not cols: cols = maxcol - trim_left if not rows: rows = maxrow - trim_top assert trim_left >= 0 and trim_left < maxcol assert cols > 0 and trim_left + cols <= maxcol assert trim_top >=0 and trim_top < maxrow assert rows > 0 and trim_top + rows <= maxrow if trim_top or rows < maxrow: text_attr_cs = zip( self._text[trim_top:trim_top+rows], self._attr[trim_top:trim_top+rows], self._cs[trim_top:trim_top+rows]) else: text_attr_cs = zip(self._text, self._attr, self._cs) for text, a_row, cs_row in text_attr_cs: if trim_left or cols < self._maxcol: text, a_row, cs_row = trim_text_attr_cs( text, a_row, cs_row, trim_left, trim_left + cols) attr_cs = rle_product(a_row, cs_row) i = 0 row = [] for (a, cs), run in attr_cs: if attr_map and a in attr_map: a = attr_map[a] row.append((a, cs, text[i:i+run])) i += run yield row
def render(self, size, focus=False): from pudb.debugger import CONFIG render_line_nr = CONFIG["line_numbers"] maxcol = size[0] hscroll = self.dbg_ui.source_hscroll_start # attrs is a list of words like "focused" and "breakpoint" attrs = [] if self.is_current: crnt = ">" attrs.append("current") else: crnt = " " if self.has_breakpoint: bp = "*" attrs.append("breakpoint") else: bp = " " if focus: attrs.append("focused") elif self.highlight: if not self.has_breakpoint: attrs.append("highlighted") text = self.text if not attrs and self.attr is not None: attr = self.attr + [("source", None)] else: attr = [(" ".join(attrs+["source"]), None)] from urwid.util import apply_target_encoding, trim_text_attr_cs # build line prefix --------------------------------------------------- line_prefix = "" line_prefix_attr = [] if render_line_nr and self.line_nr: line_prefix_attr = [("line number", len(self.line_nr))] line_prefix = self.line_nr line_prefix = crnt+bp+line_prefix line_prefix_attr = [("source", 1), ("breakpoint marker", 1)] \ + line_prefix_attr # assume rendered width is same as len line_prefix_len = len(line_prefix) encoded_line_prefix, line_prefix_cs = apply_target_encoding(line_prefix) assert len(encoded_line_prefix) == len(line_prefix) # otherwise we'd have to adjust line_prefix_attr... :/ # shipout, encoding --------------------------------------------------- cs = [] encoded_text_segs = [] encoded_attr = [] i = 0 for seg_attr, seg_len in attr: if seg_len is None: # means: gobble up remainder of text and rest of line # and fill with attribute rowlen = hscroll+maxcol remaining_text = text[i:] encoded_seg_text, seg_cs = apply_target_encoding( remaining_text + rowlen*" ") encoded_attr.append((seg_attr, len(remaining_text)+rowlen)) else: unencoded_seg_text = text[i:i+seg_len] encoded_seg_text, seg_cs = apply_target_encoding(unencoded_seg_text) adjustment = len(encoded_seg_text) - len(unencoded_seg_text) encoded_attr.append((seg_attr, seg_len + adjustment)) i += seg_len encoded_text_segs.append(encoded_seg_text) cs.extend(seg_cs) encoded_text = b"".join(encoded_text_segs) encoded_text, encoded_attr, cs = trim_text_attr_cs( encoded_text, encoded_attr, cs, hscroll, hscroll+maxcol-line_prefix_len) encoded_text = encoded_line_prefix + encoded_text encoded_attr = line_prefix_attr + encoded_attr cs = line_prefix_cs + cs return urwid.TextCanvas([encoded_text], [encoded_attr], [cs], maxcol=maxcol)
def render(self, size, focus=False): from pudb.debugger import CONFIG render_line_nr = CONFIG["line_numbers"] maxcol = size[0] hscroll = self.dbg_ui.source_hscroll_start # attrs is a list of words like 'focused' and 'breakpoint' attrs = [] if self.is_current: crnt = ">" attrs.append("current") else: crnt = " " if self.has_breakpoint: bp = "*" attrs.append("breakpoint") else: bp = " " if focus: attrs.append("focused") elif self.highlight: if not self.has_breakpoint: attrs.append("highlighted") text = self.text if not attrs and self.attr is not None: attr = self.attr + [("source", None)] else: attr = [(" ".join(attrs+["source"]), None)] from urwid.util import apply_target_encoding, trim_text_attr_cs # build line prefix --------------------------------------------------- line_prefix = "" line_prefix_attr = [] if render_line_nr and self.line_nr: line_prefix_attr = [("line number", len(self.line_nr))] line_prefix = self.line_nr line_prefix = crnt+bp+line_prefix line_prefix_attr = [("source", 1), ("breakpoint marker", 1)] \ + line_prefix_attr # assume rendered width is same as len line_prefix_len = len(line_prefix) encoded_line_prefix, line_prefix_cs = apply_target_encoding(line_prefix) assert len(encoded_line_prefix) == len(line_prefix) # otherwise we'd have to adjust line_prefix_attr... :/ # shipout, encoding --------------------------------------------------- cs = [] encoded_text_segs = [] encoded_attr = [] i = 0 for seg_attr, seg_len in attr: if seg_len is None: # means: gobble up remainder of text and rest of line # and fill with attribute rowlen = hscroll+maxcol remaining_text = text[i:] encoded_seg_text, seg_cs = apply_target_encoding( remaining_text + rowlen*" ") encoded_attr.append((seg_attr, len(remaining_text)+rowlen)) else: unencoded_seg_text = text[i:i+seg_len] encoded_seg_text, seg_cs = apply_target_encoding(unencoded_seg_text) adjustment = len(encoded_seg_text) - len(unencoded_seg_text) encoded_attr.append((seg_attr, seg_len + adjustment)) i += seg_len encoded_text_segs.append(encoded_seg_text) cs.extend(seg_cs) encoded_text = b"".join(encoded_text_segs) encoded_text, encoded_attr, cs = trim_text_attr_cs( encoded_text, encoded_attr, cs, hscroll, hscroll+maxcol-line_prefix_len) encoded_text = encoded_line_prefix + encoded_text encoded_attr = line_prefix_attr + encoded_attr cs = line_prefix_cs + cs return urwid.TextCanvas([encoded_text], [encoded_attr], [cs], maxcol=maxcol)