From 19202dc0e87b0fdf49fccd697fba23d0e5e8d96d Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 31 Mar 2023 17:57:10 -0700 Subject: [PATCH] more settings dialog work --- ui/dialogs/settingsdialog.go | 18 ++++++++++++-- ui/widgets/textrestrictedentry.go | 41 +++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 ui/widgets/textrestrictedentry.go diff --git a/ui/dialogs/settingsdialog.go b/ui/dialogs/settingsdialog.go index c8ae3a7..3b19008 100644 --- a/ui/dialogs/settingsdialog.go +++ b/ui/dialogs/settingsdialog.go @@ -2,6 +2,8 @@ package dialogs import ( "supersonic/backend" + "supersonic/ui/widgets" + "unicode" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" @@ -30,10 +32,21 @@ func NewSettingsDialog(config *backend.Config) *SettingsDialog { replayGainSelect := widget.NewSelect([]string{"None", "Album", "Track"}, nil) + percentEntry := widgets.NewTextRestrictedEntry(func(text string, r rune) bool { + return unicode.IsDigit(r) && len(text) < 2 + }) + percentEntry.SetMinCharWidth(2) + tabs := container.NewAppTabs( container.NewTabItem("General", container.NewVBox( widget.NewRichText(&widget.TextSegment{Text: "Scrobbling", Style: boldStyle}), - widget.NewCheckWithData("Send playback statistics to server", binding.BindBool(&config.Scrobbling.Enabled)))), + widget.NewCheckWithData("Send playback statistics to server", binding.BindBool(&config.Scrobbling.Enabled)), + container.NewHBox( + widget.NewLabel("Scrobble when"), + percentEntry, + widget.NewLabel("percent of track is played"), + ), + )), container.NewTabItem("Playback", container.NewVBox( widget.NewRichText(&widget.TextSegment{Text: "ReplayGain", Style: boldStyle}), container.New(layout.NewFormLayout(), @@ -41,7 +54,8 @@ func NewSettingsDialog(config *backend.Config) *SettingsDialog { widget.NewLabel("Prevent clipping"), widget.NewCheckWithData("", binding.BindBool(&config.ReplayGain.PreventClipping)), ), widget.NewSeparator(), - widget.NewCheckWithData("Audio exclusive mode", binding.BindBool(&config.LocalPlayback.AudioExclusive)))), + widget.NewCheckWithData("Audio exclusive mode", binding.BindBool(&config.LocalPlayback.AudioExclusive)), + )), ) s.content = container.NewVBox(tabs, widget.NewSeparator(), container.NewHBox(layout.NewSpacer(), widget.NewButton("Close", func() { diff --git a/ui/widgets/textrestrictedentry.go b/ui/widgets/textrestrictedentry.go new file mode 100644 index 0000000..9f8c83a --- /dev/null +++ b/ui/widgets/textrestrictedentry.go @@ -0,0 +1,41 @@ +package widgets + +import ( + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +type TextRestrictedEntry struct { + widget.Entry + + charAllowed func(string, rune) bool + + minWidth float32 +} + +func NewTextRestrictedEntry(charAllowed func(curText string, r rune) bool) *TextRestrictedEntry { + e := &TextRestrictedEntry{charAllowed: charAllowed} + e.ExtendBaseWidget(e) + return e +} + +func (e *TextRestrictedEntry) TypedRune(r rune) { + if e.charAllowed == nil || e.charAllowed(e.Text, r) { + e.Entry.TypedRune(r) + } +} + +func (e *TextRestrictedEntry) SetMinCharWidth(numChars int) { + e.minWidth = theme.Padding()*2 + fyne.MeasureText(strings.Repeat("W", numChars), + fyne.CurrentApp().Settings().Theme().Size(theme.SizeNameText), e.TextStyle).Width +} + +func (e *TextRestrictedEntry) MinSize() fyne.Size { + if e.minWidth < 0.001 { + return e.Entry.MinSize() + } + return fyne.NewSize(e.minWidth, e.Entry.MinSize().Height) +}