2024-04-11 15:51:56 +02:00
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 ( ) {
2024-07-19 19:16:28 +02:00
setWealthIsLowerBoundExplainerPage ( window , currentPage )
2024-04-11 15:51:56 +02:00
} )
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 )
}