Progress on scrollbar

This commit is contained in:
Sasha Koshka 2023-09-14 20:34:56 -04:00
parent 2251d33ac7
commit 134f8016c1

View File

@ -65,7 +65,11 @@ func (this *Scrollbar) Link (box tomo.ContentBox) event.Cookie {
} }
func (this *Scrollbar) handleLinkedContentBoundsChange () { func (this *Scrollbar) handleLinkedContentBoundsChange () {
// TODO if this.layout.linked == 0 { return }
this.layout.value =
this.layout.contentPos() /
(this.layout.contentLength() - this.layout.viewportLength())
this.SetLayout(this.layout)
} }
// SetValue sets the value of the scrollbar between 0 and 1, where 0 is scrolled // SetValue sets the value of the scrollbar between 0 and 1, where 0 is scrolled
@ -79,13 +83,13 @@ func (this *Scrollbar) SetValue (value float64) {
// all the way to the left/top, and 1 is scrolled all the way to the // all the way to the left/top, and 1 is scrolled all the way to the
// right/bottom. // right/bottom.
func (this *Scrollbar) Value () float64 { func (this *Scrollbar) Value () float64 {
// TODO if this.layout.linked == nil { return 0 }
return 0 return this.layout.value
} }
// OnValueChange specifies a function to be called when the position of the // OnValueChange specifies a function to be called when the position of the
// scrollbar changes. // scrollbar changes.
func (this *Slider) OnValueChange (callback func ()) event.Cookie { func (this *Scrollbar) OnValueChange (callback func ()) event.Cookie {
return this.on.valueChange.Connect(callback) return this.on.valueChange.Connect(callback)
} }
@ -216,7 +220,8 @@ func (this *scrollbarCookie) Close () {
type scrollbarLayout struct { type scrollbarLayout struct {
vertical bool vertical bool
linked tomo.ContentBox value float64
linked tomo.ContentBox
} }
func (scrollbarLayout) MinimumSize (hints tomo.LayoutHints, boxes []tomo.Box) image.Point { func (scrollbarLayout) MinimumSize (hints tomo.LayoutHints, boxes []tomo.Box) image.Point {
@ -229,13 +234,40 @@ func (this scrollbarLayout) Arrange (hints tomo.LayoutHints, boxes []tomo.Box) {
handle := image.Rectangle { Max: boxes[0].MinimumSize() } handle := image.Rectangle { Max: boxes[0].MinimumSize() }
gutter := hints.Bounds gutter := hints.Bounds
// TODO // TODO
// - get length of viewport as a percent of length of content // - apply (viewportContentRatio) to length of gutter
// - apply percent to length of gutter
// - constrain to minimum length of handle // - constrain to minimum length of handle
// - set handle to length // - set handle to constrained length
// - get scroll of content as a percent // - apply (value) to length of gutter minus length of handle
// - content pos relative to (content length minus viewport length)
// - apply percent to length of gutter minus length of handler
// - that is the handle position // - that is the handle position
} }
func (this scrollbarLayout) viewportContentRatio () float64 {
if this.linked == nil { return 0 }
return this.viewportLength / this.contentLength
}
func (this scrollbarLayout) viewportLength () float64 {
if this.vertical {
return float64(this.linked.InnerBounds().Dy())
} else {
return float64(this.linked.InnerBounds().Dx())
}
}
func (this scrollbarLayout) contentLength () float64 {
if this.vertical {
return float64(this.linked.ContentBounds().Dy())
} else {
return float64(this.linked.ContentBounds().Dx())
}
}
func (this scrollbarLayout) contentPos () float64 {
if this.vertical {
return float64(this.linked.ContentBounds().Min.Y)
} else {
return float64(this.linked.ContentBounds().Min.X)
}
}