Table now has keynav support
This commit is contained in:
		
							parent
							
								
									d633e0f5f6
								
							
						
					
					
						commit
						260e2b31b6
					
				@ -9,6 +9,10 @@ import "git.tebibyte.media/sashakoshka/tomo/elements/core"
 | 
			
		||||
import "git.tebibyte.media/sashakoshka/tomo/default/theme"
 | 
			
		||||
import "git.tebibyte.media/sashakoshka/tomo/default/config"
 | 
			
		||||
 | 
			
		||||
// TODO: using the event propagator core might not be the best idea here. we
 | 
			
		||||
// should have slightly different behavior to sync the focused element with the
 | 
			
		||||
// selected cell.
 | 
			
		||||
 | 
			
		||||
type tableCell struct {
 | 
			
		||||
	tomo.Element
 | 
			
		||||
	tomo.Pattern
 | 
			
		||||
@ -245,29 +249,29 @@ func (element *TableContainer) DrawBackground (bounds image.Rectangle) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (element *TableContainer) HandleMouseDown (x, y int, button input.Button) {
 | 
			
		||||
	element.Focus()
 | 
			
		||||
	element.Propagator.HandleMouseDown(x, y, button)
 | 
			
		||||
	if button != input.ButtonLeft { return }
 | 
			
		||||
	
 | 
			
		||||
	for rowIndex,    row   := range element.grid {
 | 
			
		||||
	for columnIndex, child := range row {
 | 
			
		||||
	if image.Pt(x, y).In(child.Rectangle) {
 | 
			
		||||
		selected :=
 | 
			
		||||
			rowIndex == element.selectedRow &&
 | 
			
		||||
			columnIndex == element.selectedColumn
 | 
			
		||||
		if selected { return }
 | 
			
		||||
		oldColumn, oldRow := element.selectedColumn, element.selectedRow
 | 
			
		||||
		element.selectedColumn, element.selectedRow = columnIndex, rowIndex
 | 
			
		||||
		if oldColumn >= 0 && oldRow >= 0 {
 | 
			
		||||
			element.core.DamageRegion(element.redoCell(oldColumn, oldRow))
 | 
			
		||||
		}
 | 
			
		||||
		element.core.DamageRegion(element.redoCell(columnIndex, rowIndex))
 | 
			
		||||
		if element.onSelect != nil {
 | 
			
		||||
			element.onSelect()
 | 
			
		||||
		}
 | 
			
		||||
		element.selectCell(columnIndex, rowIndex)
 | 
			
		||||
		return
 | 
			
		||||
	}}}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (element *TableContainer) HandleKeyDown (key input.Key, modifiers input.Modifiers) {
 | 
			
		||||
	switch key {
 | 
			
		||||
	case input.KeyLeft:   element.changeSelectionBy(-1, 0)
 | 
			
		||||
	case input.KeyRight:  element.changeSelectionBy(1, 0)
 | 
			
		||||
	case input.KeyUp:     element.changeSelectionBy(0, -1)
 | 
			
		||||
	case input.KeyDown:   element.changeSelectionBy(0, 1)
 | 
			
		||||
	case input.KeyEscape: element.selectCell(-1, -1)
 | 
			
		||||
	default: element.Propagator.HandleKeyDown(key, modifiers)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ScrollContentBounds returns the full content size of the element.
 | 
			
		||||
func (element *TableContainer) ScrollContentBounds () image.Rectangle {
 | 
			
		||||
	return element.contentBounds
 | 
			
		||||
@ -316,6 +320,38 @@ func (element *TableContainer) ScrollAxes () (horizontal, vertical bool) {
 | 
			
		||||
	return true, true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (element *TableContainer) changeSelectionBy (column, row int) {
 | 
			
		||||
	column += element.selectedColumn
 | 
			
		||||
	row    += element.selectedRow
 | 
			
		||||
	if column < 0 { column = 0 }
 | 
			
		||||
	if row    < 0 { row    = 0 }
 | 
			
		||||
	element.selectCell(column, row)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (element *TableContainer) selectCell (column, row int) {
 | 
			
		||||
	if column < -1 { column = -1 }
 | 
			
		||||
	if row    < -1 { row    = -1 }
 | 
			
		||||
	if column >= element.columns { column = element.columns - 1 }
 | 
			
		||||
	if row    >= element.rows    { row    = element.rows    - 1 }
 | 
			
		||||
	
 | 
			
		||||
	if column == element.selectedColumn && row == element.selectedRow {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	oldColumn, oldRow := element.selectedColumn, element.selectedRow
 | 
			
		||||
	element.selectedColumn = column
 | 
			
		||||
	element.selectedRow    = row
 | 
			
		||||
	if oldColumn >= 0 && oldRow >= 0 {
 | 
			
		||||
		element.core.DamageRegion(element.redoCell(oldColumn, oldRow))
 | 
			
		||||
	}
 | 
			
		||||
	if column >= 0 && row >= 0 {
 | 
			
		||||
		element.core.DamageRegion(element.redoCell(column, row))
 | 
			
		||||
	}
 | 
			
		||||
	if element.onSelect != nil {
 | 
			
		||||
		element.onSelect()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (element *TableContainer) maxScrollHeight () (height int) {
 | 
			
		||||
	viewportHeight := element.Bounds().Dy()
 | 
			
		||||
	height = element.contentBounds.Dy() - viewportHeight
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user