def __init__(self, columns, rows): Container.__init__(self) self._cells = Matrix(columns, rows) self._children = [] # List of _TablePacking objects self._children_sorted = True self.rows = rows self.columns = columns self.row_spacing = self.column_spacing = 0
class Table(Widget): """Lays out widgets in a table. It works very similar to the GTK Table widget, or an HTML table. """ def __init__(self, columns, rows): Widget.__init__(self) self.set_widget(gtk.Table(rows, columns, homogeneous=False)) self.children = Matrix(columns, rows) def pack(self, widget, column, row, column_span=1, row_span=1): """Add a widget to the table. """ self.children[column, row] = widget self._widget.attach(widget._widget, column, column + column_span, row, row + row_span) widget._widget.show() def remove(self, widget): widget._widget.hide() # otherwise gtkmozembed gets confused self.children.remove(widget) self._widget.remove(widget._widget) def set_column_spacing(self, spacing): self._widget.set_col_spacings(spacing) def set_row_spacing(self, spacing): self._widget.set_row_spacings(spacing) def enable(self, row=None, column=None): if row != None and column != None: if self.children[column, row]: self.children[column, row].enable() elif row != None: for mem in self.children.row(row): if mem: mem.enable() elif column != None: for mem in self.children.column(column): if mem: mem.enable() else: for mem in self.children: if mem: mem.enable() def disable(self, row=None, column=None): if row != None and column != None: if self.children[column, row]: self.children[column, row].disable() elif row != None: for mem in self.children.row(row): if mem: mem.disable() elif column != None: for mem in self.children.column(column): if mem: mem.disable() else: for mem in self.children: if mem: mem.disable()
def __init__(self, columns, rows): Widget.__init__(self) self.set_widget(gtk.Table(rows, columns, homogeneous=False)) self.children = Matrix(columns, rows)
class Table(Container): """See https://develop.participatoryculture.org/index.php/WidgetAPI for a description of the API for this class.""" CREATES_VIEW = False def __init__(self, columns, rows): Container.__init__(self) self._cells = Matrix(columns, rows) self._children = [] # List of _TablePacking objects self._children_sorted = True self.rows = rows self.columns = columns self.row_spacing = self.column_spacing = 0 def _ensure_children_sorted(self): if not self._children_sorted: def cell_area(table_packing): return table_packing.column_span * table_packing.row_span self._children.sort(key=cell_area) self._children_sorted = True def get_children(self): return [cell.widget for cell in self._children] children = property(get_children) def calc_size_request(self): self._ensure_children_sorted() self._calc_dimensions() return self.total_width, self.total_height def _calc_dimensions(self): self.column_widths = [0] * self.columns self.row_heights = [0] * self.rows for tp in self._children: child_width, child_height = tp.widget.get_size_request() # recalc the width of the child's columns self._recalc_dimension(child_width, self.column_widths, tp.column_indexes()) # recalc the height of the child's rows self._recalc_dimension(child_height, self.row_heights, tp.row_indexes()) self.total_width = (self.column_spacing * (self.columns - 1) + sum(self.column_widths)) self.total_height = (self.row_spacing * (self.rows - 1) + sum(self.row_heights)) def _recalc_dimension(self, child_size, size_array, positions): current_size = sum(size_array[p] for p in positions) child_size_needed = child_size - current_size if child_size_needed > 0: iter = _extra_space_iter(child_size_needed, len(positions)) for p in positions: size_array[p] += iter.next() def place_children(self): # This method depepnds on us calling _calc_dimensions() in # calc_size_request(). Ensure that this happens. if self.cached_size_request is None: self.get_size_request() column_positions = [0] for width in self.column_widths[:-1]: column_positions.append(width + column_positions[-1] + self.column_spacing) row_positions = [0] for height in self.row_heights[:-1]: row_positions.append(height + row_positions[-1] + self.row_spacing) my_x= self.viewport.placement.origin.x my_y = self.viewport.placement.origin.y for tp in self._children: x = my_x + column_positions[tp.column] y = my_y + row_positions[tp.row] width = sum(self.column_widths[i] for i in tp.column_indexes()) height = sum(self.row_heights[i] for i in tp.row_indexes()) rect = NSMakeRect(x, y, width, height) tp.widget.place(rect, self.viewport.view) def pack(self, widget, column, row, column_span=1, row_span=1): tp = _TablePacking(widget, column, row, column_span, row_span) for c in tp.column_indexes(): for r in tp.row_indexes(): if self._cells[c, r]: raise ValueError("Cell %d x %d is already taken" % (c, r)) self._cells[column, row] = widget self._children.append(tp) self._children_sorted = False self.child_added(widget) def remove(self, child): for i in xrange(len(self._children)): if self._children[i].widget is child: self._children.remove(i) break else: raise ValueError("%s is not a child of this Table" % child) self._cells.remove(child) self.child_removed(widget) def set_column_spacing(self, spacing): self.column_spacing = spacing self.invalidate_size_request() def set_row_spacing(self, spacing): self.row_spacing = spacing self.invalidate_size_request() def enable(self, row=None, column=None): Container.enable(self) if row != None and column != None: if self._cells[column, row]: self._cells[column, row].enable() elif row != None: for mem in self._cells.row(row): if mem: mem.enable() elif column != None: for mem in self._cells.column(column): if mem: mem.enable() else: for mem in self._cells: if mem: mem.enable() def disable(self, row=None, column=None): Container.disable(self) if row != None and column != None: if self._cells[column, row]: self._cells[column, row].disable() elif row != None: for mem in self._cells.row(row): if mem: mem.disable() elif column != None: for mem in self._cells.column(column): if mem: mem.disable() else: for mem in self._cells: if mem: mem.disable()