Class: RubyCurses::TabularWidget::TableRowSorter

Inherits:
Object
  • Object
show all
Defined in:
lib/rbcurse/extras/tabularwidget.rb

Overview

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model = nil) ⇒ TableRowSorter

Returns a new instance of TableRowSorter.



953
954
955
956
957
# File 'lib/rbcurse/extras/tabularwidget.rb', line 953

def initialize model=nil
  self.model = model
  @columns_sort = []
  @sort_keys = nil
end

Instance Attribute Details

#sort_keysObject (readonly)

Returns the value of attribute sort_keys.



952
953
954
# File 'lib/rbcurse/extras/tabularwidget.rb', line 952

def sort_keys
  @sort_keys
end

Instance Method Details

#model=(model) ⇒ Object



958
959
960
961
# File 'lib/rbcurse/extras/tabularwidget.rb', line 958

def model=(model)
  @model = model
  @sort_keys = nil
end

#set_sort_keys(list) ⇒ Object



1009
1010
1011
# File 'lib/rbcurse/extras/tabularwidget.rb', line 1009

def set_sort_keys list
  @sort_keys = list
end

#sortObject

sorts the model based on sort keys and reverse flags



976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
# File 'lib/rbcurse/extras/tabularwidget.rb', line 976

def sort
  return unless @model
  return if @sort_keys.empty?
  @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
        res = y[abse] <=> x[abse]
      else
        res = x[e] <=> y[e]
      end
      break if res != 0
    }
    res
  }
end

#sortable(colindex, tf) ⇒ Object



962
963
964
# File 'lib/rbcurse/extras/tabularwidget.rb', line 962

def sortable colindex, tf
  @columns_sort[colindex] = tf
end

#sortable?(colindex) ⇒ Boolean

Returns:

  • (Boolean)


965
966
967
968
# File 'lib/rbcurse/extras/tabularwidget.rb', line 965

def sortable? colindex
  return false if @columns_sort[colindex]==false
  return true
end

#toggle_sort_order(index) ⇒ Object

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



996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
# File 'lib/rbcurse/extras/tabularwidget.rb', line 996

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
    # TODO delete beyond a max, default 3
  end
end

#use_to_s(colindex) ⇒ Object

should to_s be used for this column



970
971
972
# File 'lib/rbcurse/extras/tabularwidget.rb', line 970

def use_to_s colindex
  return true # TODO
end