seekia/gui/buildProfileGui_Mental.go

1109 lines
38 KiB
Go
Raw Permalink Normal View History

package gui
// buildProfileGui_Mental.go implements pages to build the Mental portion of a mate profile
import "fyne.io/fyne/v2"
import "fyne.io/fyne/v2/container"
import "fyne.io/fyne/v2/dialog"
import "fyne.io/fyne/v2/layout"
import "fyne.io/fyne/v2/theme"
import "fyne.io/fyne/v2/widget"
import "seekia/resources/worldLanguages"
import "seekia/internal/allowedText"
import "seekia/internal/helpers"
import "seekia/internal/profiles/myLocalProfiles"
import "strings"
import "errors"
func setBuildMateProfileCategoryPage_Mental(window fyne.Window, previousPage func()){
currentPage := func(){setBuildMateProfileCategoryPage_Mental(window, previousPage)}
title := getPageTitleCentered(translate("Build Mate Profile - Mental"))
backButton := getBackButtonCentered(previousPage)
languageButton := widget.NewButton(translate("Language"), func(){
setBuildMateProfilePage_Language(window, currentPage)
})
beliefsButton := widget.NewButton(translate("Beliefs"), func(){
setBuildMateProfilePage_Beliefs(window, currentPage)
})
genderIdentityButton := widget.NewButton(translate("Gender Identity"), func(){
setBuildMateProfilePage_GenderIdentity(window, currentPage)
})
petsButton := widget.NewButton(translate("Pets"), func(){
setBuildMateProfilePage_Pets(window, currentPage)
})
buttonsGrid := container.NewGridWithColumns(1, languageButton, beliefsButton, genderIdentityButton, petsButton)
buttonsGridCentered := getContainerCentered(buttonsGrid)
buttonsGridPadded := container.NewPadded(buttonsGridCentered)
page := container.NewVBox(title, backButton, widget.NewSeparator(), buttonsGridPadded)
setPageContent(page, window)
}
func setBuildMateProfilePage_Language(window fyne.Window, previousPage func()){
currentPage := func(){setBuildMateProfilePage_Language(window, previousPage)}
title := getPageTitleCentered(translate("Build Mate Profile - Mental"))
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered("Language")
description1 := getLabelCentered("Select the languages you understand.")
description2 := getLabelCentered("Rate your ability to understand each language.")
description3 := getLabelCentered("1 = Low fluency, 5 = High fluency")
myLanguagesAttributeExists, myLanguagesAttribute, err := myLocalProfiles.GetProfileData("Mate", "Language")
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
addLanguageButton := getWidgetCentered(widget.NewButtonWithIcon("Add Language", theme.ContentAddIcon(), func(){
setBuildMateProfilePage_ChooseLanguage(window, currentPage, currentPage)
}))
if (myLanguagesAttributeExists == false){
noLanguagesExistLabel := getBoldLabelCentered("No Languages Exist.")
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, description3, widget.NewSeparator(), noLanguagesExistLabel, addLanguageButton)
setPageContent(page, window)
return
}
getLanguagesGrid := func()(*fyne.Container, error){
worldLanguageObjectsMap, err := worldLanguages.GetWorldLanguageObjectsMap()
if (err != nil) { return nil, err }
languageNameLabel := getItalicLabelCentered(translate("Language Name"))
fluencyLabel := getItalicLabelCentered(translate("Fluency"))
emptyLabel := widget.NewLabel("")
languageDescriptionsColumn := container.NewVBox(languageNameLabel, widget.NewSeparator())
languageRatingsColumn := container.NewVBox(fluencyLabel, widget.NewSeparator())
manageLanguageButtonsColumn := container.NewVBox(emptyLabel, widget.NewSeparator())
myLanguageItemsList := strings.Split(myLanguagesAttribute, "+&")
for _, languageItem := range myLanguageItemsList{
languageName, languageRating, delimiterFound := strings.Cut(languageItem, "$")
if (delimiterFound == false){
return nil, errors.New("MyLocalProfiles contains invalid language item: missing $: " + languageItem)
}
languageRatingInt, err := helpers.ConvertStringToInt(languageRating)
if (err != nil){
return nil, errors.New("MyLocalProfiles contains invalid language item: Language rating not an int: " + languageRating)
}
if (languageRatingInt < 1 || languageRatingInt > 5){
return nil, errors.New("MyLocalProfiles contains invalid language item: Language rating is invalid: " + languageRating)
}
getLanguageDescription := func()string{
languageObject, exists := worldLanguageObjectsMap[languageName]
if (exists == false){
// Language name must be custom
return languageName
}
languageNamesList := languageObject.NamesList
languageDescription := helpers.TranslateAndJoinStringListItems(languageNamesList, "/")
return languageDescription
}
languageDescription := getLanguageDescription()
languageDescriptionLabel := getBoldLabelCentered(languageDescription)
languageRatingLabel := getBoldLabelCentered(languageRating + "/5")
manageLanguageButton := widget.NewButtonWithIcon("", theme.VisibilityIcon(), func(){
setBuildMateProfilePage_ManageLanguage(window, languageName, currentPage, currentPage)
})
languageDescriptionsColumn.Add(languageDescriptionLabel)
languageRatingsColumn.Add(languageRatingLabel)
manageLanguageButtonsColumn.Add(manageLanguageButton)
languageDescriptionsColumn.Add(widget.NewSeparator())
languageRatingsColumn.Add(widget.NewSeparator())
manageLanguageButtonsColumn.Add(widget.NewSeparator())
}
languagesGrid := container.NewHBox(layout.NewSpacer(), languageDescriptionsColumn, languageRatingsColumn, manageLanguageButtonsColumn, layout.NewSpacer())
return languagesGrid, nil
}
languagesGrid, err := getLanguagesGrid()
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, description3, widget.NewSeparator(), addLanguageButton, widget.NewSeparator(), languagesGrid)
setPageContent(page, window)
}
func setBuildMateProfilePage_ChooseLanguage(window fyne.Window, previousPage func(), onCompletePage func()){
currentPage := func(){setBuildMateProfilePage_ChooseLanguage(window, previousPage, onCompletePage)}
title := getPageTitleCentered(translate("Build Mate Profile - Mental"))
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered("Choose Language")
description1 := getLabelCentered("Choose a language.")
description2 := getLabelCentered("If your language is not listed, select Language Is Missing.")
worldLanguageObjectsList, err := worldLanguages.GetWorldLanguageObjectsList()
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
// This list stores the translated language names
worldLanguageDescriptionsList := make([]string, 0, len(worldLanguageObjectsList))
// This map will store the language names
// If a language has multiple names, the first name is used
//Map Structure: Language Description -> Language primary name
worldLanguageNamesMap := make(map[string]string)
for _, languageObject := range worldLanguageObjectsList{
languageNamesList := languageObject.NamesList
languagePrimaryName := languageNamesList[0]
languageDescription := helpers.TranslateAndJoinStringListItems(languageNamesList, "/")
worldLanguageDescriptionsList = append(worldLanguageDescriptionsList, languageDescription)
worldLanguageNamesMap[languageDescription] = languagePrimaryName
}
helpers.SortStringListToUnicodeOrder(worldLanguageDescriptionsList)
onSelectedFunction := func(itemIndex int){
languageDescription := worldLanguageDescriptionsList[itemIndex]
languagePrimaryName, exists := worldLanguageNamesMap[languageDescription]
if (exists == false){
setErrorEncounteredPage(window, errors.New("worldLanguageNamesMap missing languageDescription"), currentPage)
return
}
setBuildMateProfilePage_AddLanguage(window, languagePrimaryName, currentPage, onCompletePage)
}
languagesWidgetList, err := getFyneWidgetListFromStringList(worldLanguageDescriptionsList, onSelectedFunction)
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
languageIsMissingButton := getWidgetCentered(widget.NewButton("Language Is Missing", func(){
setBuildMateProfilePage_EnterCustomLanguage(window, currentPage, onCompletePage)
}))
header := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, widget.NewSeparator())
page := container.NewBorder(header, languageIsMissingButton, nil, nil, languagesWidgetList)
setPageContent(page, window)
}
func setBuildMateProfilePage_EnterCustomLanguage(window fyne.Window, previousPage func(), onCompletePage func()){
currentPage := func(){setBuildMateProfilePage_EnterCustomLanguage(window, previousPage, onCompletePage)}
title := getPageTitleCentered(translate("Buid Mate Profile - Mental"))
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered("Add Custom Language")
description := widget.NewLabel("Enter your custom language.")
languageEntry := widget.NewEntry()
languageEntry.SetPlaceHolder(translate("Enter language..."))
languageEntryWithDescription := getContainerCentered(container.NewGridWithColumns(1, description, languageEntry))
submitButton := getWidgetCentered(widget.NewButtonWithIcon("Submit", theme.ConfirmIcon(), func(){
newLanguage := languageEntry.Text
if (newLanguage == ""){
dialogTitle := translate("Language Is Empty.")
dialogMessage := getLabelCentered(translate("You must provide a language."))
dialogContent := container.NewVBox(dialogMessage)
dialog.ShowCustom(dialogTitle, translate("Close"), dialogContent, window)
return
}
if (len(newLanguage) > 30){
dialogTitle := translate("Language Is Too Long.")
dialogMessage := getLabelCentered(translate("Language cannot be longer than 30 bytes."))
dialogContent := container.NewVBox(dialogMessage)
dialog.ShowCustom(dialogTitle, translate("Close"), dialogContent, window)
return
}
isAllowed := allowedText.VerifyStringIsAllowed(newLanguage)
if (isAllowed == false){
dialogTitle := translate("Invalid Language")
dialogMessageA := getLabelCentered(translate("Your language contains an invalid character."))
dialogMessageB := getLabelCentered(translate("It must be encoded in UTF-8."))
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB)
dialog.ShowCustom(dialogTitle, translate("Close"), dialogContent, window)
return
}
containsTabsOrNewlines := helpers.CheckIfStringContainsTabsOrNewlines(newLanguage)
if (containsTabsOrNewlines == true){
dialogTitle := translate("Invalid Language")
dialogMessageA := getLabelCentered(translate("Your language contains a tab or a newline character."))
dialogMessageB := getLabelCentered(translate("Remove the character and resubmit."))
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB)
dialog.ShowCustom(dialogTitle, translate("Close"), dialogContent, window)
return
}
containsDelimiter := strings.Contains(newLanguage, "+&")
if (containsDelimiter == true){
dialogTitle := translate("Cannot Add Language.")
dialogMessageA := getLabelCentered(translate("Language contains invalid substring: " + `"+&"`))
dialogMessageB := getLabelCentered(translate("Remove this substring and resubmit."))
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB)
dialog.ShowCustom(dialogTitle, translate("Close"), dialogContent, window)
return
}
containsDelimiter = strings.Contains(newLanguage, "$")
if (containsDelimiter == true){
dialogTitle := translate("Cannot Add Language.")
dialogMessageA := getLabelCentered(translate("Language contains invalid substring: " + `"$"`))
dialogMessageB := getLabelCentered(translate("Remove this substring and resubmit."))
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB)
dialog.ShowCustom(dialogTitle, translate("Close"), dialogContent, window)
return
}
setBuildMateProfilePage_AddLanguage(window, newLanguage, currentPage, onCompletePage)
}))
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), languageEntryWithDescription, submitButton)
setPageContent(page, window)
}
func setBuildMateProfilePage_AddLanguage(window fyne.Window, languagePrimaryName string, previousPage func(), onCompletePage func()){
currentPage := func(){setBuildMateProfilePage_AddLanguage(window, languagePrimaryName, previousPage, onCompletePage)}
title := getPageTitleCentered(translate("Build Mate Profile - Mental"))
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered("Add Language")
languageNameLabel := getLabelCentered("Language Name:")
getLanguageNameText := func()(string, error){
worldLanguageObjectsMap, err := worldLanguages.GetWorldLanguageObjectsMap()
if (err != nil) { return "", err }
languageObject, exists := worldLanguageObjectsMap[languagePrimaryName]
if (exists == false){
// Language name must be custom
return languagePrimaryName, nil
}
languageNamesList := languageObject.NamesList
languageNamesListFormatted := helpers.TranslateAndJoinStringListItems(languageNamesList, "/")
return languageNamesListFormatted, nil
}
languageNameText, err := getLanguageNameText()
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
languageNameTextLabel := getBoldLabelCentered(languageNameText)
description1 := getLabelCentered("Choose how well you understand this language.")
description2 := getLabelCentered("1 = Least Fluency, 5 = Highest Fluency")
optionsList := []string{"1", "2", "3", "4", "5"}
fluencySelector := widget.NewSelect(optionsList, nil)
fluencySelector.PlaceHolder = translate("Select one...")
fluencySelectorCentered := getWidgetCentered(fluencySelector)
submitFunction := func(){
myLanguageAttributeExists, existingMyLanguageAttribute, err := myLocalProfiles.GetProfileData("Mate", "Language")
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
if (myLanguageAttributeExists == true){
existingMyLanguageAttributeList := strings.Split(existingMyLanguageAttribute, "+&")
if (len(existingMyLanguageAttributeList) >= 100){
dialogTitle := translate("Language Limit Reached.")
dialogMessage := getLabelCentered(translate("You cannot add more than 100 languages."))
dialogContent := container.NewVBox(dialogMessage)
dialog.ShowCustom(dialogTitle, translate("Close"), dialogContent, window)
return
}
}
newLanguageRating := fluencySelector.Selected
if (newLanguageRating == ""){
dialogTitle := translate("Missing Language Fluency Rating.")
dialogMessage := getLabelCentered(translate("You must choose a language fluency rating."))
dialogContent := container.NewVBox(dialogMessage)
dialog.ShowCustom(dialogTitle, translate("Close"), dialogContent, window)
return
}
newLanguageItem := languagePrimaryName + "$" + newLanguageRating
getNewLanguageAttribute := func()(string, error){
if (myLanguageAttributeExists == false){
return newLanguageItem, nil
}
// We check to see if language already exists
// If so, we replace existing language
existingMyLanguageAttributeList := strings.Split(existingMyLanguageAttribute, "+&")
newMyLanguageAttributeList := make([]string, 0)
for _, languageItem := range existingMyLanguageAttributeList{
itemLanguageName, _, delimiterFound := strings.Cut(languageItem, "$")
if (delimiterFound == false){
return "", errors.New("MyLocalProfiles contains invalid myLanguage attribute: " + languageItem)
}
if (languagePrimaryName == itemLanguageName){
// Language already exists, we will skip this language item
continue
}
newMyLanguageAttributeList = append(newMyLanguageAttributeList, languageItem)
}
newMyLanguageAttributeList = append(newMyLanguageAttributeList, newLanguageItem)
newMyLanguageAttribute := strings.Join(newMyLanguageAttributeList, "+&")
return newMyLanguageAttribute, nil
}
newLanguageAttribute, err := getNewLanguageAttribute()
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
err = myLocalProfiles.SetProfileData("Mate", "Language", newLanguageAttribute)
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
onCompletePage()
}
submitButton := getWidgetCentered(widget.NewButtonWithIcon(translate("Submit"), theme.ConfirmIcon(), submitFunction))
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), languageNameLabel, languageNameTextLabel, widget.NewSeparator(), description1, description2, widget.NewSeparator(), fluencySelectorCentered, submitButton)
setPageContent(page, window)
}
func setBuildMateProfilePage_ManageLanguage(window fyne.Window, languagePrimaryName string, previousPage func(), afterDeletePage func()){
currentPage := func(){setBuildMateProfilePage_ManageLanguage(window, languagePrimaryName, previousPage, afterDeletePage)}
title := getPageTitleCentered(translate("Build Mate Profile - Mental"))
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered("Manage Language")
languageNameLabel := getLabelCentered(translate("Language Name:"))
getLanguageNameText := func()(string, error){
worldLanguageObjectsMap, err := worldLanguages.GetWorldLanguageObjectsMap()
if (err != nil) { return "", err }
languageObject, exists := worldLanguageObjectsMap[languagePrimaryName]
if (exists == false){
// Language name must be custom
return languagePrimaryName, nil
}
languageNamesList := languageObject.NamesList
languageNamesListFormatted := helpers.TranslateAndJoinStringListItems(languageNamesList, "/")
return languageNamesListFormatted, nil
}
languageNameText, err := getLanguageNameText()
if (err != nil) {
setErrorEncounteredPage(window, err, previousPage)
return
}
languageNameTextLabel := getBoldLabelCentered(languageNameText)
myLanguageAttributeExists, myLanguageAttribute, err := myLocalProfiles.GetProfileData("Mate", "Language")
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
if (myLanguageAttributeExists == false){
setErrorEncounteredPage(window, errors.New("setBuildMateProfilePage_ManageLanguage called when language attribute is empty."), previousPage)
return
}
myLanguageAttributeList := strings.Split(myLanguageAttribute, "+&")
getMyLanguageCurrentRating := func()(string, error){
for _, languageItem := range myLanguageAttributeList{
itemLanguageName, languageRating, delimiterFound := strings.Cut(languageItem, "$")
if (delimiterFound == false){
return "", errors.New("MyLocalProfiles contains invalid Location attribute: Missing $: " + languageItem)
}
if (itemLanguageName == languagePrimaryName){
return languageRating, nil
}
}
return "", errors.New("setBuildMateProfilePage_ManageLanguage called when my language rating not found.")
}
myCurrentLanguageRating, err := getMyLanguageCurrentRating()
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
handleSelectFunction := func(newLanguageRating string){
if (newLanguageRating == myCurrentLanguageRating){
return
}
newLanguageItem := languagePrimaryName + "$" + newLanguageRating
newMyLanguageAttributeList := make([]string, 0)
languageFound := false
for _, languageItem := range myLanguageAttributeList{
itemLanguageName, languageRating, delimiterFound := strings.Cut(languageItem, "$")
if (delimiterFound == false){
setErrorEncounteredPage(window, errors.New("MyLocalProfiles contains invalid Location attribute: Missing $: " + languageItem), currentPage)
return
}
if (itemLanguageName == languagePrimaryName){
if (languageFound == true){
setErrorEncounteredPage(window, errors.New("My mate Language attribute contains duplicate language item."), currentPage)
return
}
if (languageRating == newLanguageRating){
// We already checked for this earlier. This should not happen
setErrorEncounteredPage(window, errors.New("languageRating is the same after already checking."), currentPage)
return
}
// We will add the language with the revised rating
languageFound = true
newMyLanguageAttributeList = append(newMyLanguageAttributeList, newLanguageItem)
continue
}
newMyLanguageAttributeList = append(newMyLanguageAttributeList, languageItem)
}
if (languageFound == false){
setErrorEncounteredPage(window, errors.New("My language not found after being found already."), currentPage)
return
}
newMyLanguageAttribute := strings.Join(newMyLanguageAttributeList, "+&")
err = myLocalProfiles.SetProfileData("Mate", "Language", newMyLanguageAttribute)
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
currentPage()
}
selectorOptionsList := []string{"1", "2", "3", "4", "5"}
fluencySelector := widget.NewSelect(selectorOptionsList, handleSelectFunction)
fluencySelector.Selected = myCurrentLanguageRating
fluencyLabel := getLabelCentered("Fluency:")
fluencySelectorCentered := getWidgetCentered(fluencySelector)
deleteButton := getWidgetCentered(widget.NewButtonWithIcon("Delete", theme.DeleteIcon(), func(){
newMyLanguageAttributeList := make([]string, 0)
for _, languageItem := range myLanguageAttributeList{
itemLanguageName, _, delimiterFound := strings.Cut(languageItem, "$")
if (delimiterFound == false){
setErrorEncounteredPage(window, errors.New("MyLocalProfiles contains invalid Location attribute: Missing $: " + languageItem), currentPage)
return
}
if (itemLanguageName == languagePrimaryName){
continue
}
newMyLanguageAttributeList = append(newMyLanguageAttributeList, languageItem)
}
if (len(newMyLanguageAttributeList) != (len(myLanguageAttributeList)-1)){
setErrorEncounteredPage(window, errors.New("Failed to delete language item."), currentPage)
return
}
if (len(newMyLanguageAttributeList) == 0){
err = myLocalProfiles.DeleteProfileData("Mate", "Language")
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
afterDeletePage()
return
}
newMyLanguageAttribute := strings.Join(newMyLanguageAttributeList, "+&")
err = myLocalProfiles.SetProfileData("Mate", "Language", newMyLanguageAttribute)
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
afterDeletePage()
}))
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), languageNameLabel, languageNameTextLabel, widget.NewSeparator(), fluencyLabel, fluencySelectorCentered, widget.NewSeparator(), deleteButton)
setPageContent(page, window)
}
func setBuildMateProfilePage_Beliefs(window fyne.Window, previousPage func()){
currentPage := func(){setBuildMateProfilePage_Beliefs(window, previousPage)}
pageTitle := getPageTitleCentered(translate("Build Mate Profile - Mental"))
backButton := getBackButtonCentered(previousPage)
pageSubtitle := getPageSubtitleCentered(translate("Beliefs"))
description1 := getLabelCentered(translate("Enter your beliefs."))
description2 := getLabelCentered(translate("Beliefs may include your worldview, religion, and philosophies."))
currentBeliefsExist, currentBeliefs, err := myLocalProfiles.GetProfileData("Mate", "Beliefs")
if (err != nil) {
setErrorEncounteredPage(window, err, previousPage)
return
}
getMyCurrentBeliefsRow := func()(*fyne.Container, error){
myBeliefsLabel := widget.NewLabel("My Beliefs:")
if (currentBeliefsExist == false){
noResponseLabel := getBoldItalicLabel("No Response")
currentBeliefsRow := container.NewHBox(layout.NewSpacer(), myBeliefsLabel, noResponseLabel, layout.NewSpacer())
return currentBeliefsRow, nil
}
isAllowed := allowedText.VerifyStringIsAllowed(currentBeliefs)
if (isAllowed == false){
return nil, errors.New("Current mate beliefs is not allowed: " + currentBeliefs)
}
if( len(currentBeliefs) > 1000){
return nil, errors.New("Current mate beliefs is too long: " + currentBeliefs)
}
currentBeliefsTrimmed, _, err := helpers.TrimAndFlattenString(currentBeliefs, 15)
if (err != nil) { return nil, err }
currentBeliefsLabel := getBoldLabel(currentBeliefsTrimmed)
viewMyBeliefsButton := widget.NewButtonWithIcon("", theme.VisibilityIcon(), func(){
setViewTextPage(window, "Viewing Beliefs", currentBeliefs, false, currentPage)
})
currentBeliefsRow := container.NewHBox(layout.NewSpacer(), myBeliefsLabel, currentBeliefsLabel, viewMyBeliefsButton, layout.NewSpacer())
return currentBeliefsRow, nil
}
currentBeliefsRow, err := getMyCurrentBeliefsRow()
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
editButton := widget.NewButtonWithIcon("Edit", theme.DocumentCreateIcon(), func(){
setBuildMateProfilePage_EditBeliefs(window, currentPage, currentPage)
})
noResponseButton := widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){
if (currentBeliefsExist == false){
return
}
setBuildMateProfilePage_DeleteBeliefs(window, currentPage, currentPage)
})
buttonsGrid := getContainerCentered(container.NewGridWithColumns(1, editButton, noResponseButton))
page := container.NewVBox(pageTitle, backButton, widget.NewSeparator(), pageSubtitle, widget.NewSeparator(), description1, description2, widget.NewSeparator(), currentBeliefsRow, widget.NewSeparator(), buttonsGrid)
setPageContent(page, window)
}
func setBuildMateProfilePage_DeleteBeliefs(window fyne.Window, previousPage func(), nextPage func()){
title := getPageTitleCentered("Delete Beliefs")
backButton := getBackButtonCentered(previousPage)
description1 := getBoldLabelCentered("Delete Beliefs?")
description2 := getLabelCentered("Confirm to delete your beliefs?")
confirmButton := getWidgetCentered(widget.NewButtonWithIcon("Delete", theme.DeleteIcon(), func(){
myLocalProfiles.DeleteProfileData("Mate", "Beliefs")
nextPage()
}))
page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, confirmButton)
setPageContent(page, window)
}
func setBuildMateProfilePage_EditBeliefs(window fyne.Window, previousPage func(), nextPage func()){
title := getPageTitleCentered("Edit Mate Beliefs")
backButton := getBackButtonCentered(previousPage)
beliefsEntry := widget.NewMultiLineEntry()
beliefsEntry.Wrapping = 3
//Outputs:
// -bool: Current beliefs exist
// -string: Current beliefs
// -error
getCurrentBeliefs := func()(bool, string, error){
exists, currentBeliefs, err := myLocalProfiles.GetProfileData("Mate", "Beliefs")
if (err != nil) { return false, "", err }
if (exists == false){
return false, "", nil
}
isAllowed := allowedText.VerifyStringIsAllowed(currentBeliefs)
if (isAllowed == false){
return false, "", errors.New("My current mate beliefs is not allowed: " + currentBeliefs)
}
if(len(currentBeliefs) > 1000){
return false, "", errors.New("My current mate beliefs is too long: " + currentBeliefs)
}
return true, currentBeliefs, nil
}
currentBeliefsExist, currentBeliefs, err := getCurrentBeliefs()
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
if (currentBeliefsExist == false){
beliefsEntry.SetPlaceHolder("Enter your beliefs...")
} else {
beliefsEntry.SetText(currentBeliefs)
}
submitButton := getWidgetCentered(widget.NewButtonWithIcon(translate("Save"), theme.ConfirmIcon(), func(){
newBeliefs := beliefsEntry.Text
isAllowed := allowedText.VerifyStringIsAllowed(newBeliefs)
if (isAllowed == false){
title := translate("Invalid Beliefs")
dialogMessageA := getLabelCentered(translate("Your beliefs contain an invalid character"))
dialogMessageB := getLabelCentered(translate("It must be encoded in UTF-8."))
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB)
dialog.ShowCustom(title, translate("Close"), dialogContent, window)
return
}
currentBytesLength := len(newBeliefs)
if (currentBytesLength > 1000){
currentLengthString := helpers.ConvertIntToString(currentBytesLength)
title := translate("Invalid Beliefs")
dialogMessageA := getLabelCentered(translate("Your Beliefs are too long."))
dialogMessageB := getLabelCentered(translate("Beliefs cannot be longer than 1000 bytes."))
dialogMessageC := getLabelCentered(translate("Current Length: ") + currentLengthString)
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB, dialogMessageC)
dialog.ShowCustom(title, translate("Close"), dialogContent, window)
return
}
if (newBeliefs == ""){
myLocalProfiles.DeleteProfileData("Mate", "Beliefs")
} else {
myLocalProfiles.SetProfileData("Mate", "Beliefs", newBeliefs)
}
nextPage()
}))
emptyLabel := widget.NewLabel("")
submitButtonWithSpacer := container.NewVBox(submitButton, emptyLabel)
beliefsEntryBoxed := getWidgetBoxed(beliefsEntry)
beliefsEntryWithSubmitButton := container.NewBorder(nil, submitButtonWithSpacer, nil, nil, beliefsEntryBoxed)
header := container.NewVBox(title, backButton, widget.NewSeparator())
page := container.NewBorder(header, nil, nil, nil, beliefsEntryWithSubmitButton)
setPageContent(page, window)
}
func setBuildMateProfilePage_GenderIdentity(window fyne.Window, previousPage func()){
currentPage := func(){setBuildMateProfilePage_GenderIdentity(window, previousPage)}
title := getPageTitleCentered(translate("Build Mate Profile - Mental"))
backButton := getBackButtonCentered(previousPage)
pageSubtitle := getPageSubtitleCentered(translate("Gender Identity"))
description1 := getLabelCentered("Enter the gender that you identify as.")
description2 := getLabelCentered("Choose Man, Woman, or enter a custom value.")
standardGendersList := []string{translate("Man"), translate("Woman")}
genderSelectEntry := widget.NewSelectEntry(standardGendersList)
myGenderIdentityExists, myGenderIdentity, err := myLocalProfiles.GetProfileData("Mate", "GenderIdentity")
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
if (myGenderIdentityExists == true){
if (len(myGenderIdentity) > 50){
setErrorEncounteredPage(window, errors.New("MyLocalProfiles contains invalid GenderIdentity: " + myGenderIdentity), previousPage)
return
}
genderSelectEntry.SetText(myGenderIdentity)
} else {
genderSelectEntry.SetPlaceHolder(translate("Select or enter gender..."))
}
getCurrentGenderIdentityLabel := func()fyne.Widget{
if (myGenderIdentityExists == false){
result := translate("No Response")
noResponseLabel := getBoldItalicLabel(result)
return noResponseLabel
}
if (myGenderIdentity == "Man"){
genderIdentityLabel := getBoldLabel(translate("Man"))
return genderIdentityLabel
}
if (myGenderIdentity == "Woman"){
genderIdentityLabel := getBoldLabel(translate("Woman"))
return genderIdentityLabel
}
genderIdentityLabel := getBoldLabel(myGenderIdentity)
return genderIdentityLabel
}
currentGenderIdentityLabel := getCurrentGenderIdentityLabel()
myGenderIdentityLabel := widget.NewLabel("My Gender Identity:")
currentGenderIdentityRow := container.NewHBox(layout.NewSpacer(), myGenderIdentityLabel, currentGenderIdentityLabel, layout.NewSpacer())
submitChangesButton := widget.NewButtonWithIcon("Submit", theme.ConfirmIcon(), func(){
getNewGenderIdentity := func()string{
newGenderIdentity := genderSelectEntry.Text
if (newGenderIdentity == translate("Man")){
return "Man"
}
if (newGenderIdentity == translate("Woman")){
return "Woman"
}
return newGenderIdentity
}
newGenderIdentity := getNewGenderIdentity()
if (newGenderIdentity == ""){
title := translate("Invalid Gender")
dialogMessageA := getLabelCentered(translate("Invalid gender entered."))
dialogMessageB := getLabelCentered(translate("Your gender cannot be empty."))
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB)
dialog.ShowCustom(title, translate("Close"), dialogContent, window)
return
}
if (len(newGenderIdentity) > 50){
genderSelectEntry.SetText("")
genderSelectEntry.SetPlaceHolder(translate("Select or enter gender..."))
title := translate("Invalid Gender")
dialogMessageA := getLabelCentered(translate("Invalid gender entered."))
dialogMessageB := getLabelCentered(translate("It cannot be longer than 50 bytes."))
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB)
dialog.ShowCustom(title, translate("Close"), dialogContent, window)
return
}
isAllowed := allowedText.VerifyStringIsAllowed(newGenderIdentity)
if (isAllowed == false){
title := translate("Invalid Gender")
dialogMessageA := getLabelCentered(translate("Your gender contains an invalid character."))
dialogMessageB := getLabelCentered(translate("It must be encoded in UTF-8."))
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB)
dialog.ShowCustom(title, translate("Close"), dialogContent, window)
return
}
containsTabsOrNewlines := helpers.CheckIfStringContainsTabsOrNewlines(newGenderIdentity)
if (containsTabsOrNewlines == true){
dialogTitle := translate("Invalid Gender")
dialogMessageA := getLabelCentered(translate("Your gender contains a tab or a newline character."))
dialogMessageB := getLabelCentered(translate("Remove the character and resubmit."))
dialogContent := container.NewVBox(dialogMessageA, dialogMessageB)
dialog.ShowCustom(dialogTitle, translate("Close"), dialogContent, window)
return
}
myLocalProfiles.SetProfileData("Mate", "GenderIdentity", newGenderIdentity)
currentPage()
})
genderSelectEntryWithSubmitButton := getContainerCentered(container.NewGridWithRows(1, genderSelectEntry, submitChangesButton))
noResponseButton := getWidgetCentered(widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){
myLocalProfiles.DeleteProfileData("Mate", "GenderIdentity")
currentPage()
}))
page := container.NewVBox(title, backButton, widget.NewSeparator(), pageSubtitle, widget.NewSeparator(), description1, description2, widget.NewSeparator(), currentGenderIdentityRow, widget.NewSeparator(), genderSelectEntryWithSubmitButton, noResponseButton)
setPageContent(page, window)
}
func setBuildMateProfilePage_Pets(window fyne.Window, previousPage func()){
currentPage := func(){setBuildMateProfilePage_Pets(window, previousPage)}
pageTitle := getPageTitleCentered(translate("Build Mate Profile - Mental"))
backButton := getBackButtonCentered(previousPage)
pageSubtitle := getPageSubtitleCentered(translate("Pets"))
description1 := getLabelCentered(translate("Describe how much you enjoy owning pets."))
description2 := getLabelCentered(translate("1 = Strongly Against, 10 = Strongly Support"))
optionsList := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}
handleSelectionFunction := func(response string){
myLocalProfiles.SetProfileData("Mate", "PetsRating", response)
}
petsRatingSelector := widget.NewSelect(optionsList, handleSelectionFunction)
currentPetsRatingExists, currentPetsRating, err := myLocalProfiles.GetProfileData("Mate", "PetsRating")
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
if (currentPetsRatingExists == true){
petsRatingSelector.Selected = currentPetsRating
} else {
petsRatingSelector.PlaceHolder = translate("Choose rating...")
}
petsRatingSelectorCentered := getWidgetCentered(petsRatingSelector)
petsNoResponseButton := getWidgetCentered(widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){
err := myLocalProfiles.DeleteProfileData("Mate", "PetsRating")
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
currentPage()
}))
description3 := getLabelCentered(translate("Describe how much you enjoy each animal as a pet."))
description4 := getLabelCentered(translate("1 = Strongly Against, 10 = Strongly Support"))
getPetsGrid := func()(*fyne.Container, error){
petsGrid := container.NewGridWithColumns(3)
petsList := []string{"Dogs", "Cats"}
for _, petName := range petsList{
petAttributeName := petName + "Rating"
petNameLabel := getBoldLabelCentered(translate(petName))
optionsList := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}
handleSelectionFunction := func(response string){
err := myLocalProfiles.SetProfileData("Mate", petAttributeName, response)
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
}
petRatingSelector := widget.NewSelect(optionsList, handleSelectionFunction)
currentRatingExists, currentPetRating, err := myLocalProfiles.GetProfileData("Mate", petAttributeName)
if (err != nil){ return nil, err }
if (currentRatingExists == true){
petRatingSelector.Selected = currentPetRating
} else {
petRatingSelector.PlaceHolder = translate("Choose rating...")
}
noResponseButton := getWidgetCentered(widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){
err := myLocalProfiles.DeleteProfileData("Mate", petAttributeName)
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
currentPage()
}))
petsGrid.Add(petNameLabel)
petsGrid.Add(petRatingSelector)
petsGrid.Add(noResponseButton)
}
petsGridCentered := getContainerCentered(petsGrid)
return petsGridCentered, nil
}
petsGrid, err := getPetsGrid()
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
page := container.NewVBox(pageTitle, backButton, widget.NewSeparator(), pageSubtitle, widget.NewSeparator(), description1, description2, petsRatingSelectorCentered, petsNoResponseButton, widget.NewSeparator(), description3, description4, widget.NewSeparator(), petsGrid)
setPageContent(page, window)
}