Basic elements now conform to the new API (largely untested)
This commit is contained in:
parent
8a72e8bf01
commit
c813463bb4
@ -14,10 +14,13 @@ type Button struct {
|
|||||||
pressed bool
|
pressed bool
|
||||||
enabled bool
|
enabled bool
|
||||||
selected bool
|
selected bool
|
||||||
onClick func ()
|
|
||||||
|
|
||||||
text string
|
text string
|
||||||
drawer artist.TextDrawer
|
drawer artist.TextDrawer
|
||||||
|
|
||||||
|
onClick func ()
|
||||||
|
onSelectionRequest func () (granted bool)
|
||||||
|
onSelectionMotionRequest func (tomo.SelectionDirection) (granted bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewButton creates a new button with the specified label text.
|
// NewButton creates a new button with the specified label text.
|
||||||
@ -41,7 +44,7 @@ func (element *Button) HandleMouseDown (x, y int, button tomo.Button) {
|
|||||||
element.pressed = true
|
element.pressed = true
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +53,7 @@ func (element *Button) HandleMouseUp (x, y int, button tomo.Button) {
|
|||||||
element.pressed = false
|
element.pressed = false
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
within := image.Point { x, y }.
|
within := image.Point { x, y }.
|
||||||
@ -63,7 +66,7 @@ func (element *Button) HandleMouseUp (x, y int, button tomo.Button) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (element *Button) HandleMouseMove (x, y int) { }
|
func (element *Button) HandleMouseMove (x, y int) { }
|
||||||
func (element *Button) HandleScroll (x, y int, deltaX, deltaY float64) { }
|
func (element *Button) HandleMouseScroll (x, y int, deltaX, deltaY float64) { }
|
||||||
|
|
||||||
func (element *Button) HandleKeyDown (
|
func (element *Button) HandleKeyDown (
|
||||||
key tomo.Key,
|
key tomo.Key,
|
||||||
@ -75,7 +78,7 @@ func (element *Button) HandleKeyDown (
|
|||||||
element.pressed = true
|
element.pressed = true
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -85,7 +88,7 @@ func (element *Button) HandleKeyUp(key tomo.Key, modifiers tomo.Modifiers) {
|
|||||||
element.pressed = false
|
element.pressed = false
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
if !element.enabled { return }
|
if !element.enabled { return }
|
||||||
if element.onClick != nil {
|
if element.onClick != nil {
|
||||||
@ -100,7 +103,9 @@ func (element *Button) Selected () (selected bool) {
|
|||||||
|
|
||||||
func (element *Button) Select () {
|
func (element *Button) Select () {
|
||||||
if !element.enabled { return }
|
if !element.enabled { return }
|
||||||
element.core.RequestSelection()
|
if element.onSelectionRequest != nil {
|
||||||
|
element.onSelectionRequest()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (element *Button) HandleSelection (
|
func (element *Button) HandleSelection (
|
||||||
@ -117,7 +122,7 @@ func (element *Button) HandleSelection (
|
|||||||
element.selected = true
|
element.selected = true
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -126,10 +131,20 @@ func (element *Button) HandleDeselection () {
|
|||||||
element.selected = false
|
element.selected = false
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (element *Button) OnSelectionRequest (callback func () (granted bool)) {
|
||||||
|
element.onSelectionRequest = callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (element *Button) OnSelectionMotionRequest (
|
||||||
|
callback func (direction tomo.SelectionDirection) (granted bool),
|
||||||
|
) {
|
||||||
|
element.onSelectionMotionRequest = callback
|
||||||
|
}
|
||||||
|
|
||||||
// OnClick sets the function to be called when the button is clicked.
|
// OnClick sets the function to be called when the button is clicked.
|
||||||
func (element *Button) OnClick (callback func ()) {
|
func (element *Button) OnClick (callback func ()) {
|
||||||
element.onClick = callback
|
element.onClick = callback
|
||||||
@ -141,7 +156,7 @@ func (element *Button) SetEnabled (enabled bool) {
|
|||||||
element.enabled = enabled
|
element.enabled = enabled
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,7 +172,7 @@ func (element *Button) SetText (text string) {
|
|||||||
theme.Padding() * 2 + textBounds.Dy())
|
theme.Padding() * 2 + textBounds.Dy())
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,10 +15,13 @@ type Checkbox struct {
|
|||||||
checked bool
|
checked bool
|
||||||
enabled bool
|
enabled bool
|
||||||
selected bool
|
selected bool
|
||||||
onClick func ()
|
|
||||||
|
|
||||||
text string
|
text string
|
||||||
drawer artist.TextDrawer
|
drawer artist.TextDrawer
|
||||||
|
|
||||||
|
onClick func ()
|
||||||
|
onSelectionRequest func () (granted bool)
|
||||||
|
onSelectionMotionRequest func (tomo.SelectionDirection) (granted bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCheckbox creates a new cbeckbox with the specified label text.
|
// NewCheckbox creates a new cbeckbox with the specified label text.
|
||||||
@ -41,7 +44,7 @@ func (element *Checkbox) HandleMouseDown (x, y int, button tomo.Button) {
|
|||||||
element.pressed = true
|
element.pressed = true
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +60,7 @@ func (element *Checkbox) HandleMouseUp (x, y int, button tomo.Button) {
|
|||||||
|
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
if within && element.onClick != nil {
|
if within && element.onClick != nil {
|
||||||
element.onClick()
|
element.onClick()
|
||||||
@ -76,7 +79,7 @@ func (element *Checkbox) HandleKeyDown (
|
|||||||
element.pressed = true
|
element.pressed = true
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,7 +90,7 @@ func (element *Checkbox) HandleKeyUp (key tomo.Key, modifiers tomo.Modifiers) {
|
|||||||
element.checked = !element.checked
|
element.checked = !element.checked
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
if element.onClick != nil {
|
if element.onClick != nil {
|
||||||
element.onClick()
|
element.onClick()
|
||||||
@ -102,7 +105,10 @@ func (element *Checkbox) Selected () (selected bool) {
|
|||||||
|
|
||||||
// Select requests that this element be selected.
|
// Select requests that this element be selected.
|
||||||
func (element *Checkbox) Select () {
|
func (element *Checkbox) Select () {
|
||||||
element.core.RequestSelection()
|
if !element.enabled { return }
|
||||||
|
if element.onSelectionRequest != nil {
|
||||||
|
element.onSelectionRequest()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (element *Checkbox) HandleSelection (
|
func (element *Checkbox) HandleSelection (
|
||||||
@ -119,7 +125,7 @@ func (element *Checkbox) HandleSelection (
|
|||||||
element.selected = true
|
element.selected = true
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -128,10 +134,20 @@ func (element *Checkbox) HandleDeselection () {
|
|||||||
element.selected = false
|
element.selected = false
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (element *Checkbox) OnSelectionRequest (callback func () (granted bool)) {
|
||||||
|
element.onSelectionRequest = callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (element *Checkbox) OnSelectionMotionRequest (
|
||||||
|
callback func (direction tomo.SelectionDirection) (granted bool),
|
||||||
|
) {
|
||||||
|
element.onSelectionMotionRequest = callback
|
||||||
|
}
|
||||||
|
|
||||||
// OnClick sets the function to be called when the checkbox is toggled.
|
// OnClick sets the function to be called when the checkbox is toggled.
|
||||||
func (element *Checkbox) OnClick (callback func ()) {
|
func (element *Checkbox) OnClick (callback func ()) {
|
||||||
element.onClick = callback
|
element.onClick = callback
|
||||||
@ -148,7 +164,7 @@ func (element *Checkbox) SetEnabled (enabled bool) {
|
|||||||
element.enabled = enabled
|
element.enabled = enabled
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,7 +180,7 @@ func (element *Checkbox) SetText (text string) {
|
|||||||
textBounds.Dy())
|
textBounds.Dy())
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,10 @@ type Container struct {
|
|||||||
selected bool
|
selected bool
|
||||||
selectable bool
|
selectable bool
|
||||||
flexible bool
|
flexible bool
|
||||||
|
|
||||||
|
onSelectionRequest func () (granted bool)
|
||||||
|
onSelectionMotionRequest func (tomo.SelectionDirection) (granted bool)
|
||||||
|
onFlexibleHeightChange func ()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewContainer creates a new container.
|
// NewContainer creates a new container.
|
||||||
@ -35,7 +39,7 @@ func (element *Container) SetLayout (layout tomo.Layout) {
|
|||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.recalculate()
|
element.recalculate()
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,38 +47,40 @@ func (element *Container) SetLayout (layout tomo.Layout) {
|
|||||||
// the element will expand (instead of contract to its minimum size), in
|
// the element will expand (instead of contract to its minimum size), in
|
||||||
// whatever way is defined by the current layout.
|
// whatever way is defined by the current layout.
|
||||||
func (element *Container) Adopt (child tomo.Element, expand bool) {
|
func (element *Container) Adopt (child tomo.Element, expand bool) {
|
||||||
child.SetParentHooks (tomo.ParentHooks {
|
// set event handlers
|
||||||
Draw: func (region tomo.Canvas) {
|
child.OnDamage (func (region tomo.Canvas) {
|
||||||
element.drawChildRegion(child, region)
|
element.drawChildRegion(child, region)
|
||||||
},
|
|
||||||
MinimumSizeChange: func (int, int) {
|
|
||||||
element.updateMinimumSize()
|
|
||||||
},
|
|
||||||
FlexibleHeightChange: element.updateMinimumSize,
|
|
||||||
SelectionRequest: func () (granted bool) {
|
|
||||||
child, selectable := child.(tomo.Selectable)
|
|
||||||
if !selectable { return }
|
|
||||||
return element.childSelectionRequestCallback(child)
|
|
||||||
},
|
|
||||||
SelectionMotionRequest: func (
|
|
||||||
direction tomo.SelectionDirection,
|
|
||||||
) (
|
|
||||||
granted bool,
|
|
||||||
) {
|
|
||||||
return element.core.RequestSelectionMotion(direction)
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
child.OnMinimumSizeChange(element.updateMinimumSize)
|
||||||
|
if child0, ok := child.(tomo.Flexible); ok {
|
||||||
|
child0.OnFlexibleHeightChange(element.updateMinimumSize)
|
||||||
|
}
|
||||||
|
if child0, ok := child.(tomo.Selectable); ok {
|
||||||
|
child0.OnSelectionRequest (func () (granted bool) {
|
||||||
|
return element.childSelectionRequestCallback(child0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if child0, ok := child.(tomo.Selectable); ok {
|
||||||
|
child0.OnSelectionMotionRequest (
|
||||||
|
func (direction tomo.SelectionDirection) (granted bool) {
|
||||||
|
if element.onSelectionMotionRequest == nil { return }
|
||||||
|
return element.onSelectionMotionRequest(direction)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// add child
|
||||||
element.children = append (element.children, tomo.LayoutEntry {
|
element.children = append (element.children, tomo.LayoutEntry {
|
||||||
Element: child,
|
Element: child,
|
||||||
Expand: expand,
|
Expand: expand,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// refresh stale data
|
||||||
element.updateMinimumSize()
|
element.updateMinimumSize()
|
||||||
element.reflectChildProperties()
|
element.reflectChildProperties()
|
||||||
if element.core.HasImage() && !element.warping {
|
if element.core.HasImage() && !element.warping {
|
||||||
element.recalculate()
|
element.recalculate()
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,7 +103,7 @@ func (element *Container) Warp (callback func ()) {
|
|||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.recalculate()
|
element.recalculate()
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +112,7 @@ func (element *Container) Warp (callback func ()) {
|
|||||||
func (element *Container) Disown (child tomo.Element) {
|
func (element *Container) Disown (child tomo.Element) {
|
||||||
for index, entry := range element.children {
|
for index, entry := range element.children {
|
||||||
if entry.Element == child {
|
if entry.Element == child {
|
||||||
entry.SetParentHooks(tomo.ParentHooks { })
|
element.clearChildEventHandlers(entry.Element)
|
||||||
element.children = append (
|
element.children = append (
|
||||||
element.children[:index],
|
element.children[:index],
|
||||||
element.children[index + 1:]...)
|
element.children[index + 1:]...)
|
||||||
@ -119,7 +125,22 @@ func (element *Container) Disown (child tomo.Element) {
|
|||||||
if element.core.HasImage() && !element.warping {
|
if element.core.HasImage() && !element.warping {
|
||||||
element.recalculate()
|
element.recalculate()
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (element *Container) clearChildEventHandlers (child tomo.Element) {
|
||||||
|
child.OnDamage(nil)
|
||||||
|
child.OnMinimumSizeChange(nil)
|
||||||
|
if child0, ok := child.(tomo.Selectable); ok {
|
||||||
|
child0.OnSelectionRequest(nil)
|
||||||
|
child0.OnSelectionMotionRequest(nil)
|
||||||
|
if child0.Selected() {
|
||||||
|
child0.HandleDeselection()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if child0, ok := child.(tomo.Flexible); ok {
|
||||||
|
child0.OnFlexibleHeightChange(nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +153,7 @@ func (element *Container) DisownAll () {
|
|||||||
if element.core.HasImage() && !element.warping {
|
if element.core.HasImage() && !element.warping {
|
||||||
element.recalculate()
|
element.recalculate()
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +234,7 @@ func (element *Container) HandleScroll (x, y int, deltaX, deltaY float64) {
|
|||||||
child, handlesMouse := element.ChildAt(image.Pt(x, y)).(tomo.MouseTarget)
|
child, handlesMouse := element.ChildAt(image.Pt(x, y)).(tomo.MouseTarget)
|
||||||
if !handlesMouse { return }
|
if !handlesMouse { return }
|
||||||
childPosition := element.childPosition(child)
|
childPosition := element.childPosition(child)
|
||||||
child.HandleScroll(x - childPosition.X, y - childPosition.Y, deltaX, deltaY)
|
child.HandleMouseScroll(x - childPosition.X, y - childPosition.Y, deltaX, deltaY)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (element *Container) HandleKeyDown (
|
func (element *Container) HandleKeyDown (
|
||||||
@ -245,7 +266,9 @@ func (element *Container) Selected () (selected bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (element *Container) Select () {
|
func (element *Container) Select () {
|
||||||
element.core.RequestSelection()
|
if element.onSelectionRequest != nil {
|
||||||
|
element.onSelectionRequest()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (element *Container) HandleSelection (direction tomo.SelectionDirection) (ok bool) {
|
func (element *Container) HandleSelection (direction tomo.SelectionDirection) (ok bool) {
|
||||||
@ -300,10 +323,14 @@ func (element *Container) HandleSelection (direction tomo.SelectionDirection) (o
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (element *Container) MinimumHeightFor (width int) (height int) {
|
func (element *Container) FlexibleHeightFor (width int) (height int) {
|
||||||
return element.layout.MinimumHeightFor(element.children, width)
|
return element.layout.MinimumHeightFor(element.children, width)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (element *Container) OnFlexibleHeightChange (callback func ()) {
|
||||||
|
element.onFlexibleHeightChange = callback
|
||||||
|
}
|
||||||
|
|
||||||
func (element *Container) HandleDeselection () {
|
func (element *Container) HandleDeselection () {
|
||||||
element.selected = false
|
element.selected = false
|
||||||
element.forSelected (func (child tomo.Selectable) bool {
|
element.forSelected (func (child tomo.Selectable) bool {
|
||||||
@ -312,6 +339,16 @@ func (element *Container) HandleDeselection () {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (element *Container) OnSelectionRequest (callback func () (granted bool)) {
|
||||||
|
element.onSelectionRequest = callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (element *Container) OnSelectionMotionRequest (
|
||||||
|
callback func (direction tomo.SelectionDirection) (granted bool),
|
||||||
|
) {
|
||||||
|
element.onSelectionMotionRequest = callback
|
||||||
|
}
|
||||||
|
|
||||||
func (element *Container) forSelected (callback func (child tomo.Selectable) bool) {
|
func (element *Container) forSelected (callback func (child tomo.Selectable) bool) {
|
||||||
for _, entry := range element.children {
|
for _, entry := range element.children {
|
||||||
child, selectable := entry.Element.(tomo.Selectable)
|
child, selectable := entry.Element.(tomo.Selectable)
|
||||||
@ -379,7 +416,7 @@ func (element *Container) childSelectionRequestCallback (
|
|||||||
) (
|
) (
|
||||||
granted bool,
|
granted bool,
|
||||||
) {
|
) {
|
||||||
if element.core.RequestSelection() {
|
if element.onSelectionRequest != nil && element.onSelectionRequest() {
|
||||||
element.forSelected (func (child tomo.Selectable) bool {
|
element.forSelected (func (child tomo.Selectable) bool {
|
||||||
child.HandleDeselection()
|
child.HandleDeselection()
|
||||||
return true
|
return true
|
||||||
@ -422,7 +459,7 @@ func (element *Container) drawChildRegion (child tomo.Element, region tomo.Canva
|
|||||||
for _, entry := range element.children {
|
for _, entry := range element.children {
|
||||||
if entry.Element == child {
|
if entry.Element == child {
|
||||||
artist.Paste(element.core, region, entry.Position)
|
artist.Paste(element.core, region, entry.Position)
|
||||||
element.core.PushRegion (
|
element.core.DamageRegion (
|
||||||
region.Bounds().Add(entry.Position))
|
region.Bounds().Add(entry.Position))
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@ type Label struct {
|
|||||||
wrap bool
|
wrap bool
|
||||||
text string
|
text string
|
||||||
drawer artist.TextDrawer
|
drawer artist.TextDrawer
|
||||||
|
|
||||||
|
onFlexibleHeightChange func ()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLabel creates a new label. If wrap is set to true, the text inside will be
|
// NewLabel creates a new label. If wrap is set to true, the text inside will be
|
||||||
@ -38,9 +40,9 @@ func (element *Label) Resize (width, height int) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// MinimumHeightFor returns the reccomended height for this element based on the
|
// FlexibleHeightFor returns the reccomended height for this element based on
|
||||||
// given width in order to allow the text to wrap properly.
|
// the given width in order to allow the text to wrap properly.
|
||||||
func (element *Label) MinimumHeightFor (width int) (height int) {
|
func (element *Label) FlexibleHeightFor (width int) (height int) {
|
||||||
if element.wrap {
|
if element.wrap {
|
||||||
return element.drawer.ReccomendedHeightFor(width)
|
return element.drawer.ReccomendedHeightFor(width)
|
||||||
} else {
|
} else {
|
||||||
@ -49,6 +51,12 @@ func (element *Label) MinimumHeightFor (width int) (height int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OnFlexibleHeightChange sets a function to be called when the parameters
|
||||||
|
// affecting this element's flexible height are changed.
|
||||||
|
func (element *Label) OnFlexibleHeightChange (callback func ()) {
|
||||||
|
element.onFlexibleHeightChange = callback
|
||||||
|
}
|
||||||
|
|
||||||
// SetText sets the label's text.
|
// SetText sets the label's text.
|
||||||
func (element *Label) SetText (text string) {
|
func (element *Label) SetText (text string) {
|
||||||
if element.text == text { return }
|
if element.text == text { return }
|
||||||
@ -59,7 +67,7 @@ func (element *Label) SetText (text string) {
|
|||||||
|
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +86,7 @@ func (element *Label) SetWrap (wrap bool) {
|
|||||||
|
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +96,9 @@ func (element *Label) updateMinimumSize () {
|
|||||||
if em < 1 { em = theme.Padding() }
|
if em < 1 { em = theme.Padding() }
|
||||||
element.core.SetMinimumSize (
|
element.core.SetMinimumSize (
|
||||||
em, element.drawer.LineHeight().Round())
|
em, element.drawer.LineHeight().Round())
|
||||||
element.core.NotifyFlexibleHeightChange()
|
if element.onFlexibleHeightChange != nil {
|
||||||
|
element.onFlexibleHeightChange()
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
bounds := element.drawer.LayoutBounds()
|
bounds := element.drawer.LayoutBounds()
|
||||||
element.core.SetMinimumSize(bounds.Dx(), bounds.Dy())
|
element.core.SetMinimumSize(bounds.Dx(), bounds.Dy())
|
||||||
|
@ -34,7 +34,7 @@ func (element *ProgressBar) SetProgress (progress float64) {
|
|||||||
element.progress = progress
|
element.progress = progress
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,8 @@ type ScrollContainer struct {
|
|||||||
enabled bool
|
enabled bool
|
||||||
bounds image.Rectangle
|
bounds image.Rectangle
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO event handlers
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewScrollContainer creates a new scroll container with the specified scroll
|
// NewScrollContainer creates a new scroll container with the specified scroll
|
||||||
@ -52,23 +54,18 @@ func (element *ScrollContainer) Resize (width, height int) {
|
|||||||
func (element *ScrollContainer) Adopt (child tomo.Scrollable) {
|
func (element *ScrollContainer) Adopt (child tomo.Scrollable) {
|
||||||
// disown previous child if it exists
|
// disown previous child if it exists
|
||||||
if element.child != nil {
|
if element.child != nil {
|
||||||
element.child.SetParentHooks (tomo.ParentHooks { })
|
element.clearChildEventHandlers(child)
|
||||||
if previousChild, ok := element.child.(tomo.Selectable); ok {
|
|
||||||
if previousChild.Selected() {
|
|
||||||
previousChild.HandleDeselection()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// adopt new child
|
// adopt new child
|
||||||
element.child = child
|
element.child = child
|
||||||
if child != nil {
|
if child != nil {
|
||||||
child.SetParentHooks (tomo.ParentHooks {
|
// child.SetParentHooks (tomo.ParentHooks {
|
||||||
// Draw: window.childDrawCallback,
|
// Draw: window.childDrawCallback,
|
||||||
// MinimumSizeChange: window.childMinimumSizeChangeCallback,
|
// MinimumSizeChange: window.childMinimumSizeChangeCallback,
|
||||||
// FlexibleHeightChange: window.resizeChildToFit,
|
// FlexibleHeightChange: window.resizeChildToFit,
|
||||||
// SelectionRequest: window.childSelectionRequestCallback,
|
// SelectionRequest: window.childSelectionRequestCallback,
|
||||||
})
|
// })
|
||||||
|
|
||||||
// TODO: somehow inform the core that we do not in fact want to
|
// TODO: somehow inform the core that we do not in fact want to
|
||||||
// redraw the element.
|
// redraw the element.
|
||||||
@ -84,6 +81,21 @@ func (element *ScrollContainer) Adopt (child tomo.Scrollable) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (element *ScrollContainer) clearChildEventHandlers (child tomo.Element) {
|
||||||
|
child.OnDamage(nil)
|
||||||
|
child.OnMinimumSizeChange(nil)
|
||||||
|
if child0, ok := child.(tomo.Selectable); ok {
|
||||||
|
child0.OnSelectionRequest(nil)
|
||||||
|
child0.OnSelectionMotionRequest(nil)
|
||||||
|
if child0.Selected() {
|
||||||
|
child0.HandleDeselection()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if child0, ok := child.(tomo.Flexible); ok {
|
||||||
|
child0.OnFlexibleHeightChange(nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (element *ScrollContainer) recalculate () {
|
func (element *ScrollContainer) recalculate () {
|
||||||
horizontal := &element.horizontal
|
horizontal := &element.horizontal
|
||||||
vertical := &element.vertical
|
vertical := &element.vertical
|
||||||
|
@ -34,7 +34,7 @@ func (element *Spacer) SetLine (line bool) {
|
|||||||
element.line = line
|
element.line = line
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,6 +25,9 @@ type TextBox struct {
|
|||||||
|
|
||||||
onKeyDown func (tomo.Key, tomo.Modifiers, bool) (bool)
|
onKeyDown func (tomo.Key, tomo.Modifiers, bool) (bool)
|
||||||
onChange func ()
|
onChange func ()
|
||||||
|
onSelectionRequest func () (granted bool)
|
||||||
|
onSelectionMotionRequest func (tomo.SelectionDirection) (granted bool)
|
||||||
|
onScrollBoundsChange func ()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTextBox creates a new text box with the specified placeholder text, and
|
// NewTextBox creates a new text box with the specified placeholder text, and
|
||||||
@ -119,7 +122,7 @@ func (element *TextBox) HandleKeyDown (
|
|||||||
|
|
||||||
if altered && element.core.HasImage () {
|
if altered && element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +133,9 @@ func (element *TextBox) Selected () (selected bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (element *TextBox) Select () {
|
func (element *TextBox) Select () {
|
||||||
element.core.RequestSelection()
|
if element.onSelectionRequest != nil {
|
||||||
|
element.onSelectionRequest()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (element *TextBox) HandleSelection (
|
func (element *TextBox) HandleSelection (
|
||||||
@ -147,7 +152,7 @@ func (element *TextBox) HandleSelection (
|
|||||||
element.selected = true
|
element.selected = true
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -156,16 +161,26 @@ func (element *TextBox) HandleDeselection () {
|
|||||||
element.selected = false
|
element.selected = false
|
||||||
if element.core.HasImage() {
|
if element.core.HasImage() {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (element *TextBox) OnSelectionRequest (callback func () (granted bool)) {
|
||||||
|
element.onSelectionRequest = callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (element *TextBox) OnSelectionMotionRequest (
|
||||||
|
callback func (direction tomo.SelectionDirection) (granted bool),
|
||||||
|
) {
|
||||||
|
element.onSelectionMotionRequest = callback
|
||||||
|
}
|
||||||
|
|
||||||
func (element *TextBox) SetEnabled (enabled bool) {
|
func (element *TextBox) SetEnabled (enabled bool) {
|
||||||
if element.enabled == enabled { return }
|
if element.enabled == enabled { return }
|
||||||
element.enabled = enabled
|
element.enabled = enabled
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,7 +193,7 @@ func (element *TextBox) SetPlaceholder (placeholder string) {
|
|||||||
element.updateMinimumSize()
|
element.updateMinimumSize()
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,7 +210,7 @@ func (element *TextBox) SetValue (text string) {
|
|||||||
|
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,9 +261,11 @@ func (element *TextBox) ScrollTo (position image.Point) {
|
|||||||
|
|
||||||
if element.core.HasImage () {
|
if element.core.HasImage () {
|
||||||
element.draw()
|
element.draw()
|
||||||
element.core.PushAll()
|
element.core.DamageAll()
|
||||||
|
}
|
||||||
|
if element.onScrollBoundsChange != nil {
|
||||||
|
element.onScrollBoundsChange()
|
||||||
}
|
}
|
||||||
element.core.NotifyContentBoundsChange()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ScrollAxes returns the supported axes for scrolling.
|
// ScrollAxes returns the supported axes for scrolling.
|
||||||
@ -286,7 +303,9 @@ func (element *TextBox) scrollToCursor () {
|
|||||||
element.scroll -= minX - cursorPosition.X
|
element.scroll -= minX - cursorPosition.X
|
||||||
if element.scroll < 0 { element.scroll = 0 }
|
if element.scroll < 0 { element.scroll = 0 }
|
||||||
}
|
}
|
||||||
element.core.NotifyContentBoundsChange()
|
if element.onScrollBoundsChange != nil {
|
||||||
|
element.onScrollBoundsChange()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (element *TextBox) draw () {
|
func (element *TextBox) draw () {
|
||||||
|
Reference in New Issue
Block a user