package gui // buildProfileGui_Lifestyle.go implements the pages to build the lifestyle portion of a mate profile import "fyne.io/fyne/v2" import "fyne.io/fyne/v2/container" import "fyne.io/fyne/v2/widget" import "fyne.io/fyne/v2/dialog" import "fyne.io/fyne/v2/theme" import "fyne.io/fyne/v2/layout" import "seekia/resources/currencies" import "seekia/internal/allowedText" import "seekia/internal/globalSettings" import "seekia/internal/helpers" import "seekia/internal/profiles/myLocalProfiles" import "errors" func setBuildMateProfileCategoryPage_Lifestyle(window fyne.Window, previousPage func()){ currentPage := func(){setBuildMateProfileCategoryPage_Lifestyle(window, previousPage)} title := getPageTitleCentered(translate("Build Mate Profile - Lifestyle")) backButton := getBackButtonCentered(previousPage) hobbiesButton := widget.NewButton(translate("Hobbies"), func(){ setBuildMateProfilePage_Hobbies(window, currentPage) }) wealthButton := widget.NewButton(translate("Wealth"), func(){ setBuildMateProfilePage_Wealth(window, currentPage) }) jobButton := widget.NewButton(translate("Job"), func(){ setBuildMateProfilePage_Job(window, currentPage) }) dietButton := widget.NewButton(translate("Diet"), func(){ setBuildMateProfilePage_Diet(window, currentPage) }) fameButton := widget.NewButton(translate("Fame"), func(){ setBuildMateProfilePage_Fame(window, currentPage) }) drugsButton := widget.NewButton(translate("Drugs"), func(){ setBuildMateProfilePage_Drugs(window, currentPage) }) buttonsGrid := container.NewGridWithColumns(1, hobbiesButton, wealthButton, jobButton, dietButton, fameButton, drugsButton) buttonsGridCentered := getContainerCentered(buttonsGrid) buttonsGridPadded := container.NewPadded(buttonsGridCentered) page := container.NewVBox(title, backButton, widget.NewSeparator(), buttonsGridPadded) setPageContent(page, window) } func setBuildMateProfilePage_Hobbies(window fyne.Window, previousPage func()){ currentPage := func(){setBuildMateProfilePage_Hobbies(window, previousPage)} pageTitle := getPageTitleCentered(translate("Build Mate Profile - Lifestyle")) backButton := getBackButtonCentered(previousPage) pageSubtitle := getPageSubtitleCentered(translate("Hobbies")) description1 := getLabelCentered(translate("Enter your hobbies.")) description2 := getLabelCentered(translate("Hobbies are activities you enjoy.")) currentHobbiesExist, currentHobbies, err := myLocalProfiles.GetProfileData("Mate", "Hobbies") if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } getMyCurrentHobbiesRow := func()(*fyne.Container, error){ myHobbiesLabel := widget.NewLabel("My Hobbies:") if (currentHobbiesExist == false){ noResponseLabel := getBoldItalicLabel("No Response") currentHobbiesRow := container.NewHBox(layout.NewSpacer(), myHobbiesLabel, noResponseLabel, layout.NewSpacer()) return currentHobbiesRow, nil } isAllowed := allowedText.VerifyStringIsAllowed(currentHobbies) if (isAllowed == false){ return nil, errors.New("My current mate hobbies is not allowed: " + currentHobbies) } if( len(currentHobbies) > 1000 ){ return nil, errors.New("My current mate hobbies is too long: " + currentHobbies) } currentHobbiesTrimmed, _, err := helpers.TrimAndFlattenString(currentHobbies, 15) if (err != nil) { return nil, err } currentHobbiesLabel := getBoldLabel(currentHobbiesTrimmed) viewMyHobbiesButton := widget.NewButtonWithIcon("", theme.VisibilityIcon(), func(){ setViewTextPage(window, "Viewing Hobbies", currentHobbies, false, currentPage) }) currentHobbiesRow := container.NewHBox(layout.NewSpacer(), myHobbiesLabel, currentHobbiesLabel, viewMyHobbiesButton, layout.NewSpacer()) return currentHobbiesRow, nil } currentHobbiesRow, err := getMyCurrentHobbiesRow() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } editButton := widget.NewButtonWithIcon("Edit", theme.DocumentCreateIcon(), func(){ setBuildMateProfilePage_EditHobbies(window, currentPage, currentPage) }) noResponseButton := widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){ if (currentHobbiesExist == false){ return } setBuildMateProfilePage_DeleteHobbies(window, currentPage, currentPage) }) buttonsGrid := getContainerCentered(container.NewGridWithColumns(1, editButton, noResponseButton)) page := container.NewVBox(pageTitle, backButton, widget.NewSeparator(), pageSubtitle, widget.NewSeparator(), description1, description2, widget.NewSeparator(), currentHobbiesRow, widget.NewSeparator(), buttonsGrid) setPageContent(page, window) } func setBuildMateProfilePage_DeleteHobbies(window fyne.Window, previousPage func(), nextPage func()){ title := getPageTitleCentered("Delete Hobbies") backButton := getBackButtonCentered(previousPage) description1 := getBoldLabelCentered("Delete Hobbies?") description2 := getLabelCentered("Confirm to delete your hobbies?") confirmButton := getWidgetCentered(widget.NewButtonWithIcon("Delete", theme.DeleteIcon(), func(){ myLocalProfiles.DeleteProfileData("Mate", "Hobbies") nextPage() })) page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, confirmButton) setPageContent(page, window) } func setBuildMateProfilePage_EditHobbies(window fyne.Window, previousPage func(), nextPage func()){ title := getPageTitleCentered("Edit Mate Hobbies") backButton := getBackButtonCentered(previousPage) hobbiesEntry := widget.NewMultiLineEntry() hobbiesEntry.Wrapping = 3 //Outputs: // -bool: Current hobbies exist // -string: Current hobbies // -error getCurrentHobbies := func()(bool, string, error){ exists, currentHobbies, err := myLocalProfiles.GetProfileData("Mate", "Hobbies") if (err != nil) { return false, "", err } if (exists == false){ return false, "", nil } isAllowed := allowedText.VerifyStringIsAllowed(currentHobbies) if (isAllowed == false){ return false, "", errors.New("My current mate hobbies is not allowed: " + currentHobbies) } if(len(currentHobbies) > 1000){ return false, "", errors.New("My current mate hobbies is too long: " + currentHobbies) } return true, currentHobbies, nil } currentHobbiesExist, currentHobbies, err := getCurrentHobbies() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } if (currentHobbiesExist == false){ hobbiesEntry.SetPlaceHolder("Enter your hobbies...") } else { hobbiesEntry.SetText(currentHobbies) } submitButton := getWidgetCentered(widget.NewButtonWithIcon(translate("Save"), theme.ConfirmIcon(), func(){ newHobbies := hobbiesEntry.Text isAllowed := allowedText.VerifyStringIsAllowed(newHobbies) if (isAllowed == false){ title := translate("Invalid Hobbies") dialogMessageA := getLabelCentered(translate("Your hobbies 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(newHobbies) if (currentBytesLength > 1000){ currentLengthString := helpers.ConvertIntToString(currentBytesLength) title := translate("Invalid Hobbies") dialogMessageA := getLabelCentered(translate("Your Hobbies are too long.")) dialogMessageB := getLabelCentered(translate("Hobbies 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 (newHobbies == ""){ myLocalProfiles.DeleteProfileData("Mate", "Hobbies") } else { myLocalProfiles.SetProfileData("Mate", "Hobbies", newHobbies) } nextPage() })) emptyLabel := widget.NewLabel("") submitButtonWithSpacer := container.NewVBox(submitButton, emptyLabel) hobbiesEntryBoxed := getWidgetBoxed(hobbiesEntry) hobbiesEntryWithSubmitButton := container.NewBorder(nil, submitButtonWithSpacer, nil, nil, hobbiesEntryBoxed) header := container.NewVBox(title, backButton, widget.NewSeparator()) page := container.NewBorder(header, nil, nil, nil, hobbiesEntryWithSubmitButton) setPageContent(page, window) } func setBuildMateProfilePage_Wealth(window fyne.Window, previousPage func()){ currentPage := func(){setBuildMateProfilePage_Wealth(window, previousPage)} title := getPageTitleCentered(translate("Build Mate Profile - Lifestyle")) backButton := getBackButtonCentered(previousPage) subtitle := getPageSubtitleCentered("Wealth") description1 := getLabelCentered("Enter your total wealth.") description2 := getLabelCentered("Be careful about sharing any secret wealth.") description3 := getLabelCentered("For the most safety, only share an amount that is already public and obvious.") // Outputs: // -bool: Current wealth exists // -string: Current wealth // -bool: Current wealth is a lower bound // -error getCurrentWealthInfo := func()(bool, string, bool, error){ wealthExists, currentWealth, err := myLocalProfiles.GetProfileData("Mate", "Wealth") if (err != nil){ return false, "", false, err } if (wealthExists == false){ return false, "", false, nil } isValid, err := helpers.VerifyStringIsIntWithinRange(currentWealth, 0, 9223372036854775807) if (err != nil){ return false, "", false, err } if (isValid == false){ return false, "", false, errors.New("MyLocalProfiles contains invalid Wealth: " + currentWealth) } currentWealthIsLowerBoundExists, currentWealthIsLowerBound, err := myLocalProfiles.GetProfileData("Mate", "WealthIsLowerBound") if (err != nil){ return false, "", false, err } if (currentWealthIsLowerBoundExists == false){ return false, "", false, errors.New("MyLocalProfiles contains Wealth without WealthIsLowerBound attribute.") } currentWealthIsLowerBoundBool, err := helpers.ConvertYesOrNoStringToBool(currentWealthIsLowerBound) if (err != nil){ return false, "", false, errors.New("MyLocalProfiles contains Invalid WealthIsLowerBound: " + currentWealthIsLowerBound) } return true, currentWealth, currentWealthIsLowerBoundBool, nil } currentWealthExists, currentWealth, currentWealthIsLowerBound, err := getCurrentWealthInfo() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } wealthEntry := widget.NewEntry() if (currentWealthExists == false){ wealthEntry.SetPlaceHolder(translate("Enter wealth...")) } else { wealthEntry.SetText(currentWealth) } getCurrentWealthCurrencyCodeFunction := func()(string, error){ currentWealthCurrencyExists, currentWealthCurrencyCode, err := myLocalProfiles.GetProfileData("Mate", "WealthCurrency") if (err != nil){ return "", err } if (currentWealthCurrencyExists == true){ return currentWealthCurrencyCode, nil } // We will default to the user's already chosen currency exists, currentAppCurrency, err := globalSettings.GetSetting("Currency") if (err != nil) { return "", err } if (exists == false){ return "USD", nil } return currentAppCurrency, nil } currentWealthCurrencyCode, err := getCurrentWealthCurrencyCodeFunction() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } _, currentWealthCurrencySymbol, err := currencies.GetCurrencyInfoFromCurrencyCode(currentWealthCurrencyCode) if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } getCurrentWealthLabel := func()fyne.Widget{ if (currentWealthExists == false){ result := translate("No Response") wealthLabel := getBoldItalicLabel(result) return wealthLabel } getCurrentWealthFormatted := func()string{ if (currentWealthIsLowerBound == true){ currentWealthFormatted := currentWealthCurrencySymbol + " " + currentWealth + "+ " + currentWealthCurrencyCode return currentWealthFormatted } currentWealthFormatted := currentWealthCurrencySymbol + " " + currentWealth + " " + currentWealthCurrencyCode return currentWealthFormatted } currentWealthFormatted := getCurrentWealthFormatted() wealthLabel := getBoldLabel(currentWealthFormatted) return wealthLabel } currentWealthLabel := getCurrentWealthLabel() myWealthLabel := widget.NewLabel("My Wealth:") currentWealthRow := container.NewHBox(layout.NewSpacer(), myWealthLabel, currentWealthLabel, layout.NewSpacer()) chooseCurrencyButton := widget.NewButton(currentWealthCurrencySymbol, func(){ onSelectFunction := func(newCurrencyCode string)error{ err := myLocalProfiles.SetProfileData("Mate", "WealthCurrency", newCurrencyCode) if (err != nil){ return err } return nil } setChooseCurrencyPage(window, getCurrentWealthCurrencyCodeFunction, onSelectFunction, currentPage) }) chooseCurrencyButtonWithSpacer := container.NewHBox(layout.NewSpacer(), chooseCurrencyButton) currentCurrencyCodeLabel := getBoldLabel(currentWealthCurrencyCode) currentCurrencyCodeLabelWidened := container.NewHBox(currentCurrencyCodeLabel, widget.NewLabel(""), widget.NewLabel("")) wealthEntryRow := getContainerCentered(container.NewGridWithRows(1, chooseCurrencyButtonWithSpacer, wealthEntry, currentCurrencyCodeLabelWidened)) isLowerBoundCheck := widget.NewCheck("Is A Lower Bound?", func(newIsLowerBoundStatus bool){ if (currentWealthExists == false){ return } newWealth := wealthEntry.Text if (newWealth != currentWealth){ return } newIsLowerBoundString := helpers.ConvertBoolToYesOrNoString(newIsLowerBoundStatus) myLocalProfiles.SetProfileData("Mate", "WealthIsLowerBound", newIsLowerBoundString) currentPage() }) if (currentWealthExists == true && currentWealthIsLowerBound == true){ isLowerBoundCheck.Checked = true } isLowerBoundHelpButton := widget.NewButtonWithIcon("", theme.QuestionIcon(), func(){ setWealthIsLowerBoundExplainerPage(window, currentPage) }) isLowerBoundCheckRow := container.NewHBox(layout.NewSpacer(), isLowerBoundCheck, isLowerBoundHelpButton, layout.NewSpacer()) submitButton := getWidgetCentered(widget.NewButtonWithIcon("Submit", theme.ConfirmIcon(), func(){ newWealth := wealthEntry.Text isValid, err := helpers.VerifyStringIsIntWithinRange(newWealth, 0, 9223372036854775807) if (err != nil){ setErrorEncounteredPage(window, err, currentPage) return } if (isValid == false){ if (currentWealthExists == false){ wealthEntry.SetText("") wealthEntry.SetPlaceHolder(translate("Enter wealth...")) } else { wealthEntry.SetText(currentWealth) } title := translate("Invalid Wealth") dialogMessageA := getLabelCentered(translate("Invalid wealth entered.")) dialogMessageB := getLabelCentered(translate("The value must be a number between 0 and 9223372036854775807.")) dialogContent := container.NewVBox(dialogMessageA, dialogMessageB) dialog.ShowCustom(title, translate("Close"), dialogContent, window) return } myLocalProfiles.SetProfileData("Mate", "Wealth", newWealth) newIsLowerBoundStatus := isLowerBoundCheck.Checked newIsLowerBoundString := helpers.ConvertBoolToYesOrNoString(newIsLowerBoundStatus) myLocalProfiles.SetProfileData("Mate", "WealthIsLowerBound", newIsLowerBoundString) myLocalProfiles.SetProfileData("Mate", "WealthCurrency", currentWealthCurrencyCode) currentPage() })) noResponseButton := getWidgetCentered(widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){ myLocalProfiles.DeleteProfileData("Mate", "Wealth") myLocalProfiles.DeleteProfileData("Mate", "WealthIsLowerBound") currentPage() })) page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, description3, widget.NewSeparator(), currentWealthRow, widget.NewSeparator(), wealthEntryRow, isLowerBoundCheckRow, submitButton, widget.NewSeparator(), noResponseButton) setPageContent(page, window) } func setBuildMateProfilePage_Job(window fyne.Window, previousPage func()){ currentPage := func(){setBuildMateProfilePage_Job(window, previousPage)} pageTitle := getPageTitleCentered(translate("Build Mate Profile - Lifestyle")) backButton := getBackButtonCentered(previousPage) pageSubtitle := getPageSubtitleCentered(translate("Job")) description1 := getLabelCentered(translate("Enter your job.")) description2 := getLabelCentered(translate("This is how you make money.")) currentJobExists, currentJob, err := myLocalProfiles.GetProfileData("Mate", "Job") if (err != nil) { setErrorEncounteredPage(window, err, previousPage) return } getMyCurrentJobRow := func()(*fyne.Container, error){ myJobLabel := widget.NewLabel("My Job:") if (currentJobExists == false){ noResponseLabel := getBoldItalicLabel("No Response") currentJobRow := container.NewHBox(layout.NewSpacer(), myJobLabel, noResponseLabel, layout.NewSpacer()) return currentJobRow, nil } isAllowed := allowedText.VerifyStringIsAllowed(currentJob) if (isAllowed == false){ return nil, errors.New("My current mate job is not allowed.") } if(len(currentJob) > 100){ return nil, errors.New("My current mate job is too long.") } currentJobTrimmed, _, err := helpers.TrimAndFlattenString(currentJob, 15) if (err != nil) { return nil, err } currentJobLabel := getBoldLabel(currentJobTrimmed) viewMyJobButton := widget.NewButtonWithIcon("", theme.VisibilityIcon(), func(){ setViewTextPage(window, "Viewing Job", currentJob, false, currentPage) }) currentJobRow := container.NewHBox(layout.NewSpacer(), myJobLabel, currentJobLabel, viewMyJobButton, layout.NewSpacer()) return currentJobRow, nil } currentJobRow, err := getMyCurrentJobRow() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } editButton := widget.NewButtonWithIcon("Edit", theme.DocumentCreateIcon(), func(){ setBuildMateProfilePage_EditJob(window, currentPage, currentPage) }) noResponseButton := widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){ if (currentJobExists == false){ return } setBuildMateProfilePage_DeleteJob(window, currentPage, currentPage) }) buttonsGrid := getContainerCentered(container.NewGridWithColumns(1, editButton, noResponseButton)) page := container.NewVBox(pageTitle, backButton, widget.NewSeparator(), pageSubtitle, widget.NewSeparator(), description1, description2, widget.NewSeparator(), currentJobRow, widget.NewSeparator(), buttonsGrid) setPageContent(page, window) } func setBuildMateProfilePage_DeleteJob(window fyne.Window, previousPage func(), nextPage func()){ title := getPageTitleCentered("Delete Job") backButton := getBackButtonCentered(previousPage) description1 := getBoldLabelCentered("Delete Job?") description2 := getLabelCentered("Confirm to delete your job?") confirmButton := getWidgetCentered(widget.NewButtonWithIcon("Delete", theme.DeleteIcon(), func(){ myLocalProfiles.DeleteProfileData("Mate", "Job") nextPage() })) page := container.NewVBox(title, backButton, widget.NewSeparator(), description1, description2, confirmButton) setPageContent(page, window) } func setBuildMateProfilePage_EditJob(window fyne.Window, previousPage func(), nextPage func()){ title := getPageTitleCentered("Edit Job") backButton := getBackButtonCentered(previousPage) jobEntry := widget.NewMultiLineEntry() jobEntry.Wrapping = 3 getCurrentJob := func()(string, error){ exists, currentJob, err := myLocalProfiles.GetProfileData("Mate", "Job") if (err != nil) { return "", err } if (exists == false){ return "", nil } isAllowed := allowedText.VerifyStringIsAllowed(currentJob) if (isAllowed == false){ return "", errors.New("My current mate job is not allowed: " + currentJob) } if( len(currentJob) > 100 ){ return "", errors.New("My current mate job is too long: " + currentJob) } return currentJob, nil } currentJob, err := getCurrentJob() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } if (currentJob == ""){ jobEntry.SetPlaceHolder("Enter your job...") } else { jobEntry.SetText(currentJob) } submitButton := getWidgetCentered(widget.NewButtonWithIcon(translate("Save"), theme.ConfirmIcon(), func(){ newJob := jobEntry.Text isAllowed := allowedText.VerifyStringIsAllowed(newJob) if (isAllowed == false){ title := translate("Invalid Job") dialogMessageA := getLabelCentered(translate("Your job 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(newJob) if (currentBytesLength > 100){ currentLengthString := helpers.ConvertIntToString(currentBytesLength) title := translate("Invalid Job") dialogMessageA := getLabelCentered(translate("Your Job is too long.")) dialogMessageB := getLabelCentered(translate("Job cannot be longer than 100 bytes.")) dialogMessageC := getLabelCentered(translate("Current Length: ") + currentLengthString) dialogContent := container.NewVBox(dialogMessageA, dialogMessageB, dialogMessageC) dialog.ShowCustom(title, translate("Close"), dialogContent, window) return } if (newJob == ""){ myLocalProfiles.DeleteProfileData("Mate", "Job") } else { myLocalProfiles.SetProfileData("Mate", "Job", newJob) } nextPage() })) emptyLabel := widget.NewLabel("") submitButtonWithSpacer := container.NewVBox(submitButton, emptyLabel) jobEntryBoxed := getWidgetBoxed(jobEntry) jobEntryWithSubmitButton := container.NewBorder(nil, submitButtonWithSpacer, nil, nil, jobEntryBoxed) header := container.NewVBox(title, backButton, widget.NewSeparator()) page := container.NewBorder(header, nil, nil, nil, jobEntryWithSubmitButton) setPageContent(page, window) } func setBuildMateProfilePage_Diet(window fyne.Window, previousPage func()){ currentPage := func(){setBuildMateProfilePage_Diet(window, previousPage)} pageTitle := getPageTitleCentered(translate("Build Mate Profile - Lifestyle")) backButton := getBackButtonCentered(previousPage) pageSubtitle := getPageSubtitleCentered(translate("Diet")) description1 := getLabelCentered(translate("Rate each food.")) description2 := getLabelCentered(translate("1 = Strongly Dislike, 10 = Strongly Like")) //TODO: Shrink the columns of this grid so they are only as wide as the widest element within them // Also add grid lines foodSelectorsGrid := container.NewGridWithColumns(3) foodsList := []string{"Fruit", "Vegetables", "Nuts", "Grains", "Dairy", "Seafood", "Beef", "Pork", "Poultry", "Eggs", "Beans"} for _, foodName := range foodsList{ foodAttributeName := foodName + "Rating" foodNameLabel := getBoldLabelCentered(foodName) optionsList := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"} foodRatingSelector := widget.NewSelect(optionsList, func(response string){ err := myLocalProfiles.SetProfileData("Mate", foodAttributeName, response) if (err != nil){ setErrorEncounteredPage(window, err, currentPage) return } }) currentRatingExists, currentFoodRating, err := myLocalProfiles.GetProfileData("Mate", foodAttributeName) if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } if (currentRatingExists == true){ foodRatingSelector.Selected = currentFoodRating } else { foodRatingSelector.PlaceHolder = translate("Choose rating...") } noResponseButton := getWidgetCentered(widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){ err := myLocalProfiles.DeleteProfileData("Mate", foodAttributeName) if (err != nil){ setErrorEncounteredPage(window, err, currentPage) return } currentPage() })) foodSelectorsGrid.Add(foodNameLabel) foodSelectorsGrid.Add(foodRatingSelector) foodSelectorsGrid.Add(noResponseButton) } foodsGrid := getContainerCentered(foodSelectorsGrid) page := container.NewVBox(pageTitle, backButton, widget.NewSeparator(), pageSubtitle, widget.NewSeparator(), description1, description2, widget.NewSeparator(), foodsGrid) setPageContent(page, window) } func setBuildMateProfilePage_Fame(window fyne.Window, previousPage func()){ currentPage := func(){setBuildMateProfilePage_Fame(window, previousPage)} title := getPageTitleCentered(translate("Build Mate Profile - Lifestyle")) backButton := getBackButtonCentered(previousPage) subtitle := getPageSubtitleCentered("Fame") description1 := getLabelCentered("Describe how famous you are on a scale of 1-10.") description2 := getLabelCentered("1 = Least famous, 10 = Most famous.") currentSelectionExists, currentFameSelection, err := myLocalProfiles.GetProfileData("Mate", "Fame") if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } myFameTitle := widget.NewLabel("My Fame:") getMyFameLabel := func()fyne.Widget{ if (currentSelectionExists == false){ myFameLabel := getBoldItalicLabel(translate("No Response")) return myFameLabel } labelText := currentFameSelection + "/10" myFameLabel := getBoldLabel(labelText) return myFameLabel } myFameLabel := getMyFameLabel() myFameRow := container.NewHBox(layout.NewSpacer(), myFameTitle, myFameLabel, layout.NewSpacer()) selectFameLabel := getItalicLabelCentered("Select your fame:") optionsList := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"} fameSelector := widget.NewSelect(optionsList, func(newSelection string){ err := myLocalProfiles.SetProfileData("Mate", "Fame", newSelection) if (err != nil){ setErrorEncounteredPage(window, err, currentPage) return } currentPage() }) if (currentSelectionExists == true){ fameSelector.Selected = currentFameSelection } else { fameSelector.PlaceHolder = translate("Select one...") } fameSelectorCentered := getWidgetCentered(fameSelector) noResponseButton := getWidgetCentered(widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){ err := myLocalProfiles.DeleteProfileData("Mate", "Fame") if (err != nil){ setErrorEncounteredPage(window, err, currentPage) return } currentPage() })) page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2, widget.NewSeparator(), myFameRow, widget.NewSeparator(), selectFameLabel, fameSelectorCentered, noResponseButton) setPageContent(page, window) } func setBuildMateProfilePage_Drugs(window fyne.Window, previousPage func()){ currentPage := func(){setBuildMateProfilePage_Drugs(window, previousPage)} pageTitle := getPageTitleCentered(translate("Build Mate Profile - Lifestyle")) backButton := getBackButtonCentered(previousPage) pageSubtitle := getPageSubtitleCentered(translate("Drugs")) description1 := getLabelCentered(translate("Describe how often you take each drug.")) description2 := getLabelCentered(translate("1 = Never, 10 = Most Often")) description3 := getBoldLabelCentered(translate("If the drug is illegal where you live, do not respond with a non-1 response.")) drugsWarningButton := getWidgetCentered(widget.NewButtonWithIcon("Drugs Warning", theme.WarningIcon(), func(){ setDrugsWarningPage(window, currentPage) })) getDrugsGrid := func()(*fyne.Container, error){ drugsGrid := container.NewGridWithColumns(3) drugsList := []string{"Alcohol", "Tobacco", "Cannabis"} for _, drugName := range drugsList{ drugAttributeName := drugName + "Frequency" drugNameLabel := getBoldLabelCentered(translate(drugName)) optionsList := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"} handleSelectionFunction := func(response string){ err := myLocalProfiles.SetProfileData("Mate", drugAttributeName, response) if (err != nil){ setErrorEncounteredPage(window, err, currentPage) } } drugRatingSelector := widget.NewSelect(optionsList, handleSelectionFunction) currentRatingExists, currentDrugRating, err := myLocalProfiles.GetProfileData("Mate", drugAttributeName) if (err != nil){ return nil, err } if (currentRatingExists == true){ drugRatingSelector.Selected = currentDrugRating } else { drugRatingSelector.PlaceHolder = translate("Choose rating...") } noResponseButton := getWidgetCentered(widget.NewButtonWithIcon(translate("No Response"), theme.CancelIcon(), func(){ err := myLocalProfiles.DeleteProfileData("Mate", drugAttributeName) if (err != nil){ setErrorEncounteredPage(window, err, currentPage) return } currentPage() })) drugsGrid.Add(drugNameLabel) drugsGrid.Add(drugRatingSelector) drugsGrid.Add(noResponseButton) } drugsGridCentered := getContainerCentered(drugsGrid) return drugsGridCentered, nil } drugsGrid, err := getDrugsGrid() if (err != nil){ setErrorEncounteredPage(window, err, previousPage) return } page := container.NewVBox(pageTitle, backButton, widget.NewSeparator(), pageSubtitle, widget.NewSeparator(), description1, description2, widget.NewSeparator(), description3, drugsWarningButton, widget.NewSeparator(), drugsGrid) setPageContent(page, window) } func setDrugsWarningPage(window fyne.Window, previousPage func()){ title := getPageTitleCentered("Drugs Warning") backButton := getBackButtonCentered(previousPage) subtitle := getPageSubtitleCentered("Drugs Warning") //TODO: Improve this. // We have to include some kind of warning, considering the damage that drugs can cause. // Not including any kind of warning would be normalizing drug use. // It would be similar to asking: "How often do you self harm?" without saying self harm is bad. // Everything harms and helps your body to some extent, including running and other forms of exercise, but drugs are harmful enough that they warrant a warning. // Maybe information about the effects of each drug? // -Tobacco = Cancer, etc... description1 := getLabelCentered("Drugs can damage your brain and body.") description2 := getLabelCentered("Be wary when considering the use of drugs.") page := container.NewVBox(title, backButton, widget.NewSeparator(), subtitle, widget.NewSeparator(), description1, description2) setPageContent(page, window) }