package main import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/data/binding" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/widget" "image/color" ) type UserData struct { Username string } func chatLayout(window fyne.Window, user UserData, c chan string) { window.SetTitle("Сообщения") storage.binding = binding.BindStringList(&storage.data) go runClient(user) list := widget.NewListWithData(storage.binding, func() fyne.CanvasObject { return widget.NewLabel("template") }, func(i binding.DataItem, o fyne.CanvasObject) { o.(*widget.Label).Bind(i.(binding.String)) }) entry := widget.NewEntry() submit := widget.NewButton("Отправить", func() { go sendMessage(user, entry.Text) entry.SetText("") storage.RLock() lastIdx := storage.binding.Length() - 1 list.Select(lastIdx) list.Unselect(lastIdx) storage.RUnlock() }) window.SetContent(container.NewBorder( nil, container.NewBorder(nil, nil, nil, submit, entry), nil, nil, list, )) } func loginLayout(window fyne.Window, c chan string) { window.SetTitle("Войти в чат") label := canvas.NewText("Chat", color.White) label.TextSize = 40 loginLabel := widget.NewLabel("Логин: ") loginEntry := widget.NewEntry() chooseKey := widget.NewButton("Выбрать ключ для подписи", func() { dialog.ShowFileOpen(func(closer fyne.URIReadCloser, err error) { if closer == nil { return } bufSize := 4096 data := make([]byte, 0) buf := make([]byte, bufSize) n := bufSize for n >= bufSize { n, _ = closer.Read(buf) data = append(data, buf...) } _ = closer.Close() }, window) }) loginButton := widget.NewButton("Войти", func() { var user = UserData{ Username: loginEntry.Text, } chatLayout(window, user, c) }) back := widget.NewButton("Назад", func() { startLayout(window, c) }) mainContainer := container.NewCenter(container.NewVBox( container.NewCenter(label), layout.NewSpacer(), container.NewBorder(nil, nil, loginLabel, nil, loginEntry), chooseKey, loginButton, back, )) window.SetContent(mainContainer) } func registerLayout(window fyne.Window, c chan string) { window.SetTitle("Регистрация") label := canvas.NewText("Chat", color.White) label.TextSize = 40 loginLabel := widget.NewLabel("Логин: ") loginEntry := widget.NewEntry() generateKeys := widget.NewButton("Сгенерировать ключи подписи", func() { }) registerButton := widget.NewButton("Зарегистрироваться", func() { }) back := widget.NewButton("Назад", func() { startLayout(window, c) }) window.SetContent(container.NewCenter(container.NewVBox( container.NewCenter(label), layout.NewSpacer(), container.NewBorder(nil, nil, loginLabel, nil, loginEntry), generateKeys, registerButton, back, ))) } func startLayout(window fyne.Window, c chan string) { window.SetTitle("Chat") label := canvas.NewText("Chat", color.White) label.TextSize = 40 login := widget.NewButton("Войти", func() { loginLayout(window, c) }) signup := widget.NewButton("Зарегистрироваться", func() { registerLayout(window, c) }) mainContainer := container.NewCenter(container.NewVBox( container.NewCenter(label), layout.NewSpacer(), login, signup)) window.SetContent(mainContainer) } func main() { myApp := app.New() window := myApp.NewWindow("") channel := make(chan string) startLayout(window, channel) window.ShowAndRun() }