2023-03-31 03:19:04 +00:00
|
|
|
package elements
|
2023-01-18 01:16:03 +00:00
|
|
|
|
|
|
|
import "image"
|
2023-03-31 05:06:29 +00:00
|
|
|
import "git.tebibyte.media/sashakoshka/tomo"
|
2023-01-18 01:16:03 +00:00
|
|
|
import "git.tebibyte.media/sashakoshka/tomo/elements/core"
|
2023-03-31 05:06:29 +00:00
|
|
|
import "git.tebibyte.media/sashakoshka/tomo/default/theme"
|
|
|
|
import "git.tebibyte.media/sashakoshka/tomo/default/config"
|
2023-01-18 01:16:03 +00:00
|
|
|
|
|
|
|
// ProgressBar displays a visual indication of how far along a task is.
|
|
|
|
type ProgressBar struct {
|
|
|
|
*core.Core
|
|
|
|
core core.CoreControl
|
|
|
|
progress float64
|
2023-02-08 05:22:40 +00:00
|
|
|
|
2023-02-08 19:36:14 +00:00
|
|
|
config config.Wrapped
|
|
|
|
theme theme.Wrapped
|
2023-01-18 01:16:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewProgressBar creates a new progress bar displaying the given progress
|
|
|
|
// level.
|
|
|
|
func NewProgressBar (progress float64) (element *ProgressBar) {
|
2023-02-08 19:36:14 +00:00
|
|
|
element = &ProgressBar { progress: progress }
|
2023-03-31 05:06:29 +00:00
|
|
|
element.theme.Case = tomo.C("tomo", "progressBar")
|
2023-03-15 05:41:23 +00:00
|
|
|
element.Core, element.core = core.NewCore(element, element.draw)
|
2023-04-03 20:12:53 +00:00
|
|
|
element.updateMinimumSize()
|
2023-01-18 01:16:03 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-02-08 05:22:40 +00:00
|
|
|
// SetProgress sets the progress level of the bar.
|
|
|
|
func (element *ProgressBar) SetProgress (progress float64) {
|
|
|
|
if progress == element.progress { return }
|
|
|
|
element.progress = progress
|
2023-02-07 16:27:59 +00:00
|
|
|
if element.core.HasImage() {
|
|
|
|
element.draw()
|
|
|
|
element.core.DamageAll()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-08 05:22:40 +00:00
|
|
|
// SetTheme sets the element's theme.
|
2023-03-31 05:06:29 +00:00
|
|
|
func (element *ProgressBar) SetTheme (new tomo.Theme) {
|
2023-02-08 19:36:14 +00:00
|
|
|
if new == element.theme.Theme { return }
|
|
|
|
element.theme.Theme = new
|
2023-02-08 05:22:40 +00:00
|
|
|
element.updateMinimumSize()
|
|
|
|
element.redo()
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetConfig sets the element's configuration.
|
2023-03-31 05:06:29 +00:00
|
|
|
func (element *ProgressBar) SetConfig (new tomo.Config) {
|
2023-02-08 19:36:14 +00:00
|
|
|
if new == nil || new == element.config.Config { return }
|
|
|
|
element.config.Config = new
|
2023-02-08 05:22:40 +00:00
|
|
|
element.updateMinimumSize()
|
|
|
|
element.redo()
|
|
|
|
}
|
|
|
|
|
2023-04-03 20:12:53 +00:00
|
|
|
func (element *ProgressBar) updateMinimumSize() {
|
2023-03-31 05:06:29 +00:00
|
|
|
padding := element.theme.Padding(tomo.PatternSunken)
|
|
|
|
innerPadding := element.theme.Padding(tomo.PatternMercury)
|
2023-02-08 05:22:40 +00:00
|
|
|
element.core.SetMinimumSize (
|
2023-03-01 00:00:34 +00:00
|
|
|
padding.Horizontal() + innerPadding.Horizontal(),
|
|
|
|
padding.Vertical() + innerPadding.Vertical())
|
2023-02-08 05:22:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (element *ProgressBar) redo () {
|
2023-01-18 01:16:03 +00:00
|
|
|
if element.core.HasImage() {
|
|
|
|
element.draw()
|
2023-01-19 21:49:34 +00:00
|
|
|
element.core.DamageAll()
|
2023-01-18 01:16:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (element *ProgressBar) draw () {
|
2023-01-31 21:18:10 +00:00
|
|
|
bounds := element.Bounds()
|
2023-01-18 01:16:03 +00:00
|
|
|
|
2023-03-31 05:06:29 +00:00
|
|
|
pattern := element.theme.Pattern(tomo.PatternSunken, tomo.State { })
|
|
|
|
padding := element.theme.Padding(tomo.PatternSunken)
|
2023-02-27 03:20:17 +00:00
|
|
|
pattern.Draw(element.core, bounds)
|
|
|
|
bounds = padding.Apply(bounds)
|
2023-01-18 01:16:03 +00:00
|
|
|
meterBounds := image.Rect (
|
2023-01-29 06:49:01 +00:00
|
|
|
bounds.Min.X, bounds.Min.Y,
|
|
|
|
bounds.Min.X + int(float64(bounds.Dx()) * element.progress),
|
|
|
|
bounds.Max.Y)
|
2023-03-31 05:06:29 +00:00
|
|
|
mercury := element.theme.Pattern(tomo.PatternMercury, tomo.State { })
|
2023-03-12 06:15:36 +00:00
|
|
|
mercury.Draw(element.core, meterBounds)
|
2023-01-18 01:16:03 +00:00
|
|
|
}
|