rm unused listselectionmanager
This commit is contained in:
@@ -1,154 +0,0 @@
|
|||||||
package util
|
|
||||||
|
|
||||||
type ListSelectionManager struct {
|
|
||||||
lastSelectedRow int
|
|
||||||
numSelected int
|
|
||||||
selected BitSet
|
|
||||||
len func() int
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewListSelectionManager(lenFn func() int) ListSelectionManager {
|
|
||||||
return ListSelectionManager{lastSelectedRow: -1, len: lenFn}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the given row is not selected, reset the selection
|
|
||||||
// and select only the given row.
|
|
||||||
func (l *ListSelectionManager) Select(row int) {
|
|
||||||
if row < 0 || l.selected.IsSet(uint(row)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
l.UnselectAll()
|
|
||||||
l.selectAdd(row)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If it is not selected, add the given row to the selection.
|
|
||||||
// If it is selected, unselet it.
|
|
||||||
func (l *ListSelectionManager) SelectAddOrRemove(row int) {
|
|
||||||
if row < 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if l.selected.IsSet(uint(row)) {
|
|
||||||
// find new last selected row
|
|
||||||
if row == l.lastSelectedRow {
|
|
||||||
for i := row - 1; i >= -1; i++ {
|
|
||||||
if i == -1 {
|
|
||||||
l.lastSelectedRow = i
|
|
||||||
} else if l.selected.IsSet(uint(i)) {
|
|
||||||
l.lastSelectedRow = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
l.selected.Unset(uint(row))
|
|
||||||
l.numSelected -= 1
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
l.selectAdd(row)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *ListSelectionManager) selectAdd(row int) {
|
|
||||||
l.numSelected += 1
|
|
||||||
l.selected.Set(uint(row))
|
|
||||||
if row > l.lastSelectedRow {
|
|
||||||
l.lastSelectedRow = row
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select a range between the given row and the furthest-down
|
|
||||||
// row that is currently selected (which may be above the given row)
|
|
||||||
// Note: this is modeled after what, as far as I can tell, is Gmail's selection behavior
|
|
||||||
func (l *ListSelectionManager) SelectRange(row int) {
|
|
||||||
if row < 0 || l.selected.IsSet(uint(row)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if l.numSelected == 0 {
|
|
||||||
l.selectAdd(row)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
m := maxInt(row, l.lastSelectedRow)
|
|
||||||
for i := minInt(l.lastSelectedRow, row); i <= m; i++ {
|
|
||||||
l.selectAdd(i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *ListSelectionManager) SelectAll() {
|
|
||||||
for i := 0; i < l.len(); i++ {
|
|
||||||
l.selectAdd(i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *ListSelectionManager) UnselectAll() {
|
|
||||||
l.selected = nil
|
|
||||||
l.numSelected = 0
|
|
||||||
l.lastSelectedRow = -1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *ListSelectionManager) IsSelected(row int) bool {
|
|
||||||
return row >= 0 && l.selected.IsSet(uint(row))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *ListSelectionManager) GetSelection() []int {
|
|
||||||
var sel []int
|
|
||||||
for i := 0; i < l.len(); i++ {
|
|
||||||
if l.selected.IsSet(uint(i)) {
|
|
||||||
sel = append(sel, i)
|
|
||||||
}
|
|
||||||
if len(sel) == l.numSelected {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sel
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *ListSelectionManager) AreAllSelected() bool {
|
|
||||||
return l.numSelected == l.len()
|
|
||||||
}
|
|
||||||
|
|
||||||
func minInt(a, b int) int {
|
|
||||||
if a < b {
|
|
||||||
return a
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
func maxInt(a, b int) int {
|
|
||||||
if a > b {
|
|
||||||
return a
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// BitSet implementation from
|
|
||||||
// https://stackoverflow.com/questions/2311373/how-to-implement-bitset-with-go
|
|
||||||
|
|
||||||
const uint64size = 64
|
|
||||||
|
|
||||||
// BitSet is a set of bits that can be set, cleared and queried.
|
|
||||||
type BitSet []uint64
|
|
||||||
|
|
||||||
// Set ensures that the given bit is set in the BitSet.
|
|
||||||
func (s *BitSet) Set(i uint) {
|
|
||||||
if len(*s) < int(i/uint64size+1) {
|
|
||||||
r := make([]uint64, i/uint64size+1)
|
|
||||||
copy(r, *s)
|
|
||||||
*s = r
|
|
||||||
}
|
|
||||||
(*s)[i/uint64size] |= 1 << (i % uint64size)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unset ensures that the given bit is cleared (not set) in the BitSet.
|
|
||||||
func (s *BitSet) Unset(i uint) {
|
|
||||||
if len(*s) >= int(i/uint64size+1) {
|
|
||||||
(*s)[i/uint64size] &^= 1 << (i % uint64size)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsSet returns true if the given bit is set, false if it is cleared.
|
|
||||||
func (s *BitSet) IsSet(i uint) bool {
|
|
||||||
idx := i / uint64size
|
|
||||||
if idx >= uint(len(*s)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return (*s)[i/uint64size]&(1<<(i%uint64size)) != 0
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user