diff --git a/ui/dialogs/logindialog.go b/ui/dialogs/logindialog.go new file mode 100644 index 0000000..563784d --- /dev/null +++ b/ui/dialogs/logindialog.go @@ -0,0 +1,66 @@ +package dialogs + +import ( + "supersonic/backend" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/widget" +) + +type LoginDialog struct { + widget.BaseWidget + + OnSubmit func(server *backend.ServerConfig, password string) + + servers []*backend.ServerConfig + serverSelect *widget.Select + passField *widget.Entry + + container *fyne.Container +} + +var _ fyne.Widget = (*LoginDialog)(nil) + +func NewLoginDialog(servers []*backend.ServerConfig) *LoginDialog { + l := &LoginDialog{servers: servers} + l.ExtendBaseWidget(l) + titleLabel := widget.NewLabel("Login to Server") + titleLabel.TextStyle.Bold = true + serverNames := make([]string, len(servers)) + for i, s := range servers { + serverNames[i] = s.Nickname + } + l.serverSelect = widget.NewSelect(serverNames, func(_ string) {}) + l.serverSelect.SetSelectedIndex(0) + l.passField = widget.NewPasswordEntry() + okBtn := widget.NewButton("OK", l.onSubmit) + + l.container = container.NewVBox( + container.NewHBox(layout.NewSpacer(), titleLabel, layout.NewSpacer()), + container.New(layout.NewFormLayout(), + widget.NewLabel("Server"), + l.serverSelect, + widget.NewLabel("Password"), + l.passField), + widget.NewSeparator(), + container.NewHBox(layout.NewSpacer(), okBtn), + ) + return l +} + +func (l *LoginDialog) CreateRenderer() fyne.WidgetRenderer { + return widget.NewSimpleRenderer(l.container) +} + +func (l *LoginDialog) MinSize() fyne.Size { + l.ExtendBaseWidget(l) + return fyne.NewSize(300, l.container.MinSize().Height) +} + +func (l *LoginDialog) onSubmit() { + if l.OnSubmit != nil { + l.OnSubmit(l.servers[l.serverSelect.SelectedIndex()], l.passField.Text) + } +}