tricrypt/cmd/cfyne/scenes.go

378 lines
10 KiB
Go
Raw Permalink Normal View History

2024-07-12 19:33:27 +02:00
package main
import (
"errors"
"fmt"
"log"
"strconv"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
// "fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
com "git.qowevisa.me/Qowevisa/gotell/communication"
"git.qowevisa.me/Qowevisa/gotell/extfyne/layouts"
"git.qowevisa.me/Qowevisa/gotell/extfyne/widgets"
)
func GetNicknameScene(intercom chan *com.Message) *fyne.Container {
// button := widget.NewButtonWithIcon(
// "Send",
// theme.ConfirmIcon(),
// getSendMessageFuncToIntercom(intercom, com.ID_CLIENT_SEND_SERVER_NICKNAME, []byte("test")))
entry := widget.NewEntry()
entry.SetPlaceHolder("Enter Nickname:")
btn := widget.NewButtonWithIcon("Send", theme.MailSendIcon(), func() {
log.Println("Nickname submitted:", entry.Text)
intercom <- &com.Message{
ID: com.ID_CLIENT_SEND_SERVER_NICKNAME,
Data: []byte(entry.Text),
}
})
contentInner := container.New(layout.NewVBoxLayout(), entry, btn)
return container.NewGridWithRows(3,
layout.NewSpacer(),
container.NewGridWithColumns(3,
layout.NewSpacer(),
contentInner,
layout.NewSpacer(),
),
layout.NewSpacer(),
)
}
func GetMainScene(intercom chan *com.Message, cfg MainSceneConfig) (*fyne.Container, *MutableApplication) {
headerWidget := widget.NewLabel(fmt.Sprintf("Hello, %s! Your ID: %d", cfg.UserNickcname, cfg.UserId))
header := container.NewGridWithColumns(3,
layout.NewSpacer(),
headerWidget,
layout.NewSpacer(),
)
linksSS, linksArr := GetLinksSubScene(intercom, header)
linksTab := container.NewTabItemWithIcon("Links", theme.MailComposeIcon(), linksSS)
conSS, conBundle, conWidgets := GetConnectionsSubScene(intercom, header)
connsTab := container.NewTabItemWithIcon("Connections", theme.ComputerIcon(), conSS)
userSS, userBundle, userWidgets := GetUsersSubScene(intercom, header, conBundle.UserShortcutsRev)
usersTab := container.NewTabItemWithIcon("Users", theme.AccountIcon(), userSS)
tabs := container.NewAppTabs(
linksTab,
connsTab,
usersTab,
)
tabs.SetTabLocation(container.TabLocationLeading)
return container.NewGridWithColumns(1,
tabs),
&MutableApplication{
Tabs: MutableStructAboutTabs{
AppTabs: tabs,
LinkTab: linksTab,
LinksBT: "Links",
LinksNoty: 0,
ConnectionTab: connsTab,
ConnsBT: "Connections",
ConnsNoty: 0,
UsersTab: usersTab,
UsersBT: "Users",
UsersNoty: 0,
},
ArrayBundle: BundleOfMutexArrays{
LinksMuAr: linksArr,
UsersMuAr: conBundle.UsersMuAr,
UsersOpts: conBundle.UsersOpts,
UserShortcuts: conBundle.UserShortcuts,
UserShortcutsRev: conBundle.UserShortcutsRev,
Messages: userBundle.Messages,
},
Widgets: MutableStructAboutWidgets{
UsersSelect: conWidgets.UsersSelect,
UserOptsCaretaker: conWidgets.UserOptsCaretaker,
MessagesSelect: userWidgets.MessagesSelect,
MBoardCaretacker: userWidgets.MBoardCaretacker,
MsgButton: userWidgets.MsgButton,
MBoardMap: userWidgets.MBoardMap,
},
}
}
func GetLinksSubScene(intercom chan *com.Message, header *fyne.Container) (*fyne.Container, *MutexLinksArray) {
entry := widget.NewEntry()
entry.SetPlaceHolder("Count:")
entry.Validator = func(s string) error {
val, err := strconv.ParseUint(s, 10, 16)
if err == nil && val == 0 {
return errors.New("Use count can't be 0")
}
return err
}
btn := widget.NewButtonWithIcon("Generate", theme.MailSendIcon(), func() {
count, err := strconv.ParseUint(entry.Text, 10, 16)
if err != nil || count == 0 {
log.Printf("dafuq: GetLinksSubScene: %v ; %d\n", err, count)
return
}
intercom <- &com.Message{
ID: com.ID_CLIENT_SEND_SERVER_LINK,
ToID: uint16(count),
}
})
entry.SetOnValidationChanged(func(err error) {
if err != nil {
btn.Hide()
} else {
if btn.Hidden {
btn.Show()
}
}
})
contentInner := container.NewGridWithColumns(2, entry, btn)
// /
linksMutAt := CreateMutexLinksArray()
linksList := widget.NewList(func() int {
return len(linksMutAt.GetArray())
}, func() fyne.CanvasObject {
return widget.NewLabel("template")
}, func(lii widget.ListItemID, co fyne.CanvasObject) {
link := linksMutAt.Ar[lii]
str := fmt.Sprintf("Count: %d ; %s", link.UseCount, link.Data)
co.(*widget.Label).SetText(str)
},
)
linksList.OnSelected = func(id widget.ListItemID) {
link := linksMutAt.Ar[id]
globalClipboardChannel <- string(link.Data)
}
// //
linksGetEntry := widget.NewEntry()
linksGetEntry.SetPlaceHolder("Link:")
linksGetEntry.Validator = func(s string) error {
validated, err := com.IsThisALinkData(s)
if err != nil {
return err
}
if !validated {
return errors.New("Link is not validated")
}
return nil
}
linksGetBtn := widget.NewButtonWithIcon("Get", theme.MailReplyIcon(), func() {
link := linksGetEntry.Text
validated, err := com.IsThisALinkData(link)
if err != nil {
log.Printf("linksGetBtn: Error: %v\n", err)
return
}
if !validated {
log.Printf("linksGetBtn: Error: link %v not validated\n", link)
return
}
intercom <- &com.Message{
ID: com.ID_CLIENT_ASK_SERVER_LINK,
Data: []byte(link),
}
})
linksGetEntry.SetOnValidationChanged(func(err error) {
if err != nil {
linksGetBtn.Hide()
} else {
if linksGetBtn.Hidden {
linksGetBtn.Show()
}
}
})
contentInner2 := container.NewGridWithColumns(2, linksGetEntry, linksGetBtn)
// /
// //
return container.NewGridWithRows(3,
header,
container.New(
layouts.NewVariableGridWithColumns(
6, []int{2, 1, 3}),
container.NewGridWithRows(3,
container.NewGridWithColumns(3,
layout.NewSpacer(),
widget.NewLabel("Create link:"),
layout.NewSpacer()),
contentInner,
layout.NewSpacer(),
),
layout.NewSpacer(),
linksList,
),
container.New(
layouts.NewVariableGridWithColumns(
6, []int{2, 4}),
container.NewGridWithRows(3,
container.NewGridWithColumns(3,
layout.NewSpacer(),
widget.NewLabel("Get user from link:"),
layout.NewSpacer()),
contentInner2,
layout.NewSpacer(),
),
layout.NewSpacer(),
),
), linksMutAt
}
func GetConnectionsSubScene(intercom chan *com.Message, header *fyne.Container) (*fyne.Container, BundleOfMutexArrays, MutableStructAboutWidgets) {
optionsHeaderLabel := widget.NewLabel("Options for user: ")
usersMuAr := CreateMutexStringArray()
usersOptions := make(map[string]*UserOptions)
userShortcuts := make(map[uint16]string)
userShortcutsRev := make(map[string]uint16)
userOptsCaretaker := container.NewGridWithRows(1)
optsContainer := container.NewGridWithRows(2,
optionsHeaderLabel,
userOptsCaretaker,
)
userSelect := widget.NewSelect(usersMuAr.Ar, func(s string) {
optionsHeaderLabel.SetText(fmt.Sprintf("Options for user: %s", s))
uOpts, exists := usersOptions[s]
if !exists {
log.Printf("GetConnectionsSubScene::1 : TODO!!\n")
// TODO
return
}
userOptsCaretaker.RemoveAll()
userOptsCaretaker.Add(uOpts.OptsContainer)
optsContainer.Refresh()
})
contentInner := container.New(layout.NewVBoxLayout(), userSelect, optsContainer)
return container.New(
layout.NewVBoxLayout(),
header,
container.New(
layout.NewHBoxLayout(),
layout.NewSpacer(),
contentInner,
layout.NewSpacer(),
),
), BundleOfMutexArrays{
UsersMuAr: usersMuAr,
UsersOpts: usersOptions,
UserShortcuts: userShortcuts,
UserShortcutsRev: userShortcutsRev,
}, MutableStructAboutWidgets{
UsersSelect: userSelect,
UserOptsCaretaker: userOptsCaretaker,
}
}
func GetUsersSubScene(intercom chan *com.Message, header *fyne.Container, userShortcutsRev map[string]uint16) (*fyne.Container, BundleOfMutexArrays, MutableStructAboutWidgets) {
msgHeader := widget.NewLabel("Messages With User: ")
usersMessages := make(map[string]*MutexArray[widgets.MBoardMessage])
usersMBoards := make(map[string]*widgets.MessageBoard)
msgEntry := widget.NewEntry()
msgEntry.SetPlaceHolder("Message...")
userMsgSendBtn := widget.NewButtonWithIcon("Send", theme.MailSendIcon(), func() {})
mBoardCareTaker := container.NewGridWithRows(1)
userMsgsSelect := widget.NewSelect([]string{}, func(s string) {
msgHeader.SetText(fmt.Sprintf("Messages With User: %s", s))
msgsMuAr, exists := usersMessages[s]
if !exists {
tmp := CreateMutexArray[widgets.MBoardMessage]()
usersMessages[s] = &tmp
msgsMuAr = &tmp
return
}
mBoardCareTaker.RemoveAll()
mmBoard := widgets.NewMessageBoard(msgsMuAr.Ar)
usersMBoards[s] = mmBoard
mBoardCareTaker.Add(mmBoard)
mBoardCareTaker.Refresh()
id, exists := userShortcutsRev[s]
if !exists {
log.Printf("GetUsersSubScene::2 : TODO!!\n")
// TODO
return
}
userMsgSendBtn.Text = fmt.Sprintf("%s", s)
userMsgSendBtn.OnTapped = func() {
intercom <- &com.Message{
ID: com.ID_CLIENT_SEND_CLIENT_MESSAGE,
ToID: id,
Data: []byte(msgEntry.Text),
}
msg := widgets.MBoardMessage{
LeftAlign: false,
Data: widget.NewLabel(msgEntry.Text),
}
msgsMuAr.Add(msg)
mmBoard.Add(msg)
msgEntry.Text = ""
msgEntry.Refresh()
mBoardCareTaker.Refresh()
mmBoard.Refresh()
}
userMsgSendBtn.Refresh()
})
// entryWithButton := container.NewHBox(
// layout.NewSpacer(),
// container.NewPadded(msgEntry),
// userMsgSendBtn,
// )
entryWithButton := container.New(
layouts.NewEntryBtn7030(),
msgEntry,
userMsgSendBtn,
)
fs := globalCfg.Window.Canvas().Size()
scene := container.New(
layout.NewVBoxLayout(),
header,
container.NewGridWithColumns(2,
container.New(
layout.NewVBoxLayout(),
layout.NewSpacer(),
container.New(
layout.NewHBoxLayout(),
userMsgsSelect,
msgHeader,
),
),
container.New(
layout.NewVBoxLayout(),
container.New(
layouts.NewFullWidthWithSize(fyne.NewSize(0, fs.Height*0.8)),
mBoardCareTaker,
),
layout.NewSpacer(),
entryWithButton,
),
),
)
// container.New(
// layouts.NewVariableGridWithRows(3, []int{1, 2}),
// header,
// container.New(
// layouts.NewVariableGridWithColumns(4, []int{1, 3}),
// container.NewGridWithColumns(3,
// layout.NewSpacer(),
// container.NewVBox(userMsgsSelect, msgHeader),
// layout.NewSpacer()),
// container.New(
// layouts.NewVariableGridWithRows(6, []int{5, 1}),
// mBoardCareTaker,
// container.NewHBox(msgEntry, userMsgSendBtn),
// ),
// ),
// )
return scene, BundleOfMutexArrays{
Messages: usersMessages,
}, MutableStructAboutWidgets{
MessagesSelect: userMsgsSelect,
MBoardCaretacker: mBoardCareTaker,
MsgButton: userMsgSendBtn,
MBoardMap: usersMBoards,
}
}