Exemplo n.º 1
0
 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
Exemplo n.º 2
0
 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
Exemplo n.º 3
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()
Exemplo n.º 4
0
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()
Exemplo n.º 5
0
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()
Exemplo n.º 6
0
 def __init__(self, columns, rows):
     Widget.__init__(self)
     self.set_widget(gtk.Table(rows, columns, homogeneous=False))
     self.children = Matrix(columns, rows)
Exemplo n.º 7
0
 def __init__(self, columns, rows):
     Widget.__init__(self)
     self.set_widget(gtk.Table(rows, columns, homogeneous=False))
     self.children = Matrix(columns, rows)
Exemplo n.º 8
-1
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()