from copy import copy from visidata import vd, asyncthread, Progress, Sheet, options Sheet.init('_ordering', list, copy=True) # (col:Column, reverse:bool) @Sheet.api def orderBy(sheet, *cols, reverse=False): 'Add cols to the internal ordering. No cols (or first col None) remove any previous ordering. call sort() if the ordering changes.' if options.undo: vd.addUndo(setattr, sheet, '_ordering', copy(sheet._ordering)) if sheet._ordering: vd.addUndo(sheet.sort) else: vd.addUndo(setattr, sheet, 'rows', copy(sheet.rows)) do_sort = False if not cols or cols[0] is None: sheet._ordering.clear() cols = cols[1:] do_sort = True for c in cols: sheet._ordering.append((c, reverse)) do_sort = True if do_sort: sheet.sort() class Reversor: def __init__(self, obj):
from visidata import vd, Sheet, Progress, option, asyncthread, options, rotateRange, Fanout, undoAttrCopyFunc, copy option('bulk_select_clear', False, 'clear selected rows before new bulk selections', replay=True) Sheet.init('_selectedRows', dict) # rowid(row) -> row @Sheet.api def isSelected(self, row): 'True if given row is selected. O(log n).' return self.rowid(row) in self._selectedRows @Sheet.api @asyncthread def toggle(self, rows): 'Toggle selection of given `rows`.' self.addUndoSelection() for r in Progress(rows, 'toggling', total=len(self.rows)): if not self.unselectRow(r): self.selectRow(r) @Sheet.api def selectRow(self, row): 'Select given row. O(log n)' self._selectedRows[self.rowid(row)] = row