Path: blob/main/internal/window/login/loading/pulsatingbar.go
452 views
package loading12import (3"github.com/diamondburned/gotk4/pkg/glib/v2"4"github.com/diamondburned/gotk4/pkg/gtk/v4"5"github.com/diamondburned/gotkit/gtkutil/cssutil"6)78type PulsatingFlags uint8910const (11// PulseFast pulses at double speed.12PulseFast PulsatingFlags = 1 << iota13// PulseBarOSD adds the .osd class.14PulseBarOSD15)1617func (f PulsatingFlags) has(these PulsatingFlags) bool {18return f&these == these19}2021// PulsatingBar is a bar that moves back and forth asynchronously for as long as22// it is visible (mapped).23type PulsatingBar struct {24*gtk.Box25Bar *gtk.ProgressBar26}2728const pulsateRate = 1000 / 30 // 30Hz update2930var pulsatingBarCSS = cssutil.Applier("loading-pulsatingbar", `31.loading-pulsatingbar {32opacity: 0;33transition: all 0.15s ease-in-out;34}35.loading-pulsatingbar.loading {36opacity: 1;37}38.loading-pulsatingbar,39.loading-pulsatingbar progerssbar trough {40min-height: 4px;41}42.loading-pulsatingbar progressbar.osd {43margin: 0;44padding: 0;45}46`)4748// NewPulsatingBar creates a new PulsatingBar.49func NewPulsatingBar(flags PulsatingFlags) *PulsatingBar {50p := PulsatingBar{}51p.Bar = gtk.NewProgressBar()52p.Bar.Hide()5354p.Box = gtk.NewBox(gtk.OrientationVertical, 0)55p.Box.Append(p.Bar)56pulsatingBarCSS(p)5758if flags.has(PulseFast) {59p.Bar.SetPulseStep(0.1)60} else {61p.Bar.SetPulseStep(0.05)62}6364if flags.has(PulseBarOSD) {65p.Box.AddCSSClass("osd")66p.Bar.AddCSSClass("osd")67}6869var source glib.SourceHandle70p.Bar.ConnectShow(func() {71p.Bar.SetFraction(0)72source = glib.TimeoutAdd(pulsateRate, func() bool {73p.Bar.Pulse()74return true75})76})77p.Bar.ConnectHide(func() {78if source > 0 {79glib.SourceRemove(source)80source = 081}82})8384return &p85}8687func (p *PulsatingBar) Show() {88p.Bar.Show()89p.AddCSSClass("loading")90}9192func (p *PulsatingBar) Hide() {93p.Bar.Hide()94p.RemoveCSSClass("loading")95}969798