class Canis::DefaultTableRowSorter

structures }}} sorter {{{ This is our default table row sorter. It does a multiple sort and allows for reverse sort also. It's a pretty simple sorter and uses sort, not sort_by. Improvements welcome. Usage: provide model in constructor or using model method Call toggle_sort_order(column_index) Call sort. Currently, this sorts the provided model in-place. Future versions may maintain a copy, or use a table that provides a mapping of model to result. # TODO check if column_sortable

Attributes

sort_keys[R]

Public Class Methods

new(data_model=nil) click to toggle source

model is array of data

# File lib/canis/core/widgets/table.rb, line 94
def initialize data_model=nil
  self.model = data_model
  @columns_sort = []
  @sort_keys = nil
end

Public Instance Methods

model=(model) click to toggle source
# File lib/canis/core/widgets/table.rb, line 99
def model=(model)
  @model = model
  @sort_keys = nil
end
set_sort_keys(list) click to toggle source
# File lib/canis/core/widgets/table.rb, line 187
def set_sort_keys list
  @sort_keys = list
end
sort() click to toggle source

sorts the model based on sort keys and reverse flags @sort_keys contains indices to sort on @reverse_flags is an array of booleans, true for reverse, nil or false for ascending

# File lib/canis/core/widgets/table.rb, line 117
def sort
  return unless @model
  return if @sort_keys.empty?
  $log.debug "TABULAR SORT KEYS #{sort_keys} "
  # first row is the header which should remain in place
  # We could have kept column headers separate, but then too much of mucking around
  # with textpad, this way we avoid touching it
  header = @model.delete_at 0
  begin
    # next line often can give error "array within array" - i think on date fields that
    #  contain nils
  @model.sort!{|x,y|
    res = 0
    @sort_keys.each { |ee|
      e = ee.abs-1 # since we had offsetted by 1 earlier
      abse = e.abs
      if ee < 0
        xx = x[abse]
        yy = y[abse]
        # the following checks are since nil values cause an error to be raised
        if xx.nil? && yy.nil?
          res = 0
        elsif xx.nil?
          res = 1
        elsif yy.nil?
          res = -1
        else
        res = y[abse] <=> x[abse]
        end
      else
        xx = x[e]
        yy = y[e]
        # the following checks are since nil values cause an error to be raised
        # whereas we want a nil to be wither treated as a zero or a blank
        if xx.nil? && yy.nil?
          res = 0
        elsif xx.nil?
          res = -1
        elsif yy.nil?
          res = 1
        else
        res = x[e] <=> y[e]
        end
      end
      break if res != 0
    }
    res
  }
  ensure
    @model.insert 0, header if header
  end
end
sortable(colindex, tf) click to toggle source
# File lib/canis/core/widgets/table.rb, line 103
def sortable colindex, tf
  @columns_sort[colindex] = tf
end
sortable?(colindex) click to toggle source
# File lib/canis/core/widgets/table.rb, line 106
def sortable? colindex
  return false if @columns_sort[colindex]==false
  return true
end
toggle_sort_order(index) click to toggle source

toggle the sort order if given column offset is primary sort key Otherwise, insert as primary sort key, ascending.

# File lib/canis/core/widgets/table.rb, line 171
def toggle_sort_order index
  index += 1 # increase by 1, since 0 won't multiple by -1
  # internally, reverse sort is maintained by multiplying number by -1
  @sort_keys ||= []
  if @sort_keys.first && index == @sort_keys.first.abs
    @sort_keys[0] *= -1
  else
    @sort_keys.delete index # in case its already there
    @sort_keys.delete(index*-1) # in case its already there
    @sort_keys.unshift index
    # don't let it go on increasing
    if @sort_keys.size > 3
      @sort_keys.pop
    end
  end
end
use_to_s(colindex) click to toggle source

should to_s be used for this column

# File lib/canis/core/widgets/table.rb, line 111
def use_to_s colindex
  return true # TODO
end