The system can now focus previous, next
This commit is contained in:
		
							parent
							
								
									0a21f605fb
								
							
						
					
					
						commit
						e16195d274
					
				@ -30,8 +30,10 @@ func (backend *Backend) NewEntity (owner tomo.Element) tomo.Entity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (ent *entity) unlink () {
 | 
					func (ent *entity) unlink () {
 | 
				
			||||||
	ent.propagate (func (child *entity) bool {
 | 
						ent.propagate (func (child *entity) bool {
 | 
				
			||||||
 | 
							if child.window != nil {
 | 
				
			||||||
 | 
								delete(ent.window.system.drawingInvalid, child)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		child.window = nil
 | 
							child.window = nil
 | 
				
			||||||
		delete(ent.window.system.drawingInvalid, child)
 | 
					 | 
				
			||||||
		return true
 | 
							return true
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -61,17 +63,19 @@ func (ent *entity) setWindow (window *window) {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (entity *entity) propagate (callback func (*entity) bool) {
 | 
					func (entity *entity) propagate (callback func (*entity) bool) bool {
 | 
				
			||||||
	for _, child := range entity.children {
 | 
						for _, child := range entity.children {
 | 
				
			||||||
		if !callback(child) { break }
 | 
							if !child.propagate(callback) {
 | 
				
			||||||
		child.propagate(callback)
 | 
								return false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return callback(entity)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (entity *entity) childAt (point image.Point) *entity {
 | 
					func (entity *entity) childAt (point image.Point) *entity {
 | 
				
			||||||
	for _, child := range entity.children {
 | 
						for _, child := range entity.children {
 | 
				
			||||||
		if point.In(child.bounds) {
 | 
							if point.In(child.bounds) {
 | 
				
			||||||
			return child
 | 
								return child.childAt(point)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return entity
 | 
						return entity
 | 
				
			||||||
@ -190,12 +194,7 @@ func (entity *entity) Focused () bool {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (entity *entity) Focus () {
 | 
					func (entity *entity) Focus () {
 | 
				
			||||||
	if entity.window == nil { return }
 | 
						if entity.window == nil { return }
 | 
				
			||||||
	previous := entity.window.focused
 | 
						entity.window.system.focus(entity)
 | 
				
			||||||
	entity.window.focused = entity
 | 
					 | 
				
			||||||
	if previous != nil {
 | 
					 | 
				
			||||||
		previous.element.(tomo.Focusable).HandleFocusChange()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	entity.element.(tomo.Focusable).HandleFocusChange()
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (entity *entity) FocusNext () {
 | 
					func (entity *entity) FocusNext () {
 | 
				
			||||||
 | 
				
			|||||||
@ -62,12 +62,55 @@ func (system *system) SetConfig (config tomo.Config) {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (system *system) focus (entity *entity) {
 | 
				
			||||||
 | 
						previous := system.focused
 | 
				
			||||||
 | 
						system.focused = entity
 | 
				
			||||||
 | 
						if previous != nil {
 | 
				
			||||||
 | 
							previous.element.(tomo.Focusable).HandleFocusChange()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if entity != nil {
 | 
				
			||||||
 | 
							entity.element.(tomo.Focusable).HandleFocusChange()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (system *system) focusNext () {
 | 
					func (system *system) focusNext () {
 | 
				
			||||||
	// TODO
 | 
						found   := system.focused == nil
 | 
				
			||||||
 | 
						focused := false
 | 
				
			||||||
 | 
						system.propagate (func (entity *entity) bool {
 | 
				
			||||||
 | 
							if found {
 | 
				
			||||||
 | 
								// looking for the next element to select
 | 
				
			||||||
 | 
								child, ok := entity.element.(tomo.Focusable)
 | 
				
			||||||
 | 
								if ok && child.Enabled() {
 | 
				
			||||||
 | 
									// found it
 | 
				
			||||||
 | 
									entity.Focus()
 | 
				
			||||||
 | 
									focused = true
 | 
				
			||||||
 | 
									return false
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								// looking for the current focused element
 | 
				
			||||||
 | 
								if entity == system.focused {
 | 
				
			||||||
 | 
									// found it
 | 
				
			||||||
 | 
									found = true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !focused { system.focus(nil) }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (system *system) focusPrevious () {
 | 
					func (system *system) focusPrevious () {
 | 
				
			||||||
	// TODO
 | 
						var behind *entity
 | 
				
			||||||
 | 
						system.propagate (func (entity *entity) bool {
 | 
				
			||||||
 | 
							if entity == system.focused {
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							child, ok := entity.element.(tomo.Focusable)
 | 
				
			||||||
 | 
							if ok && child.Enabled() { behind = entity }
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						system.focus(behind)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (system *system) propagate (callback func (*entity) bool) {
 | 
					func (system *system) propagate (callback func (*entity) bool) {
 | 
				
			||||||
 | 
				
			|||||||
@ -37,6 +37,9 @@ type Container interface {
 | 
				
			|||||||
type Focusable interface {
 | 
					type Focusable interface {
 | 
				
			||||||
	Element
 | 
						Element
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Enabled returns whether or not the element can currently accept focus.
 | 
				
			||||||
 | 
						Enabled () bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// HandleFocusChange is called when the element is focused or unfocused.
 | 
						// HandleFocusChange is called when the element is focused or unfocused.
 | 
				
			||||||
	HandleFocusChange ()
 | 
						HandleFocusChange ()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user