115 lines
3.3 KiB
Go
115 lines
3.3 KiB
Go
package gui
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
|
||
"github.com/diamondburned/gotk4-adwaita/pkg/adw"
|
||
"github.com/diamondburned/gotk4/pkg/gtk/v4"
|
||
"suruatoel.xyz/mcg/data"
|
||
"suruatoel.xyz/mcg/internal/common"
|
||
)
|
||
|
||
type serverPanel struct {
|
||
*adw.Bin
|
||
|
||
toolbar *gtk.Box
|
||
statusFile *gtk.Label
|
||
statusAudio *gtk.Label
|
||
statusBitrate *gtk.Label
|
||
statusErrer *gtk.Label
|
||
statsArtist *gtk.Label
|
||
statsAlbums *gtk.Label
|
||
statsSongs *gtk.Label
|
||
statsDBPlaytime *gtk.Label
|
||
statsPlaytime *gtk.Label
|
||
statsUptime *gtk.Label
|
||
outputDevices *gtk.ListBox
|
||
|
||
outputDeviceChangeCB OutputDeviceChangeCB
|
||
}
|
||
|
||
type OutputDeviceChangeCB func(device *common.OutputDevice, enable bool)
|
||
|
||
func newServerPanel() *serverPanel {
|
||
panel := serverPanel{}
|
||
panel.loadWidgets()
|
||
|
||
return &panel
|
||
}
|
||
|
||
func (p *serverPanel) loadWidgets() {
|
||
builder := gtk.NewBuilderFromString(data.ServerPanelXML)
|
||
|
||
p.Bin = builder.GetObject("McgServerPanel").Cast().(*adw.Bin)
|
||
p.toolbar = builder.GetObject("toolbar").Cast().(*gtk.Box)
|
||
p.statusFile = builder.GetObject("status_file").Cast().(*gtk.Label)
|
||
p.statusAudio = builder.GetObject("status_audio").Cast().(*gtk.Label)
|
||
p.statusBitrate = builder.GetObject("status_bitrate").Cast().(*gtk.Label)
|
||
p.statusErrer = builder.GetObject("status_error").Cast().(*gtk.Label)
|
||
p.statsArtist = builder.GetObject("stats_artists").Cast().(*gtk.Label)
|
||
p.statsAlbums = builder.GetObject("stats_albums").Cast().(*gtk.Label)
|
||
p.statsSongs = builder.GetObject("stats_songs").Cast().(*gtk.Label)
|
||
p.statsDBPlaytime = builder.GetObject("stats_dbplaytime").Cast().(*gtk.Label)
|
||
p.statsPlaytime = builder.GetObject("stats_playtime").Cast().(*gtk.Label)
|
||
p.statsUptime = builder.GetObject("stats_uptime").Cast().(*gtk.Label)
|
||
p.outputDevices = builder.GetObject("output_devices").Cast().(*gtk.ListBox)
|
||
}
|
||
|
||
func (p *serverPanel) ReceiveOutputDeviceChange(callback OutputDeviceChangeCB) {
|
||
p.outputDeviceChangeCB = callback
|
||
}
|
||
|
||
func (p *serverPanel) Toolbar() gtk.Widgetter {
|
||
return p.toolbar
|
||
}
|
||
|
||
func (p *serverPanel) Status(file, audio, bitrate, errorMessage string) {
|
||
p.statusFile.SetText(file)
|
||
p.statusAudio.SetText(p.formatAudio(audio))
|
||
p.statusBitrate.SetText(p.formatBitrate(bitrate))
|
||
p.statusErrer.SetText(errorMessage)
|
||
}
|
||
|
||
func (p *serverPanel) formatAudio(audio string) string {
|
||
parts := strings.Split(audio, ":")
|
||
if len(parts) == 3 {
|
||
return fmt.Sprintf("%s Hz, %s bit, %s channels", parts[0], parts[1], parts[2])
|
||
}
|
||
|
||
return ""
|
||
}
|
||
|
||
func (p *serverPanel) formatBitrate(bitrate string) string {
|
||
if bitrate != "" {
|
||
return bitrate + " kb/s"
|
||
}
|
||
|
||
return ""
|
||
}
|
||
|
||
func (p *serverPanel) Statistics(artists, albums, songs, dbplaytime, playtime, uptime string) {
|
||
p.statsArtist.SetText(artists)
|
||
p.statsAlbums.SetText(albums)
|
||
p.statsSongs.SetText(songs)
|
||
p.statsDBPlaytime.SetText(dbplaytime)
|
||
p.statsPlaytime.SetText(playtime)
|
||
p.statsUptime.SetText(uptime)
|
||
}
|
||
|
||
func (p *serverPanel) OutputDevices(devices []*common.OutputDevice) {
|
||
p.outputDevices.RemoveAll()
|
||
for _, device := range devices {
|
||
deviceButton := gtk.NewCheckButtonWithLabel(device.Name)
|
||
if device.Enabled {
|
||
deviceButton.SetActive(true)
|
||
}
|
||
deviceButton.ConnectToggled(func() {
|
||
if p.outputDeviceChangeCB != nil {
|
||
p.outputDeviceChangeCB(device, deviceButton.Active())
|
||
}
|
||
})
|
||
|
||
p.outputDevices.Insert(deviceButton, -1)
|
||
}
|
||
}
|