1
0
Fork 0
mirror of https://github.com/diamondburned/cchat-gtk.git synced 2025-02-15 05:22:49 +00:00
cchat-gtk/internal/ui/primitives/autoscroll/autoscroll.go

39 lines
1,020 B
Go
Raw Normal View History

2020-06-04 23:00:41 +00:00
package autoscroll
import "github.com/gotk3/gotk3/gtk"
type ScrolledWindow struct {
gtk.ScrolledWindow
2020-12-21 04:58:27 +00:00
vadj *gtk.Adjustment
2020-06-06 07:44:36 +00:00
Bottomed bool // :floshed:
2020-06-04 23:00:41 +00:00
}
func NewScrolledWindow() *ScrolledWindow {
gtksw, _ := gtk.ScrolledWindowNew(nil, nil)
gtksw.SetProperty("propagate-natural-height", true)
2020-08-20 23:53:13 +00:00
gtksw.SetProperty("window-placement", gtk.CORNER_BOTTOM_LEFT)
2020-06-04 23:00:41 +00:00
2020-12-21 04:58:27 +00:00
sw := &ScrolledWindow{*gtksw, gtksw.GetVAdjustment(), true} // bottomed by default
2020-06-04 23:00:41 +00:00
sw.Connect("size-allocate", func(_ *gtk.ScrolledWindow) {
// We can't really trust Gtk to be competent.
2020-06-06 07:44:36 +00:00
if sw.Bottomed {
2020-06-04 23:00:41 +00:00
sw.ScrollToBottom()
}
})
sw.vadj.Connect("value-changed", func(adj *gtk.Adjustment) {
// Manually check if we're anchored on scroll.
2020-06-06 07:44:36 +00:00
sw.Bottomed = (adj.GetUpper() - adj.GetPageSize()) <= adj.GetValue()
2020-06-04 23:00:41 +00:00
})
return sw
}
// GetVAdjustment overrides gtk.ScrolledWindow's.
func (s *ScrolledWindow) GetVAdjustment() *gtk.Adjustment {
2020-12-21 04:58:27 +00:00
return s.vadj
2020-06-04 23:00:41 +00:00
}
func (s *ScrolledWindow) ScrollToBottom() {
s.vadj.SetValue(s.vadj.GetUpper())
}