281 lines
7.5 KiB
Go
281 lines
7.5 KiB
Go
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)
|
|
}
|
|
|
|
|