seekia/gui/desiresGui_Mental.go

546 lines
19 KiB
Go
Raw Permalink Normal View History

package gui
// desiresGui_Mental.go implements pages to manage a user's Mental mate desires
import "fyne.io/fyne/v2"
import "fyne.io/fyne/v2/container"
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/desires/myLocalDesires"
import "seekia/internal/encoding"
import "seekia/internal/helpers"
import "strings"
import "errors"
import "slices"
func setChooseDesiresCategoryPage_Mental(window fyne.Window, previousPage func()){
currentPage := func(){setChooseDesiresCategoryPage_Mental(window, previousPage)}
title := getPageTitleCentered(translate("My Mate Desires - Mental"))
backButton := getBackButtonCentered(previousPage)
languageButton := widget.NewButton(translate("Language"), func(){
setChooseDesiresPage_Language(window, currentPage)
})
genderIdentityButton := widget.NewButton(translate("Gender Identity"), func(){
setChooseDesiresPage_GenderIdentity(window, currentPage)
})
petsButton := widget.NewButton(translate("Pets"), func(){
setChooseDesiresPage_Pets(window, currentPage)
})
buttonsGrid := getContainerCentered(container.NewGridWithColumns(1, languageButton, genderIdentityButton, petsButton))
buttonsGridPadded := container.NewPadded(buttonsGrid)
page := container.NewVBox(title, backButton, widget.NewSeparator(), buttonsGridPadded)
setPageContent(page, window)
}
func setChooseDesiresPage_Language(window fyne.Window, previousPage func()){
currentPage := func(){setChooseDesiresPage_Language(window, previousPage)}
title := getPageTitleCentered("My Mate Desires - Mental")
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered(translate("Language"))
description1 := getLabelCentered("Choose the languages that you desire.")
description2 := getLabelCentered("This refers to the languages that a user can speak.")
description3 := getLabelCentered("For example, add English if you desire someone who can speak it.")
getSelectedLanguagesSection := func()(*fyne.Container, error){
getCurrentDesiredChoicesList := func()([]string, error){
currentChoicesListExists, currentChoicesList, err := myLocalDesires.GetDesire("Language")
if (err != nil) { return nil, err }
if (currentChoicesListExists == false){
emptyList := make([]string, 0)
return emptyList, nil
}
//currentChoicesList is a "+" separated list of choices
// Each choice option is encoded in base64 (except for "Other")
currentDesiredChoicesList := strings.Split(currentChoicesList, "+")
return currentDesiredChoicesList, nil
}
currentDesiredChoicesList, err := getCurrentDesiredChoicesList()
if (err != nil) { return nil, err }
addLanguageButton := getWidgetCentered(widget.NewButtonWithIcon("Add Language", theme.ContentAddIcon(), func(){
onSubmitFunction := func(_ int, newLanguagePrimaryName string)error{
newLanguageNameBase64 := encoding.EncodeBytesToBase64String([]byte(newLanguagePrimaryName))
newLanguagesList := helpers.AddItemToStringListAndAvoidDuplicate(currentDesiredChoicesList, newLanguageNameBase64)
newDesireString := strings.Join(newLanguagesList, "+")
err = myLocalDesires.SetDesire("Language", newDesireString)
if (err != nil){ return err }
return nil
}
setChooseDesiresPage_AddLanguage(window, onSubmitFunction, currentPage, currentPage)
}))
allowOtherCheck := widget.NewCheck("Allow Other", func(response bool){
getNewChoicesList := func()[]string{
if (response == false){
2024-08-11 14:31:40 +02:00
newList, _ := helpers.DeleteAllMatchingItemsFromList(currentDesiredChoicesList, "Other")
return newList
}
newList := helpers.AddItemToStringListAndAvoidDuplicate(currentDesiredChoicesList, "Other")
return newList
}
newList := getNewChoicesList()
if (len(newList) == 0){
err := myLocalDesires.DeleteDesire("Language")
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
currentPage()
return
}
newDesireValueString := strings.Join(newList, "+")
err := myLocalDesires.SetDesire("Language", newDesireValueString)
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
currentPage()
})
allowOtherIsSelected := slices.Contains(currentDesiredChoicesList, "Other")
if (allowOtherIsSelected == true){
allowOtherCheck.Checked = true
}
allowOtherHelpButton := widget.NewButtonWithIcon("", theme.QuestionIcon(), func(){
setAllowOtherExplainerPage(window, currentPage)
})
allowOtherRow := container.NewHBox(layout.NewSpacer(), allowOtherCheck, allowOtherHelpButton, layout.NewSpacer())
getAnyLanguageIsSelectedBool := func()bool{
if (len(currentDesiredChoicesList) == 0){
return false
}
if (len(currentDesiredChoicesList) == 1){
onlyValue := currentDesiredChoicesList[0]
if (onlyValue == "Other"){
return false
}
}
return true
}
anyLanguageIsSelected := getAnyLanguageIsSelectedBool()
if (anyLanguageIsSelected == false){
noLanguagesLabel := getBoldLabelCentered("No languages selected.")
selectedLanguagesSection := container.NewVBox(noLanguagesLabel, addLanguageButton, widget.NewSeparator(), allowOtherRow)
return selectedLanguagesSection, nil
}
myDesiredLanguagesLabel := getItalicLabelCentered("My Desired Languages:")
languageNameColumn := container.NewVBox(widget.NewSeparator())
deleteButtonsColumn := container.NewVBox(widget.NewSeparator())
for _, languageNameBase64 := range currentDesiredChoicesList{
if (languageNameBase64 == "Other"){
continue
}
languageName, err := encoding.DecodeBase64StringToUnicodeString(languageNameBase64)
if (err != nil){
return nil, errors.New("My current language desire is malformed: Contains invalid language: " + languageNameBase64)
}
languageNameLabel := getBoldLabelCentered(translate(languageName))
deleteLanguageButton := widget.NewButtonWithIcon("", theme.DeleteIcon(), func(){
2024-08-11 14:31:40 +02:00
newDesiredLanguagesList, _ := helpers.DeleteAllMatchingItemsFromList(currentDesiredChoicesList, languageNameBase64)
if (len(newDesiredLanguagesList) == 0){
err := myLocalDesires.DeleteDesire("Language")
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
currentPage()
return
}
newDesireValueString := strings.Join(newDesiredLanguagesList, "+")
err := myLocalDesires.SetDesire("Language", newDesireValueString)
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
currentPage()
})
languageNameColumn.Add(languageNameLabel)
deleteButtonsColumn.Add(deleteLanguageButton)
languageNameColumn.Add(widget.NewSeparator())
deleteButtonsColumn.Add(widget.NewSeparator())
}
languagesGrid := container.NewHBox(layout.NewSpacer(), languageNameColumn, deleteButtonsColumn, layout.NewSpacer())
//TODO: Add option for requiring a user to fulfill all of your chosen languages
// For example, a user could only search for people who speak both English and French
selectedLanguagesSection := container.NewVBox(addLanguageButton, widget.NewSeparator(), myDesiredLanguagesLabel, languagesGrid, widget.NewSeparator(), allowOtherRow)
return selectedLanguagesSection, nil
}
selectedLanguagesSection, err := getSelectedLanguagesSection()
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
filterOptionsSection, err := getDesireEditorFilterOptionsSection(window, currentPage, "Language", true)
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
viewStatisticsButton := getWidgetCentered(widget.NewButtonWithIcon("View Statistics", theme.InfoIcon(), func(){
setViewMyMateDesireStatisticsPage(window, "Language", "Language", false, "", "", currentPage)
}))
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, description3, widget.NewSeparator(), selectedLanguagesSection, widget.NewSeparator(), filterOptionsSection, widget.NewSeparator(), viewStatisticsButton)
setPageContent(page, window)
}
//Inputs:
// -fyne.Window
// -func(int, string)error: The function to be executed when a choice is selected
// -Int: Language identifier
// -string: Language primary name
// -func(): Previous Page
// -func(): Page to go to after selection
func setChooseDesiresPage_AddLanguage(window fyne.Window, submitFunction func(int, string)error, previousPage func(), nextPage func()){
currentPage := func(){setChooseDesiresPage_AddLanguage(window, submitFunction, previousPage, nextPage)}
title := getPageTitleCentered("My Mate Desires - Mental")
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered("Choose Language")
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 all of the language names
// If a language has multiple names, the first name is used
//Map Structure: Language Description -> Language Object
worldLanguageObjectsMap := make(map[string]worldLanguages.LanguageObject)
for _, languageObject := range worldLanguageObjectsList{
languageNamesList := languageObject.NamesList
languageDescription := helpers.TranslateAndJoinStringListItems(languageNamesList, "/")
worldLanguageDescriptionsList = append(worldLanguageDescriptionsList, languageDescription)
worldLanguageObjectsMap[languageDescription] = languageObject
}
helpers.SortStringListToUnicodeOrder(worldLanguageDescriptionsList)
selectFunction := func(itemIndex int){
languageDescription := worldLanguageDescriptionsList[itemIndex]
languageObject, exists := worldLanguageObjectsMap[languageDescription]
if (exists == false){
setErrorEncounteredPage(window, errors.New("worldLanguageNamesMap missing languageDescription"), currentPage)
return
}
languageIdentifier := languageObject.Identifier
languagePrimaryName := languageObject.NamesList[0]
err := submitFunction(languageIdentifier, languagePrimaryName)
if (err != nil){
setErrorEncounteredPage(window, err, currentPage)
return
}
nextPage()
}
languagesWidgetList, err := getFyneWidgetListFromStringList(worldLanguageDescriptionsList, selectFunction)
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
header := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator())
page := container.NewBorder(header, nil, nil, nil, languagesWidgetList)
setPageContent(page, window)
}
func setChooseDesiresPage_GenderIdentity(window fyne.Window, previousPage func()){
currentPage := func(){setChooseDesiresPage_GenderIdentity(window, previousPage)}
title := getPageTitleCentered("My Mate Desires - Mental")
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered(translate("Gender Identity"))
description1 := getLabelCentered("Choose the gender identities that you desire.")
description2 := getLabelCentered("This refers to the gender a user identifies as.")
description3 := getLabelCentered("For example, if you desire people who identify as Men, choose Man.")
optionTitlesList := []string{translate("Man"), translate("Woman")}
optionNamesMap := make(map[string][]string)
optionNamesMap[translate("Man")] = []string{"Man"}
optionNamesMap[translate("Woman")] = []string{"Woman"}
desireEditor, err := getDesireEditor_Choice(window, currentPage, "GenderIdentity", optionTitlesList, optionNamesMap, true, true, 1)
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
viewStatisticsButton := getWidgetCentered(widget.NewButtonWithIcon("View Statistics", theme.InfoIcon(), func(){
setViewMyMateDesireStatisticsPage(window, "Gender Identity", "GenderIdentity", true, "Donut", "GenderIdentity", currentPage)
}))
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, description3, widget.NewSeparator(), desireEditor, widget.NewSeparator(), viewStatisticsButton)
setPageContent(page, window)
}
func setChooseDesiresPage_Pets(window fyne.Window, previousPage func()){
currentPage := func(){setChooseDesiresPage_Pets(window, previousPage)}
title := getPageTitleCentered("My Mate Desires - Mental")
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered(translate("Pets"))
description := getLabelCentered("Choose your pet desires.")
allPetsButton := widget.NewButton("All Pets", func(){
setChooseDesiresPage_AllPets(window, currentPage)
})
dogsButton := widget.NewButton("Dogs", func(){
setChooseDesiresPage_Dogs(window, currentPage)
})
catsButton := widget.NewButton("Cats", func(){
setChooseDesiresPage_Cats(window, currentPage)
})
buttonsGrid := getContainerCentered(container.NewGridWithColumns(1, allPetsButton, dogsButton, catsButton))
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description, widget.NewSeparator(), buttonsGrid)
setPageContent(page, window)
}
func setChooseDesiresPage_AllPets(window fyne.Window, previousPage func()){
currentPage := func(){setChooseDesiresPage_AllPets(window, previousPage)}
title := getPageTitleCentered(translate("My Mate Desires - Mental"))
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered(translate("All Pets"))
description1 := getLabelCentered("Choose your pets rating desires.")
description2 := getLabelCentered("Users describe how much they enjoy having pets from 1 to 10.")
description3 := getLabelCentered("Choose the user responses that you desire.")
description4 := getLabelCentered("1/10 = Strongly Dislike, 10/10 = Strongly Like.")
optionTitlesList := []string{"1/10", "2/10", "3/10", "4/10", "5/10", "6/10", "7/10", "8/10", "9/10", "10/10"}
optionNamesMap := map[string][]string{
"1/10": []string{"1"},
"2/10": []string{"2"},
"3/10": []string{"3"},
"4/10": []string{"4"},
"5/10": []string{"5"},
"6/10": []string{"6"},
"7/10": []string{"7"},
"8/10": []string{"8"},
"9/10": []string{"9"},
"10/10": []string{"10"},
}
desireEditor, err := getDesireEditor_Choice(window, currentPage, "PetsRating", optionTitlesList, optionNamesMap, false, true, 5)
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
viewStatisticsButton := getWidgetCentered(widget.NewButtonWithIcon("View Statistics", theme.InfoIcon(), func(){
setViewMyMateDesireStatisticsPage(window, "Pets Rating", "PetsRating", true, "Bar", "PetsRating", currentPage)
}))
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, description3, description4, widget.NewSeparator(), desireEditor, widget.NewSeparator(), viewStatisticsButton)
setPageContent(page, window)
}
func setChooseDesiresPage_Dogs(window fyne.Window, previousPage func()){
currentPage := func(){setChooseDesiresPage_Dogs(window, previousPage)}
title := getPageTitleCentered(translate("My Mate Desires - Mental"))
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered(translate("Dogs"))
description1 := getLabelCentered("Choose your dogs rating desires.")
description2 := getLabelCentered("Users describe how much they enjoy having dogs from 1 to 10.")
description3 := getLabelCentered("Choose the user responses that you desire.")
description4 := getLabelCentered("1/10 = Strongly Dislike, 10/10 = Strongly Like.")
optionTitlesList := []string{"1/10", "2/10", "3/10", "4/10", "5/10", "6/10", "7/10", "8/10", "9/10", "10/10"}
optionNamesMap := map[string][]string{
"1/10": []string{"1"},
"2/10": []string{"2"},
"3/10": []string{"3"},
"4/10": []string{"4"},
"5/10": []string{"5"},
"6/10": []string{"6"},
"7/10": []string{"7"},
"8/10": []string{"8"},
"9/10": []string{"9"},
"10/10": []string{"10"},
}
desireEditor, err := getDesireEditor_Choice(window, currentPage, "DogsRating", optionTitlesList, optionNamesMap, false, true, 5)
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
viewStatisticsButton := getWidgetCentered(widget.NewButtonWithIcon("View Statistics", theme.InfoIcon(), func(){
setViewMyMateDesireStatisticsPage(window, "Dogs Rating", "DogsRating", true, "Bar", "DogsRating", currentPage)
}))
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, description3, description4, widget.NewSeparator(), desireEditor, widget.NewSeparator(), viewStatisticsButton)
setPageContent(page, window)
}
func setChooseDesiresPage_Cats(window fyne.Window, previousPage func()){
currentPage := func(){setChooseDesiresPage_Cats(window, previousPage)}
title := getPageTitleCentered(translate("My Mate Desires - Mental"))
backButton := getBackButtonCentered(previousPage)
subtitle := getPageSubtitleCentered(translate("Cats"))
description1 := getLabelCentered("Choose your cats rating desires.")
description2 := getLabelCentered("Users describe how much they enjoy having cats from 1 to 10.")
description3 := getLabelCentered("Choose the user responses that you desire.")
description4 := getLabelCentered("1/10 = Strongly Dislike, 10/10 = Strongly Like.")
optionTitlesList := []string{"1/10", "2/10", "3/10", "4/10", "5/10", "6/10", "7/10", "8/10", "9/10", "10/10"}
optionNamesMap := make(map[string][]string)
optionNamesMap["1/10"] = []string{"1"}
optionNamesMap["2/10"] = []string{"2"}
optionNamesMap["3/10"] = []string{"3"}
optionNamesMap["4/10"] = []string{"4"}
optionNamesMap["5/10"] = []string{"5"}
optionNamesMap["6/10"] = []string{"6"}
optionNamesMap["7/10"] = []string{"7"}
optionNamesMap["8/10"] = []string{"8"}
optionNamesMap["9/10"] = []string{"9"}
optionNamesMap["10/10"] = []string{"10"}
desireEditor, err := getDesireEditor_Choice(window, currentPage, "CatsRating", optionTitlesList, optionNamesMap, false, true, 5)
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
viewStatisticsButton := getWidgetCentered(widget.NewButtonWithIcon("View Statistics", theme.InfoIcon(), func(){
setViewMyMateDesireStatisticsPage(window, "Cats Rating", "CatsRating", true, "Bar", "CatsRating", currentPage)
}))
page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, description3, description4, widget.NewSeparator(), desireEditor, widget.NewSeparator(), viewStatisticsButton)
setPageContent(page, window)
}