def _adjust_merge_area(self, attrs, insertion_point, no_to_insert, axis): """Returns an updated merge area Parameters ---------- attrs: Dict \tCell attribute dictionary that shall be adjusted insertion_point: Integer \tPont on axis, before which insertion takes place no_to_insert: Integer >= 0 \tNumber of rows/cols/tabs that shall be inserted axis: Integer in range(2) \tSpecifies number of dimension, i.e. 0 == row, 1 == col """ assert axis in range(2) if "merge_area" not in attrs or attrs["merge_area"] is None: return top, left, bottom, right = attrs["merge_area"] selection = Selection([(top, left)], [(bottom, right)], [], [], []) selection.insert(insertion_point, no_to_insert, axis) __top, __left = selection.block_tl[0] __bottom, __right = selection.block_br[0] # Adjust merge area if it is beyond the grid shape rows, cols, tabs = self.shape if __top < 0 or __bottom >= rows or __left < 0 or __right >= cols: attrs["merge_area"] = None else: attrs["merge_area"] = __top, __left, __bottom, __right
def _adjust_merge_area(self, attrs, insertion_point, no_to_insert, axis): """Returns an updated merge area :param attrs: Cell attribute dictionary that shall be adjusted :type attrs: dict :param insertion_point: Point on axis before insertion takes place :type insertion_point: int :param no_to_insert: Number of rows/cols/tabs that shall be inserted :type no_to_insert: int, >=0 :param axis: Specifies number of dimension, i.e. 0 == row, 1 == col :type axis: int in range(2) """ assert axis in range(2) if "merge_area" not in attrs or attrs["merge_area"] is None: return top, left, bottom, right = attrs["merge_area"] selection = Selection([(top, left)], [(bottom, right)], [], [], []) selection.insert(insertion_point, no_to_insert, axis) __top, __left = selection.block_tl[0] __bottom, __right = selection.block_br[0] # Adjust merge area if it is beyond the grid shape rows, cols, tabs = self.shape if __top < 0 and __bottom < 0 or __top >= rows and __bottom >= rows or\ __left < 0 and __right < 0 or __left >= cols and __right >= cols: return if __top < 0: __top = 0 if __top >= rows: __top = rows - 1 if __bottom < 0: __bottom = 0 if __bottom >= rows: __bottom = rows - 1 if __left < 0: __left = 0 if __left >= cols: __left = cols - 1 if __right < 0: __right = 0 if __right >= cols: __right = cols - 1 return __top, __left, __bottom, __right
def _get_adjusted_merge_area(self, attrs, insertion_point, no_to_insert, axis): """Returns updated merge area Parameters ---------- attrs: Dict \tCell attribute dictionary that shall be adjusted insertion_point: Integer \tPont on axis, before which insertion takes place no_to_insert: Integer >= 0 \tNumber of rows/cols/tabs that shall be inserted axis: Integer in range(2) \tSpecifies number of dimension, i.e. 0 == row, 1 == col """ assert axis in range(2) if "merge_area" not in attrs or attrs["merge_area"] is None: return top, left, bottom, right = attrs["merge_area"] selection = Selection([(top, left)], [(bottom, right)], [], [], []) selection.insert(insertion_point, no_to_insert, axis) __top, __left = selection.block_tl[0] __bottom, __right = selection.block_br[0] # Adjust merge area if it is beyond the grid shape rows, cols, tabs = self.shape if __top < 0 or __bottom >= rows or __left < 0 or __right >= cols: return None else: return __top, __left, __bottom, __right
def _adjust_cell_attributes(self, insertion_point, no_to_insert, axis, tab=None, cell_attrs=None, mark_unredo=True): """Adjusts cell attributes on insertion/deletion""" if mark_unredo: self.unredo.mark() old_cell_attrs = self.cell_attributes[:] if axis < 2: # Adjust selections if cell_attrs is None: cell_attrs = [] for key in self.cell_attributes: selection, table, value = key if tab is None or tab == table: new_sel = copy(selection) new_val = copy(value) new_sel.insert(insertion_point, no_to_insert, axis) # Update merge area if present if "merge_area" in value: top, left, bottom, right = value["merge_area"] ma_sel = Selection([(top, left)], [(bottom, right)], [], [], []) ma_sel.insert(insertion_point, no_to_insert, axis) __top, __left = ma_sel.block_tl[0] __bottom, __right = ma_sel.block_br[0] new_val["merge_area"] = \ __top, __left, __bottom, __right cell_attrs.append((new_sel, table, new_val)) self.cell_attributes[:] = cell_attrs self.cell_attributes._attr_cache.clear() elif axis == 2: # Adjust tabs new_tabs = [] for selection, old_tab, value in self.cell_attributes: if old_tab > insertion_point and \ (tab is None or tab == old_tab): new_tabs.append((selection, old_tab + no_to_insert, value)) else: new_tabs.append(None) for i, sel_tab_val in enumerate(new_tabs): if sel_tab_val is not None: self.dict_grid.cell_attributes.set_item(i, sel_tab_val) self.cell_attributes._attr_cache.clear() else: raise ValueError("Axis must be in [0, 1, 2]") undo_operation = (self._adjust_cell_attributes, [ insertion_point, -no_to_insert, axis, tab, old_cell_attrs, mark_unredo ]) redo_operation = (self._adjust_cell_attributes, [ insertion_point, no_to_insert, axis, tab, cell_attrs, mark_unredo ]) self.unredo.append(undo_operation, redo_operation) if mark_unredo: self.unredo.mark()
def _adjust_cell_attributes(self, insertion_point, no_to_insert, axis, tab=None, cell_attrs=None, mark_unredo=True): """Adjusts cell attributes on insertion/deletion""" if mark_unredo: self.unredo.mark() old_cell_attrs = self.cell_attributes[:] if axis < 2: # Adjust selections if cell_attrs is None: cell_attrs = [] for key in self.cell_attributes: selection, table, value = key if tab is None or tab == table: new_sel = copy(selection) new_val = copy(value) new_sel.insert(insertion_point, no_to_insert, axis) # Update merge area if present if "merge_area" in value: top, left, bottom, right = value["merge_area"] ma_sel = Selection([(top, left)], [(bottom, right)], [], [], []) ma_sel.insert(insertion_point, no_to_insert, axis) __top, __left = ma_sel.block_tl[0] __bottom, __right = ma_sel.block_br[0] new_val["merge_area"] = \ __top, __left, __bottom, __right cell_attrs.append((new_sel, table, new_val)) self.cell_attributes[:] = cell_attrs self.cell_attributes._attr_cache.clear() elif axis == 2: # Adjust tabs new_tabs = [] for selection, old_tab, value in self.cell_attributes: if old_tab > insertion_point and \ (tab is None or tab == old_tab): new_tabs.append((selection, old_tab + no_to_insert, value)) else: new_tabs.append(None) for i, sel_tab_val in enumerate(new_tabs): if sel_tab_val is not None: self.dict_grid.cell_attributes.set_item(i, sel_tab_val) self.cell_attributes._attr_cache.clear() else: raise ValueError("Axis must be in [0, 1, 2]") undo_operation = (self._adjust_cell_attributes, [insertion_point, -no_to_insert, axis, tab, old_cell_attrs, mark_unredo]) redo_operation = (self._adjust_cell_attributes, [insertion_point, no_to_insert, axis, tab, cell_attrs, mark_unredo]) self.unredo.append(undo_operation, redo_operation) if mark_unredo: self.unredo.mark()