diff --git a/cmd/gui/gui.go b/cmd/gui/gui.go index 2ff3a68..2aaa229 100644 --- a/cmd/gui/gui.go +++ b/cmd/gui/gui.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "os" + "time" "github.com/knadh/koanf" "github.com/knadh/koanf/parsers/toml" @@ -63,6 +64,10 @@ func main() { return } + // Give the config UI a chance to save and exit clean + time.Sleep(time.Minute) + + // Bail on slideshow if there is a config change so it restarts with updated config log.Fatalf("Config file changed! Exiting!") }) diff --git a/ui/config.go b/ui/config.go index b8e6e6a..cb56f10 100644 --- a/ui/config.go +++ b/ui/config.go @@ -38,6 +38,11 @@ const ( PAGE_POWEROFF = "PAGE_POWEROFF" ) +// Bullshit to remove an element from a slice +func remove(s []string, index int) []string { + return append(s[:index], s[index+1:]...) +} + // Housekeeping var app *tview.Application var main *tview.Flex @@ -54,7 +59,7 @@ func ConfigGui(pfconfig *koanf.Koanf) { meminfo := &procmeminfo.MemInfo{} err := meminfo.Update() if err != nil { - log.Printf("Error getting memory info : %s", err) + log.Fatalf("Error getting memory info : %s", err) } // Network interfaces for status panel @@ -181,6 +186,7 @@ func ConfigGui(pfconfig *koanf.Koanf) { // Select Albums Form selectAlbumsForm := tview.NewForm() configSelectedAlbums := pfconfig.Strings(config.CONFIG_KEY_ALBUMS_SELECTED) + albumCheckboxes := []*tview.Checkbox{} for _, album := range albums { albumSelected := false for _, configSelectedAlbum := range configSelectedAlbums { @@ -191,7 +197,11 @@ func ConfigGui(pfconfig *koanf.Koanf) { albumSelected = true } } - selectAlbumsForm.AddCheckbox(album, albumSelected, nil) + albumCheckbox := tview.NewCheckbox() + albumCheckbox.SetLabel(album) + albumCheckbox.SetChecked(albumSelected) + albumCheckboxes = append(albumCheckboxes, albumCheckbox) + selectAlbumsForm.AddFormItem(albumCheckbox) } selectAlbumsForm.AddButton("Apply", resetMain) selectAlbumsForm.AddButton("Cancel", resetMain) @@ -377,10 +387,37 @@ func ConfigGui(pfconfig *koanf.Koanf) { AddButtons([]string{"Yes", "Cancel"}). SetDoneFunc(func(buttonIndex int, buttonLabel string) { if buttonLabel == "Yes" { - // Housekeeping var for data to be written to disk - var hdmiForDisk bytes.Buffer + // Deal with selected albums + for _, checkbox := range albumCheckboxes { + checkboxLabel := checkbox.GetLabel() + // Undo beautification of checkbox label + if checkboxLabel == "Main Folder" { + checkboxLabel = "/" + } + // Track whether or not we need to add OR remove from config + selected := checkbox.IsChecked() + inConfig := false + configIndex := 0 + + // Walk the existing config values and bail if/when we find the album + for configIndex = range configSelectedAlbums { + if checkboxLabel == configSelectedAlbums[configIndex] { + inConfig = true + break + } + } + // We need to add to the config + if selected && !inConfig { + configSelectedAlbums = append(configSelectedAlbums, checkboxLabel) + } + // We need to remove from the config + if !selected && inConfig { + configSelectedAlbums = remove(configSelectedAlbums, configIndex) + } + } // Apply HDMI configuration (on/off) + var hdmiForDisk bytes.Buffer valueForTemplate := utils.SystemdTimer{OnCalendar: configHDMIOn} screenOn, err := template.New("screenon.systemd.timer").Parse(utils.SCREEN_ON_DOT_TIMER) if err != nil { @@ -409,8 +446,11 @@ func ConfigGui(pfconfig *koanf.Koanf) { // Apply configuration updates to main config manager prior to saving pfconfig.Load(confmap.Provider(map[string]interface{}{ - config.CONFIG_KEY_HDMI_ON: configHDMIOn, - config.CONFIG_KEY_HDMI_OFF: configHDMIOff, + config.CONFIG_KEY_SLIDESHOW_INTERVAL: configSlideInterval, + config.CONFIG_KEY_SLIDESHOW_RESTART_INTERVAL: configRestartInterval, + config.CONFIG_KEY_HDMI_ON: configHDMIOn, + config.CONFIG_KEY_HDMI_OFF: configHDMIOff, + config.CONFIG_KEY_ALBUMS_SELECTED: configSelectedAlbums, }, "."), nil) // Save configuration