summaryrefslogtreecommitdiff
path: root/src/rhlibrary/player_widget.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/rhlibrary/player_widget.go')
-rw-r--r--src/rhlibrary/player_widget.go66
1 files changed, 55 insertions, 11 deletions
diff --git a/src/rhlibrary/player_widget.go b/src/rhlibrary/player_widget.go
index 5440582..032d1b2 100644
--- a/src/rhlibrary/player_widget.go
+++ b/src/rhlibrary/player_widget.go
@@ -25,7 +25,10 @@
package main
import (
+ "time"
+
"code.helsinki.at/rhrd-go/player"
+ "github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
)
@@ -39,7 +42,7 @@ func addPlayButton(grid *gtk.Grid, p *player.PlayerChan) (err error) {
rhdl.Println(err) // TODO: feedback at GUI?
}
})
- grid.Add(btn)
+ grid.Attach(btn, 1, 1, 1, 2)
return
}
@@ -53,7 +56,7 @@ func addPauseButton(grid *gtk.Grid, p *player.PlayerChan) (err error) {
rhdl.Println(err) // TODO: feedback at GUI?
}
})
- grid.Add(btn)
+ grid.Attach(btn, 2, 1, 1, 2)
return
}
@@ -67,16 +70,55 @@ func addStopButton(grid *gtk.Grid, p *player.PlayerChan) (err error) {
rhdl.Println(err) // TODO: feedback at GUI?
}
})
- grid.Add(btn)
+ grid.Attach(btn, 3, 1, 1, 2)
return
}
func addMeter(grid *gtk.Grid, p *player.PlayerChan) error {
widget, err := getVUMeterWidget(p)
- if err == nil {
- grid.Add(widget)
+ if err != nil {
+ return err
+ }
+ grid.Attach(widget, 4, 1, 1, 1)
+ return nil
+}
+
+func addScrubber(grid *gtk.Grid, p *player.PlayerChan) (err error) {
+ var scale *gtk.Scale
+ if scale, err = gtk.ScaleNew(gtk.ORIENTATION_HORIZONTAL, nil); err != nil {
+ return
}
- return err
+ if err = scale.SetProperty("draw-value", false); err != nil {
+ return
+ }
+ scale.SetRange(0, 1)
+ scale.SetValue(0)
+
+ p.AddUpdateHandler(func(length time.Duration, pos time.Duration, meter player.Meter, userdata interface{}) bool {
+ glib.IdleAdd(func() { scale.SetValue(float64(pos) / float64(length)) })
+ return true
+ }, nil)
+
+ grid.Attach(scale, 4, 2, 2, 1)
+ return
+}
+
+func addPlayTime(grid *gtk.Grid, p *player.PlayerChan) (err error) {
+ var label *gtk.Label
+ if label, err = gtk.LabelNew("00:00:00.0"); err != nil {
+ return err
+ }
+
+ p.AddUpdateHandler(func(length time.Duration, pos time.Duration, meter player.Meter, userdata interface{}) bool {
+ glib.IdleAdd(func() {
+ t := time.Unix(0, 0).UTC().Add(pos)
+ label.SetText(t.Format("15:04:05.0"))
+ })
+ return true
+ }, nil)
+
+ grid.Attach(label, 5, 1, 1, 1)
+ return nil
}
func getPlayerWidget(p *player.PlayerChan) (gtk.IWidget, error) {
@@ -100,11 +142,13 @@ func getPlayerWidget(p *player.PlayerChan) (gtk.IWidget, error) {
if err = addMeter(grid, p); err != nil {
return nil, err
}
-
- var frame *gtk.Frame
- if frame, err = gtk.FrameNew("player"); err != nil {
+ if err = addScrubber(grid, p); err != nil {
+ return nil, err
+ }
+ if err = addPlayTime(grid, p); err != nil {
return nil, err
}
- frame.Add(grid)
- return frame, nil
+
+ grid.SetHAlign(gtk.ALIGN_CENTER)
+ return grid, nil
}