def render(self, size, focus=False): """ Render all widgets in self.widget_list and return the results stacked one on top of the next. """ maxcol = size[0] item_rows = None combinelist = [] for i, (w, (f, height)) in enumerate(self.contents): item_focus = self.focus_item == w canv = None if f == 'fixed': canv = w.render((maxcol, height), focus=focus and item_focus) elif f == 'flow' or len(size) == 1: canv = w.render((maxcol, ), focus=focus and item_focus) else: if item_rows is None: item_rows = self.get_item_rows(size, focus) rows = item_rows[i] if rows > 0: canv = w.render((maxcol, rows), focus=focus and item_focus) if canv: combinelist.append((canv, i, item_focus)) if not combinelist: return SolidCanvas(" ", size[0], (size[1:] + (0, ))[0]) out = CanvasCombine(combinelist) if len(size) == 2 and size[1] < out.rows(): # flow/fixed widgets rendered too large out = CompositeCanvas(out) out.pad_trim_top_bottom(0, size[1] - out.rows()) return out
def render(self, size, focus=False): """ Render all widgets in self.widget_list and return the results stacked one on top of the next. """ maxcol = size[0] item_rows = None combinelist = [] for i, (w, (f, height)) in enumerate(self.contents): item_focus = self.focus_item == w canv = None if f == "fixed": canv = w.render((maxcol, height), focus=focus and item_focus) elif f == "flow" or len(size) == 1: canv = w.render((maxcol,), focus=focus and item_focus) else: if item_rows is None: item_rows = self.get_item_rows(size, focus) rows = item_rows[i] if rows > 0: canv = w.render((maxcol, rows), focus=focus and item_focus) if canv: combinelist.append((canv, i, item_focus)) if not combinelist: return SolidCanvas(" ", size[0], (size[1:] + (0,))[0]) out = CanvasCombine(combinelist) if len(size) == 2 and size[1] < out.rows(): # flow/fixed widgets rendered too large out = CompositeCanvas(out) out.pad_trim_top_bottom(0, size[1] - out.rows()) return out
def render(self, size, focus=False ): """ Render listbox and return canvas. """ (maxcol, maxrow) = size middle, top, bottom = self.calculate_visible( (maxcol, maxrow), focus=focus) if middle is None: return SolidCanvas(" ", maxcol, maxrow) _ignore, focus_widget, focus_pos, focus_rows, cursor = middle trim_top, fill_above = top trim_bottom, fill_below = bottom combinelist = [] rows = 0 fill_above.reverse() # fill_above is in bottom-up order for widget,w_pos,w_rows in fill_above: canvas = widget.render((maxcol,)) if w_rows != canvas.rows(): raise ListBoxError, "Widget %r at position %r within listbox calculated %d rows but rendered %d!"% (widget,w_pos,w_rows, canvas.rows()) rows += w_rows combinelist.append((canvas, w_pos, False)) focus_canvas = focus_widget.render((maxcol,), focus=focus) if focus_canvas.rows() != focus_rows: raise ListBoxError, "Focus Widget %r at position %r within listbox calculated %d rows but rendered %d!"% (focus_widget,focus_pos,focus_rows, focus_canvas.rows()) c_cursor = focus_canvas.cursor if cursor != c_cursor: raise ListBoxError, "Focus Widget %r at position %r within listbox calculated cursor coords %r but rendered cursor coords %r!" %(focus_widget,focus_pos,cursor,c_cursor) rows += focus_rows combinelist.append((focus_canvas, focus_pos, True)) for widget,w_pos,w_rows in fill_below: canvas = widget.render((maxcol,)) if w_rows != canvas.rows(): raise ListBoxError, "Widget %r at position %r within listbox calculated %d rows but rendered %d!"% (widget,w_pos,w_rows, canvas.rows()) rows += w_rows combinelist.append((canvas, w_pos, False)) final_canvas = CanvasCombine(combinelist) if trim_top: final_canvas.trim(trim_top) rows -= trim_top if trim_bottom: final_canvas.trim_end(trim_bottom) rows -= trim_bottom assert rows <= maxrow, "Listbox contents too long! Probably urwid's fault (please report): %r" % ((top,middle,bottom),) if rows < maxrow: bottom_pos = focus_pos if fill_below: bottom_pos = fill_below[-1][1] assert trim_bottom==0 and self.body.get_next(bottom_pos) == (None,None), "Listbox contents too short! Probably urwid's fault (please report): %r" % ((top,middle,bottom),) final_canvas.pad_trim_top_bottom(0, maxrow - rows) return final_canvas
def render(self, size, focus=False): """ Render listbox and return canvas. """ (maxcol, maxrow) = size middle, top, bottom = self.calculate_visible((maxcol, maxrow), focus=focus) if middle is None: return SolidCanvas(" ", maxcol, maxrow) _ignore, focus_widget, focus_pos, focus_rows, cursor = middle trim_top, fill_above = top trim_bottom, fill_below = bottom combinelist = [] rows = 0 fill_above.reverse() # fill_above is in bottom-up order for widget, w_pos, w_rows in fill_above: canvas = widget.render((maxcol, )) if w_rows != canvas.rows(): raise ListBoxError, "Widget %r at position %r within listbox calculated %d rows but rendered %d!" % ( widget, w_pos, w_rows, canvas.rows()) rows += w_rows combinelist.append((canvas, w_pos, False)) focus_canvas = focus_widget.render((maxcol, ), focus=focus) if focus_canvas.rows() != focus_rows: raise ListBoxError, "Focus Widget %r at position %r within listbox calculated %d rows but rendered %d!" % ( focus_widget, focus_pos, focus_rows, focus_canvas.rows()) c_cursor = focus_canvas.cursor if cursor != c_cursor: raise ListBoxError, "Focus Widget %r at position %r within listbox calculated cursor coords %r but rendered cursor coords %r!" % ( focus_widget, focus_pos, cursor, c_cursor) rows += focus_rows combinelist.append((focus_canvas, focus_pos, True)) for widget, w_pos, w_rows in fill_below: canvas = widget.render((maxcol, )) if w_rows != canvas.rows(): raise ListBoxError, "Widget %r at position %r within listbox calculated %d rows but rendered %d!" % ( widget, w_pos, w_rows, canvas.rows()) rows += w_rows combinelist.append((canvas, w_pos, False)) final_canvas = CanvasCombine(combinelist) if trim_top: final_canvas.trim(trim_top) rows -= trim_top if trim_bottom: final_canvas.trim_end(trim_bottom) rows -= trim_bottom assert rows <= maxrow, "Listbox contents too long! Probably urwid's fault (please report): %r" % ( (top, middle, bottom), ) if rows < maxrow: bottom_pos = focus_pos if fill_below: bottom_pos = fill_below[-1][1] assert trim_bottom == 0 and self.body.get_next(bottom_pos) == ( None, None ), "Listbox contents too short! Probably urwid's fault (please report): %r" % ( (top, middle, bottom), ) final_canvas.pad_trim_top_bottom(0, maxrow - rows) return final_canvas