seekia/gui/resourcesGui.go

282 lines
7.5 KiB
Go
Raw Normal View History

package gui
// resourcesGui.go provides functions to retrieve icons/emojis from the imageFiles package as fyne canvas images
// It also provides the Choose Emoji page
import "fyne.io/fyne/v2"
import "fyne.io/fyne/v2/container"
import "fyne.io/fyne/v2/widget"
import "fyne.io/fyne/v2/theme"
import "fyne.io/fyne/v2/canvas"
import "fyne.io/fyne/v2/layout"
import "seekia/resources/imageFiles"
import "seekia/internal/helpers"
import "seekia/internal/imagery"
import "bytes"
import "image"
import "errors"
func getIdentityTypeIcon(identityType string, iconSizeShift int)(*canvas.Image, error){
iconSize := getCustomFyneSize(iconSizeShift)
if (identityType == "Mate"){
mateIcon, err := getFyneImageIcon("Mate")
if (err != nil) { return nil, err }
mateIcon.SetMinSize(iconSize)
return mateIcon, nil
}
if (identityType == "Host"){
hostIcon, err := getFyneImageIcon("Host")
if (err != nil) { return nil, err }
hostIcon.SetMinSize(iconSize)
return hostIcon, nil
}
if (identityType == "Moderator"){
moderatorIcon, err := getFyneImageIcon("Moderate")
if (err != nil) { return nil, err }
moderatorIcon.SetMinSize(iconSize)
return moderatorIcon, nil
}
return nil, errors.New("getIdentityTypeIcon called with invalid identityType: " + identityType)
}
func getFyneImageIcon(iconName string)(*canvas.Image, error){
iconFileBytes, err := imageFiles.GetIconFileBytesFromName(iconName)
if (err != nil) { return nil, err }
iconImageObject, err := getFyneImageFromFileBytes(iconFileBytes, "SVG")
if (err != nil) { return nil, err }
return iconImageObject, nil
}
//Outputs:
// -image.Image
// -error (will return err if file cannot be read)
func getEmojiImageObject(emojiIdentifier int)(image.Image, error){
emojiFileBytes, err := imageFiles.GetEmojiFileBytesFromIdentifier(emojiIdentifier)
if (err != nil) { return nil, err }
golangImageObject, err := imagery.ConvertSVGImageFileBytesToGolangImage(emojiFileBytes)
if (err != nil) { return nil, err }
return golangImageObject, nil
}
func getFyneImageFromFileBytes(imageFileBytes []byte, fileType string)(*canvas.Image, error){
if (fileType != "SVG" && fileType != "PNG"){
return nil, errors.New("getFyneImageFromFileBytes called with invalid fileType: " + fileType)
}
randomString, err := helpers.GetNewRandomHexString(16)
if (err != nil) { return nil, err }
fileReader := bytes.NewReader(imageFileBytes)
getFileExtention := func()string{
if (fileType == "SVG"){
return ".svg"
}
// fileType == PNG
return ".png"
}
fileExtention := getFileExtention()
randomFileName := randomString + fileExtention
iconImageObject := canvas.NewImageFromReader(fileReader, randomFileName)
iconImageObject.FillMode = canvas.ImageFillContain
return iconImageObject, nil
}
func getColorSquareAsFyneImage(colorCode string)(*canvas.Image, error){
colorSquareGoImage, err := imagery.GetColorSquare(colorCode)
if (err != nil) { return nil, err }
fyneImageObject := canvas.NewImageFromImage(colorSquareGoImage)
fyneImageObject.FillMode = canvas.ImageFillContain
return fyneImageObject, nil
}
func setChooseEmojiPage(window fyne.Window, pageTitle string, currentCategory string, emojiIndex int, previousPage func(), nextPage func(int)){
setLoadingScreen(window, pageTitle, "Loading Emojis...")
title := getPageTitleCentered(pageTitle)
backButton := getBackButtonCentered(previousPage)
emojiCategoriesList := imageFiles.GetEmojiCategoriesList()
handleCategorySelectFunction := func(newCategory string){
if (currentCategory == newCategory){
return
}
setChooseEmojiPage(window, pageTitle, newCategory, 0, previousPage, nextPage)
}
categorySelector := widget.NewSelect(emojiCategoriesList, handleCategorySelectFunction)
categorySelector.Selected = currentCategory
categoryLabel := widget.NewLabel("Category:")
categorySelectorRow := container.NewHBox(layout.NewSpacer(), categoryLabel, categorySelector, layout.NewSpacer())
emojisInCategoryList, err := imageFiles.GetEmojisInCategoryList(currentCategory)
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
finalPageIndex := len(emojisInCategoryList) - 10
// This returns an index that represents the beginning of a page, if emoji index is out of bounds
getPageIndex := func()int{
if (emojiIndex <= 0){
return 0
}
if (emojiIndex >= finalPageIndex){
return finalPageIndex
}
return emojiIndex
}
pageIndex := getPageIndex()
getFirstPageButton := func()fyne.Widget{
if (emojiIndex <= 0){
emptyButton := widget.NewButton(" ", nil)
return emptyButton
}
firstPageButton := widget.NewButtonWithIcon("", theme.MediaFastRewindIcon(), func(){
setChooseEmojiPage(window, pageTitle, currentCategory, 0, previousPage, nextPage)
})
return firstPageButton
}
firstPageButton := getFirstPageButton()
getPreviousPageButton := func()fyne.Widget{
if (emojiIndex <= 0){
emptyButton := widget.NewButton(" ", nil)
return emptyButton
}
backButton := widget.NewButtonWithIcon("", theme.NavigateBackIcon(), func(){
setChooseEmojiPage(window, pageTitle, currentCategory, emojiIndex-10, previousPage, nextPage)
})
return backButton
}
previousPageButton := getPreviousPageButton()
getNextPageButton := func()fyne.Widget{
if (emojiIndex >= finalPageIndex){
emptyButton := widget.NewButton(" ", nil)
return emptyButton
}
nextButton := widget.NewButtonWithIcon("", theme.NavigateNextIcon(), func(){
setChooseEmojiPage(window, pageTitle, currentCategory, emojiIndex+10, previousPage, nextPage)
})
return nextButton
}
nextPageButton := getNextPageButton()
getFinalPageButton := func()fyne.Widget{
if (emojiIndex >= finalPageIndex){
emptyButton := widget.NewButton(" ", nil)
return emptyButton
}
finalPageButton := widget.NewButtonWithIcon("", theme.MediaFastForwardIcon(), func(){
setChooseEmojiPage(window, pageTitle, currentCategory, finalPageIndex, previousPage, nextPage)
})
return finalPageButton
}
finalPageButton := getFinalPageButton()
numberOfPages := len(emojisInCategoryList)/10
numberOfPagesString := helpers.ConvertIntToString(numberOfPages)
currentPage := (pageIndex/10) +1
currentPageString := helpers.ConvertIntToString(currentPage)
pageLabel := getBoldLabel("Page " + currentPageString + "/" + numberOfPagesString)
navigationRow := container.NewHBox(layout.NewSpacer(), firstPageButton, previousPageButton, pageLabel, nextPageButton, finalPageButton, layout.NewSpacer())
getEmojisGrid := func()(*fyne.Container, error){
emojisGrid := container.NewGridWithColumns(5)
finalIndex := len(emojisInCategoryList) - 1
counter := 0
for i := pageIndex; i <= finalIndex; i++{
currentEmojiIdentifier := emojisInCategoryList[i]
emojiImage, err := getEmojiImageObject(currentEmojiIdentifier)
if (err != nil){ return nil, err }
emojiFyneImage := canvas.NewImageFromImage(emojiImage)
emojiFyneImage.FillMode = canvas.ImageFillContain
chooseButton := widget.NewButtonWithIcon("Select", theme.ConfirmIcon(), func(){
nextPage(currentEmojiIdentifier)
})
emojiCell := getContainerBoxed(container.NewBorder(nil, chooseButton, nil, nil, emojiFyneImage))
emojisGrid.Add(emojiCell)
counter += 1
if (counter >= 10){
break
}
}
return emojisGrid, nil
}
emojisGrid, err := getEmojisGrid()
if (err != nil){
setErrorEncounteredPage(window, err, previousPage)
return
}
header := container.NewVBox(title, backButton, widget.NewSeparator(), categorySelectorRow, widget.NewSeparator(), navigationRow)
page := container.NewBorder(header, nil, nil, nil, emojisGrid)
setPageContent(page, window)
}