seekia/gui/themeGui.go

287 lines
6.4 KiB
Go

package gui
// themeGui.go contains code to generate a custom fyne theme
import "fyne.io/fyne/v2"
import "fyne.io/fyne/v2/theme"
import "seekia/internal/imagery"
import "image/color"
import "errors"
// We use this to define a custom fyne theme
type customTheme struct{
themeName string
defaultTheme fyne.Theme
}
func getCustomFyneTheme(themeName string)(fyne.Theme, error){
getStandardThemeObject := func()(fyne.Theme, error){
if (themeName == "Light" || themeName == "Love" || themeName == "Ocean"){
result := theme.LightTheme()
return result, nil
}
if (themeName == "Dark"){
result := theme.DarkTheme()
return result, nil
}
return nil, errors.New("getCustomFyneTheme called with invalid themeName: " + themeName)
}
standardThemeObject, err := getStandardThemeObject()
if (err != nil){ return nil, err }
newTheme := customTheme{
themeName: themeName,
defaultTheme: standardThemeObject,
}
return newTheme, nil
}
// This function is used to define our custom fyne themes
// It changes a few default colors, while leaving all other colors the same as the default theme
func (input customTheme)Color(colorName fyne.ThemeColorName, variant fyne.ThemeVariant)color.Color{
//TODO: Make these colors better and create more themes
themeName := input.themeName
switch colorName{
case theme.ColorNameForeground:{
switch themeName{
case "Light", "Love", "Ocean":{
newColor := color.Black
return newColor
}
case "Dark":{
newColor := color.White
return newColor
}
}
}
case theme.ColorNameSeparator:{
// This is the color used for separators
switch themeName{
case "Light":{
newColor, err := imagery.GetColorObjectFromColorCode("b3b3b3")
if (err == nil){
return newColor
}
}
case "Ocean":{
newColor, err := imagery.GetColorObjectFromColorCode("646464")
if (err == nil){
return newColor
}
}
default:{
newColor, err := imagery.GetColorObjectFromColorCode("999999")
if (err == nil){
return newColor
}
}
}
}
case theme.ColorNameInputBackground:{
// This color is used for the background of input elements such as text entries
switch themeName{
case "Light":{
newColor, err := imagery.GetColorObjectFromColorCode("b3b3b3")
if (err == nil){
return newColor
}
}
case "Love":{
newColor, err := imagery.GetColorObjectFromColorCode("ffbbbe")
if (err == nil){
return newColor
}
}
case "Ocean":{
newColor, err := imagery.GetColorObjectFromColorCode("ccd1ef")
if (err == nil){
return newColor
}
}
default:{
newColor, err := imagery.GetColorObjectFromColorCode("999999")
if (err == nil){
return newColor
}
}
}
}
case theme.ColorNameBackground:{
// This is the color used for the app background
switch themeName{
case "Love":{
newColor, err := imagery.GetColorObjectFromColorCode("ff7a80")
if (err == nil){
return newColor
}
}
case "Ocean":{
newColor, err := imagery.GetColorObjectFromColorCode("7f6fff")
if (err == nil){
return newColor
}
}
}
}
case theme.ColorNameOverlayBackground:{
// This is the color used for backgrounds of overlays like dialogs.
switch themeName{
case "Love":{
newColor, err := imagery.GetColorObjectFromColorCode("ffabaf")
if (err == nil){
return newColor
}
}
case "Ocean":{
newColor, err := imagery.GetColorObjectFromColorCode("a59aff")
if (err == nil){
return newColor
}
}
}
}
case theme.ColorNameButton:{
// This is the color used for buttons
switch themeName{
case "Light":{
newColor, err := imagery.GetColorObjectFromColorCode("d8d8d8")
if (err == nil){
return newColor
}
}
case "Love":{
newColor, err := imagery.GetColorObjectFromColorCode("7664ff")
if (err == nil){
return newColor
}
}
case "Ocean":{
newColor, err := imagery.GetColorObjectFromColorCode("ccd1ef")
if (err == nil){
return newColor
}
}
case "Dark":{
newColor, err := imagery.GetColorObjectFromColorCode("4d4d4d")
if (err == nil){
return newColor
}
}
}
}
case theme.ColorNamePlaceHolder:{
// This is the color used for text
newColor, err := imagery.GetColorObjectFromColorCode("4d4d4d")
if (err == nil){
return newColor
}
}
case theme.ColorNamePrimary:{
// This color is used for high importance buttons
switch themeName{
case "Love", "Ocean":{
newColor, err := imagery.GetColorObjectFromColorCode("1300a8")
if (err == nil){
return newColor
}
}
}
}
}
// We will use the default color for this theme
return input.defaultTheme.Color(colorName, variant)
}
// Our custom themes change nothing about the default theme fonts
func (input customTheme)Font(style fyne.TextStyle)fyne.Resource{
themeFont := input.defaultTheme.Font(style)
return themeFont
}
// Our custom themes change nothing about the default theme icons
func (input customTheme)Icon(iconName fyne.ThemeIconName)fyne.Resource{
themeIcon := input.defaultTheme.Icon(iconName)
return themeIcon
}
func (input customTheme)Size(name fyne.ThemeSizeName)float32{
themeSize := input.defaultTheme.Size(name)
if (name == theme.SizeNameText){
// After fyne v2.3.0, text labels are no longer the same height as buttons
// We increase the text size so that a text label is the same height as a button
// We need to increase text size because we are creating grids by creating multiple VBoxes, and connecting them with an HBox
//
// If we could create grids in a different way, we could avoid having to do this
// Example: Create a new grid type: container.NewThinGrid?
// -The columns will only be as wide as the the widest element within them
// -We can add separators between each row (grid.ShowRowLines = true) or between columns (grid.ShowColumnLines = true)
// -We can add borders (grid.ShowTopBorder = true, grid.ShowBottomBorder = true, grid.ShowLeftBorder = true, grid.ShowRightBorder = true)
// Using a different grid type is the solution we need to eventually use
// Then, we can show the user an option to increase the text size globally, and all grids will still render correctly
result := themeSize * 1.08
return result
}
return themeSize
}